ipfs 搜索hash值对应的资源的前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JETBRA.IN CHECKER | IPFS</title>
    <meta name="apple-mobile-web-app-capable" content="yes"/>
    <meta name="mobile-web-app-capable" content="yes"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <link type="text/css" rel="stylesheet" href="https://3.jetbra.in/tachyons.min.css"/>
    <link type="text/css" rel="stylesheet" href="https://3.jetbra.in/ipfs.css"/>
    <link type="text/css" rel="stylesheet" href="https://3.jetbra.in/styles.css?v=230914"/>
</head>
<body id="checker" class="sans-serif charcoal bg-snow-muted">

<header class='flex-l items-center pa3 bg-navy bb bw3 border-aqua tc tl-l'>
    <h1 class='f3 fw2 montserrat aqua ttu ma0'>JETBRA.IN CHECKER | IPFS</h1>
    <div class='flex-auto'>
    </div>
    <div class='pt2 pt0-l ma0 inline-flex items-center'>
        <div class='pl3'>
            <a href='https://github.com/ipfs/public-gateway-checker' target='_blank' rel="noopener noreferrer"
               aria-label='View source on GitHub'>
                <svg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 0 32.58 31.77'>
                    <path fill='#7f8491'
                          d='M16.29 0a16.29 16.29 0 00-5.15 31.75c.82.15 1.11-.36 1.11-.79v-2.77C7.7 29.18 6.74 26 6.74 26a4.36 4.36 0 00-1.81-2.39c-1.47-1 .12-1 .12-1a3.43 3.43 0 012.49 1.68 3.48 3.48 0 004.74 1.36 3.46 3.46 0 011-2.18c-3.62-.41-7.42-1.81-7.42-8a6.3 6.3 0 011.67-4.37 5.94 5.94 0 01.16-4.31s1.37-.44 4.48 1.67a15.41 15.41 0 018.16 0c3.11-2.11 4.47-1.67 4.47-1.67a5.91 5.91 0 01.2 4.28 6.3 6.3 0 011.67 4.37c0 6.26-3.81 7.63-7.44 8a3.85 3.85 0 011.11 3v4.47c0 .53.29.94 1.12.78A16.29 16.29 0 0016.29 0z'/>
                </svg>
            </a>
        </div>
    </div>
</header>

<div class="ph4-l pt4-l">
    <div id="origin-warning" class="f5 pa2 tl">
        <p>NOTES</p>
        <ul class="pl3">
            <li>Pick a link that looks great and <strong style="color: green">just click it</strong> to visit the page(230914).</li>
        </ul>
    </div>
    <div id="checker.stats" class="Stats monospace f6"></div>
    <div id="checker.results" class="Results monospace f6">
        <div class="Node Header">
            <div class="Status" title="Online status: is it possible to read data?" style="cursor: help">Online</div>
            <div class="Cors" title="Allows Cross-Origin Resource Sharing (CORS fetch)">CORS</div>
            <div class="Link">Hostname</div>
            <div class="Took">T</div>
        </div>
    </div>
