PageSourceSearch

https://citizendot.github.io/script.js

js citizendot.github.io collected 2026-10-03 08:48:01 UTC 5,337 bytes, 169 lines download raw bytes

1!(function () {
2  'use strict'
3  ;(t => {
4    const {
5        screen: { width: e, height: a },
6        navigator: { language: r, doNotTrack: n, msDoNotTrack: i },
7        location: o,
8        document: s,
9        history: c,
10        top: u,
11        doNotTrack: d,
12      } = t,
13      { hostname: l, href: h, origin: m } = o,
14      { currentScript: f, referrer: p } = s,
15      g = h.startsWith('data:') ? void 0 : t.localStorage
16    if (!f) return
17    const y = 'data-',
18      b = 'true',
19      v = f.getAttribute.bind(f),
20      w = v(y + 'website-id'),
21      N = v(y + 'host-url'),
22      S = v(y + 'tag'),
23      T = 'false' !== v(y + 'auto-track'),
24      k = v(y + 'do-not-track') === b,
25      A = v(y + 'exclude-search') === b,
26      j = v(y + 'exclude-hash') === b,
27      x = v(y + 'domains') || '',
28      O = x.split(',').map(t => t.trim()),
29      E = `${(N || 'https://api-gateway.umami.dev' || f.src.split('/').slice(0, -1).join('/')).replace(/\/$/, '')}/api/send`,
30      L = `${e}x${a}`,
31      $ = /data-umami-event-([\w-_]+)/,
32      D = y + 'umami-event',
33      K = 300,
34      U = () => ({
35        website: w,
36        screen: L,
37        language: r,
38        title: z,
39        hostname: l,
40        url: P,
41        referrer: R,
42        tag: S || void 0,
43      }),
44      _ = (t, e, a) => {
45        a &&
46          ((R = P),
47          (P = new URL(a, o.href)),
48          A && (P.search = ''),
49          j && (P.hash = ''),
50          (P = P.toString()),
51          P !== R && setTimeout(C, K))
52      },
53      B = () =>
54        F ||
55        !w ||
56        (g && g.getItem('umami.disabled')) ||
57        (x && !O.includes(l)) ||
58        (k &&
59          (() => {
60            const t = d || n || i
61            return 1 === t || '1' === t || 'yes' === t
62          })()),
63      W = async (t, e = 'event') => {
64        if (B()) return
65        const a = { 'Content-Type': 'application/json' }
66        void 0 !== J && (a['x-umami-cache'] = J)
67        try {
68          const r = await fetch(E, {
69              method: 'POST',
70              body: JSON.stringify({ type: e, payload: t }),
71              headers: a,
72              credentials: 'omit',
73            }),
74            n = await r.json()
75          n && ((F = !!n.disabled), (J = n.cache))
76        } catch (t) {}
77      },
78      q = () => {
79        M ||
80          (C(),
81          (() => {
82            const t = (t, e, a) => {
83              const r = t[e]
84              return (...e) => (a.apply(null, e), r.apply(t, e))
85            }
86            ;(c.pushState = t(c, 'pushState', _)), (c.replaceState = t(c, 'replaceState', _))
87          })(),
88          (() => {
89            const t = new MutationObserver(([t]) => {
90                z = t && t.target ? t.target.text : void 0
91              }),
92              e = s.querySelector('head > title')
93            e && t.observe(e, { subtree: !0, characterData: !0, childList: !0 })
94          })(),
95          s.addEventListener(
96            'click',
97            async t => {
98              const e = t => ['BUTTON', 'A'].includes(t),
99                a = async t => {
100                  const e = t.getAttribute.bind(t),
101                    a = e(D)
102                  if (a) {
103                    const r = {}
104                    return (
105                      t.getAttributeNames().forEach(t => {
106                        const a = t.match($)
107                        a && (r[a[1]] = e(t))
108                      }),
109                      C(a, r)
110                    )
111                  }
112                },
113                r = t.target,
114                n = e(r.tagName)
115                  ? r
116                  : ((t, a) => {
117                      let r = t
118                      for (let t = 0; t < a; t++) {
119                        if (e(r.tagName)) return r
120                        if (((r = r.parentElement), !r)) return null
121                      }
122                    })(r, 10)
123              if (!n) return a(r)
124              {
125                const { href: e, target: r } = n,
126                  i = n.getAttribute(D)
127                if (i)
128                  if ('A' === n.tagName) {
129                    const s =
130                      '_blank' === r ||
131                      t.ctrlKey ||
132                      t.shiftKey ||
133                      t.metaKey ||
134                      (t.button && 1 === t.button)
135                    if (i && e)
136                      return (
137                        s || t.preventDefault(),
138                        a(n).then(() => {
139                          s || (('_top' === r ? u.location : o).href = e)
140                        })
141                      )
142                  } else if ('BUTTON' === n.tagName) return a(n)
143              }
144            },
145            !0
146          ),
147          (M = !0))
148      },
149      C = (t, e) =>
150        W(
151          'string' == typeof t
152            ? { ...U(), name: t, data: 'object' == typeof e ? e : void 0 }
153            : 'object' == typeof t
154              ? t
155              : 'function' == typeof t
156                ? t(U())
157                : U()
158        ),
159      I = t => W({ ...U(), data: t }, 'identify')
160    t.umami || (t.umami = { track: C, identify: I })
161    let J,
162      M,
163      P = h,
164      R = p.startsWith(m) ? '' : p,
165      z = s.title,
166      F = !1
167    T && !B() && ('complete' === s.readyState ? q() : s.addEventListener('readystatechange', q, !0))
168  })(window)
169})()

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.