  constructor({asset, message, onClick}: Params, element: HTMLElement) {
    super(message);
    this.asset = asset;
    this.message = message;
    this.isVisible = ko.observable(false);
    this.onClick = (_data, event) => onClick(message, event);

    this.dummyImageUrl = `data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'
      viewBox='0 0 1 1' width='${asset.width}' height='${asset.height}'></svg>`;

    this.imageUrl = ko.observable();

    this.isIdle = () => this.uploadProgress() === -1 && !this.asset.resource() && !this.message.isObfuscated();

    ko.computed(
      () => {
        if (this.isVisible() && asset.resource()) {
          this.assetRepository
            .load(asset.resource())
            .then(blob => {
              this.imageUrl(window.URL.createObjectURL(blob));
            })
            .catch(error => console.error(error));
        }
      },
      {disposeWhenNodeIsRemoved: element},
    );

    this.container = element;
    viewportObserver.onElementInViewport(this.container, () => this.isVisible(true));
  }
The software does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.