text: "use strict";
  
  const conversions = require("webidl-conversions");
  const utils = require("./utils.js");
  
  const convertNode = require("./Node.js").convert;
  const isNode = require("./Node.js").is;
  const convertHTMLElement = require("./HTMLElement.js").convert;
  const impl = utils.implSymbol;
  const Node = require("./Node.js");
  const GlobalEventHandlers = require("./GlobalEventHandlers.js");
  const NonElementParentNode = require("./NonElementParentNode.js");
  const ParentNode = require("./ParentNode.js");
  
  class Document extends Node.interface {
    constructor() {
      return iface.setup(Object.create(new.target.prototype));
    }
  
    getElementsByTagName(qualifiedName) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'getElementsByTagName' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'getElementsByTagName' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].getElementsByTagName(...args));
    }
  
    getElementsByTagNameNS(namespace, localName) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 2) {
        throw new TypeError(
          "Failed to execute 'getElementsByTagNameNS' on 'Document': 2 arguments required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        if (curArg === null || curArg === undefined) {
          curArg = null;
        } else {
          curArg = conversions["DOMString"](curArg, {
            context: "Failed to execute 'getElementsByTagNameNS' on 'Document': parameter 1"
          });
        }
        args.push(curArg);
      }
      {
        let curArg = arguments[1];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'getElementsByTagNameNS' on 'Document': parameter 2"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].getElementsByTagNameNS(...args));
    }
  
    getElementsByClassName(classNames) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'getElementsByClassName' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'getElementsByClassName' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].getElementsByClassName(...args));
    }
  
    createElement(localName) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'createElement' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createElement' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createElement(...args));
    }
  
    createElementNS(namespace, qualifiedName) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 2) {
        throw new TypeError(
          "Failed to execute 'createElementNS' on 'Document': 2 arguments required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        if (curArg === null || curArg === undefined) {
          curArg = null;
        } else {
          curArg = conversions["DOMString"](curArg, {
            context: "Failed to execute 'createElementNS' on 'Document': parameter 1"
          });
        }
        args.push(curArg);
      }
      {
        let curArg = arguments[1];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createElementNS' on 'Document': parameter 2"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createElementNS(...args));
    }
  
    createDocumentFragment() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl].createDocumentFragment());
    }
  
    createTextNode(data) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'createTextNode' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createTextNode' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createTextNode(...args));
    }
  
    createCDATASection(data) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'createCDATASection' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createCDATASection' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createCDATASection(...args));
    }
  
    createComment(data) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'createComment' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createComment' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createComment(...args));
    }
  
    createProcessingInstruction(target, data) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 2) {
        throw new TypeError(
          "Failed to execute 'createProcessingInstruction' on 'Document': 2 arguments required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createProcessingInstruction' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      {
        let curArg = arguments[1];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createProcessingInstruction' on 'Document': parameter 2"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createProcessingInstruction(...args));
    }
  
    importNode(node) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'importNode' on 'Document': 1 argument required, but only " + arguments.length + " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = convertNode(curArg, { context: "Failed to execute 'importNode' on 'Document': parameter 1" });
        args.push(curArg);
      }
      {
        let curArg = arguments[1];
        if (curArg !== undefined) {
          curArg = conversions["boolean"](curArg, {
            context: "Failed to execute 'importNode' on 'Document': parameter 2"
          });
        } else {
          curArg = false;
        }
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].importNode(...args));
    }
  
    adoptNode(node) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'adoptNode' on 'Document': 1 argument required, but only " + arguments.length + " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = convertNode(curArg, { context: "Failed to execute 'adoptNode' on 'Document': parameter 1" });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].adoptNode(...args));
    }
  
    createAttribute(localName) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'createAttribute' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createAttribute' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createAttribute(...args));
    }
  
    createAttributeNS(namespace, qualifiedName) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 2) {
        throw new TypeError(
          "Failed to execute 'createAttributeNS' on 'Document': 2 arguments required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        if (curArg === null || curArg === undefined) {
          curArg = null;
        } else {
          curArg = conversions["DOMString"](curArg, {
            context: "Failed to execute 'createAttributeNS' on 'Document': parameter 1"
          });
        }
        args.push(curArg);
      }
      {
        let curArg = arguments[1];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createAttributeNS' on 'Document': parameter 2"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createAttributeNS(...args));
    }
  
    createEvent(interface_) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'createEvent' on 'Document': 1 argument required, but only " + arguments.length + " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'createEvent' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createEvent(...args));
    }
  
    createNodeIterator(root) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'createNodeIterator' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = convertNode(curArg, { context: "Failed to execute 'createNodeIterator' on 'Document': parameter 1" });
        args.push(curArg);
      }
      {
        let curArg = arguments[1];
        if (curArg !== undefined) {
          curArg = conversions["unsigned long"](curArg, {
            context: "Failed to execute 'createNodeIterator' on 'Document': parameter 2"
          });
        } else {
          curArg = 0xffffffff;
        }
        args.push(curArg);
      }
      {
        let curArg = arguments[2];
        if (curArg !== undefined) {
          if (curArg === null || curArg === undefined) {
            curArg = null;
          } else {
            curArg = utils.tryImplForWrapper(curArg);
          }
        } else {
          curArg = null;
        }
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createNodeIterator(...args));
    }
  
    createTreeWalker(root) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'createTreeWalker' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = convertNode(curArg, { context: "Failed to execute 'createTreeWalker' on 'Document': parameter 1" });
        args.push(curArg);
      }
      {
        let curArg = arguments[1];
        if (curArg !== undefined) {
          curArg = conversions["unsigned long"](curArg, {
            context: "Failed to execute 'createTreeWalker' on 'Document': parameter 2"
          });
        } else {
          curArg = 0xffffffff;
        }
        args.push(curArg);
      }
      {
        let curArg = arguments[2];
        if (curArg !== undefined) {
          if (curArg === null || curArg === undefined) {
            curArg = null;
          } else {
            curArg = utils.tryImplForWrapper(curArg);
          }
        } else {
          curArg = null;
        }
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].createTreeWalker(...args));
    }
  
    getElementsByName(elementName) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'getElementsByName' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'getElementsByName' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].getElementsByName(...args));
    }
  
    open() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
      const args = [];
      {
        let curArg = arguments[0];
        if (curArg !== undefined) {
          curArg = conversions["DOMString"](curArg, { context: "Failed to execute 'open' on 'Document': parameter 1" });
        } else {
          curArg = "text/html";
        }
        args.push(curArg);
      }
      {
        let curArg = arguments[1];
        if (curArg !== undefined) {
          curArg = conversions["DOMString"](curArg, { context: "Failed to execute 'open' on 'Document': parameter 2" });
        } else {
          curArg = "";
        }
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].open(...args));
    }
  
    close() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl].close();
    }
  
    write() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
      const args = [];
      for (let i = 0; i < arguments.length; i++) {
        let curArg = arguments[i];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'write' on 'Document': parameter " + (i + 1)
        });
        args.push(curArg);
      }
      return this[impl].write(...args);
    }
  
    writeln() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
      const args = [];
      for (let i = 0; i < arguments.length; i++) {
        let curArg = arguments[i];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'writeln' on 'Document': parameter " + (i + 1)
        });
        args.push(curArg);
      }
      return this[impl].writeln(...args);
    }
  
    hasFocus() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl].hasFocus();
    }
  
    clear() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl].clear();
    }
  
    captureEvents() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl].captureEvents();
    }
  
    releaseEvents() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl].releaseEvents();
    }
  
    getElementById(elementId) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'getElementById' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'getElementById' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].getElementById(...args));
    }
  
    prepend() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
      const args = [];
      for (let i = 0; i < arguments.length; i++) {
        let curArg = arguments[i];
        if (isNode(curArg)) {
          curArg = utils.implForWrapper(curArg);
        } else {
          curArg = conversions["DOMString"](curArg, {
            context: "Failed to execute 'prepend' on 'Document': parameter " + (i + 1)
          });
        }
        args.push(curArg);
      }
      return this[impl].prepend(...args);
    }
  
    append() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
      const args = [];
      for (let i = 0; i < arguments.length; i++) {
        let curArg = arguments[i];
        if (isNode(curArg)) {
          curArg = utils.implForWrapper(curArg);
        } else {
          curArg = conversions["DOMString"](curArg, {
            context: "Failed to execute 'append' on 'Document': parameter " + (i + 1)
          });
        }
        args.push(curArg);
      }
      return this[impl].append(...args);
    }
  
    querySelector(selectors) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'querySelector' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'querySelector' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].querySelector(...args));
    }
  
    querySelectorAll(selectors) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (arguments.length < 1) {
        throw new TypeError(
          "Failed to execute 'querySelectorAll' on 'Document': 1 argument required, but only " +
            arguments.length +
            " present."
        );
      }
      const args = [];
      {
        let curArg = arguments[0];
        curArg = conversions["DOMString"](curArg, {
          context: "Failed to execute 'querySelectorAll' on 'Document': parameter 1"
        });
        args.push(curArg);
      }
      return utils.tryWrapperForImpl(this[impl].querySelectorAll(...args));
    }
  
    get implementation() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "implementation", () => {
        return utils.tryWrapperForImpl(this[impl]["implementation"]);
      });
    }
  
    get URL() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["URL"];
    }
  
    get documentURI() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["documentURI"];
    }
  
    get origin() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["origin"];
    }
  
    get compatMode() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["compatMode"];
    }
  
    get characterSet() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["characterSet"];
    }
  
    get charset() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["charset"];
    }
  
    get inputEncoding() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["inputEncoding"];
    }
  
    get contentType() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["contentType"];
    }
  
    get doctype() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["doctype"]);
    }
  
    get documentElement() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["documentElement"]);
    }
  
    get referrer() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["referrer"];
    }
  
    get cookie() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["cookie"];
    }
  
    set cookie(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = conversions["USVString"](V, {
        context: "Failed to set the 'cookie' property on 'Document': The provided value"
      });
  
      this[impl]["cookie"] = V;
    }
  
    get lastModified() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["lastModified"];
    }
  
    get readyState() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["readyState"]);
    }
  
    get title() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["title"];
    }
  
    set title(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = conversions["DOMString"](V, {
        context: "Failed to set the 'title' property on 'Document': The provided value"
      });
  
      this[impl]["title"] = V;
    }
  
    get dir() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["dir"];
    }
  
    set dir(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = conversions["DOMString"](V, { context: "Failed to set the 'dir' property on 'Document': The provided value" });
  
      this[impl]["dir"] = V;
    }
  
    get body() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["body"]);
    }
  
    set body(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      if (V === null || V === undefined) {
        V = null;
      } else {
        V = convertHTMLElement(V, { context: "Failed to set the 'body' property on 'Document': The provided value" });
      }
      this[impl]["body"] = V;
    }
  
    get head() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["head"]);
    }
  
    get images() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "images", () => {
        return utils.tryWrapperForImpl(this[impl]["images"]);
      });
    }
  
    get embeds() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "embeds", () => {
        return utils.tryWrapperForImpl(this[impl]["embeds"]);
      });
    }
  
    get plugins() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "plugins", () => {
        return utils.tryWrapperForImpl(this[impl]["plugins"]);
      });
    }
  
    get links() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "links", () => {
        return utils.tryWrapperForImpl(this[impl]["links"]);
      });
    }
  
    get forms() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "forms", () => {
        return utils.tryWrapperForImpl(this[impl]["forms"]);
      });
    }
  
    get scripts() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "scripts", () => {
        return utils.tryWrapperForImpl(this[impl]["scripts"]);
      });
    }
  
    get currentScript() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["currentScript"]);
    }
  
    get defaultView() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["defaultView"]);
    }
  
    get activeElement() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["activeElement"]);
    }
  
    get onreadystatechange() {
      return utils.tryWrapperForImpl(this[impl]["onreadystatechange"]);
    }
  
    set onreadystatechange(V) {
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onreadystatechange"] = V;
    }
  
    get anchors() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "anchors", () => {
        return utils.tryWrapperForImpl(this[impl]["anchors"]);
      });
    }
  
    get applets() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "applets", () => {
        return utils.tryWrapperForImpl(this[impl]["applets"]);
      });
    }
  
    get styleSheets() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "styleSheets", () => {
        return utils.tryWrapperForImpl(this[impl]["styleSheets"]);
      });
    }
  
    get hidden() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["hidden"];
    }
  
    get visibilityState() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["visibilityState"]);
    }
  
    get onvisibilitychange() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onvisibilitychange"]);
    }
  
    set onvisibilitychange(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onvisibilitychange"] = V;
    }
  
    get onabort() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onabort"]);
    }
  
    set onabort(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onabort"] = V;
    }
  
    get onauxclick() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onauxclick"]);
    }
  
    set onauxclick(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onauxclick"] = V;
    }
  
    get onblur() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onblur"]);
    }
  
    set onblur(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onblur"] = V;
    }
  
    get oncancel() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["oncancel"]);
    }
  
    set oncancel(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["oncancel"] = V;
    }
  
    get oncanplay() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["oncanplay"]);
    }
  
    set oncanplay(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["oncanplay"] = V;
    }
  
    get oncanplaythrough() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["oncanplaythrough"]);
    }
  
    set oncanplaythrough(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["oncanplaythrough"] = V;
    }
  
    get onchange() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onchange"]);
    }
  
    set onchange(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onchange"] = V;
    }
  
    get onclick() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onclick"]);
    }
  
    set onclick(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onclick"] = V;
    }
  
    get onclose() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onclose"]);
    }
  
    set onclose(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onclose"] = V;
    }
  
    get oncontextmenu() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["oncontextmenu"]);
    }
  
    set oncontextmenu(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["oncontextmenu"] = V;
    }
  
    get oncuechange() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["oncuechange"]);
    }
  
    set oncuechange(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["oncuechange"] = V;
    }
  
    get ondblclick() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondblclick"]);
    }
  
    set ondblclick(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondblclick"] = V;
    }
  
    get ondrag() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondrag"]);
    }
  
    set ondrag(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondrag"] = V;
    }
  
    get ondragend() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondragend"]);
    }
  
    set ondragend(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondragend"] = V;
    }
  
    get ondragenter() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondragenter"]);
    }
  
    set ondragenter(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondragenter"] = V;
    }
  
    get ondragexit() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondragexit"]);
    }
  
    set ondragexit(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondragexit"] = V;
    }
  
    get ondragleave() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondragleave"]);
    }
  
    set ondragleave(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondragleave"] = V;
    }
  
    get ondragover() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondragover"]);
    }
  
    set ondragover(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondragover"] = V;
    }
  
    get ondragstart() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondragstart"]);
    }
  
    set ondragstart(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondragstart"] = V;
    }
  
    get ondrop() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondrop"]);
    }
  
    set ondrop(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondrop"] = V;
    }
  
    get ondurationchange() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ondurationchange"]);
    }
  
    set ondurationchange(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ondurationchange"] = V;
    }
  
    get onemptied() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onemptied"]);
    }
  
    set onemptied(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onemptied"] = V;
    }
  
    get onended() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onended"]);
    }
  
    set onended(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onended"] = V;
    }
  
    get onerror() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onerror"]);
    }
  
    set onerror(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onerror"] = V;
    }
  
    get onfocus() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onfocus"]);
    }
  
    set onfocus(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onfocus"] = V;
    }
  
    get oninput() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["oninput"]);
    }
  
    set oninput(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["oninput"] = V;
    }
  
    get oninvalid() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["oninvalid"]);
    }
  
    set oninvalid(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["oninvalid"] = V;
    }
  
    get onkeydown() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onkeydown"]);
    }
  
    set onkeydown(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onkeydown"] = V;
    }
  
    get onkeypress() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onkeypress"]);
    }
  
    set onkeypress(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onkeypress"] = V;
    }
  
    get onkeyup() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onkeyup"]);
    }
  
    set onkeyup(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onkeyup"] = V;
    }
  
    get onload() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onload"]);
    }
  
    set onload(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onload"] = V;
    }
  
    get onloadeddata() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onloadeddata"]);
    }
  
    set onloadeddata(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onloadeddata"] = V;
    }
  
    get onloadedmetadata() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onloadedmetadata"]);
    }
  
    set onloadedmetadata(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onloadedmetadata"] = V;
    }
  
    get onloadend() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onloadend"]);
    }
  
    set onloadend(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onloadend"] = V;
    }
  
    get onloadstart() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onloadstart"]);
    }
  
    set onloadstart(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onloadstart"] = V;
    }
  
    get onmousedown() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onmousedown"]);
    }
  
    set onmousedown(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onmousedown"] = V;
    }
  
    get onmouseenter() {
      return utils.tryWrapperForImpl(this[impl]["onmouseenter"]);
    }
  
    set onmouseenter(V) {
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onmouseenter"] = V;
    }
  
    get onmouseleave() {
      return utils.tryWrapperForImpl(this[impl]["onmouseleave"]);
    }
  
    set onmouseleave(V) {
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onmouseleave"] = V;
    }
  
    get onmousemove() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onmousemove"]);
    }
  
    set onmousemove(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onmousemove"] = V;
    }
  
    get onmouseout() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onmouseout"]);
    }
  
    set onmouseout(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onmouseout"] = V;
    }
  
    get onmouseover() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onmouseover"]);
    }
  
    set onmouseover(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onmouseover"] = V;
    }
  
    get onmouseup() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onmouseup"]);
    }
  
    set onmouseup(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onmouseup"] = V;
    }
  
    get onwheel() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onwheel"]);
    }
  
    set onwheel(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onwheel"] = V;
    }
  
    get onpause() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onpause"]);
    }
  
    set onpause(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onpause"] = V;
    }
  
    get onplay() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onplay"]);
    }
  
    set onplay(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onplay"] = V;
    }
  
    get onplaying() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onplaying"]);
    }
  
    set onplaying(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onplaying"] = V;
    }
  
    get onprogress() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onprogress"]);
    }
  
    set onprogress(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onprogress"] = V;
    }
  
    get onratechange() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onratechange"]);
    }
  
    set onratechange(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onratechange"] = V;
    }
  
    get onreset() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onreset"]);
    }
  
    set onreset(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onreset"] = V;
    }
  
    get onresize() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onresize"]);
    }
  
    set onresize(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onresize"] = V;
    }
  
    get onscroll() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onscroll"]);
    }
  
    set onscroll(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onscroll"] = V;
    }
  
    get onsecuritypolicyviolation() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onsecuritypolicyviolation"]);
    }
  
    set onsecuritypolicyviolation(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onsecuritypolicyviolation"] = V;
    }
  
    get onseeked() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onseeked"]);
    }
  
    set onseeked(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onseeked"] = V;
    }
  
    get onseeking() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onseeking"]);
    }
  
    set onseeking(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onseeking"] = V;
    }
  
    get onselect() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onselect"]);
    }
  
    set onselect(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onselect"] = V;
    }
  
    get onstalled() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onstalled"]);
    }
  
    set onstalled(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onstalled"] = V;
    }
  
    get onsubmit() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onsubmit"]);
    }
  
    set onsubmit(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onsubmit"] = V;
    }
  
    get onsuspend() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onsuspend"]);
    }
  
    set onsuspend(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onsuspend"] = V;
    }
  
    get ontimeupdate() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ontimeupdate"]);
    }
  
    set ontimeupdate(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ontimeupdate"] = V;
    }
  
    get ontoggle() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["ontoggle"]);
    }
  
    set ontoggle(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["ontoggle"] = V;
    }
  
    get onvolumechange() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onvolumechange"]);
    }
  
    set onvolumechange(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onvolumechange"] = V;
    }
  
    get onwaiting() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["onwaiting"]);
    }
  
    set onwaiting(V) {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      V = utils.tryImplForWrapper(V);
  
      this[impl]["onwaiting"] = V;
    }
  
    get children() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.getSameObject(this, "children", () => {
        return utils.tryWrapperForImpl(this[impl]["children"]);
      });
    }
  
    get firstElementChild() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["firstElementChild"]);
    }
  
    get lastElementChild() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return utils.tryWrapperForImpl(this[impl]["lastElementChild"]);
    }
  
    get childElementCount() {
      if (!this || !module.exports.is(this)) {
        throw new TypeError("Illegal invocation");
      }
  
      return this[impl]["childElementCount"];
    }
  }
  Object.defineProperties(Document.prototype, {
    getElementsByTagName: { enumerable: true },
    getElementsByTagNameNS: { enumerable: true },
    getElementsByClassName: { enumerable: true },
    createElement: { enumerable: true },
    createElementNS: { enumerable: true },
    createDocumentFragment: { enumerable: true },
    createTextNode: { enumerable: true },
    createCDATASection: { enumerable: true },
    createComment: { enumerable: true },
    createProcessingInstruction: { enumerable: true },
    importNode: { enumerable: true },
    adoptNode: { enumerable: true },
    createAttribute: { enumerable: true },
    createAttributeNS: { enumerable: true },
    createEvent: { enumerable: true },
    createNodeIterator: { enumerable: true },
    createTreeWalker: { enumerable: true },
    getElementsByName: { enumerable: true },
    open: { enumerable: true },
    close: { enumerable: true },
    write: { enumerable: true },
    writeln: { enumerable: true },
    hasFocus: { enumerable: true },
    clear: { enumerable: true },
    captureEvents: { enumerable: true },
    releaseEvents: { enumerable: true },
    getElementById: { enumerable: true },
    prepend: { enumerable: true },
    append: { enumerable: true },
    querySelector: { enumerable: true },
    querySelectorAll: { enumerable: true },
    implementation: { enumerable: true },
    URL: { enumerable: true },
    documentURI: { enumerable: true },
    origin: { enumerable: true },
    compatMode: { enumerable: true },
    characterSet: { enumerable: true },
    charset: { enumerable: true },
    inputEncoding: { enumerable: true },
    contentType: { enumerable: true },
    doctype: { enumerable: true },
    documentElement: { enumerable: true },
    referrer: { enumerable: true },
    cookie: { enumerable: true },
    lastModified: { enumerable: true },
    readyState: { enumerable: true },
    title: { enumerable: true },
    dir: { enumerable: true },
    body: { enumerable: true },
    head: { enumerable: true },
    images: { enumerable: true },
    embeds: { enumerable: true },
    plugins: { enumerable: true },
    links: { enumerable: true },
    forms: { enumerable: true },
    scripts: { enumerable: true },
    currentScript: { enumerable: true },
    defaultView: { enumerable: true },
    activeElement: { enumerable: true },
    onreadystatechange: { enumerable: true },
    anchors: { enumerable: true },
    applets: { enumerable: true },
    styleSheets: { enumerable: true },
    hidden: { enumerable: true },
    visibilityState: { enumerable: true },
    onvisibilitychange: { enumerable: true },
    onabort: { enumerable: true },
    onauxclick: { enumerable: true },
    onblur: { enumerable: true },
    oncancel: { enumerable: true },
    oncanplay: { enumerable: true },
    oncanplaythrough: { enumerable: true },
    onchange: { enumerable: true },
    onclick: { enumerable: true },
    onclose: { enumerable: true },
    oncontextmenu: { enumerable: true },
    oncuechange: { enumerable: true },
    ondblclick: { enumerable: true },
    ondrag: { enumerable: true },
    ondragend: { enumerable: true },
    ondragenter: { enumerable: true },
    ondragexit: { enumerable: true },
    ondragleave: { enumerable: true },
    ondragover: { enumerable: true },
    ondragstart: { enumerable: true },
    ondrop: { enumerable: true },
    ondurationchange: { enumerable: true },
    onemptied: { enumerable: true },
    onended: { enumerable: true },
    onerror: { enumerable: true },
    onfocus: { enumerable: true },
    oninput: { enumerable: true },
    oninvalid: { enumerable: true },
    onkeydown: { enumerable: true },
    onkeypress: { enumerable: true },
    onkeyup: { enumerable: true },
    onload: { enumerable: true },
    onloadeddata: { enumerable: true },
    onloadedmetadata: { enumerable: true },
    onloadend: { enumerable: true },
    onloadstart: { enumerable: true },
    onmousedown: { enumerable: true },
    onmouseenter: { enumerable: true },
    onmouseleave: { enumerable: true },
    onmousemove: { enumerable: true },
    onmouseout: { enumerable: true },
    onmouseover: { enumerable: true },
    onmouseup: { enumerable: true },
    onwheel: { enumerable: true },
    onpause: { enumerable: true },
    onplay: { enumerable: true },
    onplaying: { enumerable: true },
    onprogress: { enumerable: true },
    onratechange: { enumerable: true },
    onreset: { enumerable: true },
    onresize: { enumerable: true },
    onscroll: { enumerable: true },
    onsecuritypolicyviolation: { enumerable: true },
    onseeked: { enumerable: true },
    onseeking: { enumerable: true },
    onselect: { enumerable: true },
    onstalled: { enumerable: true },
    onsubmit: { enumerable: true },
    onsuspend: { enumerable: true },
    ontimeupdate: { enumerable: true },
    ontoggle: { enumerable: true },
    onvolumechange: { enumerable: true },
    onwaiting: { enumerable: true },
    children: { enumerable: true },
    firstElementChild: { enumerable: true },
    lastElementChild: { enumerable: true },
    childElementCount: { enumerable: true },
    [Symbol.toStringTag]: { value: "Document", configurable: true }
  });
  const iface = {
    // When an interface-module that implements this interface as a mixin is loaded, it will append its own `.is()`
    // method into this array. It allows objects that directly implements *those* interfaces to be recognized as
    // implementing this mixin interface.
    _mixedIntoPredicates: [],
    is(obj) {
      if (obj) {
        if (utils.hasOwn(obj, impl) && obj[impl] instanceof Impl.implementation) {
          return true;
        }
        for (const isMixedInto of module.exports._mixedIntoPredicates) {
          if (isMixedInto(obj)) {
            return true;
          }
        }
      }
      return false;
    },
    isImpl(obj) {
      if (obj) {
        if (obj instanceof Impl.implementation) {
          return true;
        }
  
        const wrapper = utils.wrapperForImpl(obj);
        for (const isMixedInto of module.exports._mixedIntoPredicates) {
          if (isMixedInto(wrapper)) {
            return true;
          }
        }
      }
      return false;
    },
    convert(obj, { context = "The provided value" } = {}) {
      if (module.exports.is(obj)) {
        return utils.implForWrapper(obj);
      }
      throw new TypeError(`${context} is not of type 'Document'.`);
    },
  
    create(constructorArgs, privateData) {
      let obj = Object.create(Document.prototype);
      obj = this.setup(obj, constructorArgs, privateData);
      return obj;
    },
    createImpl(constructorArgs, privateData) {
      let obj = Object.create(Document.prototype);
      obj = this.setup(obj, constructorArgs, privateData);
      return utils.implForWrapper(obj);
    },
    _internalSetup(obj) {
      Node._internalSetup(obj);
  
      Object.defineProperties(
        obj,
        utils.getOwnPropertyDescriptors({
          get location() {
            if (!this || !module.exports.is(this)) {
              throw new TypeError("Illegal invocation");
            }
  
            return utils.tryWrapperForImpl(obj[impl]["location"]);
          },
          set location(V) {
            if (!this || !module.exports.is(this)) {
              throw new TypeError("Illegal invocation");
            }
  
            this.location.href = V;
          }
        })
      );
  
      Object.defineProperties(obj, { location: { configurable: false } });
    },
    setup(obj, constructorArgs, privateData) {
      if (!privateData) privateData = {};
  
      privateData.wrapper = obj;
  
      this._internalSetup(obj);
      Object.defineProperty(obj, impl, {
        value: new Impl.implementation(constructorArgs, privateData),
        configurable: true
      });
  
      obj[impl][utils.wrapperSymbol] = obj;
      if (Impl.init) {
        Impl.init(obj[impl], privateData);
      }
      return obj;
    },
    interface: Document,
    expose: {
      Window: { Document }
    }
  }; // iface
  module.exports = iface;
  
  GlobalEventHandlers._mixedIntoPredicates.push(module.exports.is);
  
  NonElementParentNode._mixedIntoPredicates.push(module.exports.is);
  
  ParentNode._mixedIntoPredicates.push(module.exports.is);
  
  const Impl = require("../nodes/Document-impl.js");
  