</div>
<script src="https://3.jetbra.in/ipfs-http-client.min.js"></script>
<script>
    (function(root, factory) {
    (typeof module === 'object' && module.exports) ? module.exports = factory() : root.IpfsPublicGatewayChecker = factory()
}(typeof self !== 'undefined' ? self : this, function() {
    var IpfsPublicGatewayChecker = (()=>{
        var ut = Object.create;
        var W = Object.defineProperty;
        var dt = Object.getOwnPropertyDescriptor;
        var mt = Object.getOwnPropertyNames;
        var yt = Object.getPrototypeOf
          , gt = Object.prototype.hasOwnProperty;
        var wt = h=>W(h, "__esModule", {
            value: !0
        });
        var _t = (h,s)=>()=>(s || h((s = {
            exports: {}
        }).exports, s),
        s.exports);
        var bt = (h,s,a)=>{
            if (s && typeof s == "object" || typeof s == "function")
                for (let n of mt(s))
                    !gt.call(h, n) && n !== "default" && W(h, n, {
                        get: ()=>s[n],
                        enumerable: !(a = dt(s, n)) || a.enumerable
                    });
            return h
        }
          , vt = h=>bt(wt(W(h != null ? ut(yt(h)) : {}, "default", h && h.__esModule && "default"in h ? {
            get: ()=>h.default,
            enumerable: !0
        } : {
            value: h,
            enumerable: !0
        })), h);
        var at = _t((M,Z)=>{
            (function(h) {
                "use strict";
                function s(a) {
                    var n = a && a.Promise || h.Promise
                      , d = a && a.XMLHttpRequest || h.XMLHttpRequest;
                    return function() {
                        var b = Object.create(h, {
                            fetch: {
                                value: void 0,
                                writable: !0
                            }
                        });
                        return function(g, o) {
                            typeof M == "object" && typeof Z != "undefined" ? o(M) : typeof define == "function" && define.amd ? define(["exports"], o) : o(g.WHATWGFetch = {})
                        }(this, function(g) {
                            "use strict";
                            var o = typeof b != "undefined" && b || typeof self != "undefined" && self || typeof o != "undefined" && o
                              , w = {
                                searchParams: "URLSearchParams"in o,
                                iterable: "Symbol"in o && "iterator"in Symbol,
                                blob: "FileReader"in o && "Blob"in o && function() {
                                    try {
                                        return new Blob,
                                        !0
                                    } catch (t) {
                                        return !1
                                    }
                                }(),
                                formData: "FormData"in o,
                                arrayBuffer: "ArrayBuffer"in o
                            };
                            function G(t) {
                                return t && DataView.prototype.isPrototypeOf(t)
                            }
                            if (w.arrayBuffer)
                                var x = ["[object Int8Array]", "[object Uint8Array]", "[object Uint8ClampedArray]", "[object Int16Array]", "[object Uint16Array]", "[object Int32Array]", "[object Uint32Array]", "[object Float32Array]", "[object Float64Array]"]
                                  , U = ArrayBuffer.isView || function(t) {
                                    return t && x.indexOf(Object.prototype.toString.call(t)) > -1
                                }
                                ;
                            function T(t) {
                                if (typeof t != "string" && (t = String(t)),
                                /[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(t) || t === "")
                                    throw new TypeError("Invalid character in header field name");
                                return t.toLowerCase()
                            }
                            function B(t) {
                                return typeof t != "string" && (t = String(t)),
                                t
                            }
                            function r(t) {
                                var i = {
                                    next: function() {
                                        var l = t.shift();
                                        return {
                                            done: l === void 0,
                                            value: l
                                        }
                                    }
                                };
                                return w.iterable && (i[Symbol.iterator] = function() {
                                    return i
                                }
                                ),
                                i
                            }
                            function p(t) {
                                this.map = {},
                                t instanceof p ? t.forEach(function(i, l) {
                                    this.append(l, i)
                                }, this) : Array.isArray(t) ? t.forEach(function(i) {
                                    this.append(i[0], i[1])
                                }, this) : t && Object.getOwnPropertyNames(t).forEach(function(i) {
                                    this.append(i, t[i])
                                }, this)
                            }
                            p.prototype.append = function(t, i) {
                                t = T(t),
                                i = B(i);
                                var l = this.map[t];
                                this.map[t] = l ? l + ", " + i : i
                            }
                            ,
                            p.prototype.delete = function(t) {
                                delete this.map[T(t)]
                            }
                            ,
                            p.prototype.get = function(t) {
                                return t = T(t),
                                this.has(t) ? this.map[t] : null
                            }
                            ,
                            p.prototype.has = function(t) {
                                return this.map.hasOwnProperty(T(t))
                            }
                            ,
                            p.prototype.set = function(t, i) {
                                this.map[T(t)] = B(i)
                            }
                            ,
                            p.prototype.forEach = function(t, i) {
                                for (var l in this.map)
                                    this.map.hasOwnProperty(l) && t.call(i, this.map[l], l, this)
                            }
                            ,
                            p.prototype.keys = function() {
                                var t = [];
                                return this.forEach(function(i, l) {
                                    t.push(l)
                                }),
                                r(t)
                            }
                            ,
                            p.prototype.values = function() {
                                var t = [];
                                return this.forEach(function(i) {
                                    t.push(i)
                                }),
                                r(t)
                            }
                            ,
                            p.prototype.entries = function() {
                                var t = [];
                                return this.forEach(function(i, l) {
                                    t.push([l, i])
                                }),
                                r(t)
                            }
                            ,
                            w.iterable && (p.prototype[Symbol.iterator] = p.prototype.entries);
                            function c(t) {
                                if (t.bodyUsed)
                                    return n.reject(new TypeError("Already read"));
                                t.bodyUsed = !0
                            }
                            function v(t) {
                                return new n(function(i, l) {
                                    t.onload = function() {
                                        i(t.result)
                                    }
                                    ,
                                    t.onerror = function() {
                                        l(t.error)
                                    }
                                }
                                )
                            }
                            function u(t) {
                                var i = new FileReader
                                  , l = v(i);
                                return i.readAsArrayBuffer(t),
                                l
                            }
                            function A(t) {
                                var i = new FileReader
                                  , l = v(i);
                                return i.readAsText(t),
                                l
                            }
                            function f(t) {
                                for (var i = new Uint8Array(t), l = new Array(i.length), y = 0; y < i.length; y++)
                                    l[y] = String.fromCharCode(i[y]);
                                return l.join("")
                            }
                            function P(t) {
                                if (t.slice)
                                    return t.slice(0);
                                var i = new Uint8Array(t.byteLength);
                                return i.set(new Uint8Array(t)),
                                i.buffer
                            }
                            function D() {
                                return this.bodyUsed = !1,
                                this._initBody = function(t) {
                                    this.bodyUsed = this.bodyUsed,
                                    this._bodyInit = t,
                                    t ? typeof t == "string" ? this._bodyText = t : w.blob && Blob.prototype.isPrototypeOf(t) ? this._bodyBlob = t : w.formData && FormData.prototype.isPrototypeOf(t) ? this._bodyFormData = t : w.searchParams && URLSearchParams.prototype.isPrototypeOf(t) ? this._bodyText = t.toString() : w.arrayBuffer && w.blob && G(t) ? (this._bodyArrayBuffer = P(t.buffer),
                                    this._bodyInit = new Blob([this._bodyArrayBuffer])) : w.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(t) || U(t)) ? this._bodyArrayBuffer = P(t) : this._bodyText = t = Object.prototype.toString.call(t) : this._bodyText = "",
                                    this.headers.get("content-type") || (typeof t == "string" ? this.headers.set("content-type", "text/plain;charset=UTF-8") : this._bodyBlob && this._bodyBlob.type ? this.headers.set("content-type", this._bodyBlob.type) : w.searchParams && URLSearchParams.prototype.isPrototypeOf(t) && this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8"))
                                }
                                ,
                                w.blob && (this.blob = function() {
                                    var t = c(this);
                                    if (t)
                                        return t;
                                    if (this._bodyBlob)
                                        return n.resolve(this._bodyBlob);
                                    if (this._bodyArrayBuffer)
                                        return n.resolve(new Blob([this._bodyArrayBuffer]));
                                    if (this._bodyFormData)
                                        throw new Error("could not read FormData body as blob");
                                    return n.resolve(new Blob([this._bodyText]))
                                }
                                ,
                                this.arrayBuffer = function() {
                                    if (this._bodyArrayBuffer) {
                                        var t = c(this);
                                        return t || (ArrayBuffer.isView(this._bodyArrayBuffer) ? n.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset, this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength)) : n.resolve(this._bodyArrayBuffer))
                                    } else
                                        return this.blob().then(u)
                                }
                                ),
                                this.text = function() {
                                    var t = c(this);
                                    if (t)
                                        return t;
                                    if (this._bodyBlob)
                                        return A(this._bodyBlob);
                                    if (this._bodyArrayBuffer)
                                        return n.resolve(f(this._bodyArrayBuffer));
                                    if (this._bodyFormData)
                                        throw new Error("could not read FormData body as text");
                                    return n.resolve(this._bodyText)
                                }
                                ,
                                w.formData && (this.formData = function() {
                                    return this.text().then(j)
                                }
                                ),
                                this.json = function() {
                                    return this.text().then(JSON.parse)
                                }
                                ,
                                this
                            }
                            var X = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
                            function e(t) {
                                var i = t.toUpperCase();
                                return X.indexOf(i) > -1 ? i : t
                            }
                            function R(t, i) {
                                if (!(this instanceof R))
                                    throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
                                i = i || {};
                                var l = i.body;
                                if (t instanceof R) {
                                    if (t.bodyUsed)
                                        throw new TypeError("Already read");
                                    this.url = t.url,
                                    this.credentials = t.credentials,
                                    i.headers || (this.headers = new p(t.headers)),
                                    this.method = t.method,
                                    this.mode = t.mode,
                                    this.signal = t.signal,
                                    !l && t._bodyInit != null && (l = t._bodyInit,
                                    t.bodyUsed = !0)
                                } else
                                    this.url = String(t);
                                if (this.credentials = i.credentials || this.credentials || "same-origin",
                                (i.headers || !this.headers) && (this.headers = new p(i.headers)),
                                this.method = e(i.method || this.method || "GET"),
                                this.mode = i.mode || this.mode || null,
                                this.signal = i.signal || this.signal,
                                this.referrer = null,
                                (this.method === "GET" || this.method === "HEAD") && l)
                                    throw new TypeError("Body not allowed for GET or HEAD requests");
                                if (this._initBody(l),
                                (this.method === "GET" || this.method === "HEAD") && (i.cache === "no-store" || i.cache === "no-cache")) {
                                    var y = /([?&])_=[^&]*/;
                                    if (y.test(this.url))
                                        this.url = this.url.replace(y, "$1_=" + new Date().getTime());
                                    else {
                                        var _ = /\?/;
                                        this.url += (_.test(this.url) ? "&" : "?") + "_=" + new Date().getTime()
                                    }
                                }
                            }
                            R.prototype.clone = function() {
                                return new R(this,{
                                    body: this._bodyInit
                                })
                            }
                            ;
                            function j(t) {
                                var i = new FormData;
                                return t.trim().split("&").forEach(function(l) {
                                    if (l) {
                                        var y = l.split("=")
                                          , _ = y.shift().replace(/\+/g, " ")
                                          , m = y.join("=").replace(/\+/g, " ");
                                        i.append(decodeURIComponent(_), decodeURIComponent(m))
                                    }
                                }),
                                i
                            }
                            function q(t) {
                                var i = new p
                                  , l = t.replace(/\r?\n[\t ]+/g, " ");
                                return l.split("\r").map(function(y) {
                                    return y.indexOf(`
`) === 0 ? y.substr(1, y.length) : y
                                }).forEach(function(y) {
                                    var _ = y.split(":")
                                      , m = _.shift().trim();
                                    if (m) {
                                        var F = _.join(":").trim();
                                        i.append(m, F)
                                    }
                                }),
                                i
                            }
                            D.call(R.prototype);
                            function k(t, i) {
                                if (!(this instanceof k))
                                    throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
                                i || (i = {}),
                                this.type = "default",
                                this.status = i.status === void 0 ? 200 : i.status,
                                this.ok = this.status >= 200 && this.status < 300,
                                this.statusText = "statusText"in i ? i.statusText : "",
                                this.headers = new p(i.headers),
                                this.url = i.url || "",
                                this._initBody(t)
                            }
                            D.call(k.prototype),
                            k.prototype.clone = function() {
                                return new k(this._bodyInit,{
                                    status: this.status,
                                    statusText: this.statusText,
                                    headers: new p(this.headers),
                                    url: this.url
                                })
                            }
                            ,
                            k.error = function() {
                                var t = new k(null,{
                                    status: 0,
                                    statusText: ""
                                });
                                return t.type = "error",
                                t
                            }
                            ;
                            var $ = [301, 302, 303, 307, 308];
                            k.redirect = function(t, i) {
                                if ($.indexOf(i) === -1)
                                    throw new RangeError("Invalid status code");
                                return new k(null,{
                                    status: i,
                                    headers: {
                                        location: t
                                    }
                                })
                            }
                            ,
                            g.DOMException = o.DOMException;
                            try {
                                new g.DOMException
                            } catch (t) {
                                g.DOMException = function(i, l) {
                                    this.message = i,
                                    this.name = l;
                                    var y = Error(i);
                                    this.stack = y.stack
                                }
                                ,
                                g.DOMException.prototype = Object.create(Error.prototype),
                                g.DOMException.prototype.constructor = g.DOMException
                            }
                            function N(t, i) {
                                return new n(function(l, y) {
                                    var _ = new R(t,i);
                                    if (_.signal && _.signal.aborted)
                                        return y(new g.DOMException("Aborted","AbortError"));
                                    var m = new d;
                                    function F() {
                                        m.abort()
                                    }
                                    m.onload = function() {
                                        var E = {
                                            status: m.status,
                                            statusText: m.statusText,
                                            headers: q(m.getAllResponseHeaders() || "")
                                        };
                                        E.url = "responseURL"in m ? m.responseURL : E.headers.get("X-Request-URL");
                                        var z = "response"in m ? m.response : m.responseText;
                                        setTimeout(function() {
                                            l(new k(z,E))
                                        }, 0)
                                    }
                                    ,
                                    m.onerror = function() {
                                        setTimeout(function() {
                                            y(new TypeError("Network request failed"))
                                        }, 0)
                                    }
                                    ,
                                    m.ontimeout = function() {
                                        setTimeout(function() {
                                            y(new TypeError("Network request failed"))
                                        }, 0)
                                    }
                                    ,
                                    m.onabort = function() {
                                        setTimeout(function() {
                                            y(new g.DOMException("Aborted","AbortError"))
                                        }, 0)
                                    }
                                    ;
                                    function ct(E) {
                                        try {
                                            return E === "" && o.location.href ? o.location.href : E
                                        } catch (z) {
                                            return E
                                        }
                                    }
                                    m.open(_.method, ct(_.url), !0),
                                    _.credentials === "include" ? m.withCredentials = !0 : _.credentials === "omit" && (m.withCredentials = !1),
                                    "responseType"in m && (w.blob ? m.responseType = "blob" : w.arrayBuffer && _.headers.get("Content-Type") && _.headers.get("Content-Type").indexOf("application/octet-stream") !== -1 && (m.responseType = "arraybuffer")),
                                    i && typeof i.headers == "object" && !(i.headers instanceof p) ? Object.getOwnPropertyNames(i.headers).forEach(function(E) {
                                        m.setRequestHeader(E, B(i.headers[E]))
                                    }) : _.headers.forEach(function(E, z) {
                                        m.setRequestHeader(z, E)
                                    }),
                                    _.signal && (_.signal.addEventListener("abort", F),
                                    m.onreadystatechange = function() {
                                        m.readyState === 4 && _.signal.removeEventListener("abort", F)
                                    }
                                    ),
                                    m.send(typeof _._bodyInit == "undefined" ? null : _._bodyInit)
                                }
                                )
                            }
                            N.polyfill = !0,
                            o.fetch || (o.fetch = N,
                            o.Headers = p,
                            o.Request = R,
                            o.Response = k),
                            g.Headers = p,
                            g.Request = R,
                            g.Response = k,
                            g.fetch = N,
                            Object.defineProperty(g, "__esModule", {
                                value: !0
                            })
                        }),
                        {
                            fetch: b.fetch,
                            Headers: b.Headers,
                            Request: b.Request,
                            Response: b.Response,
                            DOMException: b.DOMException
                        }
                    }()
                }
                typeof define == "function" && define.amd ? define(function() {
                    return s
                }) : typeof M == "object" ? Z.exports = s : h.fetchPonyfill = s
            }
            )(typeof globalThis != "undefined" ? globalThis : typeof self != "undefined" ? self : typeof globalThis != "undefined" ? globalThis : M)
        }
        );
        function kt() {
            var h = Object.create(null);
            h.ftp = 21,
            h.file = 0,
            h.gopher = 70,
            h.http = 80,
            h.https = 443,
            h.ws = 80,
            h.wss = 443;
            var s = Object.create(null);
            s["%2e"] = ".",
            s[".%2e"] = "..",
            s["%2e."] = "..",
            s["%2e%2e"] = "..";
            function a(r) {
                return h[r] !== void 0
            }
            function n() {
                U.call(this),
                this._isInvalid = !0
            }
            function d(r) {
                return r == "" && n.call(this),
                r.toLowerCase()
            }
            function b(r) {
                var p = r.charCodeAt(0);
                return p > 32 && p < 127 && [34, 35, 60, 62, 63, 96].indexOf(p) == -1 ? r : encodeURIComponent(r)
            }
            function g(r) {
                var p = r.charCodeAt(0);
                return p > 32 && p < 127 && [34, 35, 60, 62, 96].indexOf(p) == -1 ? r : encodeURIComponent(r)
            }
            var o = void 0
              , w = /[a-zA-Z]/
              , G = /[a-zA-Z0-9\+\-\.]/;
            function x(r, p, c) {
                function v(i) {
                    X.push(i)
                }
                var u = p || "scheme start"
                  , A = 0
                  , f = ""
                  , P = !1
                  , D = !1
                  , X = [];
                t: for (; (r[A - 1] != o || A == 0) && !this._isInvalid; ) {
                    var e = r[A];
                    switch (u) {
                    case "scheme start":
                        if (e && w.test(e))
                            f += e.toLowerCase(),
                            u = "scheme";
                        else if (p) {
                            v("Invalid scheme.");
                            break t
                        } else {
                            f = "",
                            u = "no scheme";
                            continue
                        }
                        break;
                    case "scheme":
                        if (e && G.test(e))
                            f += e.toLowerCase();
                        else if (e == ":") {
                            if (this._scheme = f,
                            f = "",
                            p)
                                break t;
                            a(this._scheme) && (this._isRelative = !0),
                            this._scheme == "file" ? u = "relative" : this._isRelative && c && c._scheme == this._scheme ? u = "relative or authority" : this._isRelative ? u = "authority first slash" : u = "scheme data"
                        } else if (p) {
                            if (o == e)
                                break t;
                            v("Code point not allowed in scheme: " + e);
                            break t
                        } else {
                            f = "",
                            A = 0,
                            u = "no scheme";
                            continue
                        }
                        break;
                    case "scheme data":
                        e == "?" ? (this._query = "?",
                        u = "query") : e == "#" ? (this._fragment = "#",
                        u = "fragment") : o != e && e != "  " && e != `
` && e != "\r" && (this._schemeData += b(e));
                        break;
                    case "no scheme":
                        if (!c || !a(c._scheme))
                            v("Missing scheme."),
                            n.call(this);
                        else {
                            u = "relative";
                            continue
                        }
                        break;
                    case "relative or authority":
                        if (e == "/" && r[A + 1] == "/")
                            u = "authority ignore slashes";
                        else {
                            v("Expected /, got: " + e),
                            u = "relative";
                            continue
                        }
                        break;
                    case "relative":
                        if (this._isRelative = !0,
                        this._scheme != "file" && (this._scheme = c._scheme),
                        o == e) {
                            this._host = c._host,
                            this._port = c._port,
                            this._path = c._path.slice(),
                            this._query = c._query,
                            this._username = c._username,
                            this._password = c._password;
                            break t
                        } else if (e == "/" || e == "\\")
                            e == "\\" && v("\\ is an invalid code point."),
                            u = "relative slash";
                        else if (e == "?")
                            this._host = c._host,
                            this._port = c._port,
                            this._path = c._path.slice(),
                            this._query = "?",
                            this._username = c._username,
                            this._password = c._password,
                            u = "query";
                        else if (e == "#")
                            this._host = c._host,
                            this._port = c._port,
                            this._path = c._path.slice(),
                            this._query = c._query,
                            this._fragment = "#",
                            this._username = c._username,
                            this._password = c._password,
                            u = "fragment";
                        else {
                            var R = r[A + 1]
                              , j = r[A + 2];
                            (this._scheme != "file" || !w.test(e) || R != ":" && R != "|" || o != j && j != "/" && j != "\\" && j != "?" && j != "#") && (this._host = c._host,
                            this._port = c._port,
                            this._username = c._username,
                            this._password = c._password,
                            this._path = c._path.slice(),
                            this._path.pop()),
                            u = "relative path";
                            continue
                        }
                        break;
                    case "relative slash":
                        if (e == "/" || e == "\\")
                            e == "\\" && v("\\ is an invalid code point."),
                            this._scheme == "file" ? u = "file host" : u = "authority ignore slashes";
                        else {
                            this._scheme != "file" && (this._host = c._host,
                            this._port = c._port,
                            this._username = c._username,
                            this._password = c._password),
                            u = "relative path";
                            continue
                        }
                        break;
                    case "authority first slash":
                        if (e == "/")
                            u = "authority second slash";
                        else {
                            v("Expected '/', got: " + e),
                            u = "authority ignore slashes";
                            continue
                        }
                        break;
                    case "authority second slash":
                        if (u = "authority ignore slashes",
                        e != "/") {
                            v("Expected '/', got: " + e);
                            continue
                        }
                        break;
                    case "authority ignore slashes":
                        if (e != "/" && e != "\\") {
                            u = "authority";
                            continue
                        } else
                            v("Expected authority, got: " + e);
                        break;
                    case "authority":
                        if (e == "@") {
                            P && (v("@ already seen."),
                            f += "%40"),
                            P = !0;
                            for (var q = 0; q < f.length; q++) {
                                var k = f[q];
                                if (k == "  " || k == `
` || k == "\r") {
                                    v("Invalid whitespace in authority.");
                                    continue
                                }
                                if (k == ":" && this._password === null) {
                                    this._password = "";
                                    continue
                                }
                                var $ = b(k);
                                this._password !== null ? this._password += $ : this._username += $
                            }
                            f = ""
                        } else if (o == e || e == "/" || e == "\\" || e == "?" || e == "#") {
                            A -= f.length,
                            f = "",
                            u = "host";
                            continue
                        } else
                            f += e;
                        break;
                    case "file host":
                        if (o == e || e == "/" || e == "\\" || e == "?" || e == "#") {
                            f.length == 2 && w.test(f[0]) && (f[1] == ":" || f[1] == "|") ? u = "relative path" : (f.length == 0 || (this._host = d.call(this, f),
                            f = ""),
                            u = "relative path start");
                            continue
                        } else
                            e == "  " || e == `
` || e == "\r" ? v("Invalid whitespace in file host.") : f += e;
                        break;
                    case "host":
                    case "hostname":
                        if (e == ":" && !D) {
                            if (this._host = d.call(this, f),
                            f = "",
                            u = "port",
                            p == "hostname")
                                break t
                        } else if (o == e || e == "/" || e == "\\" || e == "?" || e == "#") {
                            if (this._host = d.call(this, f),
                            f = "",
                            u = "relative path start",
                            p)
                                break t;
                            continue
                        } else
                            e != "  " && e != `
` && e != "\r" ? (e == "[" ? D = !0 : e == "]" && (D = !1),
                            f += e) : v("Invalid code point in host/hostname: " + e);
                        break;
                    case "port":
                        if (/[0-9]/.test(e))
                            f += e;
                        else if (o == e || e == "/" || e == "\\" || e == "?" || e == "#" || p) {
                            if (f != "") {
                                var N = parseInt(f, 10);
                                N != h[this._scheme] && (this._port = N + ""),
                                f = ""
                            }
                            if (p)
                                break t;
                            u = "relative path start";
                            continue
                        } else
                            e == "  " || e == `
` || e == "\r" ? v("Invalid code point in port: " + e) : n.call(this);
                        break;
                    case "relative path start":
                        if (e == "\\" && v("'\\' not allowed in path."),
                        u = "relative path",
                        e != "/" && e != "\\")
                            continue;
                        break;
                    case "relative path":
                        if (o == e || e == "/" || e == "\\" || !p && (e == "?" || e == "#")) {
                            e == "\\" && v("\\ not allowed in relative path.");
                            var t;
                            (t = s[f.toLowerCase()]) && (f = t),
                            f == ".." ? (this._path.pop(),
                            e != "/" && e != "\\" && this._path.push("")) : f == "." && e != "/" && e != "\\" ? this._path.push("") : f != "." && (this._scheme == "file" && this._path.length == 0 && f.length == 2 && w.test(f[0]) && f[1] == "|" && (f = f[0] + ":"),
                            this._path.push(f)),
                            f = "",
                            e == "?" ? (this._query = "?",
                            u = "query") : e == "#" && (this._fragment = "#",
                            u = "fragment")
                        } else
                            e != "  " && e != `
` && e != "\r" && (f += b(e));
                        break;
                    case "query":
                        !p && e == "#" ? (this._fragment = "#",
                        u = "fragment") : o != e && e != "  " && e != `
` && e != "\r" && (this._query += g(e));
                        break;
                    case "fragment":
                        o != e && e != "    " && e != `
` && e != "\r" && (this._fragment += e);
                        break
                    }
                    A++
                }
            }
            function U() {
                this._scheme = "",
                this._schemeData = "",
                this._username = "",
                this._password = null,
                this._host = "",
                this._port = "",
                this._path = [],
                this._query = "",
                this._fragment = "",
                this._isInvalid = !1,
                this._isRelative = !1
            }
            function T(r, p) {
                p !== void 0 && !(p instanceof T) && (p = new T(String(p))),
                r = String(r),
                this._url = r,
                U.call(this);
                var c = r.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, "");
                x.call(this, c, null, p)
            }
            T.prototype = {
                toString: function() {
                    return this.href
                },
                get href() {
                    if (this._isInvalid)
                        return this._url;
                    var r = "";
                    return (this._username != "" || this._password != null) && (r = this._username + (this._password != null ? ":" + this._password : "") + "@"),
                    this.protocol + (this._isRelative ? "//" + r + this.host : "") + this.pathname + this._query + this._fragment
                },
                set href(r) {
                    U.call(this),
                    x.call(this, r)
                },
                get protocol() {
                    return this._scheme + ":"
                },
                set protocol(r) {
                    this._isInvalid || x.call(this, r + ":", "scheme start")
                },
                get host() {
                    return this._isInvalid ? "" : this._port ? this._host + ":" + this._port : this._host
                },
                set host(r) {
                    this._isInvalid || !this._isRelative || x.call(this, r, "host")
                },
                get hostname() {
                    return this._host
                },
                set hostname(r) {
                    this._isInvalid || !this._isRelative || x.call(this, r, "hostname")
                },
                get port() {
                    return this._port
                },
                set port(r) {
                    this._isInvalid || !this._isRelative || x.call(this, r, "port")
                },
                get pathname() {
                    return this._isInvalid ? "" : this._isRelative ? "/" + this._path.join("/") : this._schemeData
                },
                set pathname(r) {
                    this._isInvalid || !this._isRelative || (this._path = [],
                    x.call(this, r, "relative path start"))
                },
                get search() {
                    return this._isInvalid || !this._query || this._query == "?" ? "" : this._query
                },
                set search(r) {
                    this._isInvalid || !this._isRelative || (this._query = "?",
                    r[0] == "?" && (r = r.slice(1)),
                    x.call(this, r, "query"))
                },
                get hash() {
                    return this._isInvalid || !this._fragment || this._fragment == "#" ? "" : this._fragment
                },
                set hash(r) {
                    this._isInvalid || (this._fragment = "#",
                    r[0] == "#" && (r = r.slice(1)),
                    x.call(this, r, "fragment"))
                },
                get origin() {
                    var r;
                    if (this._isInvalid || !this._scheme)
                        return "";
                    switch (this._scheme) {
                    case "data":
                    case "file":
                    case "javascript":
                    case "mailto":
                        return "null"
                    }
                    return r = this.host,
                    r ? this._scheme + "://" + r : ""
                }
            };
            var B = self.URL;
            return B && (T.createObjectURL = function(r) {
                return B.createObjectURL.apply(B, arguments)
            }
            ,
            T.revokeObjectURL = function(r) {
                B.revokeObjectURL(r)
            }
            ),
            T
        }
        var V = kt();
        var nt = vt(at());
        var C;
        (function(o) {
            o.empty = "",
            o.pending = "\u{1F551}",
            o.successful = "\u2705",
            o.caution = "\u26A0\uFE0F",
            o.failed = "\u274C",
            o.global = "\u{1F30D}",
            o.asterisk = "*"
        }
        )(C || (C = {}));
        var H = class {
            constructor(s="div", a=void 0, n=C.pending) {
                let d = document.createElement(s);
                this.element = d,
                a != null && (this.className = a),
                this.textContent = n
            }
            static fromElement(s) {
                let a = new H("div");
                return a.element = s,
                a
            }
            asterisk() {
                this.textContent = C.asterisk
            }
            lose() {
                this.textContent = C.failed
            }
            win(s) {
                if (s != null) {
                    this.textContent = C.empty;
                    let a = document.createElement("a");
                    a.href = s,
                    a.target = "_blank",
                    a.textContent = C.successful,
                    this.element.title = s,
                    this.element.appendChild(a)
                } else
                    this.textContent = C.successful
            }
            global() {
                this.textContent = C.global
            }
            err() {
                this.textContent = C.caution
            }
            empty() {
                this.textContent = C.empty
            }
            get style() {
                return this.element.style
            }
            append(s) {
                return s instanceof H && (s = s.element),
                this.element.append(s)
            }
            get classList() {
                return this.element.classList
            }
            set title(s) {
                this.element.title = s
            }
            set className(s) {
                this.element.className = s
            }
            set textContent(s) {
                this.element.textContent = s
            }
        }
        ;
        var I = class {
            constructor(s, ...a) {
                this.parent = s;
                this.tag = new H(...a)
            }
        };
        var J = class extends I {
            constructor(s, ...a) {
                super(s, ...a);
                this.parent = s;
                this._className = "Not-set";
                this._tagName = "Not-set"
            }
            get className() {
                return this._className
            }
            get tagName() {
                return this._tagName
            }
            check() {}
            checked() {}
            onerror() {
                this.tag.err()
            }
        };
        var O = "bafybeiatyghkzrrtodzt3stm652rkrjxndg4hq2ublfdmifk7plg5k5brq"
          , ot = O
          , ht = "<title>Some keys for testing - jetbra.in</title>";
        var L = class {
            constructor(s) {
                this.namespace = s
            }
            log(s, ...a) {
                let[n,...d] = a
                  , b = this.namespace != null ? `${this.namespace}.${s}: ` : "";
                console[s](`${b}${n}`, ...d)
            }
            debug(...s) {
                this.log("debug", ...s)
            }
            info(...s) {
                this.log("info", ...s)
            }
            warn(...s) {
                this.log("warn", ...s)
            }
            error(...s) {}
        }
        ;
        var {fetch: xt} = (0,
        nt.default)()
          , Q = new L("Cors")
          , K = class extends J {
            constructor(s) {
                super(s, "div", "Cors");
                this.parent = s;
                this._className = "Cors";
                this._tagName = "div"
            }
            async check() {
                let s = Date.now()
                  , n = `${this.parent.gateway.replace(":hash", O)}?now=${s}#x-ipfs-companion-no-redirect`;
                try {
                    let d = new AbortController
                      , b = setTimeout(()=>d.abort(), 1e4)
                      , g = await xt(n, {
                        signal: d.signal
                    })
                      , {status: o} = g
                      , w = await g.text();
                    if (this.tag.title = `Response code: ${o}`,
                    clearTimeout(b),
                    w.trim().includes(ht))
                        this.tag.asterisk(),
                        this.parent.tag.classList.add("cors");
                    else
                        throw Q.debug("The response text did not match the expected string"),
                        this.onerror(),
                        new Error(`URL '${n} does not support CORS`)
                } catch (d) {
                    throw Q.error(d),
                    this.onerror(),
                    d
                }
            }
            checked() {
                Q.warn("Not implemented yet")
            }
            onerror() {
                this.tag.empty()
            }
        }
        ;
        async function pt(h) {
            let s = 1e4;
            return await new Promise((a,n)=>{
                let d = new Image
                  , b = setTimeout(()=>{
                    n(new Error(`Timeout when attempting to load img from '${d.src}`))
                }
                , s)
                  , g = (o,w,G,x,U)=>{
                    clearTimeout(b),
                    U == null ? n(new Error(`Unknown Error when attempting to load img from '${d.src}`)) : n(U)
                };
                d.onerror = g,
                d.onload = ()=>{
                    clearTimeout(b),
                    a()
                },
                d.src = h.toString()
            }
            )
        }
        var Tt = new L("Status")
          , Y = class extends I {
            constructor(s) {
                super(s, "div", "Status");
                this.parent = s;
                this._up = !1;
                this._down = !1
            }
            async check() {
                let s = this.parent.gateway.replace(":hash", ot)
                  , a = new V(`${s}1x1.png?now=${Date.now()}#x-ipfs-companion-no-redirect`);
                await pt(a).catch(n=>{
                    throw n != null && Tt.error(this.parent.gateway, n),
                    n
                }
                )
            }
            get down() {
                return this._down
            }
            set down(s) {
                !this.up && !this.down && (this._down = !0,
                this.tag.lose())
            }
            get up() {
                return this._up
            }
            set up(s) {
                !this.up && !this.down && (this._up = !0,
                this.tag.global(),
                this.parent.tag.classList.add("online"))
            }
            onerror() {
                throw new Error("Not implemented")
            }
        };
        function tt(h) {
            let s = h.toString();
            return h?.hostname != null && (s = h.hostname.toString()),
            s.replace(`${O}.ipfs.`, "").replace(`${O}.`, "")
        }
        var S = new L("GatewayNode")
          , et = class extends I {
            constructor(s, a, n) {
                super(s, "div", "Node");
                this.parent = s;
                this.atLeastOneSuccess = !1;
                this.tag.empty(),
                this.tag.style.order = Date.now().toString(),
                this.status = new Y(this),
                this.tag.append(this.status.tag),
                this.cors = new K(this),
                this.tag.append(this.cors.tag),
                this.link = document.createElement("div");
                let d = a.replace(":hash", O);
                this.link.url = new V(d),
                this.link.textContent = tt(this.link.url),
                this.link.className = "Link",
                this.tag.append(this.link),
                this.took = document.createElement("div"),
                this.took.className = "Took",
                this.tag.append(this.took),
                this.gateway = a,
                this.index = n,
                this.checkingTime = 0
            }
            async check() {
                this.checkingTime = Date.now();
                let s = [this.status.check().then(()=>S.debug(this.gateway, "Status success")).then(this.onSuccessfulCheck.bind(this)), this.cors.check().then(()=>S.debug(this.gateway, "CORS success")).then(this.onSuccessfulCheck.bind(this))];
                await Promise.allSettled(s).then(a=>a.map(n=>n.status)).then(a=>{
                    a.includes("fulfilled") ? (S.debug(`For gateway '${this.gateway}', at least one promise was successfully fulfilled`),
                    S.debug(this.gateway, "this.status.up: ", this.status.up),
                    S.debug(this.gateway, "this.status.down: ", this.status.down),
                    this.status.up = !0,
                    S.debug(this.gateway, "this.status.up: ", this.status.up),
                    S.debug(this.gateway, "this.status.down: ", this.status.down)) : (this.status.down = !0,
                    S.debug(`For gateway '${this.gateway}', all promises were rejected`))
                }
                )
            }
            onSuccessfulCheck() {
                if (!this.atLeastOneSuccess) {
                    S.info(`For gateway '${this.gateway}', at least one check was successful`),
                    this.atLeastOneSuccess = !0,
                    this.status.up = !0;
                    let s = this.link.url;
                    if (s != null) {
                        let d = tt(s);
                        this.link.innerHTML = `<a title="${d}" href="${s.toString()}" target="_blank">${d}</a>`
                    }
                    let a = Date.now() - this.checkingTime;
                    this.tag.style.order = a.toString();
                    let n = (a / 1e3).toFixed(2);
                    this.took.textContent = `${n}s`
                }
            }
            onerror() {
                this.tag.err()
            }
        };
        var st = class {
            constructor(s) {
                this.parent = s;
                let a = document.getElementById("checker.results");
                if (a == null)
                    throw new Error('Element with Id "checker.results" not found.');
                this.element = a
            }
            append(s) {
                this.element.append(s.element)
            }
        };
        var it = class extends I {
            constructor(s) {
                super(s);
                this.parent = s;
                let a = document.getElementById("checker.stats");
                if (a == null)
                    throw new Error('Could not find element with Id "checker.stats"');
                this.tag = H.fromElement(a),
                this.gateways = document.createElement("div"),
                this.gateways.textContent = "0/0 tested",
                this.gateways.className = "Gateways",
                this.tag.append(this.gateways),
                this.totals = document.createElement("div"),
                this.totals.textContent = "0 online",
                this.totals.className = "Totals",
                this.tag.append(this.totals)
            }
            update() {
                let s = 0
                  , a = 0;
                for (let n of this.parent.nodes)
                    n.status.up ? s += 1 : n.status.down && (a += 1);
                this.gateways.textContent = `${s + a}/${this.parent.nodes.length} tested`,
                this.totals.textContent = `${s} online`
            }
        };
        var Et = new L("Checker")
          , rt = class {
            constructor() {
                this.nodes = [];
                let s = document.getElementById("checker");
                if (s == null)
                    throw new Error('Element with Id "checker" not found.');
                this.element = s,
                this.stats = new it(this),
                this.results = new st(this),
                this.updateStats = this.updateStats.bind(this)
            }
            updateStats() {
                this.stats.update()
            }
            async checkGateways(s) {
                let a = [];
                for (let n of s) {
                    let d = new et(this.results,n,this.nodes.length);
                    this.nodes.push(d),
                    this.results.append(d.tag),
                    setTimeout(()=>{
                        a.push(d.check().catch(b=>Et.error(b)).finally(this.updateStats))
                    }
                    , 100 * this.nodes.length)
                }
            }
        };
        var ft = ["https://ipfs.io/ipfs/:hash/", "https://dweb.link/ipfs/:hash/", "https://gateway.ipfs.io/ipfs/:hash/", "https://ipfs.infura.io/ipfs/:hash/", "https://infura-ipfs.io/ipfs/:hash/", "https://ninetailed.ninja/ipfs/:hash/", "https://via0.com/ipfs/:hash/", "https://ipfs.eternum.io/ipfs/:hash/", "https://hardbin.com/ipfs/:hash/", "https://gateway.blocksec.com/ipfs/:hash/", "https://cloudflare-ipfs.com/ipfs/:hash/", "https://astyanax.io/ipfs/:hash/", "https://cf-ipfs.com/ipfs/:hash/", "https://ipns.co/ipfs/:hash/", "https://ipfs.mrh.io/ipfs/:hash/", "https://gateway.originprotocol.com/ipfs/:hash/", "https://gateway.pinata.cloud/ipfs/:hash/", "https://ipfs.doolta.com/ipfs/:hash/", "http://147.75.38.111/ipfs/:hash/", "http://147.28.147.227/ipfs/:hash/", "http://139.178.88.239/ipfs/:hash/", "http://86.109.7.107/ipfs/:hash/", "http://145.40.117.11/ipfs/:hash/", "http://145.40.93.119/ipfs/:hash/", "http://145.40.88.35/ipfs/:hash/", "http://147.75.108.157/ipfs/:hash/", "http://147.28.147.245/ipfs/:hash/", "http://147.28.128.243/ipfs/:hash/", "http://145.40.71.73/ipfs/:hash/", "http://147.75.109.125/ipfs/:hash/", "http://136.144.48.213/ipfs/:hash/", "https://ipfs.sloppyta.co/ipfs/:hash/", "https://ipfs.busy.org/ipfs/:hash/", "https://ipfs.greyh.at/ipfs/:hash/", "https://gateway.serph.network/ipfs/:hash/", "https://jorropo.net/ipfs/:hash/", "https://ipfs.fooock.com/ipfs/:hash/", "https://cdn.cwinfo.net/ipfs/:hash/", "https://aragon.ventures/ipfs/:hash/", "https://ipfs-cdn.aragon.ventures/ipfs/:hash/", "https://permaweb.io/ipfs/:hash/", "https://ipfs.best-practice.se/ipfs/:hash/", "https://storjipfs-gateway.com/ipfs/:hash/", "https://ipfs.runfission.com/ipfs/:hash/", "https://ipfs.trusti.id/ipfs/:hash/", "https://ipfs.overpi.com/ipfs/:hash/", "https://gateway.ipfs.lc/ipfs/:hash/", "https://ipfs.ink/ipfs/:hash/", "https://ipfsgateway.makersplace.com/ipfs/:hash/", "https://gateway.ravenland.org/ipfs/:hash/", "https://ipfs.funnychain.co/ipfs/:hash/", "https://ipfs.telos.miami/ipfs/:hash/", "https://ipfs.mttk.net/ipfs/:hash/", "https://ipfs.fleek.co/ipfs/:hash/", "https://ipfs.jbb.one/ipfs/:hash/", "https://ipfs.yt/ipfs/:hash/", "https://hashnews.k1ic.com/ipfs/:hash/", "https://ipfs.vip/ipfs/:hash/", "https://ipfs.drink.cafe/ipfs/:hash/", "https://ipfs.azurewebsites.net/ipfs/:hash/", "https://gw.ipfspin.com/ipfs/:hash/", "https://ipfs.kavin.rocks/ipfs/:hash/", "https://ipfs.denarius.io/ipfs/:hash/", "https://ipfs.mihir.ch/ipfs/:hash/", "https://crustwebsites.net/ipfs/:hash/", "https://ipfs0.sjc.cloudsigma.com/ipfs/:hash/", "http://ipfs.genenetwork.org/ipfs/:hash/", "https://ipfs.eth.aragon.network/ipfs/:hash/", "https://ipfs.smartholdem.io/ipfs/:hash/", "https://ipfs.xoqq.ch/ipfs/:hash/", "http://natoboram.mynetgear.com:8080/ipfs/:hash/", "https://video.oneloveipfs.com/ipfs/:hash/", "http://ipfs.anonymize.com/ipfs/:hash/", "https://ipfs.taxi/ipfs/:hash/", "https://ipfs.scalaproject.io/ipfs/:hash/", "https://search.ipfsgate.com/ipfs/:hash/", "https://ipfs.decoo.io/ipfs/:hash/", "https://ivoputzer.xyz/ipfs/:hash/", "https://alexdav.id/ipfs/:hash/", "https://ipfs.uploads.nu/ipfs/:hash/", "https://hub.textile.io/ipfs/:hash/", "https://ipfs1.pixura.io/ipfs/:hash/", "https://ravencoinipfs-gateway.com/ipfs/:hash/", "https://konubinix.eu/ipfs/:hash/", "https://3cloud.ee/ipfs/:hash/", "https://ipfs.tubby.cloud/ipfs/:hash/", "https://ipfs.lain.la/ipfs/:hash/", "https://ipfs.adatools.io/ipfs/:hash/", "https://ipfs.kaleido.art/ipfs/:hash/", "https://ipfs.slang.cx/ipfs/:hash/", "https://ipfs.arching-kaos.com/ipfs/:hash/", "https://storry.tv/ipfs/:hash/", "https://ipfs.kxv.io/ipfs/:hash/", "https://ipfs.1-2.dev/ipfs/:hash/", "https://ipfs-nosub.stibarc.com/ipfs/:hash/", "https://dweb.eu.org/ipfs/:hash/", "https://permaweb.eu.org/ipfs/:hash/", "https://ipfs.namebase.io/ipfs/:hash/", "https://ipfs.tribecap.co/ipfs/:hash/", "https://ipfs.kinematiks.com/ipfs/:hash/", "https://c4rex.co/ipfs/:hash/", "https://nftstorage.link/ipfs/:hash/", "https://gravity.jup.io/ipfs/:hash/", "http://fzdqwfb5ml56oadins5jpuhe6ki6bk33umri35p5kt2tue4fpws5efid.onion/ipfs/:hash/", "https://tth-ipfs.com/ipfs/:hash/", "https://ipfs.chisdealhd.co.uk/ipfs/:hash/", "https://ipfs.alloyxuast.tk/ipfs/:hash/", "https://ipfs.litnet.work/ipfs/:hash/", "https://ipfs.hexide.com/ipfs/:hash/", "https://10.via0.com/ipfs/:hash/", "https://gateway.temporal.cloud/ipfs/:hash/", "https://hashnews.k1ic.com/ipfs/:hash/", "https://ipfs.2read.net/ipfs/:hash/", "https://ipfs.cf-ipfs.com/ipfs/:hash/", "https://jacl.tech/ipfs/:hash/", "https://ipfs.jeroendeneef.com/ipfs/:hash/", "https://ipfs.k1ic.com/ipfs/:hash/", "https://ipfs.lc/ipfs/:hash/", "https://ipfs.moonicorn.network/ipfs/:hash/", "https://ipfs.smartsignature.io/ipfs/:hash/", "https://ipfs.stibarc.com/ipfs/:hash/", "https://jorropo.ovh/ipfs/:hash/", "https://robotizing.net/ipfs/:hash/", "https://trusti.id/ipfs/:hash/", "https://siderus.io/ipfs/:hash/", "https://snap1.d.tube/ipfs/:hash/", "https://coinsh.red/ipfs/:hash/", "https://ipns.co/:hash/", "https://ipfs.oceanprotocol.com/ipfs/:hash/", "https://cloudfront.net/ipfs/:hash/", "https://ipfs.oxerr.net/ipfs/:hash/", "https://ipfs.privacytools.io/ipfs/:hash/", "https://ipfs.renehsz.com/ipfs/:hash/", "https://ipfs.com/ipfs/:hash/", "https://ipfs.cosmos-ink.net/ipfs/:hash/", "https://rx14.co.uk/ipfs/:hash/", "https://2read.net/ipfs/:hash/", "https://filecoin.io/ipfs/:hash/", "https://ipfs.3box.io/ipfs/:hash/", "https://ipfs.globalupload.io/:hash/", "https://ipfs.globalupload.io/ipfs/:hash/", "https://ipfs.dweb.link/ipfs/:hash/", "https://ipfs.infura-ipfs.io/ipfs/:hash/", "https://ipfs.wa.hle.rs/ipfs/:hash/", "https://ipfs.stibarc.gq/ipfs/:hash/", "https://ipfs.jacl.tech/ipfs/:hash/", "https://ipfs.jes.xxx/ipfs/:hash/", "https://ipfs.leiyun.org/ipfs/:hash/", "https://ap.siderus.io/ipfs/:hash/", "https://api.wisdom.sh/ipfs/:hash/", "https://catalunya.network/ipfs/:hash/", "https://coinsh.red/:hash/", "https://d26g9c7mfuzstv.cloudfront.net/ipfs/:hash/", "https://eu.siderus.io/ipfs/:hash/", "https://gateway.swedneck.xyz/ipfs/:hash/", "https://ipfs.dapps.earth/ipfs/:hash/", "https://ipfs.deo.moe/ipfs/:hash/", "https://ipfs.macholibre.org/ipfs/:hash/", "https://ipfs.netw0rk.io/ipfs/:hash/", "https://ipfs.works/ipfs/:hash/", "https://ipfstube.erindachtler.me/ipfs/:hash/", "https://na.siderus.io/ipfs/:hash/", "https://upload.global/ipfs/:hash/"];
        var lt = new L("App index");
        window.checker = new rt;
        window.checker.checkGateways(ft).catch(h=>{
            lt.error("Unexpected error"),
            lt.error(h)
        }
        );
    }
    )();
    return IpfsPublicGatewayChecker
}));
</script>
</body>
</html>

hash取值:

var O = "bafybeiatyghkzrrtodzt3stm652rkrjxndg4hq2ublfdmifk7plg5k5brq";//220801
var O = "bafybeia4nrbuvpfd6k7lkorzgjw3t6totaoko7gmvq5pyuhl2eloxnfiri";//230914
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朝闻道 晨星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值