From c6118e5531ad3211018940317072878dc7c1d2b8 Mon Sep 17 00:00:00 2001
From: Steffen Deusch <steffen@deusch.me>
Date: Fri, 10 Jan 2025 18:06:09 +0100
Subject: [PATCH] proprly clear viewHooks when destroying a hook

Relates to: #3496
Fixes: #3623

In #3496, I cleared the hookId on the element in destroyed,
but the view's destroyHook function actually relied on the hookId to
clean up the view's viewHooks object. This would cause hooks' destroy
function to be called multiple times, as the view was not able to remove
old hooks.
---
 assets/js/phoenix_live_view/view.js      | 5 ++++-
 priv/static/phoenix_live_view.cjs.js     | 3 ++-
 priv/static/phoenix_live_view.cjs.js.map | 4 ++--
 priv/static/phoenix_live_view.esm.js     | 3 ++-
 priv/static/phoenix_live_view.esm.js.map | 4 ++--
 priv/static/phoenix_live_view.js         | 3 ++-
 priv/static/phoenix_live_view.min.js     | 2 +-
 7 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/assets/js/phoenix_live_view/view.js b/assets/js/phoenix_live_view/view.js
index 6b9fe4ce7..5514471ab 100644
--- a/assets/js/phoenix_live_view/view.js
+++ b/assets/js/phoenix_live_view/view.js
@@ -725,9 +725,12 @@ export default class View {
   }
 
   destroyHook(hook){
+    // __destroyed clears the elementID from the hook, therefore
+    // we need to get it before calling __destroyed
+    const hookId = ViewHook.elementID(hook.el)
     hook.__destroyed()
     hook.__cleanup__()
-    delete this.viewHooks[ViewHook.elementID(hook.el)]
+    delete this.viewHooks[hookId]
   }
 
   applyPendingUpdates(){
diff --git a/priv/static/phoenix_live_view.cjs.js b/priv/static/phoenix_live_view.cjs.js
index 6e2052416..eddacfb10 100644
--- a/priv/static/phoenix_live_view.cjs.js
+++ b/priv/static/phoenix_live_view.cjs.js
@@ -3919,9 +3919,10 @@ var View = class _View {
     }
   }
   destroyHook(hook) {
+    const hookId = ViewHook.elementID(hook.el);
     hook.__destroyed();
     hook.__cleanup__();
-    delete this.viewHooks[ViewHook.elementID(hook.el)];
+    delete this.viewHooks[hookId];
   }
   applyPendingUpdates() {
     this.pendingDiffs.forEach(({ diff, events }) => this.update(diff, events));
diff --git a/priv/static/phoenix_live_view.cjs.js.map b/priv/static/phoenix_live_view.cjs.js.map
index 8c04ee8b0..5cc4582f9 100644
--- a/priv/static/phoenix_live_view.cjs.js.map
+++ b/priv/static/phoenix_live_view.cjs.js.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["../../assets/js/phoenix_live_view/index.js", "../../assets/js/phoenix_live_view/constants.js", "../../assets/js/phoenix_live_view/entry_uploader.js", "../../assets/js/phoenix_live_view/utils.js", "../../assets/js/phoenix_live_view/browser.js", "../../assets/js/phoenix_live_view/dom.js", "../../assets/js/phoenix_live_view/upload_entry.js", "../../assets/js/phoenix_live_view/live_uploader.js", "../../assets/js/phoenix_live_view/aria.js", "../../assets/js/phoenix_live_view/hooks.js", "../../assets/js/phoenix_live_view/element_ref.js", "../../assets/js/phoenix_live_view/dom_post_morph_restorer.js", "../../assets/node_modules/morphdom/dist/morphdom-esm.js", "../../assets/js/phoenix_live_view/dom_patch.js", "../../assets/js/phoenix_live_view/rendered.js", "../../assets/js/phoenix_live_view/js.js", "../../assets/js/phoenix_live_view/view_hook.js", "../../assets/js/phoenix_live_view/view.js", "../../assets/js/phoenix_live_view/live_socket.js"],
-  "sourcesContent": ["/*\n================================================================================\nPhoenix LiveView JavaScript Client\n================================================================================\n\nSee the hexdocs at `https://hexdocs.pm/phoenix_live_view` for documentation.\n\n*/\n\nimport LiveSocket, {isUsedInput} from \"./live_socket\"\nimport DOM from \"./dom\"\nimport ViewHook from \"./view_hook\"\nimport View from \"./view\"\n\n/** Creates a ViewHook instance for the given element and callbacks.\n *\n * @param {HTMLElement} el - The element to associate with the hook.\n * @param {Object} [callbacks] - The list of hook callbacks, such as mounted,\n *   updated, destroyed, etc.\n *\n * @example\n *\n * class MyComponent extends HTMLElement {\n *   connectedCallback(){\n *     let onLiveViewMounted = () => this.hook.pushEvent(...))\n *     this.hook = createHook(this, {mounted: onLiveViewMounted})\n *   }\n * }\n *\n * *Note*: `createHook` must be called from the `connectedCallback` lifecycle\n * which is triggered after the element has been added to the DOM. If you try\n * to call `createHook` from the constructor, an error will be logged.\n *\n * @returns {ViewHook} Returns the ViewHook instance for the custom element.\n */\nlet createHook = (el, callbacks = {}) => {\n  let existingHook = DOM.getCustomElHook(el)\n  if(existingHook){ return existingHook }\n\n  let hook = new ViewHook(View.closestView(el), el, callbacks)\n  DOM.putCustomElHook(el, hook)\n  return hook\n}\n\nexport {\n  LiveSocket,\n  isUsedInput,\n  createHook\n}\n", "export const CONSECUTIVE_RELOADS = \"consecutive-reloads\"\nexport const MAX_RELOADS = 10\nexport const RELOAD_JITTER_MIN = 5000\nexport const RELOAD_JITTER_MAX = 10000\nexport const FAILSAFE_JITTER = 30000\nexport const PHX_EVENT_CLASSES = [\n  \"phx-click-loading\", \"phx-change-loading\", \"phx-submit-loading\",\n  \"phx-keydown-loading\", \"phx-keyup-loading\", \"phx-blur-loading\", \"phx-focus-loading\",\n  \"phx-hook-loading\"\n]\nexport const PHX_COMPONENT = \"data-phx-component\"\nexport const PHX_LIVE_LINK = \"data-phx-link\"\nexport const PHX_TRACK_STATIC = \"track-static\"\nexport const PHX_LINK_STATE = \"data-phx-link-state\"\nexport const PHX_REF_LOADING = \"data-phx-ref-loading\"\nexport const PHX_REF_SRC = \"data-phx-ref-src\"\nexport const PHX_REF_LOCK = \"data-phx-ref-lock\"\nexport const PHX_TRACK_UPLOADS = \"track-uploads\"\nexport const PHX_UPLOAD_REF = \"data-phx-upload-ref\"\nexport const PHX_PREFLIGHTED_REFS = \"data-phx-preflighted-refs\"\nexport const PHX_DONE_REFS = \"data-phx-done-refs\"\nexport const PHX_DROP_TARGET = \"drop-target\"\nexport const PHX_ACTIVE_ENTRY_REFS = \"data-phx-active-refs\"\nexport const PHX_LIVE_FILE_UPDATED = \"phx:live-file:updated\"\nexport const PHX_SKIP = \"data-phx-skip\"\nexport const PHX_MAGIC_ID = \"data-phx-id\"\nexport const PHX_PRUNE = \"data-phx-prune\"\nexport const PHX_CONNECTED_CLASS = \"phx-connected\"\nexport const PHX_LOADING_CLASS = \"phx-loading\"\nexport const PHX_ERROR_CLASS = \"phx-error\"\nexport const PHX_CLIENT_ERROR_CLASS = \"phx-client-error\"\nexport const PHX_SERVER_ERROR_CLASS = \"phx-server-error\"\nexport const PHX_PARENT_ID = \"data-phx-parent-id\"\nexport const PHX_MAIN = \"data-phx-main\"\nexport const PHX_ROOT_ID = \"data-phx-root-id\"\nexport const PHX_VIEWPORT_TOP = \"viewport-top\"\nexport const PHX_VIEWPORT_BOTTOM = \"viewport-bottom\"\nexport const PHX_TRIGGER_ACTION = \"trigger-action\"\nexport const PHX_HAS_FOCUSED = \"phx-has-focused\"\nexport const FOCUSABLE_INPUTS = [\"text\", \"textarea\", \"number\", \"email\", \"password\", \"search\", \"tel\", \"url\", \"date\", \"time\", \"datetime-local\", \"color\", \"range\"]\nexport const CHECKABLE_INPUTS = [\"checkbox\", \"radio\"]\nexport const PHX_HAS_SUBMITTED = \"phx-has-submitted\"\nexport const PHX_SESSION = \"data-phx-session\"\nexport const PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`\nexport const PHX_STICKY = \"data-phx-sticky\"\nexport const PHX_STATIC = \"data-phx-static\"\nexport const PHX_READONLY = \"data-phx-readonly\"\nexport const PHX_DISABLED = \"data-phx-disabled\"\nexport const PHX_DISABLE_WITH = \"disable-with\"\nexport const PHX_DISABLE_WITH_RESTORE = \"data-phx-disable-with-restore\"\nexport const PHX_HOOK = \"hook\"\nexport const PHX_DEBOUNCE = \"debounce\"\nexport const PHX_THROTTLE = \"throttle\"\nexport const PHX_UPDATE = \"update\"\nexport const PHX_STREAM = \"stream\"\nexport const PHX_STREAM_REF = \"data-phx-stream\"\nexport const PHX_KEY = \"key\"\nexport const PHX_PRIVATE = \"phxPrivate\"\nexport const PHX_AUTO_RECOVER = \"auto-recover\"\nexport const PHX_LV_DEBUG = \"phx:live-socket:debug\"\nexport const PHX_LV_PROFILE = \"phx:live-socket:profiling\"\nexport const PHX_LV_LATENCY_SIM = \"phx:live-socket:latency-sim\"\nexport const PHX_LV_HISTORY_POSITION = \"phx:nav-history-position\"\nexport const PHX_PROGRESS = \"progress\"\nexport const PHX_MOUNTED = \"mounted\"\nexport const PHX_RELOAD_STATUS = \"__phoenix_reload_status__\"\nexport const LOADER_TIMEOUT = 1\nexport const MAX_CHILD_JOIN_ATTEMPTS = 3\nexport const BEFORE_UNLOAD_LOADER_TIMEOUT = 200\nexport const BINDING_PREFIX = \"phx-\"\nexport const PUSH_TIMEOUT = 30000\nexport const LINK_HEADER = \"x-requested-with\"\nexport const RESPONSE_URL_HEADER = \"x-response-url\"\nexport const DEBOUNCE_TRIGGER = \"debounce-trigger\"\nexport const THROTTLED = \"throttled\"\nexport const DEBOUNCE_PREV_KEY = \"debounce-prev-key\"\nexport const DEFAULTS = {\n  debounce: 300,\n  throttle: 300\n}\nexport const PHX_PENDING_ATTRS = [PHX_REF_LOADING, PHX_REF_SRC, PHX_REF_LOCK]\n// Rendered\nexport const DYNAMICS = \"d\"\nexport const STATIC = \"s\"\nexport const ROOT = \"r\"\nexport const COMPONENTS = \"c\"\nexport const EVENTS = \"e\"\nexport const REPLY = \"r\"\nexport const TITLE = \"t\"\nexport const TEMPLATES = \"p\"\nexport const STREAM = \"stream\"\n", "import {\n  logError\n} from \"./utils\"\n\nexport default class EntryUploader {\n  constructor(entry, config, liveSocket){\n    let {chunk_size, chunk_timeout} = config\n    this.liveSocket = liveSocket\n    this.entry = entry\n    this.offset = 0\n    this.chunkSize = chunk_size\n    this.chunkTimeout = chunk_timeout\n    this.chunkTimer = null\n    this.errored = false\n    this.uploadChannel = liveSocket.channel(`lvu:${entry.ref}`, {token: entry.metadata()})\n  }\n\n  error(reason){\n    if(this.errored){ return }\n    this.uploadChannel.leave()\n    this.errored = true\n    clearTimeout(this.chunkTimer)\n    this.entry.error(reason)\n  }\n\n  upload(){\n    this.uploadChannel.onError(reason => this.error(reason))\n    this.uploadChannel.join()\n      .receive(\"ok\", _data => this.readNextChunk())\n      .receive(\"error\", reason => this.error(reason))\n  }\n\n  isDone(){ return this.offset >= this.entry.file.size }\n\n  readNextChunk(){\n    let reader = new window.FileReader()\n    let blob = this.entry.file.slice(this.offset, this.chunkSize + this.offset)\n    reader.onload = (e) => {\n      if(e.target.error === null){\n        this.offset += e.target.result.byteLength\n        this.pushChunk(e.target.result)\n      } else {\n        return logError(\"Read error: \" + e.target.error)\n      }\n    }\n    reader.readAsArrayBuffer(blob)\n  }\n\n  pushChunk(chunk){\n    if(!this.uploadChannel.isJoined()){ return }\n    this.uploadChannel.push(\"chunk\", chunk, this.chunkTimeout)\n      .receive(\"ok\", () => {\n        this.entry.progress((this.offset / this.entry.file.size) * 100)\n        if(!this.isDone()){\n          this.chunkTimer = setTimeout(() => this.readNextChunk(), this.liveSocket.getLatencySim() || 0)\n        }\n      })\n      .receive(\"error\", ({reason}) => this.error(reason))\n  }\n}\n", "import {\n  PHX_VIEW_SELECTOR\n} from \"./constants\"\n\nimport EntryUploader from \"./entry_uploader\"\n\nexport let logError = (msg, obj) => console.error && console.error(msg, obj)\n\nexport let isCid = (cid) => {\n  let type = typeof(cid)\n  return type === \"number\" || (type === \"string\" && /^(0|[1-9]\\d*)$/.test(cid))\n}\n\nexport function detectDuplicateIds(){\n  let ids = new Set()\n  let elems = document.querySelectorAll(\"*[id]\")\n  for(let i = 0, len = elems.length; i < len; i++){\n    if(ids.has(elems[i].id)){\n      console.error(`Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`)\n    } else {\n      ids.add(elems[i].id)\n    }\n  }\n}\n\nexport let debug = (view, kind, msg, obj) => {\n  if(view.liveSocket.isDebugEnabled()){\n    console.log(`${view.id} ${kind}: ${msg} - `, obj)\n  }\n}\n\n// wraps value in closure or returns closure\nexport let closure = (val) => typeof val === \"function\" ? val : function (){ return val }\n\nexport let clone = (obj) => { return JSON.parse(JSON.stringify(obj)) }\n\nexport let closestPhxBinding = (el, binding, borderEl) => {\n  do {\n    if(el.matches(`[${binding}]`) && !el.disabled){ return el }\n    el = el.parentElement || el.parentNode\n  } while(el !== null && el.nodeType === 1 && !((borderEl && borderEl.isSameNode(el)) || el.matches(PHX_VIEW_SELECTOR)))\n  return null\n}\n\nexport let isObject = (obj) => {\n  return obj !== null && typeof obj === \"object\" && !(obj instanceof Array)\n}\n\nexport let isEqualObj = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2)\n\nexport let isEmpty = (obj) => {\n  for(let x in obj){ return false }\n  return true\n}\n\nexport let maybe = (el, callback) => el && callback(el)\n\nexport let channelUploader = function (entries, onError, resp, liveSocket){\n  entries.forEach(entry => {\n    let entryUploader = new EntryUploader(entry, resp.config, liveSocket)\n    entryUploader.upload()\n  })\n}\n", "let Browser = {\n  canPushState(){ return (typeof (history.pushState) !== \"undefined\") },\n\n  dropLocal(localStorage, namespace, subkey){\n    return localStorage.removeItem(this.localKey(namespace, subkey))\n  },\n\n  updateLocal(localStorage, namespace, subkey, initial, func){\n    let current = this.getLocal(localStorage, namespace, subkey)\n    let key = this.localKey(namespace, subkey)\n    let newVal = current === null ? initial : func(current)\n    localStorage.setItem(key, JSON.stringify(newVal))\n    return newVal\n  },\n\n  getLocal(localStorage, namespace, subkey){\n    return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey)))\n  },\n\n  updateCurrentState(callback){\n    if(!this.canPushState()){ return }\n    history.replaceState(callback(history.state || {}), \"\", window.location.href)\n  },\n\n  pushState(kind, meta, to){\n    if(this.canPushState()){\n      if(to !== window.location.href){\n        if(meta.type == \"redirect\" && meta.scroll){\n          // If we're redirecting store the current scrollY for the current history state.\n          let currentState = history.state || {}\n          currentState.scroll = meta.scroll\n          history.replaceState(currentState, \"\", window.location.href)\n        }\n\n        delete meta.scroll // Only store the scroll in the redirect case.\n        history[kind + \"State\"](meta, \"\", to || null) // IE will coerce undefined to string\n\n        // when using navigate, we'd call pushState immediately before patching the DOM,\n        // jumping back to the top of the page, effectively ignoring the scrollIntoView;\n        // therefore we wait for the next frame (after the DOM patch) and only then try\n        // to scroll to the hashEl\n        window.requestAnimationFrame(() => {\n          let hashEl = this.getHashTargetEl(window.location.hash)\n  \n          if(hashEl){\n            hashEl.scrollIntoView()\n          } else if(meta.type === \"redirect\"){\n            window.scroll(0, 0)\n          }\n        })\n      }\n    } else {\n      this.redirect(to)\n    }\n  },\n\n  setCookie(name, value, maxAgeSeconds){\n    let expires = typeof(maxAgeSeconds) === \"number\" ? ` max-age=${maxAgeSeconds};` : \"\"\n    document.cookie = `${name}=${value};${expires} path=/`\n  },\n\n  getCookie(name){\n    return document.cookie.replace(new RegExp(`(?:(?:^|.*;\\s*)${name}\\s*\\=\\s*([^;]*).*$)|^.*$`), \"$1\")\n  },\n\n  deleteCookie(name){\n    document.cookie = `${name}=; max-age=-1; path=/`\n  },\n\n  redirect(toURL, flash){\n    if(flash){ this.setCookie(\"__phoenix_flash__\", flash, 60) }\n    window.location = toURL\n  },\n\n  localKey(namespace, subkey){ return `${namespace}-${subkey}` },\n\n  getHashTargetEl(maybeHash){\n    let hash = maybeHash.toString().substring(1)\n    if(hash === \"\"){ return }\n    return document.getElementById(hash) || document.querySelector(`a[name=\"${hash}\"]`)\n  }\n}\n\nexport default Browser\n", "import {\n  CHECKABLE_INPUTS,\n  DEBOUNCE_PREV_KEY,\n  DEBOUNCE_TRIGGER,\n  FOCUSABLE_INPUTS,\n  PHX_COMPONENT,\n  PHX_HAS_FOCUSED,\n  PHX_HAS_SUBMITTED,\n  PHX_MAIN,\n  PHX_PARENT_ID,\n  PHX_PRIVATE,\n  PHX_REF_SRC,\n  PHX_PENDING_ATTRS,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_STATIC,\n  PHX_UPLOAD_REF,\n  PHX_VIEW_SELECTOR,\n  PHX_STICKY,\n  PHX_EVENT_CLASSES,\n  THROTTLED,\n} from \"./constants\"\n\nimport {\n  logError\n} from \"./utils\"\n\nlet DOM = {\n  byId(id){ return document.getElementById(id) || logError(`no id found for ${id}`) },\n\n  removeClass(el, className){\n    el.classList.remove(className)\n    if(el.classList.length === 0){ el.removeAttribute(\"class\") }\n  },\n\n  all(node, query, callback){\n    if(!node){ return [] }\n    let array = Array.from(node.querySelectorAll(query))\n    return callback ? array.forEach(callback) : array\n  },\n\n  childNodeLength(html){\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    return template.content.childElementCount\n  },\n\n  isUploadInput(el){ return el.type === \"file\" && el.getAttribute(PHX_UPLOAD_REF) !== null },\n\n  isAutoUpload(inputEl){ return inputEl.hasAttribute(\"data-phx-auto-upload\") },\n\n  findUploadInputs(node){\n    const formId = node.id\n    const inputsOutsideForm = this.all(document, `input[type=\"file\"][${PHX_UPLOAD_REF}][form=\"${formId}\"]`)\n    return this.all(node, `input[type=\"file\"][${PHX_UPLOAD_REF}]`).concat(inputsOutsideForm)\n  },\n\n  findComponentNodeList(node, cid){\n    return this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}=\"${cid}\"]`), node)\n  },\n\n  isPhxDestroyed(node){\n    return node.id && DOM.private(node, \"destroyed\") ? true : false\n  },\n\n  wantsNewTab(e){\n    let wantsNewTab = e.ctrlKey || e.shiftKey || e.metaKey || (e.button && e.button === 1)\n    let isDownload = (e.target instanceof HTMLAnchorElement && e.target.hasAttribute(\"download\"))\n    let isTargetBlank = e.target.hasAttribute(\"target\") && e.target.getAttribute(\"target\").toLowerCase() === \"_blank\"\n    let isTargetNamedTab = e.target.hasAttribute(\"target\") && !e.target.getAttribute(\"target\").startsWith(\"_\")\n    return wantsNewTab || isTargetBlank || isDownload || isTargetNamedTab\n  },\n\n  isUnloadableFormSubmit(e){\n    // Ignore form submissions intended to close a native <dialog> element\n    // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog#usage_notes\n    let isDialogSubmit = (e.target && e.target.getAttribute(\"method\") === \"dialog\") ||\n      (e.submitter && e.submitter.getAttribute(\"formmethod\") === \"dialog\")\n\n    if(isDialogSubmit){\n      return false\n    } else {\n      return !e.defaultPrevented && !this.wantsNewTab(e)\n    }\n  },\n\n  isNewPageClick(e, currentLocation){\n    let href = e.target instanceof HTMLAnchorElement ? e.target.getAttribute(\"href\") : null\n    let url\n\n    if(e.defaultPrevented || href === null || this.wantsNewTab(e)){ return false }\n    if(href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")){ return false }\n    if(e.target.isContentEditable){ return false }\n\n    try {\n      url = new URL(href)\n    } catch {\n      try {\n        url = new URL(href, currentLocation)\n      } catch {\n        // bad URL, fallback to let browser try it as external\n        return true\n      }\n    }\n\n    if(url.host === currentLocation.host && url.protocol === currentLocation.protocol){\n      if(url.pathname === currentLocation.pathname && url.search === currentLocation.search){\n        return url.hash === \"\" && !url.href.endsWith(\"#\")\n      }\n    }\n    return url.protocol.startsWith(\"http\")\n  },\n\n  markPhxChildDestroyed(el){\n    if(this.isPhxChild(el)){ el.setAttribute(PHX_SESSION, \"\") }\n    this.putPrivate(el, \"destroyed\", true)\n  },\n\n  findPhxChildrenInFragment(html, parentId){\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    return this.findPhxChildren(template.content, parentId)\n  },\n\n  isIgnored(el, phxUpdate){\n    return (el.getAttribute(phxUpdate) || el.getAttribute(\"data-phx-update\")) === \"ignore\"\n  },\n\n  isPhxUpdate(el, phxUpdate, updateTypes){\n    return el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0\n  },\n\n  findPhxSticky(el){ return this.all(el, `[${PHX_STICKY}]`) },\n\n  findPhxChildren(el, parentId){\n    return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}=\"${parentId}\"]`)\n  },\n\n  findExistingParentCIDs(node, cids){\n    // we only want to find parents that exist on the page\n    // if a cid is not on the page, the only way it can be added back to the page\n    // is if a parent adds it back, therefore if a cid does not exist on the page,\n    // we should not try to render it by itself (because it would be rendered twice,\n    // one by the parent, and a second time by itself)\n    let parentCids = new Set()\n    let childrenCids = new Set()\n\n    cids.forEach(cid => {\n      this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}=\"${cid}\"]`), node).forEach(parent => {\n        parentCids.add(cid)\n        this.all(parent, `[${PHX_COMPONENT}]`)\n          .map(el => parseInt(el.getAttribute(PHX_COMPONENT)))\n          .forEach(childCID => childrenCids.add(childCID))\n      })\n    })\n\n    childrenCids.forEach(childCid => parentCids.delete(childCid))\n\n    return parentCids\n  },\n\n  filterWithinSameLiveView(nodes, parent){\n    if(parent.querySelector(PHX_VIEW_SELECTOR)){\n      return nodes.filter(el => this.withinSameLiveView(el, parent))\n    } else {\n      return nodes\n    }\n  },\n\n  withinSameLiveView(node, parent){\n    while(node = node.parentNode){\n      if(node.isSameNode(parent)){ return true }\n      if(node.getAttribute(PHX_SESSION) !== null){ return false }\n    }\n  },\n\n  private(el, key){ return el[PHX_PRIVATE] && el[PHX_PRIVATE][key] },\n\n  deletePrivate(el, key){ el[PHX_PRIVATE] && delete (el[PHX_PRIVATE][key]) },\n\n  putPrivate(el, key, value){\n    if(!el[PHX_PRIVATE]){ el[PHX_PRIVATE] = {} }\n    el[PHX_PRIVATE][key] = value\n  },\n\n  updatePrivate(el, key, defaultVal, updateFunc){\n    let existing = this.private(el, key)\n    if(existing === undefined){\n      this.putPrivate(el, key, updateFunc(defaultVal))\n    } else {\n      this.putPrivate(el, key, updateFunc(existing))\n    }\n  },\n\n  syncPendingAttrs(fromEl, toEl){\n    if(!fromEl.hasAttribute(PHX_REF_SRC)){ return }\n    PHX_EVENT_CLASSES.forEach(className => {\n      fromEl.classList.contains(className) && toEl.classList.add(className)\n    })\n    PHX_PENDING_ATTRS.filter(attr => fromEl.hasAttribute(attr)).forEach(attr => {\n      toEl.setAttribute(attr, fromEl.getAttribute(attr))\n    })\n  },\n\n  copyPrivates(target, source){\n    if(source[PHX_PRIVATE]){\n      target[PHX_PRIVATE] = source[PHX_PRIVATE]\n    }\n  },\n\n  putTitle(str){\n    let titleEl = document.querySelector(\"title\")\n    if(titleEl){\n      let {prefix, suffix, default: defaultTitle} = titleEl.dataset\n      let isEmpty = typeof(str) !== \"string\" || str.trim() === \"\"\n      if(isEmpty && typeof(defaultTitle) !== \"string\"){ return }\n\n      let inner = isEmpty ? defaultTitle : str\n      document.title = `${prefix || \"\"}${inner || \"\"}${suffix || \"\"}`\n    } else {\n      document.title = str\n    }\n  },\n\n  debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, callback){\n    let debounce = el.getAttribute(phxDebounce)\n    let throttle = el.getAttribute(phxThrottle)\n\n    if(debounce === \"\"){ debounce = defaultDebounce }\n    if(throttle === \"\"){ throttle = defaultThrottle }\n    let value = debounce || throttle\n    switch(value){\n      case null: return callback()\n\n      case \"blur\":\n        if(this.once(el, \"debounce-blur\")){\n          el.addEventListener(\"blur\", () => {\n            if(asyncFilter()){ callback() }\n          })\n        }\n        return\n\n      default:\n        let timeout = parseInt(value)\n        let trigger = () => throttle ? this.deletePrivate(el, THROTTLED) : callback()\n        let currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger)\n        if(isNaN(timeout)){ return logError(`invalid throttle/debounce value: ${value}`) }\n        if(throttle){\n          let newKeyDown = false\n          if(event.type === \"keydown\"){\n            let prevKey = this.private(el, DEBOUNCE_PREV_KEY)\n            this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key)\n            newKeyDown = prevKey !== event.key\n          }\n\n          if(!newKeyDown && this.private(el, THROTTLED)){\n            return false\n          } else {\n            callback()\n            const t = setTimeout(() => {\n              if(asyncFilter()){ this.triggerCycle(el, DEBOUNCE_TRIGGER) }\n            }, timeout)\n            this.putPrivate(el, THROTTLED, t)\n          }\n        } else {\n          setTimeout(() => {\n            if(asyncFilter()){ this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle) }\n          }, timeout)\n        }\n\n        let form = el.form\n        if(form && this.once(form, \"bind-debounce\")){\n          form.addEventListener(\"submit\", () => {\n            Array.from((new FormData(form)).entries(), ([name]) => {\n              let input = form.querySelector(`[name=\"${name}\"]`)\n              this.incCycle(input, DEBOUNCE_TRIGGER)\n              this.deletePrivate(input, THROTTLED)\n            })\n          })\n        }\n        if(this.once(el, \"bind-debounce\")){\n          el.addEventListener(\"blur\", () => {\n            // because we trigger the callback here,\n            // we also clear the throttle timeout to prevent the callback\n            // from being called again after the timeout fires\n            clearTimeout(this.private(el, THROTTLED))\n            this.triggerCycle(el, DEBOUNCE_TRIGGER)\n          })\n        }\n    }\n  },\n\n  triggerCycle(el, key, currentCycle){\n    let [cycle, trigger] = this.private(el, key)\n    if(!currentCycle){ currentCycle = cycle }\n    if(currentCycle === cycle){\n      this.incCycle(el, key)\n      trigger()\n    }\n  },\n\n  once(el, key){\n    if(this.private(el, key) === true){ return false }\n    this.putPrivate(el, key, true)\n    return true\n  },\n\n  incCycle(el, key, trigger = function (){ }){\n    let [currentCycle] = this.private(el, key) || [0, trigger]\n    currentCycle++\n    this.putPrivate(el, key, [currentCycle, trigger])\n    return currentCycle\n  },\n\n  // maintains or adds privately used hook information\n  // fromEl and toEl can be the same element in the case of a newly added node\n  // fromEl and toEl can be any HTML node type, so we need to check if it's an element node\n  maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom){\n    // maintain the hooks created with createHook\n    if(fromEl.hasAttribute && fromEl.hasAttribute(\"data-phx-hook\") && !toEl.hasAttribute(\"data-phx-hook\")){\n      toEl.setAttribute(\"data-phx-hook\", fromEl.getAttribute(\"data-phx-hook\"))\n    }\n    // add hooks to elements with viewport attributes\n    if(toEl.hasAttribute && (toEl.hasAttribute(phxViewportTop) || toEl.hasAttribute(phxViewportBottom))){\n      toEl.setAttribute(\"data-phx-hook\", \"Phoenix.InfiniteScroll\")\n    }\n  },\n\n  putCustomElHook(el, hook){\n    if(el.isConnected){\n      el.setAttribute(\"data-phx-hook\", \"\")\n    } else {\n      console.error(`\n        hook attached to non-connected DOM element\n        ensure you are calling createHook within your connectedCallback. ${el.outerHTML}\n      `)\n    }\n    this.putPrivate(el, \"custom-el-hook\", hook)\n  },\n\n  getCustomElHook(el){ return this.private(el, \"custom-el-hook\") },\n\n  isUsedInput(el){\n    return (el.nodeType === Node.ELEMENT_NODE &&\n      (this.private(el, PHX_HAS_FOCUSED) || this.private(el, PHX_HAS_SUBMITTED)))\n  },\n\n  resetForm(form){\n    Array.from(form.elements).forEach(input => {\n      this.deletePrivate(input, PHX_HAS_FOCUSED)\n      this.deletePrivate(input, PHX_HAS_SUBMITTED)\n    })\n  },\n\n  isPhxChild(node){\n    return node.getAttribute && node.getAttribute(PHX_PARENT_ID)\n  },\n\n  isPhxSticky(node){\n    return node.getAttribute && node.getAttribute(PHX_STICKY) !== null\n  },\n\n  isChildOfAny(el, parents){\n    return !!parents.find(parent => parent.contains(el))\n  },\n\n  firstPhxChild(el){\n    return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0]\n  },\n\n  dispatchEvent(target, name, opts = {}){\n    let defaultBubble = true\n    let isUploadTarget = target.nodeName === \"INPUT\" && target.type === \"file\"\n    if(isUploadTarget && name === \"click\"){\n      defaultBubble = false\n    }\n    let bubbles = opts.bubbles === undefined ? defaultBubble : !!opts.bubbles\n    let eventOpts = {bubbles: bubbles, cancelable: true, detail: opts.detail || {}}\n    let event = name === \"click\" ? new MouseEvent(\"click\", eventOpts) : new CustomEvent(name, eventOpts)\n    target.dispatchEvent(event)\n  },\n\n  cloneNode(node, html){\n    if(typeof (html) === \"undefined\"){\n      return node.cloneNode(true)\n    } else {\n      let cloned = node.cloneNode(false)\n      cloned.innerHTML = html\n      return cloned\n    }\n  },\n\n  // merge attributes from source to target\n  // if an element is ignored, we only merge data attributes\n  // including removing data attributes that are no longer in the source\n  mergeAttrs(target, source, opts = {}){\n    let exclude = new Set(opts.exclude || [])\n    let isIgnored = opts.isIgnored\n    let sourceAttrs = source.attributes\n    for(let i = sourceAttrs.length - 1; i >= 0; i--){\n      let name = sourceAttrs[i].name\n      if(!exclude.has(name)){\n        const sourceValue = source.getAttribute(name)\n        if(target.getAttribute(name) !== sourceValue && (!isIgnored || (isIgnored && name.startsWith(\"data-\")))){\n          target.setAttribute(name, sourceValue)\n        }\n      } else {\n        // We exclude the value from being merged on focused inputs, because the\n        // user's input should always win.\n        // We can still assign it as long as the value property is the same, though.\n        // This prevents a situation where the updated hook is not being triggered\n        // when an input is back in its \"original state\", because the attribute\n        // was never changed, see:\n        // https://github.com/phoenixframework/phoenix_live_view/issues/2163\n        if(name === \"value\" && target.value === source.value){\n          // actually set the value attribute to sync it with the value property\n          target.setAttribute(\"value\", source.getAttribute(name))\n        }\n      }\n    }\n\n    let targetAttrs = target.attributes\n    for(let i = targetAttrs.length - 1; i >= 0; i--){\n      let name = targetAttrs[i].name\n      if(isIgnored){\n        if(name.startsWith(\"data-\") && !source.hasAttribute(name) && !PHX_PENDING_ATTRS.includes(name)){ target.removeAttribute(name) }\n      } else {\n        if(!source.hasAttribute(name)){ target.removeAttribute(name) }\n      }\n    }\n  },\n\n  mergeFocusedInput(target, source){\n    // skip selects because FF will reset highlighted index for any setAttribute\n    if(!(target instanceof HTMLSelectElement)){ DOM.mergeAttrs(target, source, {exclude: [\"value\"]}) }\n\n    if(source.readOnly){\n      target.setAttribute(\"readonly\", true)\n    } else {\n      target.removeAttribute(\"readonly\")\n    }\n  },\n\n  hasSelectionRange(el){\n    return el.setSelectionRange && (el.type === \"text\" || el.type === \"textarea\")\n  },\n\n  restoreFocus(focused, selectionStart, selectionEnd){\n    if(focused instanceof HTMLSelectElement){ focused.focus() }\n    if(!DOM.isTextualInput(focused)){ return }\n\n    let wasFocused = focused.matches(\":focus\")\n    if(!wasFocused){ focused.focus() }\n    if(this.hasSelectionRange(focused)){\n      focused.setSelectionRange(selectionStart, selectionEnd)\n    }\n  },\n\n  isFormInput(el){ return /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== \"button\" },\n\n  syncAttrsToProps(el){\n    if(el instanceof HTMLInputElement && CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0){\n      el.checked = el.getAttribute(\"checked\") !== null\n    }\n  },\n\n  isTextualInput(el){ return FOCUSABLE_INPUTS.indexOf(el.type) >= 0 },\n\n  isNowTriggerFormExternal(el, phxTriggerExternal){\n    return el.getAttribute && el.getAttribute(phxTriggerExternal) !== null && document.body.contains(el)\n  },\n\n  cleanChildNodes(container, phxUpdate){\n    if(DOM.isPhxUpdate(container, phxUpdate, [\"append\", \"prepend\"])){\n      let toRemove = []\n      container.childNodes.forEach(childNode => {\n        if(!childNode.id){\n          // Skip warning if it's an empty text node (e.g. a new-line)\n          let isEmptyTextNode = childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue.trim() === \"\"\n          if(!isEmptyTextNode && childNode.nodeType !== Node.COMMENT_NODE){\n            logError(\"only HTML element tags with an id are allowed inside containers with phx-update.\\n\\n\" +\n              `removing illegal node: \"${(childNode.outerHTML || childNode.nodeValue).trim()}\"\\n\\n`)\n          }\n          toRemove.push(childNode)\n        }\n      })\n      toRemove.forEach(childNode => childNode.remove())\n    }\n  },\n\n  replaceRootContainer(container, tagName, attrs){\n    let retainedAttrs = new Set([\"id\", PHX_SESSION, PHX_STATIC, PHX_MAIN, PHX_ROOT_ID])\n    if(container.tagName.toLowerCase() === tagName.toLowerCase()){\n      Array.from(container.attributes)\n        .filter(attr => !retainedAttrs.has(attr.name.toLowerCase()))\n        .forEach(attr => container.removeAttribute(attr.name))\n\n      Object.keys(attrs)\n        .filter(name => !retainedAttrs.has(name.toLowerCase()))\n        .forEach(attr => container.setAttribute(attr, attrs[attr]))\n\n      return container\n\n    } else {\n      let newContainer = document.createElement(tagName)\n      Object.keys(attrs).forEach(attr => newContainer.setAttribute(attr, attrs[attr]))\n      retainedAttrs.forEach(attr => newContainer.setAttribute(attr, container.getAttribute(attr)))\n      newContainer.innerHTML = container.innerHTML\n      container.replaceWith(newContainer)\n      return newContainer\n    }\n  },\n\n  getSticky(el, name, defaultVal){\n    let op = (DOM.private(el, \"sticky\") || []).find(([existingName,]) => name === existingName)\n    if(op){\n      let [_name, _op, stashedResult] = op\n      return stashedResult\n    } else {\n      return typeof(defaultVal) === \"function\" ? defaultVal() : defaultVal\n    }\n  },\n\n  deleteSticky(el, name){\n    this.updatePrivate(el, \"sticky\", [], ops => {\n      return ops.filter(([existingName, _]) => existingName !== name)\n    })\n  },\n\n  putSticky(el, name, op){\n    let stashedResult = op(el)\n    this.updatePrivate(el, \"sticky\", [], ops => {\n      let existingIndex = ops.findIndex(([existingName,]) => name === existingName)\n      if(existingIndex >= 0){\n        ops[existingIndex] = [name, op, stashedResult]\n      } else {\n        ops.push([name, op, stashedResult])\n      }\n      return ops\n    })\n  },\n\n  applyStickyOperations(el){\n    let ops = DOM.private(el, \"sticky\")\n    if(!ops){ return }\n\n    ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op))\n  }\n}\n\nexport default DOM\n", "import {\n  PHX_ACTIVE_ENTRY_REFS,\n  PHX_LIVE_FILE_UPDATED,\n  PHX_PREFLIGHTED_REFS\n} from \"./constants\"\n\nimport {\n  channelUploader,\n  logError\n} from \"./utils\"\n\nimport LiveUploader from \"./live_uploader\"\n\nexport default class UploadEntry {\n  static isActive(fileEl, file){\n    let isNew = file._phxRef === undefined\n    let activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\")\n    let isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0\n    return file.size > 0 && (isNew || isActive)\n  }\n\n  static isPreflighted(fileEl, file){\n    let preflightedRefs = fileEl.getAttribute(PHX_PREFLIGHTED_REFS).split(\",\")\n    let isPreflighted = preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0\n    return isPreflighted && this.isActive(fileEl, file)\n  }\n\n  static isPreflightInProgress(file){\n    return file._preflightInProgress === true\n  }\n\n  static markPreflightInProgress(file){\n    file._preflightInProgress = true\n  }\n\n  constructor(fileEl, file, view, autoUpload){\n    this.ref = LiveUploader.genFileRef(file)\n    this.fileEl = fileEl\n    this.file = file\n    this.view = view\n    this.meta = null\n    this._isCancelled = false\n    this._isDone = false\n    this._progress = 0\n    this._lastProgressSent = -1\n    this._onDone = function(){ }\n    this._onElUpdated = this.onElUpdated.bind(this)\n    this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n    this.autoUpload = autoUpload\n  }\n\n  metadata(){ return this.meta }\n\n  progress(progress){\n    this._progress = Math.floor(progress)\n    if(this._progress > this._lastProgressSent){\n      if(this._progress >= 100){\n        this._progress = 100\n        this._lastProgressSent = 100\n        this._isDone = true\n        this.view.pushFileProgress(this.fileEl, this.ref, 100, () => {\n          LiveUploader.untrackFile(this.fileEl, this.file)\n          this._onDone()\n        })\n      } else {\n        this._lastProgressSent = this._progress\n        this.view.pushFileProgress(this.fileEl, this.ref, this._progress)\n      }\n    }\n  }\n\n  isCancelled(){ return this._isCancelled }\n\n  cancel(){\n    this.file._preflightInProgress = false\n    this._isCancelled = true\n    this._isDone = true\n    this._onDone()\n  }\n\n  isDone(){ return this._isDone }\n\n  error(reason = \"failed\"){\n    this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n    this.view.pushFileProgress(this.fileEl, this.ref, {error: reason})\n    if(!this.isAutoUpload()){ LiveUploader.clearFiles(this.fileEl) }\n  }\n\n  isAutoUpload(){ return this.autoUpload }\n\n  //private\n\n  onDone(callback){\n    this._onDone = () => {\n      this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n      callback()\n    }\n  }\n\n  onElUpdated(){\n    let activeRefs = this.fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\")\n    if(activeRefs.indexOf(this.ref) === -1){\n      LiveUploader.untrackFile(this.fileEl, this.file)\n      this.cancel()\n    }\n  }\n\n  toPreflightPayload(){\n    return {\n      last_modified: this.file.lastModified,\n      name: this.file.name,\n      relative_path: this.file.webkitRelativePath,\n      size: this.file.size,\n      type: this.file.type,\n      ref: this.ref,\n      meta: typeof(this.file.meta) === \"function\" ? this.file.meta() : undefined\n    }\n  }\n\n  uploader(uploaders){\n    if(this.meta.uploader){\n      let callback = uploaders[this.meta.uploader] || logError(`no uploader configured for ${this.meta.uploader}`)\n      return {name: this.meta.uploader, callback: callback}\n    } else {\n      return {name: \"channel\", callback: channelUploader}\n    }\n  }\n\n  zipPostFlight(resp){\n    this.meta = resp.entries[this.ref]\n    if(!this.meta){ logError(`no preflight upload response returned with ref ${this.ref}`, {input: this.fileEl, response: resp}) }\n  }\n}\n", "import {\n  PHX_DONE_REFS,\n  PHX_PREFLIGHTED_REFS,\n  PHX_UPLOAD_REF\n} from \"./constants\"\n\nimport {\n} from \"./utils\"\n\nimport DOM from \"./dom\"\nimport UploadEntry from \"./upload_entry\"\n\nlet liveUploaderFileRef = 0\n\nexport default class LiveUploader {\n  static genFileRef(file){\n    let ref = file._phxRef\n    if(ref !== undefined){\n      return ref\n    } else {\n      file._phxRef = (liveUploaderFileRef++).toString()\n      return file._phxRef\n    }\n  }\n\n  static getEntryDataURL(inputEl, ref, callback){\n    let file = this.activeFiles(inputEl).find(file => this.genFileRef(file) === ref)\n    callback(URL.createObjectURL(file))\n  }\n\n  static hasUploadsInProgress(formEl){\n    let active = 0\n    DOM.findUploadInputs(formEl).forEach(input => {\n      if(input.getAttribute(PHX_PREFLIGHTED_REFS) !== input.getAttribute(PHX_DONE_REFS)){\n        active++\n      }\n    })\n    return active > 0\n  }\n\n  static serializeUploads(inputEl){\n    let files = this.activeFiles(inputEl)\n    let fileData = {}\n    files.forEach(file => {\n      let entry = {path: inputEl.name}\n      let uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF)\n      fileData[uploadRef] = fileData[uploadRef] || []\n      entry.ref = this.genFileRef(file)\n      entry.last_modified = file.lastModified\n      entry.name = file.name || entry.ref\n      entry.relative_path = file.webkitRelativePath\n      entry.type = file.type\n      entry.size = file.size\n      if(typeof(file.meta) === \"function\"){ entry.meta = file.meta() }\n      fileData[uploadRef].push(entry)\n    })\n    return fileData\n  }\n\n  static clearFiles(inputEl){\n    inputEl.value = null\n    inputEl.removeAttribute(PHX_UPLOAD_REF)\n    DOM.putPrivate(inputEl, \"files\", [])\n  }\n\n  static untrackFile(inputEl, file){\n    DOM.putPrivate(inputEl, \"files\", DOM.private(inputEl, \"files\").filter(f => !Object.is(f, file)))\n  }\n\n  static trackFiles(inputEl, files, dataTransfer){\n    if(inputEl.getAttribute(\"multiple\") !== null){\n      let newFiles = files.filter(file => !this.activeFiles(inputEl).find(f => Object.is(f, file)))\n      DOM.updatePrivate(inputEl, \"files\", [], (existing) => existing.concat(newFiles))\n      inputEl.value = null\n    } else {\n      // Reset inputEl files to align output with programmatic changes (i.e. drag and drop)\n      if(dataTransfer && dataTransfer.files.length > 0){ inputEl.files = dataTransfer.files }\n      DOM.putPrivate(inputEl, \"files\", files)\n    }\n  }\n\n  static activeFileInputs(formEl){\n    let fileInputs = DOM.findUploadInputs(formEl)\n    return Array.from(fileInputs).filter(el => el.files && this.activeFiles(el).length > 0)\n  }\n\n  static activeFiles(input){\n    return (DOM.private(input, \"files\") || []).filter(f => UploadEntry.isActive(input, f))\n  }\n\n  static inputsAwaitingPreflight(formEl){\n    let fileInputs = DOM.findUploadInputs(formEl)\n    return Array.from(fileInputs).filter(input => this.filesAwaitingPreflight(input).length > 0)\n  }\n\n  static filesAwaitingPreflight(input){\n    return this.activeFiles(input).filter(f => !UploadEntry.isPreflighted(input, f) && !UploadEntry.isPreflightInProgress(f))\n  }\n\n  static markPreflightInProgress(entries){\n    entries.forEach(entry => UploadEntry.markPreflightInProgress(entry.file))\n  }\n\n  constructor(inputEl, view, onComplete){\n    this.autoUpload = DOM.isAutoUpload(inputEl)\n    this.view = view\n    this.onComplete = onComplete\n    this._entries =\n      Array.from(LiveUploader.filesAwaitingPreflight(inputEl) || [])\n        .map(file => new UploadEntry(inputEl, file, view, this.autoUpload))\n\n    // prevent sending duplicate preflight requests\n    LiveUploader.markPreflightInProgress(this._entries)\n\n    this.numEntriesInProgress = this._entries.length\n  }\n\n  isAutoUpload(){ return this.autoUpload }\n\n  entries(){ return this._entries }\n\n  initAdapterUpload(resp, onError, liveSocket){\n    this._entries =\n      this._entries.map(entry => {\n        if(entry.isCancelled()){\n          this.numEntriesInProgress--\n          if(this.numEntriesInProgress === 0){ this.onComplete() }\n        } else {\n          entry.zipPostFlight(resp)\n          entry.onDone(() => {\n            this.numEntriesInProgress--\n            if(this.numEntriesInProgress === 0){ this.onComplete() }\n          })\n        }\n        return entry\n      })\n\n    let groupedEntries = this._entries.reduce((acc, entry) => {\n      if(!entry.meta){ return acc }\n      let {name, callback} = entry.uploader(liveSocket.uploaders)\n      acc[name] = acc[name] || {callback: callback, entries: []}\n      acc[name].entries.push(entry)\n      return acc\n    }, {})\n\n    for(let name in groupedEntries){\n      let {callback, entries} = groupedEntries[name]\n      callback(entries, onError, resp, liveSocket)\n    }\n  }\n}\n", "let ARIA = {\n  anyOf(instance, classes){ return classes.find(name => instance instanceof name) },\n\n  isFocusable(el, interactiveOnly){\n    return (\n      (el instanceof HTMLAnchorElement && el.rel !== \"ignore\") ||\n      (el instanceof HTMLAreaElement && el.href !== undefined) ||\n      (!el.disabled && (this.anyOf(el, [HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, HTMLButtonElement]))) ||\n      (el instanceof HTMLIFrameElement) ||\n      (el.tabIndex > 0 || (!interactiveOnly && el.getAttribute(\"tabindex\") !== null && el.getAttribute(\"aria-hidden\") !== \"true\"))\n    )\n  },\n\n  attemptFocus(el, interactiveOnly){\n    if(this.isFocusable(el, interactiveOnly)){ try { el.focus() } catch {} }\n    return !!document.activeElement && document.activeElement.isSameNode(el)\n  },\n\n  focusFirstInteractive(el){\n    let child = el.firstElementChild\n    while(child){\n      if(this.attemptFocus(child, true) || this.focusFirstInteractive(child, true)){\n        return true\n      }\n      child = child.nextElementSibling\n    }\n  },\n\n  focusFirst(el){\n    let child = el.firstElementChild\n    while(child){\n      if(this.attemptFocus(child) || this.focusFirst(child)){\n        return true\n      }\n      child = child.nextElementSibling\n    }\n  },\n\n  focusLast(el){\n    let child = el.lastElementChild\n    while(child){\n      if(this.attemptFocus(child) || this.focusLast(child)){\n        return true\n      }\n      child = child.previousElementSibling\n    }\n  }\n}\nexport default ARIA\n", "import {\n  PHX_ACTIVE_ENTRY_REFS,\n  PHX_LIVE_FILE_UPDATED,\n  PHX_PREFLIGHTED_REFS,\n  PHX_UPLOAD_REF\n} from \"./constants\"\n\nimport LiveUploader from \"./live_uploader\"\nimport ARIA from \"./aria\"\n\nlet Hooks = {\n  LiveFileUpload: {\n    activeRefs(){ return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS) },\n\n    preflightedRefs(){ return this.el.getAttribute(PHX_PREFLIGHTED_REFS) },\n\n    mounted(){ this.preflightedWas = this.preflightedRefs() },\n\n    updated(){\n      let newPreflights = this.preflightedRefs()\n      if(this.preflightedWas !== newPreflights){\n        this.preflightedWas = newPreflights\n        if(newPreflights === \"\"){\n          this.__view().cancelSubmit(this.el.form)\n        }\n      }\n\n      if(this.activeRefs() === \"\"){ this.el.value = null }\n      this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED))\n    }\n  },\n\n  LiveImgPreview: {\n    mounted(){\n      this.ref = this.el.getAttribute(\"data-phx-entry-ref\")\n      this.inputEl = document.getElementById(this.el.getAttribute(PHX_UPLOAD_REF))\n      LiveUploader.getEntryDataURL(this.inputEl, this.ref, url => {\n        this.url = url\n        this.el.src = url\n      })\n    },\n    destroyed(){\n      URL.revokeObjectURL(this.url)\n    }\n  },\n  FocusWrap: {\n    mounted(){\n      this.focusStart = this.el.firstElementChild\n      this.focusEnd = this.el.lastElementChild\n      this.focusStart.addEventListener(\"focus\", () => ARIA.focusLast(this.el))\n      this.focusEnd.addEventListener(\"focus\", () => ARIA.focusFirst(this.el))\n      this.el.addEventListener(\"phx:show-end\", () => this.el.focus())\n      if(window.getComputedStyle(this.el).display !== \"none\"){\n        ARIA.focusFirst(this.el)\n      }\n    }\n  }\n}\n\nlet findScrollContainer = (el) => {\n  // the scroll event won't be fired on the html/body element even if overflow is set\n  // therefore we return null to instead listen for scroll events on document\n  if([\"HTML\", \"BODY\"].indexOf(el.nodeName.toUpperCase()) >= 0) return null\n  if([\"scroll\", \"auto\"].indexOf(getComputedStyle(el).overflowY) >= 0) return el\n  return findScrollContainer(el.parentElement)\n}\n\nlet scrollTop = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.scrollTop\n  } else {\n    return document.documentElement.scrollTop || document.body.scrollTop\n  }\n}\n\nlet bottom = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.getBoundingClientRect().bottom\n  } else {\n    // when we have no container, the whole page scrolls,\n    // therefore the bottom coordinate is the viewport height\n    return window.innerHeight || document.documentElement.clientHeight\n  }\n}\n\nlet top = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.getBoundingClientRect().top\n  } else {\n    // when we have no container the whole page scrolls,\n    // therefore the top coordinate is 0\n    return 0\n  }\n}\n\nlet isAtViewportTop = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer)\n}\n\nlet isAtViewportBottom = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.bottom) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.bottom) <= bottom(scrollContainer)\n}\n\nlet isWithinViewport = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer)\n}\n\nHooks.InfiniteScroll = {\n  mounted(){\n    this.scrollContainer = findScrollContainer(this.el)\n    let scrollBefore = scrollTop(this.scrollContainer)\n    let topOverran = false\n    let throttleInterval = 500\n    let pendingOp = null\n\n    let onTopOverrun = this.throttle(throttleInterval, (topEvent, firstChild) => {\n      pendingOp = () => true\n      this.liveSocket.execJSHookPush(this.el, topEvent, {id: firstChild.id, _overran: true}, () => {\n        pendingOp = null\n      })\n    })\n\n    let onFirstChildAtTop = this.throttle(throttleInterval, (topEvent, firstChild) => {\n      pendingOp = () => firstChild.scrollIntoView({block: \"start\"})\n      this.liveSocket.execJSHookPush(this.el, topEvent, {id: firstChild.id}, () => {\n        pendingOp = null\n        // make sure that the DOM is patched by waiting for the next tick\n        window.requestAnimationFrame(() => {\n          if(!isWithinViewport(firstChild, this.scrollContainer)){\n            firstChild.scrollIntoView({block: \"start\"})\n          }\n        })\n      })\n    })\n\n    let onLastChildAtBottom = this.throttle(throttleInterval, (bottomEvent, lastChild) => {\n      pendingOp = () => lastChild.scrollIntoView({block: \"end\"})\n      this.liveSocket.execJSHookPush(this.el, bottomEvent, {id: lastChild.id}, () => {\n        pendingOp = null\n        // make sure that the DOM is patched by waiting for the next tick\n        window.requestAnimationFrame(() => {\n          if(!isWithinViewport(lastChild, this.scrollContainer)){\n            lastChild.scrollIntoView({block: \"end\"})\n          }\n        })\n      })\n    })\n\n    this.onScroll = (_e) => {\n      let scrollNow = scrollTop(this.scrollContainer)\n\n      if(pendingOp){\n        scrollBefore = scrollNow\n        return pendingOp()\n      }\n      let rect = this.el.getBoundingClientRect()\n      let topEvent = this.el.getAttribute(this.liveSocket.binding(\"viewport-top\"))\n      let bottomEvent = this.el.getAttribute(this.liveSocket.binding(\"viewport-bottom\"))\n      let lastChild = this.el.lastElementChild\n      let firstChild = this.el.firstElementChild\n      let isScrollingUp = scrollNow < scrollBefore\n      let isScrollingDown = scrollNow > scrollBefore\n\n      // el overran while scrolling up\n      if(isScrollingUp && topEvent && !topOverran && rect.top >= 0){\n        topOverran = true\n        onTopOverrun(topEvent, firstChild)\n      } else if(isScrollingDown && topOverran && rect.top <= 0){\n        topOverran = false\n      }\n\n      if(topEvent && isScrollingUp && isAtViewportTop(firstChild, this.scrollContainer)){\n        onFirstChildAtTop(topEvent, firstChild)\n      } else if(bottomEvent && isScrollingDown && isAtViewportBottom(lastChild, this.scrollContainer)){\n        onLastChildAtBottom(bottomEvent, lastChild)\n      }\n      scrollBefore = scrollNow\n    }\n\n    if(this.scrollContainer){\n      this.scrollContainer.addEventListener(\"scroll\", this.onScroll)\n    } else {\n      window.addEventListener(\"scroll\", this.onScroll)\n    }\n  },\n  \n  destroyed(){\n    if(this.scrollContainer){\n      this.scrollContainer.removeEventListener(\"scroll\", this.onScroll)\n    } else {\n      window.removeEventListener(\"scroll\", this.onScroll)\n    }\n  },\n\n  throttle(interval, callback){\n    let lastCallAt = 0\n    let timer\n\n    return (...args) => {\n      let now = Date.now()\n      let remainingTime = interval - (now - lastCallAt)\n\n      if(remainingTime <= 0 || remainingTime > interval){\n        if(timer){\n          clearTimeout(timer)\n          timer = null\n        }\n        lastCallAt = now\n        callback(...args)\n      } else if(!timer){\n        timer = setTimeout(() => {\n          lastCallAt = Date.now()\n          timer = null\n          callback(...args)\n        }, remainingTime)\n      }\n    }\n  }\n}\nexport default Hooks\n", "import {\n  PHX_REF_LOADING,\n  PHX_REF_LOCK,\n  PHX_REF_SRC,\n  PHX_EVENT_CLASSES,\n  PHX_DISABLED,\n  PHX_READONLY,\n  PHX_DISABLE_WITH_RESTORE\n} from \"./constants\"\n\nimport DOM from \"./dom\"\n\nexport default class ElementRef {\n  constructor(el){\n    this.el = el\n    this.loadingRef = el.hasAttribute(PHX_REF_LOADING) ? parseInt(el.getAttribute(PHX_REF_LOADING), 10) : null\n    this.lockRef = el.hasAttribute(PHX_REF_LOCK) ? parseInt(el.getAttribute(PHX_REF_LOCK), 10) : null\n  }\n\n  // public\n\n  maybeUndo(ref, phxEvent, eachCloneCallback){\n    if(!this.isWithin(ref)){ return }\n\n    // undo locks and apply clones\n    this.undoLocks(ref, phxEvent, eachCloneCallback)\n\n    // undo loading states\n    this.undoLoading(ref, phxEvent)\n\n    // clean up if fully resolved\n    if(this.isFullyResolvedBy(ref)){ this.el.removeAttribute(PHX_REF_SRC) }\n  }\n\n  // private\n\n  isWithin(ref){\n    return !((this.loadingRef !== null && this.loadingRef > ref) && (this.lockRef !== null && this.lockRef > ref))\n  }\n\n  // Check for cloned PHX_REF_LOCK element that has been morphed behind\n  // the scenes while this element was locked in the DOM.\n  // When we apply the cloned tree to the active DOM element, we must\n  //\n  //   1. execute pending mounted hooks for nodes now in the DOM\n  //   2. undo any ref inside the cloned tree that has since been ack'd\n  undoLocks(ref, phxEvent, eachCloneCallback){\n    if(!this.isLockUndoneBy(ref)){ return }\n\n    let clonedTree = DOM.private(this.el, PHX_REF_LOCK)\n    if(clonedTree){\n      eachCloneCallback(clonedTree)\n      DOM.deletePrivate(this.el, PHX_REF_LOCK)\n    }\n    this.el.removeAttribute(PHX_REF_LOCK)\n\n    let opts = {detail: {ref: ref, event: phxEvent}, bubbles: true, cancelable: false}\n    this.el.dispatchEvent(new CustomEvent(`phx:undo-lock:${this.lockRef}`, opts))\n  }\n\n  undoLoading(ref, phxEvent){\n    if(!this.isLoadingUndoneBy(ref)){\n      if(this.canUndoLoading(ref) && this.el.classList.contains(\"phx-submit-loading\")){\n        this.el.classList.remove(\"phx-change-loading\")\n      }\n      return\n    }\n\n    if(this.canUndoLoading(ref)){\n      this.el.removeAttribute(PHX_REF_LOADING)\n      let disabledVal = this.el.getAttribute(PHX_DISABLED)\n      let readOnlyVal = this.el.getAttribute(PHX_READONLY)\n      // restore inputs\n      if(readOnlyVal !== null){\n        this.el.readOnly = readOnlyVal === \"true\" ? true : false\n        this.el.removeAttribute(PHX_READONLY)\n      }\n      if(disabledVal !== null){\n        this.el.disabled = disabledVal === \"true\" ? true : false\n        this.el.removeAttribute(PHX_DISABLED)\n      }\n      // restore disables\n      let disableRestore = this.el.getAttribute(PHX_DISABLE_WITH_RESTORE)\n      if(disableRestore !== null){\n        this.el.innerText = disableRestore\n        this.el.removeAttribute(PHX_DISABLE_WITH_RESTORE)\n      }\n\n      let opts = {detail: {ref: ref, event: phxEvent}, bubbles: true, cancelable: false}\n      this.el.dispatchEvent(new CustomEvent(`phx:undo-loading:${this.loadingRef}`, opts))\n    }\n\n    // remove classes\n    PHX_EVENT_CLASSES.forEach(name => {\n      if(name !== \"phx-submit-loading\" || this.canUndoLoading(ref)){\n        DOM.removeClass(this.el, name)\n      }\n    })\n  }\n\n  isLoadingUndoneBy(ref){ return this.loadingRef === null ? false : this.loadingRef <= ref }\n  isLockUndoneBy(ref){ return this.lockRef === null ? false : this.lockRef <= ref }\n\n  isFullyResolvedBy(ref){\n    return (this.loadingRef === null || this.loadingRef <= ref) && (this.lockRef === null || this.lockRef <= ref)\n  }\n\n  // only remove the phx-submit-loading class if we are not locked\n  canUndoLoading(ref){ return this.lockRef === null || this.lockRef <= ref }\n}\n", "import {\n  maybe\n} from \"./utils\"\n\nimport DOM from \"./dom\"\n\nexport default class DOMPostMorphRestorer {\n  constructor(containerBefore, containerAfter, updateType){\n    let idsBefore = new Set()\n    let idsAfter = new Set([...containerAfter.children].map(child => child.id))\n\n    let elementsToModify = []\n\n    Array.from(containerBefore.children).forEach(child => {\n      if(child.id){ // all of our children should be elements with ids\n        idsBefore.add(child.id)\n        if(idsAfter.has(child.id)){\n          let previousElementId = child.previousElementSibling && child.previousElementSibling.id\n          elementsToModify.push({elementId: child.id, previousElementId: previousElementId})\n        }\n      }\n    })\n\n    this.containerId = containerAfter.id\n    this.updateType = updateType\n    this.elementsToModify = elementsToModify\n    this.elementIdsToAdd = [...idsAfter].filter(id => !idsBefore.has(id))\n  }\n\n  // We do the following to optimize append/prepend operations:\n  //   1) Track ids of modified elements & of new elements\n  //   2) All the modified elements are put back in the correct position in the DOM tree\n  //      by storing the id of their previous sibling\n  //   3) New elements are going to be put in the right place by morphdom during append.\n  //      For prepend, we move them to the first position in the container\n  perform(){\n    let container = DOM.byId(this.containerId)\n    this.elementsToModify.forEach(elementToModify => {\n      if(elementToModify.previousElementId){\n        maybe(document.getElementById(elementToModify.previousElementId), previousElem => {\n          maybe(document.getElementById(elementToModify.elementId), elem => {\n            let isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id\n            if(!isInRightPlace){\n              previousElem.insertAdjacentElement(\"afterend\", elem)\n            }\n          })\n        })\n      } else {\n        // This is the first element in the container\n        maybe(document.getElementById(elementToModify.elementId), elem => {\n          let isInRightPlace = elem.previousElementSibling == null\n          if(!isInRightPlace){\n            container.insertAdjacentElement(\"afterbegin\", elem)\n          }\n        })\n      }\n    })\n\n    if(this.updateType == \"prepend\"){\n      this.elementIdsToAdd.reverse().forEach(elemId => {\n        maybe(document.getElementById(elemId), elem => container.insertAdjacentElement(\"afterbegin\", elem))\n      })\n    }\n  }\n}\n", "var DOCUMENT_FRAGMENT_NODE = 11;\n\nfunction morphAttrs(fromNode, toNode) {\n    var toNodeAttrs = toNode.attributes;\n    var attr;\n    var attrName;\n    var attrNamespaceURI;\n    var attrValue;\n    var fromValue;\n\n    // document-fragments dont have attributes so lets not do anything\n    if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n      return;\n    }\n\n    // update attributes on original DOM element\n    for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n        attr = toNodeAttrs[i];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n        attrValue = attr.value;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n            fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n\n            if (fromValue !== attrValue) {\n                if (attr.prefix === 'xmlns'){\n                    attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix\n                }\n                fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n            }\n        } else {\n            fromValue = fromNode.getAttribute(attrName);\n\n            if (fromValue !== attrValue) {\n                fromNode.setAttribute(attrName, attrValue);\n            }\n        }\n    }\n\n    // Remove any extra attributes found on the original DOM element that\n    // weren't found on the target element.\n    var fromNodeAttrs = fromNode.attributes;\n\n    for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n        attr = fromNodeAttrs[d];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n\n            if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n                fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n            }\n        } else {\n            if (!toNode.hasAttribute(attrName)) {\n                fromNode.removeAttribute(attrName);\n            }\n        }\n    }\n}\n\nvar range; // Create a range object for efficently rendering strings to elements.\nvar NS_XHTML = 'http://www.w3.org/1999/xhtml';\n\nvar doc = typeof document === 'undefined' ? undefined : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();\n\nfunction createFragmentFromTemplate(str) {\n    var template = doc.createElement('template');\n    template.innerHTML = str;\n    return template.content.childNodes[0];\n}\n\nfunction createFragmentFromRange(str) {\n    if (!range) {\n        range = doc.createRange();\n        range.selectNode(doc.body);\n    }\n\n    var fragment = range.createContextualFragment(str);\n    return fragment.childNodes[0];\n}\n\nfunction createFragmentFromWrap(str) {\n    var fragment = doc.createElement('body');\n    fragment.innerHTML = str;\n    return fragment.childNodes[0];\n}\n\n/**\n * This is about the same\n * var html = new DOMParser().parseFromString(str, 'text/html');\n * return html.body.firstChild;\n *\n * @method toElement\n * @param {String} str\n */\nfunction toElement(str) {\n    str = str.trim();\n    if (HAS_TEMPLATE_SUPPORT) {\n      // avoid restrictions on content for things like `<tr><th>Hi</th></tr>` which\n      // createContextualFragment doesn't support\n      // <template> support not available in IE\n      return createFragmentFromTemplate(str);\n    } else if (HAS_RANGE_SUPPORT) {\n      return createFragmentFromRange(str);\n    }\n\n    return createFragmentFromWrap(str);\n}\n\n/**\n * Returns true if two node's names are the same.\n *\n * NOTE: We don't bother checking `namespaceURI` because you will never find two HTML elements with the same\n *       nodeName and different namespace URIs.\n *\n * @param {Element} a\n * @param {Element} b The target element\n * @return {boolean}\n */\nfunction compareNodeNames(fromEl, toEl) {\n    var fromNodeName = fromEl.nodeName;\n    var toNodeName = toEl.nodeName;\n    var fromCodeStart, toCodeStart;\n\n    if (fromNodeName === toNodeName) {\n        return true;\n    }\n\n    fromCodeStart = fromNodeName.charCodeAt(0);\n    toCodeStart = toNodeName.charCodeAt(0);\n\n    // If the target element is a virtual DOM node or SVG node then we may\n    // need to normalize the tag name before comparing. Normal HTML elements that are\n    // in the \"http://www.w3.org/1999/xhtml\"\n    // are converted to upper case\n    if (fromCodeStart <= 90 && toCodeStart >= 97) { // from is upper and to is lower\n        return fromNodeName === toNodeName.toUpperCase();\n    } else if (toCodeStart <= 90 && fromCodeStart >= 97) { // to is upper and from is lower\n        return toNodeName === fromNodeName.toUpperCase();\n    } else {\n        return false;\n    }\n}\n\n/**\n * Create an element, optionally with a known namespace URI.\n *\n * @param {string} name the element name, e.g. 'div' or 'svg'\n * @param {string} [namespaceURI] the element's namespace URI, i.e. the value of\n * its `xmlns` attribute or its inferred namespace.\n *\n * @return {Element}\n */\nfunction createElementNS(name, namespaceURI) {\n    return !namespaceURI || namespaceURI === NS_XHTML ?\n        doc.createElement(name) :\n        doc.createElementNS(namespaceURI, name);\n}\n\n/**\n * Copies the children of one DOM element to another DOM element\n */\nfunction moveChildren(fromEl, toEl) {\n    var curChild = fromEl.firstChild;\n    while (curChild) {\n        var nextChild = curChild.nextSibling;\n        toEl.appendChild(curChild);\n        curChild = nextChild;\n    }\n    return toEl;\n}\n\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n    if (fromEl[name] !== toEl[name]) {\n        fromEl[name] = toEl[name];\n        if (fromEl[name]) {\n            fromEl.setAttribute(name, '');\n        } else {\n            fromEl.removeAttribute(name);\n        }\n    }\n}\n\nvar specialElHandlers = {\n    OPTION: function(fromEl, toEl) {\n        var parentNode = fromEl.parentNode;\n        if (parentNode) {\n            var parentName = parentNode.nodeName.toUpperCase();\n            if (parentName === 'OPTGROUP') {\n                parentNode = parentNode.parentNode;\n                parentName = parentNode && parentNode.nodeName.toUpperCase();\n            }\n            if (parentName === 'SELECT' && !parentNode.hasAttribute('multiple')) {\n                if (fromEl.hasAttribute('selected') && !toEl.selected) {\n                    // Workaround for MS Edge bug where the 'selected' attribute can only be\n                    // removed if set to a non-empty value:\n                    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12087679/\n                    fromEl.setAttribute('selected', 'selected');\n                    fromEl.removeAttribute('selected');\n                }\n                // We have to reset select element's selectedIndex to -1, otherwise setting\n                // fromEl.selected using the syncBooleanAttrProp below has no effect.\n                // The correct selectedIndex will be set in the SELECT special handler below.\n                parentNode.selectedIndex = -1;\n            }\n        }\n        syncBooleanAttrProp(fromEl, toEl, 'selected');\n    },\n    /**\n     * The \"value\" attribute is special for the <input> element since it sets\n     * the initial value. Changing the \"value\" attribute without changing the\n     * \"value\" property will have no effect since it is only used to the set the\n     * initial value.  Similar for the \"checked\" attribute, and \"disabled\".\n     */\n    INPUT: function(fromEl, toEl) {\n        syncBooleanAttrProp(fromEl, toEl, 'checked');\n        syncBooleanAttrProp(fromEl, toEl, 'disabled');\n\n        if (fromEl.value !== toEl.value) {\n            fromEl.value = toEl.value;\n        }\n\n        if (!toEl.hasAttribute('value')) {\n            fromEl.removeAttribute('value');\n        }\n    },\n\n    TEXTAREA: function(fromEl, toEl) {\n        var newValue = toEl.value;\n        if (fromEl.value !== newValue) {\n            fromEl.value = newValue;\n        }\n\n        var firstChild = fromEl.firstChild;\n        if (firstChild) {\n            // Needed for IE. Apparently IE sets the placeholder as the\n            // node value and vise versa. This ignores an empty update.\n            var oldValue = firstChild.nodeValue;\n\n            if (oldValue == newValue || (!newValue && oldValue == fromEl.placeholder)) {\n                return;\n            }\n\n            firstChild.nodeValue = newValue;\n        }\n    },\n    SELECT: function(fromEl, toEl) {\n        if (!toEl.hasAttribute('multiple')) {\n            var selectedIndex = -1;\n            var i = 0;\n            // We have to loop through children of fromEl, not toEl since nodes can be moved\n            // from toEl to fromEl directly when morphing.\n            // At the time this special handler is invoked, all children have already been morphed\n            // and appended to / removed from fromEl, so using fromEl here is safe and correct.\n            var curChild = fromEl.firstChild;\n            var optgroup;\n            var nodeName;\n            while(curChild) {\n                nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n                if (nodeName === 'OPTGROUP') {\n                    optgroup = curChild;\n                    curChild = optgroup.firstChild;\n                } else {\n                    if (nodeName === 'OPTION') {\n                        if (curChild.hasAttribute('selected')) {\n                            selectedIndex = i;\n                            break;\n                        }\n                        i++;\n                    }\n                    curChild = curChild.nextSibling;\n                    if (!curChild && optgroup) {\n                        curChild = optgroup.nextSibling;\n                        optgroup = null;\n                    }\n                }\n            }\n\n            fromEl.selectedIndex = selectedIndex;\n        }\n    }\n};\n\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\n\nfunction noop() {}\n\nfunction defaultGetNodeKey(node) {\n  if (node) {\n    return (node.getAttribute && node.getAttribute('id')) || node.id;\n  }\n}\n\nfunction morphdomFactory(morphAttrs) {\n\n  return function morphdom(fromNode, toNode, options) {\n    if (!options) {\n      options = {};\n    }\n\n    if (typeof toNode === 'string') {\n      if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML' || fromNode.nodeName === 'BODY') {\n        var toNodeHtml = toNode;\n        toNode = doc.createElement('html');\n        toNode.innerHTML = toNodeHtml;\n      } else {\n        toNode = toElement(toNode);\n      }\n    } else if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n      toNode = toNode.firstElementChild;\n    }\n\n    var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n    var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n    var onNodeAdded = options.onNodeAdded || noop;\n    var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n    var onElUpdated = options.onElUpdated || noop;\n    var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n    var onNodeDiscarded = options.onNodeDiscarded || noop;\n    var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n    var skipFromChildren = options.skipFromChildren || noop;\n    var addChild = options.addChild || function(parent, child){ return parent.appendChild(child); };\n    var childrenOnly = options.childrenOnly === true;\n\n    // This object is used as a lookup to quickly find all keyed elements in the original DOM tree.\n    var fromNodesLookup = Object.create(null);\n    var keyedRemovalList = [];\n\n    function addKeyedRemoval(key) {\n      keyedRemovalList.push(key);\n    }\n\n    function walkDiscardedChildNodes(node, skipKeyedNodes) {\n      if (node.nodeType === ELEMENT_NODE) {\n        var curChild = node.firstChild;\n        while (curChild) {\n\n          var key = undefined;\n\n          if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n            // If we are skipping keyed nodes then we add the key\n            // to a list so that it can be handled at the very end.\n            addKeyedRemoval(key);\n          } else {\n            // Only report the node as discarded if it is not keyed. We do this because\n            // at the end we loop through all keyed elements that were unmatched\n            // and then discard them in one final pass.\n            onNodeDiscarded(curChild);\n            if (curChild.firstChild) {\n              walkDiscardedChildNodes(curChild, skipKeyedNodes);\n            }\n          }\n\n          curChild = curChild.nextSibling;\n        }\n      }\n    }\n\n    /**\n    * Removes a DOM node out of the original DOM\n    *\n    * @param  {Node} node The node to remove\n    * @param  {Node} parentNode The nodes parent\n    * @param  {Boolean} skipKeyedNodes If true then elements with keys will be skipped and not discarded.\n    * @return {undefined}\n    */\n    function removeNode(node, parentNode, skipKeyedNodes) {\n      if (onBeforeNodeDiscarded(node) === false) {\n        return;\n      }\n\n      if (parentNode) {\n        parentNode.removeChild(node);\n      }\n\n      onNodeDiscarded(node);\n      walkDiscardedChildNodes(node, skipKeyedNodes);\n    }\n\n    // // TreeWalker implementation is no faster, but keeping this around in case this changes in the future\n    // function indexTree(root) {\n    //     var treeWalker = document.createTreeWalker(\n    //         root,\n    //         NodeFilter.SHOW_ELEMENT);\n    //\n    //     var el;\n    //     while((el = treeWalker.nextNode())) {\n    //         var key = getNodeKey(el);\n    //         if (key) {\n    //             fromNodesLookup[key] = el;\n    //         }\n    //     }\n    // }\n\n    // // NodeIterator implementation is no faster, but keeping this around in case this changes in the future\n    //\n    // function indexTree(node) {\n    //     var nodeIterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT);\n    //     var el;\n    //     while((el = nodeIterator.nextNode())) {\n    //         var key = getNodeKey(el);\n    //         if (key) {\n    //             fromNodesLookup[key] = el;\n    //         }\n    //     }\n    // }\n\n    function indexTree(node) {\n      if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n        var curChild = node.firstChild;\n        while (curChild) {\n          var key = getNodeKey(curChild);\n          if (key) {\n            fromNodesLookup[key] = curChild;\n          }\n\n          // Walk recursively\n          indexTree(curChild);\n\n          curChild = curChild.nextSibling;\n        }\n      }\n    }\n\n    indexTree(fromNode);\n\n    function handleNodeAdded(el) {\n      onNodeAdded(el);\n\n      var curChild = el.firstChild;\n      while (curChild) {\n        var nextSibling = curChild.nextSibling;\n\n        var key = getNodeKey(curChild);\n        if (key) {\n          var unmatchedFromEl = fromNodesLookup[key];\n          // if we find a duplicate #id node in cache, replace `el` with cache value\n          // and morph it to the child node.\n          if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n            curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n            morphEl(unmatchedFromEl, curChild);\n          } else {\n            handleNodeAdded(curChild);\n          }\n        } else {\n          // recursively call for curChild and it's children to see if we find something in\n          // fromNodesLookup\n          handleNodeAdded(curChild);\n        }\n\n        curChild = nextSibling;\n      }\n    }\n\n    function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n      // We have processed all of the \"to nodes\". If curFromNodeChild is\n      // non-null then we still have some from nodes left over that need\n      // to be removed\n      while (curFromNodeChild) {\n        var fromNextSibling = curFromNodeChild.nextSibling;\n        if ((curFromNodeKey = getNodeKey(curFromNodeChild))) {\n          // Since the node is keyed it might be matched up later so we defer\n          // the actual removal to later\n          addKeyedRemoval(curFromNodeKey);\n        } else {\n          // NOTE: we skip nested keyed nodes from being removed since there is\n          //       still a chance they will be matched up later\n          removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n        }\n        curFromNodeChild = fromNextSibling;\n      }\n    }\n\n    function morphEl(fromEl, toEl, childrenOnly) {\n      var toElKey = getNodeKey(toEl);\n\n      if (toElKey) {\n        // If an element with an ID is being morphed then it will be in the final\n        // DOM so clear it out of the saved elements collection\n        delete fromNodesLookup[toElKey];\n      }\n\n      if (!childrenOnly) {\n        // optional\n        var beforeUpdateResult = onBeforeElUpdated(fromEl, toEl);\n        if (beforeUpdateResult === false) {\n          return;\n        } else if (beforeUpdateResult instanceof HTMLElement) {\n          fromEl = beforeUpdateResult;\n          // reindex the new fromEl in case it's not in the same\n          // tree as the original fromEl\n          // (Phoenix LiveView sometimes returns a cloned tree,\n          //  but keyed lookups would still point to the original tree)\n          indexTree(fromEl);\n        }\n\n        // update attributes on original DOM element first\n        morphAttrs(fromEl, toEl);\n        // optional\n        onElUpdated(fromEl);\n\n        if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n          return;\n        }\n      }\n\n      if (fromEl.nodeName !== 'TEXTAREA') {\n        morphChildren(fromEl, toEl);\n      } else {\n        specialElHandlers.TEXTAREA(fromEl, toEl);\n      }\n    }\n\n    function morphChildren(fromEl, toEl) {\n      var skipFrom = skipFromChildren(fromEl, toEl);\n      var curToNodeChild = toEl.firstChild;\n      var curFromNodeChild = fromEl.firstChild;\n      var curToNodeKey;\n      var curFromNodeKey;\n\n      var fromNextSibling;\n      var toNextSibling;\n      var matchingFromEl;\n\n      // walk the children\n      outer: while (curToNodeChild) {\n        toNextSibling = curToNodeChild.nextSibling;\n        curToNodeKey = getNodeKey(curToNodeChild);\n\n        // walk the fromNode children all the way through\n        while (!skipFrom && curFromNodeChild) {\n          fromNextSibling = curFromNodeChild.nextSibling;\n\n          if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n            curToNodeChild = toNextSibling;\n            curFromNodeChild = fromNextSibling;\n            continue outer;\n          }\n\n          curFromNodeKey = getNodeKey(curFromNodeChild);\n\n          var curFromNodeType = curFromNodeChild.nodeType;\n\n          // this means if the curFromNodeChild doesnt have a match with the curToNodeChild\n          var isCompatible = undefined;\n\n          if (curFromNodeType === curToNodeChild.nodeType) {\n            if (curFromNodeType === ELEMENT_NODE) {\n              // Both nodes being compared are Element nodes\n\n              if (curToNodeKey) {\n                // The target node has a key so we want to match it up with the correct element\n                // in the original DOM tree\n                if (curToNodeKey !== curFromNodeKey) {\n                  // The current element in the original DOM tree does not have a matching key so\n                  // let's check our lookup to see if there is a matching element in the original\n                  // DOM tree\n                  if ((matchingFromEl = fromNodesLookup[curToNodeKey])) {\n                    if (fromNextSibling === matchingFromEl) {\n                      // Special case for single element removals. To avoid removing the original\n                      // DOM node out of the tree (since that can break CSS transitions, etc.),\n                      // we will instead discard the current node and wait until the next\n                      // iteration to properly match up the keyed target element with its matching\n                      // element in the original tree\n                      isCompatible = false;\n                    } else {\n                      // We found a matching keyed element somewhere in the original DOM tree.\n                      // Let's move the original DOM node into the current position and morph\n                      // it.\n\n                      // NOTE: We use insertBefore instead of replaceChild because we want to go through\n                      // the `removeNode()` function for the node that is being discarded so that\n                      // all lifecycle hooks are correctly invoked\n                      fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n\n                      // fromNextSibling = curFromNodeChild.nextSibling;\n\n                      if (curFromNodeKey) {\n                        // Since the node is keyed it might be matched up later so we defer\n                        // the actual removal to later\n                        addKeyedRemoval(curFromNodeKey);\n                      } else {\n                        // NOTE: we skip nested keyed nodes from being removed since there is\n                        //       still a chance they will be matched up later\n                        removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n                      }\n\n                      curFromNodeChild = matchingFromEl;\n                      curFromNodeKey = getNodeKey(curFromNodeChild);\n                    }\n                  } else {\n                    // The nodes are not compatible since the \"to\" node has a key and there\n                    // is no matching keyed node in the source tree\n                    isCompatible = false;\n                  }\n                }\n              } else if (curFromNodeKey) {\n                // The original has a key\n                isCompatible = false;\n              }\n\n              isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n              if (isCompatible) {\n                // We found compatible DOM elements so transform\n                // the current \"from\" node to match the current\n                // target DOM node.\n                // MORPH\n                morphEl(curFromNodeChild, curToNodeChild);\n              }\n\n            } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n              // Both nodes being compared are Text or Comment nodes\n              isCompatible = true;\n              // Simply update nodeValue on the original node to\n              // change the text value\n              if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n                curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n              }\n\n            }\n          }\n\n          if (isCompatible) {\n            // Advance both the \"to\" child and the \"from\" child since we found a match\n            // Nothing else to do as we already recursively called morphChildren above\n            curToNodeChild = toNextSibling;\n            curFromNodeChild = fromNextSibling;\n            continue outer;\n          }\n\n          // No compatible match so remove the old node from the DOM and continue trying to find a\n          // match in the original DOM. However, we only do this if the from node is not keyed\n          // since it is possible that a keyed node might match up with a node somewhere else in the\n          // target tree and we don't want to discard it just yet since it still might find a\n          // home in the final DOM tree. After everything is done we will remove any keyed nodes\n          // that didn't find a home\n          if (curFromNodeKey) {\n            // Since the node is keyed it might be matched up later so we defer\n            // the actual removal to later\n            addKeyedRemoval(curFromNodeKey);\n          } else {\n            // NOTE: we skip nested keyed nodes from being removed since there is\n            //       still a chance they will be matched up later\n            removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n          }\n\n          curFromNodeChild = fromNextSibling;\n        } // END: while(curFromNodeChild) {}\n\n        // If we got this far then we did not find a candidate match for\n        // our \"to node\" and we exhausted all of the children \"from\"\n        // nodes. Therefore, we will just append the current \"to\" node\n        // to the end\n        if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n          // MORPH\n          if(!skipFrom){ addChild(fromEl, matchingFromEl); }\n          morphEl(matchingFromEl, curToNodeChild);\n        } else {\n          var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n          if (onBeforeNodeAddedResult !== false) {\n            if (onBeforeNodeAddedResult) {\n              curToNodeChild = onBeforeNodeAddedResult;\n            }\n\n            if (curToNodeChild.actualize) {\n              curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n            }\n            addChild(fromEl, curToNodeChild);\n            handleNodeAdded(curToNodeChild);\n          }\n        }\n\n        curToNodeChild = toNextSibling;\n        curFromNodeChild = fromNextSibling;\n      }\n\n      cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n\n      var specialElHandler = specialElHandlers[fromEl.nodeName];\n      if (specialElHandler) {\n        specialElHandler(fromEl, toEl);\n      }\n    } // END: morphChildren(...)\n\n    var morphedNode = fromNode;\n    var morphedNodeType = morphedNode.nodeType;\n    var toNodeType = toNode.nodeType;\n\n    if (!childrenOnly) {\n      // Handle the case where we are given two DOM nodes that are not\n      // compatible (e.g. <div> --> <span> or <div> --> TEXT)\n      if (morphedNodeType === ELEMENT_NODE) {\n        if (toNodeType === ELEMENT_NODE) {\n          if (!compareNodeNames(fromNode, toNode)) {\n            onNodeDiscarded(fromNode);\n            morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n          }\n        } else {\n          // Going from an element node to a text node\n          morphedNode = toNode;\n        }\n      } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node\n        if (toNodeType === morphedNodeType) {\n          if (morphedNode.nodeValue !== toNode.nodeValue) {\n            morphedNode.nodeValue = toNode.nodeValue;\n          }\n\n          return morphedNode;\n        } else {\n          // Text node to something else\n          morphedNode = toNode;\n        }\n      }\n    }\n\n    if (morphedNode === toNode) {\n      // The \"to node\" was not compatible with the \"from node\" so we had to\n      // toss out the \"from node\" and use the \"to node\"\n      onNodeDiscarded(fromNode);\n    } else {\n      if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n        return;\n      }\n\n      morphEl(morphedNode, toNode, childrenOnly);\n\n      // We now need to loop over any keyed nodes that might need to be\n      // removed. We only do the removal if we know that the keyed node\n      // never found a match. When a keyed node is matched up we remove\n      // it out of fromNodesLookup and we use fromNodesLookup to determine\n      // if a keyed node has been matched up or not\n      if (keyedRemovalList) {\n        for (var i=0, len=keyedRemovalList.length; i<len; i++) {\n          var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n          if (elToRemove) {\n            removeNode(elToRemove, elToRemove.parentNode, false);\n          }\n        }\n      }\n    }\n\n    if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n      if (morphedNode.actualize) {\n        morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n      }\n      // If we had to swap out the from node with a new node because the old\n      // node was not compatible with the target node then we need to\n      // replace the old DOM node in the original DOM tree. This is only\n      // possible if the original DOM node was part of a DOM tree which\n      // we know is the case if it has a parent node.\n      fromNode.parentNode.replaceChild(morphedNode, fromNode);\n    }\n\n    return morphedNode;\n  };\n}\n\nvar morphdom = morphdomFactory(morphAttrs);\n\nexport default morphdom;\n", "import {\n  PHX_COMPONENT,\n  PHX_PRUNE,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_SKIP,\n  PHX_MAGIC_ID,\n  PHX_STATIC,\n  PHX_TRIGGER_ACTION,\n  PHX_UPDATE,\n  PHX_REF_SRC,\n  PHX_REF_LOCK,\n  PHX_STREAM,\n  PHX_STREAM_REF,\n  PHX_VIEWPORT_TOP,\n  PHX_VIEWPORT_BOTTOM,\n} from \"./constants\"\n\nimport {\n  detectDuplicateIds,\n  isCid\n} from \"./utils\"\n\nimport DOM from \"./dom\"\nimport DOMPostMorphRestorer from \"./dom_post_morph_restorer\"\nimport morphdom from \"morphdom\"\n\nexport default class DOMPatch {\n  static patchWithClonedTree(container, clonedTree, liveSocket){\n    let focused = liveSocket.getActiveElement()\n    let {selectionStart, selectionEnd} = focused && DOM.hasSelectionRange(focused) ? focused : {}\n    let phxUpdate = liveSocket.binding(PHX_UPDATE)\n    let externalFormTriggered = null\n\n    morphdom(container, clonedTree, {\n      childrenOnly: false,\n      onBeforeElUpdated: (fromEl, toEl) => {\n        DOM.syncPendingAttrs(fromEl, toEl)\n        // we cannot morph locked children\n        if(!container.isSameNode(fromEl) && fromEl.hasAttribute(PHX_REF_LOCK)){ return false }\n        if(DOM.isIgnored(fromEl, phxUpdate)){ return false }\n        if(focused && focused.isSameNode(fromEl) && DOM.isFormInput(fromEl)){\n          DOM.mergeFocusedInput(fromEl, toEl)\n          return false\n        }\n        if(DOM.isNowTriggerFormExternal(toEl, liveSocket.binding(PHX_TRIGGER_ACTION))){\n          externalFormTriggered = toEl\n        }\n      }\n    })\n\n    if(externalFormTriggered){\n      liveSocket.unload()\n      // use prototype's submit in case there's a form control with name or id of \"submit\"\n      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n      Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered)\n    }\n\n    liveSocket.silenceEvents(() => DOM.restoreFocus(focused, selectionStart, selectionEnd))\n  }\n\n  constructor(view, container, id, html, streams, targetCID){\n    this.view = view\n    this.liveSocket = view.liveSocket\n    this.container = container\n    this.id = id\n    this.rootID = view.root.id\n    this.html = html\n    this.streams = streams\n    this.streamInserts = {}\n    this.streamComponentRestore = {}\n    this.targetCID = targetCID\n    this.cidPatch = isCid(this.targetCID)\n    this.pendingRemoves = []\n    this.phxRemove = this.liveSocket.binding(\"remove\")\n    this.targetContainer = this.isCIDPatch() ? this.targetCIDContainer(html) : container\n    this.callbacks = {\n      beforeadded: [], beforeupdated: [], beforephxChildAdded: [],\n      afteradded: [], afterupdated: [], afterdiscarded: [], afterphxChildAdded: [],\n      aftertransitionsDiscarded: []\n    }\n  }\n\n  before(kind, callback){ this.callbacks[`before${kind}`].push(callback) }\n  after(kind, callback){ this.callbacks[`after${kind}`].push(callback) }\n\n  trackBefore(kind, ...args){\n    this.callbacks[`before${kind}`].forEach(callback => callback(...args))\n  }\n\n  trackAfter(kind, ...args){\n    this.callbacks[`after${kind}`].forEach(callback => callback(...args))\n  }\n\n  markPrunableContentForRemoval(){\n    let phxUpdate = this.liveSocket.binding(PHX_UPDATE)\n    DOM.all(this.container, `[${phxUpdate}=append] > *, [${phxUpdate}=prepend] > *`, el => {\n      el.setAttribute(PHX_PRUNE, \"\")\n    })\n  }\n\n  perform(isJoinPatch){\n    let {view, liveSocket, html, container, targetContainer} = this\n    if(this.isCIDPatch() && !targetContainer){ return }\n\n    let focused = liveSocket.getActiveElement()\n    let {selectionStart, selectionEnd} = focused && DOM.hasSelectionRange(focused) ? focused : {}\n    let phxUpdate = liveSocket.binding(PHX_UPDATE)\n    let phxViewportTop = liveSocket.binding(PHX_VIEWPORT_TOP)\n    let phxViewportBottom = liveSocket.binding(PHX_VIEWPORT_BOTTOM)\n    let phxTriggerExternal = liveSocket.binding(PHX_TRIGGER_ACTION)\n    let added = []\n    let updates = []\n    let appendPrependUpdates = []\n\n    let externalFormTriggered = null\n\n    function morph(targetContainer, source, withChildren=false){\n      let morphCallbacks = {\n        // normally, we are running with childrenOnly, as the patch HTML for a LV\n        // does not include the LV attrs (data-phx-session, etc.)\n        // when we are patching a live component, we do want to patch the root element as well;\n        // another case is the recursive patch of a stream item that was kept on reset (-> onBeforeNodeAdded)\n        childrenOnly: targetContainer.getAttribute(PHX_COMPONENT) === null && !withChildren,\n        getNodeKey: (node) => {\n          if(DOM.isPhxDestroyed(node)){ return null }\n          // If we have a join patch, then by definition there was no PHX_MAGIC_ID.\n          // This is important to reduce the amount of elements morphdom discards.\n          if(isJoinPatch){ return node.id }\n          return node.id || (node.getAttribute && node.getAttribute(PHX_MAGIC_ID))\n        },\n        // skip indexing from children when container is stream\n        skipFromChildren: (from) => { return from.getAttribute(phxUpdate) === PHX_STREAM },\n        // tell morphdom how to add a child\n        addChild: (parent, child) => {\n          let {ref, streamAt} = this.getStreamInsert(child)\n          if(ref === undefined){ return parent.appendChild(child) }\n\n          this.setStreamRef(child, ref)\n\n          // streaming\n          if(streamAt === 0){\n            parent.insertAdjacentElement(\"afterbegin\", child)\n          } else if(streamAt === -1){\n            let lastChild = parent.lastElementChild\n            if(lastChild && !lastChild.hasAttribute(PHX_STREAM_REF)){\n              let nonStreamChild = Array.from(parent.children).find(c => !c.hasAttribute(PHX_STREAM_REF))\n              parent.insertBefore(child, nonStreamChild)\n            } else {\n              parent.appendChild(child)\n            }\n          } else if(streamAt > 0){\n            let sibling = Array.from(parent.children)[streamAt]\n            parent.insertBefore(child, sibling)\n          }\n        },\n        onBeforeNodeAdded: (el) => {\n          DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom)\n          this.trackBefore(\"added\", el)\n\n          let morphedEl = el\n          // this is a stream item that was kept on reset, recursively morph it\n          if(this.streamComponentRestore[el.id]){\n            morphedEl = this.streamComponentRestore[el.id]\n            delete this.streamComponentRestore[el.id]\n            morph.call(this, morphedEl, el, true)\n          }\n\n          return morphedEl\n        },\n        onNodeAdded: (el) => {\n          if(el.getAttribute){ this.maybeReOrderStream(el, true) }\n\n          // hack to fix Safari handling of img srcset and video tags\n          if(el instanceof HTMLImageElement && el.srcset){\n            el.srcset = el.srcset\n          } else if(el instanceof HTMLVideoElement && el.autoplay){\n            el.play()\n          }\n          if(DOM.isNowTriggerFormExternal(el, phxTriggerExternal)){\n            externalFormTriggered = el\n          }\n\n          // nested view handling\n          if((DOM.isPhxChild(el) && view.ownsElement(el)) || DOM.isPhxSticky(el) && view.ownsElement(el.parentNode)){\n            this.trackAfter(\"phxChildAdded\", el)\n          }\n          added.push(el)\n        },\n        onNodeDiscarded: (el) => this.onNodeDiscarded(el),\n        onBeforeNodeDiscarded: (el) => {\n          if(el.getAttribute && el.getAttribute(PHX_PRUNE) !== null){ return true }\n          if(el.parentElement !== null && el.id &&\n            DOM.isPhxUpdate(el.parentElement, phxUpdate, [PHX_STREAM, \"append\", \"prepend\"])){\n            return false\n          }\n          if(this.maybePendingRemove(el)){ return false }\n          if(this.skipCIDSibling(el)){ return false }\n\n          return true\n        },\n        onElUpdated: (el) => {\n          if(DOM.isNowTriggerFormExternal(el, phxTriggerExternal)){\n            externalFormTriggered = el\n          }\n          updates.push(el)\n          this.maybeReOrderStream(el, false)\n        },\n        onBeforeElUpdated: (fromEl, toEl) => {\n          // if we are patching the root target container and the id has changed, treat it as a new node\n          // by replacing the fromEl with the toEl, which ensures hooks are torn down and re-created\n          if(fromEl.id && fromEl.isSameNode(targetContainer) && fromEl.id !== toEl.id){\n            morphCallbacks.onNodeDiscarded(fromEl)\n            fromEl.replaceWith(toEl)\n            return morphCallbacks.onNodeAdded(toEl)\n          }\n          DOM.syncPendingAttrs(fromEl, toEl)\n          DOM.maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom)\n          DOM.cleanChildNodes(toEl, phxUpdate)\n          if(this.skipCIDSibling(toEl)){\n            // if this is a live component used in a stream, we may need to reorder it\n            this.maybeReOrderStream(fromEl)\n            return false\n          }\n          if(DOM.isPhxSticky(fromEl)){\n            [PHX_SESSION, PHX_STATIC, PHX_ROOT_ID]\n              .map(attr => [attr, fromEl.getAttribute(attr), toEl.getAttribute(attr)])\n              .forEach(([attr, fromVal, toVal]) => {\n                if(toVal && fromVal !== toVal){ fromEl.setAttribute(attr, toVal) }\n              })\n\n            return false\n          }\n          if(DOM.isIgnored(fromEl, phxUpdate) || (fromEl.form && fromEl.form.isSameNode(externalFormTriggered))){\n            this.trackBefore(\"updated\", fromEl, toEl)\n            DOM.mergeAttrs(fromEl, toEl, {isIgnored: DOM.isIgnored(fromEl, phxUpdate)})\n            updates.push(fromEl)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          }\n          if(fromEl.type === \"number\" && (fromEl.validity && fromEl.validity.badInput)){ return false }\n          // If the element has PHX_REF_SRC, it is loading or locked and awaiting an ack.\n          // If it's locked, we clone the fromEl tree and instruct morphdom to use\n          // the cloned tree as the source of the morph for this branch from here on out.\n          // We keep a reference to the cloned tree in the element's private data, and\n          // on ack (view.undoRefs), we morph the cloned tree with the true fromEl in the DOM to\n          // apply any changes that happened while the element was locked.\n          let isFocusedFormEl = focused && fromEl.isSameNode(focused) && DOM.isFormInput(fromEl)\n          let focusedSelectChanged = isFocusedFormEl && this.isChangedSelect(fromEl, toEl)\n          if(fromEl.hasAttribute(PHX_REF_SRC)){\n            if(DOM.isUploadInput(fromEl)){\n              DOM.mergeAttrs(fromEl, toEl, {isIgnored: true})\n              this.trackBefore(\"updated\", fromEl, toEl)\n              updates.push(fromEl)\n            }\n            DOM.applyStickyOperations(fromEl)\n            let isLocked = fromEl.hasAttribute(PHX_REF_LOCK)\n            let clone = isLocked ? DOM.private(fromEl, PHX_REF_LOCK) || fromEl.cloneNode(true) : null\n            if(clone){\n              DOM.putPrivate(fromEl, PHX_REF_LOCK, clone)\n              if(!isFocusedFormEl){\n                fromEl = clone\n              }\n            }\n          }\n\n          // nested view handling\n          if(DOM.isPhxChild(toEl)){\n            let prevSession = fromEl.getAttribute(PHX_SESSION)\n            DOM.mergeAttrs(fromEl, toEl, {exclude: [PHX_STATIC]})\n            if(prevSession !== \"\"){ fromEl.setAttribute(PHX_SESSION, prevSession) }\n            fromEl.setAttribute(PHX_ROOT_ID, this.rootID)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          }\n\n          // input handling\n          DOM.copyPrivates(toEl, fromEl)\n\n          // skip patching focused inputs unless focus is a select that has changed options\n          if(isFocusedFormEl && fromEl.type !== \"hidden\" && !focusedSelectChanged){\n            this.trackBefore(\"updated\", fromEl, toEl)\n            DOM.mergeFocusedInput(fromEl, toEl)\n            DOM.syncAttrsToProps(fromEl)\n            updates.push(fromEl)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          } else {\n            // blur focused select if it changed so native UI is updated (ie safari won't update visible options)\n            if(focusedSelectChanged){ fromEl.blur() }\n            if(DOM.isPhxUpdate(toEl, phxUpdate, [\"append\", \"prepend\"])){\n              appendPrependUpdates.push(new DOMPostMorphRestorer(fromEl, toEl, toEl.getAttribute(phxUpdate)))\n            }\n\n            DOM.syncAttrsToProps(toEl)\n            DOM.applyStickyOperations(toEl)\n            this.trackBefore(\"updated\", fromEl, toEl)\n            return fromEl\n          }\n        }\n      }\n      morphdom(targetContainer, source, morphCallbacks)\n    }\n\n    this.trackBefore(\"added\", container)\n    this.trackBefore(\"updated\", container, container)\n\n    liveSocket.time(\"morphdom\", () => {\n      this.streams.forEach(([ref, inserts, deleteIds, reset]) => {\n        inserts.forEach(([key, streamAt, limit]) => {\n          this.streamInserts[key] = {ref, streamAt, limit, reset}\n        })\n        if(reset !== undefined){\n          DOM.all(container, `[${PHX_STREAM_REF}=\"${ref}\"]`, child => {\n            this.removeStreamChildElement(child)\n          })\n        }\n        deleteIds.forEach(id => {\n          let child = container.querySelector(`[id=\"${id}\"]`)\n          if(child){ this.removeStreamChildElement(child) }\n        })\n      })\n\n      // clear stream items from the dead render if they are not inserted again\n      if(isJoinPatch){\n        DOM.all(this.container, `[${phxUpdate}=${PHX_STREAM}]`, el => {\n          // make sure to only remove elements owned by the current view\n          // see https://github.com/phoenixframework/phoenix_live_view/issues/3047\n          this.liveSocket.owner(el, (view) => {\n            if(view === this.view){\n              Array.from(el.children).forEach(child => {\n                this.removeStreamChildElement(child)\n              })\n            }\n          })\n        })\n      }\n\n      morph.call(this, targetContainer, html)\n    })\n\n    if(liveSocket.isDebugEnabled()){\n      detectDuplicateIds()\n      // warn if there are any inputs named \"id\"\n      Array.from(document.querySelectorAll(\"input[name=id]\")).forEach(node => {\n        if(node.form){\n          console.error(\"Detected an input with name=\\\"id\\\" inside a form! This will cause problems when patching the DOM.\\n\", node)\n        }\n      })\n    }\n\n    if(appendPrependUpdates.length > 0){\n      liveSocket.time(\"post-morph append/prepend restoration\", () => {\n        appendPrependUpdates.forEach(update => update.perform())\n      })\n    }\n\n    liveSocket.silenceEvents(() => DOM.restoreFocus(focused, selectionStart, selectionEnd))\n    DOM.dispatchEvent(document, \"phx:update\")\n    added.forEach(el => this.trackAfter(\"added\", el))\n    updates.forEach(el => this.trackAfter(\"updated\", el))\n\n    this.transitionPendingRemoves()\n\n    if(externalFormTriggered){\n      liveSocket.unload()\n      // use prototype's submit in case there's a form control with name or id of \"submit\"\n      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n      Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered)\n    }\n    return true\n  }\n\n  onNodeDiscarded(el){\n    // nested view handling\n    if(DOM.isPhxChild(el) || DOM.isPhxSticky(el)){ this.liveSocket.destroyViewByEl(el) }\n    this.trackAfter(\"discarded\", el)\n  }\n\n  maybePendingRemove(node){\n    if(node.getAttribute && node.getAttribute(this.phxRemove) !== null){\n      this.pendingRemoves.push(node)\n      return true\n    } else {\n      return false\n    }\n  }\n\n  removeStreamChildElement(child){\n    // we need to store the node if it is actually re-added in the same patch\n    // we do NOT want to execute phx-remove, we do NOT want to call onNodeDiscarded\n    if(this.streamInserts[child.id]){\n      this.streamComponentRestore[child.id] = child\n      child.remove()\n    } else {\n      // only remove the element now if it has no phx-remove binding\n      if(!this.maybePendingRemove(child)){\n        child.remove()\n        this.onNodeDiscarded(child)\n      }\n    }\n  }\n\n  getStreamInsert(el){\n    let insert = el.id ? this.streamInserts[el.id] : {}\n    return insert || {}\n  }\n\n  setStreamRef(el, ref){\n    DOM.putSticky(el, PHX_STREAM_REF, el => el.setAttribute(PHX_STREAM_REF, ref))\n  }\n\n  maybeReOrderStream(el, isNew){\n    let {ref, streamAt, reset} = this.getStreamInsert(el)\n    if(streamAt === undefined){ return }\n\n    // we need to set the PHX_STREAM_REF here as well as addChild is invoked only for parents\n    this.setStreamRef(el, ref)\n\n    if(!reset && !isNew){\n      // we only reorder if the element is new or it's a stream reset\n      return\n    }\n\n    // check if the element has a parent element;\n    // it doesn't if we are currently recursively morphing (restoring a saved stream child)\n    // because the element is not yet added to the real dom;\n    // reordering does not make sense in that case anyway\n    if(!el.parentElement){ return }\n\n    if(streamAt === 0){\n      el.parentElement.insertBefore(el, el.parentElement.firstElementChild)\n    } else if(streamAt > 0){\n      let children = Array.from(el.parentElement.children)\n      let oldIndex = children.indexOf(el)\n      if(streamAt >= children.length - 1){\n        el.parentElement.appendChild(el)\n      } else {\n        let sibling = children[streamAt]\n        if(oldIndex > streamAt){\n          el.parentElement.insertBefore(el, sibling)\n        } else {\n          el.parentElement.insertBefore(el, sibling.nextElementSibling)\n        }\n      }\n    }\n\n    this.maybeLimitStream(el)\n  }\n\n  maybeLimitStream(el){\n    let {limit} = this.getStreamInsert(el)\n    let children = limit !== null && Array.from(el.parentElement.children)\n    if(limit && limit < 0 && children.length > limit * -1){\n      children.slice(0, children.length + limit).forEach(child => this.removeStreamChildElement(child))\n    } else if(limit && limit >= 0 && children.length > limit){\n      children.slice(limit).forEach(child => this.removeStreamChildElement(child))\n    }\n  }\n\n  transitionPendingRemoves(){\n    let {pendingRemoves, liveSocket} = this\n    if(pendingRemoves.length > 0){\n      liveSocket.transitionRemoves(pendingRemoves, false, () => {\n        pendingRemoves.forEach(el => {\n          let child = DOM.firstPhxChild(el)\n          if(child){ liveSocket.destroyViewByEl(child) }\n          el.remove()\n        })\n        this.trackAfter(\"transitionsDiscarded\", pendingRemoves)\n      })\n    }\n  }\n\n  isChangedSelect(fromEl, toEl){\n    if(!(fromEl instanceof HTMLSelectElement) || fromEl.multiple){ return false }\n    if(fromEl.options.length !== toEl.options.length){ return true }\n\n    // keep the current value\n    toEl.value = fromEl.value\n\n    // in general we have to be very careful with using isEqualNode as it does not a reliable\n    // DOM tree equality check, but for selection attributes and options it works fine\n    return !fromEl.isEqualNode(toEl)\n  }\n\n  isCIDPatch(){ return this.cidPatch }\n\n  skipCIDSibling(el){\n    return el.nodeType === Node.ELEMENT_NODE && el.hasAttribute(PHX_SKIP)\n  }\n\n  targetCIDContainer(html){\n    if(!this.isCIDPatch()){ return }\n    let [first, ...rest] = DOM.findComponentNodeList(this.container, this.targetCID)\n    if(rest.length === 0 && DOM.childNodeLength(html) === 1){\n      return first\n    } else {\n      return first && first.parentNode\n    }\n  }\n\n  indexOf(parent, child){ return Array.from(parent.children).indexOf(child) }\n}\n", "import {\n  COMPONENTS,\n  DYNAMICS,\n  TEMPLATES,\n  EVENTS,\n  PHX_COMPONENT,\n  PHX_SKIP,\n  PHX_MAGIC_ID,\n  REPLY,\n  STATIC,\n  TITLE,\n  STREAM,\n  ROOT,\n} from \"./constants\"\n\nimport {\n  isObject,\n  logError,\n  isCid,\n} from \"./utils\"\n\nconst VOID_TAGS = new Set([\n  \"area\",\n  \"base\",\n  \"br\",\n  \"col\",\n  \"command\",\n  \"embed\",\n  \"hr\",\n  \"img\",\n  \"input\",\n  \"keygen\",\n  \"link\",\n  \"meta\",\n  \"param\",\n  \"source\",\n  \"track\",\n  \"wbr\"\n])\nconst quoteChars = new Set([\"'\", \"\\\"\"])\n\nexport let modifyRoot = (html, attrs, clearInnerHTML) => {\n  let i = 0\n  let insideComment = false\n  let beforeTag, afterTag, tag, tagNameEndsAt, id, newHTML\n\n  let lookahead = html.match(/^(\\s*(?:<!--.*?-->\\s*)*)<([^\\s\\/>]+)/)\n  if(lookahead === null){ throw new Error(`malformed html ${html}`) }\n\n  i = lookahead[0].length\n  beforeTag = lookahead[1]\n  tag = lookahead[2]\n  tagNameEndsAt = i\n\n  // Scan the opening tag for id, if there is any\n  for(i; i < html.length; i++){\n    if(html.charAt(i) === \">\" ){ break }\n    if(html.charAt(i) === \"=\"){\n      let isId = html.slice(i - 3, i) === \" id\"\n      i++\n      let char = html.charAt(i)\n      if(quoteChars.has(char)){\n        let attrStartsAt = i\n        i++\n        for(i; i < html.length; i++){\n          if(html.charAt(i) === char){ break }\n        }\n        if(isId){\n          id = html.slice(attrStartsAt + 1, i)\n          break\n        }\n      }\n    }\n  }\n\n  let closeAt = html.length - 1\n  insideComment = false\n  while(closeAt >= beforeTag.length + tag.length){\n    let char = html.charAt(closeAt)\n    if(insideComment){\n      if(char === \"-\" && html.slice(closeAt - 3, closeAt) === \"<!-\"){\n        insideComment = false\n        closeAt -= 4\n      } else {\n        closeAt -= 1\n      }\n    } else if(char === \">\" && html.slice(closeAt - 2, closeAt) === \"--\"){\n      insideComment = true\n      closeAt -= 3\n    } else if(char === \">\"){\n      break\n    } else {\n      closeAt -= 1\n    }\n  }\n  afterTag = html.slice(closeAt + 1, html.length)\n\n  let attrsStr =\n    Object.keys(attrs)\n      .map(attr => attrs[attr] === true ? attr : `${attr}=\"${attrs[attr]}\"`)\n      .join(\" \")\n\n  if(clearInnerHTML){\n    // Keep the id if any\n    let idAttrStr = id ? ` id=\"${id}\"` : \"\"\n    if(VOID_TAGS.has(tag)){\n      newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}/>`\n    } else {\n      newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}></${tag}>`\n    }\n  } else {\n    let rest = html.slice(tagNameEndsAt, closeAt + 1)\n    newHTML = `<${tag}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}${rest}`\n  }\n\n  return [newHTML, beforeTag, afterTag]\n}\n\nexport default class Rendered {\n  static extract(diff){\n    let {[REPLY]: reply, [EVENTS]: events, [TITLE]: title} = diff\n    delete diff[REPLY]\n    delete diff[EVENTS]\n    delete diff[TITLE]\n    return {diff, title, reply: reply || null, events: events || []}\n  }\n\n  constructor(viewId, rendered){\n    this.viewId = viewId\n    this.rendered = {}\n    this.magicId = 0\n    this.mergeDiff(rendered)\n  }\n\n  parentViewId(){ return this.viewId }\n\n  toString(onlyCids){\n    let [str, streams] = this.recursiveToString(this.rendered, this.rendered[COMPONENTS], onlyCids, true, {})\n    return [str, streams]\n  }\n\n  recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids, changeTracking, rootAttrs){\n    onlyCids = onlyCids ? new Set(onlyCids) : null\n    let output = {buffer: \"\", components: components, onlyCids: onlyCids, streams: new Set()}\n    this.toOutputBuffer(rendered, null, output, changeTracking, rootAttrs)\n    return [output.buffer, output.streams]\n  }\n\n  componentCIDs(diff){ return Object.keys(diff[COMPONENTS] || {}).map(i => parseInt(i)) }\n\n  isComponentOnlyDiff(diff){\n    if(!diff[COMPONENTS]){ return false }\n    return Object.keys(diff).length === 1\n  }\n\n  getComponent(diff, cid){ return diff[COMPONENTS][cid] }\n\n  resetRender(cid){\n    // we are racing a component destroy, it could not exist, so\n    // make sure that we don't try to set reset on undefined\n    if(this.rendered[COMPONENTS][cid]){\n      this.rendered[COMPONENTS][cid].reset = true\n    }\n  }\n\n  mergeDiff(diff){\n    let newc = diff[COMPONENTS]\n    let cache = {}\n    delete diff[COMPONENTS]\n    this.rendered = this.mutableMerge(this.rendered, diff)\n    this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {}\n\n    if(newc){\n      let oldc = this.rendered[COMPONENTS]\n\n      for(let cid in newc){\n        newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache)\n      }\n\n      for(let cid in newc){ oldc[cid] = newc[cid] }\n      diff[COMPONENTS] = newc\n    }\n  }\n\n  cachedFindComponent(cid, cdiff, oldc, newc, cache){\n    if(cache[cid]){\n      return cache[cid]\n    } else {\n      let ndiff, stat, scid = cdiff[STATIC]\n\n      if(isCid(scid)){\n        let tdiff\n\n        if(scid > 0){\n          tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache)\n        } else {\n          tdiff = oldc[-scid]\n        }\n\n        stat = tdiff[STATIC]\n        ndiff = this.cloneMerge(tdiff, cdiff, true)\n        ndiff[STATIC] = stat\n      } else {\n        ndiff = cdiff[STATIC] !== undefined || oldc[cid] === undefined ?\n          cdiff : this.cloneMerge(oldc[cid], cdiff, false)\n      }\n\n      cache[cid] = ndiff\n      return ndiff\n    }\n  }\n\n  mutableMerge(target, source){\n    if(source[STATIC] !== undefined){\n      return source\n    } else {\n      this.doMutableMerge(target, source)\n      return target\n    }\n  }\n\n  doMutableMerge(target, source){\n    for(let key in source){\n      let val = source[key]\n      let targetVal = target[key]\n      let isObjVal = isObject(val)\n      if(isObjVal && val[STATIC] === undefined && isObject(targetVal)){\n        this.doMutableMerge(targetVal, val)\n      } else {\n        target[key] = val\n      }\n    }\n    if(target[ROOT]){\n      target.newRender = true\n    }\n  }\n\n  // Merges cid trees together, copying statics from source tree.\n  //\n  // The `pruneMagicId` is passed to control pruning the magicId of the\n  // target. We must always prune the magicId when we are sharing statics\n  // from another component. If not pruning, we replicate the logic from\n  // mutableMerge, where we set newRender to true if there is a root\n  // (effectively forcing the new version to be rendered instead of skipped)\n  //\n  cloneMerge(target, source, pruneMagicId){\n    let merged = {...target, ...source}\n    for(let key in merged){\n      let val = source[key]\n      let targetVal = target[key]\n      if(isObject(val) && val[STATIC] === undefined && isObject(targetVal)){\n        merged[key] = this.cloneMerge(targetVal, val, pruneMagicId)\n      } else if(val === undefined && isObject(targetVal)){\n        merged[key] = this.cloneMerge(targetVal, {}, pruneMagicId)\n      }\n    }\n    if(pruneMagicId){\n      delete merged.magicId\n      delete merged.newRender\n    } else if(target[ROOT]){\n      merged.newRender = true\n    }\n    return merged\n  }\n\n  componentToString(cid){\n    let [str, streams] = this.recursiveCIDToString(this.rendered[COMPONENTS], cid, null)\n    let [strippedHTML, _before, _after] = modifyRoot(str, {})\n    return [strippedHTML, streams]\n  }\n\n  pruneCIDs(cids){\n    cids.forEach(cid => delete this.rendered[COMPONENTS][cid])\n  }\n\n  // private\n\n  get(){ return this.rendered }\n\n  isNewFingerprint(diff = {}){ return !!diff[STATIC] }\n\n  templateStatic(part, templates){\n    if(typeof (part) === \"number\"){\n      return templates[part]\n    } else {\n      return part\n    }\n  }\n\n  nextMagicID(){\n    this.magicId++\n    return `m${this.magicId}-${this.parentViewId()}`\n  }\n\n  // Converts rendered tree to output buffer.\n  //\n  // changeTracking controls if we can apply the PHX_SKIP optimization.\n  // It is disabled for comprehensions since we must re-render the entire collection\n  // and no individual element is tracked inside the comprehension.\n  toOutputBuffer(rendered, templates, output, changeTracking, rootAttrs = {}){\n    if(rendered[DYNAMICS]){ return this.comprehensionToBuffer(rendered, templates, output) }\n    let {[STATIC]: statics} = rendered\n    statics = this.templateStatic(statics, templates)\n    let isRoot = rendered[ROOT]\n    let prevBuffer = output.buffer\n    if(isRoot){ output.buffer = \"\" }\n\n    // this condition is called when first rendering an optimizable function component.\n    // LC have their magicId previously set\n    if(changeTracking && isRoot && !rendered.magicId){\n      rendered.newRender = true\n      rendered.magicId = this.nextMagicID()\n    }\n\n    output.buffer += statics[0]\n    for(let i = 1; i < statics.length; i++){\n      this.dynamicToBuffer(rendered[i - 1], templates, output, changeTracking)\n      output.buffer += statics[i]\n    }\n\n    // Applies the root tag \"skip\" optimization if supported, which clears\n    // the root tag attributes and innerHTML, and only maintains the magicId.\n    // We can only skip when changeTracking is supported (outside of a comprehension),\n    // and when the root element hasn't experienced an unrendered merge (newRender true).\n    if(isRoot){\n      let skip = false\n      let attrs\n      // When a LC is re-added to the page, we need to re-render the entire LC tree,\n      // therefore changeTracking is false; however, we need to keep all the magicIds\n      // from any function component so the next time the LC is updated, we can apply\n      // the skip optimization\n      if(changeTracking || rendered.magicId){\n        skip = changeTracking && !rendered.newRender\n        attrs = {[PHX_MAGIC_ID]: rendered.magicId, ...rootAttrs}\n      } else {\n        attrs = rootAttrs\n      }\n      if(skip){ attrs[PHX_SKIP] = true }\n      let [newRoot, commentBefore, commentAfter] = modifyRoot(output.buffer, attrs, skip)\n      rendered.newRender = false\n      output.buffer = prevBuffer + commentBefore + newRoot + commentAfter\n    }\n  }\n\n  comprehensionToBuffer(rendered, templates, output){\n    let {[DYNAMICS]: dynamics, [STATIC]: statics, [STREAM]: stream} = rendered\n    let [_ref, _inserts, deleteIds, reset] = stream || [null, {}, [], null]\n    statics = this.templateStatic(statics, templates)\n    let compTemplates = templates || rendered[TEMPLATES]\n    for(let d = 0; d < dynamics.length; d++){\n      let dynamic = dynamics[d]\n      output.buffer += statics[0]\n      for(let i = 1; i < statics.length; i++){\n        // Inside a comprehension, we don't track how dynamics change\n        // over time (and features like streams would make that impossible\n        // unless we move the stream diffing away from morphdom),\n        // so we can't perform root change tracking.\n        let changeTracking = false\n        this.dynamicToBuffer(dynamic[i - 1], compTemplates, output, changeTracking)\n        output.buffer += statics[i]\n      }\n    }\n\n    if(stream !== undefined && (rendered[DYNAMICS].length > 0 || deleteIds.length > 0 || reset)){\n      delete rendered[STREAM]\n      rendered[DYNAMICS] = []\n      output.streams.add(stream)\n    }\n  }\n\n  dynamicToBuffer(rendered, templates, output, changeTracking){\n    if(typeof (rendered) === \"number\"){\n      let [str, streams] = this.recursiveCIDToString(output.components, rendered, output.onlyCids)\n      output.buffer += str\n      output.streams = new Set([...output.streams, ...streams])\n    } else if(isObject(rendered)){\n      this.toOutputBuffer(rendered, templates, output, changeTracking, {})\n    } else {\n      output.buffer += rendered\n    }\n  }\n\n  recursiveCIDToString(components, cid, onlyCids){\n    let component = components[cid] || logError(`no component for CID ${cid}`, components)\n    let attrs = {[PHX_COMPONENT]: cid}\n    let skip = onlyCids && !onlyCids.has(cid)\n    // Two optimization paths apply here:\n    //\n    //   1. The onlyCids optimization works by the server diff telling us only specific\n    //     cid's have changed. This allows us to skip rendering any component that hasn't changed,\n    //     which ultimately sets PHX_SKIP root attribute and avoids rendering the innerHTML.\n    //\n    //   2. The root PHX_SKIP optimization generalizes to all HEEx function components, and\n    //     works in the same PHX_SKIP attribute fashion as 1, but the newRender tracking is done\n    //     at the general diff merge level. If we merge a diff with new dynamics, we necessarily have\n    //     experienced a change which must be a newRender, and thus we can't skip the render.\n    //\n    // Both optimization flows apply here. newRender is set based on the onlyCids optimization, and\n    // we track a deterministic magicId based on the cid.\n    //\n    // changeTracking is about the entire tree\n    // newRender is about the current root in the tree\n    //\n    // By default changeTracking is enabled, but we special case the flow where the client is pruning\n    // cids and the server adds the component back. In such cases, we explicitly disable changeTracking\n    // with resetRender for this cid, then re-enable it after the recursive call to skip the optimization\n    // for the entire component tree.\n    component.newRender = !skip\n    component.magicId = `c${cid}-${this.parentViewId()}`\n    // enable change tracking as long as the component hasn't been reset\n    let changeTracking = !component.reset\n    let [html, streams] = this.recursiveToString(component, components, onlyCids, changeTracking, attrs)\n    // disable reset after we've rendered\n    delete component.reset\n\n    return [html, streams]\n  }\n}\n", "import DOM from \"./dom\"\nimport ARIA from \"./aria\"\n\nlet focusStack = []\nlet default_transition_time = 200\n\nlet JS = {\n  // private\n  exec(e, eventType, phxEvent, view, sourceEl, defaults){\n    let [defaultKind, defaultArgs] = defaults || [null, {callback: defaults && defaults.callback}]\n    let commands = phxEvent.charAt(0) === \"[\" ?\n      JSON.parse(phxEvent) : [[defaultKind, defaultArgs]]\n\n    commands.forEach(([kind, args]) => {\n      if(kind === defaultKind){\n        // always prefer the args, but keep existing keys from the defaultArgs\n        args = {...defaultArgs, ...args}\n        args.callback = args.callback || defaultArgs.callback\n      }\n      this.filterToEls(view.liveSocket, sourceEl, args).forEach(el => {\n        this[`exec_${kind}`](e, eventType, phxEvent, view, sourceEl, el, args)\n      })\n    })\n  },\n\n  isVisible(el){\n    return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length > 0)\n  },\n\n  // returns true if any part of the element is inside the viewport\n  isInViewport(el){\n    const rect = el.getBoundingClientRect()\n    const windowHeight = window.innerHeight || document.documentElement.clientHeight\n    const windowWidth = window.innerWidth || document.documentElement.clientWidth\n\n    return (\n      rect.right > 0 &&\n      rect.bottom > 0 &&\n      rect.left < windowWidth &&\n      rect.top < windowHeight\n    )\n  },\n\n  // private\n\n  // commands\n\n  exec_exec(e, eventType, phxEvent, view, sourceEl, el, {attr, to}){\n    let nodes = to ? DOM.all(document, to) : [sourceEl]\n    nodes.forEach(node => {\n      let encodedJS = node.getAttribute(attr)\n      if(!encodedJS){ throw new Error(`expected ${attr} to contain JS command on \"${to}\"`) }\n      view.liveSocket.execJS(node, encodedJS, eventType)\n    })\n  },\n\n  exec_dispatch(e, eventType, phxEvent, view, sourceEl, el, {event, detail, bubbles}){\n    detail = detail || {}\n    detail.dispatcher = sourceEl\n    DOM.dispatchEvent(el, event, {detail, bubbles})\n  },\n\n  exec_push(e, eventType, phxEvent, view, sourceEl, el, args){\n    let {event, data, target, page_loading, loading, value, dispatcher, callback} = args\n    let pushOpts = {loading, value, target, page_loading: !!page_loading}\n    let targetSrc = eventType === \"change\" && dispatcher ? dispatcher : sourceEl\n    let phxTarget = target || targetSrc.getAttribute(view.binding(\"target\")) || targetSrc\n    const handler = (targetView, targetCtx) => {\n      if(!targetView.isConnected()){ return }\n      if(eventType === \"change\"){\n        let {newCid, _target} = args\n        _target = _target || (DOM.isFormInput(sourceEl) ? sourceEl.name : undefined)\n        if(_target){ pushOpts._target = _target }\n        targetView.pushInput(sourceEl, targetCtx, newCid, event || phxEvent, pushOpts, callback)\n      } else if(eventType === \"submit\"){\n        let {submitter} = args\n        targetView.submitForm(sourceEl, targetCtx, event || phxEvent, submitter, pushOpts, callback)\n      } else {\n        targetView.pushEvent(eventType, sourceEl, targetCtx, event || phxEvent, data, pushOpts, callback)\n      }\n    }\n    // in case of formRecovery, targetView and targetCtx are passed as argument\n    // as they are looked up in a template element, not the real DOM\n    if(args.targetView && args.targetCtx){\n      handler(args.targetView, args.targetCtx)\n    } else {\n      view.withinTargets(phxTarget, handler)\n    }\n  },\n\n  exec_navigate(e, eventType, phxEvent, view, sourceEl, el, {href, replace}){\n    view.liveSocket.historyRedirect(e, href, replace ? \"replace\" : \"push\", null, sourceEl)\n  },\n\n  exec_patch(e, eventType, phxEvent, view, sourceEl, el, {href, replace}){\n    view.liveSocket.pushHistoryPatch(e, href, replace ? \"replace\" : \"push\", sourceEl)\n  },\n\n  exec_focus(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => ARIA.attemptFocus(el))\n  },\n\n  exec_focus_first(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => ARIA.focusFirstInteractive(el) || ARIA.focusFirst(el))\n  },\n\n  exec_push_focus(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => focusStack.push(el || sourceEl))\n  },\n\n  exec_pop_focus(_e, _eventType, _phxEvent, _view, _sourceEl, _el){\n    window.requestAnimationFrame(() => {\n      const el = focusStack.pop()\n      if(el){ el.focus() }\n    })\n  },\n\n  exec_add_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.addOrRemoveClasses(el, names, [], transition, time, view, blocking)\n  },\n\n  exec_remove_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.addOrRemoveClasses(el, [], names, transition, time, view, blocking)\n  },\n\n  exec_toggle_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.toggleClasses(el, names, transition, time, view, blocking)\n  },\n\n  exec_toggle_attr(e, eventType, phxEvent, view, sourceEl, el, {attr: [attr, val1, val2]}){\n    this.toggleAttr(el, attr, val1, val2)\n  },\n\n  exec_transition(e, eventType, phxEvent, view, sourceEl, el, {time, transition, blocking}){\n    this.addOrRemoveClasses(el, [], [], transition, time, view, blocking)\n  },\n\n  exec_toggle(e, eventType, phxEvent, view, sourceEl, el, {display, ins, outs, time, blocking}){\n    this.toggle(eventType, view, el, display, ins, outs, time, blocking)\n  },\n\n  exec_show(e, eventType, phxEvent, view, sourceEl, el, {display, transition, time, blocking}){\n    this.show(eventType, view, el, display, transition, time, blocking)\n  },\n\n  exec_hide(e, eventType, phxEvent, view, sourceEl, el, {display, transition, time, blocking}){\n    this.hide(eventType, view, el, display, transition, time, blocking)\n  },\n\n  exec_set_attr(e, eventType, phxEvent, view, sourceEl, el, {attr: [attr, val]}){\n    this.setOrRemoveAttrs(el, [[attr, val]], [])\n  },\n\n  exec_remove_attr(e, eventType, phxEvent, view, sourceEl, el, {attr}){\n    this.setOrRemoveAttrs(el, [], [attr])\n  },\n\n  // utils for commands\n\n  show(eventType, view, el, display, transition, time, blocking){\n    if(!this.isVisible(el)){\n      this.toggle(eventType, view, el, display, transition, null, time, blocking)\n    }\n  },\n\n  hide(eventType, view, el, display, transition, time, blocking){\n    if(this.isVisible(el)){\n      this.toggle(eventType, view, el, display, null, transition, time, blocking)\n    }\n  },\n\n  toggle(eventType, view, el, display, ins, outs, time, blocking){\n    time = time || default_transition_time\n    let [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []]\n    let [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []]\n    if(inClasses.length > 0 || outClasses.length > 0){\n      if(this.isVisible(el)){\n        let onStart = () => {\n          this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses))\n          window.requestAnimationFrame(() => {\n            this.addOrRemoveClasses(el, outClasses, [])\n            window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses))\n          })\n        }\n        let onEnd = () => {\n          this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses))\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = \"none\")\n          el.dispatchEvent(new Event(\"phx:hide-end\"))\n        }\n        el.dispatchEvent(new Event(\"phx:hide-start\"))\n        if(blocking === false){\n          onStart()\n          setTimeout(onEnd, time)\n        } else {\n          view.transition(time, onStart, onEnd)\n        }\n      } else {\n        if(eventType === \"remove\"){ return }\n        let onStart = () => {\n          this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses))\n          let stickyDisplay = display || this.defaultDisplay(el)\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = stickyDisplay)\n          window.requestAnimationFrame(() => {\n            this.addOrRemoveClasses(el, inClasses, [])\n            window.requestAnimationFrame(() => this.addOrRemoveClasses(el, inEndClasses, inStartClasses))\n          })\n        }\n        let onEnd = () => {\n          this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses))\n          el.dispatchEvent(new Event(\"phx:show-end\"))\n        }\n        el.dispatchEvent(new Event(\"phx:show-start\"))\n        if(blocking === false){\n          onStart()\n          setTimeout(onEnd, time)\n        } else {\n          view.transition(time, onStart, onEnd)\n        }\n      }\n    } else {\n      if(this.isVisible(el)){\n        window.requestAnimationFrame(() => {\n          el.dispatchEvent(new Event(\"phx:hide-start\"))\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = \"none\")\n          el.dispatchEvent(new Event(\"phx:hide-end\"))\n        })\n      } else {\n        window.requestAnimationFrame(() => {\n          el.dispatchEvent(new Event(\"phx:show-start\"))\n          let stickyDisplay = display || this.defaultDisplay(el)\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = stickyDisplay)\n          el.dispatchEvent(new Event(\"phx:show-end\"))\n        })\n      }\n    }\n  },\n\n  toggleClasses(el, classes, transition, time, view, blocking){\n    window.requestAnimationFrame(() => {\n      let [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []])\n      let newAdds = classes.filter(name => prevAdds.indexOf(name) < 0 && !el.classList.contains(name))\n      let newRemoves = classes.filter(name => prevRemoves.indexOf(name) < 0 && el.classList.contains(name))\n      this.addOrRemoveClasses(el, newAdds, newRemoves, transition, time, view, blocking)\n    })\n  },\n\n  toggleAttr(el, attr, val1, val2){\n    if(el.hasAttribute(attr)){\n      if(val2 !== undefined){\n        // toggle between val1 and val2\n        if(el.getAttribute(attr) === val1){\n          this.setOrRemoveAttrs(el, [[attr, val2]], [])\n        } else {\n          this.setOrRemoveAttrs(el, [[attr, val1]], [])\n        }\n      } else {\n        // remove attr\n        this.setOrRemoveAttrs(el, [], [attr])\n      }\n    } else {\n      this.setOrRemoveAttrs(el, [[attr, val1]], [])\n    }\n  },\n\n  addOrRemoveClasses(el, adds, removes, transition, time, view, blocking){\n    time = time || default_transition_time\n    let [transitionRun, transitionStart, transitionEnd] = transition || [[], [], []]\n    if(transitionRun.length > 0){\n      let onStart = () => {\n        this.addOrRemoveClasses(el, transitionStart, [].concat(transitionRun).concat(transitionEnd))\n        window.requestAnimationFrame(() => {\n          this.addOrRemoveClasses(el, transitionRun, [])\n          window.requestAnimationFrame(() => this.addOrRemoveClasses(el, transitionEnd, transitionStart))\n        })\n      }\n      let onDone = () => this.addOrRemoveClasses(el, adds.concat(transitionEnd), removes.concat(transitionRun).concat(transitionStart))\n      if(blocking === false){\n        onStart()\n        setTimeout(onDone, time)\n      } else {\n        view.transition(time, onStart, onDone)\n      }\n      return\n    }\n\n    window.requestAnimationFrame(() => {\n      let [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []])\n      let keepAdds = adds.filter(name => prevAdds.indexOf(name) < 0 && !el.classList.contains(name))\n      let keepRemoves = removes.filter(name => prevRemoves.indexOf(name) < 0 && el.classList.contains(name))\n      let newAdds = prevAdds.filter(name => removes.indexOf(name) < 0).concat(keepAdds)\n      let newRemoves = prevRemoves.filter(name => adds.indexOf(name) < 0).concat(keepRemoves)\n\n      DOM.putSticky(el, \"classes\", currentEl => {\n        currentEl.classList.remove(...newRemoves)\n        currentEl.classList.add(...newAdds)\n        return [newAdds, newRemoves]\n      })\n    })\n  },\n\n  setOrRemoveAttrs(el, sets, removes){\n    let [prevSets, prevRemoves] = DOM.getSticky(el, \"attrs\", [[], []])\n\n    let alteredAttrs = sets.map(([attr, _val]) => attr).concat(removes)\n    let newSets = prevSets.filter(([attr, _val]) => !alteredAttrs.includes(attr)).concat(sets)\n    let newRemoves = prevRemoves.filter((attr) => !alteredAttrs.includes(attr)).concat(removes)\n\n    DOM.putSticky(el, \"attrs\", currentEl => {\n      newRemoves.forEach(attr => currentEl.removeAttribute(attr))\n      newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val))\n      return [newSets, newRemoves]\n    })\n  },\n\n  hasAllClasses(el, classes){ return classes.every(name => el.classList.contains(name)) },\n\n  isToggledOut(el, outClasses){\n    return !this.isVisible(el) || this.hasAllClasses(el, outClasses)\n  },\n\n  filterToEls(liveSocket, sourceEl, {to}){\n    let defaultQuery = () => {\n      if(typeof(to) === \"string\"){\n        return document.querySelectorAll(to)\n      } else if(to.closest){\n        let toEl = sourceEl.closest(to.closest)\n        return toEl ? [toEl] : []\n      } else if(to.inner){\n        return sourceEl.querySelectorAll(to.inner)\n      }\n    }\n    return to ? liveSocket.jsQuerySelectorAll(sourceEl, to, defaultQuery) : [sourceEl]\n  },\n\n  defaultDisplay(el){\n    return {tr: \"table-row\", td: \"table-cell\"}[el.tagName.toLowerCase()] || \"block\"\n  },\n\n  transitionClasses(val){\n    if(!val){ return null }\n\n    let [trans, tStart, tEnd] = Array.isArray(val) ? val : [val.split(\" \"), [], []]\n    trans = Array.isArray(trans) ? trans : trans.split(\" \")\n    tStart = Array.isArray(tStart) ? tStart : tStart.split(\" \")\n    tEnd = Array.isArray(tEnd) ? tEnd : tEnd.split(\" \")\n    return [trans, tStart, tEnd]\n  }\n}\n\nexport default JS\n", "import JS from \"./js\"\nimport DOM from \"./dom\"\n\nconst HOOK_ID = \"hookId\"\n\nlet viewHookID = 1\nexport default class ViewHook {\n  static makeID(){ return viewHookID++ }\n  static elementID(el){ return DOM.private(el, HOOK_ID) }\n\n  constructor(view, el, callbacks){\n    this.el = el\n    this.__attachView(view)\n    this.__callbacks = callbacks\n    this.__listeners = new Set()\n    this.__isDisconnected = false\n    DOM.putPrivate(this.el, HOOK_ID, this.constructor.makeID())\n    for(let key in this.__callbacks){ this[key] = this.__callbacks[key] }\n  }\n\n  __attachView(view){\n    if(view){\n      this.__view = () => view\n      this.liveSocket = view.liveSocket\n    } else {\n      this.__view = () => {\n        throw new Error(`hook not yet attached to a live view: ${this.el.outerHTML}`)\n      }\n      this.liveSocket = null\n    }\n  }\n\n  __mounted(){ this.mounted && this.mounted() }\n  __updated(){ this.updated && this.updated() }\n  __beforeUpdate(){ this.beforeUpdate && this.beforeUpdate() }\n  __destroyed(){\n    this.destroyed && this.destroyed()\n    DOM.deletePrivate(this.el, HOOK_ID) // https://github.com/phoenixframework/phoenix_live_view/issues/3496\n  }\n  __reconnected(){\n    if(this.__isDisconnected){\n      this.__isDisconnected = false\n      this.reconnected && this.reconnected()\n    }\n  }\n  __disconnected(){\n    this.__isDisconnected = true\n    this.disconnected && this.disconnected()\n  }\n\n  /**\n   * Binds the hook to JS commands.\n   *\n   * @param {ViewHook} hook - The ViewHook instance to bind.\n   *\n   * @returns {Object} An object with methods to manipulate the DOM and execute JavaScript.\n   */\n  js(){\n    let hook = this\n\n    return {\n      /**\n       * Executes encoded JavaScript in the context of the hook element.\n       *\n       * @param {string} encodedJS - The encoded JavaScript string to execute.\n       */\n      exec(encodedJS){\n        hook.__view().liveSocket.execJS(hook.el, encodedJS, \"hook\")\n      },\n\n      /**\n       * Shows an element.\n       *\n       * @param {HTMLElement} el - The element to show.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.display] - The CSS display value to set. Defaults \"block\".\n       * @param {string} [opts.transition] - The CSS transition classes to set when showing.\n       * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *  Defaults `true`.\n       */\n      show(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.show(\"hook\", owner, el, opts.display, opts.transition, opts.time, opts.blocking)\n      },\n\n      /**\n       * Hides an element.\n       *\n       * @param {HTMLElement} el - The element to hide.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set when hiding.\n       * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      hide(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.hide(\"hook\", owner, el, null, opts.transition, opts.time, opts.blocking)\n      },\n\n      /**\n       * Toggles the visibility of an element.\n       *\n       * @param {HTMLElement} el - The element to toggle.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.display] - The CSS display value to set. Defaults \"block\".\n       * @param {string} [opts.in] - The CSS transition classes for showing.\n       *   Accepts either the string of classes to apply when toggling in, or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]\n       *\n       * @param {string} [opts.out] - The CSS transition classes for hiding.\n       *   Accepts either string of classes to apply when toggling out, or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       *\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      toggle(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        opts.in = JS.transitionClasses(opts.in)\n        opts.out = JS.transitionClasses(opts.out)\n        JS.toggle(\"hook\", owner, el, opts.display, opts.in, opts.out, opts.time, opts.blocking)\n      },\n\n      /**\n       * Adds CSS classes to an element.\n       *\n       * @param {HTMLElement} el - The element to add classes to.\n       * @param {string|string[]} names - The class name(s) to add.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition property to set.\n       *   Accepts a string of classes to apply when adding classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      addClass(el, names, opts = {}){\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, names, [], opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Removes CSS classes from an element.\n       *\n       * @param {HTMLElement} el - The element to remove classes from.\n       * @param {string|string[]} names - The class name(s) to remove.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set.\n       *   Accepts a string of classes to apply when removing classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      removeClass(el, names, opts = {}){\n        opts.transition = JS.transitionClasses(opts.transition)\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, [], names, opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Toggles CSS classes on an element.\n       *\n       * @param {HTMLElement} el - The element to toggle classes on.\n       * @param {string|string[]} names - The class name(s) to toggle.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set.\n       *   Accepts a string of classes to apply when toggling classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      toggleClass(el, names, opts = {}){\n        opts.transition = JS.transitionClasses(opts.transition)\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.toggleClasses(el, names, opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Applies a CSS transition to an element.\n       *\n       * @param {HTMLElement} el - The element to apply the transition to.\n       * @param {string|string[]} transition - The transition class(es) to apply.\n       *   Accepts a string of classes to apply when transitioning or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      transition(el, transition, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, [], [], JS.transitionClasses(transition), opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Sets an attribute on an element.\n       *\n       * @param {HTMLElement} el - The element to set the attribute on.\n       * @param {string} attr - The attribute name to set.\n       * @param {string} val - The value to set for the attribute.\n       */\n      setAttribute(el, attr, val){ JS.setOrRemoveAttrs(el, [[attr, val]], []) },\n\n      /**\n       * Removes an attribute from an element.\n       *\n       * @param {HTMLElement} el - The element to remove the attribute from.\n       * @param {string} attr - The attribute name to remove.\n       */\n      removeAttribute(el, attr){ JS.setOrRemoveAttrs(el, [], [attr]) },\n\n      /**\n       * Toggles an attribute on an element between two values.\n       *\n       * @param {HTMLElement} el - The element to toggle the attribute on.\n       * @param {string} attr - The attribute name to toggle.\n       * @param {string} val1 - The first value to toggle between.\n       * @param {string} val2 - The second value to toggle between.\n       */\n      toggleAttribute(el, attr, val1, val2){ JS.toggleAttr(el, attr, val1, val2) },\n    }\n  }\n\n  pushEvent(event, payload = {}, onReply){\n    if(onReply === undefined){\n      return new Promise((resolve, reject) => {\n        try {\n          const ref = this.__view().pushHookEvent(this.el, null, event, payload, (reply, _ref) => resolve(reply))\n          if(ref === false){\n            reject(new Error(\"unable to push hook event. LiveView not connected\"))\n          }\n        } catch (error){\n          reject(error)\n        }\n      })\n    }\n    return this.__view().pushHookEvent(this.el, null, event, payload, onReply)\n  }\n\n  pushEventTo(phxTarget, event, payload = {}, onReply){\n    if(onReply === undefined){\n      return new Promise((resolve, reject) => {\n        try {\n          this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n            const ref = view.pushHookEvent(this.el, targetCtx, event, payload, (reply, _ref) => resolve(reply))\n            if(ref === false){\n              reject(new Error(\"unable to push hook event. LiveView not connected\"))\n            }\n          })\n        } catch (error){\n          reject(error)\n        }\n      })\n    }\n    return this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n      return view.pushHookEvent(this.el, targetCtx, event, payload, onReply)\n    })\n  }\n\n  handleEvent(event, callback){\n    let callbackRef = (customEvent, bypass) => bypass ? event : callback(customEvent.detail)\n    window.addEventListener(`phx:${event}`, callbackRef)\n    this.__listeners.add(callbackRef)\n    return callbackRef\n  }\n\n  removeHandleEvent(callbackRef){\n    let event = callbackRef(null, true)\n    window.removeEventListener(`phx:${event}`, callbackRef)\n    this.__listeners.delete(callbackRef)\n  }\n\n  upload(name, files){\n    return this.__view().dispatchUploads(null, name, files)\n  }\n\n  uploadTo(phxTarget, name, files){\n    return this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n      view.dispatchUploads(targetCtx, name, files)\n    })\n  }\n\n  __cleanup__(){\n    this.__listeners.forEach(callbackRef => this.removeHandleEvent(callbackRef))\n  }\n}\n", "import {\n  BEFORE_UNLOAD_LOADER_TIMEOUT,\n  CHECKABLE_INPUTS,\n  CONSECUTIVE_RELOADS,\n  PHX_AUTO_RECOVER,\n  PHX_COMPONENT,\n  PHX_CONNECTED_CLASS,\n  PHX_DISABLE_WITH,\n  PHX_DISABLE_WITH_RESTORE,\n  PHX_DISABLED,\n  PHX_LOADING_CLASS,\n  PHX_ERROR_CLASS,\n  PHX_CLIENT_ERROR_CLASS,\n  PHX_SERVER_ERROR_CLASS,\n  PHX_HAS_FOCUSED,\n  PHX_HAS_SUBMITTED,\n  PHX_HOOK,\n  PHX_PARENT_ID,\n  PHX_PROGRESS,\n  PHX_READONLY,\n  PHX_REF_LOADING,\n  PHX_REF_SRC,\n  PHX_REF_LOCK,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_STATIC,\n  PHX_TRACK_STATIC,\n  PHX_TRACK_UPLOADS,\n  PHX_UPDATE,\n  PHX_UPLOAD_REF,\n  PHX_VIEW_SELECTOR,\n  PHX_MAIN,\n  PHX_MOUNTED,\n  PUSH_TIMEOUT,\n  PHX_VIEWPORT_TOP,\n  PHX_VIEWPORT_BOTTOM,\n  MAX_CHILD_JOIN_ATTEMPTS\n} from \"./constants\"\n\nimport {\n  clone,\n  closestPhxBinding,\n  isEmpty,\n  isEqualObj,\n  logError,\n  maybe,\n  isCid,\n} from \"./utils\"\n\nimport Browser from \"./browser\"\nimport DOM from \"./dom\"\nimport ElementRef from \"./element_ref\"\nimport DOMPatch from \"./dom_patch\"\nimport LiveUploader from \"./live_uploader\"\nimport Rendered from \"./rendered\"\nimport ViewHook from \"./view_hook\"\nimport JS from \"./js\"\n\nexport let prependFormDataKey = (key, prefix) => {\n  let isArray = key.endsWith(\"[]\")\n  // Remove the \"[]\" if it's an array\n  let baseKey = isArray ? key.slice(0, -2) : key\n  // Replace last occurrence of key before a closing bracket or the end with key plus suffix\n  baseKey = baseKey.replace(/([^\\[\\]]+)(\\]?$)/, `${prefix}$1$2`)\n  // Add back the \"[]\" if it was an array\n  if(isArray){ baseKey += \"[]\" }\n  return baseKey\n}\n\nlet serializeForm = (form, metadata, onlyNames = []) => {\n  const {submitter, ...meta} = metadata\n\n  // We must inject the submitter in the order that it exists in the DOM\n  // relative to other inputs. For example, for checkbox groups, the order must be maintained.\n  let injectedElement\n  if(submitter && submitter.name){\n    const input = document.createElement(\"input\")\n    input.type = \"hidden\"\n    // set the form attribute if the submitter has one;\n    // this can happen if the element is outside the actual form element\n    const formId = submitter.getAttribute(\"form\")\n    if(formId){\n      input.setAttribute(\"form\", formId)\n    }\n    input.name = submitter.name\n    input.value = submitter.value\n    submitter.parentElement.insertBefore(input, submitter)\n    injectedElement = input\n  }\n\n  const formData = new FormData(form)\n  const toRemove = []\n\n  formData.forEach((val, key, _index) => {\n    if(val instanceof File){ toRemove.push(key) }\n  })\n\n  // Cleanup after building fileData\n  toRemove.forEach(key => formData.delete(key))\n\n  const params = new URLSearchParams()\n\n  let elements = Array.from(form.elements)\n  for(let [key, val] of formData.entries()){\n    if(onlyNames.length === 0 || onlyNames.indexOf(key) >= 0){\n      let inputs = elements.filter(input => input.name === key)\n      let isUnused = !inputs.some(input => (DOM.private(input, PHX_HAS_FOCUSED) || DOM.private(input, PHX_HAS_SUBMITTED)))\n      let hidden = inputs.every(input => input.type === \"hidden\")\n      if(isUnused && !(submitter && submitter.name == key) && !hidden){\n        params.append(prependFormDataKey(key, \"_unused_\"), \"\")\n      }\n      params.append(key, val)\n    }\n  }\n\n  // remove the injected element again\n  // (it would be removed by the next dom patch anyway, but this is cleaner)\n  if(submitter && injectedElement){\n    submitter.parentElement.removeChild(injectedElement)\n  }\n\n  for(let metaKey in meta){ params.append(metaKey, meta[metaKey]) }\n\n  return params.toString()\n}\n\nexport default class View {\n  static closestView(el){\n    let liveViewEl = el.closest(PHX_VIEW_SELECTOR)\n    return liveViewEl ? DOM.private(liveViewEl, \"view\") : null\n  }\n\n  constructor(el, liveSocket, parentView, flash, liveReferer){\n    this.isDead = false\n    this.liveSocket = liveSocket\n    this.flash = flash\n    this.parent = parentView\n    this.root = parentView ? parentView.root : this\n    this.el = el\n    DOM.putPrivate(this.el, \"view\", this)\n    this.id = this.el.id\n    this.ref = 0\n    this.lastAckRef = null\n    this.childJoins = 0\n    this.loaderTimer = null\n    this.pendingDiffs = []\n    this.pendingForms = new Set()\n    this.redirect = false\n    this.href = null\n    this.joinCount = this.parent ? this.parent.joinCount - 1 : 0\n    this.joinAttempts = 0\n    this.joinPending = true\n    this.destroyed = false\n    this.joinCallback = function(onDone){ onDone && onDone() }\n    this.stopCallback = function(){ }\n    this.pendingJoinOps = this.parent ? null : []\n    this.viewHooks = {}\n    this.formSubmits = []\n    this.children = this.parent ? null : {}\n    this.root.children[this.id] = {}\n    this.formsForRecovery = {}\n    this.channel = this.liveSocket.channel(`lv:${this.id}`, () => {\n      let url = this.href && this.expandURL(this.href)\n      return {\n        redirect: this.redirect ? url : undefined,\n        url: this.redirect ? undefined : url || undefined,\n        params: this.connectParams(liveReferer),\n        session: this.getSession(),\n        static: this.getStatic(),\n        flash: this.flash,\n      }\n    })\n  }\n\n  setHref(href){ this.href = href }\n\n  setRedirect(href){\n    this.redirect = true\n    this.href = href\n  }\n\n  isMain(){ return this.el.hasAttribute(PHX_MAIN) }\n\n  connectParams(liveReferer){\n    let params = this.liveSocket.params(this.el)\n    let manifest =\n      DOM.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`)\n        .map(node => node.src || node.href).filter(url => typeof (url) === \"string\")\n\n    if(manifest.length > 0){ params[\"_track_static\"] = manifest }\n    params[\"_mounts\"] = this.joinCount\n    params[\"_mount_attempts\"] = this.joinAttempts\n    params[\"_live_referer\"] = liveReferer\n    this.joinAttempts++\n\n    return params\n  }\n\n  isConnected(){ return this.channel.canPush() }\n\n  getSession(){ return this.el.getAttribute(PHX_SESSION) }\n\n  getStatic(){\n    let val = this.el.getAttribute(PHX_STATIC)\n    return val === \"\" ? null : val\n  }\n\n  destroy(callback = function (){ }){\n    this.destroyAllChildren()\n    this.destroyed = true\n    delete this.root.children[this.id]\n    if(this.parent){ delete this.root.children[this.parent.id][this.id] }\n    clearTimeout(this.loaderTimer)\n    let onFinished = () => {\n      callback()\n      for(let id in this.viewHooks){\n        this.destroyHook(this.viewHooks[id])\n      }\n    }\n\n    DOM.markPhxChildDestroyed(this.el)\n\n    this.log(\"destroyed\", () => [\"the child has been removed from the parent\"])\n    this.channel.leave()\n      .receive(\"ok\", onFinished)\n      .receive(\"error\", onFinished)\n      .receive(\"timeout\", onFinished)\n  }\n\n  setContainerClasses(...classes){\n    this.el.classList.remove(\n      PHX_CONNECTED_CLASS,\n      PHX_LOADING_CLASS,\n      PHX_ERROR_CLASS,\n      PHX_CLIENT_ERROR_CLASS,\n      PHX_SERVER_ERROR_CLASS\n    )\n    this.el.classList.add(...classes)\n  }\n\n  showLoader(timeout){\n    clearTimeout(this.loaderTimer)\n    if(timeout){\n      this.loaderTimer = setTimeout(() => this.showLoader(), timeout)\n    } else {\n      for(let id in this.viewHooks){ this.viewHooks[id].__disconnected() }\n      this.setContainerClasses(PHX_LOADING_CLASS)\n    }\n  }\n\n  execAll(binding){\n    DOM.all(this.el, `[${binding}]`, el => this.liveSocket.execJS(el, el.getAttribute(binding)))\n  }\n\n  hideLoader(){\n    clearTimeout(this.loaderTimer)\n    this.setContainerClasses(PHX_CONNECTED_CLASS)\n    this.execAll(this.binding(\"connected\"))\n  }\n\n  triggerReconnected(){\n    for(let id in this.viewHooks){ this.viewHooks[id].__reconnected() }\n  }\n\n  log(kind, msgCallback){\n    this.liveSocket.log(this, kind, msgCallback)\n  }\n\n  transition(time, onStart, onDone = function(){}){\n    this.liveSocket.transition(time, onStart, onDone)\n  }\n\n  // calls the callback with the view and target element for the given phxTarget\n  // targets can be:\n  //  * an element itself, then it is simply passed to liveSocket.owner;\n  //  * a CID (Component ID), then we first search the component's element in the DOM\n  //  * a selector, then we search the selector in the DOM and call the callback\n  //    for each element found with the corresponding owner view\n  withinTargets(phxTarget, callback, dom = document, viewEl){\n    // in the form recovery case we search in a template fragment instead of\n    // the real dom, therefore we optionally pass dom and viewEl\n\n    if(phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement){\n      return this.liveSocket.owner(phxTarget, view => callback(view, phxTarget))\n    }\n\n    if(isCid(phxTarget)){\n      let targets = DOM.findComponentNodeList(viewEl || this.el, phxTarget)\n      if(targets.length === 0){\n        logError(`no component found matching phx-target of ${phxTarget}`)\n      } else {\n        callback(this, parseInt(phxTarget))\n      }\n    } else {\n      let targets = Array.from(dom.querySelectorAll(phxTarget))\n      if(targets.length === 0){ logError(`nothing found matching the phx-target selector \"${phxTarget}\"`) }\n      targets.forEach(target => this.liveSocket.owner(target, view => callback(view, target)))\n    }\n  }\n\n  applyDiff(type, rawDiff, callback){\n    this.log(type, () => [\"\", clone(rawDiff)])\n    let {diff, reply, events, title} = Rendered.extract(rawDiff)\n    callback({diff, reply, events})\n    if(typeof title === \"string\" || type == \"mount\"){ window.requestAnimationFrame(() => DOM.putTitle(title)) }\n  }\n\n  onJoin(resp){\n    let {rendered, container, liveview_version} = resp\n    if(container){\n      let [tag, attrs] = container\n      this.el = DOM.replaceRootContainer(this.el, tag, attrs)\n    }\n    this.childJoins = 0\n    this.joinPending = true\n    this.flash = null\n    if(this.root === this){\n      this.formsForRecovery = this.getFormsForRecovery()\n    }\n    if(this.isMain() && window.history.state === null){\n      // set initial history entry if this is the first page load\n      this.liveSocket.replaceRootHistory()\n    }\n\n    if(liveview_version !== this.liveSocket.version()){\n      console.error(`LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${liveview_version}. To avoid issues, please ensure that your assets use the same version as the server.`)\n    }\n\n    Browser.dropLocal(this.liveSocket.localStorage, window.location.pathname, CONSECUTIVE_RELOADS)\n    this.applyDiff(\"mount\", rendered, ({diff, events}) => {\n      this.rendered = new Rendered(this.id, diff)\n      let [html, streams] = this.renderContainer(null, \"join\")\n      this.dropPendingRefs()\n      this.joinCount++\n      this.joinAttempts = 0\n\n      this.maybeRecoverForms(html, () => {\n        this.onJoinComplete(resp, html, streams, events)\n      })\n    })\n  }\n\n  dropPendingRefs(){\n    DOM.all(document, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, el => {\n      el.removeAttribute(PHX_REF_LOADING)\n      el.removeAttribute(PHX_REF_SRC)\n      el.removeAttribute(PHX_REF_LOCK)\n    })\n  }\n\n  onJoinComplete({live_patch}, html, streams, events){\n    // In order to provide a better experience, we want to join\n    // all LiveViews first and only then apply their patches.\n    if(this.joinCount > 1 || (this.parent && !this.parent.isJoinPending())){\n      return this.applyJoinPatch(live_patch, html, streams, events)\n    }\n\n    // One downside of this approach is that we need to find phxChildren\n    // in the html fragment, instead of directly on the DOM. The fragment\n    // also does not include PHX_STATIC, so we need to copy it over from\n    // the DOM.\n    let newChildren = DOM.findPhxChildrenInFragment(html, this.id).filter(toEl => {\n      let fromEl = toEl.id && this.el.querySelector(`[id=\"${toEl.id}\"]`)\n      let phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC)\n      if(phxStatic){ toEl.setAttribute(PHX_STATIC, phxStatic) }\n      // set PHX_ROOT_ID to prevent events from being dispatched to the root view\n      // while the child join is still pending\n      if(fromEl){ fromEl.setAttribute(PHX_ROOT_ID, this.root.id) }\n      return this.joinChild(toEl)\n    })\n\n    if(newChildren.length === 0){\n      if(this.parent){\n        this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)])\n        this.parent.ackJoin(this)\n      } else {\n        this.onAllChildJoinsComplete()\n        this.applyJoinPatch(live_patch, html, streams, events)\n      }\n    } else {\n      this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)])\n    }\n  }\n\n  attachTrueDocEl(){\n    this.el = DOM.byId(this.id)\n    this.el.setAttribute(PHX_ROOT_ID, this.root.id)\n  }\n\n  // this is invoked for dead and live views, so we must filter by\n  // by owner to ensure we aren't duplicating hooks across disconnect\n  // and connected states. This also handles cases where hooks exist\n  // in a root layout with a LV in the body\n  execNewMounted(parent = this.el){\n    let phxViewportTop = this.binding(PHX_VIEWPORT_TOP)\n    let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM)\n    DOM.all(parent, `[${phxViewportTop}], [${phxViewportBottom}]`, hookEl => {\n      if(this.ownsElement(hookEl)){\n        DOM.maintainPrivateHooks(hookEl, hookEl, phxViewportTop, phxViewportBottom)\n        this.maybeAddNewHook(hookEl)\n      }\n    })\n    DOM.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, hookEl => {\n      if(this.ownsElement(hookEl)){\n        this.maybeAddNewHook(hookEl)\n      }\n    })\n    DOM.all(parent, `[${this.binding(PHX_MOUNTED)}]`, el => {\n      if(this.ownsElement(el)){\n        this.maybeMounted(el)\n      }\n    })\n  }\n\n  applyJoinPatch(live_patch, html, streams, events){\n    this.attachTrueDocEl()\n    let patch = new DOMPatch(this, this.el, this.id, html, streams, null)\n    patch.markPrunableContentForRemoval()\n    this.performPatch(patch, false, true)\n    this.joinNewChildren()\n    this.execNewMounted()\n\n    this.joinPending = false\n    this.liveSocket.dispatchEvents(events)\n    this.applyPendingUpdates()\n\n    if(live_patch){\n      let {kind, to} = live_patch\n      this.liveSocket.historyPatch(to, kind)\n    }\n    this.hideLoader()\n    if(this.joinCount > 1){ this.triggerReconnected() }\n    this.stopCallback()\n  }\n\n  triggerBeforeUpdateHook(fromEl, toEl){\n    this.liveSocket.triggerDOM(\"onBeforeElUpdated\", [fromEl, toEl])\n    let hook = this.getHook(fromEl)\n    let isIgnored = hook && DOM.isIgnored(fromEl, this.binding(PHX_UPDATE))\n    if(hook && !fromEl.isEqualNode(toEl) && !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))){\n      hook.__beforeUpdate()\n      return hook\n    }\n  }\n\n  maybeMounted(el){\n    let phxMounted = el.getAttribute(this.binding(PHX_MOUNTED))\n    let hasBeenInvoked = phxMounted && DOM.private(el, \"mounted\")\n    if(phxMounted && !hasBeenInvoked){\n      this.liveSocket.execJS(el, phxMounted)\n      DOM.putPrivate(el, \"mounted\", true)\n    }\n  }\n\n  maybeAddNewHook(el){\n    let newHook = this.addHook(el)\n    if(newHook){ newHook.__mounted() }\n  }\n\n  performPatch(patch, pruneCids, isJoinPatch = false){\n    let removedEls = []\n    let phxChildrenAdded = false\n    let updatedHookIds = new Set()\n\n    this.liveSocket.triggerDOM(\"onPatchStart\", [patch.targetContainer])\n\n    patch.after(\"added\", el => {\n      this.liveSocket.triggerDOM(\"onNodeAdded\", [el])\n      let phxViewportTop = this.binding(PHX_VIEWPORT_TOP)\n      let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM)\n      DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom)\n      this.maybeAddNewHook(el)\n      if(el.getAttribute){ this.maybeMounted(el) }\n    })\n\n    patch.after(\"phxChildAdded\", el => {\n      if(DOM.isPhxSticky(el)){\n        this.liveSocket.joinRootViews()\n      } else {\n        phxChildrenAdded = true\n      }\n    })\n\n    patch.before(\"updated\", (fromEl, toEl) => {\n      let hook = this.triggerBeforeUpdateHook(fromEl, toEl)\n      if(hook){ updatedHookIds.add(fromEl.id) }\n    })\n\n    patch.after(\"updated\", el => {\n      if(updatedHookIds.has(el.id)){ this.getHook(el).__updated() }\n    })\n\n    patch.after(\"discarded\", (el) => {\n      if(el.nodeType === Node.ELEMENT_NODE){ removedEls.push(el) }\n    })\n\n    patch.after(\"transitionsDiscarded\", els => this.afterElementsRemoved(els, pruneCids))\n    patch.perform(isJoinPatch)\n    this.afterElementsRemoved(removedEls, pruneCids)\n\n    this.liveSocket.triggerDOM(\"onPatchEnd\", [patch.targetContainer])\n    return phxChildrenAdded\n  }\n\n  afterElementsRemoved(elements, pruneCids){\n    let destroyedCIDs = []\n    elements.forEach(parent => {\n      let components = DOM.all(parent, `[${PHX_COMPONENT}]`)\n      let hooks = DOM.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-hook]`)\n      components.concat(parent).forEach(el => {\n        let cid = this.componentID(el)\n        if(isCid(cid) && destroyedCIDs.indexOf(cid) === -1){ destroyedCIDs.push(cid) }\n      })\n      hooks.concat(parent).forEach(hookEl => {\n        let hook = this.getHook(hookEl)\n        hook && this.destroyHook(hook)\n      })\n    })\n    // We should not pruneCids on joins. Otherwise, in case of\n    // rejoins, we may notify cids that no longer belong to the\n    // current LiveView to be removed.\n    if(pruneCids){\n      this.maybePushComponentsDestroyed(destroyedCIDs)\n    }\n  }\n\n  joinNewChildren(){\n    DOM.findPhxChildren(this.el, this.id).forEach(el => this.joinChild(el))\n  }\n\n  maybeRecoverForms(html, callback){\n    const phxChange = this.binding(\"change\")\n    const oldForms = this.root.formsForRecovery\n    // So why do we create a template element here?\n    // One way to recover forms would be to immediately apply the mount\n    // patch and then afterwards recover the forms. However, this would\n    // cause a flicker, because the mount patch would remove the form content\n    // until it is restored. Therefore LV decided to do form recovery with the\n    // raw HTML before it is applied and delay the mount patch until the form\n    // recovery events are done.\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    // because we work with a template element, we must manually copy the attributes\n    // otherwise the owner / target helpers don't work properly\n    const rootEl = template.content.firstElementChild\n    rootEl.id = this.id\n    rootEl.setAttribute(PHX_ROOT_ID, this.root.id)\n    rootEl.setAttribute(PHX_SESSION, this.getSession())\n    rootEl.setAttribute(PHX_STATIC, this.getStatic())\n    rootEl.setAttribute(PHX_PARENT_ID, this.parent ? this.parent.id : null)\n\n    // we go over all form elements in the new HTML for the LV\n    // and look for old forms in the `formsForRecovery` object;\n    // the formsForRecovery can also contain forms from child views\n    const formsToRecover =\n      // we go over all forms in the new DOM; because this is only the HTML for the current\n      // view, we can be sure that all forms are owned by this view:\n      DOM.all(template.content, \"form\")\n        // only recover forms that have an id and are in the old DOM\n        .filter(newForm => newForm.id && oldForms[newForm.id])\n        // abandon forms we already tried to recover to prevent looping a failed state\n        .filter(newForm => !this.pendingForms.has(newForm.id))\n        // only recover if the form has the same phx-change value\n        .filter(newForm => oldForms[newForm.id].getAttribute(phxChange) === newForm.getAttribute(phxChange))\n        .map(newForm => {\n          return [oldForms[newForm.id], newForm]\n        })\n\n    if(formsToRecover.length === 0){\n      return callback()\n    }\n\n    formsToRecover.forEach(([oldForm, newForm], i) => {\n      this.pendingForms.add(newForm.id)\n      // it is important to use the firstElementChild of the template content\n      // because when traversing a documentFragment using parentNode, we won't ever arrive at\n      // the fragment; as the template is always a LiveView, we can be sure that there is only\n      // one child on the root level\n      this.pushFormRecovery(oldForm, newForm, template.content.firstElementChild, () => {\n        this.pendingForms.delete(newForm.id)\n        // we only call the callback once all forms have been recovered\n        if(i === formsToRecover.length - 1){\n          callback()\n        }\n      })\n    })\n  }\n\n  getChildById(id){ return this.root.children[this.id][id] }\n\n  getDescendentByEl(el){\n    if(el.id === this.id){\n      return this\n    } else {\n      return this.children[el.getAttribute(PHX_PARENT_ID)]?.[el.id]\n    }\n  }\n\n  destroyDescendent(id){\n    for(let parentId in this.root.children){\n      for(let childId in this.root.children[parentId]){\n        if(childId === id){ return this.root.children[parentId][childId].destroy() }\n      }\n    }\n  }\n\n  joinChild(el){\n    let child = this.getChildById(el.id)\n    if(!child){\n      let view = new View(el, this.liveSocket, this)\n      this.root.children[this.id][view.id] = view\n      view.join()\n      this.childJoins++\n      return true\n    }\n  }\n\n  isJoinPending(){ return this.joinPending }\n\n  ackJoin(_child){\n    this.childJoins--\n\n    if(this.childJoins === 0){\n      if(this.parent){\n        this.parent.ackJoin(this)\n      } else {\n        this.onAllChildJoinsComplete()\n      }\n    }\n  }\n\n  onAllChildJoinsComplete(){\n    // we can clear pending form recoveries now that we've joined.\n    // They either all resolved or were abandoned\n    this.pendingForms.clear()\n    // we can also clear the formsForRecovery object to not keep old form elements around\n    this.formsForRecovery = {}\n    this.joinCallback(() => {\n      this.pendingJoinOps.forEach(([view, op]) => {\n        if(!view.isDestroyed()){ op() }\n      })\n      this.pendingJoinOps = []\n    })\n  }\n\n  update(diff, events){\n    if(this.isJoinPending() || (this.liveSocket.hasPendingLink() && this.root.isMain())){\n      return this.pendingDiffs.push({diff, events})\n    }\n\n    this.rendered.mergeDiff(diff)\n    let phxChildrenAdded = false\n\n    // When the diff only contains component diffs, then walk components\n    // and patch only the parent component containers found in the diff.\n    // Otherwise, patch entire LV container.\n    if(this.rendered.isComponentOnlyDiff(diff)){\n      this.liveSocket.time(\"component patch complete\", () => {\n        let parentCids = DOM.findExistingParentCIDs(this.el, this.rendered.componentCIDs(diff))\n        parentCids.forEach(parentCID => {\n          if(this.componentPatch(this.rendered.getComponent(diff, parentCID), parentCID)){ phxChildrenAdded = true }\n        })\n      })\n    } else if(!isEmpty(diff)){\n      this.liveSocket.time(\"full patch complete\", () => {\n        let [html, streams] = this.renderContainer(diff, \"update\")\n        let patch = new DOMPatch(this, this.el, this.id, html, streams, null)\n        phxChildrenAdded = this.performPatch(patch, true)\n      })\n    }\n\n    this.liveSocket.dispatchEvents(events)\n    if(phxChildrenAdded){ this.joinNewChildren() }\n  }\n\n  renderContainer(diff, kind){\n    return this.liveSocket.time(`toString diff (${kind})`, () => {\n      let tag = this.el.tagName\n      // Don't skip any component in the diff nor any marked as pruned\n      // (as they may have been added back)\n      let cids = diff ? this.rendered.componentCIDs(diff) : null\n      let [html, streams] = this.rendered.toString(cids)\n      return [`<${tag}>${html}</${tag}>`, streams]\n    })\n  }\n\n  componentPatch(diff, cid){\n    if(isEmpty(diff)) return false\n    let [html, streams] = this.rendered.componentToString(cid)\n    let patch = new DOMPatch(this, this.el, this.id, html, streams, cid)\n    let childrenAdded = this.performPatch(patch, true)\n    return childrenAdded\n  }\n\n  getHook(el){ return this.viewHooks[ViewHook.elementID(el)] }\n\n  addHook(el){\n    let hookElId = ViewHook.elementID(el)\n\n    if(hookElId && !this.viewHooks[hookElId]){\n      // hook created, but not attached (createHook for web component)\n      let hook = DOM.getCustomElHook(el) || logError(`no hook found for custom element: ${el.id}`)\n      this.viewHooks[hookElId] = hook\n      hook.__attachView(this)\n      return hook\n    }\n    else if(hookElId || !el.getAttribute){\n      // no hook found\n      return\n    } else {\n      // new hook found with phx-hook attribute\n      let hookName = el.getAttribute(`data-phx-${PHX_HOOK}`) || el.getAttribute(this.binding(PHX_HOOK))\n      if(hookName && !this.ownsElement(el)){ return }\n      let callbacks = this.liveSocket.getHookCallbacks(hookName)\n\n      if(callbacks){\n        if(!el.id){ logError(`no DOM ID for hook \"${hookName}\". Hooks require a unique ID on each element.`, el) }\n        let hook = new ViewHook(this, el, callbacks)\n        this.viewHooks[ViewHook.elementID(hook.el)] = hook\n        return hook\n      } else if(hookName !== null){\n        logError(`unknown hook found for \"${hookName}\"`, el)\n      }\n    }\n  }\n\n  destroyHook(hook){\n    hook.__destroyed()\n    hook.__cleanup__()\n    delete this.viewHooks[ViewHook.elementID(hook.el)]\n  }\n\n  applyPendingUpdates(){\n    this.pendingDiffs.forEach(({diff, events}) => this.update(diff, events))\n    this.pendingDiffs = []\n    this.eachChild(child => child.applyPendingUpdates())\n  }\n\n  eachChild(callback){\n    let children = this.root.children[this.id] || {}\n    for(let id in children){ callback(this.getChildById(id)) }\n  }\n\n  onChannel(event, cb){\n    this.liveSocket.onChannel(this.channel, event, resp => {\n      if(this.isJoinPending()){\n        this.root.pendingJoinOps.push([this, () => cb(resp)])\n      } else {\n        this.liveSocket.requestDOMUpdate(() => cb(resp))\n      }\n    })\n  }\n\n  bindChannel(){\n    // The diff event should be handled by the regular update operations.\n    // All other operations are queued to be applied only after join.\n    this.liveSocket.onChannel(this.channel, \"diff\", (rawDiff) => {\n      this.liveSocket.requestDOMUpdate(() => {\n        this.applyDiff(\"update\", rawDiff, ({diff, events}) => this.update(diff, events))\n      })\n    })\n    this.onChannel(\"redirect\", ({to, flash}) => this.onRedirect({to, flash}))\n    this.onChannel(\"live_patch\", (redir) => this.onLivePatch(redir))\n    this.onChannel(\"live_redirect\", (redir) => this.onLiveRedirect(redir))\n    this.channel.onError(reason => this.onError(reason))\n    this.channel.onClose(reason => this.onClose(reason))\n  }\n\n  destroyAllChildren(){ this.eachChild(child => child.destroy()) }\n\n  onLiveRedirect(redir){\n    let {to, kind, flash} = redir\n    let url = this.expandURL(to)\n    let e = new CustomEvent(\"phx:server-navigate\", {detail: {to, kind, flash}})\n    this.liveSocket.historyRedirect(e, url, kind, flash)\n  }\n\n  onLivePatch(redir){\n    let {to, kind} = redir\n    this.href = this.expandURL(to)\n    this.liveSocket.historyPatch(to, kind)\n  }\n\n  expandURL(to){\n    return to.startsWith(\"/\") ? `${window.location.protocol}//${window.location.host}${to}` : to\n  }\n\n  onRedirect({to, flash, reloadToken}){ this.liveSocket.redirect(to, flash, reloadToken) }\n\n  isDestroyed(){ return this.destroyed }\n\n  joinDead(){ this.isDead = true }\n\n  joinPush(){\n    this.joinPush = this.joinPush || this.channel.join()\n    return this.joinPush\n  }\n\n  join(callback){\n    this.showLoader(this.liveSocket.loaderTimeout)\n    this.bindChannel()\n    if(this.isMain()){\n      this.stopCallback = this.liveSocket.withPageLoading({to: this.href, kind: \"initial\"})\n    }\n    this.joinCallback = (onDone) => {\n      onDone = onDone || function(){}\n      callback ? callback(this.joinCount, onDone) : onDone()\n    }\n\n    this.wrapPush(() => this.channel.join(), {\n      ok: (resp) => this.liveSocket.requestDOMUpdate(() => this.onJoin(resp)),\n      error: (error) => this.onJoinError(error),\n      timeout: () => this.onJoinError({reason: \"timeout\"})\n    })\n  }\n\n  onJoinError(resp){\n    if(resp.reason === \"reload\"){\n      this.log(\"error\", () => [`failed mount with ${resp.status}. Falling back to page reload`, resp])\n      this.onRedirect({to: this.root.href, reloadToken: resp.token})\n      return\n    } else if(resp.reason === \"unauthorized\" || resp.reason === \"stale\"){\n      this.log(\"error\", () => [\"unauthorized live_redirect. Falling back to page request\", resp])\n      this.onRedirect({to: this.root.href})\n      return\n    }\n    if(resp.redirect || resp.live_redirect){\n      this.joinPending = false\n      this.channel.leave()\n    }\n    if(resp.redirect){ return this.onRedirect(resp.redirect) }\n    if(resp.live_redirect){ return this.onLiveRedirect(resp.live_redirect) }\n    this.log(\"error\", () => [\"unable to join\", resp])\n    if(this.isMain()){\n      this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n      if(this.liveSocket.isConnected()){ this.liveSocket.reloadWithJitter(this) }\n    } else {\n      if(this.joinAttempts >= MAX_CHILD_JOIN_ATTEMPTS){\n        // put the root review into permanent error state, but don't destroy it as it can remain active\n        this.root.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n        this.log(\"error\", () => [`giving up trying to mount after ${MAX_CHILD_JOIN_ATTEMPTS} tries`, resp])\n        this.destroy()\n      }\n      let trueChildEl = DOM.byId(this.el.id)\n      if(trueChildEl){\n        DOM.mergeAttrs(trueChildEl, this.el)\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n        this.el = trueChildEl\n      } else {\n        this.destroy()\n      }\n    }\n  }\n\n  onClose(reason){\n    if(this.isDestroyed()){ return }\n    if(this.isMain() && this.liveSocket.hasPendingLink() && reason !== \"leave\"){\n      return this.liveSocket.reloadWithJitter(this)\n    }\n    this.destroyAllChildren()\n    this.liveSocket.dropActiveElement(this)\n    // document.activeElement can be null in Internet Explorer 11\n    if(document.activeElement){ document.activeElement.blur() }\n    if(this.liveSocket.isUnloaded()){\n      this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT)\n    }\n  }\n\n  onError(reason){\n    this.onClose(reason)\n    if(this.liveSocket.isConnected()){ this.log(\"error\", () => [\"view crashed\", reason]) }\n    if(!this.liveSocket.isUnloaded()){\n      if(this.liveSocket.isConnected()){\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n      } else {\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_CLIENT_ERROR_CLASS])\n      }\n    }\n  }\n\n  displayError(classes){\n    if(this.isMain()){ DOM.dispatchEvent(window, \"phx:page-loading-start\", {detail: {to: this.href, kind: \"error\"}}) }\n    this.showLoader()\n    this.setContainerClasses(...classes)\n    this.execAll(this.binding(\"disconnected\"))\n  }\n\n  wrapPush(callerPush, receives){\n    let latency = this.liveSocket.getLatencySim()\n    let withLatency = latency ?\n      (cb) => setTimeout(() => !this.isDestroyed() && cb(), latency) :\n      (cb) => !this.isDestroyed() && cb()\n\n    withLatency(() => {\n      callerPush()\n        .receive(\"ok\", resp => withLatency(() => receives.ok && receives.ok(resp)))\n        .receive(\"error\", reason => withLatency(() => receives.error && receives.error(reason)))\n        .receive(\"timeout\", () => withLatency(() => receives.timeout && receives.timeout()))\n    })\n  }\n\n  pushWithReply(refGenerator, event, payload){\n    if(!this.isConnected()){ return Promise.reject({error: \"noconnection\"}) }\n\n    let [ref, [el], opts] = refGenerator ? refGenerator() : [null, [], {}]\n    let oldJoinCount = this.joinCount\n    let onLoadingDone = function(){}\n    if(opts.page_loading){\n      onLoadingDone = this.liveSocket.withPageLoading({kind: \"element\", target: el})\n    }\n\n    if(typeof (payload.cid) !== \"number\"){ delete payload.cid }\n\n    return new Promise((resolve, reject) => {\n      this.wrapPush(() => this.channel.push(event, payload, PUSH_TIMEOUT), {\n        ok: (resp) => {\n          if(ref !== null){ this.lastAckRef = ref }\n          let finish = (hookReply) => {\n            if(resp.redirect){ this.onRedirect(resp.redirect) }\n            if(resp.live_patch){ this.onLivePatch(resp.live_patch) }\n            if(resp.live_redirect){ this.onLiveRedirect(resp.live_redirect) }\n            onLoadingDone()\n            resolve({resp: resp, reply: hookReply})\n          }\n          if(resp.diff){\n            this.liveSocket.requestDOMUpdate(() => {\n              this.applyDiff(\"update\", resp.diff, ({diff, reply, events}) => {\n                if(ref !== null){\n                  this.undoRefs(ref, payload.event)\n                }\n                this.update(diff, events)\n                finish(reply)\n              })\n            })\n          } else {\n            if(ref !== null){ this.undoRefs(ref, payload.event) }\n            finish(null)\n          }\n        },\n        error: (reason) => reject({error: reason}),\n        timeout: () => {\n          reject({timeout: true})\n          if(this.joinCount === oldJoinCount){\n            this.liveSocket.reloadWithJitter(this, () => {\n              this.log(\"timeout\", () => [\"received timeout while communicating with server. Falling back to hard refresh for recovery\"])\n            })\n          }\n        }\n      })\n    })\n  }\n\n  undoRefs(ref, phxEvent, onlyEls){\n    if(!this.isConnected()){ return } // exit if external form triggered\n    let selector = `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`\n\n    if(onlyEls){\n      onlyEls = new Set(onlyEls)\n      DOM.all(document, selector, parent => {\n        if(onlyEls && !onlyEls.has(parent)){ return }\n        // undo any child refs within parent first\n        DOM.all(parent, selector, child => this.undoElRef(child, ref, phxEvent))\n        this.undoElRef(parent, ref, phxEvent)\n      })\n    } else {\n      DOM.all(document, selector, el => this.undoElRef(el, ref, phxEvent))\n    }\n  }\n\n  undoElRef(el, ref, phxEvent){\n    let elRef = new ElementRef(el)\n\n    elRef.maybeUndo(ref, phxEvent, clonedTree => {\n      let hook = this.triggerBeforeUpdateHook(el, clonedTree)\n      DOMPatch.patchWithClonedTree(el, clonedTree, this.liveSocket)\n      DOM.all(el, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, child => this.undoElRef(child, ref, phxEvent))\n      this.execNewMounted(el)\n      if(hook){ hook.__updated() }\n    })\n  }\n\n  refSrc(){ return this.el.id }\n\n  putRef(elements, phxEvent, eventType, opts = {}){\n    let newRef = this.ref++\n    let disableWith = this.binding(PHX_DISABLE_WITH)\n    if(opts.loading){\n      let loadingEls = DOM.all(document, opts.loading).map(el => {\n        return {el, lock: true, loading: true}\n      })\n      elements = elements.concat(loadingEls)\n    }\n\n    for(let {el, lock, loading} of elements){\n      if(!lock && !loading){ throw new Error(\"putRef requires lock or loading\") }\n      el.setAttribute(PHX_REF_SRC, this.refSrc())\n      if(loading){ el.setAttribute(PHX_REF_LOADING, newRef) }\n      if(lock){ el.setAttribute(PHX_REF_LOCK, newRef) }\n\n      if(!loading || (opts.submitter && !(el === opts.submitter || el === opts.form))){ continue }\n\n      let lockCompletePromise = new Promise(resolve => {\n        el.addEventListener(`phx:undo-lock:${newRef}`, () => resolve(detail), {once: true})\n      })\n\n      let loadingCompletePromise = new Promise(resolve => {\n        el.addEventListener(`phx:undo-loading:${newRef}`, () => resolve(detail), {once: true})\n      })\n\n      el.classList.add(`phx-${eventType}-loading`)\n      let disableText = el.getAttribute(disableWith)\n      if(disableText !== null){\n        if(!el.getAttribute(PHX_DISABLE_WITH_RESTORE)){\n          el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText)\n        }\n        if(disableText !== \"\"){ el.innerText = disableText }\n        // PHX_DISABLED could have already been set in disableForm\n        el.setAttribute(PHX_DISABLED, el.getAttribute(PHX_DISABLED) || el.disabled)\n        el.setAttribute(\"disabled\", \"\")\n      }\n\n      let detail = {\n        event: phxEvent,\n        eventType: eventType,\n        ref: newRef,\n        isLoading: loading,\n        isLocked: lock,\n        lockElements: elements.filter(({lock}) => lock).map(({el}) => el),\n        loadingElements: elements.filter(({loading}) => loading).map(({el}) => el),\n        unlock: (els) => {\n          els = Array.isArray(els) ? els : [els]\n          this.undoRefs(newRef, phxEvent, els)\n        },\n        lockComplete: lockCompletePromise,\n        loadingComplete: loadingCompletePromise,\n        lock: (lockEl) => {\n          return new Promise(resolve => {\n            if(this.isAcked(newRef)){ return resolve(detail) }\n            lockEl.setAttribute(PHX_REF_LOCK, newRef)\n            lockEl.setAttribute(PHX_REF_SRC, this.refSrc())\n            lockEl.addEventListener(`phx:lock-stop:${newRef}`, () => resolve(detail), {once: true})\n          })\n        }\n      }\n      el.dispatchEvent(new CustomEvent(\"phx:push\", {\n        detail: detail,\n        bubbles: true,\n        cancelable: false\n      }))\n      if(phxEvent){\n        el.dispatchEvent(new CustomEvent(`phx:push:${phxEvent}`, {\n          detail: detail,\n          bubbles: true,\n          cancelable: false\n        }))\n      }\n    }\n    return [newRef, elements.map(({el}) => el), opts]\n  }\n\n  isAcked(ref){ return this.lastAckRef !== null && this.lastAckRef >= ref }\n\n  componentID(el){\n    let cid = el.getAttribute && el.getAttribute(PHX_COMPONENT)\n    return cid ? parseInt(cid) : null\n  }\n\n  targetComponentID(target, targetCtx, opts = {}){\n    if(isCid(targetCtx)){ return targetCtx }\n\n    let cidOrSelector = opts.target || target.getAttribute(this.binding(\"target\"))\n    if(isCid(cidOrSelector)){\n      return parseInt(cidOrSelector)\n    } else if(targetCtx && (cidOrSelector !== null || opts.target)){\n      return this.closestComponentID(targetCtx)\n    } else {\n      return null\n    }\n  }\n\n  closestComponentID(targetCtx){\n    if(isCid(targetCtx)){\n      return targetCtx\n    } else if(targetCtx){\n      return maybe(targetCtx.closest(`[${PHX_COMPONENT}]`), el => this.ownsElement(el) && this.componentID(el))\n    } else {\n      return null\n    }\n  }\n\n  pushHookEvent(el, targetCtx, event, payload, onReply){\n    if(!this.isConnected()){\n      this.log(\"hook\", () => [\"unable to push hook event. LiveView not connected\", event, payload])\n      return false\n    }\n    let [ref, els, opts] = this.putRef([{el, loading: true, lock: true}], event, \"hook\")\n    this.pushWithReply(() => [ref, els, opts], \"event\", {\n      type: \"hook\",\n      event: event,\n      value: payload,\n      cid: this.closestComponentID(targetCtx)\n    }).then(({resp: _resp, reply: hookReply}) => onReply(hookReply, ref))\n\n    return ref\n  }\n\n  extractMeta(el, meta, value){\n    let prefix = this.binding(\"value-\")\n    for(let i = 0; i < el.attributes.length; i++){\n      if(!meta){ meta = {} }\n      let name = el.attributes[i].name\n      if(name.startsWith(prefix)){ meta[name.replace(prefix, \"\")] = el.getAttribute(name) }\n    }\n    if(el.value !== undefined && !(el instanceof HTMLFormElement)){\n      if(!meta){ meta = {} }\n      meta.value = el.value\n\n      if(el.tagName === \"INPUT\" && CHECKABLE_INPUTS.indexOf(el.type) >= 0 && !el.checked){\n        delete meta.value\n      }\n    }\n    if(value){\n      if(!meta){ meta = {} }\n      for(let key in value){ meta[key] = value[key] }\n    }\n    return meta\n  }\n\n  pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}, onReply){\n    this.pushWithReply(() => this.putRef([{el, loading: true, lock: true}], phxEvent, type, opts), \"event\", {\n      type: type,\n      event: phxEvent,\n      value: this.extractMeta(el, meta, opts.value),\n      cid: this.targetComponentID(el, targetCtx, opts)\n    }).then(({reply}) => onReply && onReply(reply))\n  }\n\n  pushFileProgress(fileEl, entryRef, progress, onReply = function (){ }){\n    this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => {\n      view.pushWithReply(null, \"progress\", {\n        event: fileEl.getAttribute(view.binding(PHX_PROGRESS)),\n        ref: fileEl.getAttribute(PHX_UPLOAD_REF),\n        entry_ref: entryRef,\n        progress: progress,\n        cid: view.targetComponentID(fileEl.form, targetCtx)\n      }).then(({resp}) => onReply(resp))\n    })\n  }\n\n  pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback){\n    if(!inputEl.form){\n      throw new Error(\"form events require the input to be inside a form\")\n    }\n\n    let uploads\n    let cid = isCid(forceCid) ? forceCid : this.targetComponentID(inputEl.form, targetCtx, opts)\n    let refGenerator = () => {\n      return this.putRef([\n        {el: inputEl, loading: true, lock: true},\n        {el: inputEl.form, loading: true, lock: true}\n      ], phxEvent, \"change\", opts)\n    }\n    let formData\n    let meta  = this.extractMeta(inputEl.form)\n    if(inputEl instanceof HTMLButtonElement){ meta.submitter = inputEl }\n    if(inputEl.getAttribute(this.binding(\"change\"))){\n      formData = serializeForm(inputEl.form, {_target: opts._target, ...meta}, [inputEl.name])\n    } else {\n      formData = serializeForm(inputEl.form, {_target: opts._target, ...meta})\n    }\n    if(DOM.isUploadInput(inputEl) && inputEl.files && inputEl.files.length > 0){\n      LiveUploader.trackFiles(inputEl, Array.from(inputEl.files))\n    }\n    uploads = LiveUploader.serializeUploads(inputEl)\n\n    let event = {\n      type: \"form\",\n      event: phxEvent,\n      value: formData,\n      uploads: uploads,\n      cid: cid\n    }\n    this.pushWithReply(refGenerator, \"event\", event).then(({resp}) => {\n      if(DOM.isUploadInput(inputEl) && DOM.isAutoUpload(inputEl)){\n        if(LiveUploader.filesAwaitingPreflight(inputEl).length > 0){\n          let [ref, _els] = refGenerator()\n          this.undoRefs(ref, phxEvent, [inputEl.form])\n          this.uploadFiles(inputEl.form, phxEvent, targetCtx, ref, cid, (_uploads) => {\n            callback && callback(resp)\n            this.triggerAwaitingSubmit(inputEl.form, phxEvent)\n            this.undoRefs(ref, phxEvent)\n          })\n        }\n      } else {\n        callback && callback(resp)\n      }\n    })\n  }\n\n  triggerAwaitingSubmit(formEl, phxEvent){\n    let awaitingSubmit = this.getScheduledSubmit(formEl)\n    if(awaitingSubmit){\n      let [_el, _ref, _opts, callback] = awaitingSubmit\n      this.cancelSubmit(formEl, phxEvent)\n      callback()\n    }\n  }\n\n  getScheduledSubmit(formEl){\n    return this.formSubmits.find(([el, _ref, _opts, _callback]) => el.isSameNode(formEl))\n  }\n\n  scheduleSubmit(formEl, ref, opts, callback){\n    if(this.getScheduledSubmit(formEl)){ return true }\n    this.formSubmits.push([formEl, ref, opts, callback])\n  }\n\n  cancelSubmit(formEl, phxEvent){\n    this.formSubmits = this.formSubmits.filter(([el, ref, _opts, _callback]) => {\n      if(el.isSameNode(formEl)){\n        this.undoRefs(ref, phxEvent)\n        return false\n      } else {\n        return true\n      }\n    })\n  }\n\n  disableForm(formEl, phxEvent, opts = {}){\n    let filterIgnored = el => {\n      let userIgnored = closestPhxBinding(el, `${this.binding(PHX_UPDATE)}=ignore`, el.form)\n      return !(userIgnored || closestPhxBinding(el, \"data-phx-update=ignore\", el.form))\n    }\n    let filterDisables = el => {\n      return el.hasAttribute(this.binding(PHX_DISABLE_WITH))\n    }\n    let filterButton = el => el.tagName == \"BUTTON\"\n\n    let filterInput = el => [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(el.tagName)\n\n    let formElements = Array.from(formEl.elements)\n    let disables = formElements.filter(filterDisables)\n    let buttons = formElements.filter(filterButton).filter(filterIgnored)\n    let inputs = formElements.filter(filterInput).filter(filterIgnored)\n\n    buttons.forEach(button => {\n      button.setAttribute(PHX_DISABLED, button.disabled)\n      button.disabled = true\n    })\n    inputs.forEach(input => {\n      input.setAttribute(PHX_READONLY, input.readOnly)\n      input.readOnly = true\n      if(input.files){\n        input.setAttribute(PHX_DISABLED, input.disabled)\n        input.disabled = true\n      }\n    })\n    let formEls = disables.concat(buttons).concat(inputs).map(el => {\n      return {el, loading: true, lock: true}\n    })\n\n    // we reverse the order so form children are already locked by the time\n    // the form is locked\n    let els = [{el: formEl, loading: true, lock: false}].concat(formEls).reverse()\n    return this.putRef(els, phxEvent, \"submit\", opts)\n  }\n\n  pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply){\n    let refGenerator = () => this.disableForm(formEl, phxEvent, {\n      ...opts,\n      form: formEl,\n      submitter: submitter\n    })\n    let cid = this.targetComponentID(formEl, targetCtx)\n    if(LiveUploader.hasUploadsInProgress(formEl)){\n      let [ref, _els] = refGenerator()\n      let push = () => this.pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply)\n      return this.scheduleSubmit(formEl, ref, opts, push)\n    } else if(LiveUploader.inputsAwaitingPreflight(formEl).length > 0){\n      let [ref, els] = refGenerator()\n      let proxyRefGen = () => [ref, els, opts]\n      this.uploadFiles(formEl, phxEvent, targetCtx, ref, cid, (_uploads) => {\n        // if we still having pending preflights it means we have invalid entries\n        // and the phx-submit cannot be completed\n        if(LiveUploader.inputsAwaitingPreflight(formEl).length > 0){\n          return this.undoRefs(ref, phxEvent)\n        }\n        let meta = this.extractMeta(formEl)\n        let formData = serializeForm(formEl, {submitter, ...meta})\n        this.pushWithReply(proxyRefGen, \"event\", {\n          type: \"form\",\n          event: phxEvent,\n          value: formData,\n          cid: cid\n        }).then(({resp}) => onReply(resp))\n      })\n    } else if(!(formEl.hasAttribute(PHX_REF_SRC) && formEl.classList.contains(\"phx-submit-loading\"))){\n      let meta = this.extractMeta(formEl)\n      let formData = serializeForm(formEl, {submitter, ...meta})\n      this.pushWithReply(refGenerator, \"event\", {\n        type: \"form\",\n        event: phxEvent,\n        value: formData,\n        cid: cid\n      }).then(({resp}) => onReply(resp))\n    }\n  }\n\n  uploadFiles(formEl, phxEvent, targetCtx, ref, cid, onComplete){\n    let joinCountAtUpload = this.joinCount\n    let inputEls = LiveUploader.activeFileInputs(formEl)\n    let numFileInputsInProgress = inputEls.length\n\n    // get each file input\n    inputEls.forEach(inputEl => {\n      let uploader = new LiveUploader(inputEl, this, () => {\n        numFileInputsInProgress--\n        if(numFileInputsInProgress === 0){ onComplete() }\n      })\n\n      let entries = uploader.entries().map(entry => entry.toPreflightPayload())\n\n      if(entries.length === 0){\n        numFileInputsInProgress--\n        return\n      }\n\n      let payload = {\n        ref: inputEl.getAttribute(PHX_UPLOAD_REF),\n        entries: entries,\n        cid: this.targetComponentID(inputEl.form, targetCtx)\n      }\n\n      this.log(\"upload\", () => [\"sending preflight request\", payload])\n\n      this.pushWithReply(null, \"allow_upload\", payload).then(({resp}) => {\n        this.log(\"upload\", () => [\"got preflight response\", resp])\n        // the preflight will reject entries beyond the max entries\n        // so we error and cancel entries on the client that are missing from the response\n        uploader.entries().forEach(entry => {\n          if(resp.entries && !resp.entries[entry.ref]){\n            this.handleFailedEntryPreflight(entry.ref, \"failed preflight\", uploader)\n          }\n        })\n        // for auto uploads, we may have an empty entries response from the server\n        // for form submits that contain invalid entries\n        if(resp.error || Object.keys(resp.entries).length === 0){\n          this.undoRefs(ref, phxEvent)\n          let errors = resp.error || []\n          errors.map(([entry_ref, reason]) => {\n            this.handleFailedEntryPreflight(entry_ref, reason, uploader)\n          })\n        } else {\n          let onError = (callback) => {\n            this.channel.onError(() => {\n              if(this.joinCount === joinCountAtUpload){ callback() }\n            })\n          }\n          uploader.initAdapterUpload(resp, onError, this.liveSocket)\n        }\n      })\n    })\n  }\n\n  handleFailedEntryPreflight(uploadRef, reason, uploader){\n    if(uploader.isAutoUpload()){\n      // uploadRef may be top level upload config ref or entry ref\n      let entry = uploader.entries().find(entry => entry.ref === uploadRef.toString())\n      if(entry){ entry.cancel() }\n    } else {\n      uploader.entries().map(entry => entry.cancel())\n    }\n    this.log(\"upload\", () => [`error for entry ${uploadRef}`, reason])\n  }\n\n  dispatchUploads(targetCtx, name, filesOrBlobs){\n    let targetElement = this.targetCtxElement(targetCtx) || this.el\n    let inputs = DOM.findUploadInputs(targetElement).filter(el => el.name === name)\n    if(inputs.length === 0){ logError(`no live file inputs found matching the name \"${name}\"`) }\n    else if(inputs.length > 1){ logError(`duplicate live file inputs found matching the name \"${name}\"`) }\n    else { DOM.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, {detail: {files: filesOrBlobs}}) }\n  }\n\n  targetCtxElement(targetCtx){\n    if(isCid(targetCtx)){\n      let [target] = DOM.findComponentNodeList(this.el, targetCtx)\n      return target\n    } else if(targetCtx){\n      return targetCtx\n    } else {\n      return null\n    }\n  }\n\n  pushFormRecovery(oldForm, newForm, templateDom, callback){\n    // we are only recovering forms inside the current view, therefore it is safe to\n    // skip withinOwners here and always use this when referring to the view\n    const phxChange = this.binding(\"change\")\n    const phxTarget = newForm.getAttribute(this.binding(\"target\")) || newForm\n    const phxEvent = newForm.getAttribute(this.binding(PHX_AUTO_RECOVER)) || newForm.getAttribute(this.binding(\"change\"))\n    const inputs = Array.from(oldForm.elements).filter(el => DOM.isFormInput(el) && el.name && !el.hasAttribute(phxChange))\n    if(inputs.length === 0){ return }\n\n    // we must clear tracked uploads before recovery as they no longer have valid refs\n    inputs.forEach(input => input.hasAttribute(PHX_UPLOAD_REF) && LiveUploader.clearFiles(input))\n    // pushInput assumes that there is a source element that initiated the change;\n    // because this is not the case when we recover forms, we provide the first input we find\n    let input = inputs.find(el => el.type !== \"hidden\") || inputs[0]\n\n    // in the case that there are multiple targets, we count the number of pending recovery events\n    // and only call the callback once all events have been processed\n    let pending = 0\n    // withinTargets(phxTarget, callback, dom, viewEl)\n    this.withinTargets(phxTarget, (targetView, targetCtx) => {\n      const cid = this.targetComponentID(newForm, targetCtx)\n      pending++\n      let e = new CustomEvent(\"phx:form-recovery\", {detail: {sourceElement: oldForm}})\n      JS.exec(e, \"change\", phxEvent, this, input, [\"push\", {\n        _target: input.name,\n        targetView,\n        targetCtx,\n        newCid: cid,\n        callback: () => {\n          pending--\n          if(pending === 0){ callback() }\n        }\n      }])\n    }, templateDom, templateDom)\n  }\n\n  pushLinkPatch(e, href, targetEl, callback){\n    let linkRef = this.liveSocket.setPendingLink(href)\n    // only add loading states if event is trusted (it was triggered by user, such as click) and\n    // it's not a forward/back navigation from popstate\n    let loading = e.isTrusted && e.type !== \"popstate\"\n    let refGen = targetEl ? () => this.putRef([{el: targetEl, loading: loading, lock: true}], null, \"click\") : null\n    let fallback = () => this.liveSocket.redirect(window.location.href)\n    let url = href.startsWith(\"/\") ? `${location.protocol}//${location.host}${href}` : href\n\n    this.pushWithReply(refGen, \"live_patch\", {url}).then(\n      ({resp}) => {\n        this.liveSocket.requestDOMUpdate(() => {\n          if(resp.link_redirect){\n            this.liveSocket.replaceMain(href, null, callback, linkRef)\n          } else {\n            if(this.liveSocket.commitPendingLink(linkRef)){\n              this.href = href\n            }\n            this.applyPendingUpdates()\n            callback && callback(linkRef)\n          }\n        })\n      },\n      ({error: _error, timeout: _timeout}) => fallback()\n    )\n  }\n\n  getFormsForRecovery(){\n    if(this.joinCount === 0){ return {} }\n\n    let phxChange = this.binding(\"change\")\n\n    return DOM.all(this.el, `form[${phxChange}]`)\n      .filter(form => form.id)\n      .filter(form => form.elements.length > 0)\n      .filter(form => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== \"ignore\")\n      .map(form => form.cloneNode(true))\n      .reduce((acc, form) => {\n        acc[form.id] = form\n        return acc\n      }, {})\n  }\n\n  maybePushComponentsDestroyed(destroyedCIDs){\n    let willDestroyCIDs = destroyedCIDs.filter(cid => {\n      return DOM.findComponentNodeList(this.el, cid).length === 0\n    })\n\n    if(willDestroyCIDs.length > 0){\n      // we must reset the render change tracking for cids that\n      // could be added back from the server so we don't skip them\n      willDestroyCIDs.forEach(cid => this.rendered.resetRender(cid))\n\n      this.pushWithReply(null, \"cids_will_destroy\", {cids: willDestroyCIDs}).then(() => {\n        // we must wait for pending transitions to complete before determining\n        // if the cids were added back to the DOM in the meantime (#3139)\n        this.liveSocket.requestDOMUpdate(() => {\n          // See if any of the cids we wanted to destroy were added back,\n          // if they were added back, we don't actually destroy them.\n          let completelyDestroyCIDs = willDestroyCIDs.filter(cid => {\n            return DOM.findComponentNodeList(this.el, cid).length === 0\n          })\n\n          if(completelyDestroyCIDs.length > 0){\n            this.pushWithReply(null, \"cids_destroyed\", {cids: completelyDestroyCIDs}).then(({resp}) => {\n              this.rendered.pruneCIDs(resp.cids)\n            })\n          }\n        })\n      })\n    }\n  }\n\n  ownsElement(el){\n    let parentViewEl = el.closest(PHX_VIEW_SELECTOR)\n    return el.getAttribute(PHX_PARENT_ID) === this.id ||\n      (parentViewEl && parentViewEl.id === this.id) ||\n      (!parentViewEl && this.isDead)\n  }\n\n  submitForm(form, targetCtx, phxEvent, submitter, opts = {}){\n    DOM.putPrivate(form, PHX_HAS_SUBMITTED, true)\n    const inputs = Array.from(form.elements)\n    inputs.forEach(input => DOM.putPrivate(input, PHX_HAS_SUBMITTED, true))\n    this.liveSocket.blurActiveElement(this)\n    this.pushFormSubmit(form, targetCtx, phxEvent, submitter, opts, () => {\n      this.liveSocket.restorePreviouslyActiveFocus()\n    })\n  }\n\n  binding(kind){ return this.liveSocket.binding(kind) }\n}\n", "/** Initializes the LiveSocket\n *\n *\n * @param {string} endPoint - The string WebSocket endpoint, ie, `\"wss://example.com/live\"`,\n *                                               `\"/live\"` (inherited host & protocol)\n * @param {Phoenix.Socket} socket - the required Phoenix Socket class imported from \"phoenix\". For example:\n *\n *     import {Socket} from \"phoenix\"\n *     import {LiveSocket} from \"phoenix_live_view\"\n *     let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n *\n * @param {Object} [opts] - Optional configuration. Outside of keys listed below, all\n * configuration is passed directly to the Phoenix Socket constructor.\n * @param {Object} [opts.defaults] - The optional defaults to use for various bindings,\n * such as `phx-debounce`. Supports the following keys:\n *\n *   - debounce - the millisecond phx-debounce time. Defaults 300\n *   - throttle - the millisecond phx-throttle time. Defaults 300\n *\n * @param {Function} [opts.params] - The optional function for passing connect params.\n * The function receives the element associated with a given LiveView. For example:\n *\n *     (el) => {view: el.getAttribute(\"data-my-view-name\", token: window.myToken}\n *\n * @param {string} [opts.bindingPrefix] - The optional prefix to use for all phx DOM annotations.\n * Defaults to \"phx-\".\n * @param {Object} [opts.hooks] - The optional object for referencing LiveView hook callbacks.\n * @param {Object} [opts.uploaders] - The optional object for referencing LiveView uploader callbacks.\n * @param {integer} [opts.loaderTimeout] - The optional delay in milliseconds to wait before apply\n * loading states.\n * @param {integer} [opts.maxReloads] - The maximum reloads before entering failsafe mode.\n * @param {integer} [opts.reloadJitterMin] - The minimum time between normal reload attempts.\n * @param {integer} [opts.reloadJitterMax] - The maximum time between normal reload attempts.\n * @param {integer} [opts.failsafeJitter] - The time between reload attempts in failsafe mode.\n * @param {Function} [opts.viewLogger] - The optional function to log debug information. For example:\n *\n *     (view, kind, msg, obj) => console.log(`${view.id} ${kind}: ${msg} - `, obj)\n *\n * @param {Object} [opts.metadata] - The optional object mapping event names to functions for\n * populating event metadata. For example:\n *\n *     metadata: {\n *       click: (e, el) => {\n *         return {\n *           ctrlKey: e.ctrlKey,\n *           metaKey: e.metaKey,\n *           detail: e.detail || 1,\n *         }\n *       },\n *       keydown: (e, el) => {\n *         return {\n *           key: e.key,\n *           ctrlKey: e.ctrlKey,\n *           metaKey: e.metaKey,\n *           shiftKey: e.shiftKey\n *         }\n *       }\n *     }\n * @param {Object} [opts.sessionStorage] - An optional Storage compatible object\n * Useful when LiveView won't have access to `sessionStorage`.  For example, This could\n * happen if a site loads a cross-domain LiveView in an iframe.  Example usage:\n *\n *     class InMemoryStorage {\n *       constructor() { this.storage = {} }\n *       getItem(keyName) { return this.storage[keyName] || null }\n *       removeItem(keyName) { delete this.storage[keyName] }\n *       setItem(keyName, keyValue) { this.storage[keyName] = keyValue }\n *     }\n *\n * @param {Object} [opts.localStorage] - An optional Storage compatible object\n * Useful for when LiveView won't have access to `localStorage`.\n * See `opts.sessionStorage` for examples.\n*/\n\nimport {\n  BINDING_PREFIX,\n  CONSECUTIVE_RELOADS,\n  DEFAULTS,\n  FAILSAFE_JITTER,\n  LOADER_TIMEOUT,\n  MAX_RELOADS,\n  PHX_DEBOUNCE,\n  PHX_DROP_TARGET,\n  PHX_HAS_FOCUSED,\n  PHX_KEY,\n  PHX_LINK_STATE,\n  PHX_LIVE_LINK,\n  PHX_LV_DEBUG,\n  PHX_LV_LATENCY_SIM,\n  PHX_LV_PROFILE,\n  PHX_LV_HISTORY_POSITION,\n  PHX_MAIN,\n  PHX_PARENT_ID,\n  PHX_VIEW_SELECTOR,\n  PHX_ROOT_ID,\n  PHX_THROTTLE,\n  PHX_TRACK_UPLOADS,\n  PHX_SESSION,\n  RELOAD_JITTER_MIN,\n  RELOAD_JITTER_MAX,\n  PHX_REF_SRC,\n  PHX_RELOAD_STATUS\n} from \"./constants\"\n\nimport {\n  clone,\n  closestPhxBinding,\n  closure,\n  debug,\n  maybe\n} from \"./utils\"\n\nimport Browser from \"./browser\"\nimport DOM from \"./dom\"\nimport Hooks from \"./hooks\"\nimport LiveUploader from \"./live_uploader\"\nimport View from \"./view\"\nimport JS from \"./js\"\n\nexport let isUsedInput = (el) => DOM.isUsedInput(el)\n\nexport default class LiveSocket {\n  constructor(url, phxSocket, opts = {}){\n    this.unloaded = false\n    if(!phxSocket || phxSocket.constructor.name === \"Object\"){\n      throw new Error(`\n      a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:\n\n          import {Socket} from \"phoenix\"\n          import {LiveSocket} from \"phoenix_live_view\"\n          let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n      `)\n    }\n    this.socket = new phxSocket(url, opts)\n    this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX\n    this.opts = opts\n    this.params = closure(opts.params || {})\n    this.viewLogger = opts.viewLogger\n    this.metadataCallbacks = opts.metadata || {}\n    this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {})\n    this.activeElement = null\n    this.prevActive = null\n    this.silenced = false\n    this.main = null\n    this.outgoingMainEl = null\n    this.clickStartedAtTarget = null\n    this.linkRef = 1\n    this.roots = {}\n    this.href = window.location.href\n    this.pendingLink = null\n    this.currentLocation = clone(window.location)\n    this.hooks = opts.hooks || {}\n    this.uploaders = opts.uploaders || {}\n    this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT\n    this.reloadWithJitterTimer = null\n    this.maxReloads = opts.maxReloads || MAX_RELOADS\n    this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN\n    this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX\n    this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER\n    this.localStorage = opts.localStorage || window.localStorage\n    this.sessionStorage = opts.sessionStorage || window.sessionStorage\n    this.boundTopLevelEvents = false\n    this.boundEventNames = new Set()\n    this.serverCloseRef = null\n    this.domCallbacks = Object.assign({\n      jsQuerySelectorAll: null,\n      onPatchStart: closure(),\n      onPatchEnd: closure(),\n      onNodeAdded: closure(),\n      onBeforeElUpdated: closure()},\n    opts.dom || {})\n    this.transitions = new TransitionSet()\n    this.currentHistoryPosition = parseInt(this.sessionStorage.getItem(PHX_LV_HISTORY_POSITION)) || 0\n    window.addEventListener(\"pagehide\", _e => {\n      this.unloaded = true\n    })\n    this.socket.onOpen(() => {\n      if(this.isUnloaded()){\n        // reload page if being restored from back/forward cache and browser does not emit \"pageshow\"\n        window.location.reload()\n      }\n    })\n  }\n\n  // public\n\n  version(){ return LV_VSN }\n\n  isProfileEnabled(){ return this.sessionStorage.getItem(PHX_LV_PROFILE) === \"true\" }\n\n  isDebugEnabled(){ return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"true\" }\n\n  isDebugDisabled(){ return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"false\" }\n\n  enableDebug(){ this.sessionStorage.setItem(PHX_LV_DEBUG, \"true\") }\n\n  enableProfiling(){ this.sessionStorage.setItem(PHX_LV_PROFILE, \"true\") }\n\n  disableDebug(){ this.sessionStorage.setItem(PHX_LV_DEBUG, \"false\") }\n\n  disableProfiling(){ this.sessionStorage.removeItem(PHX_LV_PROFILE) }\n\n  enableLatencySim(upperBoundMs){\n    this.enableDebug()\n    console.log(\"latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable\")\n    this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs)\n  }\n\n  disableLatencySim(){ this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM) }\n\n  getLatencySim(){\n    let str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM)\n    return str ? parseInt(str) : null\n  }\n\n  getSocket(){ return this.socket }\n\n  connect(){\n    // enable debug by default if on localhost and not explicitly disabled\n    if(window.location.hostname === \"localhost\" && !this.isDebugDisabled()){ this.enableDebug() }\n    let doConnect = () => {\n      this.resetReloadStatus()\n      if(this.joinRootViews()){\n        this.bindTopLevelEvents()\n        this.socket.connect()\n      } else if(this.main){\n        this.socket.connect()\n      } else {\n        this.bindTopLevelEvents({dead: true})\n      }\n      this.joinDeadView()\n    }\n    if([\"complete\", \"loaded\", \"interactive\"].indexOf(document.readyState) >= 0){\n      doConnect()\n    } else {\n      document.addEventListener(\"DOMContentLoaded\", () => doConnect())\n    }\n  }\n\n  disconnect(callback){\n    clearTimeout(this.reloadWithJitterTimer)\n    // remove the socket close listener to avoid trying to handle\n    // a server close event when it is actually caused by us disconnecting\n    if(this.serverCloseRef){\n      this.socket.off(this.serverCloseRef)\n      this.serverCloseRef = null\n    }\n    this.socket.disconnect(callback)\n  }\n\n  replaceTransport(transport){\n    clearTimeout(this.reloadWithJitterTimer)\n    this.socket.replaceTransport(transport)\n    this.connect()\n  }\n\n  execJS(el, encodedJS, eventType = null){\n    let e = new CustomEvent(\"phx:exec\", {detail: {sourceElement: el}})\n    this.owner(el, view => JS.exec(e, eventType, encodedJS, view, el))\n  }\n\n  // private\n\n  execJSHookPush(el, phxEvent, data, callback){\n    this.withinOwners(el, view => {\n      let e = new CustomEvent(\"phx:exec\", {detail: {sourceElement: el}})\n      JS.exec(e, \"hook\", phxEvent, view, el, [\"push\", {data, callback}])\n    })\n  }\n\n  unload(){\n    if(this.unloaded){ return }\n    if(this.main && this.isConnected()){ this.log(this.main, \"socket\", () => [\"disconnect for page nav\"]) }\n    this.unloaded = true\n    this.destroyAllViews()\n    this.disconnect()\n  }\n\n  triggerDOM(kind, args){ this.domCallbacks[kind](...args) }\n\n  time(name, func){\n    if(!this.isProfileEnabled() || !console.time){ return func() }\n    console.time(name)\n    let result = func()\n    console.timeEnd(name)\n    return result\n  }\n\n  log(view, kind, msgCallback){\n    if(this.viewLogger){\n      let [msg, obj] = msgCallback()\n      this.viewLogger(view, kind, msg, obj)\n    } else if(this.isDebugEnabled()){\n      let [msg, obj] = msgCallback()\n      debug(view, kind, msg, obj)\n    }\n  }\n\n  requestDOMUpdate(callback){\n    this.transitions.after(callback)\n  }\n\n  transition(time, onStart, onDone = function(){}){\n    this.transitions.addTransition(time, onStart, onDone)\n  }\n\n  onChannel(channel, event, cb){\n    channel.on(event, data => {\n      let latency = this.getLatencySim()\n      if(!latency){\n        cb(data)\n      } else {\n        setTimeout(() => cb(data), latency)\n      }\n    })\n  }\n\n  reloadWithJitter(view, log){\n    clearTimeout(this.reloadWithJitterTimer)\n    this.disconnect()\n    let minMs = this.reloadJitterMin\n    let maxMs = this.reloadJitterMax\n    let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs\n    let tries = Browser.updateLocal(this.localStorage, window.location.pathname, CONSECUTIVE_RELOADS, 0, count => count + 1)\n    if(tries >= this.maxReloads){\n      afterMs = this.failsafeJitter\n    }\n    this.reloadWithJitterTimer = setTimeout(() => {\n      // if view has recovered, such as transport replaced, then cancel\n      if(view.isDestroyed() || view.isConnected()){ return }\n      view.destroy()\n      log ? log() : this.log(view, \"join\", () => [`encountered ${tries} consecutive reloads`])\n      if(tries >= this.maxReloads){\n        this.log(view, \"join\", () => [`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`])\n      }\n      if(this.hasPendingLink()){\n        window.location = this.pendingLink\n      } else {\n        window.location.reload()\n      }\n    }, afterMs)\n  }\n\n  getHookCallbacks(name){\n    return name && name.startsWith(\"Phoenix.\") ? Hooks[name.split(\".\")[1]] : this.hooks[name]\n  }\n\n  isUnloaded(){ return this.unloaded }\n\n  isConnected(){ return this.socket.isConnected() }\n\n  getBindingPrefix(){ return this.bindingPrefix }\n\n  binding(kind){ return `${this.getBindingPrefix()}${kind}` }\n\n  channel(topic, params){ return this.socket.channel(topic, params) }\n\n  joinDeadView(){\n    let body = document.body\n    if(body && !this.isPhxView(body) && !this.isPhxView(document.firstElementChild)){\n      let view = this.newRootView(body)\n      view.setHref(this.getHref())\n      view.joinDead()\n      if(!this.main){ this.main = view }\n      window.requestAnimationFrame(() => {\n        view.execNewMounted()\n        // restore scroll position when navigating from an external / non-live page\n        this.maybeScroll(history.state?.scroll)\n      })\n    }\n  }\n\n  joinRootViews(){\n    let rootsFound = false\n    DOM.all(document, `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, rootEl => {\n      if(!this.getRootById(rootEl.id)){\n        let view = this.newRootView(rootEl)\n        // stickies cannot be mounted at the router and therefore should not\n        // get a href set on them\n        if(!DOM.isPhxSticky(rootEl)){ view.setHref(this.getHref()) }\n        view.join()\n        if(rootEl.hasAttribute(PHX_MAIN)){ this.main = view }\n      }\n      rootsFound = true\n    })\n    return rootsFound\n  }\n\n  redirect(to, flash, reloadToken){\n    if(reloadToken){ Browser.setCookie(PHX_RELOAD_STATUS, reloadToken, 60) }\n    this.unload()\n    Browser.redirect(to, flash)\n  }\n\n  replaceMain(href, flash, callback = null, linkRef = this.setPendingLink(href)){\n    let liveReferer = this.currentLocation.href\n    this.outgoingMainEl = this.outgoingMainEl || this.main.el\n    let removeEls = DOM.all(this.outgoingMainEl, `[${this.binding(\"remove\")}]`)\n    let newMainEl = DOM.cloneNode(this.outgoingMainEl, \"\")\n    this.main.showLoader(this.loaderTimeout)\n    this.main.destroy()\n\n    this.main = this.newRootView(newMainEl, flash, liveReferer)\n    this.main.setRedirect(href)\n    this.transitionRemoves(removeEls, true)\n    this.main.join((joinCount, onDone) => {\n      if(joinCount === 1 && this.commitPendingLink(linkRef)){\n        this.requestDOMUpdate(() => {\n          // remove phx-remove els right before we replace the main element\n          removeEls.forEach(el => el.remove())\n          DOM.findPhxSticky(document).forEach(el => newMainEl.appendChild(el))\n          this.outgoingMainEl.replaceWith(newMainEl)\n          this.outgoingMainEl = null\n          callback && callback(linkRef)\n          onDone()\n        })\n      }\n    })\n  }\n\n  transitionRemoves(elements, skipSticky, callback){\n    let removeAttr = this.binding(\"remove\")\n    if(skipSticky){\n      const stickies = DOM.findPhxSticky(document) || []\n      elements = elements.filter(el => !DOM.isChildOfAny(el, stickies))\n    }\n    let silenceEvents = (e) => {\n      e.preventDefault()\n      e.stopImmediatePropagation()\n    }\n    elements.forEach(el => {\n      // prevent all listeners we care about from bubbling to window\n      // since we are removing the element\n      for(let event of this.boundEventNames){\n        el.addEventListener(event, silenceEvents, true)\n      }\n      this.execJS(el, el.getAttribute(removeAttr), \"remove\")\n    })\n    // remove the silenced listeners when transitions are done incase the element is re-used\n    // and call caller's callback as soon as we are done with transitions\n    this.requestDOMUpdate(() => {\n      elements.forEach(el => {\n        for(let event of this.boundEventNames){\n          el.removeEventListener(event, silenceEvents, true)\n        }\n      })\n      callback && callback()\n    })\n  }\n\n  isPhxView(el){ return el.getAttribute && el.getAttribute(PHX_SESSION) !== null }\n\n  newRootView(el, flash, liveReferer){\n    let view = new View(el, this, null, flash, liveReferer)\n    this.roots[view.id] = view\n    return view\n  }\n\n  owner(childEl, callback){\n    let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), el => this.getViewByEl(el)) || this.main\n    return view && callback ? callback(view) : view\n  }\n\n  withinOwners(childEl, callback){\n    this.owner(childEl, view => callback(view, childEl))\n  }\n\n  getViewByEl(el){\n    let rootId = el.getAttribute(PHX_ROOT_ID)\n    return maybe(this.getRootById(rootId), root => root.getDescendentByEl(el))\n  }\n\n  getRootById(id){ return this.roots[id] }\n\n  destroyAllViews(){\n    for(let id in this.roots){\n      this.roots[id].destroy()\n      delete this.roots[id]\n    }\n    this.main = null\n  }\n\n  destroyViewByEl(el){\n    let root = this.getRootById(el.getAttribute(PHX_ROOT_ID))\n    if(root && root.id === el.id){\n      root.destroy()\n      delete this.roots[root.id]\n    } else if(root){\n      root.destroyDescendent(el.id)\n    }\n  }\n\n  getActiveElement(){\n    return document.activeElement\n  }\n\n  dropActiveElement(view){\n    if(this.prevActive && view.ownsElement(this.prevActive)){\n      this.prevActive = null\n    }\n  }\n\n  restorePreviouslyActiveFocus(){\n    if(this.prevActive && this.prevActive !== document.body){\n      this.prevActive.focus()\n    }\n  }\n\n  blurActiveElement(){\n    this.prevActive = this.getActiveElement()\n    if(this.prevActive !== document.body){ this.prevActive.blur() }\n  }\n\n  bindTopLevelEvents({dead} = {}){\n    if(this.boundTopLevelEvents){ return }\n\n    this.boundTopLevelEvents = true\n    // enter failsafe reload if server has gone away intentionally, such as \"disconnect\" broadcast\n    this.serverCloseRef = this.socket.onClose(event => {\n      // failsafe reload if normal closure and we still have a main LV\n      if(event && event.code === 1000 && this.main){ return this.reloadWithJitter(this.main) }\n    })\n    document.body.addEventListener(\"click\", function (){ }) // ensure all click events bubble for mobile Safari\n    window.addEventListener(\"pageshow\", e => {\n      if(e.persisted){ // reload page if being restored from back/forward cache\n        this.getSocket().disconnect()\n        this.withPageLoading({to: window.location.href, kind: \"redirect\"})\n        window.location.reload()\n      }\n    }, true)\n    if(!dead){ this.bindNav() }\n    this.bindClicks()\n    if(!dead){ this.bindForms() }\n    this.bind({keyup: \"keyup\", keydown: \"keydown\"}, (e, type, view, targetEl, phxEvent, _phxTarget) => {\n      let matchKey = targetEl.getAttribute(this.binding(PHX_KEY))\n      let pressedKey = e.key && e.key.toLowerCase() // chrome clicked autocompletes send a keydown without key\n      if(matchKey && matchKey.toLowerCase() !== pressedKey){ return }\n\n      let data = {key: e.key, ...this.eventMeta(type, e, targetEl)}\n      JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n    })\n    this.bind({blur: \"focusout\", focus: \"focusin\"}, (e, type, view, targetEl, phxEvent, phxTarget) => {\n      if(!phxTarget){\n        let data = {key: e.key, ...this.eventMeta(type, e, targetEl)}\n        JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n      }\n    })\n    this.bind({blur: \"blur\", focus: \"focus\"}, (e, type, view, targetEl, phxEvent, phxTarget) => {\n      // blur and focus are triggered on document and window. Discard one to avoid dups\n      if(phxTarget === \"window\"){\n        let data = this.eventMeta(type, e, targetEl)\n        JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n      }\n    })\n    this.on(\"dragover\", e => e.preventDefault())\n    this.on(\"drop\", e => {\n      e.preventDefault()\n      let dropTargetId = maybe(closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), trueTarget => {\n        return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET))\n      })\n      let dropTarget = dropTargetId && document.getElementById(dropTargetId)\n      let files = Array.from(e.dataTransfer.files || [])\n      if(!dropTarget || dropTarget.disabled || files.length === 0 || !(dropTarget.files instanceof FileList)){ return }\n\n      LiveUploader.trackFiles(dropTarget, files, e.dataTransfer)\n      dropTarget.dispatchEvent(new Event(\"input\", {bubbles: true}))\n    })\n    this.on(PHX_TRACK_UPLOADS, e => {\n      let uploadTarget = e.target\n      if(!DOM.isUploadInput(uploadTarget)){ return }\n      let files = Array.from(e.detail.files || []).filter(f => f instanceof File || f instanceof Blob)\n      LiveUploader.trackFiles(uploadTarget, files)\n      uploadTarget.dispatchEvent(new Event(\"input\", {bubbles: true}))\n    })\n  }\n\n  eventMeta(eventName, e, targetEl){\n    let callback = this.metadataCallbacks[eventName]\n    return callback ? callback(e, targetEl) : {}\n  }\n\n  setPendingLink(href){\n    this.linkRef++\n    this.pendingLink = href\n    this.resetReloadStatus()\n    return this.linkRef\n  }\n\n  // anytime we are navigating or connecting, drop reload cookie in case\n  // we issue the cookie but the next request was interrupted and the server never dropped it\n  resetReloadStatus(){ Browser.deleteCookie(PHX_RELOAD_STATUS) }\n\n  commitPendingLink(linkRef){\n    if(this.linkRef !== linkRef){\n      return false\n    } else {\n      this.href = this.pendingLink\n      this.pendingLink = null\n      return true\n    }\n  }\n\n  getHref(){ return this.href }\n\n  hasPendingLink(){ return !!this.pendingLink }\n\n  bind(events, callback){\n    for(let event in events){\n      let browserEventName = events[event]\n\n      this.on(browserEventName, e => {\n        let binding = this.binding(event)\n        let windowBinding = this.binding(`window-${event}`)\n        let targetPhxEvent = e.target.getAttribute && e.target.getAttribute(binding)\n        if(targetPhxEvent){\n          this.debounce(e.target, e, browserEventName, () => {\n            this.withinOwners(e.target, view => {\n              callback(e, event, view, e.target, targetPhxEvent, null)\n            })\n          })\n        } else {\n          DOM.all(document, `[${windowBinding}]`, el => {\n            let phxEvent = el.getAttribute(windowBinding)\n            this.debounce(el, e, browserEventName, () => {\n              this.withinOwners(el, view => {\n                callback(e, event, view, el, phxEvent, \"window\")\n              })\n            })\n          })\n        }\n      })\n    }\n  }\n\n  bindClicks(){\n    this.on(\"mousedown\", e => this.clickStartedAtTarget = e.target)\n    this.bindClick(\"click\", \"click\")\n  }\n\n  bindClick(eventName, bindingName){\n    let click = this.binding(bindingName)\n    window.addEventListener(eventName, e => {\n      let target = null\n      // a synthetic click event (detail 0) will not have caused a mousedown event,\n      // therefore the clickStartedAtTarget is stale\n      if(e.detail === 0) this.clickStartedAtTarget = e.target\n      let clickStartedAtTarget = this.clickStartedAtTarget || e.target\n      // when searching the target for the click event, we always want to\n      // use the actual event target, see #3372\n      target = closestPhxBinding(e.target, click)\n      this.dispatchClickAway(e, clickStartedAtTarget)\n      this.clickStartedAtTarget = null\n      let phxEvent = target && target.getAttribute(click)\n      if(!phxEvent){\n        if(DOM.isNewPageClick(e, window.location)){ this.unload() }\n        return\n      }\n\n      if(target.getAttribute(\"href\") === \"#\"){ e.preventDefault() }\n\n      // noop if we are in the middle of awaiting an ack for this el already\n      if(target.hasAttribute(PHX_REF_SRC)){ return }\n\n      this.debounce(target, e, \"click\", () => {\n        this.withinOwners(target, view => {\n          JS.exec(e, \"click\", phxEvent, view, target, [\"push\", {data: this.eventMeta(\"click\", e, target)}])\n        })\n      })\n    }, false)\n  }\n\n  dispatchClickAway(e, clickStartedAt){\n    let phxClickAway = this.binding(\"click-away\")\n    DOM.all(document, `[${phxClickAway}]`, el => {\n      if(!(el.isSameNode(clickStartedAt) || el.contains(clickStartedAt))){\n        this.withinOwners(el, view => {\n          let phxEvent = el.getAttribute(phxClickAway)\n          if(JS.isVisible(el) && JS.isInViewport(el)){\n            JS.exec(e, \"click\", phxEvent, view, el, [\"push\", {data: this.eventMeta(\"click\", e, e.target)}])\n          }\n        })\n      }\n    })\n  }\n\n  bindNav(){\n    if(!Browser.canPushState()){ return }\n    if(history.scrollRestoration){ history.scrollRestoration = \"manual\" }\n    let scrollTimer = null\n    window.addEventListener(\"scroll\", _e => {\n      clearTimeout(scrollTimer)\n      scrollTimer = setTimeout(() => {\n        Browser.updateCurrentState(state => Object.assign(state, {scroll: window.scrollY}))\n      }, 100)\n    })\n    window.addEventListener(\"popstate\", event => {\n      if(!this.registerNewLocation(window.location)){ return }\n      let {type, backType, id, root, scroll, position} = event.state || {}\n      let href = window.location.href\n\n      // Compare positions to determine direction\n      let isForward = position > this.currentHistoryPosition\n\n      type = isForward ? type : (backType || type)\n\n      // Update current position\n      this.currentHistoryPosition = position || 0\n      this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n      DOM.dispatchEvent(window, \"phx:navigate\", {detail: {href, patch: type === \"patch\", pop: true, direction: isForward ? \"forward\" : \"backward\"}})\n      this.requestDOMUpdate(() => {\n        if(this.main.isConnected() && (type === \"patch\" && id === this.main.id)){\n          this.main.pushLinkPatch(event, href, null, () => {\n            this.maybeScroll(scroll)\n          })\n        } else {\n          this.replaceMain(href, null, () => {\n            if(root){ this.replaceRootHistory() }\n            this.maybeScroll(scroll)\n          })\n        }\n      })\n    }, false)\n    window.addEventListener(\"click\", e => {\n      let target = closestPhxBinding(e.target, PHX_LIVE_LINK)\n      let type = target && target.getAttribute(PHX_LIVE_LINK)\n      if(!type || !this.isConnected() || !this.main || DOM.wantsNewTab(e)){ return }\n\n      // When wrapping an SVG element in an anchor tag, the href can be an SVGAnimatedString\n      let href = target.href instanceof SVGAnimatedString ? target.href.baseVal : target.href\n\n      let linkState = target.getAttribute(PHX_LINK_STATE)\n      e.preventDefault()\n      e.stopImmediatePropagation() // do not bubble click to regular phx-click bindings\n      if(this.pendingLink === href){ return }\n\n      this.requestDOMUpdate(() => {\n        if(type === \"patch\"){\n          this.pushHistoryPatch(e, href, linkState, target)\n        } else if(type === \"redirect\"){\n          this.historyRedirect(e, href, linkState, null, target)\n        } else {\n          throw new Error(`expected ${PHX_LIVE_LINK} to be \"patch\" or \"redirect\", got: ${type}`)\n        }\n        let phxClick = target.getAttribute(this.binding(\"click\"))\n        if(phxClick){\n          this.requestDOMUpdate(() => this.execJS(target, phxClick, \"click\"))\n        }\n      })\n    }, false)\n  }\n\n  maybeScroll(scroll){\n    if(typeof(scroll) === \"number\"){\n      requestAnimationFrame(() => {\n        window.scrollTo(0, scroll)\n      }) // the body needs to render before we scroll.\n    }\n  }\n\n  dispatchEvent(event, payload = {}){\n    DOM.dispatchEvent(window, `phx:${event}`, {detail: payload})\n  }\n\n  dispatchEvents(events){\n    events.forEach(([event, payload]) => this.dispatchEvent(event, payload))\n  }\n\n  withPageLoading(info, callback){\n    DOM.dispatchEvent(window, \"phx:page-loading-start\", {detail: info})\n    let done = () => DOM.dispatchEvent(window, \"phx:page-loading-stop\", {detail: info})\n    return callback ? callback(done) : done\n  }\n\n  pushHistoryPatch(e, href, linkState, targetEl){\n    if(!this.isConnected() || !this.main.isMain()){ return Browser.redirect(href) }\n\n    this.withPageLoading({to: href, kind: \"patch\"}, done => {\n      this.main.pushLinkPatch(e, href, targetEl, linkRef => {\n        this.historyPatch(href, linkState, linkRef)\n        done()\n      })\n    })\n  }\n\n  historyPatch(href, linkState, linkRef = this.setPendingLink(href)){\n    if(!this.commitPendingLink(linkRef)){ return }\n\n    // Increment position for new state\n    this.currentHistoryPosition++\n    this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n    // store the type for back navigation\n    Browser.updateCurrentState((state) => ({...state, backType: \"patch\"}))\n\n    Browser.pushState(linkState, {\n      type: \"patch\",\n      id: this.main.id,\n      position: this.currentHistoryPosition\n    }, href)\n\n    DOM.dispatchEvent(window, \"phx:navigate\", {detail: {patch: true, href, pop: false, direction: \"forward\"}})\n    this.registerNewLocation(window.location)\n  }\n\n  historyRedirect(e, href, linkState, flash, targetEl){\n    if(targetEl && e.isTrusted && e.type !== \"popstate\"){ targetEl.classList.add(\"phx-click-loading\") }\n    if(!this.isConnected() || !this.main.isMain()){ return Browser.redirect(href, flash) }\n\n    // convert to full href if only path prefix\n    if(/^\\/$|^\\/[^\\/]+.*$/.test(href)){\n      let {protocol, host} = window.location\n      href = `${protocol}//${host}${href}`\n    }\n    let scroll = window.scrollY\n    this.withPageLoading({to: href, kind: \"redirect\"}, done => {\n      this.replaceMain(href, flash, (linkRef) => {\n        if(linkRef === this.linkRef){\n          // Increment position for new state\n          this.currentHistoryPosition++\n          this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n          // store the type for back navigation\n          Browser.updateCurrentState((state) => ({...state, backType: \"redirect\"}))\n\n          Browser.pushState(linkState, {\n            type: \"redirect\",\n            id: this.main.id,\n            scroll: scroll,\n            position: this.currentHistoryPosition\n          }, href)\n\n          DOM.dispatchEvent(window, \"phx:navigate\", {detail: {href, patch: false, pop: false, direction: \"forward\"}})\n          this.registerNewLocation(window.location)\n        }\n        done()\n      })\n    })\n  }\n\n  replaceRootHistory(){\n    Browser.pushState(\"replace\", {\n      root: true,\n      type: \"patch\",\n      id: this.main.id,\n      position: this.currentHistoryPosition // Preserve current position\n    })\n  }\n\n  registerNewLocation(newLocation){\n    let {pathname, search} = this.currentLocation\n    if(pathname + search === newLocation.pathname + newLocation.search){\n      return false\n    } else {\n      this.currentLocation = clone(newLocation)\n      return true\n    }\n  }\n\n  bindForms(){\n    let iterations = 0\n    let externalFormSubmitted = false\n\n    // disable forms on submit that track phx-change but perform external submit\n    this.on(\"submit\", e => {\n      let phxSubmit = e.target.getAttribute(this.binding(\"submit\"))\n      let phxChange = e.target.getAttribute(this.binding(\"change\"))\n      if(!externalFormSubmitted && phxChange && !phxSubmit){\n        externalFormSubmitted = true\n        e.preventDefault()\n        this.withinOwners(e.target, view => {\n          view.disableForm(e.target)\n          // safari needs next tick\n          window.requestAnimationFrame(() => {\n            if(DOM.isUnloadableFormSubmit(e)){ this.unload() }\n            e.target.submit()\n          })\n        })\n      }\n    })\n\n    this.on(\"submit\", e => {\n      let phxEvent = e.target.getAttribute(this.binding(\"submit\"))\n      if(!phxEvent){\n        if(DOM.isUnloadableFormSubmit(e)){ this.unload() }\n        return\n      }\n      e.preventDefault()\n      e.target.disabled = true\n      this.withinOwners(e.target, view => {\n        JS.exec(e, \"submit\", phxEvent, view, e.target, [\"push\", {submitter: e.submitter}])\n      })\n    })\n\n    for(let type of [\"change\", \"input\"]){\n      this.on(type, e => {\n        if(e instanceof CustomEvent && e.target.form === undefined){\n          // throw on invalid JS.dispatch target and noop if CustomEvent triggered outside JS.dispatch\n          if(e.detail && e.detail.dispatcher){\n            throw new Error(`dispatching a custom ${type} event is only supported on input elements inside a form`)\n          }\n          return\n        }\n        let phxChange = this.binding(\"change\")\n        let input = e.target\n        // do not fire phx-change if we are in the middle of a composition session\n        // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing\n        // Safari has issues if the input is updated while composing\n        // see https://github.com/phoenixframework/phoenix_live_view/issues/3322\n        if(e.isComposing){\n          const key = `composition-listener-${type}`\n          if(!DOM.private(input, key)){\n            DOM.putPrivate(input, key, true)\n            input.addEventListener(\"compositionend\", () => {\n              // trigger a new input/change event\n              input.dispatchEvent(new Event(type, {bubbles: true}))\n              DOM.deletePrivate(input, key)\n            }, {once: true})\n          }\n          return\n        }\n        let inputEvent = input.getAttribute(phxChange)\n        let formEvent = input.form && input.form.getAttribute(phxChange)\n        let phxEvent = inputEvent || formEvent\n        if(!phxEvent){ return }\n        if(input.type === \"number\" && input.validity && input.validity.badInput){ return }\n\n        let dispatcher = inputEvent ? input : input.form\n        let currentIterations = iterations\n        iterations++\n        let {at: at, type: lastType} = DOM.private(input, \"prev-iteration\") || {}\n        // Browsers should always fire at least one \"input\" event before every \"change\"\n        // Ignore \"change\" events, unless there was no prior \"input\" event.\n        // This could happen if user code triggers a \"change\" event, or if the browser is non-conforming.\n        if(at === currentIterations - 1 && type === \"change\" && lastType === \"input\"){ return }\n\n        DOM.putPrivate(input, \"prev-iteration\", {at: currentIterations, type: type})\n\n        this.debounce(input, e, type, () => {\n          this.withinOwners(dispatcher, view => {\n            DOM.putPrivate(input, PHX_HAS_FOCUSED, true)\n            JS.exec(e, \"change\", phxEvent, view, input, [\"push\", {_target: e.target.name, dispatcher: dispatcher}])\n          })\n        })\n      })\n    }\n    this.on(\"reset\", (e) => {\n      let form = e.target\n      DOM.resetForm(form)\n      let input = Array.from(form.elements).find(el => el.type === \"reset\")\n      if(input){\n        // wait until next tick to get updated input value\n        window.requestAnimationFrame(() => {\n          input.dispatchEvent(new Event(\"input\", {bubbles: true, cancelable: false}))\n        })\n      }\n    })\n  }\n\n  debounce(el, event, eventType, callback){\n    if(eventType === \"blur\" || eventType === \"focusout\"){ return callback() }\n\n    let phxDebounce = this.binding(PHX_DEBOUNCE)\n    let phxThrottle = this.binding(PHX_THROTTLE)\n    let defaultDebounce = this.defaults.debounce.toString()\n    let defaultThrottle = this.defaults.throttle.toString()\n\n    this.withinOwners(el, view => {\n      let asyncFilter = () => !view.isDestroyed() && document.body.contains(el)\n      DOM.debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, () => {\n        callback()\n      })\n    })\n  }\n\n  silenceEvents(callback){\n    this.silenced = true\n    callback()\n    this.silenced = false\n  }\n\n  on(event, callback){\n    this.boundEventNames.add(event)\n    window.addEventListener(event, e => {\n      if(!this.silenced){ callback(e) }\n    })\n  }\n\n  jsQuerySelectorAll(sourceEl, query, defaultQuery){\n    let all = this.domCallbacks.jsQuerySelectorAll\n    return all ? all(sourceEl, query, defaultQuery) : defaultQuery()\n  }\n}\n\nclass TransitionSet {\n  constructor(){\n    this.transitions = new Set()\n    this.pendingOps = []\n  }\n\n  reset(){\n    this.transitions.forEach(timer => {\n      clearTimeout(timer)\n      this.transitions.delete(timer)\n    })\n    this.flushPendingOps()\n  }\n\n  after(callback){\n    if(this.size() === 0){\n      callback()\n    } else {\n      this.pushPendingOp(callback)\n    }\n  }\n\n  addTransition(time, onStart, onDone){\n    onStart()\n    let timer = setTimeout(() => {\n      this.transitions.delete(timer)\n      onDone()\n      this.flushPendingOps()\n    }, time)\n    this.transitions.add(timer)\n  }\n\n  pushPendingOp(op){ this.pendingOps.push(op) }\n\n  size(){ return this.transitions.size }\n\n  flushPendingOps(){\n    if(this.size() > 0){ return }\n    let op = this.pendingOps.shift()\n    if(op){\n      op()\n      this.flushPendingOps()\n    }\n  }\n}\n"],
-  "mappings": "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",
+  "sourcesContent": ["/*\n================================================================================\nPhoenix LiveView JavaScript Client\n================================================================================\n\nSee the hexdocs at `https://hexdocs.pm/phoenix_live_view` for documentation.\n\n*/\n\nimport LiveSocket, {isUsedInput} from \"./live_socket\"\nimport DOM from \"./dom\"\nimport ViewHook from \"./view_hook\"\nimport View from \"./view\"\n\n/** Creates a ViewHook instance for the given element and callbacks.\n *\n * @param {HTMLElement} el - The element to associate with the hook.\n * @param {Object} [callbacks] - The list of hook callbacks, such as mounted,\n *   updated, destroyed, etc.\n *\n * @example\n *\n * class MyComponent extends HTMLElement {\n *   connectedCallback(){\n *     let onLiveViewMounted = () => this.hook.pushEvent(...))\n *     this.hook = createHook(this, {mounted: onLiveViewMounted})\n *   }\n * }\n *\n * *Note*: `createHook` must be called from the `connectedCallback` lifecycle\n * which is triggered after the element has been added to the DOM. If you try\n * to call `createHook` from the constructor, an error will be logged.\n *\n * @returns {ViewHook} Returns the ViewHook instance for the custom element.\n */\nlet createHook = (el, callbacks = {}) => {\n  let existingHook = DOM.getCustomElHook(el)\n  if(existingHook){ return existingHook }\n\n  let hook = new ViewHook(View.closestView(el), el, callbacks)\n  DOM.putCustomElHook(el, hook)\n  return hook\n}\n\nexport {\n  LiveSocket,\n  isUsedInput,\n  createHook\n}\n", "export const CONSECUTIVE_RELOADS = \"consecutive-reloads\"\nexport const MAX_RELOADS = 10\nexport const RELOAD_JITTER_MIN = 5000\nexport const RELOAD_JITTER_MAX = 10000\nexport const FAILSAFE_JITTER = 30000\nexport const PHX_EVENT_CLASSES = [\n  \"phx-click-loading\", \"phx-change-loading\", \"phx-submit-loading\",\n  \"phx-keydown-loading\", \"phx-keyup-loading\", \"phx-blur-loading\", \"phx-focus-loading\",\n  \"phx-hook-loading\"\n]\nexport const PHX_COMPONENT = \"data-phx-component\"\nexport const PHX_LIVE_LINK = \"data-phx-link\"\nexport const PHX_TRACK_STATIC = \"track-static\"\nexport const PHX_LINK_STATE = \"data-phx-link-state\"\nexport const PHX_REF_LOADING = \"data-phx-ref-loading\"\nexport const PHX_REF_SRC = \"data-phx-ref-src\"\nexport const PHX_REF_LOCK = \"data-phx-ref-lock\"\nexport const PHX_TRACK_UPLOADS = \"track-uploads\"\nexport const PHX_UPLOAD_REF = \"data-phx-upload-ref\"\nexport const PHX_PREFLIGHTED_REFS = \"data-phx-preflighted-refs\"\nexport const PHX_DONE_REFS = \"data-phx-done-refs\"\nexport const PHX_DROP_TARGET = \"drop-target\"\nexport const PHX_ACTIVE_ENTRY_REFS = \"data-phx-active-refs\"\nexport const PHX_LIVE_FILE_UPDATED = \"phx:live-file:updated\"\nexport const PHX_SKIP = \"data-phx-skip\"\nexport const PHX_MAGIC_ID = \"data-phx-id\"\nexport const PHX_PRUNE = \"data-phx-prune\"\nexport const PHX_CONNECTED_CLASS = \"phx-connected\"\nexport const PHX_LOADING_CLASS = \"phx-loading\"\nexport const PHX_ERROR_CLASS = \"phx-error\"\nexport const PHX_CLIENT_ERROR_CLASS = \"phx-client-error\"\nexport const PHX_SERVER_ERROR_CLASS = \"phx-server-error\"\nexport const PHX_PARENT_ID = \"data-phx-parent-id\"\nexport const PHX_MAIN = \"data-phx-main\"\nexport const PHX_ROOT_ID = \"data-phx-root-id\"\nexport const PHX_VIEWPORT_TOP = \"viewport-top\"\nexport const PHX_VIEWPORT_BOTTOM = \"viewport-bottom\"\nexport const PHX_TRIGGER_ACTION = \"trigger-action\"\nexport const PHX_HAS_FOCUSED = \"phx-has-focused\"\nexport const FOCUSABLE_INPUTS = [\"text\", \"textarea\", \"number\", \"email\", \"password\", \"search\", \"tel\", \"url\", \"date\", \"time\", \"datetime-local\", \"color\", \"range\"]\nexport const CHECKABLE_INPUTS = [\"checkbox\", \"radio\"]\nexport const PHX_HAS_SUBMITTED = \"phx-has-submitted\"\nexport const PHX_SESSION = \"data-phx-session\"\nexport const PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`\nexport const PHX_STICKY = \"data-phx-sticky\"\nexport const PHX_STATIC = \"data-phx-static\"\nexport const PHX_READONLY = \"data-phx-readonly\"\nexport const PHX_DISABLED = \"data-phx-disabled\"\nexport const PHX_DISABLE_WITH = \"disable-with\"\nexport const PHX_DISABLE_WITH_RESTORE = \"data-phx-disable-with-restore\"\nexport const PHX_HOOK = \"hook\"\nexport const PHX_DEBOUNCE = \"debounce\"\nexport const PHX_THROTTLE = \"throttle\"\nexport const PHX_UPDATE = \"update\"\nexport const PHX_STREAM = \"stream\"\nexport const PHX_STREAM_REF = \"data-phx-stream\"\nexport const PHX_KEY = \"key\"\nexport const PHX_PRIVATE = \"phxPrivate\"\nexport const PHX_AUTO_RECOVER = \"auto-recover\"\nexport const PHX_LV_DEBUG = \"phx:live-socket:debug\"\nexport const PHX_LV_PROFILE = \"phx:live-socket:profiling\"\nexport const PHX_LV_LATENCY_SIM = \"phx:live-socket:latency-sim\"\nexport const PHX_LV_HISTORY_POSITION = \"phx:nav-history-position\"\nexport const PHX_PROGRESS = \"progress\"\nexport const PHX_MOUNTED = \"mounted\"\nexport const PHX_RELOAD_STATUS = \"__phoenix_reload_status__\"\nexport const LOADER_TIMEOUT = 1\nexport const MAX_CHILD_JOIN_ATTEMPTS = 3\nexport const BEFORE_UNLOAD_LOADER_TIMEOUT = 200\nexport const BINDING_PREFIX = \"phx-\"\nexport const PUSH_TIMEOUT = 30000\nexport const LINK_HEADER = \"x-requested-with\"\nexport const RESPONSE_URL_HEADER = \"x-response-url\"\nexport const DEBOUNCE_TRIGGER = \"debounce-trigger\"\nexport const THROTTLED = \"throttled\"\nexport const DEBOUNCE_PREV_KEY = \"debounce-prev-key\"\nexport const DEFAULTS = {\n  debounce: 300,\n  throttle: 300\n}\nexport const PHX_PENDING_ATTRS = [PHX_REF_LOADING, PHX_REF_SRC, PHX_REF_LOCK]\n// Rendered\nexport const DYNAMICS = \"d\"\nexport const STATIC = \"s\"\nexport const ROOT = \"r\"\nexport const COMPONENTS = \"c\"\nexport const EVENTS = \"e\"\nexport const REPLY = \"r\"\nexport const TITLE = \"t\"\nexport const TEMPLATES = \"p\"\nexport const STREAM = \"stream\"\n", "import {\n  logError\n} from \"./utils\"\n\nexport default class EntryUploader {\n  constructor(entry, config, liveSocket){\n    let {chunk_size, chunk_timeout} = config\n    this.liveSocket = liveSocket\n    this.entry = entry\n    this.offset = 0\n    this.chunkSize = chunk_size\n    this.chunkTimeout = chunk_timeout\n    this.chunkTimer = null\n    this.errored = false\n    this.uploadChannel = liveSocket.channel(`lvu:${entry.ref}`, {token: entry.metadata()})\n  }\n\n  error(reason){\n    if(this.errored){ return }\n    this.uploadChannel.leave()\n    this.errored = true\n    clearTimeout(this.chunkTimer)\n    this.entry.error(reason)\n  }\n\n  upload(){\n    this.uploadChannel.onError(reason => this.error(reason))\n    this.uploadChannel.join()\n      .receive(\"ok\", _data => this.readNextChunk())\n      .receive(\"error\", reason => this.error(reason))\n  }\n\n  isDone(){ return this.offset >= this.entry.file.size }\n\n  readNextChunk(){\n    let reader = new window.FileReader()\n    let blob = this.entry.file.slice(this.offset, this.chunkSize + this.offset)\n    reader.onload = (e) => {\n      if(e.target.error === null){\n        this.offset += e.target.result.byteLength\n        this.pushChunk(e.target.result)\n      } else {\n        return logError(\"Read error: \" + e.target.error)\n      }\n    }\n    reader.readAsArrayBuffer(blob)\n  }\n\n  pushChunk(chunk){\n    if(!this.uploadChannel.isJoined()){ return }\n    this.uploadChannel.push(\"chunk\", chunk, this.chunkTimeout)\n      .receive(\"ok\", () => {\n        this.entry.progress((this.offset / this.entry.file.size) * 100)\n        if(!this.isDone()){\n          this.chunkTimer = setTimeout(() => this.readNextChunk(), this.liveSocket.getLatencySim() || 0)\n        }\n      })\n      .receive(\"error\", ({reason}) => this.error(reason))\n  }\n}\n", "import {\n  PHX_VIEW_SELECTOR\n} from \"./constants\"\n\nimport EntryUploader from \"./entry_uploader\"\n\nexport let logError = (msg, obj) => console.error && console.error(msg, obj)\n\nexport let isCid = (cid) => {\n  let type = typeof(cid)\n  return type === \"number\" || (type === \"string\" && /^(0|[1-9]\\d*)$/.test(cid))\n}\n\nexport function detectDuplicateIds(){\n  let ids = new Set()\n  let elems = document.querySelectorAll(\"*[id]\")\n  for(let i = 0, len = elems.length; i < len; i++){\n    if(ids.has(elems[i].id)){\n      console.error(`Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`)\n    } else {\n      ids.add(elems[i].id)\n    }\n  }\n}\n\nexport let debug = (view, kind, msg, obj) => {\n  if(view.liveSocket.isDebugEnabled()){\n    console.log(`${view.id} ${kind}: ${msg} - `, obj)\n  }\n}\n\n// wraps value in closure or returns closure\nexport let closure = (val) => typeof val === \"function\" ? val : function (){ return val }\n\nexport let clone = (obj) => { return JSON.parse(JSON.stringify(obj)) }\n\nexport let closestPhxBinding = (el, binding, borderEl) => {\n  do {\n    if(el.matches(`[${binding}]`) && !el.disabled){ return el }\n    el = el.parentElement || el.parentNode\n  } while(el !== null && el.nodeType === 1 && !((borderEl && borderEl.isSameNode(el)) || el.matches(PHX_VIEW_SELECTOR)))\n  return null\n}\n\nexport let isObject = (obj) => {\n  return obj !== null && typeof obj === \"object\" && !(obj instanceof Array)\n}\n\nexport let isEqualObj = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2)\n\nexport let isEmpty = (obj) => {\n  for(let x in obj){ return false }\n  return true\n}\n\nexport let maybe = (el, callback) => el && callback(el)\n\nexport let channelUploader = function (entries, onError, resp, liveSocket){\n  entries.forEach(entry => {\n    let entryUploader = new EntryUploader(entry, resp.config, liveSocket)\n    entryUploader.upload()\n  })\n}\n", "let Browser = {\n  canPushState(){ return (typeof (history.pushState) !== \"undefined\") },\n\n  dropLocal(localStorage, namespace, subkey){\n    return localStorage.removeItem(this.localKey(namespace, subkey))\n  },\n\n  updateLocal(localStorage, namespace, subkey, initial, func){\n    let current = this.getLocal(localStorage, namespace, subkey)\n    let key = this.localKey(namespace, subkey)\n    let newVal = current === null ? initial : func(current)\n    localStorage.setItem(key, JSON.stringify(newVal))\n    return newVal\n  },\n\n  getLocal(localStorage, namespace, subkey){\n    return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey)))\n  },\n\n  updateCurrentState(callback){\n    if(!this.canPushState()){ return }\n    history.replaceState(callback(history.state || {}), \"\", window.location.href)\n  },\n\n  pushState(kind, meta, to){\n    if(this.canPushState()){\n      if(to !== window.location.href){\n        if(meta.type == \"redirect\" && meta.scroll){\n          // If we're redirecting store the current scrollY for the current history state.\n          let currentState = history.state || {}\n          currentState.scroll = meta.scroll\n          history.replaceState(currentState, \"\", window.location.href)\n        }\n\n        delete meta.scroll // Only store the scroll in the redirect case.\n        history[kind + \"State\"](meta, \"\", to || null) // IE will coerce undefined to string\n\n        // when using navigate, we'd call pushState immediately before patching the DOM,\n        // jumping back to the top of the page, effectively ignoring the scrollIntoView;\n        // therefore we wait for the next frame (after the DOM patch) and only then try\n        // to scroll to the hashEl\n        window.requestAnimationFrame(() => {\n          let hashEl = this.getHashTargetEl(window.location.hash)\n  \n          if(hashEl){\n            hashEl.scrollIntoView()\n          } else if(meta.type === \"redirect\"){\n            window.scroll(0, 0)\n          }\n        })\n      }\n    } else {\n      this.redirect(to)\n    }\n  },\n\n  setCookie(name, value, maxAgeSeconds){\n    let expires = typeof(maxAgeSeconds) === \"number\" ? ` max-age=${maxAgeSeconds};` : \"\"\n    document.cookie = `${name}=${value};${expires} path=/`\n  },\n\n  getCookie(name){\n    return document.cookie.replace(new RegExp(`(?:(?:^|.*;\\s*)${name}\\s*\\=\\s*([^;]*).*$)|^.*$`), \"$1\")\n  },\n\n  deleteCookie(name){\n    document.cookie = `${name}=; max-age=-1; path=/`\n  },\n\n  redirect(toURL, flash){\n    if(flash){ this.setCookie(\"__phoenix_flash__\", flash, 60) }\n    window.location = toURL\n  },\n\n  localKey(namespace, subkey){ return `${namespace}-${subkey}` },\n\n  getHashTargetEl(maybeHash){\n    let hash = maybeHash.toString().substring(1)\n    if(hash === \"\"){ return }\n    return document.getElementById(hash) || document.querySelector(`a[name=\"${hash}\"]`)\n  }\n}\n\nexport default Browser\n", "import {\n  CHECKABLE_INPUTS,\n  DEBOUNCE_PREV_KEY,\n  DEBOUNCE_TRIGGER,\n  FOCUSABLE_INPUTS,\n  PHX_COMPONENT,\n  PHX_HAS_FOCUSED,\n  PHX_HAS_SUBMITTED,\n  PHX_MAIN,\n  PHX_PARENT_ID,\n  PHX_PRIVATE,\n  PHX_REF_SRC,\n  PHX_PENDING_ATTRS,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_STATIC,\n  PHX_UPLOAD_REF,\n  PHX_VIEW_SELECTOR,\n  PHX_STICKY,\n  PHX_EVENT_CLASSES,\n  THROTTLED,\n} from \"./constants\"\n\nimport {\n  logError\n} from \"./utils\"\n\nlet DOM = {\n  byId(id){ return document.getElementById(id) || logError(`no id found for ${id}`) },\n\n  removeClass(el, className){\n    el.classList.remove(className)\n    if(el.classList.length === 0){ el.removeAttribute(\"class\") }\n  },\n\n  all(node, query, callback){\n    if(!node){ return [] }\n    let array = Array.from(node.querySelectorAll(query))\n    return callback ? array.forEach(callback) : array\n  },\n\n  childNodeLength(html){\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    return template.content.childElementCount\n  },\n\n  isUploadInput(el){ return el.type === \"file\" && el.getAttribute(PHX_UPLOAD_REF) !== null },\n\n  isAutoUpload(inputEl){ return inputEl.hasAttribute(\"data-phx-auto-upload\") },\n\n  findUploadInputs(node){\n    const formId = node.id\n    const inputsOutsideForm = this.all(document, `input[type=\"file\"][${PHX_UPLOAD_REF}][form=\"${formId}\"]`)\n    return this.all(node, `input[type=\"file\"][${PHX_UPLOAD_REF}]`).concat(inputsOutsideForm)\n  },\n\n  findComponentNodeList(node, cid){\n    return this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}=\"${cid}\"]`), node)\n  },\n\n  isPhxDestroyed(node){\n    return node.id && DOM.private(node, \"destroyed\") ? true : false\n  },\n\n  wantsNewTab(e){\n    let wantsNewTab = e.ctrlKey || e.shiftKey || e.metaKey || (e.button && e.button === 1)\n    let isDownload = (e.target instanceof HTMLAnchorElement && e.target.hasAttribute(\"download\"))\n    let isTargetBlank = e.target.hasAttribute(\"target\") && e.target.getAttribute(\"target\").toLowerCase() === \"_blank\"\n    let isTargetNamedTab = e.target.hasAttribute(\"target\") && !e.target.getAttribute(\"target\").startsWith(\"_\")\n    return wantsNewTab || isTargetBlank || isDownload || isTargetNamedTab\n  },\n\n  isUnloadableFormSubmit(e){\n    // Ignore form submissions intended to close a native <dialog> element\n    // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog#usage_notes\n    let isDialogSubmit = (e.target && e.target.getAttribute(\"method\") === \"dialog\") ||\n      (e.submitter && e.submitter.getAttribute(\"formmethod\") === \"dialog\")\n\n    if(isDialogSubmit){\n      return false\n    } else {\n      return !e.defaultPrevented && !this.wantsNewTab(e)\n    }\n  },\n\n  isNewPageClick(e, currentLocation){\n    let href = e.target instanceof HTMLAnchorElement ? e.target.getAttribute(\"href\") : null\n    let url\n\n    if(e.defaultPrevented || href === null || this.wantsNewTab(e)){ return false }\n    if(href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")){ return false }\n    if(e.target.isContentEditable){ return false }\n\n    try {\n      url = new URL(href)\n    } catch {\n      try {\n        url = new URL(href, currentLocation)\n      } catch {\n        // bad URL, fallback to let browser try it as external\n        return true\n      }\n    }\n\n    if(url.host === currentLocation.host && url.protocol === currentLocation.protocol){\n      if(url.pathname === currentLocation.pathname && url.search === currentLocation.search){\n        return url.hash === \"\" && !url.href.endsWith(\"#\")\n      }\n    }\n    return url.protocol.startsWith(\"http\")\n  },\n\n  markPhxChildDestroyed(el){\n    if(this.isPhxChild(el)){ el.setAttribute(PHX_SESSION, \"\") }\n    this.putPrivate(el, \"destroyed\", true)\n  },\n\n  findPhxChildrenInFragment(html, parentId){\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    return this.findPhxChildren(template.content, parentId)\n  },\n\n  isIgnored(el, phxUpdate){\n    return (el.getAttribute(phxUpdate) || el.getAttribute(\"data-phx-update\")) === \"ignore\"\n  },\n\n  isPhxUpdate(el, phxUpdate, updateTypes){\n    return el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0\n  },\n\n  findPhxSticky(el){ return this.all(el, `[${PHX_STICKY}]`) },\n\n  findPhxChildren(el, parentId){\n    return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}=\"${parentId}\"]`)\n  },\n\n  findExistingParentCIDs(node, cids){\n    // we only want to find parents that exist on the page\n    // if a cid is not on the page, the only way it can be added back to the page\n    // is if a parent adds it back, therefore if a cid does not exist on the page,\n    // we should not try to render it by itself (because it would be rendered twice,\n    // one by the parent, and a second time by itself)\n    let parentCids = new Set()\n    let childrenCids = new Set()\n\n    cids.forEach(cid => {\n      this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}=\"${cid}\"]`), node).forEach(parent => {\n        parentCids.add(cid)\n        this.all(parent, `[${PHX_COMPONENT}]`)\n          .map(el => parseInt(el.getAttribute(PHX_COMPONENT)))\n          .forEach(childCID => childrenCids.add(childCID))\n      })\n    })\n\n    childrenCids.forEach(childCid => parentCids.delete(childCid))\n\n    return parentCids\n  },\n\n  filterWithinSameLiveView(nodes, parent){\n    if(parent.querySelector(PHX_VIEW_SELECTOR)){\n      return nodes.filter(el => this.withinSameLiveView(el, parent))\n    } else {\n      return nodes\n    }\n  },\n\n  withinSameLiveView(node, parent){\n    while(node = node.parentNode){\n      if(node.isSameNode(parent)){ return true }\n      if(node.getAttribute(PHX_SESSION) !== null){ return false }\n    }\n  },\n\n  private(el, key){ return el[PHX_PRIVATE] && el[PHX_PRIVATE][key] },\n\n  deletePrivate(el, key){ el[PHX_PRIVATE] && delete (el[PHX_PRIVATE][key]) },\n\n  putPrivate(el, key, value){\n    if(!el[PHX_PRIVATE]){ el[PHX_PRIVATE] = {} }\n    el[PHX_PRIVATE][key] = value\n  },\n\n  updatePrivate(el, key, defaultVal, updateFunc){\n    let existing = this.private(el, key)\n    if(existing === undefined){\n      this.putPrivate(el, key, updateFunc(defaultVal))\n    } else {\n      this.putPrivate(el, key, updateFunc(existing))\n    }\n  },\n\n  syncPendingAttrs(fromEl, toEl){\n    if(!fromEl.hasAttribute(PHX_REF_SRC)){ return }\n    PHX_EVENT_CLASSES.forEach(className => {\n      fromEl.classList.contains(className) && toEl.classList.add(className)\n    })\n    PHX_PENDING_ATTRS.filter(attr => fromEl.hasAttribute(attr)).forEach(attr => {\n      toEl.setAttribute(attr, fromEl.getAttribute(attr))\n    })\n  },\n\n  copyPrivates(target, source){\n    if(source[PHX_PRIVATE]){\n      target[PHX_PRIVATE] = source[PHX_PRIVATE]\n    }\n  },\n\n  putTitle(str){\n    let titleEl = document.querySelector(\"title\")\n    if(titleEl){\n      let {prefix, suffix, default: defaultTitle} = titleEl.dataset\n      let isEmpty = typeof(str) !== \"string\" || str.trim() === \"\"\n      if(isEmpty && typeof(defaultTitle) !== \"string\"){ return }\n\n      let inner = isEmpty ? defaultTitle : str\n      document.title = `${prefix || \"\"}${inner || \"\"}${suffix || \"\"}`\n    } else {\n      document.title = str\n    }\n  },\n\n  debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, callback){\n    let debounce = el.getAttribute(phxDebounce)\n    let throttle = el.getAttribute(phxThrottle)\n\n    if(debounce === \"\"){ debounce = defaultDebounce }\n    if(throttle === \"\"){ throttle = defaultThrottle }\n    let value = debounce || throttle\n    switch(value){\n      case null: return callback()\n\n      case \"blur\":\n        if(this.once(el, \"debounce-blur\")){\n          el.addEventListener(\"blur\", () => {\n            if(asyncFilter()){ callback() }\n          })\n        }\n        return\n\n      default:\n        let timeout = parseInt(value)\n        let trigger = () => throttle ? this.deletePrivate(el, THROTTLED) : callback()\n        let currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger)\n        if(isNaN(timeout)){ return logError(`invalid throttle/debounce value: ${value}`) }\n        if(throttle){\n          let newKeyDown = false\n          if(event.type === \"keydown\"){\n            let prevKey = this.private(el, DEBOUNCE_PREV_KEY)\n            this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key)\n            newKeyDown = prevKey !== event.key\n          }\n\n          if(!newKeyDown && this.private(el, THROTTLED)){\n            return false\n          } else {\n            callback()\n            const t = setTimeout(() => {\n              if(asyncFilter()){ this.triggerCycle(el, DEBOUNCE_TRIGGER) }\n            }, timeout)\n            this.putPrivate(el, THROTTLED, t)\n          }\n        } else {\n          setTimeout(() => {\n            if(asyncFilter()){ this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle) }\n          }, timeout)\n        }\n\n        let form = el.form\n        if(form && this.once(form, \"bind-debounce\")){\n          form.addEventListener(\"submit\", () => {\n            Array.from((new FormData(form)).entries(), ([name]) => {\n              let input = form.querySelector(`[name=\"${name}\"]`)\n              this.incCycle(input, DEBOUNCE_TRIGGER)\n              this.deletePrivate(input, THROTTLED)\n            })\n          })\n        }\n        if(this.once(el, \"bind-debounce\")){\n          el.addEventListener(\"blur\", () => {\n            // because we trigger the callback here,\n            // we also clear the throttle timeout to prevent the callback\n            // from being called again after the timeout fires\n            clearTimeout(this.private(el, THROTTLED))\n            this.triggerCycle(el, DEBOUNCE_TRIGGER)\n          })\n        }\n    }\n  },\n\n  triggerCycle(el, key, currentCycle){\n    let [cycle, trigger] = this.private(el, key)\n    if(!currentCycle){ currentCycle = cycle }\n    if(currentCycle === cycle){\n      this.incCycle(el, key)\n      trigger()\n    }\n  },\n\n  once(el, key){\n    if(this.private(el, key) === true){ return false }\n    this.putPrivate(el, key, true)\n    return true\n  },\n\n  incCycle(el, key, trigger = function (){ }){\n    let [currentCycle] = this.private(el, key) || [0, trigger]\n    currentCycle++\n    this.putPrivate(el, key, [currentCycle, trigger])\n    return currentCycle\n  },\n\n  // maintains or adds privately used hook information\n  // fromEl and toEl can be the same element in the case of a newly added node\n  // fromEl and toEl can be any HTML node type, so we need to check if it's an element node\n  maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom){\n    // maintain the hooks created with createHook\n    if(fromEl.hasAttribute && fromEl.hasAttribute(\"data-phx-hook\") && !toEl.hasAttribute(\"data-phx-hook\")){\n      toEl.setAttribute(\"data-phx-hook\", fromEl.getAttribute(\"data-phx-hook\"))\n    }\n    // add hooks to elements with viewport attributes\n    if(toEl.hasAttribute && (toEl.hasAttribute(phxViewportTop) || toEl.hasAttribute(phxViewportBottom))){\n      toEl.setAttribute(\"data-phx-hook\", \"Phoenix.InfiniteScroll\")\n    }\n  },\n\n  putCustomElHook(el, hook){\n    if(el.isConnected){\n      el.setAttribute(\"data-phx-hook\", \"\")\n    } else {\n      console.error(`\n        hook attached to non-connected DOM element\n        ensure you are calling createHook within your connectedCallback. ${el.outerHTML}\n      `)\n    }\n    this.putPrivate(el, \"custom-el-hook\", hook)\n  },\n\n  getCustomElHook(el){ return this.private(el, \"custom-el-hook\") },\n\n  isUsedInput(el){\n    return (el.nodeType === Node.ELEMENT_NODE &&\n      (this.private(el, PHX_HAS_FOCUSED) || this.private(el, PHX_HAS_SUBMITTED)))\n  },\n\n  resetForm(form){\n    Array.from(form.elements).forEach(input => {\n      this.deletePrivate(input, PHX_HAS_FOCUSED)\n      this.deletePrivate(input, PHX_HAS_SUBMITTED)\n    })\n  },\n\n  isPhxChild(node){\n    return node.getAttribute && node.getAttribute(PHX_PARENT_ID)\n  },\n\n  isPhxSticky(node){\n    return node.getAttribute && node.getAttribute(PHX_STICKY) !== null\n  },\n\n  isChildOfAny(el, parents){\n    return !!parents.find(parent => parent.contains(el))\n  },\n\n  firstPhxChild(el){\n    return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0]\n  },\n\n  dispatchEvent(target, name, opts = {}){\n    let defaultBubble = true\n    let isUploadTarget = target.nodeName === \"INPUT\" && target.type === \"file\"\n    if(isUploadTarget && name === \"click\"){\n      defaultBubble = false\n    }\n    let bubbles = opts.bubbles === undefined ? defaultBubble : !!opts.bubbles\n    let eventOpts = {bubbles: bubbles, cancelable: true, detail: opts.detail || {}}\n    let event = name === \"click\" ? new MouseEvent(\"click\", eventOpts) : new CustomEvent(name, eventOpts)\n    target.dispatchEvent(event)\n  },\n\n  cloneNode(node, html){\n    if(typeof (html) === \"undefined\"){\n      return node.cloneNode(true)\n    } else {\n      let cloned = node.cloneNode(false)\n      cloned.innerHTML = html\n      return cloned\n    }\n  },\n\n  // merge attributes from source to target\n  // if an element is ignored, we only merge data attributes\n  // including removing data attributes that are no longer in the source\n  mergeAttrs(target, source, opts = {}){\n    let exclude = new Set(opts.exclude || [])\n    let isIgnored = opts.isIgnored\n    let sourceAttrs = source.attributes\n    for(let i = sourceAttrs.length - 1; i >= 0; i--){\n      let name = sourceAttrs[i].name\n      if(!exclude.has(name)){\n        const sourceValue = source.getAttribute(name)\n        if(target.getAttribute(name) !== sourceValue && (!isIgnored || (isIgnored && name.startsWith(\"data-\")))){\n          target.setAttribute(name, sourceValue)\n        }\n      } else {\n        // We exclude the value from being merged on focused inputs, because the\n        // user's input should always win.\n        // We can still assign it as long as the value property is the same, though.\n        // This prevents a situation where the updated hook is not being triggered\n        // when an input is back in its \"original state\", because the attribute\n        // was never changed, see:\n        // https://github.com/phoenixframework/phoenix_live_view/issues/2163\n        if(name === \"value\" && target.value === source.value){\n          // actually set the value attribute to sync it with the value property\n          target.setAttribute(\"value\", source.getAttribute(name))\n        }\n      }\n    }\n\n    let targetAttrs = target.attributes\n    for(let i = targetAttrs.length - 1; i >= 0; i--){\n      let name = targetAttrs[i].name\n      if(isIgnored){\n        if(name.startsWith(\"data-\") && !source.hasAttribute(name) && !PHX_PENDING_ATTRS.includes(name)){ target.removeAttribute(name) }\n      } else {\n        if(!source.hasAttribute(name)){ target.removeAttribute(name) }\n      }\n    }\n  },\n\n  mergeFocusedInput(target, source){\n    // skip selects because FF will reset highlighted index for any setAttribute\n    if(!(target instanceof HTMLSelectElement)){ DOM.mergeAttrs(target, source, {exclude: [\"value\"]}) }\n\n    if(source.readOnly){\n      target.setAttribute(\"readonly\", true)\n    } else {\n      target.removeAttribute(\"readonly\")\n    }\n  },\n\n  hasSelectionRange(el){\n    return el.setSelectionRange && (el.type === \"text\" || el.type === \"textarea\")\n  },\n\n  restoreFocus(focused, selectionStart, selectionEnd){\n    if(focused instanceof HTMLSelectElement){ focused.focus() }\n    if(!DOM.isTextualInput(focused)){ return }\n\n    let wasFocused = focused.matches(\":focus\")\n    if(!wasFocused){ focused.focus() }\n    if(this.hasSelectionRange(focused)){\n      focused.setSelectionRange(selectionStart, selectionEnd)\n    }\n  },\n\n  isFormInput(el){ return /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== \"button\" },\n\n  syncAttrsToProps(el){\n    if(el instanceof HTMLInputElement && CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0){\n      el.checked = el.getAttribute(\"checked\") !== null\n    }\n  },\n\n  isTextualInput(el){ return FOCUSABLE_INPUTS.indexOf(el.type) >= 0 },\n\n  isNowTriggerFormExternal(el, phxTriggerExternal){\n    return el.getAttribute && el.getAttribute(phxTriggerExternal) !== null && document.body.contains(el)\n  },\n\n  cleanChildNodes(container, phxUpdate){\n    if(DOM.isPhxUpdate(container, phxUpdate, [\"append\", \"prepend\"])){\n      let toRemove = []\n      container.childNodes.forEach(childNode => {\n        if(!childNode.id){\n          // Skip warning if it's an empty text node (e.g. a new-line)\n          let isEmptyTextNode = childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue.trim() === \"\"\n          if(!isEmptyTextNode && childNode.nodeType !== Node.COMMENT_NODE){\n            logError(\"only HTML element tags with an id are allowed inside containers with phx-update.\\n\\n\" +\n              `removing illegal node: \"${(childNode.outerHTML || childNode.nodeValue).trim()}\"\\n\\n`)\n          }\n          toRemove.push(childNode)\n        }\n      })\n      toRemove.forEach(childNode => childNode.remove())\n    }\n  },\n\n  replaceRootContainer(container, tagName, attrs){\n    let retainedAttrs = new Set([\"id\", PHX_SESSION, PHX_STATIC, PHX_MAIN, PHX_ROOT_ID])\n    if(container.tagName.toLowerCase() === tagName.toLowerCase()){\n      Array.from(container.attributes)\n        .filter(attr => !retainedAttrs.has(attr.name.toLowerCase()))\n        .forEach(attr => container.removeAttribute(attr.name))\n\n      Object.keys(attrs)\n        .filter(name => !retainedAttrs.has(name.toLowerCase()))\n        .forEach(attr => container.setAttribute(attr, attrs[attr]))\n\n      return container\n\n    } else {\n      let newContainer = document.createElement(tagName)\n      Object.keys(attrs).forEach(attr => newContainer.setAttribute(attr, attrs[attr]))\n      retainedAttrs.forEach(attr => newContainer.setAttribute(attr, container.getAttribute(attr)))\n      newContainer.innerHTML = container.innerHTML\n      container.replaceWith(newContainer)\n      return newContainer\n    }\n  },\n\n  getSticky(el, name, defaultVal){\n    let op = (DOM.private(el, \"sticky\") || []).find(([existingName,]) => name === existingName)\n    if(op){\n      let [_name, _op, stashedResult] = op\n      return stashedResult\n    } else {\n      return typeof(defaultVal) === \"function\" ? defaultVal() : defaultVal\n    }\n  },\n\n  deleteSticky(el, name){\n    this.updatePrivate(el, \"sticky\", [], ops => {\n      return ops.filter(([existingName, _]) => existingName !== name)\n    })\n  },\n\n  putSticky(el, name, op){\n    let stashedResult = op(el)\n    this.updatePrivate(el, \"sticky\", [], ops => {\n      let existingIndex = ops.findIndex(([existingName,]) => name === existingName)\n      if(existingIndex >= 0){\n        ops[existingIndex] = [name, op, stashedResult]\n      } else {\n        ops.push([name, op, stashedResult])\n      }\n      return ops\n    })\n  },\n\n  applyStickyOperations(el){\n    let ops = DOM.private(el, \"sticky\")\n    if(!ops){ return }\n\n    ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op))\n  }\n}\n\nexport default DOM\n", "import {\n  PHX_ACTIVE_ENTRY_REFS,\n  PHX_LIVE_FILE_UPDATED,\n  PHX_PREFLIGHTED_REFS\n} from \"./constants\"\n\nimport {\n  channelUploader,\n  logError\n} from \"./utils\"\n\nimport LiveUploader from \"./live_uploader\"\n\nexport default class UploadEntry {\n  static isActive(fileEl, file){\n    let isNew = file._phxRef === undefined\n    let activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\")\n    let isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0\n    return file.size > 0 && (isNew || isActive)\n  }\n\n  static isPreflighted(fileEl, file){\n    let preflightedRefs = fileEl.getAttribute(PHX_PREFLIGHTED_REFS).split(\",\")\n    let isPreflighted = preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0\n    return isPreflighted && this.isActive(fileEl, file)\n  }\n\n  static isPreflightInProgress(file){\n    return file._preflightInProgress === true\n  }\n\n  static markPreflightInProgress(file){\n    file._preflightInProgress = true\n  }\n\n  constructor(fileEl, file, view, autoUpload){\n    this.ref = LiveUploader.genFileRef(file)\n    this.fileEl = fileEl\n    this.file = file\n    this.view = view\n    this.meta = null\n    this._isCancelled = false\n    this._isDone = false\n    this._progress = 0\n    this._lastProgressSent = -1\n    this._onDone = function(){ }\n    this._onElUpdated = this.onElUpdated.bind(this)\n    this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n    this.autoUpload = autoUpload\n  }\n\n  metadata(){ return this.meta }\n\n  progress(progress){\n    this._progress = Math.floor(progress)\n    if(this._progress > this._lastProgressSent){\n      if(this._progress >= 100){\n        this._progress = 100\n        this._lastProgressSent = 100\n        this._isDone = true\n        this.view.pushFileProgress(this.fileEl, this.ref, 100, () => {\n          LiveUploader.untrackFile(this.fileEl, this.file)\n          this._onDone()\n        })\n      } else {\n        this._lastProgressSent = this._progress\n        this.view.pushFileProgress(this.fileEl, this.ref, this._progress)\n      }\n    }\n  }\n\n  isCancelled(){ return this._isCancelled }\n\n  cancel(){\n    this.file._preflightInProgress = false\n    this._isCancelled = true\n    this._isDone = true\n    this._onDone()\n  }\n\n  isDone(){ return this._isDone }\n\n  error(reason = \"failed\"){\n    this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n    this.view.pushFileProgress(this.fileEl, this.ref, {error: reason})\n    if(!this.isAutoUpload()){ LiveUploader.clearFiles(this.fileEl) }\n  }\n\n  isAutoUpload(){ return this.autoUpload }\n\n  //private\n\n  onDone(callback){\n    this._onDone = () => {\n      this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n      callback()\n    }\n  }\n\n  onElUpdated(){\n    let activeRefs = this.fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\")\n    if(activeRefs.indexOf(this.ref) === -1){\n      LiveUploader.untrackFile(this.fileEl, this.file)\n      this.cancel()\n    }\n  }\n\n  toPreflightPayload(){\n    return {\n      last_modified: this.file.lastModified,\n      name: this.file.name,\n      relative_path: this.file.webkitRelativePath,\n      size: this.file.size,\n      type: this.file.type,\n      ref: this.ref,\n      meta: typeof(this.file.meta) === \"function\" ? this.file.meta() : undefined\n    }\n  }\n\n  uploader(uploaders){\n    if(this.meta.uploader){\n      let callback = uploaders[this.meta.uploader] || logError(`no uploader configured for ${this.meta.uploader}`)\n      return {name: this.meta.uploader, callback: callback}\n    } else {\n      return {name: \"channel\", callback: channelUploader}\n    }\n  }\n\n  zipPostFlight(resp){\n    this.meta = resp.entries[this.ref]\n    if(!this.meta){ logError(`no preflight upload response returned with ref ${this.ref}`, {input: this.fileEl, response: resp}) }\n  }\n}\n", "import {\n  PHX_DONE_REFS,\n  PHX_PREFLIGHTED_REFS,\n  PHX_UPLOAD_REF\n} from \"./constants\"\n\nimport {\n} from \"./utils\"\n\nimport DOM from \"./dom\"\nimport UploadEntry from \"./upload_entry\"\n\nlet liveUploaderFileRef = 0\n\nexport default class LiveUploader {\n  static genFileRef(file){\n    let ref = file._phxRef\n    if(ref !== undefined){\n      return ref\n    } else {\n      file._phxRef = (liveUploaderFileRef++).toString()\n      return file._phxRef\n    }\n  }\n\n  static getEntryDataURL(inputEl, ref, callback){\n    let file = this.activeFiles(inputEl).find(file => this.genFileRef(file) === ref)\n    callback(URL.createObjectURL(file))\n  }\n\n  static hasUploadsInProgress(formEl){\n    let active = 0\n    DOM.findUploadInputs(formEl).forEach(input => {\n      if(input.getAttribute(PHX_PREFLIGHTED_REFS) !== input.getAttribute(PHX_DONE_REFS)){\n        active++\n      }\n    })\n    return active > 0\n  }\n\n  static serializeUploads(inputEl){\n    let files = this.activeFiles(inputEl)\n    let fileData = {}\n    files.forEach(file => {\n      let entry = {path: inputEl.name}\n      let uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF)\n      fileData[uploadRef] = fileData[uploadRef] || []\n      entry.ref = this.genFileRef(file)\n      entry.last_modified = file.lastModified\n      entry.name = file.name || entry.ref\n      entry.relative_path = file.webkitRelativePath\n      entry.type = file.type\n      entry.size = file.size\n      if(typeof(file.meta) === \"function\"){ entry.meta = file.meta() }\n      fileData[uploadRef].push(entry)\n    })\n    return fileData\n  }\n\n  static clearFiles(inputEl){\n    inputEl.value = null\n    inputEl.removeAttribute(PHX_UPLOAD_REF)\n    DOM.putPrivate(inputEl, \"files\", [])\n  }\n\n  static untrackFile(inputEl, file){\n    DOM.putPrivate(inputEl, \"files\", DOM.private(inputEl, \"files\").filter(f => !Object.is(f, file)))\n  }\n\n  static trackFiles(inputEl, files, dataTransfer){\n    if(inputEl.getAttribute(\"multiple\") !== null){\n      let newFiles = files.filter(file => !this.activeFiles(inputEl).find(f => Object.is(f, file)))\n      DOM.updatePrivate(inputEl, \"files\", [], (existing) => existing.concat(newFiles))\n      inputEl.value = null\n    } else {\n      // Reset inputEl files to align output with programmatic changes (i.e. drag and drop)\n      if(dataTransfer && dataTransfer.files.length > 0){ inputEl.files = dataTransfer.files }\n      DOM.putPrivate(inputEl, \"files\", files)\n    }\n  }\n\n  static activeFileInputs(formEl){\n    let fileInputs = DOM.findUploadInputs(formEl)\n    return Array.from(fileInputs).filter(el => el.files && this.activeFiles(el).length > 0)\n  }\n\n  static activeFiles(input){\n    return (DOM.private(input, \"files\") || []).filter(f => UploadEntry.isActive(input, f))\n  }\n\n  static inputsAwaitingPreflight(formEl){\n    let fileInputs = DOM.findUploadInputs(formEl)\n    return Array.from(fileInputs).filter(input => this.filesAwaitingPreflight(input).length > 0)\n  }\n\n  static filesAwaitingPreflight(input){\n    return this.activeFiles(input).filter(f => !UploadEntry.isPreflighted(input, f) && !UploadEntry.isPreflightInProgress(f))\n  }\n\n  static markPreflightInProgress(entries){\n    entries.forEach(entry => UploadEntry.markPreflightInProgress(entry.file))\n  }\n\n  constructor(inputEl, view, onComplete){\n    this.autoUpload = DOM.isAutoUpload(inputEl)\n    this.view = view\n    this.onComplete = onComplete\n    this._entries =\n      Array.from(LiveUploader.filesAwaitingPreflight(inputEl) || [])\n        .map(file => new UploadEntry(inputEl, file, view, this.autoUpload))\n\n    // prevent sending duplicate preflight requests\n    LiveUploader.markPreflightInProgress(this._entries)\n\n    this.numEntriesInProgress = this._entries.length\n  }\n\n  isAutoUpload(){ return this.autoUpload }\n\n  entries(){ return this._entries }\n\n  initAdapterUpload(resp, onError, liveSocket){\n    this._entries =\n      this._entries.map(entry => {\n        if(entry.isCancelled()){\n          this.numEntriesInProgress--\n          if(this.numEntriesInProgress === 0){ this.onComplete() }\n        } else {\n          entry.zipPostFlight(resp)\n          entry.onDone(() => {\n            this.numEntriesInProgress--\n            if(this.numEntriesInProgress === 0){ this.onComplete() }\n          })\n        }\n        return entry\n      })\n\n    let groupedEntries = this._entries.reduce((acc, entry) => {\n      if(!entry.meta){ return acc }\n      let {name, callback} = entry.uploader(liveSocket.uploaders)\n      acc[name] = acc[name] || {callback: callback, entries: []}\n      acc[name].entries.push(entry)\n      return acc\n    }, {})\n\n    for(let name in groupedEntries){\n      let {callback, entries} = groupedEntries[name]\n      callback(entries, onError, resp, liveSocket)\n    }\n  }\n}\n", "let ARIA = {\n  anyOf(instance, classes){ return classes.find(name => instance instanceof name) },\n\n  isFocusable(el, interactiveOnly){\n    return (\n      (el instanceof HTMLAnchorElement && el.rel !== \"ignore\") ||\n      (el instanceof HTMLAreaElement && el.href !== undefined) ||\n      (!el.disabled && (this.anyOf(el, [HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, HTMLButtonElement]))) ||\n      (el instanceof HTMLIFrameElement) ||\n      (el.tabIndex > 0 || (!interactiveOnly && el.getAttribute(\"tabindex\") !== null && el.getAttribute(\"aria-hidden\") !== \"true\"))\n    )\n  },\n\n  attemptFocus(el, interactiveOnly){\n    if(this.isFocusable(el, interactiveOnly)){ try { el.focus() } catch {} }\n    return !!document.activeElement && document.activeElement.isSameNode(el)\n  },\n\n  focusFirstInteractive(el){\n    let child = el.firstElementChild\n    while(child){\n      if(this.attemptFocus(child, true) || this.focusFirstInteractive(child, true)){\n        return true\n      }\n      child = child.nextElementSibling\n    }\n  },\n\n  focusFirst(el){\n    let child = el.firstElementChild\n    while(child){\n      if(this.attemptFocus(child) || this.focusFirst(child)){\n        return true\n      }\n      child = child.nextElementSibling\n    }\n  },\n\n  focusLast(el){\n    let child = el.lastElementChild\n    while(child){\n      if(this.attemptFocus(child) || this.focusLast(child)){\n        return true\n      }\n      child = child.previousElementSibling\n    }\n  }\n}\nexport default ARIA\n", "import {\n  PHX_ACTIVE_ENTRY_REFS,\n  PHX_LIVE_FILE_UPDATED,\n  PHX_PREFLIGHTED_REFS,\n  PHX_UPLOAD_REF\n} from \"./constants\"\n\nimport LiveUploader from \"./live_uploader\"\nimport ARIA from \"./aria\"\n\nlet Hooks = {\n  LiveFileUpload: {\n    activeRefs(){ return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS) },\n\n    preflightedRefs(){ return this.el.getAttribute(PHX_PREFLIGHTED_REFS) },\n\n    mounted(){ this.preflightedWas = this.preflightedRefs() },\n\n    updated(){\n      let newPreflights = this.preflightedRefs()\n      if(this.preflightedWas !== newPreflights){\n        this.preflightedWas = newPreflights\n        if(newPreflights === \"\"){\n          this.__view().cancelSubmit(this.el.form)\n        }\n      }\n\n      if(this.activeRefs() === \"\"){ this.el.value = null }\n      this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED))\n    }\n  },\n\n  LiveImgPreview: {\n    mounted(){\n      this.ref = this.el.getAttribute(\"data-phx-entry-ref\")\n      this.inputEl = document.getElementById(this.el.getAttribute(PHX_UPLOAD_REF))\n      LiveUploader.getEntryDataURL(this.inputEl, this.ref, url => {\n        this.url = url\n        this.el.src = url\n      })\n    },\n    destroyed(){\n      URL.revokeObjectURL(this.url)\n    }\n  },\n  FocusWrap: {\n    mounted(){\n      this.focusStart = this.el.firstElementChild\n      this.focusEnd = this.el.lastElementChild\n      this.focusStart.addEventListener(\"focus\", () => ARIA.focusLast(this.el))\n      this.focusEnd.addEventListener(\"focus\", () => ARIA.focusFirst(this.el))\n      this.el.addEventListener(\"phx:show-end\", () => this.el.focus())\n      if(window.getComputedStyle(this.el).display !== \"none\"){\n        ARIA.focusFirst(this.el)\n      }\n    }\n  }\n}\n\nlet findScrollContainer = (el) => {\n  // the scroll event won't be fired on the html/body element even if overflow is set\n  // therefore we return null to instead listen for scroll events on document\n  if([\"HTML\", \"BODY\"].indexOf(el.nodeName.toUpperCase()) >= 0) return null\n  if([\"scroll\", \"auto\"].indexOf(getComputedStyle(el).overflowY) >= 0) return el\n  return findScrollContainer(el.parentElement)\n}\n\nlet scrollTop = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.scrollTop\n  } else {\n    return document.documentElement.scrollTop || document.body.scrollTop\n  }\n}\n\nlet bottom = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.getBoundingClientRect().bottom\n  } else {\n    // when we have no container, the whole page scrolls,\n    // therefore the bottom coordinate is the viewport height\n    return window.innerHeight || document.documentElement.clientHeight\n  }\n}\n\nlet top = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.getBoundingClientRect().top\n  } else {\n    // when we have no container the whole page scrolls,\n    // therefore the top coordinate is 0\n    return 0\n  }\n}\n\nlet isAtViewportTop = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer)\n}\n\nlet isAtViewportBottom = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.bottom) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.bottom) <= bottom(scrollContainer)\n}\n\nlet isWithinViewport = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer)\n}\n\nHooks.InfiniteScroll = {\n  mounted(){\n    this.scrollContainer = findScrollContainer(this.el)\n    let scrollBefore = scrollTop(this.scrollContainer)\n    let topOverran = false\n    let throttleInterval = 500\n    let pendingOp = null\n\n    let onTopOverrun = this.throttle(throttleInterval, (topEvent, firstChild) => {\n      pendingOp = () => true\n      this.liveSocket.execJSHookPush(this.el, topEvent, {id: firstChild.id, _overran: true}, () => {\n        pendingOp = null\n      })\n    })\n\n    let onFirstChildAtTop = this.throttle(throttleInterval, (topEvent, firstChild) => {\n      pendingOp = () => firstChild.scrollIntoView({block: \"start\"})\n      this.liveSocket.execJSHookPush(this.el, topEvent, {id: firstChild.id}, () => {\n        pendingOp = null\n        // make sure that the DOM is patched by waiting for the next tick\n        window.requestAnimationFrame(() => {\n          if(!isWithinViewport(firstChild, this.scrollContainer)){\n            firstChild.scrollIntoView({block: \"start\"})\n          }\n        })\n      })\n    })\n\n    let onLastChildAtBottom = this.throttle(throttleInterval, (bottomEvent, lastChild) => {\n      pendingOp = () => lastChild.scrollIntoView({block: \"end\"})\n      this.liveSocket.execJSHookPush(this.el, bottomEvent, {id: lastChild.id}, () => {\n        pendingOp = null\n        // make sure that the DOM is patched by waiting for the next tick\n        window.requestAnimationFrame(() => {\n          if(!isWithinViewport(lastChild, this.scrollContainer)){\n            lastChild.scrollIntoView({block: \"end\"})\n          }\n        })\n      })\n    })\n\n    this.onScroll = (_e) => {\n      let scrollNow = scrollTop(this.scrollContainer)\n\n      if(pendingOp){\n        scrollBefore = scrollNow\n        return pendingOp()\n      }\n      let rect = this.el.getBoundingClientRect()\n      let topEvent = this.el.getAttribute(this.liveSocket.binding(\"viewport-top\"))\n      let bottomEvent = this.el.getAttribute(this.liveSocket.binding(\"viewport-bottom\"))\n      let lastChild = this.el.lastElementChild\n      let firstChild = this.el.firstElementChild\n      let isScrollingUp = scrollNow < scrollBefore\n      let isScrollingDown = scrollNow > scrollBefore\n\n      // el overran while scrolling up\n      if(isScrollingUp && topEvent && !topOverran && rect.top >= 0){\n        topOverran = true\n        onTopOverrun(topEvent, firstChild)\n      } else if(isScrollingDown && topOverran && rect.top <= 0){\n        topOverran = false\n      }\n\n      if(topEvent && isScrollingUp && isAtViewportTop(firstChild, this.scrollContainer)){\n        onFirstChildAtTop(topEvent, firstChild)\n      } else if(bottomEvent && isScrollingDown && isAtViewportBottom(lastChild, this.scrollContainer)){\n        onLastChildAtBottom(bottomEvent, lastChild)\n      }\n      scrollBefore = scrollNow\n    }\n\n    if(this.scrollContainer){\n      this.scrollContainer.addEventListener(\"scroll\", this.onScroll)\n    } else {\n      window.addEventListener(\"scroll\", this.onScroll)\n    }\n  },\n  \n  destroyed(){\n    if(this.scrollContainer){\n      this.scrollContainer.removeEventListener(\"scroll\", this.onScroll)\n    } else {\n      window.removeEventListener(\"scroll\", this.onScroll)\n    }\n  },\n\n  throttle(interval, callback){\n    let lastCallAt = 0\n    let timer\n\n    return (...args) => {\n      let now = Date.now()\n      let remainingTime = interval - (now - lastCallAt)\n\n      if(remainingTime <= 0 || remainingTime > interval){\n        if(timer){\n          clearTimeout(timer)\n          timer = null\n        }\n        lastCallAt = now\n        callback(...args)\n      } else if(!timer){\n        timer = setTimeout(() => {\n          lastCallAt = Date.now()\n          timer = null\n          callback(...args)\n        }, remainingTime)\n      }\n    }\n  }\n}\nexport default Hooks\n", "import {\n  PHX_REF_LOADING,\n  PHX_REF_LOCK,\n  PHX_REF_SRC,\n  PHX_EVENT_CLASSES,\n  PHX_DISABLED,\n  PHX_READONLY,\n  PHX_DISABLE_WITH_RESTORE\n} from \"./constants\"\n\nimport DOM from \"./dom\"\n\nexport default class ElementRef {\n  constructor(el){\n    this.el = el\n    this.loadingRef = el.hasAttribute(PHX_REF_LOADING) ? parseInt(el.getAttribute(PHX_REF_LOADING), 10) : null\n    this.lockRef = el.hasAttribute(PHX_REF_LOCK) ? parseInt(el.getAttribute(PHX_REF_LOCK), 10) : null\n  }\n\n  // public\n\n  maybeUndo(ref, phxEvent, eachCloneCallback){\n    if(!this.isWithin(ref)){ return }\n\n    // undo locks and apply clones\n    this.undoLocks(ref, phxEvent, eachCloneCallback)\n\n    // undo loading states\n    this.undoLoading(ref, phxEvent)\n\n    // clean up if fully resolved\n    if(this.isFullyResolvedBy(ref)){ this.el.removeAttribute(PHX_REF_SRC) }\n  }\n\n  // private\n\n  isWithin(ref){\n    return !((this.loadingRef !== null && this.loadingRef > ref) && (this.lockRef !== null && this.lockRef > ref))\n  }\n\n  // Check for cloned PHX_REF_LOCK element that has been morphed behind\n  // the scenes while this element was locked in the DOM.\n  // When we apply the cloned tree to the active DOM element, we must\n  //\n  //   1. execute pending mounted hooks for nodes now in the DOM\n  //   2. undo any ref inside the cloned tree that has since been ack'd\n  undoLocks(ref, phxEvent, eachCloneCallback){\n    if(!this.isLockUndoneBy(ref)){ return }\n\n    let clonedTree = DOM.private(this.el, PHX_REF_LOCK)\n    if(clonedTree){\n      eachCloneCallback(clonedTree)\n      DOM.deletePrivate(this.el, PHX_REF_LOCK)\n    }\n    this.el.removeAttribute(PHX_REF_LOCK)\n\n    let opts = {detail: {ref: ref, event: phxEvent}, bubbles: true, cancelable: false}\n    this.el.dispatchEvent(new CustomEvent(`phx:undo-lock:${this.lockRef}`, opts))\n  }\n\n  undoLoading(ref, phxEvent){\n    if(!this.isLoadingUndoneBy(ref)){\n      if(this.canUndoLoading(ref) && this.el.classList.contains(\"phx-submit-loading\")){\n        this.el.classList.remove(\"phx-change-loading\")\n      }\n      return\n    }\n\n    if(this.canUndoLoading(ref)){\n      this.el.removeAttribute(PHX_REF_LOADING)\n      let disabledVal = this.el.getAttribute(PHX_DISABLED)\n      let readOnlyVal = this.el.getAttribute(PHX_READONLY)\n      // restore inputs\n      if(readOnlyVal !== null){\n        this.el.readOnly = readOnlyVal === \"true\" ? true : false\n        this.el.removeAttribute(PHX_READONLY)\n      }\n      if(disabledVal !== null){\n        this.el.disabled = disabledVal === \"true\" ? true : false\n        this.el.removeAttribute(PHX_DISABLED)\n      }\n      // restore disables\n      let disableRestore = this.el.getAttribute(PHX_DISABLE_WITH_RESTORE)\n      if(disableRestore !== null){\n        this.el.innerText = disableRestore\n        this.el.removeAttribute(PHX_DISABLE_WITH_RESTORE)\n      }\n\n      let opts = {detail: {ref: ref, event: phxEvent}, bubbles: true, cancelable: false}\n      this.el.dispatchEvent(new CustomEvent(`phx:undo-loading:${this.loadingRef}`, opts))\n    }\n\n    // remove classes\n    PHX_EVENT_CLASSES.forEach(name => {\n      if(name !== \"phx-submit-loading\" || this.canUndoLoading(ref)){\n        DOM.removeClass(this.el, name)\n      }\n    })\n  }\n\n  isLoadingUndoneBy(ref){ return this.loadingRef === null ? false : this.loadingRef <= ref }\n  isLockUndoneBy(ref){ return this.lockRef === null ? false : this.lockRef <= ref }\n\n  isFullyResolvedBy(ref){\n    return (this.loadingRef === null || this.loadingRef <= ref) && (this.lockRef === null || this.lockRef <= ref)\n  }\n\n  // only remove the phx-submit-loading class if we are not locked\n  canUndoLoading(ref){ return this.lockRef === null || this.lockRef <= ref }\n}\n", "import {\n  maybe\n} from \"./utils\"\n\nimport DOM from \"./dom\"\n\nexport default class DOMPostMorphRestorer {\n  constructor(containerBefore, containerAfter, updateType){\n    let idsBefore = new Set()\n    let idsAfter = new Set([...containerAfter.children].map(child => child.id))\n\n    let elementsToModify = []\n\n    Array.from(containerBefore.children).forEach(child => {\n      if(child.id){ // all of our children should be elements with ids\n        idsBefore.add(child.id)\n        if(idsAfter.has(child.id)){\n          let previousElementId = child.previousElementSibling && child.previousElementSibling.id\n          elementsToModify.push({elementId: child.id, previousElementId: previousElementId})\n        }\n      }\n    })\n\n    this.containerId = containerAfter.id\n    this.updateType = updateType\n    this.elementsToModify = elementsToModify\n    this.elementIdsToAdd = [...idsAfter].filter(id => !idsBefore.has(id))\n  }\n\n  // We do the following to optimize append/prepend operations:\n  //   1) Track ids of modified elements & of new elements\n  //   2) All the modified elements are put back in the correct position in the DOM tree\n  //      by storing the id of their previous sibling\n  //   3) New elements are going to be put in the right place by morphdom during append.\n  //      For prepend, we move them to the first position in the container\n  perform(){\n    let container = DOM.byId(this.containerId)\n    this.elementsToModify.forEach(elementToModify => {\n      if(elementToModify.previousElementId){\n        maybe(document.getElementById(elementToModify.previousElementId), previousElem => {\n          maybe(document.getElementById(elementToModify.elementId), elem => {\n            let isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id\n            if(!isInRightPlace){\n              previousElem.insertAdjacentElement(\"afterend\", elem)\n            }\n          })\n        })\n      } else {\n        // This is the first element in the container\n        maybe(document.getElementById(elementToModify.elementId), elem => {\n          let isInRightPlace = elem.previousElementSibling == null\n          if(!isInRightPlace){\n            container.insertAdjacentElement(\"afterbegin\", elem)\n          }\n        })\n      }\n    })\n\n    if(this.updateType == \"prepend\"){\n      this.elementIdsToAdd.reverse().forEach(elemId => {\n        maybe(document.getElementById(elemId), elem => container.insertAdjacentElement(\"afterbegin\", elem))\n      })\n    }\n  }\n}\n", "var DOCUMENT_FRAGMENT_NODE = 11;\n\nfunction morphAttrs(fromNode, toNode) {\n    var toNodeAttrs = toNode.attributes;\n    var attr;\n    var attrName;\n    var attrNamespaceURI;\n    var attrValue;\n    var fromValue;\n\n    // document-fragments dont have attributes so lets not do anything\n    if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n      return;\n    }\n\n    // update attributes on original DOM element\n    for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n        attr = toNodeAttrs[i];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n        attrValue = attr.value;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n            fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n\n            if (fromValue !== attrValue) {\n                if (attr.prefix === 'xmlns'){\n                    attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix\n                }\n                fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n            }\n        } else {\n            fromValue = fromNode.getAttribute(attrName);\n\n            if (fromValue !== attrValue) {\n                fromNode.setAttribute(attrName, attrValue);\n            }\n        }\n    }\n\n    // Remove any extra attributes found on the original DOM element that\n    // weren't found on the target element.\n    var fromNodeAttrs = fromNode.attributes;\n\n    for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n        attr = fromNodeAttrs[d];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n\n            if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n                fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n            }\n        } else {\n            if (!toNode.hasAttribute(attrName)) {\n                fromNode.removeAttribute(attrName);\n            }\n        }\n    }\n}\n\nvar range; // Create a range object for efficently rendering strings to elements.\nvar NS_XHTML = 'http://www.w3.org/1999/xhtml';\n\nvar doc = typeof document === 'undefined' ? undefined : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();\n\nfunction createFragmentFromTemplate(str) {\n    var template = doc.createElement('template');\n    template.innerHTML = str;\n    return template.content.childNodes[0];\n}\n\nfunction createFragmentFromRange(str) {\n    if (!range) {\n        range = doc.createRange();\n        range.selectNode(doc.body);\n    }\n\n    var fragment = range.createContextualFragment(str);\n    return fragment.childNodes[0];\n}\n\nfunction createFragmentFromWrap(str) {\n    var fragment = doc.createElement('body');\n    fragment.innerHTML = str;\n    return fragment.childNodes[0];\n}\n\n/**\n * This is about the same\n * var html = new DOMParser().parseFromString(str, 'text/html');\n * return html.body.firstChild;\n *\n * @method toElement\n * @param {String} str\n */\nfunction toElement(str) {\n    str = str.trim();\n    if (HAS_TEMPLATE_SUPPORT) {\n      // avoid restrictions on content for things like `<tr><th>Hi</th></tr>` which\n      // createContextualFragment doesn't support\n      // <template> support not available in IE\n      return createFragmentFromTemplate(str);\n    } else if (HAS_RANGE_SUPPORT) {\n      return createFragmentFromRange(str);\n    }\n\n    return createFragmentFromWrap(str);\n}\n\n/**\n * Returns true if two node's names are the same.\n *\n * NOTE: We don't bother checking `namespaceURI` because you will never find two HTML elements with the same\n *       nodeName and different namespace URIs.\n *\n * @param {Element} a\n * @param {Element} b The target element\n * @return {boolean}\n */\nfunction compareNodeNames(fromEl, toEl) {\n    var fromNodeName = fromEl.nodeName;\n    var toNodeName = toEl.nodeName;\n    var fromCodeStart, toCodeStart;\n\n    if (fromNodeName === toNodeName) {\n        return true;\n    }\n\n    fromCodeStart = fromNodeName.charCodeAt(0);\n    toCodeStart = toNodeName.charCodeAt(0);\n\n    // If the target element is a virtual DOM node or SVG node then we may\n    // need to normalize the tag name before comparing. Normal HTML elements that are\n    // in the \"http://www.w3.org/1999/xhtml\"\n    // are converted to upper case\n    if (fromCodeStart <= 90 && toCodeStart >= 97) { // from is upper and to is lower\n        return fromNodeName === toNodeName.toUpperCase();\n    } else if (toCodeStart <= 90 && fromCodeStart >= 97) { // to is upper and from is lower\n        return toNodeName === fromNodeName.toUpperCase();\n    } else {\n        return false;\n    }\n}\n\n/**\n * Create an element, optionally with a known namespace URI.\n *\n * @param {string} name the element name, e.g. 'div' or 'svg'\n * @param {string} [namespaceURI] the element's namespace URI, i.e. the value of\n * its `xmlns` attribute or its inferred namespace.\n *\n * @return {Element}\n */\nfunction createElementNS(name, namespaceURI) {\n    return !namespaceURI || namespaceURI === NS_XHTML ?\n        doc.createElement(name) :\n        doc.createElementNS(namespaceURI, name);\n}\n\n/**\n * Copies the children of one DOM element to another DOM element\n */\nfunction moveChildren(fromEl, toEl) {\n    var curChild = fromEl.firstChild;\n    while (curChild) {\n        var nextChild = curChild.nextSibling;\n        toEl.appendChild(curChild);\n        curChild = nextChild;\n    }\n    return toEl;\n}\n\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n    if (fromEl[name] !== toEl[name]) {\n        fromEl[name] = toEl[name];\n        if (fromEl[name]) {\n            fromEl.setAttribute(name, '');\n        } else {\n            fromEl.removeAttribute(name);\n        }\n    }\n}\n\nvar specialElHandlers = {\n    OPTION: function(fromEl, toEl) {\n        var parentNode = fromEl.parentNode;\n        if (parentNode) {\n            var parentName = parentNode.nodeName.toUpperCase();\n            if (parentName === 'OPTGROUP') {\n                parentNode = parentNode.parentNode;\n                parentName = parentNode && parentNode.nodeName.toUpperCase();\n            }\n            if (parentName === 'SELECT' && !parentNode.hasAttribute('multiple')) {\n                if (fromEl.hasAttribute('selected') && !toEl.selected) {\n                    // Workaround for MS Edge bug where the 'selected' attribute can only be\n                    // removed if set to a non-empty value:\n                    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12087679/\n                    fromEl.setAttribute('selected', 'selected');\n                    fromEl.removeAttribute('selected');\n                }\n                // We have to reset select element's selectedIndex to -1, otherwise setting\n                // fromEl.selected using the syncBooleanAttrProp below has no effect.\n                // The correct selectedIndex will be set in the SELECT special handler below.\n                parentNode.selectedIndex = -1;\n            }\n        }\n        syncBooleanAttrProp(fromEl, toEl, 'selected');\n    },\n    /**\n     * The \"value\" attribute is special for the <input> element since it sets\n     * the initial value. Changing the \"value\" attribute without changing the\n     * \"value\" property will have no effect since it is only used to the set the\n     * initial value.  Similar for the \"checked\" attribute, and \"disabled\".\n     */\n    INPUT: function(fromEl, toEl) {\n        syncBooleanAttrProp(fromEl, toEl, 'checked');\n        syncBooleanAttrProp(fromEl, toEl, 'disabled');\n\n        if (fromEl.value !== toEl.value) {\n            fromEl.value = toEl.value;\n        }\n\n        if (!toEl.hasAttribute('value')) {\n            fromEl.removeAttribute('value');\n        }\n    },\n\n    TEXTAREA: function(fromEl, toEl) {\n        var newValue = toEl.value;\n        if (fromEl.value !== newValue) {\n            fromEl.value = newValue;\n        }\n\n        var firstChild = fromEl.firstChild;\n        if (firstChild) {\n            // Needed for IE. Apparently IE sets the placeholder as the\n            // node value and vise versa. This ignores an empty update.\n            var oldValue = firstChild.nodeValue;\n\n            if (oldValue == newValue || (!newValue && oldValue == fromEl.placeholder)) {\n                return;\n            }\n\n            firstChild.nodeValue = newValue;\n        }\n    },\n    SELECT: function(fromEl, toEl) {\n        if (!toEl.hasAttribute('multiple')) {\n            var selectedIndex = -1;\n            var i = 0;\n            // We have to loop through children of fromEl, not toEl since nodes can be moved\n            // from toEl to fromEl directly when morphing.\n            // At the time this special handler is invoked, all children have already been morphed\n            // and appended to / removed from fromEl, so using fromEl here is safe and correct.\n            var curChild = fromEl.firstChild;\n            var optgroup;\n            var nodeName;\n            while(curChild) {\n                nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n                if (nodeName === 'OPTGROUP') {\n                    optgroup = curChild;\n                    curChild = optgroup.firstChild;\n                } else {\n                    if (nodeName === 'OPTION') {\n                        if (curChild.hasAttribute('selected')) {\n                            selectedIndex = i;\n                            break;\n                        }\n                        i++;\n                    }\n                    curChild = curChild.nextSibling;\n                    if (!curChild && optgroup) {\n                        curChild = optgroup.nextSibling;\n                        optgroup = null;\n                    }\n                }\n            }\n\n            fromEl.selectedIndex = selectedIndex;\n        }\n    }\n};\n\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\n\nfunction noop() {}\n\nfunction defaultGetNodeKey(node) {\n  if (node) {\n    return (node.getAttribute && node.getAttribute('id')) || node.id;\n  }\n}\n\nfunction morphdomFactory(morphAttrs) {\n\n  return function morphdom(fromNode, toNode, options) {\n    if (!options) {\n      options = {};\n    }\n\n    if (typeof toNode === 'string') {\n      if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML' || fromNode.nodeName === 'BODY') {\n        var toNodeHtml = toNode;\n        toNode = doc.createElement('html');\n        toNode.innerHTML = toNodeHtml;\n      } else {\n        toNode = toElement(toNode);\n      }\n    } else if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n      toNode = toNode.firstElementChild;\n    }\n\n    var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n    var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n    var onNodeAdded = options.onNodeAdded || noop;\n    var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n    var onElUpdated = options.onElUpdated || noop;\n    var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n    var onNodeDiscarded = options.onNodeDiscarded || noop;\n    var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n    var skipFromChildren = options.skipFromChildren || noop;\n    var addChild = options.addChild || function(parent, child){ return parent.appendChild(child); };\n    var childrenOnly = options.childrenOnly === true;\n\n    // This object is used as a lookup to quickly find all keyed elements in the original DOM tree.\n    var fromNodesLookup = Object.create(null);\n    var keyedRemovalList = [];\n\n    function addKeyedRemoval(key) {\n      keyedRemovalList.push(key);\n    }\n\n    function walkDiscardedChildNodes(node, skipKeyedNodes) {\n      if (node.nodeType === ELEMENT_NODE) {\n        var curChild = node.firstChild;\n        while (curChild) {\n\n          var key = undefined;\n\n          if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n            // If we are skipping keyed nodes then we add the key\n            // to a list so that it can be handled at the very end.\n            addKeyedRemoval(key);\n          } else {\n            // Only report the node as discarded if it is not keyed. We do this because\n            // at the end we loop through all keyed elements that were unmatched\n            // and then discard them in one final pass.\n            onNodeDiscarded(curChild);\n            if (curChild.firstChild) {\n              walkDiscardedChildNodes(curChild, skipKeyedNodes);\n            }\n          }\n\n          curChild = curChild.nextSibling;\n        }\n      }\n    }\n\n    /**\n    * Removes a DOM node out of the original DOM\n    *\n    * @param  {Node} node The node to remove\n    * @param  {Node} parentNode The nodes parent\n    * @param  {Boolean} skipKeyedNodes If true then elements with keys will be skipped and not discarded.\n    * @return {undefined}\n    */\n    function removeNode(node, parentNode, skipKeyedNodes) {\n      if (onBeforeNodeDiscarded(node) === false) {\n        return;\n      }\n\n      if (parentNode) {\n        parentNode.removeChild(node);\n      }\n\n      onNodeDiscarded(node);\n      walkDiscardedChildNodes(node, skipKeyedNodes);\n    }\n\n    // // TreeWalker implementation is no faster, but keeping this around in case this changes in the future\n    // function indexTree(root) {\n    //     var treeWalker = document.createTreeWalker(\n    //         root,\n    //         NodeFilter.SHOW_ELEMENT);\n    //\n    //     var el;\n    //     while((el = treeWalker.nextNode())) {\n    //         var key = getNodeKey(el);\n    //         if (key) {\n    //             fromNodesLookup[key] = el;\n    //         }\n    //     }\n    // }\n\n    // // NodeIterator implementation is no faster, but keeping this around in case this changes in the future\n    //\n    // function indexTree(node) {\n    //     var nodeIterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT);\n    //     var el;\n    //     while((el = nodeIterator.nextNode())) {\n    //         var key = getNodeKey(el);\n    //         if (key) {\n    //             fromNodesLookup[key] = el;\n    //         }\n    //     }\n    // }\n\n    function indexTree(node) {\n      if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n        var curChild = node.firstChild;\n        while (curChild) {\n          var key = getNodeKey(curChild);\n          if (key) {\n            fromNodesLookup[key] = curChild;\n          }\n\n          // Walk recursively\n          indexTree(curChild);\n\n          curChild = curChild.nextSibling;\n        }\n      }\n    }\n\n    indexTree(fromNode);\n\n    function handleNodeAdded(el) {\n      onNodeAdded(el);\n\n      var curChild = el.firstChild;\n      while (curChild) {\n        var nextSibling = curChild.nextSibling;\n\n        var key = getNodeKey(curChild);\n        if (key) {\n          var unmatchedFromEl = fromNodesLookup[key];\n          // if we find a duplicate #id node in cache, replace `el` with cache value\n          // and morph it to the child node.\n          if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n            curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n            morphEl(unmatchedFromEl, curChild);\n          } else {\n            handleNodeAdded(curChild);\n          }\n        } else {\n          // recursively call for curChild and it's children to see if we find something in\n          // fromNodesLookup\n          handleNodeAdded(curChild);\n        }\n\n        curChild = nextSibling;\n      }\n    }\n\n    function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n      // We have processed all of the \"to nodes\". If curFromNodeChild is\n      // non-null then we still have some from nodes left over that need\n      // to be removed\n      while (curFromNodeChild) {\n        var fromNextSibling = curFromNodeChild.nextSibling;\n        if ((curFromNodeKey = getNodeKey(curFromNodeChild))) {\n          // Since the node is keyed it might be matched up later so we defer\n          // the actual removal to later\n          addKeyedRemoval(curFromNodeKey);\n        } else {\n          // NOTE: we skip nested keyed nodes from being removed since there is\n          //       still a chance they will be matched up later\n          removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n        }\n        curFromNodeChild = fromNextSibling;\n      }\n    }\n\n    function morphEl(fromEl, toEl, childrenOnly) {\n      var toElKey = getNodeKey(toEl);\n\n      if (toElKey) {\n        // If an element with an ID is being morphed then it will be in the final\n        // DOM so clear it out of the saved elements collection\n        delete fromNodesLookup[toElKey];\n      }\n\n      if (!childrenOnly) {\n        // optional\n        var beforeUpdateResult = onBeforeElUpdated(fromEl, toEl);\n        if (beforeUpdateResult === false) {\n          return;\n        } else if (beforeUpdateResult instanceof HTMLElement) {\n          fromEl = beforeUpdateResult;\n          // reindex the new fromEl in case it's not in the same\n          // tree as the original fromEl\n          // (Phoenix LiveView sometimes returns a cloned tree,\n          //  but keyed lookups would still point to the original tree)\n          indexTree(fromEl);\n        }\n\n        // update attributes on original DOM element first\n        morphAttrs(fromEl, toEl);\n        // optional\n        onElUpdated(fromEl);\n\n        if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n          return;\n        }\n      }\n\n      if (fromEl.nodeName !== 'TEXTAREA') {\n        morphChildren(fromEl, toEl);\n      } else {\n        specialElHandlers.TEXTAREA(fromEl, toEl);\n      }\n    }\n\n    function morphChildren(fromEl, toEl) {\n      var skipFrom = skipFromChildren(fromEl, toEl);\n      var curToNodeChild = toEl.firstChild;\n      var curFromNodeChild = fromEl.firstChild;\n      var curToNodeKey;\n      var curFromNodeKey;\n\n      var fromNextSibling;\n      var toNextSibling;\n      var matchingFromEl;\n\n      // walk the children\n      outer: while (curToNodeChild) {\n        toNextSibling = curToNodeChild.nextSibling;\n        curToNodeKey = getNodeKey(curToNodeChild);\n\n        // walk the fromNode children all the way through\n        while (!skipFrom && curFromNodeChild) {\n          fromNextSibling = curFromNodeChild.nextSibling;\n\n          if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n            curToNodeChild = toNextSibling;\n            curFromNodeChild = fromNextSibling;\n            continue outer;\n          }\n\n          curFromNodeKey = getNodeKey(curFromNodeChild);\n\n          var curFromNodeType = curFromNodeChild.nodeType;\n\n          // this means if the curFromNodeChild doesnt have a match with the curToNodeChild\n          var isCompatible = undefined;\n\n          if (curFromNodeType === curToNodeChild.nodeType) {\n            if (curFromNodeType === ELEMENT_NODE) {\n              // Both nodes being compared are Element nodes\n\n              if (curToNodeKey) {\n                // The target node has a key so we want to match it up with the correct element\n                // in the original DOM tree\n                if (curToNodeKey !== curFromNodeKey) {\n                  // The current element in the original DOM tree does not have a matching key so\n                  // let's check our lookup to see if there is a matching element in the original\n                  // DOM tree\n                  if ((matchingFromEl = fromNodesLookup[curToNodeKey])) {\n                    if (fromNextSibling === matchingFromEl) {\n                      // Special case for single element removals. To avoid removing the original\n                      // DOM node out of the tree (since that can break CSS transitions, etc.),\n                      // we will instead discard the current node and wait until the next\n                      // iteration to properly match up the keyed target element with its matching\n                      // element in the original tree\n                      isCompatible = false;\n                    } else {\n                      // We found a matching keyed element somewhere in the original DOM tree.\n                      // Let's move the original DOM node into the current position and morph\n                      // it.\n\n                      // NOTE: We use insertBefore instead of replaceChild because we want to go through\n                      // the `removeNode()` function for the node that is being discarded so that\n                      // all lifecycle hooks are correctly invoked\n                      fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n\n                      // fromNextSibling = curFromNodeChild.nextSibling;\n\n                      if (curFromNodeKey) {\n                        // Since the node is keyed it might be matched up later so we defer\n                        // the actual removal to later\n                        addKeyedRemoval(curFromNodeKey);\n                      } else {\n                        // NOTE: we skip nested keyed nodes from being removed since there is\n                        //       still a chance they will be matched up later\n                        removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n                      }\n\n                      curFromNodeChild = matchingFromEl;\n                      curFromNodeKey = getNodeKey(curFromNodeChild);\n                    }\n                  } else {\n                    // The nodes are not compatible since the \"to\" node has a key and there\n                    // is no matching keyed node in the source tree\n                    isCompatible = false;\n                  }\n                }\n              } else if (curFromNodeKey) {\n                // The original has a key\n                isCompatible = false;\n              }\n\n              isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n              if (isCompatible) {\n                // We found compatible DOM elements so transform\n                // the current \"from\" node to match the current\n                // target DOM node.\n                // MORPH\n                morphEl(curFromNodeChild, curToNodeChild);\n              }\n\n            } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n              // Both nodes being compared are Text or Comment nodes\n              isCompatible = true;\n              // Simply update nodeValue on the original node to\n              // change the text value\n              if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n                curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n              }\n\n            }\n          }\n\n          if (isCompatible) {\n            // Advance both the \"to\" child and the \"from\" child since we found a match\n            // Nothing else to do as we already recursively called morphChildren above\n            curToNodeChild = toNextSibling;\n            curFromNodeChild = fromNextSibling;\n            continue outer;\n          }\n\n          // No compatible match so remove the old node from the DOM and continue trying to find a\n          // match in the original DOM. However, we only do this if the from node is not keyed\n          // since it is possible that a keyed node might match up with a node somewhere else in the\n          // target tree and we don't want to discard it just yet since it still might find a\n          // home in the final DOM tree. After everything is done we will remove any keyed nodes\n          // that didn't find a home\n          if (curFromNodeKey) {\n            // Since the node is keyed it might be matched up later so we defer\n            // the actual removal to later\n            addKeyedRemoval(curFromNodeKey);\n          } else {\n            // NOTE: we skip nested keyed nodes from being removed since there is\n            //       still a chance they will be matched up later\n            removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n          }\n\n          curFromNodeChild = fromNextSibling;\n        } // END: while(curFromNodeChild) {}\n\n        // If we got this far then we did not find a candidate match for\n        // our \"to node\" and we exhausted all of the children \"from\"\n        // nodes. Therefore, we will just append the current \"to\" node\n        // to the end\n        if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n          // MORPH\n          if(!skipFrom){ addChild(fromEl, matchingFromEl); }\n          morphEl(matchingFromEl, curToNodeChild);\n        } else {\n          var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n          if (onBeforeNodeAddedResult !== false) {\n            if (onBeforeNodeAddedResult) {\n              curToNodeChild = onBeforeNodeAddedResult;\n            }\n\n            if (curToNodeChild.actualize) {\n              curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n            }\n            addChild(fromEl, curToNodeChild);\n            handleNodeAdded(curToNodeChild);\n          }\n        }\n\n        curToNodeChild = toNextSibling;\n        curFromNodeChild = fromNextSibling;\n      }\n\n      cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n\n      var specialElHandler = specialElHandlers[fromEl.nodeName];\n      if (specialElHandler) {\n        specialElHandler(fromEl, toEl);\n      }\n    } // END: morphChildren(...)\n\n    var morphedNode = fromNode;\n    var morphedNodeType = morphedNode.nodeType;\n    var toNodeType = toNode.nodeType;\n\n    if (!childrenOnly) {\n      // Handle the case where we are given two DOM nodes that are not\n      // compatible (e.g. <div> --> <span> or <div> --> TEXT)\n      if (morphedNodeType === ELEMENT_NODE) {\n        if (toNodeType === ELEMENT_NODE) {\n          if (!compareNodeNames(fromNode, toNode)) {\n            onNodeDiscarded(fromNode);\n            morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n          }\n        } else {\n          // Going from an element node to a text node\n          morphedNode = toNode;\n        }\n      } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node\n        if (toNodeType === morphedNodeType) {\n          if (morphedNode.nodeValue !== toNode.nodeValue) {\n            morphedNode.nodeValue = toNode.nodeValue;\n          }\n\n          return morphedNode;\n        } else {\n          // Text node to something else\n          morphedNode = toNode;\n        }\n      }\n    }\n\n    if (morphedNode === toNode) {\n      // The \"to node\" was not compatible with the \"from node\" so we had to\n      // toss out the \"from node\" and use the \"to node\"\n      onNodeDiscarded(fromNode);\n    } else {\n      if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n        return;\n      }\n\n      morphEl(morphedNode, toNode, childrenOnly);\n\n      // We now need to loop over any keyed nodes that might need to be\n      // removed. We only do the removal if we know that the keyed node\n      // never found a match. When a keyed node is matched up we remove\n      // it out of fromNodesLookup and we use fromNodesLookup to determine\n      // if a keyed node has been matched up or not\n      if (keyedRemovalList) {\n        for (var i=0, len=keyedRemovalList.length; i<len; i++) {\n          var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n          if (elToRemove) {\n            removeNode(elToRemove, elToRemove.parentNode, false);\n          }\n        }\n      }\n    }\n\n    if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n      if (morphedNode.actualize) {\n        morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n      }\n      // If we had to swap out the from node with a new node because the old\n      // node was not compatible with the target node then we need to\n      // replace the old DOM node in the original DOM tree. This is only\n      // possible if the original DOM node was part of a DOM tree which\n      // we know is the case if it has a parent node.\n      fromNode.parentNode.replaceChild(morphedNode, fromNode);\n    }\n\n    return morphedNode;\n  };\n}\n\nvar morphdom = morphdomFactory(morphAttrs);\n\nexport default morphdom;\n", "import {\n  PHX_COMPONENT,\n  PHX_PRUNE,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_SKIP,\n  PHX_MAGIC_ID,\n  PHX_STATIC,\n  PHX_TRIGGER_ACTION,\n  PHX_UPDATE,\n  PHX_REF_SRC,\n  PHX_REF_LOCK,\n  PHX_STREAM,\n  PHX_STREAM_REF,\n  PHX_VIEWPORT_TOP,\n  PHX_VIEWPORT_BOTTOM,\n} from \"./constants\"\n\nimport {\n  detectDuplicateIds,\n  isCid\n} from \"./utils\"\n\nimport DOM from \"./dom\"\nimport DOMPostMorphRestorer from \"./dom_post_morph_restorer\"\nimport morphdom from \"morphdom\"\n\nexport default class DOMPatch {\n  static patchWithClonedTree(container, clonedTree, liveSocket){\n    let focused = liveSocket.getActiveElement()\n    let {selectionStart, selectionEnd} = focused && DOM.hasSelectionRange(focused) ? focused : {}\n    let phxUpdate = liveSocket.binding(PHX_UPDATE)\n    let externalFormTriggered = null\n\n    morphdom(container, clonedTree, {\n      childrenOnly: false,\n      onBeforeElUpdated: (fromEl, toEl) => {\n        DOM.syncPendingAttrs(fromEl, toEl)\n        // we cannot morph locked children\n        if(!container.isSameNode(fromEl) && fromEl.hasAttribute(PHX_REF_LOCK)){ return false }\n        if(DOM.isIgnored(fromEl, phxUpdate)){ return false }\n        if(focused && focused.isSameNode(fromEl) && DOM.isFormInput(fromEl)){\n          DOM.mergeFocusedInput(fromEl, toEl)\n          return false\n        }\n        if(DOM.isNowTriggerFormExternal(toEl, liveSocket.binding(PHX_TRIGGER_ACTION))){\n          externalFormTriggered = toEl\n        }\n      }\n    })\n\n    if(externalFormTriggered){\n      liveSocket.unload()\n      // use prototype's submit in case there's a form control with name or id of \"submit\"\n      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n      Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered)\n    }\n\n    liveSocket.silenceEvents(() => DOM.restoreFocus(focused, selectionStart, selectionEnd))\n  }\n\n  constructor(view, container, id, html, streams, targetCID){\n    this.view = view\n    this.liveSocket = view.liveSocket\n    this.container = container\n    this.id = id\n    this.rootID = view.root.id\n    this.html = html\n    this.streams = streams\n    this.streamInserts = {}\n    this.streamComponentRestore = {}\n    this.targetCID = targetCID\n    this.cidPatch = isCid(this.targetCID)\n    this.pendingRemoves = []\n    this.phxRemove = this.liveSocket.binding(\"remove\")\n    this.targetContainer = this.isCIDPatch() ? this.targetCIDContainer(html) : container\n    this.callbacks = {\n      beforeadded: [], beforeupdated: [], beforephxChildAdded: [],\n      afteradded: [], afterupdated: [], afterdiscarded: [], afterphxChildAdded: [],\n      aftertransitionsDiscarded: []\n    }\n  }\n\n  before(kind, callback){ this.callbacks[`before${kind}`].push(callback) }\n  after(kind, callback){ this.callbacks[`after${kind}`].push(callback) }\n\n  trackBefore(kind, ...args){\n    this.callbacks[`before${kind}`].forEach(callback => callback(...args))\n  }\n\n  trackAfter(kind, ...args){\n    this.callbacks[`after${kind}`].forEach(callback => callback(...args))\n  }\n\n  markPrunableContentForRemoval(){\n    let phxUpdate = this.liveSocket.binding(PHX_UPDATE)\n    DOM.all(this.container, `[${phxUpdate}=append] > *, [${phxUpdate}=prepend] > *`, el => {\n      el.setAttribute(PHX_PRUNE, \"\")\n    })\n  }\n\n  perform(isJoinPatch){\n    let {view, liveSocket, html, container, targetContainer} = this\n    if(this.isCIDPatch() && !targetContainer){ return }\n\n    let focused = liveSocket.getActiveElement()\n    let {selectionStart, selectionEnd} = focused && DOM.hasSelectionRange(focused) ? focused : {}\n    let phxUpdate = liveSocket.binding(PHX_UPDATE)\n    let phxViewportTop = liveSocket.binding(PHX_VIEWPORT_TOP)\n    let phxViewportBottom = liveSocket.binding(PHX_VIEWPORT_BOTTOM)\n    let phxTriggerExternal = liveSocket.binding(PHX_TRIGGER_ACTION)\n    let added = []\n    let updates = []\n    let appendPrependUpdates = []\n\n    let externalFormTriggered = null\n\n    function morph(targetContainer, source, withChildren=false){\n      let morphCallbacks = {\n        // normally, we are running with childrenOnly, as the patch HTML for a LV\n        // does not include the LV attrs (data-phx-session, etc.)\n        // when we are patching a live component, we do want to patch the root element as well;\n        // another case is the recursive patch of a stream item that was kept on reset (-> onBeforeNodeAdded)\n        childrenOnly: targetContainer.getAttribute(PHX_COMPONENT) === null && !withChildren,\n        getNodeKey: (node) => {\n          if(DOM.isPhxDestroyed(node)){ return null }\n          // If we have a join patch, then by definition there was no PHX_MAGIC_ID.\n          // This is important to reduce the amount of elements morphdom discards.\n          if(isJoinPatch){ return node.id }\n          return node.id || (node.getAttribute && node.getAttribute(PHX_MAGIC_ID))\n        },\n        // skip indexing from children when container is stream\n        skipFromChildren: (from) => { return from.getAttribute(phxUpdate) === PHX_STREAM },\n        // tell morphdom how to add a child\n        addChild: (parent, child) => {\n          let {ref, streamAt} = this.getStreamInsert(child)\n          if(ref === undefined){ return parent.appendChild(child) }\n\n          this.setStreamRef(child, ref)\n\n          // streaming\n          if(streamAt === 0){\n            parent.insertAdjacentElement(\"afterbegin\", child)\n          } else if(streamAt === -1){\n            let lastChild = parent.lastElementChild\n            if(lastChild && !lastChild.hasAttribute(PHX_STREAM_REF)){\n              let nonStreamChild = Array.from(parent.children).find(c => !c.hasAttribute(PHX_STREAM_REF))\n              parent.insertBefore(child, nonStreamChild)\n            } else {\n              parent.appendChild(child)\n            }\n          } else if(streamAt > 0){\n            let sibling = Array.from(parent.children)[streamAt]\n            parent.insertBefore(child, sibling)\n          }\n        },\n        onBeforeNodeAdded: (el) => {\n          DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom)\n          this.trackBefore(\"added\", el)\n\n          let morphedEl = el\n          // this is a stream item that was kept on reset, recursively morph it\n          if(this.streamComponentRestore[el.id]){\n            morphedEl = this.streamComponentRestore[el.id]\n            delete this.streamComponentRestore[el.id]\n            morph.call(this, morphedEl, el, true)\n          }\n\n          return morphedEl\n        },\n        onNodeAdded: (el) => {\n          if(el.getAttribute){ this.maybeReOrderStream(el, true) }\n\n          // hack to fix Safari handling of img srcset and video tags\n          if(el instanceof HTMLImageElement && el.srcset){\n            el.srcset = el.srcset\n          } else if(el instanceof HTMLVideoElement && el.autoplay){\n            el.play()\n          }\n          if(DOM.isNowTriggerFormExternal(el, phxTriggerExternal)){\n            externalFormTriggered = el\n          }\n\n          // nested view handling\n          if((DOM.isPhxChild(el) && view.ownsElement(el)) || DOM.isPhxSticky(el) && view.ownsElement(el.parentNode)){\n            this.trackAfter(\"phxChildAdded\", el)\n          }\n          added.push(el)\n        },\n        onNodeDiscarded: (el) => this.onNodeDiscarded(el),\n        onBeforeNodeDiscarded: (el) => {\n          if(el.getAttribute && el.getAttribute(PHX_PRUNE) !== null){ return true }\n          if(el.parentElement !== null && el.id &&\n            DOM.isPhxUpdate(el.parentElement, phxUpdate, [PHX_STREAM, \"append\", \"prepend\"])){\n            return false\n          }\n          if(this.maybePendingRemove(el)){ return false }\n          if(this.skipCIDSibling(el)){ return false }\n\n          return true\n        },\n        onElUpdated: (el) => {\n          if(DOM.isNowTriggerFormExternal(el, phxTriggerExternal)){\n            externalFormTriggered = el\n          }\n          updates.push(el)\n          this.maybeReOrderStream(el, false)\n        },\n        onBeforeElUpdated: (fromEl, toEl) => {\n          // if we are patching the root target container and the id has changed, treat it as a new node\n          // by replacing the fromEl with the toEl, which ensures hooks are torn down and re-created\n          if(fromEl.id && fromEl.isSameNode(targetContainer) && fromEl.id !== toEl.id){\n            morphCallbacks.onNodeDiscarded(fromEl)\n            fromEl.replaceWith(toEl)\n            return morphCallbacks.onNodeAdded(toEl)\n          }\n          DOM.syncPendingAttrs(fromEl, toEl)\n          DOM.maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom)\n          DOM.cleanChildNodes(toEl, phxUpdate)\n          if(this.skipCIDSibling(toEl)){\n            // if this is a live component used in a stream, we may need to reorder it\n            this.maybeReOrderStream(fromEl)\n            return false\n          }\n          if(DOM.isPhxSticky(fromEl)){\n            [PHX_SESSION, PHX_STATIC, PHX_ROOT_ID]\n              .map(attr => [attr, fromEl.getAttribute(attr), toEl.getAttribute(attr)])\n              .forEach(([attr, fromVal, toVal]) => {\n                if(toVal && fromVal !== toVal){ fromEl.setAttribute(attr, toVal) }\n              })\n\n            return false\n          }\n          if(DOM.isIgnored(fromEl, phxUpdate) || (fromEl.form && fromEl.form.isSameNode(externalFormTriggered))){\n            this.trackBefore(\"updated\", fromEl, toEl)\n            DOM.mergeAttrs(fromEl, toEl, {isIgnored: DOM.isIgnored(fromEl, phxUpdate)})\n            updates.push(fromEl)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          }\n          if(fromEl.type === \"number\" && (fromEl.validity && fromEl.validity.badInput)){ return false }\n          // If the element has PHX_REF_SRC, it is loading or locked and awaiting an ack.\n          // If it's locked, we clone the fromEl tree and instruct morphdom to use\n          // the cloned tree as the source of the morph for this branch from here on out.\n          // We keep a reference to the cloned tree in the element's private data, and\n          // on ack (view.undoRefs), we morph the cloned tree with the true fromEl in the DOM to\n          // apply any changes that happened while the element was locked.\n          let isFocusedFormEl = focused && fromEl.isSameNode(focused) && DOM.isFormInput(fromEl)\n          let focusedSelectChanged = isFocusedFormEl && this.isChangedSelect(fromEl, toEl)\n          if(fromEl.hasAttribute(PHX_REF_SRC)){\n            if(DOM.isUploadInput(fromEl)){\n              DOM.mergeAttrs(fromEl, toEl, {isIgnored: true})\n              this.trackBefore(\"updated\", fromEl, toEl)\n              updates.push(fromEl)\n            }\n            DOM.applyStickyOperations(fromEl)\n            let isLocked = fromEl.hasAttribute(PHX_REF_LOCK)\n            let clone = isLocked ? DOM.private(fromEl, PHX_REF_LOCK) || fromEl.cloneNode(true) : null\n            if(clone){\n              DOM.putPrivate(fromEl, PHX_REF_LOCK, clone)\n              if(!isFocusedFormEl){\n                fromEl = clone\n              }\n            }\n          }\n\n          // nested view handling\n          if(DOM.isPhxChild(toEl)){\n            let prevSession = fromEl.getAttribute(PHX_SESSION)\n            DOM.mergeAttrs(fromEl, toEl, {exclude: [PHX_STATIC]})\n            if(prevSession !== \"\"){ fromEl.setAttribute(PHX_SESSION, prevSession) }\n            fromEl.setAttribute(PHX_ROOT_ID, this.rootID)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          }\n\n          // input handling\n          DOM.copyPrivates(toEl, fromEl)\n\n          // skip patching focused inputs unless focus is a select that has changed options\n          if(isFocusedFormEl && fromEl.type !== \"hidden\" && !focusedSelectChanged){\n            this.trackBefore(\"updated\", fromEl, toEl)\n            DOM.mergeFocusedInput(fromEl, toEl)\n            DOM.syncAttrsToProps(fromEl)\n            updates.push(fromEl)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          } else {\n            // blur focused select if it changed so native UI is updated (ie safari won't update visible options)\n            if(focusedSelectChanged){ fromEl.blur() }\n            if(DOM.isPhxUpdate(toEl, phxUpdate, [\"append\", \"prepend\"])){\n              appendPrependUpdates.push(new DOMPostMorphRestorer(fromEl, toEl, toEl.getAttribute(phxUpdate)))\n            }\n\n            DOM.syncAttrsToProps(toEl)\n            DOM.applyStickyOperations(toEl)\n            this.trackBefore(\"updated\", fromEl, toEl)\n            return fromEl\n          }\n        }\n      }\n      morphdom(targetContainer, source, morphCallbacks)\n    }\n\n    this.trackBefore(\"added\", container)\n    this.trackBefore(\"updated\", container, container)\n\n    liveSocket.time(\"morphdom\", () => {\n      this.streams.forEach(([ref, inserts, deleteIds, reset]) => {\n        inserts.forEach(([key, streamAt, limit]) => {\n          this.streamInserts[key] = {ref, streamAt, limit, reset}\n        })\n        if(reset !== undefined){\n          DOM.all(container, `[${PHX_STREAM_REF}=\"${ref}\"]`, child => {\n            this.removeStreamChildElement(child)\n          })\n        }\n        deleteIds.forEach(id => {\n          let child = container.querySelector(`[id=\"${id}\"]`)\n          if(child){ this.removeStreamChildElement(child) }\n        })\n      })\n\n      // clear stream items from the dead render if they are not inserted again\n      if(isJoinPatch){\n        DOM.all(this.container, `[${phxUpdate}=${PHX_STREAM}]`, el => {\n          // make sure to only remove elements owned by the current view\n          // see https://github.com/phoenixframework/phoenix_live_view/issues/3047\n          this.liveSocket.owner(el, (view) => {\n            if(view === this.view){\n              Array.from(el.children).forEach(child => {\n                this.removeStreamChildElement(child)\n              })\n            }\n          })\n        })\n      }\n\n      morph.call(this, targetContainer, html)\n    })\n\n    if(liveSocket.isDebugEnabled()){\n      detectDuplicateIds()\n      // warn if there are any inputs named \"id\"\n      Array.from(document.querySelectorAll(\"input[name=id]\")).forEach(node => {\n        if(node.form){\n          console.error(\"Detected an input with name=\\\"id\\\" inside a form! This will cause problems when patching the DOM.\\n\", node)\n        }\n      })\n    }\n\n    if(appendPrependUpdates.length > 0){\n      liveSocket.time(\"post-morph append/prepend restoration\", () => {\n        appendPrependUpdates.forEach(update => update.perform())\n      })\n    }\n\n    liveSocket.silenceEvents(() => DOM.restoreFocus(focused, selectionStart, selectionEnd))\n    DOM.dispatchEvent(document, \"phx:update\")\n    added.forEach(el => this.trackAfter(\"added\", el))\n    updates.forEach(el => this.trackAfter(\"updated\", el))\n\n    this.transitionPendingRemoves()\n\n    if(externalFormTriggered){\n      liveSocket.unload()\n      // use prototype's submit in case there's a form control with name or id of \"submit\"\n      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n      Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered)\n    }\n    return true\n  }\n\n  onNodeDiscarded(el){\n    // nested view handling\n    if(DOM.isPhxChild(el) || DOM.isPhxSticky(el)){ this.liveSocket.destroyViewByEl(el) }\n    this.trackAfter(\"discarded\", el)\n  }\n\n  maybePendingRemove(node){\n    if(node.getAttribute && node.getAttribute(this.phxRemove) !== null){\n      this.pendingRemoves.push(node)\n      return true\n    } else {\n      return false\n    }\n  }\n\n  removeStreamChildElement(child){\n    // we need to store the node if it is actually re-added in the same patch\n    // we do NOT want to execute phx-remove, we do NOT want to call onNodeDiscarded\n    if(this.streamInserts[child.id]){\n      this.streamComponentRestore[child.id] = child\n      child.remove()\n    } else {\n      // only remove the element now if it has no phx-remove binding\n      if(!this.maybePendingRemove(child)){\n        child.remove()\n        this.onNodeDiscarded(child)\n      }\n    }\n  }\n\n  getStreamInsert(el){\n    let insert = el.id ? this.streamInserts[el.id] : {}\n    return insert || {}\n  }\n\n  setStreamRef(el, ref){\n    DOM.putSticky(el, PHX_STREAM_REF, el => el.setAttribute(PHX_STREAM_REF, ref))\n  }\n\n  maybeReOrderStream(el, isNew){\n    let {ref, streamAt, reset} = this.getStreamInsert(el)\n    if(streamAt === undefined){ return }\n\n    // we need to set the PHX_STREAM_REF here as well as addChild is invoked only for parents\n    this.setStreamRef(el, ref)\n\n    if(!reset && !isNew){\n      // we only reorder if the element is new or it's a stream reset\n      return\n    }\n\n    // check if the element has a parent element;\n    // it doesn't if we are currently recursively morphing (restoring a saved stream child)\n    // because the element is not yet added to the real dom;\n    // reordering does not make sense in that case anyway\n    if(!el.parentElement){ return }\n\n    if(streamAt === 0){\n      el.parentElement.insertBefore(el, el.parentElement.firstElementChild)\n    } else if(streamAt > 0){\n      let children = Array.from(el.parentElement.children)\n      let oldIndex = children.indexOf(el)\n      if(streamAt >= children.length - 1){\n        el.parentElement.appendChild(el)\n      } else {\n        let sibling = children[streamAt]\n        if(oldIndex > streamAt){\n          el.parentElement.insertBefore(el, sibling)\n        } else {\n          el.parentElement.insertBefore(el, sibling.nextElementSibling)\n        }\n      }\n    }\n\n    this.maybeLimitStream(el)\n  }\n\n  maybeLimitStream(el){\n    let {limit} = this.getStreamInsert(el)\n    let children = limit !== null && Array.from(el.parentElement.children)\n    if(limit && limit < 0 && children.length > limit * -1){\n      children.slice(0, children.length + limit).forEach(child => this.removeStreamChildElement(child))\n    } else if(limit && limit >= 0 && children.length > limit){\n      children.slice(limit).forEach(child => this.removeStreamChildElement(child))\n    }\n  }\n\n  transitionPendingRemoves(){\n    let {pendingRemoves, liveSocket} = this\n    if(pendingRemoves.length > 0){\n      liveSocket.transitionRemoves(pendingRemoves, false, () => {\n        pendingRemoves.forEach(el => {\n          let child = DOM.firstPhxChild(el)\n          if(child){ liveSocket.destroyViewByEl(child) }\n          el.remove()\n        })\n        this.trackAfter(\"transitionsDiscarded\", pendingRemoves)\n      })\n    }\n  }\n\n  isChangedSelect(fromEl, toEl){\n    if(!(fromEl instanceof HTMLSelectElement) || fromEl.multiple){ return false }\n    if(fromEl.options.length !== toEl.options.length){ return true }\n\n    // keep the current value\n    toEl.value = fromEl.value\n\n    // in general we have to be very careful with using isEqualNode as it does not a reliable\n    // DOM tree equality check, but for selection attributes and options it works fine\n    return !fromEl.isEqualNode(toEl)\n  }\n\n  isCIDPatch(){ return this.cidPatch }\n\n  skipCIDSibling(el){\n    return el.nodeType === Node.ELEMENT_NODE && el.hasAttribute(PHX_SKIP)\n  }\n\n  targetCIDContainer(html){\n    if(!this.isCIDPatch()){ return }\n    let [first, ...rest] = DOM.findComponentNodeList(this.container, this.targetCID)\n    if(rest.length === 0 && DOM.childNodeLength(html) === 1){\n      return first\n    } else {\n      return first && first.parentNode\n    }\n  }\n\n  indexOf(parent, child){ return Array.from(parent.children).indexOf(child) }\n}\n", "import {\n  COMPONENTS,\n  DYNAMICS,\n  TEMPLATES,\n  EVENTS,\n  PHX_COMPONENT,\n  PHX_SKIP,\n  PHX_MAGIC_ID,\n  REPLY,\n  STATIC,\n  TITLE,\n  STREAM,\n  ROOT,\n} from \"./constants\"\n\nimport {\n  isObject,\n  logError,\n  isCid,\n} from \"./utils\"\n\nconst VOID_TAGS = new Set([\n  \"area\",\n  \"base\",\n  \"br\",\n  \"col\",\n  \"command\",\n  \"embed\",\n  \"hr\",\n  \"img\",\n  \"input\",\n  \"keygen\",\n  \"link\",\n  \"meta\",\n  \"param\",\n  \"source\",\n  \"track\",\n  \"wbr\"\n])\nconst quoteChars = new Set([\"'\", \"\\\"\"])\n\nexport let modifyRoot = (html, attrs, clearInnerHTML) => {\n  let i = 0\n  let insideComment = false\n  let beforeTag, afterTag, tag, tagNameEndsAt, id, newHTML\n\n  let lookahead = html.match(/^(\\s*(?:<!--.*?-->\\s*)*)<([^\\s\\/>]+)/)\n  if(lookahead === null){ throw new Error(`malformed html ${html}`) }\n\n  i = lookahead[0].length\n  beforeTag = lookahead[1]\n  tag = lookahead[2]\n  tagNameEndsAt = i\n\n  // Scan the opening tag for id, if there is any\n  for(i; i < html.length; i++){\n    if(html.charAt(i) === \">\" ){ break }\n    if(html.charAt(i) === \"=\"){\n      let isId = html.slice(i - 3, i) === \" id\"\n      i++\n      let char = html.charAt(i)\n      if(quoteChars.has(char)){\n        let attrStartsAt = i\n        i++\n        for(i; i < html.length; i++){\n          if(html.charAt(i) === char){ break }\n        }\n        if(isId){\n          id = html.slice(attrStartsAt + 1, i)\n          break\n        }\n      }\n    }\n  }\n\n  let closeAt = html.length - 1\n  insideComment = false\n  while(closeAt >= beforeTag.length + tag.length){\n    let char = html.charAt(closeAt)\n    if(insideComment){\n      if(char === \"-\" && html.slice(closeAt - 3, closeAt) === \"<!-\"){\n        insideComment = false\n        closeAt -= 4\n      } else {\n        closeAt -= 1\n      }\n    } else if(char === \">\" && html.slice(closeAt - 2, closeAt) === \"--\"){\n      insideComment = true\n      closeAt -= 3\n    } else if(char === \">\"){\n      break\n    } else {\n      closeAt -= 1\n    }\n  }\n  afterTag = html.slice(closeAt + 1, html.length)\n\n  let attrsStr =\n    Object.keys(attrs)\n      .map(attr => attrs[attr] === true ? attr : `${attr}=\"${attrs[attr]}\"`)\n      .join(\" \")\n\n  if(clearInnerHTML){\n    // Keep the id if any\n    let idAttrStr = id ? ` id=\"${id}\"` : \"\"\n    if(VOID_TAGS.has(tag)){\n      newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}/>`\n    } else {\n      newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}></${tag}>`\n    }\n  } else {\n    let rest = html.slice(tagNameEndsAt, closeAt + 1)\n    newHTML = `<${tag}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}${rest}`\n  }\n\n  return [newHTML, beforeTag, afterTag]\n}\n\nexport default class Rendered {\n  static extract(diff){\n    let {[REPLY]: reply, [EVENTS]: events, [TITLE]: title} = diff\n    delete diff[REPLY]\n    delete diff[EVENTS]\n    delete diff[TITLE]\n    return {diff, title, reply: reply || null, events: events || []}\n  }\n\n  constructor(viewId, rendered){\n    this.viewId = viewId\n    this.rendered = {}\n    this.magicId = 0\n    this.mergeDiff(rendered)\n  }\n\n  parentViewId(){ return this.viewId }\n\n  toString(onlyCids){\n    let [str, streams] = this.recursiveToString(this.rendered, this.rendered[COMPONENTS], onlyCids, true, {})\n    return [str, streams]\n  }\n\n  recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids, changeTracking, rootAttrs){\n    onlyCids = onlyCids ? new Set(onlyCids) : null\n    let output = {buffer: \"\", components: components, onlyCids: onlyCids, streams: new Set()}\n    this.toOutputBuffer(rendered, null, output, changeTracking, rootAttrs)\n    return [output.buffer, output.streams]\n  }\n\n  componentCIDs(diff){ return Object.keys(diff[COMPONENTS] || {}).map(i => parseInt(i)) }\n\n  isComponentOnlyDiff(diff){\n    if(!diff[COMPONENTS]){ return false }\n    return Object.keys(diff).length === 1\n  }\n\n  getComponent(diff, cid){ return diff[COMPONENTS][cid] }\n\n  resetRender(cid){\n    // we are racing a component destroy, it could not exist, so\n    // make sure that we don't try to set reset on undefined\n    if(this.rendered[COMPONENTS][cid]){\n      this.rendered[COMPONENTS][cid].reset = true\n    }\n  }\n\n  mergeDiff(diff){\n    let newc = diff[COMPONENTS]\n    let cache = {}\n    delete diff[COMPONENTS]\n    this.rendered = this.mutableMerge(this.rendered, diff)\n    this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {}\n\n    if(newc){\n      let oldc = this.rendered[COMPONENTS]\n\n      for(let cid in newc){\n        newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache)\n      }\n\n      for(let cid in newc){ oldc[cid] = newc[cid] }\n      diff[COMPONENTS] = newc\n    }\n  }\n\n  cachedFindComponent(cid, cdiff, oldc, newc, cache){\n    if(cache[cid]){\n      return cache[cid]\n    } else {\n      let ndiff, stat, scid = cdiff[STATIC]\n\n      if(isCid(scid)){\n        let tdiff\n\n        if(scid > 0){\n          tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache)\n        } else {\n          tdiff = oldc[-scid]\n        }\n\n        stat = tdiff[STATIC]\n        ndiff = this.cloneMerge(tdiff, cdiff, true)\n        ndiff[STATIC] = stat\n      } else {\n        ndiff = cdiff[STATIC] !== undefined || oldc[cid] === undefined ?\n          cdiff : this.cloneMerge(oldc[cid], cdiff, false)\n      }\n\n      cache[cid] = ndiff\n      return ndiff\n    }\n  }\n\n  mutableMerge(target, source){\n    if(source[STATIC] !== undefined){\n      return source\n    } else {\n      this.doMutableMerge(target, source)\n      return target\n    }\n  }\n\n  doMutableMerge(target, source){\n    for(let key in source){\n      let val = source[key]\n      let targetVal = target[key]\n      let isObjVal = isObject(val)\n      if(isObjVal && val[STATIC] === undefined && isObject(targetVal)){\n        this.doMutableMerge(targetVal, val)\n      } else {\n        target[key] = val\n      }\n    }\n    if(target[ROOT]){\n      target.newRender = true\n    }\n  }\n\n  // Merges cid trees together, copying statics from source tree.\n  //\n  // The `pruneMagicId` is passed to control pruning the magicId of the\n  // target. We must always prune the magicId when we are sharing statics\n  // from another component. If not pruning, we replicate the logic from\n  // mutableMerge, where we set newRender to true if there is a root\n  // (effectively forcing the new version to be rendered instead of skipped)\n  //\n  cloneMerge(target, source, pruneMagicId){\n    let merged = {...target, ...source}\n    for(let key in merged){\n      let val = source[key]\n      let targetVal = target[key]\n      if(isObject(val) && val[STATIC] === undefined && isObject(targetVal)){\n        merged[key] = this.cloneMerge(targetVal, val, pruneMagicId)\n      } else if(val === undefined && isObject(targetVal)){\n        merged[key] = this.cloneMerge(targetVal, {}, pruneMagicId)\n      }\n    }\n    if(pruneMagicId){\n      delete merged.magicId\n      delete merged.newRender\n    } else if(target[ROOT]){\n      merged.newRender = true\n    }\n    return merged\n  }\n\n  componentToString(cid){\n    let [str, streams] = this.recursiveCIDToString(this.rendered[COMPONENTS], cid, null)\n    let [strippedHTML, _before, _after] = modifyRoot(str, {})\n    return [strippedHTML, streams]\n  }\n\n  pruneCIDs(cids){\n    cids.forEach(cid => delete this.rendered[COMPONENTS][cid])\n  }\n\n  // private\n\n  get(){ return this.rendered }\n\n  isNewFingerprint(diff = {}){ return !!diff[STATIC] }\n\n  templateStatic(part, templates){\n    if(typeof (part) === \"number\"){\n      return templates[part]\n    } else {\n      return part\n    }\n  }\n\n  nextMagicID(){\n    this.magicId++\n    return `m${this.magicId}-${this.parentViewId()}`\n  }\n\n  // Converts rendered tree to output buffer.\n  //\n  // changeTracking controls if we can apply the PHX_SKIP optimization.\n  // It is disabled for comprehensions since we must re-render the entire collection\n  // and no individual element is tracked inside the comprehension.\n  toOutputBuffer(rendered, templates, output, changeTracking, rootAttrs = {}){\n    if(rendered[DYNAMICS]){ return this.comprehensionToBuffer(rendered, templates, output) }\n    let {[STATIC]: statics} = rendered\n    statics = this.templateStatic(statics, templates)\n    let isRoot = rendered[ROOT]\n    let prevBuffer = output.buffer\n    if(isRoot){ output.buffer = \"\" }\n\n    // this condition is called when first rendering an optimizable function component.\n    // LC have their magicId previously set\n    if(changeTracking && isRoot && !rendered.magicId){\n      rendered.newRender = true\n      rendered.magicId = this.nextMagicID()\n    }\n\n    output.buffer += statics[0]\n    for(let i = 1; i < statics.length; i++){\n      this.dynamicToBuffer(rendered[i - 1], templates, output, changeTracking)\n      output.buffer += statics[i]\n    }\n\n    // Applies the root tag \"skip\" optimization if supported, which clears\n    // the root tag attributes and innerHTML, and only maintains the magicId.\n    // We can only skip when changeTracking is supported (outside of a comprehension),\n    // and when the root element hasn't experienced an unrendered merge (newRender true).\n    if(isRoot){\n      let skip = false\n      let attrs\n      // When a LC is re-added to the page, we need to re-render the entire LC tree,\n      // therefore changeTracking is false; however, we need to keep all the magicIds\n      // from any function component so the next time the LC is updated, we can apply\n      // the skip optimization\n      if(changeTracking || rendered.magicId){\n        skip = changeTracking && !rendered.newRender\n        attrs = {[PHX_MAGIC_ID]: rendered.magicId, ...rootAttrs}\n      } else {\n        attrs = rootAttrs\n      }\n      if(skip){ attrs[PHX_SKIP] = true }\n      let [newRoot, commentBefore, commentAfter] = modifyRoot(output.buffer, attrs, skip)\n      rendered.newRender = false\n      output.buffer = prevBuffer + commentBefore + newRoot + commentAfter\n    }\n  }\n\n  comprehensionToBuffer(rendered, templates, output){\n    let {[DYNAMICS]: dynamics, [STATIC]: statics, [STREAM]: stream} = rendered\n    let [_ref, _inserts, deleteIds, reset] = stream || [null, {}, [], null]\n    statics = this.templateStatic(statics, templates)\n    let compTemplates = templates || rendered[TEMPLATES]\n    for(let d = 0; d < dynamics.length; d++){\n      let dynamic = dynamics[d]\n      output.buffer += statics[0]\n      for(let i = 1; i < statics.length; i++){\n        // Inside a comprehension, we don't track how dynamics change\n        // over time (and features like streams would make that impossible\n        // unless we move the stream diffing away from morphdom),\n        // so we can't perform root change tracking.\n        let changeTracking = false\n        this.dynamicToBuffer(dynamic[i - 1], compTemplates, output, changeTracking)\n        output.buffer += statics[i]\n      }\n    }\n\n    if(stream !== undefined && (rendered[DYNAMICS].length > 0 || deleteIds.length > 0 || reset)){\n      delete rendered[STREAM]\n      rendered[DYNAMICS] = []\n      output.streams.add(stream)\n    }\n  }\n\n  dynamicToBuffer(rendered, templates, output, changeTracking){\n    if(typeof (rendered) === \"number\"){\n      let [str, streams] = this.recursiveCIDToString(output.components, rendered, output.onlyCids)\n      output.buffer += str\n      output.streams = new Set([...output.streams, ...streams])\n    } else if(isObject(rendered)){\n      this.toOutputBuffer(rendered, templates, output, changeTracking, {})\n    } else {\n      output.buffer += rendered\n    }\n  }\n\n  recursiveCIDToString(components, cid, onlyCids){\n    let component = components[cid] || logError(`no component for CID ${cid}`, components)\n    let attrs = {[PHX_COMPONENT]: cid}\n    let skip = onlyCids && !onlyCids.has(cid)\n    // Two optimization paths apply here:\n    //\n    //   1. The onlyCids optimization works by the server diff telling us only specific\n    //     cid's have changed. This allows us to skip rendering any component that hasn't changed,\n    //     which ultimately sets PHX_SKIP root attribute and avoids rendering the innerHTML.\n    //\n    //   2. The root PHX_SKIP optimization generalizes to all HEEx function components, and\n    //     works in the same PHX_SKIP attribute fashion as 1, but the newRender tracking is done\n    //     at the general diff merge level. If we merge a diff with new dynamics, we necessarily have\n    //     experienced a change which must be a newRender, and thus we can't skip the render.\n    //\n    // Both optimization flows apply here. newRender is set based on the onlyCids optimization, and\n    // we track a deterministic magicId based on the cid.\n    //\n    // changeTracking is about the entire tree\n    // newRender is about the current root in the tree\n    //\n    // By default changeTracking is enabled, but we special case the flow where the client is pruning\n    // cids and the server adds the component back. In such cases, we explicitly disable changeTracking\n    // with resetRender for this cid, then re-enable it after the recursive call to skip the optimization\n    // for the entire component tree.\n    component.newRender = !skip\n    component.magicId = `c${cid}-${this.parentViewId()}`\n    // enable change tracking as long as the component hasn't been reset\n    let changeTracking = !component.reset\n    let [html, streams] = this.recursiveToString(component, components, onlyCids, changeTracking, attrs)\n    // disable reset after we've rendered\n    delete component.reset\n\n    return [html, streams]\n  }\n}\n", "import DOM from \"./dom\"\nimport ARIA from \"./aria\"\n\nlet focusStack = []\nlet default_transition_time = 200\n\nlet JS = {\n  // private\n  exec(e, eventType, phxEvent, view, sourceEl, defaults){\n    let [defaultKind, defaultArgs] = defaults || [null, {callback: defaults && defaults.callback}]\n    let commands = phxEvent.charAt(0) === \"[\" ?\n      JSON.parse(phxEvent) : [[defaultKind, defaultArgs]]\n\n    commands.forEach(([kind, args]) => {\n      if(kind === defaultKind){\n        // always prefer the args, but keep existing keys from the defaultArgs\n        args = {...defaultArgs, ...args}\n        args.callback = args.callback || defaultArgs.callback\n      }\n      this.filterToEls(view.liveSocket, sourceEl, args).forEach(el => {\n        this[`exec_${kind}`](e, eventType, phxEvent, view, sourceEl, el, args)\n      })\n    })\n  },\n\n  isVisible(el){\n    return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length > 0)\n  },\n\n  // returns true if any part of the element is inside the viewport\n  isInViewport(el){\n    const rect = el.getBoundingClientRect()\n    const windowHeight = window.innerHeight || document.documentElement.clientHeight\n    const windowWidth = window.innerWidth || document.documentElement.clientWidth\n\n    return (\n      rect.right > 0 &&\n      rect.bottom > 0 &&\n      rect.left < windowWidth &&\n      rect.top < windowHeight\n    )\n  },\n\n  // private\n\n  // commands\n\n  exec_exec(e, eventType, phxEvent, view, sourceEl, el, {attr, to}){\n    let nodes = to ? DOM.all(document, to) : [sourceEl]\n    nodes.forEach(node => {\n      let encodedJS = node.getAttribute(attr)\n      if(!encodedJS){ throw new Error(`expected ${attr} to contain JS command on \"${to}\"`) }\n      view.liveSocket.execJS(node, encodedJS, eventType)\n    })\n  },\n\n  exec_dispatch(e, eventType, phxEvent, view, sourceEl, el, {event, detail, bubbles}){\n    detail = detail || {}\n    detail.dispatcher = sourceEl\n    DOM.dispatchEvent(el, event, {detail, bubbles})\n  },\n\n  exec_push(e, eventType, phxEvent, view, sourceEl, el, args){\n    let {event, data, target, page_loading, loading, value, dispatcher, callback} = args\n    let pushOpts = {loading, value, target, page_loading: !!page_loading}\n    let targetSrc = eventType === \"change\" && dispatcher ? dispatcher : sourceEl\n    let phxTarget = target || targetSrc.getAttribute(view.binding(\"target\")) || targetSrc\n    const handler = (targetView, targetCtx) => {\n      if(!targetView.isConnected()){ return }\n      if(eventType === \"change\"){\n        let {newCid, _target} = args\n        _target = _target || (DOM.isFormInput(sourceEl) ? sourceEl.name : undefined)\n        if(_target){ pushOpts._target = _target }\n        targetView.pushInput(sourceEl, targetCtx, newCid, event || phxEvent, pushOpts, callback)\n      } else if(eventType === \"submit\"){\n        let {submitter} = args\n        targetView.submitForm(sourceEl, targetCtx, event || phxEvent, submitter, pushOpts, callback)\n      } else {\n        targetView.pushEvent(eventType, sourceEl, targetCtx, event || phxEvent, data, pushOpts, callback)\n      }\n    }\n    // in case of formRecovery, targetView and targetCtx are passed as argument\n    // as they are looked up in a template element, not the real DOM\n    if(args.targetView && args.targetCtx){\n      handler(args.targetView, args.targetCtx)\n    } else {\n      view.withinTargets(phxTarget, handler)\n    }\n  },\n\n  exec_navigate(e, eventType, phxEvent, view, sourceEl, el, {href, replace}){\n    view.liveSocket.historyRedirect(e, href, replace ? \"replace\" : \"push\", null, sourceEl)\n  },\n\n  exec_patch(e, eventType, phxEvent, view, sourceEl, el, {href, replace}){\n    view.liveSocket.pushHistoryPatch(e, href, replace ? \"replace\" : \"push\", sourceEl)\n  },\n\n  exec_focus(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => ARIA.attemptFocus(el))\n  },\n\n  exec_focus_first(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => ARIA.focusFirstInteractive(el) || ARIA.focusFirst(el))\n  },\n\n  exec_push_focus(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => focusStack.push(el || sourceEl))\n  },\n\n  exec_pop_focus(_e, _eventType, _phxEvent, _view, _sourceEl, _el){\n    window.requestAnimationFrame(() => {\n      const el = focusStack.pop()\n      if(el){ el.focus() }\n    })\n  },\n\n  exec_add_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.addOrRemoveClasses(el, names, [], transition, time, view, blocking)\n  },\n\n  exec_remove_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.addOrRemoveClasses(el, [], names, transition, time, view, blocking)\n  },\n\n  exec_toggle_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.toggleClasses(el, names, transition, time, view, blocking)\n  },\n\n  exec_toggle_attr(e, eventType, phxEvent, view, sourceEl, el, {attr: [attr, val1, val2]}){\n    this.toggleAttr(el, attr, val1, val2)\n  },\n\n  exec_transition(e, eventType, phxEvent, view, sourceEl, el, {time, transition, blocking}){\n    this.addOrRemoveClasses(el, [], [], transition, time, view, blocking)\n  },\n\n  exec_toggle(e, eventType, phxEvent, view, sourceEl, el, {display, ins, outs, time, blocking}){\n    this.toggle(eventType, view, el, display, ins, outs, time, blocking)\n  },\n\n  exec_show(e, eventType, phxEvent, view, sourceEl, el, {display, transition, time, blocking}){\n    this.show(eventType, view, el, display, transition, time, blocking)\n  },\n\n  exec_hide(e, eventType, phxEvent, view, sourceEl, el, {display, transition, time, blocking}){\n    this.hide(eventType, view, el, display, transition, time, blocking)\n  },\n\n  exec_set_attr(e, eventType, phxEvent, view, sourceEl, el, {attr: [attr, val]}){\n    this.setOrRemoveAttrs(el, [[attr, val]], [])\n  },\n\n  exec_remove_attr(e, eventType, phxEvent, view, sourceEl, el, {attr}){\n    this.setOrRemoveAttrs(el, [], [attr])\n  },\n\n  // utils for commands\n\n  show(eventType, view, el, display, transition, time, blocking){\n    if(!this.isVisible(el)){\n      this.toggle(eventType, view, el, display, transition, null, time, blocking)\n    }\n  },\n\n  hide(eventType, view, el, display, transition, time, blocking){\n    if(this.isVisible(el)){\n      this.toggle(eventType, view, el, display, null, transition, time, blocking)\n    }\n  },\n\n  toggle(eventType, view, el, display, ins, outs, time, blocking){\n    time = time || default_transition_time\n    let [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []]\n    let [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []]\n    if(inClasses.length > 0 || outClasses.length > 0){\n      if(this.isVisible(el)){\n        let onStart = () => {\n          this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses))\n          window.requestAnimationFrame(() => {\n            this.addOrRemoveClasses(el, outClasses, [])\n            window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses))\n          })\n        }\n        let onEnd = () => {\n          this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses))\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = \"none\")\n          el.dispatchEvent(new Event(\"phx:hide-end\"))\n        }\n        el.dispatchEvent(new Event(\"phx:hide-start\"))\n        if(blocking === false){\n          onStart()\n          setTimeout(onEnd, time)\n        } else {\n          view.transition(time, onStart, onEnd)\n        }\n      } else {\n        if(eventType === \"remove\"){ return }\n        let onStart = () => {\n          this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses))\n          let stickyDisplay = display || this.defaultDisplay(el)\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = stickyDisplay)\n          window.requestAnimationFrame(() => {\n            this.addOrRemoveClasses(el, inClasses, [])\n            window.requestAnimationFrame(() => this.addOrRemoveClasses(el, inEndClasses, inStartClasses))\n          })\n        }\n        let onEnd = () => {\n          this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses))\n          el.dispatchEvent(new Event(\"phx:show-end\"))\n        }\n        el.dispatchEvent(new Event(\"phx:show-start\"))\n        if(blocking === false){\n          onStart()\n          setTimeout(onEnd, time)\n        } else {\n          view.transition(time, onStart, onEnd)\n        }\n      }\n    } else {\n      if(this.isVisible(el)){\n        window.requestAnimationFrame(() => {\n          el.dispatchEvent(new Event(\"phx:hide-start\"))\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = \"none\")\n          el.dispatchEvent(new Event(\"phx:hide-end\"))\n        })\n      } else {\n        window.requestAnimationFrame(() => {\n          el.dispatchEvent(new Event(\"phx:show-start\"))\n          let stickyDisplay = display || this.defaultDisplay(el)\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = stickyDisplay)\n          el.dispatchEvent(new Event(\"phx:show-end\"))\n        })\n      }\n    }\n  },\n\n  toggleClasses(el, classes, transition, time, view, blocking){\n    window.requestAnimationFrame(() => {\n      let [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []])\n      let newAdds = classes.filter(name => prevAdds.indexOf(name) < 0 && !el.classList.contains(name))\n      let newRemoves = classes.filter(name => prevRemoves.indexOf(name) < 0 && el.classList.contains(name))\n      this.addOrRemoveClasses(el, newAdds, newRemoves, transition, time, view, blocking)\n    })\n  },\n\n  toggleAttr(el, attr, val1, val2){\n    if(el.hasAttribute(attr)){\n      if(val2 !== undefined){\n        // toggle between val1 and val2\n        if(el.getAttribute(attr) === val1){\n          this.setOrRemoveAttrs(el, [[attr, val2]], [])\n        } else {\n          this.setOrRemoveAttrs(el, [[attr, val1]], [])\n        }\n      } else {\n        // remove attr\n        this.setOrRemoveAttrs(el, [], [attr])\n      }\n    } else {\n      this.setOrRemoveAttrs(el, [[attr, val1]], [])\n    }\n  },\n\n  addOrRemoveClasses(el, adds, removes, transition, time, view, blocking){\n    time = time || default_transition_time\n    let [transitionRun, transitionStart, transitionEnd] = transition || [[], [], []]\n    if(transitionRun.length > 0){\n      let onStart = () => {\n        this.addOrRemoveClasses(el, transitionStart, [].concat(transitionRun).concat(transitionEnd))\n        window.requestAnimationFrame(() => {\n          this.addOrRemoveClasses(el, transitionRun, [])\n          window.requestAnimationFrame(() => this.addOrRemoveClasses(el, transitionEnd, transitionStart))\n        })\n      }\n      let onDone = () => this.addOrRemoveClasses(el, adds.concat(transitionEnd), removes.concat(transitionRun).concat(transitionStart))\n      if(blocking === false){\n        onStart()\n        setTimeout(onDone, time)\n      } else {\n        view.transition(time, onStart, onDone)\n      }\n      return\n    }\n\n    window.requestAnimationFrame(() => {\n      let [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []])\n      let keepAdds = adds.filter(name => prevAdds.indexOf(name) < 0 && !el.classList.contains(name))\n      let keepRemoves = removes.filter(name => prevRemoves.indexOf(name) < 0 && el.classList.contains(name))\n      let newAdds = prevAdds.filter(name => removes.indexOf(name) < 0).concat(keepAdds)\n      let newRemoves = prevRemoves.filter(name => adds.indexOf(name) < 0).concat(keepRemoves)\n\n      DOM.putSticky(el, \"classes\", currentEl => {\n        currentEl.classList.remove(...newRemoves)\n        currentEl.classList.add(...newAdds)\n        return [newAdds, newRemoves]\n      })\n    })\n  },\n\n  setOrRemoveAttrs(el, sets, removes){\n    let [prevSets, prevRemoves] = DOM.getSticky(el, \"attrs\", [[], []])\n\n    let alteredAttrs = sets.map(([attr, _val]) => attr).concat(removes)\n    let newSets = prevSets.filter(([attr, _val]) => !alteredAttrs.includes(attr)).concat(sets)\n    let newRemoves = prevRemoves.filter((attr) => !alteredAttrs.includes(attr)).concat(removes)\n\n    DOM.putSticky(el, \"attrs\", currentEl => {\n      newRemoves.forEach(attr => currentEl.removeAttribute(attr))\n      newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val))\n      return [newSets, newRemoves]\n    })\n  },\n\n  hasAllClasses(el, classes){ return classes.every(name => el.classList.contains(name)) },\n\n  isToggledOut(el, outClasses){\n    return !this.isVisible(el) || this.hasAllClasses(el, outClasses)\n  },\n\n  filterToEls(liveSocket, sourceEl, {to}){\n    let defaultQuery = () => {\n      if(typeof(to) === \"string\"){\n        return document.querySelectorAll(to)\n      } else if(to.closest){\n        let toEl = sourceEl.closest(to.closest)\n        return toEl ? [toEl] : []\n      } else if(to.inner){\n        return sourceEl.querySelectorAll(to.inner)\n      }\n    }\n    return to ? liveSocket.jsQuerySelectorAll(sourceEl, to, defaultQuery) : [sourceEl]\n  },\n\n  defaultDisplay(el){\n    return {tr: \"table-row\", td: \"table-cell\"}[el.tagName.toLowerCase()] || \"block\"\n  },\n\n  transitionClasses(val){\n    if(!val){ return null }\n\n    let [trans, tStart, tEnd] = Array.isArray(val) ? val : [val.split(\" \"), [], []]\n    trans = Array.isArray(trans) ? trans : trans.split(\" \")\n    tStart = Array.isArray(tStart) ? tStart : tStart.split(\" \")\n    tEnd = Array.isArray(tEnd) ? tEnd : tEnd.split(\" \")\n    return [trans, tStart, tEnd]\n  }\n}\n\nexport default JS\n", "import JS from \"./js\"\nimport DOM from \"./dom\"\n\nconst HOOK_ID = \"hookId\"\n\nlet viewHookID = 1\nexport default class ViewHook {\n  static makeID(){ return viewHookID++ }\n  static elementID(el){ return DOM.private(el, HOOK_ID) }\n\n  constructor(view, el, callbacks){\n    this.el = el\n    this.__attachView(view)\n    this.__callbacks = callbacks\n    this.__listeners = new Set()\n    this.__isDisconnected = false\n    DOM.putPrivate(this.el, HOOK_ID, this.constructor.makeID())\n    for(let key in this.__callbacks){ this[key] = this.__callbacks[key] }\n  }\n\n  __attachView(view){\n    if(view){\n      this.__view = () => view\n      this.liveSocket = view.liveSocket\n    } else {\n      this.__view = () => {\n        throw new Error(`hook not yet attached to a live view: ${this.el.outerHTML}`)\n      }\n      this.liveSocket = null\n    }\n  }\n\n  __mounted(){ this.mounted && this.mounted() }\n  __updated(){ this.updated && this.updated() }\n  __beforeUpdate(){ this.beforeUpdate && this.beforeUpdate() }\n  __destroyed(){\n    this.destroyed && this.destroyed()\n    DOM.deletePrivate(this.el, HOOK_ID) // https://github.com/phoenixframework/phoenix_live_view/issues/3496\n  }\n  __reconnected(){\n    if(this.__isDisconnected){\n      this.__isDisconnected = false\n      this.reconnected && this.reconnected()\n    }\n  }\n  __disconnected(){\n    this.__isDisconnected = true\n    this.disconnected && this.disconnected()\n  }\n\n  /**\n   * Binds the hook to JS commands.\n   *\n   * @param {ViewHook} hook - The ViewHook instance to bind.\n   *\n   * @returns {Object} An object with methods to manipulate the DOM and execute JavaScript.\n   */\n  js(){\n    let hook = this\n\n    return {\n      /**\n       * Executes encoded JavaScript in the context of the hook element.\n       *\n       * @param {string} encodedJS - The encoded JavaScript string to execute.\n       */\n      exec(encodedJS){\n        hook.__view().liveSocket.execJS(hook.el, encodedJS, \"hook\")\n      },\n\n      /**\n       * Shows an element.\n       *\n       * @param {HTMLElement} el - The element to show.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.display] - The CSS display value to set. Defaults \"block\".\n       * @param {string} [opts.transition] - The CSS transition classes to set when showing.\n       * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *  Defaults `true`.\n       */\n      show(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.show(\"hook\", owner, el, opts.display, opts.transition, opts.time, opts.blocking)\n      },\n\n      /**\n       * Hides an element.\n       *\n       * @param {HTMLElement} el - The element to hide.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set when hiding.\n       * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      hide(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.hide(\"hook\", owner, el, null, opts.transition, opts.time, opts.blocking)\n      },\n\n      /**\n       * Toggles the visibility of an element.\n       *\n       * @param {HTMLElement} el - The element to toggle.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.display] - The CSS display value to set. Defaults \"block\".\n       * @param {string} [opts.in] - The CSS transition classes for showing.\n       *   Accepts either the string of classes to apply when toggling in, or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]\n       *\n       * @param {string} [opts.out] - The CSS transition classes for hiding.\n       *   Accepts either string of classes to apply when toggling out, or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       *\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      toggle(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        opts.in = JS.transitionClasses(opts.in)\n        opts.out = JS.transitionClasses(opts.out)\n        JS.toggle(\"hook\", owner, el, opts.display, opts.in, opts.out, opts.time, opts.blocking)\n      },\n\n      /**\n       * Adds CSS classes to an element.\n       *\n       * @param {HTMLElement} el - The element to add classes to.\n       * @param {string|string[]} names - The class name(s) to add.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition property to set.\n       *   Accepts a string of classes to apply when adding classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      addClass(el, names, opts = {}){\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, names, [], opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Removes CSS classes from an element.\n       *\n       * @param {HTMLElement} el - The element to remove classes from.\n       * @param {string|string[]} names - The class name(s) to remove.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set.\n       *   Accepts a string of classes to apply when removing classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      removeClass(el, names, opts = {}){\n        opts.transition = JS.transitionClasses(opts.transition)\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, [], names, opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Toggles CSS classes on an element.\n       *\n       * @param {HTMLElement} el - The element to toggle classes on.\n       * @param {string|string[]} names - The class name(s) to toggle.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set.\n       *   Accepts a string of classes to apply when toggling classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      toggleClass(el, names, opts = {}){\n        opts.transition = JS.transitionClasses(opts.transition)\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.toggleClasses(el, names, opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Applies a CSS transition to an element.\n       *\n       * @param {HTMLElement} el - The element to apply the transition to.\n       * @param {string|string[]} transition - The transition class(es) to apply.\n       *   Accepts a string of classes to apply when transitioning or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      transition(el, transition, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, [], [], JS.transitionClasses(transition), opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Sets an attribute on an element.\n       *\n       * @param {HTMLElement} el - The element to set the attribute on.\n       * @param {string} attr - The attribute name to set.\n       * @param {string} val - The value to set for the attribute.\n       */\n      setAttribute(el, attr, val){ JS.setOrRemoveAttrs(el, [[attr, val]], []) },\n\n      /**\n       * Removes an attribute from an element.\n       *\n       * @param {HTMLElement} el - The element to remove the attribute from.\n       * @param {string} attr - The attribute name to remove.\n       */\n      removeAttribute(el, attr){ JS.setOrRemoveAttrs(el, [], [attr]) },\n\n      /**\n       * Toggles an attribute on an element between two values.\n       *\n       * @param {HTMLElement} el - The element to toggle the attribute on.\n       * @param {string} attr - The attribute name to toggle.\n       * @param {string} val1 - The first value to toggle between.\n       * @param {string} val2 - The second value to toggle between.\n       */\n      toggleAttribute(el, attr, val1, val2){ JS.toggleAttr(el, attr, val1, val2) },\n    }\n  }\n\n  pushEvent(event, payload = {}, onReply){\n    if(onReply === undefined){\n      return new Promise((resolve, reject) => {\n        try {\n          const ref = this.__view().pushHookEvent(this.el, null, event, payload, (reply, _ref) => resolve(reply))\n          if(ref === false){\n            reject(new Error(\"unable to push hook event. LiveView not connected\"))\n          }\n        } catch (error){\n          reject(error)\n        }\n      })\n    }\n    return this.__view().pushHookEvent(this.el, null, event, payload, onReply)\n  }\n\n  pushEventTo(phxTarget, event, payload = {}, onReply){\n    if(onReply === undefined){\n      return new Promise((resolve, reject) => {\n        try {\n          this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n            const ref = view.pushHookEvent(this.el, targetCtx, event, payload, (reply, _ref) => resolve(reply))\n            if(ref === false){\n              reject(new Error(\"unable to push hook event. LiveView not connected\"))\n            }\n          })\n        } catch (error){\n          reject(error)\n        }\n      })\n    }\n    return this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n      return view.pushHookEvent(this.el, targetCtx, event, payload, onReply)\n    })\n  }\n\n  handleEvent(event, callback){\n    let callbackRef = (customEvent, bypass) => bypass ? event : callback(customEvent.detail)\n    window.addEventListener(`phx:${event}`, callbackRef)\n    this.__listeners.add(callbackRef)\n    return callbackRef\n  }\n\n  removeHandleEvent(callbackRef){\n    let event = callbackRef(null, true)\n    window.removeEventListener(`phx:${event}`, callbackRef)\n    this.__listeners.delete(callbackRef)\n  }\n\n  upload(name, files){\n    return this.__view().dispatchUploads(null, name, files)\n  }\n\n  uploadTo(phxTarget, name, files){\n    return this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n      view.dispatchUploads(targetCtx, name, files)\n    })\n  }\n\n  __cleanup__(){\n    this.__listeners.forEach(callbackRef => this.removeHandleEvent(callbackRef))\n  }\n}\n", "import {\n  BEFORE_UNLOAD_LOADER_TIMEOUT,\n  CHECKABLE_INPUTS,\n  CONSECUTIVE_RELOADS,\n  PHX_AUTO_RECOVER,\n  PHX_COMPONENT,\n  PHX_CONNECTED_CLASS,\n  PHX_DISABLE_WITH,\n  PHX_DISABLE_WITH_RESTORE,\n  PHX_DISABLED,\n  PHX_LOADING_CLASS,\n  PHX_ERROR_CLASS,\n  PHX_CLIENT_ERROR_CLASS,\n  PHX_SERVER_ERROR_CLASS,\n  PHX_HAS_FOCUSED,\n  PHX_HAS_SUBMITTED,\n  PHX_HOOK,\n  PHX_PARENT_ID,\n  PHX_PROGRESS,\n  PHX_READONLY,\n  PHX_REF_LOADING,\n  PHX_REF_SRC,\n  PHX_REF_LOCK,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_STATIC,\n  PHX_TRACK_STATIC,\n  PHX_TRACK_UPLOADS,\n  PHX_UPDATE,\n  PHX_UPLOAD_REF,\n  PHX_VIEW_SELECTOR,\n  PHX_MAIN,\n  PHX_MOUNTED,\n  PUSH_TIMEOUT,\n  PHX_VIEWPORT_TOP,\n  PHX_VIEWPORT_BOTTOM,\n  MAX_CHILD_JOIN_ATTEMPTS\n} from \"./constants\"\n\nimport {\n  clone,\n  closestPhxBinding,\n  isEmpty,\n  isEqualObj,\n  logError,\n  maybe,\n  isCid,\n} from \"./utils\"\n\nimport Browser from \"./browser\"\nimport DOM from \"./dom\"\nimport ElementRef from \"./element_ref\"\nimport DOMPatch from \"./dom_patch\"\nimport LiveUploader from \"./live_uploader\"\nimport Rendered from \"./rendered\"\nimport ViewHook from \"./view_hook\"\nimport JS from \"./js\"\n\nexport let prependFormDataKey = (key, prefix) => {\n  let isArray = key.endsWith(\"[]\")\n  // Remove the \"[]\" if it's an array\n  let baseKey = isArray ? key.slice(0, -2) : key\n  // Replace last occurrence of key before a closing bracket or the end with key plus suffix\n  baseKey = baseKey.replace(/([^\\[\\]]+)(\\]?$)/, `${prefix}$1$2`)\n  // Add back the \"[]\" if it was an array\n  if(isArray){ baseKey += \"[]\" }\n  return baseKey\n}\n\nlet serializeForm = (form, metadata, onlyNames = []) => {\n  const {submitter, ...meta} = metadata\n\n  // We must inject the submitter in the order that it exists in the DOM\n  // relative to other inputs. For example, for checkbox groups, the order must be maintained.\n  let injectedElement\n  if(submitter && submitter.name){\n    const input = document.createElement(\"input\")\n    input.type = \"hidden\"\n    // set the form attribute if the submitter has one;\n    // this can happen if the element is outside the actual form element\n    const formId = submitter.getAttribute(\"form\")\n    if(formId){\n      input.setAttribute(\"form\", formId)\n    }\n    input.name = submitter.name\n    input.value = submitter.value\n    submitter.parentElement.insertBefore(input, submitter)\n    injectedElement = input\n  }\n\n  const formData = new FormData(form)\n  const toRemove = []\n\n  formData.forEach((val, key, _index) => {\n    if(val instanceof File){ toRemove.push(key) }\n  })\n\n  // Cleanup after building fileData\n  toRemove.forEach(key => formData.delete(key))\n\n  const params = new URLSearchParams()\n\n  let elements = Array.from(form.elements)\n  for(let [key, val] of formData.entries()){\n    if(onlyNames.length === 0 || onlyNames.indexOf(key) >= 0){\n      let inputs = elements.filter(input => input.name === key)\n      let isUnused = !inputs.some(input => (DOM.private(input, PHX_HAS_FOCUSED) || DOM.private(input, PHX_HAS_SUBMITTED)))\n      let hidden = inputs.every(input => input.type === \"hidden\")\n      if(isUnused && !(submitter && submitter.name == key) && !hidden){\n        params.append(prependFormDataKey(key, \"_unused_\"), \"\")\n      }\n      params.append(key, val)\n    }\n  }\n\n  // remove the injected element again\n  // (it would be removed by the next dom patch anyway, but this is cleaner)\n  if(submitter && injectedElement){\n    submitter.parentElement.removeChild(injectedElement)\n  }\n\n  for(let metaKey in meta){ params.append(metaKey, meta[metaKey]) }\n\n  return params.toString()\n}\n\nexport default class View {\n  static closestView(el){\n    let liveViewEl = el.closest(PHX_VIEW_SELECTOR)\n    return liveViewEl ? DOM.private(liveViewEl, \"view\") : null\n  }\n\n  constructor(el, liveSocket, parentView, flash, liveReferer){\n    this.isDead = false\n    this.liveSocket = liveSocket\n    this.flash = flash\n    this.parent = parentView\n    this.root = parentView ? parentView.root : this\n    this.el = el\n    DOM.putPrivate(this.el, \"view\", this)\n    this.id = this.el.id\n    this.ref = 0\n    this.lastAckRef = null\n    this.childJoins = 0\n    this.loaderTimer = null\n    this.pendingDiffs = []\n    this.pendingForms = new Set()\n    this.redirect = false\n    this.href = null\n    this.joinCount = this.parent ? this.parent.joinCount - 1 : 0\n    this.joinAttempts = 0\n    this.joinPending = true\n    this.destroyed = false\n    this.joinCallback = function(onDone){ onDone && onDone() }\n    this.stopCallback = function(){ }\n    this.pendingJoinOps = this.parent ? null : []\n    this.viewHooks = {}\n    this.formSubmits = []\n    this.children = this.parent ? null : {}\n    this.root.children[this.id] = {}\n    this.formsForRecovery = {}\n    this.channel = this.liveSocket.channel(`lv:${this.id}`, () => {\n      let url = this.href && this.expandURL(this.href)\n      return {\n        redirect: this.redirect ? url : undefined,\n        url: this.redirect ? undefined : url || undefined,\n        params: this.connectParams(liveReferer),\n        session: this.getSession(),\n        static: this.getStatic(),\n        flash: this.flash,\n      }\n    })\n  }\n\n  setHref(href){ this.href = href }\n\n  setRedirect(href){\n    this.redirect = true\n    this.href = href\n  }\n\n  isMain(){ return this.el.hasAttribute(PHX_MAIN) }\n\n  connectParams(liveReferer){\n    let params = this.liveSocket.params(this.el)\n    let manifest =\n      DOM.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`)\n        .map(node => node.src || node.href).filter(url => typeof (url) === \"string\")\n\n    if(manifest.length > 0){ params[\"_track_static\"] = manifest }\n    params[\"_mounts\"] = this.joinCount\n    params[\"_mount_attempts\"] = this.joinAttempts\n    params[\"_live_referer\"] = liveReferer\n    this.joinAttempts++\n\n    return params\n  }\n\n  isConnected(){ return this.channel.canPush() }\n\n  getSession(){ return this.el.getAttribute(PHX_SESSION) }\n\n  getStatic(){\n    let val = this.el.getAttribute(PHX_STATIC)\n    return val === \"\" ? null : val\n  }\n\n  destroy(callback = function (){ }){\n    this.destroyAllChildren()\n    this.destroyed = true\n    delete this.root.children[this.id]\n    if(this.parent){ delete this.root.children[this.parent.id][this.id] }\n    clearTimeout(this.loaderTimer)\n    let onFinished = () => {\n      callback()\n      for(let id in this.viewHooks){\n        this.destroyHook(this.viewHooks[id])\n      }\n    }\n\n    DOM.markPhxChildDestroyed(this.el)\n\n    this.log(\"destroyed\", () => [\"the child has been removed from the parent\"])\n    this.channel.leave()\n      .receive(\"ok\", onFinished)\n      .receive(\"error\", onFinished)\n      .receive(\"timeout\", onFinished)\n  }\n\n  setContainerClasses(...classes){\n    this.el.classList.remove(\n      PHX_CONNECTED_CLASS,\n      PHX_LOADING_CLASS,\n      PHX_ERROR_CLASS,\n      PHX_CLIENT_ERROR_CLASS,\n      PHX_SERVER_ERROR_CLASS\n    )\n    this.el.classList.add(...classes)\n  }\n\n  showLoader(timeout){\n    clearTimeout(this.loaderTimer)\n    if(timeout){\n      this.loaderTimer = setTimeout(() => this.showLoader(), timeout)\n    } else {\n      for(let id in this.viewHooks){ this.viewHooks[id].__disconnected() }\n      this.setContainerClasses(PHX_LOADING_CLASS)\n    }\n  }\n\n  execAll(binding){\n    DOM.all(this.el, `[${binding}]`, el => this.liveSocket.execJS(el, el.getAttribute(binding)))\n  }\n\n  hideLoader(){\n    clearTimeout(this.loaderTimer)\n    this.setContainerClasses(PHX_CONNECTED_CLASS)\n    this.execAll(this.binding(\"connected\"))\n  }\n\n  triggerReconnected(){\n    for(let id in this.viewHooks){ this.viewHooks[id].__reconnected() }\n  }\n\n  log(kind, msgCallback){\n    this.liveSocket.log(this, kind, msgCallback)\n  }\n\n  transition(time, onStart, onDone = function(){}){\n    this.liveSocket.transition(time, onStart, onDone)\n  }\n\n  // calls the callback with the view and target element for the given phxTarget\n  // targets can be:\n  //  * an element itself, then it is simply passed to liveSocket.owner;\n  //  * a CID (Component ID), then we first search the component's element in the DOM\n  //  * a selector, then we search the selector in the DOM and call the callback\n  //    for each element found with the corresponding owner view\n  withinTargets(phxTarget, callback, dom = document, viewEl){\n    // in the form recovery case we search in a template fragment instead of\n    // the real dom, therefore we optionally pass dom and viewEl\n\n    if(phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement){\n      return this.liveSocket.owner(phxTarget, view => callback(view, phxTarget))\n    }\n\n    if(isCid(phxTarget)){\n      let targets = DOM.findComponentNodeList(viewEl || this.el, phxTarget)\n      if(targets.length === 0){\n        logError(`no component found matching phx-target of ${phxTarget}`)\n      } else {\n        callback(this, parseInt(phxTarget))\n      }\n    } else {\n      let targets = Array.from(dom.querySelectorAll(phxTarget))\n      if(targets.length === 0){ logError(`nothing found matching the phx-target selector \"${phxTarget}\"`) }\n      targets.forEach(target => this.liveSocket.owner(target, view => callback(view, target)))\n    }\n  }\n\n  applyDiff(type, rawDiff, callback){\n    this.log(type, () => [\"\", clone(rawDiff)])\n    let {diff, reply, events, title} = Rendered.extract(rawDiff)\n    callback({diff, reply, events})\n    if(typeof title === \"string\" || type == \"mount\"){ window.requestAnimationFrame(() => DOM.putTitle(title)) }\n  }\n\n  onJoin(resp){\n    let {rendered, container, liveview_version} = resp\n    if(container){\n      let [tag, attrs] = container\n      this.el = DOM.replaceRootContainer(this.el, tag, attrs)\n    }\n    this.childJoins = 0\n    this.joinPending = true\n    this.flash = null\n    if(this.root === this){\n      this.formsForRecovery = this.getFormsForRecovery()\n    }\n    if(this.isMain() && window.history.state === null){\n      // set initial history entry if this is the first page load\n      this.liveSocket.replaceRootHistory()\n    }\n\n    if(liveview_version !== this.liveSocket.version()){\n      console.error(`LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${liveview_version}. To avoid issues, please ensure that your assets use the same version as the server.`)\n    }\n\n    Browser.dropLocal(this.liveSocket.localStorage, window.location.pathname, CONSECUTIVE_RELOADS)\n    this.applyDiff(\"mount\", rendered, ({diff, events}) => {\n      this.rendered = new Rendered(this.id, diff)\n      let [html, streams] = this.renderContainer(null, \"join\")\n      this.dropPendingRefs()\n      this.joinCount++\n      this.joinAttempts = 0\n\n      this.maybeRecoverForms(html, () => {\n        this.onJoinComplete(resp, html, streams, events)\n      })\n    })\n  }\n\n  dropPendingRefs(){\n    DOM.all(document, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, el => {\n      el.removeAttribute(PHX_REF_LOADING)\n      el.removeAttribute(PHX_REF_SRC)\n      el.removeAttribute(PHX_REF_LOCK)\n    })\n  }\n\n  onJoinComplete({live_patch}, html, streams, events){\n    // In order to provide a better experience, we want to join\n    // all LiveViews first and only then apply their patches.\n    if(this.joinCount > 1 || (this.parent && !this.parent.isJoinPending())){\n      return this.applyJoinPatch(live_patch, html, streams, events)\n    }\n\n    // One downside of this approach is that we need to find phxChildren\n    // in the html fragment, instead of directly on the DOM. The fragment\n    // also does not include PHX_STATIC, so we need to copy it over from\n    // the DOM.\n    let newChildren = DOM.findPhxChildrenInFragment(html, this.id).filter(toEl => {\n      let fromEl = toEl.id && this.el.querySelector(`[id=\"${toEl.id}\"]`)\n      let phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC)\n      if(phxStatic){ toEl.setAttribute(PHX_STATIC, phxStatic) }\n      // set PHX_ROOT_ID to prevent events from being dispatched to the root view\n      // while the child join is still pending\n      if(fromEl){ fromEl.setAttribute(PHX_ROOT_ID, this.root.id) }\n      return this.joinChild(toEl)\n    })\n\n    if(newChildren.length === 0){\n      if(this.parent){\n        this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)])\n        this.parent.ackJoin(this)\n      } else {\n        this.onAllChildJoinsComplete()\n        this.applyJoinPatch(live_patch, html, streams, events)\n      }\n    } else {\n      this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)])\n    }\n  }\n\n  attachTrueDocEl(){\n    this.el = DOM.byId(this.id)\n    this.el.setAttribute(PHX_ROOT_ID, this.root.id)\n  }\n\n  // this is invoked for dead and live views, so we must filter by\n  // by owner to ensure we aren't duplicating hooks across disconnect\n  // and connected states. This also handles cases where hooks exist\n  // in a root layout with a LV in the body\n  execNewMounted(parent = this.el){\n    let phxViewportTop = this.binding(PHX_VIEWPORT_TOP)\n    let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM)\n    DOM.all(parent, `[${phxViewportTop}], [${phxViewportBottom}]`, hookEl => {\n      if(this.ownsElement(hookEl)){\n        DOM.maintainPrivateHooks(hookEl, hookEl, phxViewportTop, phxViewportBottom)\n        this.maybeAddNewHook(hookEl)\n      }\n    })\n    DOM.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, hookEl => {\n      if(this.ownsElement(hookEl)){\n        this.maybeAddNewHook(hookEl)\n      }\n    })\n    DOM.all(parent, `[${this.binding(PHX_MOUNTED)}]`, el => {\n      if(this.ownsElement(el)){\n        this.maybeMounted(el)\n      }\n    })\n  }\n\n  applyJoinPatch(live_patch, html, streams, events){\n    this.attachTrueDocEl()\n    let patch = new DOMPatch(this, this.el, this.id, html, streams, null)\n    patch.markPrunableContentForRemoval()\n    this.performPatch(patch, false, true)\n    this.joinNewChildren()\n    this.execNewMounted()\n\n    this.joinPending = false\n    this.liveSocket.dispatchEvents(events)\n    this.applyPendingUpdates()\n\n    if(live_patch){\n      let {kind, to} = live_patch\n      this.liveSocket.historyPatch(to, kind)\n    }\n    this.hideLoader()\n    if(this.joinCount > 1){ this.triggerReconnected() }\n    this.stopCallback()\n  }\n\n  triggerBeforeUpdateHook(fromEl, toEl){\n    this.liveSocket.triggerDOM(\"onBeforeElUpdated\", [fromEl, toEl])\n    let hook = this.getHook(fromEl)\n    let isIgnored = hook && DOM.isIgnored(fromEl, this.binding(PHX_UPDATE))\n    if(hook && !fromEl.isEqualNode(toEl) && !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))){\n      hook.__beforeUpdate()\n      return hook\n    }\n  }\n\n  maybeMounted(el){\n    let phxMounted = el.getAttribute(this.binding(PHX_MOUNTED))\n    let hasBeenInvoked = phxMounted && DOM.private(el, \"mounted\")\n    if(phxMounted && !hasBeenInvoked){\n      this.liveSocket.execJS(el, phxMounted)\n      DOM.putPrivate(el, \"mounted\", true)\n    }\n  }\n\n  maybeAddNewHook(el){\n    let newHook = this.addHook(el)\n    if(newHook){ newHook.__mounted() }\n  }\n\n  performPatch(patch, pruneCids, isJoinPatch = false){\n    let removedEls = []\n    let phxChildrenAdded = false\n    let updatedHookIds = new Set()\n\n    this.liveSocket.triggerDOM(\"onPatchStart\", [patch.targetContainer])\n\n    patch.after(\"added\", el => {\n      this.liveSocket.triggerDOM(\"onNodeAdded\", [el])\n      let phxViewportTop = this.binding(PHX_VIEWPORT_TOP)\n      let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM)\n      DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom)\n      this.maybeAddNewHook(el)\n      if(el.getAttribute){ this.maybeMounted(el) }\n    })\n\n    patch.after(\"phxChildAdded\", el => {\n      if(DOM.isPhxSticky(el)){\n        this.liveSocket.joinRootViews()\n      } else {\n        phxChildrenAdded = true\n      }\n    })\n\n    patch.before(\"updated\", (fromEl, toEl) => {\n      let hook = this.triggerBeforeUpdateHook(fromEl, toEl)\n      if(hook){ updatedHookIds.add(fromEl.id) }\n    })\n\n    patch.after(\"updated\", el => {\n      if(updatedHookIds.has(el.id)){ this.getHook(el).__updated() }\n    })\n\n    patch.after(\"discarded\", (el) => {\n      if(el.nodeType === Node.ELEMENT_NODE){ removedEls.push(el) }\n    })\n\n    patch.after(\"transitionsDiscarded\", els => this.afterElementsRemoved(els, pruneCids))\n    patch.perform(isJoinPatch)\n    this.afterElementsRemoved(removedEls, pruneCids)\n\n    this.liveSocket.triggerDOM(\"onPatchEnd\", [patch.targetContainer])\n    return phxChildrenAdded\n  }\n\n  afterElementsRemoved(elements, pruneCids){\n    let destroyedCIDs = []\n    elements.forEach(parent => {\n      let components = DOM.all(parent, `[${PHX_COMPONENT}]`)\n      let hooks = DOM.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-hook]`)\n      components.concat(parent).forEach(el => {\n        let cid = this.componentID(el)\n        if(isCid(cid) && destroyedCIDs.indexOf(cid) === -1){ destroyedCIDs.push(cid) }\n      })\n      hooks.concat(parent).forEach(hookEl => {\n        let hook = this.getHook(hookEl)\n        hook && this.destroyHook(hook)\n      })\n    })\n    // We should not pruneCids on joins. Otherwise, in case of\n    // rejoins, we may notify cids that no longer belong to the\n    // current LiveView to be removed.\n    if(pruneCids){\n      this.maybePushComponentsDestroyed(destroyedCIDs)\n    }\n  }\n\n  joinNewChildren(){\n    DOM.findPhxChildren(this.el, this.id).forEach(el => this.joinChild(el))\n  }\n\n  maybeRecoverForms(html, callback){\n    const phxChange = this.binding(\"change\")\n    const oldForms = this.root.formsForRecovery\n    // So why do we create a template element here?\n    // One way to recover forms would be to immediately apply the mount\n    // patch and then afterwards recover the forms. However, this would\n    // cause a flicker, because the mount patch would remove the form content\n    // until it is restored. Therefore LV decided to do form recovery with the\n    // raw HTML before it is applied and delay the mount patch until the form\n    // recovery events are done.\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    // because we work with a template element, we must manually copy the attributes\n    // otherwise the owner / target helpers don't work properly\n    const rootEl = template.content.firstElementChild\n    rootEl.id = this.id\n    rootEl.setAttribute(PHX_ROOT_ID, this.root.id)\n    rootEl.setAttribute(PHX_SESSION, this.getSession())\n    rootEl.setAttribute(PHX_STATIC, this.getStatic())\n    rootEl.setAttribute(PHX_PARENT_ID, this.parent ? this.parent.id : null)\n\n    // we go over all form elements in the new HTML for the LV\n    // and look for old forms in the `formsForRecovery` object;\n    // the formsForRecovery can also contain forms from child views\n    const formsToRecover =\n      // we go over all forms in the new DOM; because this is only the HTML for the current\n      // view, we can be sure that all forms are owned by this view:\n      DOM.all(template.content, \"form\")\n        // only recover forms that have an id and are in the old DOM\n        .filter(newForm => newForm.id && oldForms[newForm.id])\n        // abandon forms we already tried to recover to prevent looping a failed state\n        .filter(newForm => !this.pendingForms.has(newForm.id))\n        // only recover if the form has the same phx-change value\n        .filter(newForm => oldForms[newForm.id].getAttribute(phxChange) === newForm.getAttribute(phxChange))\n        .map(newForm => {\n          return [oldForms[newForm.id], newForm]\n        })\n\n    if(formsToRecover.length === 0){\n      return callback()\n    }\n\n    formsToRecover.forEach(([oldForm, newForm], i) => {\n      this.pendingForms.add(newForm.id)\n      // it is important to use the firstElementChild of the template content\n      // because when traversing a documentFragment using parentNode, we won't ever arrive at\n      // the fragment; as the template is always a LiveView, we can be sure that there is only\n      // one child on the root level\n      this.pushFormRecovery(oldForm, newForm, template.content.firstElementChild, () => {\n        this.pendingForms.delete(newForm.id)\n        // we only call the callback once all forms have been recovered\n        if(i === formsToRecover.length - 1){\n          callback()\n        }\n      })\n    })\n  }\n\n  getChildById(id){ return this.root.children[this.id][id] }\n\n  getDescendentByEl(el){\n    if(el.id === this.id){\n      return this\n    } else {\n      return this.children[el.getAttribute(PHX_PARENT_ID)]?.[el.id]\n    }\n  }\n\n  destroyDescendent(id){\n    for(let parentId in this.root.children){\n      for(let childId in this.root.children[parentId]){\n        if(childId === id){ return this.root.children[parentId][childId].destroy() }\n      }\n    }\n  }\n\n  joinChild(el){\n    let child = this.getChildById(el.id)\n    if(!child){\n      let view = new View(el, this.liveSocket, this)\n      this.root.children[this.id][view.id] = view\n      view.join()\n      this.childJoins++\n      return true\n    }\n  }\n\n  isJoinPending(){ return this.joinPending }\n\n  ackJoin(_child){\n    this.childJoins--\n\n    if(this.childJoins === 0){\n      if(this.parent){\n        this.parent.ackJoin(this)\n      } else {\n        this.onAllChildJoinsComplete()\n      }\n    }\n  }\n\n  onAllChildJoinsComplete(){\n    // we can clear pending form recoveries now that we've joined.\n    // They either all resolved or were abandoned\n    this.pendingForms.clear()\n    // we can also clear the formsForRecovery object to not keep old form elements around\n    this.formsForRecovery = {}\n    this.joinCallback(() => {\n      this.pendingJoinOps.forEach(([view, op]) => {\n        if(!view.isDestroyed()){ op() }\n      })\n      this.pendingJoinOps = []\n    })\n  }\n\n  update(diff, events){\n    if(this.isJoinPending() || (this.liveSocket.hasPendingLink() && this.root.isMain())){\n      return this.pendingDiffs.push({diff, events})\n    }\n\n    this.rendered.mergeDiff(diff)\n    let phxChildrenAdded = false\n\n    // When the diff only contains component diffs, then walk components\n    // and patch only the parent component containers found in the diff.\n    // Otherwise, patch entire LV container.\n    if(this.rendered.isComponentOnlyDiff(diff)){\n      this.liveSocket.time(\"component patch complete\", () => {\n        let parentCids = DOM.findExistingParentCIDs(this.el, this.rendered.componentCIDs(diff))\n        parentCids.forEach(parentCID => {\n          if(this.componentPatch(this.rendered.getComponent(diff, parentCID), parentCID)){ phxChildrenAdded = true }\n        })\n      })\n    } else if(!isEmpty(diff)){\n      this.liveSocket.time(\"full patch complete\", () => {\n        let [html, streams] = this.renderContainer(diff, \"update\")\n        let patch = new DOMPatch(this, this.el, this.id, html, streams, null)\n        phxChildrenAdded = this.performPatch(patch, true)\n      })\n    }\n\n    this.liveSocket.dispatchEvents(events)\n    if(phxChildrenAdded){ this.joinNewChildren() }\n  }\n\n  renderContainer(diff, kind){\n    return this.liveSocket.time(`toString diff (${kind})`, () => {\n      let tag = this.el.tagName\n      // Don't skip any component in the diff nor any marked as pruned\n      // (as they may have been added back)\n      let cids = diff ? this.rendered.componentCIDs(diff) : null\n      let [html, streams] = this.rendered.toString(cids)\n      return [`<${tag}>${html}</${tag}>`, streams]\n    })\n  }\n\n  componentPatch(diff, cid){\n    if(isEmpty(diff)) return false\n    let [html, streams] = this.rendered.componentToString(cid)\n    let patch = new DOMPatch(this, this.el, this.id, html, streams, cid)\n    let childrenAdded = this.performPatch(patch, true)\n    return childrenAdded\n  }\n\n  getHook(el){ return this.viewHooks[ViewHook.elementID(el)] }\n\n  addHook(el){\n    let hookElId = ViewHook.elementID(el)\n\n    if(hookElId && !this.viewHooks[hookElId]){\n      // hook created, but not attached (createHook for web component)\n      let hook = DOM.getCustomElHook(el) || logError(`no hook found for custom element: ${el.id}`)\n      this.viewHooks[hookElId] = hook\n      hook.__attachView(this)\n      return hook\n    }\n    else if(hookElId || !el.getAttribute){\n      // no hook found\n      return\n    } else {\n      // new hook found with phx-hook attribute\n      let hookName = el.getAttribute(`data-phx-${PHX_HOOK}`) || el.getAttribute(this.binding(PHX_HOOK))\n      if(hookName && !this.ownsElement(el)){ return }\n      let callbacks = this.liveSocket.getHookCallbacks(hookName)\n\n      if(callbacks){\n        if(!el.id){ logError(`no DOM ID for hook \"${hookName}\". Hooks require a unique ID on each element.`, el) }\n        let hook = new ViewHook(this, el, callbacks)\n        this.viewHooks[ViewHook.elementID(hook.el)] = hook\n        return hook\n      } else if(hookName !== null){\n        logError(`unknown hook found for \"${hookName}\"`, el)\n      }\n    }\n  }\n\n  destroyHook(hook){\n    // __destroyed clears the elementID from the hook, therefore\n    // we need to get it before calling __destroyed\n    const hookId = ViewHook.elementID(hook.el)\n    hook.__destroyed()\n    hook.__cleanup__()\n    delete this.viewHooks[hookId]\n  }\n\n  applyPendingUpdates(){\n    this.pendingDiffs.forEach(({diff, events}) => this.update(diff, events))\n    this.pendingDiffs = []\n    this.eachChild(child => child.applyPendingUpdates())\n  }\n\n  eachChild(callback){\n    let children = this.root.children[this.id] || {}\n    for(let id in children){ callback(this.getChildById(id)) }\n  }\n\n  onChannel(event, cb){\n    this.liveSocket.onChannel(this.channel, event, resp => {\n      if(this.isJoinPending()){\n        this.root.pendingJoinOps.push([this, () => cb(resp)])\n      } else {\n        this.liveSocket.requestDOMUpdate(() => cb(resp))\n      }\n    })\n  }\n\n  bindChannel(){\n    // The diff event should be handled by the regular update operations.\n    // All other operations are queued to be applied only after join.\n    this.liveSocket.onChannel(this.channel, \"diff\", (rawDiff) => {\n      this.liveSocket.requestDOMUpdate(() => {\n        this.applyDiff(\"update\", rawDiff, ({diff, events}) => this.update(diff, events))\n      })\n    })\n    this.onChannel(\"redirect\", ({to, flash}) => this.onRedirect({to, flash}))\n    this.onChannel(\"live_patch\", (redir) => this.onLivePatch(redir))\n    this.onChannel(\"live_redirect\", (redir) => this.onLiveRedirect(redir))\n    this.channel.onError(reason => this.onError(reason))\n    this.channel.onClose(reason => this.onClose(reason))\n  }\n\n  destroyAllChildren(){ this.eachChild(child => child.destroy()) }\n\n  onLiveRedirect(redir){\n    let {to, kind, flash} = redir\n    let url = this.expandURL(to)\n    let e = new CustomEvent(\"phx:server-navigate\", {detail: {to, kind, flash}})\n    this.liveSocket.historyRedirect(e, url, kind, flash)\n  }\n\n  onLivePatch(redir){\n    let {to, kind} = redir\n    this.href = this.expandURL(to)\n    this.liveSocket.historyPatch(to, kind)\n  }\n\n  expandURL(to){\n    return to.startsWith(\"/\") ? `${window.location.protocol}//${window.location.host}${to}` : to\n  }\n\n  onRedirect({to, flash, reloadToken}){ this.liveSocket.redirect(to, flash, reloadToken) }\n\n  isDestroyed(){ return this.destroyed }\n\n  joinDead(){ this.isDead = true }\n\n  joinPush(){\n    this.joinPush = this.joinPush || this.channel.join()\n    return this.joinPush\n  }\n\n  join(callback){\n    this.showLoader(this.liveSocket.loaderTimeout)\n    this.bindChannel()\n    if(this.isMain()){\n      this.stopCallback = this.liveSocket.withPageLoading({to: this.href, kind: \"initial\"})\n    }\n    this.joinCallback = (onDone) => {\n      onDone = onDone || function(){}\n      callback ? callback(this.joinCount, onDone) : onDone()\n    }\n\n    this.wrapPush(() => this.channel.join(), {\n      ok: (resp) => this.liveSocket.requestDOMUpdate(() => this.onJoin(resp)),\n      error: (error) => this.onJoinError(error),\n      timeout: () => this.onJoinError({reason: \"timeout\"})\n    })\n  }\n\n  onJoinError(resp){\n    if(resp.reason === \"reload\"){\n      this.log(\"error\", () => [`failed mount with ${resp.status}. Falling back to page reload`, resp])\n      this.onRedirect({to: this.root.href, reloadToken: resp.token})\n      return\n    } else if(resp.reason === \"unauthorized\" || resp.reason === \"stale\"){\n      this.log(\"error\", () => [\"unauthorized live_redirect. Falling back to page request\", resp])\n      this.onRedirect({to: this.root.href})\n      return\n    }\n    if(resp.redirect || resp.live_redirect){\n      this.joinPending = false\n      this.channel.leave()\n    }\n    if(resp.redirect){ return this.onRedirect(resp.redirect) }\n    if(resp.live_redirect){ return this.onLiveRedirect(resp.live_redirect) }\n    this.log(\"error\", () => [\"unable to join\", resp])\n    if(this.isMain()){\n      this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n      if(this.liveSocket.isConnected()){ this.liveSocket.reloadWithJitter(this) }\n    } else {\n      if(this.joinAttempts >= MAX_CHILD_JOIN_ATTEMPTS){\n        // put the root review into permanent error state, but don't destroy it as it can remain active\n        this.root.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n        this.log(\"error\", () => [`giving up trying to mount after ${MAX_CHILD_JOIN_ATTEMPTS} tries`, resp])\n        this.destroy()\n      }\n      let trueChildEl = DOM.byId(this.el.id)\n      if(trueChildEl){\n        DOM.mergeAttrs(trueChildEl, this.el)\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n        this.el = trueChildEl\n      } else {\n        this.destroy()\n      }\n    }\n  }\n\n  onClose(reason){\n    if(this.isDestroyed()){ return }\n    if(this.isMain() && this.liveSocket.hasPendingLink() && reason !== \"leave\"){\n      return this.liveSocket.reloadWithJitter(this)\n    }\n    this.destroyAllChildren()\n    this.liveSocket.dropActiveElement(this)\n    // document.activeElement can be null in Internet Explorer 11\n    if(document.activeElement){ document.activeElement.blur() }\n    if(this.liveSocket.isUnloaded()){\n      this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT)\n    }\n  }\n\n  onError(reason){\n    this.onClose(reason)\n    if(this.liveSocket.isConnected()){ this.log(\"error\", () => [\"view crashed\", reason]) }\n    if(!this.liveSocket.isUnloaded()){\n      if(this.liveSocket.isConnected()){\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n      } else {\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_CLIENT_ERROR_CLASS])\n      }\n    }\n  }\n\n  displayError(classes){\n    if(this.isMain()){ DOM.dispatchEvent(window, \"phx:page-loading-start\", {detail: {to: this.href, kind: \"error\"}}) }\n    this.showLoader()\n    this.setContainerClasses(...classes)\n    this.execAll(this.binding(\"disconnected\"))\n  }\n\n  wrapPush(callerPush, receives){\n    let latency = this.liveSocket.getLatencySim()\n    let withLatency = latency ?\n      (cb) => setTimeout(() => !this.isDestroyed() && cb(), latency) :\n      (cb) => !this.isDestroyed() && cb()\n\n    withLatency(() => {\n      callerPush()\n        .receive(\"ok\", resp => withLatency(() => receives.ok && receives.ok(resp)))\n        .receive(\"error\", reason => withLatency(() => receives.error && receives.error(reason)))\n        .receive(\"timeout\", () => withLatency(() => receives.timeout && receives.timeout()))\n    })\n  }\n\n  pushWithReply(refGenerator, event, payload){\n    if(!this.isConnected()){ return Promise.reject({error: \"noconnection\"}) }\n\n    let [ref, [el], opts] = refGenerator ? refGenerator() : [null, [], {}]\n    let oldJoinCount = this.joinCount\n    let onLoadingDone = function(){}\n    if(opts.page_loading){\n      onLoadingDone = this.liveSocket.withPageLoading({kind: \"element\", target: el})\n    }\n\n    if(typeof (payload.cid) !== \"number\"){ delete payload.cid }\n\n    return new Promise((resolve, reject) => {\n      this.wrapPush(() => this.channel.push(event, payload, PUSH_TIMEOUT), {\n        ok: (resp) => {\n          if(ref !== null){ this.lastAckRef = ref }\n          let finish = (hookReply) => {\n            if(resp.redirect){ this.onRedirect(resp.redirect) }\n            if(resp.live_patch){ this.onLivePatch(resp.live_patch) }\n            if(resp.live_redirect){ this.onLiveRedirect(resp.live_redirect) }\n            onLoadingDone()\n            resolve({resp: resp, reply: hookReply})\n          }\n          if(resp.diff){\n            this.liveSocket.requestDOMUpdate(() => {\n              this.applyDiff(\"update\", resp.diff, ({diff, reply, events}) => {\n                if(ref !== null){\n                  this.undoRefs(ref, payload.event)\n                }\n                this.update(diff, events)\n                finish(reply)\n              })\n            })\n          } else {\n            if(ref !== null){ this.undoRefs(ref, payload.event) }\n            finish(null)\n          }\n        },\n        error: (reason) => reject({error: reason}),\n        timeout: () => {\n          reject({timeout: true})\n          if(this.joinCount === oldJoinCount){\n            this.liveSocket.reloadWithJitter(this, () => {\n              this.log(\"timeout\", () => [\"received timeout while communicating with server. Falling back to hard refresh for recovery\"])\n            })\n          }\n        }\n      })\n    })\n  }\n\n  undoRefs(ref, phxEvent, onlyEls){\n    if(!this.isConnected()){ return } // exit if external form triggered\n    let selector = `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`\n\n    if(onlyEls){\n      onlyEls = new Set(onlyEls)\n      DOM.all(document, selector, parent => {\n        if(onlyEls && !onlyEls.has(parent)){ return }\n        // undo any child refs within parent first\n        DOM.all(parent, selector, child => this.undoElRef(child, ref, phxEvent))\n        this.undoElRef(parent, ref, phxEvent)\n      })\n    } else {\n      DOM.all(document, selector, el => this.undoElRef(el, ref, phxEvent))\n    }\n  }\n\n  undoElRef(el, ref, phxEvent){\n    let elRef = new ElementRef(el)\n\n    elRef.maybeUndo(ref, phxEvent, clonedTree => {\n      let hook = this.triggerBeforeUpdateHook(el, clonedTree)\n      DOMPatch.patchWithClonedTree(el, clonedTree, this.liveSocket)\n      DOM.all(el, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, child => this.undoElRef(child, ref, phxEvent))\n      this.execNewMounted(el)\n      if(hook){ hook.__updated() }\n    })\n  }\n\n  refSrc(){ return this.el.id }\n\n  putRef(elements, phxEvent, eventType, opts = {}){\n    let newRef = this.ref++\n    let disableWith = this.binding(PHX_DISABLE_WITH)\n    if(opts.loading){\n      let loadingEls = DOM.all(document, opts.loading).map(el => {\n        return {el, lock: true, loading: true}\n      })\n      elements = elements.concat(loadingEls)\n    }\n\n    for(let {el, lock, loading} of elements){\n      if(!lock && !loading){ throw new Error(\"putRef requires lock or loading\") }\n      el.setAttribute(PHX_REF_SRC, this.refSrc())\n      if(loading){ el.setAttribute(PHX_REF_LOADING, newRef) }\n      if(lock){ el.setAttribute(PHX_REF_LOCK, newRef) }\n\n      if(!loading || (opts.submitter && !(el === opts.submitter || el === opts.form))){ continue }\n\n      let lockCompletePromise = new Promise(resolve => {\n        el.addEventListener(`phx:undo-lock:${newRef}`, () => resolve(detail), {once: true})\n      })\n\n      let loadingCompletePromise = new Promise(resolve => {\n        el.addEventListener(`phx:undo-loading:${newRef}`, () => resolve(detail), {once: true})\n      })\n\n      el.classList.add(`phx-${eventType}-loading`)\n      let disableText = el.getAttribute(disableWith)\n      if(disableText !== null){\n        if(!el.getAttribute(PHX_DISABLE_WITH_RESTORE)){\n          el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText)\n        }\n        if(disableText !== \"\"){ el.innerText = disableText }\n        // PHX_DISABLED could have already been set in disableForm\n        el.setAttribute(PHX_DISABLED, el.getAttribute(PHX_DISABLED) || el.disabled)\n        el.setAttribute(\"disabled\", \"\")\n      }\n\n      let detail = {\n        event: phxEvent,\n        eventType: eventType,\n        ref: newRef,\n        isLoading: loading,\n        isLocked: lock,\n        lockElements: elements.filter(({lock}) => lock).map(({el}) => el),\n        loadingElements: elements.filter(({loading}) => loading).map(({el}) => el),\n        unlock: (els) => {\n          els = Array.isArray(els) ? els : [els]\n          this.undoRefs(newRef, phxEvent, els)\n        },\n        lockComplete: lockCompletePromise,\n        loadingComplete: loadingCompletePromise,\n        lock: (lockEl) => {\n          return new Promise(resolve => {\n            if(this.isAcked(newRef)){ return resolve(detail) }\n            lockEl.setAttribute(PHX_REF_LOCK, newRef)\n            lockEl.setAttribute(PHX_REF_SRC, this.refSrc())\n            lockEl.addEventListener(`phx:lock-stop:${newRef}`, () => resolve(detail), {once: true})\n          })\n        }\n      }\n      el.dispatchEvent(new CustomEvent(\"phx:push\", {\n        detail: detail,\n        bubbles: true,\n        cancelable: false\n      }))\n      if(phxEvent){\n        el.dispatchEvent(new CustomEvent(`phx:push:${phxEvent}`, {\n          detail: detail,\n          bubbles: true,\n          cancelable: false\n        }))\n      }\n    }\n    return [newRef, elements.map(({el}) => el), opts]\n  }\n\n  isAcked(ref){ return this.lastAckRef !== null && this.lastAckRef >= ref }\n\n  componentID(el){\n    let cid = el.getAttribute && el.getAttribute(PHX_COMPONENT)\n    return cid ? parseInt(cid) : null\n  }\n\n  targetComponentID(target, targetCtx, opts = {}){\n    if(isCid(targetCtx)){ return targetCtx }\n\n    let cidOrSelector = opts.target || target.getAttribute(this.binding(\"target\"))\n    if(isCid(cidOrSelector)){\n      return parseInt(cidOrSelector)\n    } else if(targetCtx && (cidOrSelector !== null || opts.target)){\n      return this.closestComponentID(targetCtx)\n    } else {\n      return null\n    }\n  }\n\n  closestComponentID(targetCtx){\n    if(isCid(targetCtx)){\n      return targetCtx\n    } else if(targetCtx){\n      return maybe(targetCtx.closest(`[${PHX_COMPONENT}]`), el => this.ownsElement(el) && this.componentID(el))\n    } else {\n      return null\n    }\n  }\n\n  pushHookEvent(el, targetCtx, event, payload, onReply){\n    if(!this.isConnected()){\n      this.log(\"hook\", () => [\"unable to push hook event. LiveView not connected\", event, payload])\n      return false\n    }\n    let [ref, els, opts] = this.putRef([{el, loading: true, lock: true}], event, \"hook\")\n    this.pushWithReply(() => [ref, els, opts], \"event\", {\n      type: \"hook\",\n      event: event,\n      value: payload,\n      cid: this.closestComponentID(targetCtx)\n    }).then(({resp: _resp, reply: hookReply}) => onReply(hookReply, ref))\n\n    return ref\n  }\n\n  extractMeta(el, meta, value){\n    let prefix = this.binding(\"value-\")\n    for(let i = 0; i < el.attributes.length; i++){\n      if(!meta){ meta = {} }\n      let name = el.attributes[i].name\n      if(name.startsWith(prefix)){ meta[name.replace(prefix, \"\")] = el.getAttribute(name) }\n    }\n    if(el.value !== undefined && !(el instanceof HTMLFormElement)){\n      if(!meta){ meta = {} }\n      meta.value = el.value\n\n      if(el.tagName === \"INPUT\" && CHECKABLE_INPUTS.indexOf(el.type) >= 0 && !el.checked){\n        delete meta.value\n      }\n    }\n    if(value){\n      if(!meta){ meta = {} }\n      for(let key in value){ meta[key] = value[key] }\n    }\n    return meta\n  }\n\n  pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}, onReply){\n    this.pushWithReply(() => this.putRef([{el, loading: true, lock: true}], phxEvent, type, opts), \"event\", {\n      type: type,\n      event: phxEvent,\n      value: this.extractMeta(el, meta, opts.value),\n      cid: this.targetComponentID(el, targetCtx, opts)\n    }).then(({reply}) => onReply && onReply(reply))\n  }\n\n  pushFileProgress(fileEl, entryRef, progress, onReply = function (){ }){\n    this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => {\n      view.pushWithReply(null, \"progress\", {\n        event: fileEl.getAttribute(view.binding(PHX_PROGRESS)),\n        ref: fileEl.getAttribute(PHX_UPLOAD_REF),\n        entry_ref: entryRef,\n        progress: progress,\n        cid: view.targetComponentID(fileEl.form, targetCtx)\n      }).then(({resp}) => onReply(resp))\n    })\n  }\n\n  pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback){\n    if(!inputEl.form){\n      throw new Error(\"form events require the input to be inside a form\")\n    }\n\n    let uploads\n    let cid = isCid(forceCid) ? forceCid : this.targetComponentID(inputEl.form, targetCtx, opts)\n    let refGenerator = () => {\n      return this.putRef([\n        {el: inputEl, loading: true, lock: true},\n        {el: inputEl.form, loading: true, lock: true}\n      ], phxEvent, \"change\", opts)\n    }\n    let formData\n    let meta  = this.extractMeta(inputEl.form)\n    if(inputEl instanceof HTMLButtonElement){ meta.submitter = inputEl }\n    if(inputEl.getAttribute(this.binding(\"change\"))){\n      formData = serializeForm(inputEl.form, {_target: opts._target, ...meta}, [inputEl.name])\n    } else {\n      formData = serializeForm(inputEl.form, {_target: opts._target, ...meta})\n    }\n    if(DOM.isUploadInput(inputEl) && inputEl.files && inputEl.files.length > 0){\n      LiveUploader.trackFiles(inputEl, Array.from(inputEl.files))\n    }\n    uploads = LiveUploader.serializeUploads(inputEl)\n\n    let event = {\n      type: \"form\",\n      event: phxEvent,\n      value: formData,\n      uploads: uploads,\n      cid: cid\n    }\n    this.pushWithReply(refGenerator, \"event\", event).then(({resp}) => {\n      if(DOM.isUploadInput(inputEl) && DOM.isAutoUpload(inputEl)){\n        if(LiveUploader.filesAwaitingPreflight(inputEl).length > 0){\n          let [ref, _els] = refGenerator()\n          this.undoRefs(ref, phxEvent, [inputEl.form])\n          this.uploadFiles(inputEl.form, phxEvent, targetCtx, ref, cid, (_uploads) => {\n            callback && callback(resp)\n            this.triggerAwaitingSubmit(inputEl.form, phxEvent)\n            this.undoRefs(ref, phxEvent)\n          })\n        }\n      } else {\n        callback && callback(resp)\n      }\n    })\n  }\n\n  triggerAwaitingSubmit(formEl, phxEvent){\n    let awaitingSubmit = this.getScheduledSubmit(formEl)\n    if(awaitingSubmit){\n      let [_el, _ref, _opts, callback] = awaitingSubmit\n      this.cancelSubmit(formEl, phxEvent)\n      callback()\n    }\n  }\n\n  getScheduledSubmit(formEl){\n    return this.formSubmits.find(([el, _ref, _opts, _callback]) => el.isSameNode(formEl))\n  }\n\n  scheduleSubmit(formEl, ref, opts, callback){\n    if(this.getScheduledSubmit(formEl)){ return true }\n    this.formSubmits.push([formEl, ref, opts, callback])\n  }\n\n  cancelSubmit(formEl, phxEvent){\n    this.formSubmits = this.formSubmits.filter(([el, ref, _opts, _callback]) => {\n      if(el.isSameNode(formEl)){\n        this.undoRefs(ref, phxEvent)\n        return false\n      } else {\n        return true\n      }\n    })\n  }\n\n  disableForm(formEl, phxEvent, opts = {}){\n    let filterIgnored = el => {\n      let userIgnored = closestPhxBinding(el, `${this.binding(PHX_UPDATE)}=ignore`, el.form)\n      return !(userIgnored || closestPhxBinding(el, \"data-phx-update=ignore\", el.form))\n    }\n    let filterDisables = el => {\n      return el.hasAttribute(this.binding(PHX_DISABLE_WITH))\n    }\n    let filterButton = el => el.tagName == \"BUTTON\"\n\n    let filterInput = el => [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(el.tagName)\n\n    let formElements = Array.from(formEl.elements)\n    let disables = formElements.filter(filterDisables)\n    let buttons = formElements.filter(filterButton).filter(filterIgnored)\n    let inputs = formElements.filter(filterInput).filter(filterIgnored)\n\n    buttons.forEach(button => {\n      button.setAttribute(PHX_DISABLED, button.disabled)\n      button.disabled = true\n    })\n    inputs.forEach(input => {\n      input.setAttribute(PHX_READONLY, input.readOnly)\n      input.readOnly = true\n      if(input.files){\n        input.setAttribute(PHX_DISABLED, input.disabled)\n        input.disabled = true\n      }\n    })\n    let formEls = disables.concat(buttons).concat(inputs).map(el => {\n      return {el, loading: true, lock: true}\n    })\n\n    // we reverse the order so form children are already locked by the time\n    // the form is locked\n    let els = [{el: formEl, loading: true, lock: false}].concat(formEls).reverse()\n    return this.putRef(els, phxEvent, \"submit\", opts)\n  }\n\n  pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply){\n    let refGenerator = () => this.disableForm(formEl, phxEvent, {\n      ...opts,\n      form: formEl,\n      submitter: submitter\n    })\n    let cid = this.targetComponentID(formEl, targetCtx)\n    if(LiveUploader.hasUploadsInProgress(formEl)){\n      let [ref, _els] = refGenerator()\n      let push = () => this.pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply)\n      return this.scheduleSubmit(formEl, ref, opts, push)\n    } else if(LiveUploader.inputsAwaitingPreflight(formEl).length > 0){\n      let [ref, els] = refGenerator()\n      let proxyRefGen = () => [ref, els, opts]\n      this.uploadFiles(formEl, phxEvent, targetCtx, ref, cid, (_uploads) => {\n        // if we still having pending preflights it means we have invalid entries\n        // and the phx-submit cannot be completed\n        if(LiveUploader.inputsAwaitingPreflight(formEl).length > 0){\n          return this.undoRefs(ref, phxEvent)\n        }\n        let meta = this.extractMeta(formEl)\n        let formData = serializeForm(formEl, {submitter, ...meta})\n        this.pushWithReply(proxyRefGen, \"event\", {\n          type: \"form\",\n          event: phxEvent,\n          value: formData,\n          cid: cid\n        }).then(({resp}) => onReply(resp))\n      })\n    } else if(!(formEl.hasAttribute(PHX_REF_SRC) && formEl.classList.contains(\"phx-submit-loading\"))){\n      let meta = this.extractMeta(formEl)\n      let formData = serializeForm(formEl, {submitter, ...meta})\n      this.pushWithReply(refGenerator, \"event\", {\n        type: \"form\",\n        event: phxEvent,\n        value: formData,\n        cid: cid\n      }).then(({resp}) => onReply(resp))\n    }\n  }\n\n  uploadFiles(formEl, phxEvent, targetCtx, ref, cid, onComplete){\n    let joinCountAtUpload = this.joinCount\n    let inputEls = LiveUploader.activeFileInputs(formEl)\n    let numFileInputsInProgress = inputEls.length\n\n    // get each file input\n    inputEls.forEach(inputEl => {\n      let uploader = new LiveUploader(inputEl, this, () => {\n        numFileInputsInProgress--\n        if(numFileInputsInProgress === 0){ onComplete() }\n      })\n\n      let entries = uploader.entries().map(entry => entry.toPreflightPayload())\n\n      if(entries.length === 0){\n        numFileInputsInProgress--\n        return\n      }\n\n      let payload = {\n        ref: inputEl.getAttribute(PHX_UPLOAD_REF),\n        entries: entries,\n        cid: this.targetComponentID(inputEl.form, targetCtx)\n      }\n\n      this.log(\"upload\", () => [\"sending preflight request\", payload])\n\n      this.pushWithReply(null, \"allow_upload\", payload).then(({resp}) => {\n        this.log(\"upload\", () => [\"got preflight response\", resp])\n        // the preflight will reject entries beyond the max entries\n        // so we error and cancel entries on the client that are missing from the response\n        uploader.entries().forEach(entry => {\n          if(resp.entries && !resp.entries[entry.ref]){\n            this.handleFailedEntryPreflight(entry.ref, \"failed preflight\", uploader)\n          }\n        })\n        // for auto uploads, we may have an empty entries response from the server\n        // for form submits that contain invalid entries\n        if(resp.error || Object.keys(resp.entries).length === 0){\n          this.undoRefs(ref, phxEvent)\n          let errors = resp.error || []\n          errors.map(([entry_ref, reason]) => {\n            this.handleFailedEntryPreflight(entry_ref, reason, uploader)\n          })\n        } else {\n          let onError = (callback) => {\n            this.channel.onError(() => {\n              if(this.joinCount === joinCountAtUpload){ callback() }\n            })\n          }\n          uploader.initAdapterUpload(resp, onError, this.liveSocket)\n        }\n      })\n    })\n  }\n\n  handleFailedEntryPreflight(uploadRef, reason, uploader){\n    if(uploader.isAutoUpload()){\n      // uploadRef may be top level upload config ref or entry ref\n      let entry = uploader.entries().find(entry => entry.ref === uploadRef.toString())\n      if(entry){ entry.cancel() }\n    } else {\n      uploader.entries().map(entry => entry.cancel())\n    }\n    this.log(\"upload\", () => [`error for entry ${uploadRef}`, reason])\n  }\n\n  dispatchUploads(targetCtx, name, filesOrBlobs){\n    let targetElement = this.targetCtxElement(targetCtx) || this.el\n    let inputs = DOM.findUploadInputs(targetElement).filter(el => el.name === name)\n    if(inputs.length === 0){ logError(`no live file inputs found matching the name \"${name}\"`) }\n    else if(inputs.length > 1){ logError(`duplicate live file inputs found matching the name \"${name}\"`) }\n    else { DOM.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, {detail: {files: filesOrBlobs}}) }\n  }\n\n  targetCtxElement(targetCtx){\n    if(isCid(targetCtx)){\n      let [target] = DOM.findComponentNodeList(this.el, targetCtx)\n      return target\n    } else if(targetCtx){\n      return targetCtx\n    } else {\n      return null\n    }\n  }\n\n  pushFormRecovery(oldForm, newForm, templateDom, callback){\n    // we are only recovering forms inside the current view, therefore it is safe to\n    // skip withinOwners here and always use this when referring to the view\n    const phxChange = this.binding(\"change\")\n    const phxTarget = newForm.getAttribute(this.binding(\"target\")) || newForm\n    const phxEvent = newForm.getAttribute(this.binding(PHX_AUTO_RECOVER)) || newForm.getAttribute(this.binding(\"change\"))\n    const inputs = Array.from(oldForm.elements).filter(el => DOM.isFormInput(el) && el.name && !el.hasAttribute(phxChange))\n    if(inputs.length === 0){ return }\n\n    // we must clear tracked uploads before recovery as they no longer have valid refs\n    inputs.forEach(input => input.hasAttribute(PHX_UPLOAD_REF) && LiveUploader.clearFiles(input))\n    // pushInput assumes that there is a source element that initiated the change;\n    // because this is not the case when we recover forms, we provide the first input we find\n    let input = inputs.find(el => el.type !== \"hidden\") || inputs[0]\n\n    // in the case that there are multiple targets, we count the number of pending recovery events\n    // and only call the callback once all events have been processed\n    let pending = 0\n    // withinTargets(phxTarget, callback, dom, viewEl)\n    this.withinTargets(phxTarget, (targetView, targetCtx) => {\n      const cid = this.targetComponentID(newForm, targetCtx)\n      pending++\n      let e = new CustomEvent(\"phx:form-recovery\", {detail: {sourceElement: oldForm}})\n      JS.exec(e, \"change\", phxEvent, this, input, [\"push\", {\n        _target: input.name,\n        targetView,\n        targetCtx,\n        newCid: cid,\n        callback: () => {\n          pending--\n          if(pending === 0){ callback() }\n        }\n      }])\n    }, templateDom, templateDom)\n  }\n\n  pushLinkPatch(e, href, targetEl, callback){\n    let linkRef = this.liveSocket.setPendingLink(href)\n    // only add loading states if event is trusted (it was triggered by user, such as click) and\n    // it's not a forward/back navigation from popstate\n    let loading = e.isTrusted && e.type !== \"popstate\"\n    let refGen = targetEl ? () => this.putRef([{el: targetEl, loading: loading, lock: true}], null, \"click\") : null\n    let fallback = () => this.liveSocket.redirect(window.location.href)\n    let url = href.startsWith(\"/\") ? `${location.protocol}//${location.host}${href}` : href\n\n    this.pushWithReply(refGen, \"live_patch\", {url}).then(\n      ({resp}) => {\n        this.liveSocket.requestDOMUpdate(() => {\n          if(resp.link_redirect){\n            this.liveSocket.replaceMain(href, null, callback, linkRef)\n          } else {\n            if(this.liveSocket.commitPendingLink(linkRef)){\n              this.href = href\n            }\n            this.applyPendingUpdates()\n            callback && callback(linkRef)\n          }\n        })\n      },\n      ({error: _error, timeout: _timeout}) => fallback()\n    )\n  }\n\n  getFormsForRecovery(){\n    if(this.joinCount === 0){ return {} }\n\n    let phxChange = this.binding(\"change\")\n\n    return DOM.all(this.el, `form[${phxChange}]`)\n      .filter(form => form.id)\n      .filter(form => form.elements.length > 0)\n      .filter(form => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== \"ignore\")\n      .map(form => form.cloneNode(true))\n      .reduce((acc, form) => {\n        acc[form.id] = form\n        return acc\n      }, {})\n  }\n\n  maybePushComponentsDestroyed(destroyedCIDs){\n    let willDestroyCIDs = destroyedCIDs.filter(cid => {\n      return DOM.findComponentNodeList(this.el, cid).length === 0\n    })\n\n    if(willDestroyCIDs.length > 0){\n      // we must reset the render change tracking for cids that\n      // could be added back from the server so we don't skip them\n      willDestroyCIDs.forEach(cid => this.rendered.resetRender(cid))\n\n      this.pushWithReply(null, \"cids_will_destroy\", {cids: willDestroyCIDs}).then(() => {\n        // we must wait for pending transitions to complete before determining\n        // if the cids were added back to the DOM in the meantime (#3139)\n        this.liveSocket.requestDOMUpdate(() => {\n          // See if any of the cids we wanted to destroy were added back,\n          // if they were added back, we don't actually destroy them.\n          let completelyDestroyCIDs = willDestroyCIDs.filter(cid => {\n            return DOM.findComponentNodeList(this.el, cid).length === 0\n          })\n\n          if(completelyDestroyCIDs.length > 0){\n            this.pushWithReply(null, \"cids_destroyed\", {cids: completelyDestroyCIDs}).then(({resp}) => {\n              this.rendered.pruneCIDs(resp.cids)\n            })\n          }\n        })\n      })\n    }\n  }\n\n  ownsElement(el){\n    let parentViewEl = el.closest(PHX_VIEW_SELECTOR)\n    return el.getAttribute(PHX_PARENT_ID) === this.id ||\n      (parentViewEl && parentViewEl.id === this.id) ||\n      (!parentViewEl && this.isDead)\n  }\n\n  submitForm(form, targetCtx, phxEvent, submitter, opts = {}){\n    DOM.putPrivate(form, PHX_HAS_SUBMITTED, true)\n    const inputs = Array.from(form.elements)\n    inputs.forEach(input => DOM.putPrivate(input, PHX_HAS_SUBMITTED, true))\n    this.liveSocket.blurActiveElement(this)\n    this.pushFormSubmit(form, targetCtx, phxEvent, submitter, opts, () => {\n      this.liveSocket.restorePreviouslyActiveFocus()\n    })\n  }\n\n  binding(kind){ return this.liveSocket.binding(kind) }\n}\n", "/** Initializes the LiveSocket\n *\n *\n * @param {string} endPoint - The string WebSocket endpoint, ie, `\"wss://example.com/live\"`,\n *                                               `\"/live\"` (inherited host & protocol)\n * @param {Phoenix.Socket} socket - the required Phoenix Socket class imported from \"phoenix\". For example:\n *\n *     import {Socket} from \"phoenix\"\n *     import {LiveSocket} from \"phoenix_live_view\"\n *     let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n *\n * @param {Object} [opts] - Optional configuration. Outside of keys listed below, all\n * configuration is passed directly to the Phoenix Socket constructor.\n * @param {Object} [opts.defaults] - The optional defaults to use for various bindings,\n * such as `phx-debounce`. Supports the following keys:\n *\n *   - debounce - the millisecond phx-debounce time. Defaults 300\n *   - throttle - the millisecond phx-throttle time. Defaults 300\n *\n * @param {Function} [opts.params] - The optional function for passing connect params.\n * The function receives the element associated with a given LiveView. For example:\n *\n *     (el) => {view: el.getAttribute(\"data-my-view-name\", token: window.myToken}\n *\n * @param {string} [opts.bindingPrefix] - The optional prefix to use for all phx DOM annotations.\n * Defaults to \"phx-\".\n * @param {Object} [opts.hooks] - The optional object for referencing LiveView hook callbacks.\n * @param {Object} [opts.uploaders] - The optional object for referencing LiveView uploader callbacks.\n * @param {integer} [opts.loaderTimeout] - The optional delay in milliseconds to wait before apply\n * loading states.\n * @param {integer} [opts.maxReloads] - The maximum reloads before entering failsafe mode.\n * @param {integer} [opts.reloadJitterMin] - The minimum time between normal reload attempts.\n * @param {integer} [opts.reloadJitterMax] - The maximum time between normal reload attempts.\n * @param {integer} [opts.failsafeJitter] - The time between reload attempts in failsafe mode.\n * @param {Function} [opts.viewLogger] - The optional function to log debug information. For example:\n *\n *     (view, kind, msg, obj) => console.log(`${view.id} ${kind}: ${msg} - `, obj)\n *\n * @param {Object} [opts.metadata] - The optional object mapping event names to functions for\n * populating event metadata. For example:\n *\n *     metadata: {\n *       click: (e, el) => {\n *         return {\n *           ctrlKey: e.ctrlKey,\n *           metaKey: e.metaKey,\n *           detail: e.detail || 1,\n *         }\n *       },\n *       keydown: (e, el) => {\n *         return {\n *           key: e.key,\n *           ctrlKey: e.ctrlKey,\n *           metaKey: e.metaKey,\n *           shiftKey: e.shiftKey\n *         }\n *       }\n *     }\n * @param {Object} [opts.sessionStorage] - An optional Storage compatible object\n * Useful when LiveView won't have access to `sessionStorage`.  For example, This could\n * happen if a site loads a cross-domain LiveView in an iframe.  Example usage:\n *\n *     class InMemoryStorage {\n *       constructor() { this.storage = {} }\n *       getItem(keyName) { return this.storage[keyName] || null }\n *       removeItem(keyName) { delete this.storage[keyName] }\n *       setItem(keyName, keyValue) { this.storage[keyName] = keyValue }\n *     }\n *\n * @param {Object} [opts.localStorage] - An optional Storage compatible object\n * Useful for when LiveView won't have access to `localStorage`.\n * See `opts.sessionStorage` for examples.\n*/\n\nimport {\n  BINDING_PREFIX,\n  CONSECUTIVE_RELOADS,\n  DEFAULTS,\n  FAILSAFE_JITTER,\n  LOADER_TIMEOUT,\n  MAX_RELOADS,\n  PHX_DEBOUNCE,\n  PHX_DROP_TARGET,\n  PHX_HAS_FOCUSED,\n  PHX_KEY,\n  PHX_LINK_STATE,\n  PHX_LIVE_LINK,\n  PHX_LV_DEBUG,\n  PHX_LV_LATENCY_SIM,\n  PHX_LV_PROFILE,\n  PHX_LV_HISTORY_POSITION,\n  PHX_MAIN,\n  PHX_PARENT_ID,\n  PHX_VIEW_SELECTOR,\n  PHX_ROOT_ID,\n  PHX_THROTTLE,\n  PHX_TRACK_UPLOADS,\n  PHX_SESSION,\n  RELOAD_JITTER_MIN,\n  RELOAD_JITTER_MAX,\n  PHX_REF_SRC,\n  PHX_RELOAD_STATUS\n} from \"./constants\"\n\nimport {\n  clone,\n  closestPhxBinding,\n  closure,\n  debug,\n  maybe\n} from \"./utils\"\n\nimport Browser from \"./browser\"\nimport DOM from \"./dom\"\nimport Hooks from \"./hooks\"\nimport LiveUploader from \"./live_uploader\"\nimport View from \"./view\"\nimport JS from \"./js\"\n\nexport let isUsedInput = (el) => DOM.isUsedInput(el)\n\nexport default class LiveSocket {\n  constructor(url, phxSocket, opts = {}){\n    this.unloaded = false\n    if(!phxSocket || phxSocket.constructor.name === \"Object\"){\n      throw new Error(`\n      a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:\n\n          import {Socket} from \"phoenix\"\n          import {LiveSocket} from \"phoenix_live_view\"\n          let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n      `)\n    }\n    this.socket = new phxSocket(url, opts)\n    this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX\n    this.opts = opts\n    this.params = closure(opts.params || {})\n    this.viewLogger = opts.viewLogger\n    this.metadataCallbacks = opts.metadata || {}\n    this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {})\n    this.activeElement = null\n    this.prevActive = null\n    this.silenced = false\n    this.main = null\n    this.outgoingMainEl = null\n    this.clickStartedAtTarget = null\n    this.linkRef = 1\n    this.roots = {}\n    this.href = window.location.href\n    this.pendingLink = null\n    this.currentLocation = clone(window.location)\n    this.hooks = opts.hooks || {}\n    this.uploaders = opts.uploaders || {}\n    this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT\n    this.reloadWithJitterTimer = null\n    this.maxReloads = opts.maxReloads || MAX_RELOADS\n    this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN\n    this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX\n    this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER\n    this.localStorage = opts.localStorage || window.localStorage\n    this.sessionStorage = opts.sessionStorage || window.sessionStorage\n    this.boundTopLevelEvents = false\n    this.boundEventNames = new Set()\n    this.serverCloseRef = null\n    this.domCallbacks = Object.assign({\n      jsQuerySelectorAll: null,\n      onPatchStart: closure(),\n      onPatchEnd: closure(),\n      onNodeAdded: closure(),\n      onBeforeElUpdated: closure()},\n    opts.dom || {})\n    this.transitions = new TransitionSet()\n    this.currentHistoryPosition = parseInt(this.sessionStorage.getItem(PHX_LV_HISTORY_POSITION)) || 0\n    window.addEventListener(\"pagehide\", _e => {\n      this.unloaded = true\n    })\n    this.socket.onOpen(() => {\n      if(this.isUnloaded()){\n        // reload page if being restored from back/forward cache and browser does not emit \"pageshow\"\n        window.location.reload()\n      }\n    })\n  }\n\n  // public\n\n  version(){ return LV_VSN }\n\n  isProfileEnabled(){ return this.sessionStorage.getItem(PHX_LV_PROFILE) === \"true\" }\n\n  isDebugEnabled(){ return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"true\" }\n\n  isDebugDisabled(){ return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"false\" }\n\n  enableDebug(){ this.sessionStorage.setItem(PHX_LV_DEBUG, \"true\") }\n\n  enableProfiling(){ this.sessionStorage.setItem(PHX_LV_PROFILE, \"true\") }\n\n  disableDebug(){ this.sessionStorage.setItem(PHX_LV_DEBUG, \"false\") }\n\n  disableProfiling(){ this.sessionStorage.removeItem(PHX_LV_PROFILE) }\n\n  enableLatencySim(upperBoundMs){\n    this.enableDebug()\n    console.log(\"latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable\")\n    this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs)\n  }\n\n  disableLatencySim(){ this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM) }\n\n  getLatencySim(){\n    let str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM)\n    return str ? parseInt(str) : null\n  }\n\n  getSocket(){ return this.socket }\n\n  connect(){\n    // enable debug by default if on localhost and not explicitly disabled\n    if(window.location.hostname === \"localhost\" && !this.isDebugDisabled()){ this.enableDebug() }\n    let doConnect = () => {\n      this.resetReloadStatus()\n      if(this.joinRootViews()){\n        this.bindTopLevelEvents()\n        this.socket.connect()\n      } else if(this.main){\n        this.socket.connect()\n      } else {\n        this.bindTopLevelEvents({dead: true})\n      }\n      this.joinDeadView()\n    }\n    if([\"complete\", \"loaded\", \"interactive\"].indexOf(document.readyState) >= 0){\n      doConnect()\n    } else {\n      document.addEventListener(\"DOMContentLoaded\", () => doConnect())\n    }\n  }\n\n  disconnect(callback){\n    clearTimeout(this.reloadWithJitterTimer)\n    // remove the socket close listener to avoid trying to handle\n    // a server close event when it is actually caused by us disconnecting\n    if(this.serverCloseRef){\n      this.socket.off(this.serverCloseRef)\n      this.serverCloseRef = null\n    }\n    this.socket.disconnect(callback)\n  }\n\n  replaceTransport(transport){\n    clearTimeout(this.reloadWithJitterTimer)\n    this.socket.replaceTransport(transport)\n    this.connect()\n  }\n\n  execJS(el, encodedJS, eventType = null){\n    let e = new CustomEvent(\"phx:exec\", {detail: {sourceElement: el}})\n    this.owner(el, view => JS.exec(e, eventType, encodedJS, view, el))\n  }\n\n  // private\n\n  execJSHookPush(el, phxEvent, data, callback){\n    this.withinOwners(el, view => {\n      let e = new CustomEvent(\"phx:exec\", {detail: {sourceElement: el}})\n      JS.exec(e, \"hook\", phxEvent, view, el, [\"push\", {data, callback}])\n    })\n  }\n\n  unload(){\n    if(this.unloaded){ return }\n    if(this.main && this.isConnected()){ this.log(this.main, \"socket\", () => [\"disconnect for page nav\"]) }\n    this.unloaded = true\n    this.destroyAllViews()\n    this.disconnect()\n  }\n\n  triggerDOM(kind, args){ this.domCallbacks[kind](...args) }\n\n  time(name, func){\n    if(!this.isProfileEnabled() || !console.time){ return func() }\n    console.time(name)\n    let result = func()\n    console.timeEnd(name)\n    return result\n  }\n\n  log(view, kind, msgCallback){\n    if(this.viewLogger){\n      let [msg, obj] = msgCallback()\n      this.viewLogger(view, kind, msg, obj)\n    } else if(this.isDebugEnabled()){\n      let [msg, obj] = msgCallback()\n      debug(view, kind, msg, obj)\n    }\n  }\n\n  requestDOMUpdate(callback){\n    this.transitions.after(callback)\n  }\n\n  transition(time, onStart, onDone = function(){}){\n    this.transitions.addTransition(time, onStart, onDone)\n  }\n\n  onChannel(channel, event, cb){\n    channel.on(event, data => {\n      let latency = this.getLatencySim()\n      if(!latency){\n        cb(data)\n      } else {\n        setTimeout(() => cb(data), latency)\n      }\n    })\n  }\n\n  reloadWithJitter(view, log){\n    clearTimeout(this.reloadWithJitterTimer)\n    this.disconnect()\n    let minMs = this.reloadJitterMin\n    let maxMs = this.reloadJitterMax\n    let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs\n    let tries = Browser.updateLocal(this.localStorage, window.location.pathname, CONSECUTIVE_RELOADS, 0, count => count + 1)\n    if(tries >= this.maxReloads){\n      afterMs = this.failsafeJitter\n    }\n    this.reloadWithJitterTimer = setTimeout(() => {\n      // if view has recovered, such as transport replaced, then cancel\n      if(view.isDestroyed() || view.isConnected()){ return }\n      view.destroy()\n      log ? log() : this.log(view, \"join\", () => [`encountered ${tries} consecutive reloads`])\n      if(tries >= this.maxReloads){\n        this.log(view, \"join\", () => [`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`])\n      }\n      if(this.hasPendingLink()){\n        window.location = this.pendingLink\n      } else {\n        window.location.reload()\n      }\n    }, afterMs)\n  }\n\n  getHookCallbacks(name){\n    return name && name.startsWith(\"Phoenix.\") ? Hooks[name.split(\".\")[1]] : this.hooks[name]\n  }\n\n  isUnloaded(){ return this.unloaded }\n\n  isConnected(){ return this.socket.isConnected() }\n\n  getBindingPrefix(){ return this.bindingPrefix }\n\n  binding(kind){ return `${this.getBindingPrefix()}${kind}` }\n\n  channel(topic, params){ return this.socket.channel(topic, params) }\n\n  joinDeadView(){\n    let body = document.body\n    if(body && !this.isPhxView(body) && !this.isPhxView(document.firstElementChild)){\n      let view = this.newRootView(body)\n      view.setHref(this.getHref())\n      view.joinDead()\n      if(!this.main){ this.main = view }\n      window.requestAnimationFrame(() => {\n        view.execNewMounted()\n        // restore scroll position when navigating from an external / non-live page\n        this.maybeScroll(history.state?.scroll)\n      })\n    }\n  }\n\n  joinRootViews(){\n    let rootsFound = false\n    DOM.all(document, `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, rootEl => {\n      if(!this.getRootById(rootEl.id)){\n        let view = this.newRootView(rootEl)\n        // stickies cannot be mounted at the router and therefore should not\n        // get a href set on them\n        if(!DOM.isPhxSticky(rootEl)){ view.setHref(this.getHref()) }\n        view.join()\n        if(rootEl.hasAttribute(PHX_MAIN)){ this.main = view }\n      }\n      rootsFound = true\n    })\n    return rootsFound\n  }\n\n  redirect(to, flash, reloadToken){\n    if(reloadToken){ Browser.setCookie(PHX_RELOAD_STATUS, reloadToken, 60) }\n    this.unload()\n    Browser.redirect(to, flash)\n  }\n\n  replaceMain(href, flash, callback = null, linkRef = this.setPendingLink(href)){\n    let liveReferer = this.currentLocation.href\n    this.outgoingMainEl = this.outgoingMainEl || this.main.el\n    let removeEls = DOM.all(this.outgoingMainEl, `[${this.binding(\"remove\")}]`)\n    let newMainEl = DOM.cloneNode(this.outgoingMainEl, \"\")\n    this.main.showLoader(this.loaderTimeout)\n    this.main.destroy()\n\n    this.main = this.newRootView(newMainEl, flash, liveReferer)\n    this.main.setRedirect(href)\n    this.transitionRemoves(removeEls, true)\n    this.main.join((joinCount, onDone) => {\n      if(joinCount === 1 && this.commitPendingLink(linkRef)){\n        this.requestDOMUpdate(() => {\n          // remove phx-remove els right before we replace the main element\n          removeEls.forEach(el => el.remove())\n          DOM.findPhxSticky(document).forEach(el => newMainEl.appendChild(el))\n          this.outgoingMainEl.replaceWith(newMainEl)\n          this.outgoingMainEl = null\n          callback && callback(linkRef)\n          onDone()\n        })\n      }\n    })\n  }\n\n  transitionRemoves(elements, skipSticky, callback){\n    let removeAttr = this.binding(\"remove\")\n    if(skipSticky){\n      const stickies = DOM.findPhxSticky(document) || []\n      elements = elements.filter(el => !DOM.isChildOfAny(el, stickies))\n    }\n    let silenceEvents = (e) => {\n      e.preventDefault()\n      e.stopImmediatePropagation()\n    }\n    elements.forEach(el => {\n      // prevent all listeners we care about from bubbling to window\n      // since we are removing the element\n      for(let event of this.boundEventNames){\n        el.addEventListener(event, silenceEvents, true)\n      }\n      this.execJS(el, el.getAttribute(removeAttr), \"remove\")\n    })\n    // remove the silenced listeners when transitions are done incase the element is re-used\n    // and call caller's callback as soon as we are done with transitions\n    this.requestDOMUpdate(() => {\n      elements.forEach(el => {\n        for(let event of this.boundEventNames){\n          el.removeEventListener(event, silenceEvents, true)\n        }\n      })\n      callback && callback()\n    })\n  }\n\n  isPhxView(el){ return el.getAttribute && el.getAttribute(PHX_SESSION) !== null }\n\n  newRootView(el, flash, liveReferer){\n    let view = new View(el, this, null, flash, liveReferer)\n    this.roots[view.id] = view\n    return view\n  }\n\n  owner(childEl, callback){\n    let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), el => this.getViewByEl(el)) || this.main\n    return view && callback ? callback(view) : view\n  }\n\n  withinOwners(childEl, callback){\n    this.owner(childEl, view => callback(view, childEl))\n  }\n\n  getViewByEl(el){\n    let rootId = el.getAttribute(PHX_ROOT_ID)\n    return maybe(this.getRootById(rootId), root => root.getDescendentByEl(el))\n  }\n\n  getRootById(id){ return this.roots[id] }\n\n  destroyAllViews(){\n    for(let id in this.roots){\n      this.roots[id].destroy()\n      delete this.roots[id]\n    }\n    this.main = null\n  }\n\n  destroyViewByEl(el){\n    let root = this.getRootById(el.getAttribute(PHX_ROOT_ID))\n    if(root && root.id === el.id){\n      root.destroy()\n      delete this.roots[root.id]\n    } else if(root){\n      root.destroyDescendent(el.id)\n    }\n  }\n\n  getActiveElement(){\n    return document.activeElement\n  }\n\n  dropActiveElement(view){\n    if(this.prevActive && view.ownsElement(this.prevActive)){\n      this.prevActive = null\n    }\n  }\n\n  restorePreviouslyActiveFocus(){\n    if(this.prevActive && this.prevActive !== document.body){\n      this.prevActive.focus()\n    }\n  }\n\n  blurActiveElement(){\n    this.prevActive = this.getActiveElement()\n    if(this.prevActive !== document.body){ this.prevActive.blur() }\n  }\n\n  bindTopLevelEvents({dead} = {}){\n    if(this.boundTopLevelEvents){ return }\n\n    this.boundTopLevelEvents = true\n    // enter failsafe reload if server has gone away intentionally, such as \"disconnect\" broadcast\n    this.serverCloseRef = this.socket.onClose(event => {\n      // failsafe reload if normal closure and we still have a main LV\n      if(event && event.code === 1000 && this.main){ return this.reloadWithJitter(this.main) }\n    })\n    document.body.addEventListener(\"click\", function (){ }) // ensure all click events bubble for mobile Safari\n    window.addEventListener(\"pageshow\", e => {\n      if(e.persisted){ // reload page if being restored from back/forward cache\n        this.getSocket().disconnect()\n        this.withPageLoading({to: window.location.href, kind: \"redirect\"})\n        window.location.reload()\n      }\n    }, true)\n    if(!dead){ this.bindNav() }\n    this.bindClicks()\n    if(!dead){ this.bindForms() }\n    this.bind({keyup: \"keyup\", keydown: \"keydown\"}, (e, type, view, targetEl, phxEvent, _phxTarget) => {\n      let matchKey = targetEl.getAttribute(this.binding(PHX_KEY))\n      let pressedKey = e.key && e.key.toLowerCase() // chrome clicked autocompletes send a keydown without key\n      if(matchKey && matchKey.toLowerCase() !== pressedKey){ return }\n\n      let data = {key: e.key, ...this.eventMeta(type, e, targetEl)}\n      JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n    })\n    this.bind({blur: \"focusout\", focus: \"focusin\"}, (e, type, view, targetEl, phxEvent, phxTarget) => {\n      if(!phxTarget){\n        let data = {key: e.key, ...this.eventMeta(type, e, targetEl)}\n        JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n      }\n    })\n    this.bind({blur: \"blur\", focus: \"focus\"}, (e, type, view, targetEl, phxEvent, phxTarget) => {\n      // blur and focus are triggered on document and window. Discard one to avoid dups\n      if(phxTarget === \"window\"){\n        let data = this.eventMeta(type, e, targetEl)\n        JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n      }\n    })\n    this.on(\"dragover\", e => e.preventDefault())\n    this.on(\"drop\", e => {\n      e.preventDefault()\n      let dropTargetId = maybe(closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), trueTarget => {\n        return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET))\n      })\n      let dropTarget = dropTargetId && document.getElementById(dropTargetId)\n      let files = Array.from(e.dataTransfer.files || [])\n      if(!dropTarget || dropTarget.disabled || files.length === 0 || !(dropTarget.files instanceof FileList)){ return }\n\n      LiveUploader.trackFiles(dropTarget, files, e.dataTransfer)\n      dropTarget.dispatchEvent(new Event(\"input\", {bubbles: true}))\n    })\n    this.on(PHX_TRACK_UPLOADS, e => {\n      let uploadTarget = e.target\n      if(!DOM.isUploadInput(uploadTarget)){ return }\n      let files = Array.from(e.detail.files || []).filter(f => f instanceof File || f instanceof Blob)\n      LiveUploader.trackFiles(uploadTarget, files)\n      uploadTarget.dispatchEvent(new Event(\"input\", {bubbles: true}))\n    })\n  }\n\n  eventMeta(eventName, e, targetEl){\n    let callback = this.metadataCallbacks[eventName]\n    return callback ? callback(e, targetEl) : {}\n  }\n\n  setPendingLink(href){\n    this.linkRef++\n    this.pendingLink = href\n    this.resetReloadStatus()\n    return this.linkRef\n  }\n\n  // anytime we are navigating or connecting, drop reload cookie in case\n  // we issue the cookie but the next request was interrupted and the server never dropped it\n  resetReloadStatus(){ Browser.deleteCookie(PHX_RELOAD_STATUS) }\n\n  commitPendingLink(linkRef){\n    if(this.linkRef !== linkRef){\n      return false\n    } else {\n      this.href = this.pendingLink\n      this.pendingLink = null\n      return true\n    }\n  }\n\n  getHref(){ return this.href }\n\n  hasPendingLink(){ return !!this.pendingLink }\n\n  bind(events, callback){\n    for(let event in events){\n      let browserEventName = events[event]\n\n      this.on(browserEventName, e => {\n        let binding = this.binding(event)\n        let windowBinding = this.binding(`window-${event}`)\n        let targetPhxEvent = e.target.getAttribute && e.target.getAttribute(binding)\n        if(targetPhxEvent){\n          this.debounce(e.target, e, browserEventName, () => {\n            this.withinOwners(e.target, view => {\n              callback(e, event, view, e.target, targetPhxEvent, null)\n            })\n          })\n        } else {\n          DOM.all(document, `[${windowBinding}]`, el => {\n            let phxEvent = el.getAttribute(windowBinding)\n            this.debounce(el, e, browserEventName, () => {\n              this.withinOwners(el, view => {\n                callback(e, event, view, el, phxEvent, \"window\")\n              })\n            })\n          })\n        }\n      })\n    }\n  }\n\n  bindClicks(){\n    this.on(\"mousedown\", e => this.clickStartedAtTarget = e.target)\n    this.bindClick(\"click\", \"click\")\n  }\n\n  bindClick(eventName, bindingName){\n    let click = this.binding(bindingName)\n    window.addEventListener(eventName, e => {\n      let target = null\n      // a synthetic click event (detail 0) will not have caused a mousedown event,\n      // therefore the clickStartedAtTarget is stale\n      if(e.detail === 0) this.clickStartedAtTarget = e.target\n      let clickStartedAtTarget = this.clickStartedAtTarget || e.target\n      // when searching the target for the click event, we always want to\n      // use the actual event target, see #3372\n      target = closestPhxBinding(e.target, click)\n      this.dispatchClickAway(e, clickStartedAtTarget)\n      this.clickStartedAtTarget = null\n      let phxEvent = target && target.getAttribute(click)\n      if(!phxEvent){\n        if(DOM.isNewPageClick(e, window.location)){ this.unload() }\n        return\n      }\n\n      if(target.getAttribute(\"href\") === \"#\"){ e.preventDefault() }\n\n      // noop if we are in the middle of awaiting an ack for this el already\n      if(target.hasAttribute(PHX_REF_SRC)){ return }\n\n      this.debounce(target, e, \"click\", () => {\n        this.withinOwners(target, view => {\n          JS.exec(e, \"click\", phxEvent, view, target, [\"push\", {data: this.eventMeta(\"click\", e, target)}])\n        })\n      })\n    }, false)\n  }\n\n  dispatchClickAway(e, clickStartedAt){\n    let phxClickAway = this.binding(\"click-away\")\n    DOM.all(document, `[${phxClickAway}]`, el => {\n      if(!(el.isSameNode(clickStartedAt) || el.contains(clickStartedAt))){\n        this.withinOwners(el, view => {\n          let phxEvent = el.getAttribute(phxClickAway)\n          if(JS.isVisible(el) && JS.isInViewport(el)){\n            JS.exec(e, \"click\", phxEvent, view, el, [\"push\", {data: this.eventMeta(\"click\", e, e.target)}])\n          }\n        })\n      }\n    })\n  }\n\n  bindNav(){\n    if(!Browser.canPushState()){ return }\n    if(history.scrollRestoration){ history.scrollRestoration = \"manual\" }\n    let scrollTimer = null\n    window.addEventListener(\"scroll\", _e => {\n      clearTimeout(scrollTimer)\n      scrollTimer = setTimeout(() => {\n        Browser.updateCurrentState(state => Object.assign(state, {scroll: window.scrollY}))\n      }, 100)\n    })\n    window.addEventListener(\"popstate\", event => {\n      if(!this.registerNewLocation(window.location)){ return }\n      let {type, backType, id, root, scroll, position} = event.state || {}\n      let href = window.location.href\n\n      // Compare positions to determine direction\n      let isForward = position > this.currentHistoryPosition\n\n      type = isForward ? type : (backType || type)\n\n      // Update current position\n      this.currentHistoryPosition = position || 0\n      this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n      DOM.dispatchEvent(window, \"phx:navigate\", {detail: {href, patch: type === \"patch\", pop: true, direction: isForward ? \"forward\" : \"backward\"}})\n      this.requestDOMUpdate(() => {\n        if(this.main.isConnected() && (type === \"patch\" && id === this.main.id)){\n          this.main.pushLinkPatch(event, href, null, () => {\n            this.maybeScroll(scroll)\n          })\n        } else {\n          this.replaceMain(href, null, () => {\n            if(root){ this.replaceRootHistory() }\n            this.maybeScroll(scroll)\n          })\n        }\n      })\n    }, false)\n    window.addEventListener(\"click\", e => {\n      let target = closestPhxBinding(e.target, PHX_LIVE_LINK)\n      let type = target && target.getAttribute(PHX_LIVE_LINK)\n      if(!type || !this.isConnected() || !this.main || DOM.wantsNewTab(e)){ return }\n\n      // When wrapping an SVG element in an anchor tag, the href can be an SVGAnimatedString\n      let href = target.href instanceof SVGAnimatedString ? target.href.baseVal : target.href\n\n      let linkState = target.getAttribute(PHX_LINK_STATE)\n      e.preventDefault()\n      e.stopImmediatePropagation() // do not bubble click to regular phx-click bindings\n      if(this.pendingLink === href){ return }\n\n      this.requestDOMUpdate(() => {\n        if(type === \"patch\"){\n          this.pushHistoryPatch(e, href, linkState, target)\n        } else if(type === \"redirect\"){\n          this.historyRedirect(e, href, linkState, null, target)\n        } else {\n          throw new Error(`expected ${PHX_LIVE_LINK} to be \"patch\" or \"redirect\", got: ${type}`)\n        }\n        let phxClick = target.getAttribute(this.binding(\"click\"))\n        if(phxClick){\n          this.requestDOMUpdate(() => this.execJS(target, phxClick, \"click\"))\n        }\n      })\n    }, false)\n  }\n\n  maybeScroll(scroll){\n    if(typeof(scroll) === \"number\"){\n      requestAnimationFrame(() => {\n        window.scrollTo(0, scroll)\n      }) // the body needs to render before we scroll.\n    }\n  }\n\n  dispatchEvent(event, payload = {}){\n    DOM.dispatchEvent(window, `phx:${event}`, {detail: payload})\n  }\n\n  dispatchEvents(events){\n    events.forEach(([event, payload]) => this.dispatchEvent(event, payload))\n  }\n\n  withPageLoading(info, callback){\n    DOM.dispatchEvent(window, \"phx:page-loading-start\", {detail: info})\n    let done = () => DOM.dispatchEvent(window, \"phx:page-loading-stop\", {detail: info})\n    return callback ? callback(done) : done\n  }\n\n  pushHistoryPatch(e, href, linkState, targetEl){\n    if(!this.isConnected() || !this.main.isMain()){ return Browser.redirect(href) }\n\n    this.withPageLoading({to: href, kind: \"patch\"}, done => {\n      this.main.pushLinkPatch(e, href, targetEl, linkRef => {\n        this.historyPatch(href, linkState, linkRef)\n        done()\n      })\n    })\n  }\n\n  historyPatch(href, linkState, linkRef = this.setPendingLink(href)){\n    if(!this.commitPendingLink(linkRef)){ return }\n\n    // Increment position for new state\n    this.currentHistoryPosition++\n    this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n    // store the type for back navigation\n    Browser.updateCurrentState((state) => ({...state, backType: \"patch\"}))\n\n    Browser.pushState(linkState, {\n      type: \"patch\",\n      id: this.main.id,\n      position: this.currentHistoryPosition\n    }, href)\n\n    DOM.dispatchEvent(window, \"phx:navigate\", {detail: {patch: true, href, pop: false, direction: \"forward\"}})\n    this.registerNewLocation(window.location)\n  }\n\n  historyRedirect(e, href, linkState, flash, targetEl){\n    if(targetEl && e.isTrusted && e.type !== \"popstate\"){ targetEl.classList.add(\"phx-click-loading\") }\n    if(!this.isConnected() || !this.main.isMain()){ return Browser.redirect(href, flash) }\n\n    // convert to full href if only path prefix\n    if(/^\\/$|^\\/[^\\/]+.*$/.test(href)){\n      let {protocol, host} = window.location\n      href = `${protocol}//${host}${href}`\n    }\n    let scroll = window.scrollY\n    this.withPageLoading({to: href, kind: \"redirect\"}, done => {\n      this.replaceMain(href, flash, (linkRef) => {\n        if(linkRef === this.linkRef){\n          // Increment position for new state\n          this.currentHistoryPosition++\n          this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n          // store the type for back navigation\n          Browser.updateCurrentState((state) => ({...state, backType: \"redirect\"}))\n\n          Browser.pushState(linkState, {\n            type: \"redirect\",\n            id: this.main.id,\n            scroll: scroll,\n            position: this.currentHistoryPosition\n          }, href)\n\n          DOM.dispatchEvent(window, \"phx:navigate\", {detail: {href, patch: false, pop: false, direction: \"forward\"}})\n          this.registerNewLocation(window.location)\n        }\n        done()\n      })\n    })\n  }\n\n  replaceRootHistory(){\n    Browser.pushState(\"replace\", {\n      root: true,\n      type: \"patch\",\n      id: this.main.id,\n      position: this.currentHistoryPosition // Preserve current position\n    })\n  }\n\n  registerNewLocation(newLocation){\n    let {pathname, search} = this.currentLocation\n    if(pathname + search === newLocation.pathname + newLocation.search){\n      return false\n    } else {\n      this.currentLocation = clone(newLocation)\n      return true\n    }\n  }\n\n  bindForms(){\n    let iterations = 0\n    let externalFormSubmitted = false\n\n    // disable forms on submit that track phx-change but perform external submit\n    this.on(\"submit\", e => {\n      let phxSubmit = e.target.getAttribute(this.binding(\"submit\"))\n      let phxChange = e.target.getAttribute(this.binding(\"change\"))\n      if(!externalFormSubmitted && phxChange && !phxSubmit){\n        externalFormSubmitted = true\n        e.preventDefault()\n        this.withinOwners(e.target, view => {\n          view.disableForm(e.target)\n          // safari needs next tick\n          window.requestAnimationFrame(() => {\n            if(DOM.isUnloadableFormSubmit(e)){ this.unload() }\n            e.target.submit()\n          })\n        })\n      }\n    })\n\n    this.on(\"submit\", e => {\n      let phxEvent = e.target.getAttribute(this.binding(\"submit\"))\n      if(!phxEvent){\n        if(DOM.isUnloadableFormSubmit(e)){ this.unload() }\n        return\n      }\n      e.preventDefault()\n      e.target.disabled = true\n      this.withinOwners(e.target, view => {\n        JS.exec(e, \"submit\", phxEvent, view, e.target, [\"push\", {submitter: e.submitter}])\n      })\n    })\n\n    for(let type of [\"change\", \"input\"]){\n      this.on(type, e => {\n        if(e instanceof CustomEvent && e.target.form === undefined){\n          // throw on invalid JS.dispatch target and noop if CustomEvent triggered outside JS.dispatch\n          if(e.detail && e.detail.dispatcher){\n            throw new Error(`dispatching a custom ${type} event is only supported on input elements inside a form`)\n          }\n          return\n        }\n        let phxChange = this.binding(\"change\")\n        let input = e.target\n        // do not fire phx-change if we are in the middle of a composition session\n        // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing\n        // Safari has issues if the input is updated while composing\n        // see https://github.com/phoenixframework/phoenix_live_view/issues/3322\n        if(e.isComposing){\n          const key = `composition-listener-${type}`\n          if(!DOM.private(input, key)){\n            DOM.putPrivate(input, key, true)\n            input.addEventListener(\"compositionend\", () => {\n              // trigger a new input/change event\n              input.dispatchEvent(new Event(type, {bubbles: true}))\n              DOM.deletePrivate(input, key)\n            }, {once: true})\n          }\n          return\n        }\n        let inputEvent = input.getAttribute(phxChange)\n        let formEvent = input.form && input.form.getAttribute(phxChange)\n        let phxEvent = inputEvent || formEvent\n        if(!phxEvent){ return }\n        if(input.type === \"number\" && input.validity && input.validity.badInput){ return }\n\n        let dispatcher = inputEvent ? input : input.form\n        let currentIterations = iterations\n        iterations++\n        let {at: at, type: lastType} = DOM.private(input, \"prev-iteration\") || {}\n        // Browsers should always fire at least one \"input\" event before every \"change\"\n        // Ignore \"change\" events, unless there was no prior \"input\" event.\n        // This could happen if user code triggers a \"change\" event, or if the browser is non-conforming.\n        if(at === currentIterations - 1 && type === \"change\" && lastType === \"input\"){ return }\n\n        DOM.putPrivate(input, \"prev-iteration\", {at: currentIterations, type: type})\n\n        this.debounce(input, e, type, () => {\n          this.withinOwners(dispatcher, view => {\n            DOM.putPrivate(input, PHX_HAS_FOCUSED, true)\n            JS.exec(e, \"change\", phxEvent, view, input, [\"push\", {_target: e.target.name, dispatcher: dispatcher}])\n          })\n        })\n      })\n    }\n    this.on(\"reset\", (e) => {\n      let form = e.target\n      DOM.resetForm(form)\n      let input = Array.from(form.elements).find(el => el.type === \"reset\")\n      if(input){\n        // wait until next tick to get updated input value\n        window.requestAnimationFrame(() => {\n          input.dispatchEvent(new Event(\"input\", {bubbles: true, cancelable: false}))\n        })\n      }\n    })\n  }\n\n  debounce(el, event, eventType, callback){\n    if(eventType === \"blur\" || eventType === \"focusout\"){ return callback() }\n\n    let phxDebounce = this.binding(PHX_DEBOUNCE)\n    let phxThrottle = this.binding(PHX_THROTTLE)\n    let defaultDebounce = this.defaults.debounce.toString()\n    let defaultThrottle = this.defaults.throttle.toString()\n\n    this.withinOwners(el, view => {\n      let asyncFilter = () => !view.isDestroyed() && document.body.contains(el)\n      DOM.debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, () => {\n        callback()\n      })\n    })\n  }\n\n  silenceEvents(callback){\n    this.silenced = true\n    callback()\n    this.silenced = false\n  }\n\n  on(event, callback){\n    this.boundEventNames.add(event)\n    window.addEventListener(event, e => {\n      if(!this.silenced){ callback(e) }\n    })\n  }\n\n  jsQuerySelectorAll(sourceEl, query, defaultQuery){\n    let all = this.domCallbacks.jsQuerySelectorAll\n    return all ? all(sourceEl, query, defaultQuery) : defaultQuery()\n  }\n}\n\nclass TransitionSet {\n  constructor(){\n    this.transitions = new Set()\n    this.pendingOps = []\n  }\n\n  reset(){\n    this.transitions.forEach(timer => {\n      clearTimeout(timer)\n      this.transitions.delete(timer)\n    })\n    this.flushPendingOps()\n  }\n\n  after(callback){\n    if(this.size() === 0){\n      callback()\n    } else {\n      this.pushPendingOp(callback)\n    }\n  }\n\n  addTransition(time, onStart, onDone){\n    onStart()\n    let timer = setTimeout(() => {\n      this.transitions.delete(timer)\n      onDone()\n      this.flushPendingOps()\n    }, time)\n    this.transitions.add(timer)\n  }\n\n  pushPendingOp(op){ this.pendingOps.push(op) }\n\n  size(){ return this.transitions.size }\n\n  flushPendingOps(){\n    if(this.size() > 0){ return }\n    let op = this.pendingOps.shift()\n    if(op){\n      op()\n      this.flushPendingOps()\n    }\n  }\n}\n"],
+  "mappings": "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",
   "names": ["isEmpty", "file", "morphAttrs", "morphdom", "childrenOnly", "targetContainer", "clone", "view", "el", "lock", "el", "loading", "entry", "input"]
 }
diff --git a/priv/static/phoenix_live_view.esm.js b/priv/static/phoenix_live_view.esm.js
index 84e519f67..a89f81939 100644
--- a/priv/static/phoenix_live_view.esm.js
+++ b/priv/static/phoenix_live_view.esm.js
@@ -3892,9 +3892,10 @@ var View = class _View {
     }
   }
   destroyHook(hook) {
+    const hookId = ViewHook.elementID(hook.el);
     hook.__destroyed();
     hook.__cleanup__();
-    delete this.viewHooks[ViewHook.elementID(hook.el)];
+    delete this.viewHooks[hookId];
   }
   applyPendingUpdates() {
     this.pendingDiffs.forEach(({ diff, events }) => this.update(diff, events));
diff --git a/priv/static/phoenix_live_view.esm.js.map b/priv/static/phoenix_live_view.esm.js.map
index 492a21b8c..1057d88f0 100644
--- a/priv/static/phoenix_live_view.esm.js.map
+++ b/priv/static/phoenix_live_view.esm.js.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["../../assets/js/phoenix_live_view/constants.js", "../../assets/js/phoenix_live_view/entry_uploader.js", "../../assets/js/phoenix_live_view/utils.js", "../../assets/js/phoenix_live_view/browser.js", "../../assets/js/phoenix_live_view/dom.js", "../../assets/js/phoenix_live_view/upload_entry.js", "../../assets/js/phoenix_live_view/live_uploader.js", "../../assets/js/phoenix_live_view/aria.js", "../../assets/js/phoenix_live_view/hooks.js", "../../assets/js/phoenix_live_view/element_ref.js", "../../assets/js/phoenix_live_view/dom_post_morph_restorer.js", "../../assets/node_modules/morphdom/dist/morphdom-esm.js", "../../assets/js/phoenix_live_view/dom_patch.js", "../../assets/js/phoenix_live_view/rendered.js", "../../assets/js/phoenix_live_view/js.js", "../../assets/js/phoenix_live_view/view_hook.js", "../../assets/js/phoenix_live_view/view.js", "../../assets/js/phoenix_live_view/live_socket.js", "../../assets/js/phoenix_live_view/index.js"],
-  "sourcesContent": ["export const CONSECUTIVE_RELOADS = \"consecutive-reloads\"\nexport const MAX_RELOADS = 10\nexport const RELOAD_JITTER_MIN = 5000\nexport const RELOAD_JITTER_MAX = 10000\nexport const FAILSAFE_JITTER = 30000\nexport const PHX_EVENT_CLASSES = [\n  \"phx-click-loading\", \"phx-change-loading\", \"phx-submit-loading\",\n  \"phx-keydown-loading\", \"phx-keyup-loading\", \"phx-blur-loading\", \"phx-focus-loading\",\n  \"phx-hook-loading\"\n]\nexport const PHX_COMPONENT = \"data-phx-component\"\nexport const PHX_LIVE_LINK = \"data-phx-link\"\nexport const PHX_TRACK_STATIC = \"track-static\"\nexport const PHX_LINK_STATE = \"data-phx-link-state\"\nexport const PHX_REF_LOADING = \"data-phx-ref-loading\"\nexport const PHX_REF_SRC = \"data-phx-ref-src\"\nexport const PHX_REF_LOCK = \"data-phx-ref-lock\"\nexport const PHX_TRACK_UPLOADS = \"track-uploads\"\nexport const PHX_UPLOAD_REF = \"data-phx-upload-ref\"\nexport const PHX_PREFLIGHTED_REFS = \"data-phx-preflighted-refs\"\nexport const PHX_DONE_REFS = \"data-phx-done-refs\"\nexport const PHX_DROP_TARGET = \"drop-target\"\nexport const PHX_ACTIVE_ENTRY_REFS = \"data-phx-active-refs\"\nexport const PHX_LIVE_FILE_UPDATED = \"phx:live-file:updated\"\nexport const PHX_SKIP = \"data-phx-skip\"\nexport const PHX_MAGIC_ID = \"data-phx-id\"\nexport const PHX_PRUNE = \"data-phx-prune\"\nexport const PHX_CONNECTED_CLASS = \"phx-connected\"\nexport const PHX_LOADING_CLASS = \"phx-loading\"\nexport const PHX_ERROR_CLASS = \"phx-error\"\nexport const PHX_CLIENT_ERROR_CLASS = \"phx-client-error\"\nexport const PHX_SERVER_ERROR_CLASS = \"phx-server-error\"\nexport const PHX_PARENT_ID = \"data-phx-parent-id\"\nexport const PHX_MAIN = \"data-phx-main\"\nexport const PHX_ROOT_ID = \"data-phx-root-id\"\nexport const PHX_VIEWPORT_TOP = \"viewport-top\"\nexport const PHX_VIEWPORT_BOTTOM = \"viewport-bottom\"\nexport const PHX_TRIGGER_ACTION = \"trigger-action\"\nexport const PHX_HAS_FOCUSED = \"phx-has-focused\"\nexport const FOCUSABLE_INPUTS = [\"text\", \"textarea\", \"number\", \"email\", \"password\", \"search\", \"tel\", \"url\", \"date\", \"time\", \"datetime-local\", \"color\", \"range\"]\nexport const CHECKABLE_INPUTS = [\"checkbox\", \"radio\"]\nexport const PHX_HAS_SUBMITTED = \"phx-has-submitted\"\nexport const PHX_SESSION = \"data-phx-session\"\nexport const PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`\nexport const PHX_STICKY = \"data-phx-sticky\"\nexport const PHX_STATIC = \"data-phx-static\"\nexport const PHX_READONLY = \"data-phx-readonly\"\nexport const PHX_DISABLED = \"data-phx-disabled\"\nexport const PHX_DISABLE_WITH = \"disable-with\"\nexport const PHX_DISABLE_WITH_RESTORE = \"data-phx-disable-with-restore\"\nexport const PHX_HOOK = \"hook\"\nexport const PHX_DEBOUNCE = \"debounce\"\nexport const PHX_THROTTLE = \"throttle\"\nexport const PHX_UPDATE = \"update\"\nexport const PHX_STREAM = \"stream\"\nexport const PHX_STREAM_REF = \"data-phx-stream\"\nexport const PHX_KEY = \"key\"\nexport const PHX_PRIVATE = \"phxPrivate\"\nexport const PHX_AUTO_RECOVER = \"auto-recover\"\nexport const PHX_LV_DEBUG = \"phx:live-socket:debug\"\nexport const PHX_LV_PROFILE = \"phx:live-socket:profiling\"\nexport const PHX_LV_LATENCY_SIM = \"phx:live-socket:latency-sim\"\nexport const PHX_LV_HISTORY_POSITION = \"phx:nav-history-position\"\nexport const PHX_PROGRESS = \"progress\"\nexport const PHX_MOUNTED = \"mounted\"\nexport const PHX_RELOAD_STATUS = \"__phoenix_reload_status__\"\nexport const LOADER_TIMEOUT = 1\nexport const MAX_CHILD_JOIN_ATTEMPTS = 3\nexport const BEFORE_UNLOAD_LOADER_TIMEOUT = 200\nexport const BINDING_PREFIX = \"phx-\"\nexport const PUSH_TIMEOUT = 30000\nexport const LINK_HEADER = \"x-requested-with\"\nexport const RESPONSE_URL_HEADER = \"x-response-url\"\nexport const DEBOUNCE_TRIGGER = \"debounce-trigger\"\nexport const THROTTLED = \"throttled\"\nexport const DEBOUNCE_PREV_KEY = \"debounce-prev-key\"\nexport const DEFAULTS = {\n  debounce: 300,\n  throttle: 300\n}\nexport const PHX_PENDING_ATTRS = [PHX_REF_LOADING, PHX_REF_SRC, PHX_REF_LOCK]\n// Rendered\nexport const DYNAMICS = \"d\"\nexport const STATIC = \"s\"\nexport const ROOT = \"r\"\nexport const COMPONENTS = \"c\"\nexport const EVENTS = \"e\"\nexport const REPLY = \"r\"\nexport const TITLE = \"t\"\nexport const TEMPLATES = \"p\"\nexport const STREAM = \"stream\"\n", "import {\n  logError\n} from \"./utils\"\n\nexport default class EntryUploader {\n  constructor(entry, config, liveSocket){\n    let {chunk_size, chunk_timeout} = config\n    this.liveSocket = liveSocket\n    this.entry = entry\n    this.offset = 0\n    this.chunkSize = chunk_size\n    this.chunkTimeout = chunk_timeout\n    this.chunkTimer = null\n    this.errored = false\n    this.uploadChannel = liveSocket.channel(`lvu:${entry.ref}`, {token: entry.metadata()})\n  }\n\n  error(reason){\n    if(this.errored){ return }\n    this.uploadChannel.leave()\n    this.errored = true\n    clearTimeout(this.chunkTimer)\n    this.entry.error(reason)\n  }\n\n  upload(){\n    this.uploadChannel.onError(reason => this.error(reason))\n    this.uploadChannel.join()\n      .receive(\"ok\", _data => this.readNextChunk())\n      .receive(\"error\", reason => this.error(reason))\n  }\n\n  isDone(){ return this.offset >= this.entry.file.size }\n\n  readNextChunk(){\n    let reader = new window.FileReader()\n    let blob = this.entry.file.slice(this.offset, this.chunkSize + this.offset)\n    reader.onload = (e) => {\n      if(e.target.error === null){\n        this.offset += e.target.result.byteLength\n        this.pushChunk(e.target.result)\n      } else {\n        return logError(\"Read error: \" + e.target.error)\n      }\n    }\n    reader.readAsArrayBuffer(blob)\n  }\n\n  pushChunk(chunk){\n    if(!this.uploadChannel.isJoined()){ return }\n    this.uploadChannel.push(\"chunk\", chunk, this.chunkTimeout)\n      .receive(\"ok\", () => {\n        this.entry.progress((this.offset / this.entry.file.size) * 100)\n        if(!this.isDone()){\n          this.chunkTimer = setTimeout(() => this.readNextChunk(), this.liveSocket.getLatencySim() || 0)\n        }\n      })\n      .receive(\"error\", ({reason}) => this.error(reason))\n  }\n}\n", "import {\n  PHX_VIEW_SELECTOR\n} from \"./constants\"\n\nimport EntryUploader from \"./entry_uploader\"\n\nexport let logError = (msg, obj) => console.error && console.error(msg, obj)\n\nexport let isCid = (cid) => {\n  let type = typeof(cid)\n  return type === \"number\" || (type === \"string\" && /^(0|[1-9]\\d*)$/.test(cid))\n}\n\nexport function detectDuplicateIds(){\n  let ids = new Set()\n  let elems = document.querySelectorAll(\"*[id]\")\n  for(let i = 0, len = elems.length; i < len; i++){\n    if(ids.has(elems[i].id)){\n      console.error(`Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`)\n    } else {\n      ids.add(elems[i].id)\n    }\n  }\n}\n\nexport let debug = (view, kind, msg, obj) => {\n  if(view.liveSocket.isDebugEnabled()){\n    console.log(`${view.id} ${kind}: ${msg} - `, obj)\n  }\n}\n\n// wraps value in closure or returns closure\nexport let closure = (val) => typeof val === \"function\" ? val : function (){ return val }\n\nexport let clone = (obj) => { return JSON.parse(JSON.stringify(obj)) }\n\nexport let closestPhxBinding = (el, binding, borderEl) => {\n  do {\n    if(el.matches(`[${binding}]`) && !el.disabled){ return el }\n    el = el.parentElement || el.parentNode\n  } while(el !== null && el.nodeType === 1 && !((borderEl && borderEl.isSameNode(el)) || el.matches(PHX_VIEW_SELECTOR)))\n  return null\n}\n\nexport let isObject = (obj) => {\n  return obj !== null && typeof obj === \"object\" && !(obj instanceof Array)\n}\n\nexport let isEqualObj = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2)\n\nexport let isEmpty = (obj) => {\n  for(let x in obj){ return false }\n  return true\n}\n\nexport let maybe = (el, callback) => el && callback(el)\n\nexport let channelUploader = function (entries, onError, resp, liveSocket){\n  entries.forEach(entry => {\n    let entryUploader = new EntryUploader(entry, resp.config, liveSocket)\n    entryUploader.upload()\n  })\n}\n", "let Browser = {\n  canPushState(){ return (typeof (history.pushState) !== \"undefined\") },\n\n  dropLocal(localStorage, namespace, subkey){\n    return localStorage.removeItem(this.localKey(namespace, subkey))\n  },\n\n  updateLocal(localStorage, namespace, subkey, initial, func){\n    let current = this.getLocal(localStorage, namespace, subkey)\n    let key = this.localKey(namespace, subkey)\n    let newVal = current === null ? initial : func(current)\n    localStorage.setItem(key, JSON.stringify(newVal))\n    return newVal\n  },\n\n  getLocal(localStorage, namespace, subkey){\n    return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey)))\n  },\n\n  updateCurrentState(callback){\n    if(!this.canPushState()){ return }\n    history.replaceState(callback(history.state || {}), \"\", window.location.href)\n  },\n\n  pushState(kind, meta, to){\n    if(this.canPushState()){\n      if(to !== window.location.href){\n        if(meta.type == \"redirect\" && meta.scroll){\n          // If we're redirecting store the current scrollY for the current history state.\n          let currentState = history.state || {}\n          currentState.scroll = meta.scroll\n          history.replaceState(currentState, \"\", window.location.href)\n        }\n\n        delete meta.scroll // Only store the scroll in the redirect case.\n        history[kind + \"State\"](meta, \"\", to || null) // IE will coerce undefined to string\n\n        // when using navigate, we'd call pushState immediately before patching the DOM,\n        // jumping back to the top of the page, effectively ignoring the scrollIntoView;\n        // therefore we wait for the next frame (after the DOM patch) and only then try\n        // to scroll to the hashEl\n        window.requestAnimationFrame(() => {\n          let hashEl = this.getHashTargetEl(window.location.hash)\n  \n          if(hashEl){\n            hashEl.scrollIntoView()\n          } else if(meta.type === \"redirect\"){\n            window.scroll(0, 0)\n          }\n        })\n      }\n    } else {\n      this.redirect(to)\n    }\n  },\n\n  setCookie(name, value, maxAgeSeconds){\n    let expires = typeof(maxAgeSeconds) === \"number\" ? ` max-age=${maxAgeSeconds};` : \"\"\n    document.cookie = `${name}=${value};${expires} path=/`\n  },\n\n  getCookie(name){\n    return document.cookie.replace(new RegExp(`(?:(?:^|.*;\\s*)${name}\\s*\\=\\s*([^;]*).*$)|^.*$`), \"$1\")\n  },\n\n  deleteCookie(name){\n    document.cookie = `${name}=; max-age=-1; path=/`\n  },\n\n  redirect(toURL, flash){\n    if(flash){ this.setCookie(\"__phoenix_flash__\", flash, 60) }\n    window.location = toURL\n  },\n\n  localKey(namespace, subkey){ return `${namespace}-${subkey}` },\n\n  getHashTargetEl(maybeHash){\n    let hash = maybeHash.toString().substring(1)\n    if(hash === \"\"){ return }\n    return document.getElementById(hash) || document.querySelector(`a[name=\"${hash}\"]`)\n  }\n}\n\nexport default Browser\n", "import {\n  CHECKABLE_INPUTS,\n  DEBOUNCE_PREV_KEY,\n  DEBOUNCE_TRIGGER,\n  FOCUSABLE_INPUTS,\n  PHX_COMPONENT,\n  PHX_HAS_FOCUSED,\n  PHX_HAS_SUBMITTED,\n  PHX_MAIN,\n  PHX_PARENT_ID,\n  PHX_PRIVATE,\n  PHX_REF_SRC,\n  PHX_PENDING_ATTRS,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_STATIC,\n  PHX_UPLOAD_REF,\n  PHX_VIEW_SELECTOR,\n  PHX_STICKY,\n  PHX_EVENT_CLASSES,\n  THROTTLED,\n} from \"./constants\"\n\nimport {\n  logError\n} from \"./utils\"\n\nlet DOM = {\n  byId(id){ return document.getElementById(id) || logError(`no id found for ${id}`) },\n\n  removeClass(el, className){\n    el.classList.remove(className)\n    if(el.classList.length === 0){ el.removeAttribute(\"class\") }\n  },\n\n  all(node, query, callback){\n    if(!node){ return [] }\n    let array = Array.from(node.querySelectorAll(query))\n    return callback ? array.forEach(callback) : array\n  },\n\n  childNodeLength(html){\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    return template.content.childElementCount\n  },\n\n  isUploadInput(el){ return el.type === \"file\" && el.getAttribute(PHX_UPLOAD_REF) !== null },\n\n  isAutoUpload(inputEl){ return inputEl.hasAttribute(\"data-phx-auto-upload\") },\n\n  findUploadInputs(node){\n    const formId = node.id\n    const inputsOutsideForm = this.all(document, `input[type=\"file\"][${PHX_UPLOAD_REF}][form=\"${formId}\"]`)\n    return this.all(node, `input[type=\"file\"][${PHX_UPLOAD_REF}]`).concat(inputsOutsideForm)\n  },\n\n  findComponentNodeList(node, cid){\n    return this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}=\"${cid}\"]`), node)\n  },\n\n  isPhxDestroyed(node){\n    return node.id && DOM.private(node, \"destroyed\") ? true : false\n  },\n\n  wantsNewTab(e){\n    let wantsNewTab = e.ctrlKey || e.shiftKey || e.metaKey || (e.button && e.button === 1)\n    let isDownload = (e.target instanceof HTMLAnchorElement && e.target.hasAttribute(\"download\"))\n    let isTargetBlank = e.target.hasAttribute(\"target\") && e.target.getAttribute(\"target\").toLowerCase() === \"_blank\"\n    let isTargetNamedTab = e.target.hasAttribute(\"target\") && !e.target.getAttribute(\"target\").startsWith(\"_\")\n    return wantsNewTab || isTargetBlank || isDownload || isTargetNamedTab\n  },\n\n  isUnloadableFormSubmit(e){\n    // Ignore form submissions intended to close a native <dialog> element\n    // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog#usage_notes\n    let isDialogSubmit = (e.target && e.target.getAttribute(\"method\") === \"dialog\") ||\n      (e.submitter && e.submitter.getAttribute(\"formmethod\") === \"dialog\")\n\n    if(isDialogSubmit){\n      return false\n    } else {\n      return !e.defaultPrevented && !this.wantsNewTab(e)\n    }\n  },\n\n  isNewPageClick(e, currentLocation){\n    let href = e.target instanceof HTMLAnchorElement ? e.target.getAttribute(\"href\") : null\n    let url\n\n    if(e.defaultPrevented || href === null || this.wantsNewTab(e)){ return false }\n    if(href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")){ return false }\n    if(e.target.isContentEditable){ return false }\n\n    try {\n      url = new URL(href)\n    } catch {\n      try {\n        url = new URL(href, currentLocation)\n      } catch {\n        // bad URL, fallback to let browser try it as external\n        return true\n      }\n    }\n\n    if(url.host === currentLocation.host && url.protocol === currentLocation.protocol){\n      if(url.pathname === currentLocation.pathname && url.search === currentLocation.search){\n        return url.hash === \"\" && !url.href.endsWith(\"#\")\n      }\n    }\n    return url.protocol.startsWith(\"http\")\n  },\n\n  markPhxChildDestroyed(el){\n    if(this.isPhxChild(el)){ el.setAttribute(PHX_SESSION, \"\") }\n    this.putPrivate(el, \"destroyed\", true)\n  },\n\n  findPhxChildrenInFragment(html, parentId){\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    return this.findPhxChildren(template.content, parentId)\n  },\n\n  isIgnored(el, phxUpdate){\n    return (el.getAttribute(phxUpdate) || el.getAttribute(\"data-phx-update\")) === \"ignore\"\n  },\n\n  isPhxUpdate(el, phxUpdate, updateTypes){\n    return el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0\n  },\n\n  findPhxSticky(el){ return this.all(el, `[${PHX_STICKY}]`) },\n\n  findPhxChildren(el, parentId){\n    return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}=\"${parentId}\"]`)\n  },\n\n  findExistingParentCIDs(node, cids){\n    // we only want to find parents that exist on the page\n    // if a cid is not on the page, the only way it can be added back to the page\n    // is if a parent adds it back, therefore if a cid does not exist on the page,\n    // we should not try to render it by itself (because it would be rendered twice,\n    // one by the parent, and a second time by itself)\n    let parentCids = new Set()\n    let childrenCids = new Set()\n\n    cids.forEach(cid => {\n      this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}=\"${cid}\"]`), node).forEach(parent => {\n        parentCids.add(cid)\n        this.all(parent, `[${PHX_COMPONENT}]`)\n          .map(el => parseInt(el.getAttribute(PHX_COMPONENT)))\n          .forEach(childCID => childrenCids.add(childCID))\n      })\n    })\n\n    childrenCids.forEach(childCid => parentCids.delete(childCid))\n\n    return parentCids\n  },\n\n  filterWithinSameLiveView(nodes, parent){\n    if(parent.querySelector(PHX_VIEW_SELECTOR)){\n      return nodes.filter(el => this.withinSameLiveView(el, parent))\n    } else {\n      return nodes\n    }\n  },\n\n  withinSameLiveView(node, parent){\n    while(node = node.parentNode){\n      if(node.isSameNode(parent)){ return true }\n      if(node.getAttribute(PHX_SESSION) !== null){ return false }\n    }\n  },\n\n  private(el, key){ return el[PHX_PRIVATE] && el[PHX_PRIVATE][key] },\n\n  deletePrivate(el, key){ el[PHX_PRIVATE] && delete (el[PHX_PRIVATE][key]) },\n\n  putPrivate(el, key, value){\n    if(!el[PHX_PRIVATE]){ el[PHX_PRIVATE] = {} }\n    el[PHX_PRIVATE][key] = value\n  },\n\n  updatePrivate(el, key, defaultVal, updateFunc){\n    let existing = this.private(el, key)\n    if(existing === undefined){\n      this.putPrivate(el, key, updateFunc(defaultVal))\n    } else {\n      this.putPrivate(el, key, updateFunc(existing))\n    }\n  },\n\n  syncPendingAttrs(fromEl, toEl){\n    if(!fromEl.hasAttribute(PHX_REF_SRC)){ return }\n    PHX_EVENT_CLASSES.forEach(className => {\n      fromEl.classList.contains(className) && toEl.classList.add(className)\n    })\n    PHX_PENDING_ATTRS.filter(attr => fromEl.hasAttribute(attr)).forEach(attr => {\n      toEl.setAttribute(attr, fromEl.getAttribute(attr))\n    })\n  },\n\n  copyPrivates(target, source){\n    if(source[PHX_PRIVATE]){\n      target[PHX_PRIVATE] = source[PHX_PRIVATE]\n    }\n  },\n\n  putTitle(str){\n    let titleEl = document.querySelector(\"title\")\n    if(titleEl){\n      let {prefix, suffix, default: defaultTitle} = titleEl.dataset\n      let isEmpty = typeof(str) !== \"string\" || str.trim() === \"\"\n      if(isEmpty && typeof(defaultTitle) !== \"string\"){ return }\n\n      let inner = isEmpty ? defaultTitle : str\n      document.title = `${prefix || \"\"}${inner || \"\"}${suffix || \"\"}`\n    } else {\n      document.title = str\n    }\n  },\n\n  debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, callback){\n    let debounce = el.getAttribute(phxDebounce)\n    let throttle = el.getAttribute(phxThrottle)\n\n    if(debounce === \"\"){ debounce = defaultDebounce }\n    if(throttle === \"\"){ throttle = defaultThrottle }\n    let value = debounce || throttle\n    switch(value){\n      case null: return callback()\n\n      case \"blur\":\n        if(this.once(el, \"debounce-blur\")){\n          el.addEventListener(\"blur\", () => {\n            if(asyncFilter()){ callback() }\n          })\n        }\n        return\n\n      default:\n        let timeout = parseInt(value)\n        let trigger = () => throttle ? this.deletePrivate(el, THROTTLED) : callback()\n        let currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger)\n        if(isNaN(timeout)){ return logError(`invalid throttle/debounce value: ${value}`) }\n        if(throttle){\n          let newKeyDown = false\n          if(event.type === \"keydown\"){\n            let prevKey = this.private(el, DEBOUNCE_PREV_KEY)\n            this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key)\n            newKeyDown = prevKey !== event.key\n          }\n\n          if(!newKeyDown && this.private(el, THROTTLED)){\n            return false\n          } else {\n            callback()\n            const t = setTimeout(() => {\n              if(asyncFilter()){ this.triggerCycle(el, DEBOUNCE_TRIGGER) }\n            }, timeout)\n            this.putPrivate(el, THROTTLED, t)\n          }\n        } else {\n          setTimeout(() => {\n            if(asyncFilter()){ this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle) }\n          }, timeout)\n        }\n\n        let form = el.form\n        if(form && this.once(form, \"bind-debounce\")){\n          form.addEventListener(\"submit\", () => {\n            Array.from((new FormData(form)).entries(), ([name]) => {\n              let input = form.querySelector(`[name=\"${name}\"]`)\n              this.incCycle(input, DEBOUNCE_TRIGGER)\n              this.deletePrivate(input, THROTTLED)\n            })\n          })\n        }\n        if(this.once(el, \"bind-debounce\")){\n          el.addEventListener(\"blur\", () => {\n            // because we trigger the callback here,\n            // we also clear the throttle timeout to prevent the callback\n            // from being called again after the timeout fires\n            clearTimeout(this.private(el, THROTTLED))\n            this.triggerCycle(el, DEBOUNCE_TRIGGER)\n          })\n        }\n    }\n  },\n\n  triggerCycle(el, key, currentCycle){\n    let [cycle, trigger] = this.private(el, key)\n    if(!currentCycle){ currentCycle = cycle }\n    if(currentCycle === cycle){\n      this.incCycle(el, key)\n      trigger()\n    }\n  },\n\n  once(el, key){\n    if(this.private(el, key) === true){ return false }\n    this.putPrivate(el, key, true)\n    return true\n  },\n\n  incCycle(el, key, trigger = function (){ }){\n    let [currentCycle] = this.private(el, key) || [0, trigger]\n    currentCycle++\n    this.putPrivate(el, key, [currentCycle, trigger])\n    return currentCycle\n  },\n\n  // maintains or adds privately used hook information\n  // fromEl and toEl can be the same element in the case of a newly added node\n  // fromEl and toEl can be any HTML node type, so we need to check if it's an element node\n  maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom){\n    // maintain the hooks created with createHook\n    if(fromEl.hasAttribute && fromEl.hasAttribute(\"data-phx-hook\") && !toEl.hasAttribute(\"data-phx-hook\")){\n      toEl.setAttribute(\"data-phx-hook\", fromEl.getAttribute(\"data-phx-hook\"))\n    }\n    // add hooks to elements with viewport attributes\n    if(toEl.hasAttribute && (toEl.hasAttribute(phxViewportTop) || toEl.hasAttribute(phxViewportBottom))){\n      toEl.setAttribute(\"data-phx-hook\", \"Phoenix.InfiniteScroll\")\n    }\n  },\n\n  putCustomElHook(el, hook){\n    if(el.isConnected){\n      el.setAttribute(\"data-phx-hook\", \"\")\n    } else {\n      console.error(`\n        hook attached to non-connected DOM element\n        ensure you are calling createHook within your connectedCallback. ${el.outerHTML}\n      `)\n    }\n    this.putPrivate(el, \"custom-el-hook\", hook)\n  },\n\n  getCustomElHook(el){ return this.private(el, \"custom-el-hook\") },\n\n  isUsedInput(el){\n    return (el.nodeType === Node.ELEMENT_NODE &&\n      (this.private(el, PHX_HAS_FOCUSED) || this.private(el, PHX_HAS_SUBMITTED)))\n  },\n\n  resetForm(form){\n    Array.from(form.elements).forEach(input => {\n      this.deletePrivate(input, PHX_HAS_FOCUSED)\n      this.deletePrivate(input, PHX_HAS_SUBMITTED)\n    })\n  },\n\n  isPhxChild(node){\n    return node.getAttribute && node.getAttribute(PHX_PARENT_ID)\n  },\n\n  isPhxSticky(node){\n    return node.getAttribute && node.getAttribute(PHX_STICKY) !== null\n  },\n\n  isChildOfAny(el, parents){\n    return !!parents.find(parent => parent.contains(el))\n  },\n\n  firstPhxChild(el){\n    return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0]\n  },\n\n  dispatchEvent(target, name, opts = {}){\n    let defaultBubble = true\n    let isUploadTarget = target.nodeName === \"INPUT\" && target.type === \"file\"\n    if(isUploadTarget && name === \"click\"){\n      defaultBubble = false\n    }\n    let bubbles = opts.bubbles === undefined ? defaultBubble : !!opts.bubbles\n    let eventOpts = {bubbles: bubbles, cancelable: true, detail: opts.detail || {}}\n    let event = name === \"click\" ? new MouseEvent(\"click\", eventOpts) : new CustomEvent(name, eventOpts)\n    target.dispatchEvent(event)\n  },\n\n  cloneNode(node, html){\n    if(typeof (html) === \"undefined\"){\n      return node.cloneNode(true)\n    } else {\n      let cloned = node.cloneNode(false)\n      cloned.innerHTML = html\n      return cloned\n    }\n  },\n\n  // merge attributes from source to target\n  // if an element is ignored, we only merge data attributes\n  // including removing data attributes that are no longer in the source\n  mergeAttrs(target, source, opts = {}){\n    let exclude = new Set(opts.exclude || [])\n    let isIgnored = opts.isIgnored\n    let sourceAttrs = source.attributes\n    for(let i = sourceAttrs.length - 1; i >= 0; i--){\n      let name = sourceAttrs[i].name\n      if(!exclude.has(name)){\n        const sourceValue = source.getAttribute(name)\n        if(target.getAttribute(name) !== sourceValue && (!isIgnored || (isIgnored && name.startsWith(\"data-\")))){\n          target.setAttribute(name, sourceValue)\n        }\n      } else {\n        // We exclude the value from being merged on focused inputs, because the\n        // user's input should always win.\n        // We can still assign it as long as the value property is the same, though.\n        // This prevents a situation where the updated hook is not being triggered\n        // when an input is back in its \"original state\", because the attribute\n        // was never changed, see:\n        // https://github.com/phoenixframework/phoenix_live_view/issues/2163\n        if(name === \"value\" && target.value === source.value){\n          // actually set the value attribute to sync it with the value property\n          target.setAttribute(\"value\", source.getAttribute(name))\n        }\n      }\n    }\n\n    let targetAttrs = target.attributes\n    for(let i = targetAttrs.length - 1; i >= 0; i--){\n      let name = targetAttrs[i].name\n      if(isIgnored){\n        if(name.startsWith(\"data-\") && !source.hasAttribute(name) && !PHX_PENDING_ATTRS.includes(name)){ target.removeAttribute(name) }\n      } else {\n        if(!source.hasAttribute(name)){ target.removeAttribute(name) }\n      }\n    }\n  },\n\n  mergeFocusedInput(target, source){\n    // skip selects because FF will reset highlighted index for any setAttribute\n    if(!(target instanceof HTMLSelectElement)){ DOM.mergeAttrs(target, source, {exclude: [\"value\"]}) }\n\n    if(source.readOnly){\n      target.setAttribute(\"readonly\", true)\n    } else {\n      target.removeAttribute(\"readonly\")\n    }\n  },\n\n  hasSelectionRange(el){\n    return el.setSelectionRange && (el.type === \"text\" || el.type === \"textarea\")\n  },\n\n  restoreFocus(focused, selectionStart, selectionEnd){\n    if(focused instanceof HTMLSelectElement){ focused.focus() }\n    if(!DOM.isTextualInput(focused)){ return }\n\n    let wasFocused = focused.matches(\":focus\")\n    if(!wasFocused){ focused.focus() }\n    if(this.hasSelectionRange(focused)){\n      focused.setSelectionRange(selectionStart, selectionEnd)\n    }\n  },\n\n  isFormInput(el){ return /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== \"button\" },\n\n  syncAttrsToProps(el){\n    if(el instanceof HTMLInputElement && CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0){\n      el.checked = el.getAttribute(\"checked\") !== null\n    }\n  },\n\n  isTextualInput(el){ return FOCUSABLE_INPUTS.indexOf(el.type) >= 0 },\n\n  isNowTriggerFormExternal(el, phxTriggerExternal){\n    return el.getAttribute && el.getAttribute(phxTriggerExternal) !== null && document.body.contains(el)\n  },\n\n  cleanChildNodes(container, phxUpdate){\n    if(DOM.isPhxUpdate(container, phxUpdate, [\"append\", \"prepend\"])){\n      let toRemove = []\n      container.childNodes.forEach(childNode => {\n        if(!childNode.id){\n          // Skip warning if it's an empty text node (e.g. a new-line)\n          let isEmptyTextNode = childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue.trim() === \"\"\n          if(!isEmptyTextNode && childNode.nodeType !== Node.COMMENT_NODE){\n            logError(\"only HTML element tags with an id are allowed inside containers with phx-update.\\n\\n\" +\n              `removing illegal node: \"${(childNode.outerHTML || childNode.nodeValue).trim()}\"\\n\\n`)\n          }\n          toRemove.push(childNode)\n        }\n      })\n      toRemove.forEach(childNode => childNode.remove())\n    }\n  },\n\n  replaceRootContainer(container, tagName, attrs){\n    let retainedAttrs = new Set([\"id\", PHX_SESSION, PHX_STATIC, PHX_MAIN, PHX_ROOT_ID])\n    if(container.tagName.toLowerCase() === tagName.toLowerCase()){\n      Array.from(container.attributes)\n        .filter(attr => !retainedAttrs.has(attr.name.toLowerCase()))\n        .forEach(attr => container.removeAttribute(attr.name))\n\n      Object.keys(attrs)\n        .filter(name => !retainedAttrs.has(name.toLowerCase()))\n        .forEach(attr => container.setAttribute(attr, attrs[attr]))\n\n      return container\n\n    } else {\n      let newContainer = document.createElement(tagName)\n      Object.keys(attrs).forEach(attr => newContainer.setAttribute(attr, attrs[attr]))\n      retainedAttrs.forEach(attr => newContainer.setAttribute(attr, container.getAttribute(attr)))\n      newContainer.innerHTML = container.innerHTML\n      container.replaceWith(newContainer)\n      return newContainer\n    }\n  },\n\n  getSticky(el, name, defaultVal){\n    let op = (DOM.private(el, \"sticky\") || []).find(([existingName,]) => name === existingName)\n    if(op){\n      let [_name, _op, stashedResult] = op\n      return stashedResult\n    } else {\n      return typeof(defaultVal) === \"function\" ? defaultVal() : defaultVal\n    }\n  },\n\n  deleteSticky(el, name){\n    this.updatePrivate(el, \"sticky\", [], ops => {\n      return ops.filter(([existingName, _]) => existingName !== name)\n    })\n  },\n\n  putSticky(el, name, op){\n    let stashedResult = op(el)\n    this.updatePrivate(el, \"sticky\", [], ops => {\n      let existingIndex = ops.findIndex(([existingName,]) => name === existingName)\n      if(existingIndex >= 0){\n        ops[existingIndex] = [name, op, stashedResult]\n      } else {\n        ops.push([name, op, stashedResult])\n      }\n      return ops\n    })\n  },\n\n  applyStickyOperations(el){\n    let ops = DOM.private(el, \"sticky\")\n    if(!ops){ return }\n\n    ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op))\n  }\n}\n\nexport default DOM\n", "import {\n  PHX_ACTIVE_ENTRY_REFS,\n  PHX_LIVE_FILE_UPDATED,\n  PHX_PREFLIGHTED_REFS\n} from \"./constants\"\n\nimport {\n  channelUploader,\n  logError\n} from \"./utils\"\n\nimport LiveUploader from \"./live_uploader\"\n\nexport default class UploadEntry {\n  static isActive(fileEl, file){\n    let isNew = file._phxRef === undefined\n    let activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\")\n    let isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0\n    return file.size > 0 && (isNew || isActive)\n  }\n\n  static isPreflighted(fileEl, file){\n    let preflightedRefs = fileEl.getAttribute(PHX_PREFLIGHTED_REFS).split(\",\")\n    let isPreflighted = preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0\n    return isPreflighted && this.isActive(fileEl, file)\n  }\n\n  static isPreflightInProgress(file){\n    return file._preflightInProgress === true\n  }\n\n  static markPreflightInProgress(file){\n    file._preflightInProgress = true\n  }\n\n  constructor(fileEl, file, view, autoUpload){\n    this.ref = LiveUploader.genFileRef(file)\n    this.fileEl = fileEl\n    this.file = file\n    this.view = view\n    this.meta = null\n    this._isCancelled = false\n    this._isDone = false\n    this._progress = 0\n    this._lastProgressSent = -1\n    this._onDone = function(){ }\n    this._onElUpdated = this.onElUpdated.bind(this)\n    this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n    this.autoUpload = autoUpload\n  }\n\n  metadata(){ return this.meta }\n\n  progress(progress){\n    this._progress = Math.floor(progress)\n    if(this._progress > this._lastProgressSent){\n      if(this._progress >= 100){\n        this._progress = 100\n        this._lastProgressSent = 100\n        this._isDone = true\n        this.view.pushFileProgress(this.fileEl, this.ref, 100, () => {\n          LiveUploader.untrackFile(this.fileEl, this.file)\n          this._onDone()\n        })\n      } else {\n        this._lastProgressSent = this._progress\n        this.view.pushFileProgress(this.fileEl, this.ref, this._progress)\n      }\n    }\n  }\n\n  isCancelled(){ return this._isCancelled }\n\n  cancel(){\n    this.file._preflightInProgress = false\n    this._isCancelled = true\n    this._isDone = true\n    this._onDone()\n  }\n\n  isDone(){ return this._isDone }\n\n  error(reason = \"failed\"){\n    this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n    this.view.pushFileProgress(this.fileEl, this.ref, {error: reason})\n    if(!this.isAutoUpload()){ LiveUploader.clearFiles(this.fileEl) }\n  }\n\n  isAutoUpload(){ return this.autoUpload }\n\n  //private\n\n  onDone(callback){\n    this._onDone = () => {\n      this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n      callback()\n    }\n  }\n\n  onElUpdated(){\n    let activeRefs = this.fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\")\n    if(activeRefs.indexOf(this.ref) === -1){\n      LiveUploader.untrackFile(this.fileEl, this.file)\n      this.cancel()\n    }\n  }\n\n  toPreflightPayload(){\n    return {\n      last_modified: this.file.lastModified,\n      name: this.file.name,\n      relative_path: this.file.webkitRelativePath,\n      size: this.file.size,\n      type: this.file.type,\n      ref: this.ref,\n      meta: typeof(this.file.meta) === \"function\" ? this.file.meta() : undefined\n    }\n  }\n\n  uploader(uploaders){\n    if(this.meta.uploader){\n      let callback = uploaders[this.meta.uploader] || logError(`no uploader configured for ${this.meta.uploader}`)\n      return {name: this.meta.uploader, callback: callback}\n    } else {\n      return {name: \"channel\", callback: channelUploader}\n    }\n  }\n\n  zipPostFlight(resp){\n    this.meta = resp.entries[this.ref]\n    if(!this.meta){ logError(`no preflight upload response returned with ref ${this.ref}`, {input: this.fileEl, response: resp}) }\n  }\n}\n", "import {\n  PHX_DONE_REFS,\n  PHX_PREFLIGHTED_REFS,\n  PHX_UPLOAD_REF\n} from \"./constants\"\n\nimport {\n} from \"./utils\"\n\nimport DOM from \"./dom\"\nimport UploadEntry from \"./upload_entry\"\n\nlet liveUploaderFileRef = 0\n\nexport default class LiveUploader {\n  static genFileRef(file){\n    let ref = file._phxRef\n    if(ref !== undefined){\n      return ref\n    } else {\n      file._phxRef = (liveUploaderFileRef++).toString()\n      return file._phxRef\n    }\n  }\n\n  static getEntryDataURL(inputEl, ref, callback){\n    let file = this.activeFiles(inputEl).find(file => this.genFileRef(file) === ref)\n    callback(URL.createObjectURL(file))\n  }\n\n  static hasUploadsInProgress(formEl){\n    let active = 0\n    DOM.findUploadInputs(formEl).forEach(input => {\n      if(input.getAttribute(PHX_PREFLIGHTED_REFS) !== input.getAttribute(PHX_DONE_REFS)){\n        active++\n      }\n    })\n    return active > 0\n  }\n\n  static serializeUploads(inputEl){\n    let files = this.activeFiles(inputEl)\n    let fileData = {}\n    files.forEach(file => {\n      let entry = {path: inputEl.name}\n      let uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF)\n      fileData[uploadRef] = fileData[uploadRef] || []\n      entry.ref = this.genFileRef(file)\n      entry.last_modified = file.lastModified\n      entry.name = file.name || entry.ref\n      entry.relative_path = file.webkitRelativePath\n      entry.type = file.type\n      entry.size = file.size\n      if(typeof(file.meta) === \"function\"){ entry.meta = file.meta() }\n      fileData[uploadRef].push(entry)\n    })\n    return fileData\n  }\n\n  static clearFiles(inputEl){\n    inputEl.value = null\n    inputEl.removeAttribute(PHX_UPLOAD_REF)\n    DOM.putPrivate(inputEl, \"files\", [])\n  }\n\n  static untrackFile(inputEl, file){\n    DOM.putPrivate(inputEl, \"files\", DOM.private(inputEl, \"files\").filter(f => !Object.is(f, file)))\n  }\n\n  static trackFiles(inputEl, files, dataTransfer){\n    if(inputEl.getAttribute(\"multiple\") !== null){\n      let newFiles = files.filter(file => !this.activeFiles(inputEl).find(f => Object.is(f, file)))\n      DOM.updatePrivate(inputEl, \"files\", [], (existing) => existing.concat(newFiles))\n      inputEl.value = null\n    } else {\n      // Reset inputEl files to align output with programmatic changes (i.e. drag and drop)\n      if(dataTransfer && dataTransfer.files.length > 0){ inputEl.files = dataTransfer.files }\n      DOM.putPrivate(inputEl, \"files\", files)\n    }\n  }\n\n  static activeFileInputs(formEl){\n    let fileInputs = DOM.findUploadInputs(formEl)\n    return Array.from(fileInputs).filter(el => el.files && this.activeFiles(el).length > 0)\n  }\n\n  static activeFiles(input){\n    return (DOM.private(input, \"files\") || []).filter(f => UploadEntry.isActive(input, f))\n  }\n\n  static inputsAwaitingPreflight(formEl){\n    let fileInputs = DOM.findUploadInputs(formEl)\n    return Array.from(fileInputs).filter(input => this.filesAwaitingPreflight(input).length > 0)\n  }\n\n  static filesAwaitingPreflight(input){\n    return this.activeFiles(input).filter(f => !UploadEntry.isPreflighted(input, f) && !UploadEntry.isPreflightInProgress(f))\n  }\n\n  static markPreflightInProgress(entries){\n    entries.forEach(entry => UploadEntry.markPreflightInProgress(entry.file))\n  }\n\n  constructor(inputEl, view, onComplete){\n    this.autoUpload = DOM.isAutoUpload(inputEl)\n    this.view = view\n    this.onComplete = onComplete\n    this._entries =\n      Array.from(LiveUploader.filesAwaitingPreflight(inputEl) || [])\n        .map(file => new UploadEntry(inputEl, file, view, this.autoUpload))\n\n    // prevent sending duplicate preflight requests\n    LiveUploader.markPreflightInProgress(this._entries)\n\n    this.numEntriesInProgress = this._entries.length\n  }\n\n  isAutoUpload(){ return this.autoUpload }\n\n  entries(){ return this._entries }\n\n  initAdapterUpload(resp, onError, liveSocket){\n    this._entries =\n      this._entries.map(entry => {\n        if(entry.isCancelled()){\n          this.numEntriesInProgress--\n          if(this.numEntriesInProgress === 0){ this.onComplete() }\n        } else {\n          entry.zipPostFlight(resp)\n          entry.onDone(() => {\n            this.numEntriesInProgress--\n            if(this.numEntriesInProgress === 0){ this.onComplete() }\n          })\n        }\n        return entry\n      })\n\n    let groupedEntries = this._entries.reduce((acc, entry) => {\n      if(!entry.meta){ return acc }\n      let {name, callback} = entry.uploader(liveSocket.uploaders)\n      acc[name] = acc[name] || {callback: callback, entries: []}\n      acc[name].entries.push(entry)\n      return acc\n    }, {})\n\n    for(let name in groupedEntries){\n      let {callback, entries} = groupedEntries[name]\n      callback(entries, onError, resp, liveSocket)\n    }\n  }\n}\n", "let ARIA = {\n  anyOf(instance, classes){ return classes.find(name => instance instanceof name) },\n\n  isFocusable(el, interactiveOnly){\n    return (\n      (el instanceof HTMLAnchorElement && el.rel !== \"ignore\") ||\n      (el instanceof HTMLAreaElement && el.href !== undefined) ||\n      (!el.disabled && (this.anyOf(el, [HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, HTMLButtonElement]))) ||\n      (el instanceof HTMLIFrameElement) ||\n      (el.tabIndex > 0 || (!interactiveOnly && el.getAttribute(\"tabindex\") !== null && el.getAttribute(\"aria-hidden\") !== \"true\"))\n    )\n  },\n\n  attemptFocus(el, interactiveOnly){\n    if(this.isFocusable(el, interactiveOnly)){ try { el.focus() } catch {} }\n    return !!document.activeElement && document.activeElement.isSameNode(el)\n  },\n\n  focusFirstInteractive(el){\n    let child = el.firstElementChild\n    while(child){\n      if(this.attemptFocus(child, true) || this.focusFirstInteractive(child, true)){\n        return true\n      }\n      child = child.nextElementSibling\n    }\n  },\n\n  focusFirst(el){\n    let child = el.firstElementChild\n    while(child){\n      if(this.attemptFocus(child) || this.focusFirst(child)){\n        return true\n      }\n      child = child.nextElementSibling\n    }\n  },\n\n  focusLast(el){\n    let child = el.lastElementChild\n    while(child){\n      if(this.attemptFocus(child) || this.focusLast(child)){\n        return true\n      }\n      child = child.previousElementSibling\n    }\n  }\n}\nexport default ARIA\n", "import {\n  PHX_ACTIVE_ENTRY_REFS,\n  PHX_LIVE_FILE_UPDATED,\n  PHX_PREFLIGHTED_REFS,\n  PHX_UPLOAD_REF\n} from \"./constants\"\n\nimport LiveUploader from \"./live_uploader\"\nimport ARIA from \"./aria\"\n\nlet Hooks = {\n  LiveFileUpload: {\n    activeRefs(){ return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS) },\n\n    preflightedRefs(){ return this.el.getAttribute(PHX_PREFLIGHTED_REFS) },\n\n    mounted(){ this.preflightedWas = this.preflightedRefs() },\n\n    updated(){\n      let newPreflights = this.preflightedRefs()\n      if(this.preflightedWas !== newPreflights){\n        this.preflightedWas = newPreflights\n        if(newPreflights === \"\"){\n          this.__view().cancelSubmit(this.el.form)\n        }\n      }\n\n      if(this.activeRefs() === \"\"){ this.el.value = null }\n      this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED))\n    }\n  },\n\n  LiveImgPreview: {\n    mounted(){\n      this.ref = this.el.getAttribute(\"data-phx-entry-ref\")\n      this.inputEl = document.getElementById(this.el.getAttribute(PHX_UPLOAD_REF))\n      LiveUploader.getEntryDataURL(this.inputEl, this.ref, url => {\n        this.url = url\n        this.el.src = url\n      })\n    },\n    destroyed(){\n      URL.revokeObjectURL(this.url)\n    }\n  },\n  FocusWrap: {\n    mounted(){\n      this.focusStart = this.el.firstElementChild\n      this.focusEnd = this.el.lastElementChild\n      this.focusStart.addEventListener(\"focus\", () => ARIA.focusLast(this.el))\n      this.focusEnd.addEventListener(\"focus\", () => ARIA.focusFirst(this.el))\n      this.el.addEventListener(\"phx:show-end\", () => this.el.focus())\n      if(window.getComputedStyle(this.el).display !== \"none\"){\n        ARIA.focusFirst(this.el)\n      }\n    }\n  }\n}\n\nlet findScrollContainer = (el) => {\n  // the scroll event won't be fired on the html/body element even if overflow is set\n  // therefore we return null to instead listen for scroll events on document\n  if([\"HTML\", \"BODY\"].indexOf(el.nodeName.toUpperCase()) >= 0) return null\n  if([\"scroll\", \"auto\"].indexOf(getComputedStyle(el).overflowY) >= 0) return el\n  return findScrollContainer(el.parentElement)\n}\n\nlet scrollTop = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.scrollTop\n  } else {\n    return document.documentElement.scrollTop || document.body.scrollTop\n  }\n}\n\nlet bottom = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.getBoundingClientRect().bottom\n  } else {\n    // when we have no container, the whole page scrolls,\n    // therefore the bottom coordinate is the viewport height\n    return window.innerHeight || document.documentElement.clientHeight\n  }\n}\n\nlet top = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.getBoundingClientRect().top\n  } else {\n    // when we have no container the whole page scrolls,\n    // therefore the top coordinate is 0\n    return 0\n  }\n}\n\nlet isAtViewportTop = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer)\n}\n\nlet isAtViewportBottom = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.bottom) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.bottom) <= bottom(scrollContainer)\n}\n\nlet isWithinViewport = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer)\n}\n\nHooks.InfiniteScroll = {\n  mounted(){\n    this.scrollContainer = findScrollContainer(this.el)\n    let scrollBefore = scrollTop(this.scrollContainer)\n    let topOverran = false\n    let throttleInterval = 500\n    let pendingOp = null\n\n    let onTopOverrun = this.throttle(throttleInterval, (topEvent, firstChild) => {\n      pendingOp = () => true\n      this.liveSocket.execJSHookPush(this.el, topEvent, {id: firstChild.id, _overran: true}, () => {\n        pendingOp = null\n      })\n    })\n\n    let onFirstChildAtTop = this.throttle(throttleInterval, (topEvent, firstChild) => {\n      pendingOp = () => firstChild.scrollIntoView({block: \"start\"})\n      this.liveSocket.execJSHookPush(this.el, topEvent, {id: firstChild.id}, () => {\n        pendingOp = null\n        // make sure that the DOM is patched by waiting for the next tick\n        window.requestAnimationFrame(() => {\n          if(!isWithinViewport(firstChild, this.scrollContainer)){\n            firstChild.scrollIntoView({block: \"start\"})\n          }\n        })\n      })\n    })\n\n    let onLastChildAtBottom = this.throttle(throttleInterval, (bottomEvent, lastChild) => {\n      pendingOp = () => lastChild.scrollIntoView({block: \"end\"})\n      this.liveSocket.execJSHookPush(this.el, bottomEvent, {id: lastChild.id}, () => {\n        pendingOp = null\n        // make sure that the DOM is patched by waiting for the next tick\n        window.requestAnimationFrame(() => {\n          if(!isWithinViewport(lastChild, this.scrollContainer)){\n            lastChild.scrollIntoView({block: \"end\"})\n          }\n        })\n      })\n    })\n\n    this.onScroll = (_e) => {\n      let scrollNow = scrollTop(this.scrollContainer)\n\n      if(pendingOp){\n        scrollBefore = scrollNow\n        return pendingOp()\n      }\n      let rect = this.el.getBoundingClientRect()\n      let topEvent = this.el.getAttribute(this.liveSocket.binding(\"viewport-top\"))\n      let bottomEvent = this.el.getAttribute(this.liveSocket.binding(\"viewport-bottom\"))\n      let lastChild = this.el.lastElementChild\n      let firstChild = this.el.firstElementChild\n      let isScrollingUp = scrollNow < scrollBefore\n      let isScrollingDown = scrollNow > scrollBefore\n\n      // el overran while scrolling up\n      if(isScrollingUp && topEvent && !topOverran && rect.top >= 0){\n        topOverran = true\n        onTopOverrun(topEvent, firstChild)\n      } else if(isScrollingDown && topOverran && rect.top <= 0){\n        topOverran = false\n      }\n\n      if(topEvent && isScrollingUp && isAtViewportTop(firstChild, this.scrollContainer)){\n        onFirstChildAtTop(topEvent, firstChild)\n      } else if(bottomEvent && isScrollingDown && isAtViewportBottom(lastChild, this.scrollContainer)){\n        onLastChildAtBottom(bottomEvent, lastChild)\n      }\n      scrollBefore = scrollNow\n    }\n\n    if(this.scrollContainer){\n      this.scrollContainer.addEventListener(\"scroll\", this.onScroll)\n    } else {\n      window.addEventListener(\"scroll\", this.onScroll)\n    }\n  },\n  \n  destroyed(){\n    if(this.scrollContainer){\n      this.scrollContainer.removeEventListener(\"scroll\", this.onScroll)\n    } else {\n      window.removeEventListener(\"scroll\", this.onScroll)\n    }\n  },\n\n  throttle(interval, callback){\n    let lastCallAt = 0\n    let timer\n\n    return (...args) => {\n      let now = Date.now()\n      let remainingTime = interval - (now - lastCallAt)\n\n      if(remainingTime <= 0 || remainingTime > interval){\n        if(timer){\n          clearTimeout(timer)\n          timer = null\n        }\n        lastCallAt = now\n        callback(...args)\n      } else if(!timer){\n        timer = setTimeout(() => {\n          lastCallAt = Date.now()\n          timer = null\n          callback(...args)\n        }, remainingTime)\n      }\n    }\n  }\n}\nexport default Hooks\n", "import {\n  PHX_REF_LOADING,\n  PHX_REF_LOCK,\n  PHX_REF_SRC,\n  PHX_EVENT_CLASSES,\n  PHX_DISABLED,\n  PHX_READONLY,\n  PHX_DISABLE_WITH_RESTORE\n} from \"./constants\"\n\nimport DOM from \"./dom\"\n\nexport default class ElementRef {\n  constructor(el){\n    this.el = el\n    this.loadingRef = el.hasAttribute(PHX_REF_LOADING) ? parseInt(el.getAttribute(PHX_REF_LOADING), 10) : null\n    this.lockRef = el.hasAttribute(PHX_REF_LOCK) ? parseInt(el.getAttribute(PHX_REF_LOCK), 10) : null\n  }\n\n  // public\n\n  maybeUndo(ref, phxEvent, eachCloneCallback){\n    if(!this.isWithin(ref)){ return }\n\n    // undo locks and apply clones\n    this.undoLocks(ref, phxEvent, eachCloneCallback)\n\n    // undo loading states\n    this.undoLoading(ref, phxEvent)\n\n    // clean up if fully resolved\n    if(this.isFullyResolvedBy(ref)){ this.el.removeAttribute(PHX_REF_SRC) }\n  }\n\n  // private\n\n  isWithin(ref){\n    return !((this.loadingRef !== null && this.loadingRef > ref) && (this.lockRef !== null && this.lockRef > ref))\n  }\n\n  // Check for cloned PHX_REF_LOCK element that has been morphed behind\n  // the scenes while this element was locked in the DOM.\n  // When we apply the cloned tree to the active DOM element, we must\n  //\n  //   1. execute pending mounted hooks for nodes now in the DOM\n  //   2. undo any ref inside the cloned tree that has since been ack'd\n  undoLocks(ref, phxEvent, eachCloneCallback){\n    if(!this.isLockUndoneBy(ref)){ return }\n\n    let clonedTree = DOM.private(this.el, PHX_REF_LOCK)\n    if(clonedTree){\n      eachCloneCallback(clonedTree)\n      DOM.deletePrivate(this.el, PHX_REF_LOCK)\n    }\n    this.el.removeAttribute(PHX_REF_LOCK)\n\n    let opts = {detail: {ref: ref, event: phxEvent}, bubbles: true, cancelable: false}\n    this.el.dispatchEvent(new CustomEvent(`phx:undo-lock:${this.lockRef}`, opts))\n  }\n\n  undoLoading(ref, phxEvent){\n    if(!this.isLoadingUndoneBy(ref)){\n      if(this.canUndoLoading(ref) && this.el.classList.contains(\"phx-submit-loading\")){\n        this.el.classList.remove(\"phx-change-loading\")\n      }\n      return\n    }\n\n    if(this.canUndoLoading(ref)){\n      this.el.removeAttribute(PHX_REF_LOADING)\n      let disabledVal = this.el.getAttribute(PHX_DISABLED)\n      let readOnlyVal = this.el.getAttribute(PHX_READONLY)\n      // restore inputs\n      if(readOnlyVal !== null){\n        this.el.readOnly = readOnlyVal === \"true\" ? true : false\n        this.el.removeAttribute(PHX_READONLY)\n      }\n      if(disabledVal !== null){\n        this.el.disabled = disabledVal === \"true\" ? true : false\n        this.el.removeAttribute(PHX_DISABLED)\n      }\n      // restore disables\n      let disableRestore = this.el.getAttribute(PHX_DISABLE_WITH_RESTORE)\n      if(disableRestore !== null){\n        this.el.innerText = disableRestore\n        this.el.removeAttribute(PHX_DISABLE_WITH_RESTORE)\n      }\n\n      let opts = {detail: {ref: ref, event: phxEvent}, bubbles: true, cancelable: false}\n      this.el.dispatchEvent(new CustomEvent(`phx:undo-loading:${this.loadingRef}`, opts))\n    }\n\n    // remove classes\n    PHX_EVENT_CLASSES.forEach(name => {\n      if(name !== \"phx-submit-loading\" || this.canUndoLoading(ref)){\n        DOM.removeClass(this.el, name)\n      }\n    })\n  }\n\n  isLoadingUndoneBy(ref){ return this.loadingRef === null ? false : this.loadingRef <= ref }\n  isLockUndoneBy(ref){ return this.lockRef === null ? false : this.lockRef <= ref }\n\n  isFullyResolvedBy(ref){\n    return (this.loadingRef === null || this.loadingRef <= ref) && (this.lockRef === null || this.lockRef <= ref)\n  }\n\n  // only remove the phx-submit-loading class if we are not locked\n  canUndoLoading(ref){ return this.lockRef === null || this.lockRef <= ref }\n}\n", "import {\n  maybe\n} from \"./utils\"\n\nimport DOM from \"./dom\"\n\nexport default class DOMPostMorphRestorer {\n  constructor(containerBefore, containerAfter, updateType){\n    let idsBefore = new Set()\n    let idsAfter = new Set([...containerAfter.children].map(child => child.id))\n\n    let elementsToModify = []\n\n    Array.from(containerBefore.children).forEach(child => {\n      if(child.id){ // all of our children should be elements with ids\n        idsBefore.add(child.id)\n        if(idsAfter.has(child.id)){\n          let previousElementId = child.previousElementSibling && child.previousElementSibling.id\n          elementsToModify.push({elementId: child.id, previousElementId: previousElementId})\n        }\n      }\n    })\n\n    this.containerId = containerAfter.id\n    this.updateType = updateType\n    this.elementsToModify = elementsToModify\n    this.elementIdsToAdd = [...idsAfter].filter(id => !idsBefore.has(id))\n  }\n\n  // We do the following to optimize append/prepend operations:\n  //   1) Track ids of modified elements & of new elements\n  //   2) All the modified elements are put back in the correct position in the DOM tree\n  //      by storing the id of their previous sibling\n  //   3) New elements are going to be put in the right place by morphdom during append.\n  //      For prepend, we move them to the first position in the container\n  perform(){\n    let container = DOM.byId(this.containerId)\n    this.elementsToModify.forEach(elementToModify => {\n      if(elementToModify.previousElementId){\n        maybe(document.getElementById(elementToModify.previousElementId), previousElem => {\n          maybe(document.getElementById(elementToModify.elementId), elem => {\n            let isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id\n            if(!isInRightPlace){\n              previousElem.insertAdjacentElement(\"afterend\", elem)\n            }\n          })\n        })\n      } else {\n        // This is the first element in the container\n        maybe(document.getElementById(elementToModify.elementId), elem => {\n          let isInRightPlace = elem.previousElementSibling == null\n          if(!isInRightPlace){\n            container.insertAdjacentElement(\"afterbegin\", elem)\n          }\n        })\n      }\n    })\n\n    if(this.updateType == \"prepend\"){\n      this.elementIdsToAdd.reverse().forEach(elemId => {\n        maybe(document.getElementById(elemId), elem => container.insertAdjacentElement(\"afterbegin\", elem))\n      })\n    }\n  }\n}\n", "var DOCUMENT_FRAGMENT_NODE = 11;\n\nfunction morphAttrs(fromNode, toNode) {\n    var toNodeAttrs = toNode.attributes;\n    var attr;\n    var attrName;\n    var attrNamespaceURI;\n    var attrValue;\n    var fromValue;\n\n    // document-fragments dont have attributes so lets not do anything\n    if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n      return;\n    }\n\n    // update attributes on original DOM element\n    for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n        attr = toNodeAttrs[i];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n        attrValue = attr.value;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n            fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n\n            if (fromValue !== attrValue) {\n                if (attr.prefix === 'xmlns'){\n                    attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix\n                }\n                fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n            }\n        } else {\n            fromValue = fromNode.getAttribute(attrName);\n\n            if (fromValue !== attrValue) {\n                fromNode.setAttribute(attrName, attrValue);\n            }\n        }\n    }\n\n    // Remove any extra attributes found on the original DOM element that\n    // weren't found on the target element.\n    var fromNodeAttrs = fromNode.attributes;\n\n    for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n        attr = fromNodeAttrs[d];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n\n            if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n                fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n            }\n        } else {\n            if (!toNode.hasAttribute(attrName)) {\n                fromNode.removeAttribute(attrName);\n            }\n        }\n    }\n}\n\nvar range; // Create a range object for efficently rendering strings to elements.\nvar NS_XHTML = 'http://www.w3.org/1999/xhtml';\n\nvar doc = typeof document === 'undefined' ? undefined : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();\n\nfunction createFragmentFromTemplate(str) {\n    var template = doc.createElement('template');\n    template.innerHTML = str;\n    return template.content.childNodes[0];\n}\n\nfunction createFragmentFromRange(str) {\n    if (!range) {\n        range = doc.createRange();\n        range.selectNode(doc.body);\n    }\n\n    var fragment = range.createContextualFragment(str);\n    return fragment.childNodes[0];\n}\n\nfunction createFragmentFromWrap(str) {\n    var fragment = doc.createElement('body');\n    fragment.innerHTML = str;\n    return fragment.childNodes[0];\n}\n\n/**\n * This is about the same\n * var html = new DOMParser().parseFromString(str, 'text/html');\n * return html.body.firstChild;\n *\n * @method toElement\n * @param {String} str\n */\nfunction toElement(str) {\n    str = str.trim();\n    if (HAS_TEMPLATE_SUPPORT) {\n      // avoid restrictions on content for things like `<tr><th>Hi</th></tr>` which\n      // createContextualFragment doesn't support\n      // <template> support not available in IE\n      return createFragmentFromTemplate(str);\n    } else if (HAS_RANGE_SUPPORT) {\n      return createFragmentFromRange(str);\n    }\n\n    return createFragmentFromWrap(str);\n}\n\n/**\n * Returns true if two node's names are the same.\n *\n * NOTE: We don't bother checking `namespaceURI` because you will never find two HTML elements with the same\n *       nodeName and different namespace URIs.\n *\n * @param {Element} a\n * @param {Element} b The target element\n * @return {boolean}\n */\nfunction compareNodeNames(fromEl, toEl) {\n    var fromNodeName = fromEl.nodeName;\n    var toNodeName = toEl.nodeName;\n    var fromCodeStart, toCodeStart;\n\n    if (fromNodeName === toNodeName) {\n        return true;\n    }\n\n    fromCodeStart = fromNodeName.charCodeAt(0);\n    toCodeStart = toNodeName.charCodeAt(0);\n\n    // If the target element is a virtual DOM node or SVG node then we may\n    // need to normalize the tag name before comparing. Normal HTML elements that are\n    // in the \"http://www.w3.org/1999/xhtml\"\n    // are converted to upper case\n    if (fromCodeStart <= 90 && toCodeStart >= 97) { // from is upper and to is lower\n        return fromNodeName === toNodeName.toUpperCase();\n    } else if (toCodeStart <= 90 && fromCodeStart >= 97) { // to is upper and from is lower\n        return toNodeName === fromNodeName.toUpperCase();\n    } else {\n        return false;\n    }\n}\n\n/**\n * Create an element, optionally with a known namespace URI.\n *\n * @param {string} name the element name, e.g. 'div' or 'svg'\n * @param {string} [namespaceURI] the element's namespace URI, i.e. the value of\n * its `xmlns` attribute or its inferred namespace.\n *\n * @return {Element}\n */\nfunction createElementNS(name, namespaceURI) {\n    return !namespaceURI || namespaceURI === NS_XHTML ?\n        doc.createElement(name) :\n        doc.createElementNS(namespaceURI, name);\n}\n\n/**\n * Copies the children of one DOM element to another DOM element\n */\nfunction moveChildren(fromEl, toEl) {\n    var curChild = fromEl.firstChild;\n    while (curChild) {\n        var nextChild = curChild.nextSibling;\n        toEl.appendChild(curChild);\n        curChild = nextChild;\n    }\n    return toEl;\n}\n\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n    if (fromEl[name] !== toEl[name]) {\n        fromEl[name] = toEl[name];\n        if (fromEl[name]) {\n            fromEl.setAttribute(name, '');\n        } else {\n            fromEl.removeAttribute(name);\n        }\n    }\n}\n\nvar specialElHandlers = {\n    OPTION: function(fromEl, toEl) {\n        var parentNode = fromEl.parentNode;\n        if (parentNode) {\n            var parentName = parentNode.nodeName.toUpperCase();\n            if (parentName === 'OPTGROUP') {\n                parentNode = parentNode.parentNode;\n                parentName = parentNode && parentNode.nodeName.toUpperCase();\n            }\n            if (parentName === 'SELECT' && !parentNode.hasAttribute('multiple')) {\n                if (fromEl.hasAttribute('selected') && !toEl.selected) {\n                    // Workaround for MS Edge bug where the 'selected' attribute can only be\n                    // removed if set to a non-empty value:\n                    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12087679/\n                    fromEl.setAttribute('selected', 'selected');\n                    fromEl.removeAttribute('selected');\n                }\n                // We have to reset select element's selectedIndex to -1, otherwise setting\n                // fromEl.selected using the syncBooleanAttrProp below has no effect.\n                // The correct selectedIndex will be set in the SELECT special handler below.\n                parentNode.selectedIndex = -1;\n            }\n        }\n        syncBooleanAttrProp(fromEl, toEl, 'selected');\n    },\n    /**\n     * The \"value\" attribute is special for the <input> element since it sets\n     * the initial value. Changing the \"value\" attribute without changing the\n     * \"value\" property will have no effect since it is only used to the set the\n     * initial value.  Similar for the \"checked\" attribute, and \"disabled\".\n     */\n    INPUT: function(fromEl, toEl) {\n        syncBooleanAttrProp(fromEl, toEl, 'checked');\n        syncBooleanAttrProp(fromEl, toEl, 'disabled');\n\n        if (fromEl.value !== toEl.value) {\n            fromEl.value = toEl.value;\n        }\n\n        if (!toEl.hasAttribute('value')) {\n            fromEl.removeAttribute('value');\n        }\n    },\n\n    TEXTAREA: function(fromEl, toEl) {\n        var newValue = toEl.value;\n        if (fromEl.value !== newValue) {\n            fromEl.value = newValue;\n        }\n\n        var firstChild = fromEl.firstChild;\n        if (firstChild) {\n            // Needed for IE. Apparently IE sets the placeholder as the\n            // node value and vise versa. This ignores an empty update.\n            var oldValue = firstChild.nodeValue;\n\n            if (oldValue == newValue || (!newValue && oldValue == fromEl.placeholder)) {\n                return;\n            }\n\n            firstChild.nodeValue = newValue;\n        }\n    },\n    SELECT: function(fromEl, toEl) {\n        if (!toEl.hasAttribute('multiple')) {\n            var selectedIndex = -1;\n            var i = 0;\n            // We have to loop through children of fromEl, not toEl since nodes can be moved\n            // from toEl to fromEl directly when morphing.\n            // At the time this special handler is invoked, all children have already been morphed\n            // and appended to / removed from fromEl, so using fromEl here is safe and correct.\n            var curChild = fromEl.firstChild;\n            var optgroup;\n            var nodeName;\n            while(curChild) {\n                nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n                if (nodeName === 'OPTGROUP') {\n                    optgroup = curChild;\n                    curChild = optgroup.firstChild;\n                } else {\n                    if (nodeName === 'OPTION') {\n                        if (curChild.hasAttribute('selected')) {\n                            selectedIndex = i;\n                            break;\n                        }\n                        i++;\n                    }\n                    curChild = curChild.nextSibling;\n                    if (!curChild && optgroup) {\n                        curChild = optgroup.nextSibling;\n                        optgroup = null;\n                    }\n                }\n            }\n\n            fromEl.selectedIndex = selectedIndex;\n        }\n    }\n};\n\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\n\nfunction noop() {}\n\nfunction defaultGetNodeKey(node) {\n  if (node) {\n    return (node.getAttribute && node.getAttribute('id')) || node.id;\n  }\n}\n\nfunction morphdomFactory(morphAttrs) {\n\n  return function morphdom(fromNode, toNode, options) {\n    if (!options) {\n      options = {};\n    }\n\n    if (typeof toNode === 'string') {\n      if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML' || fromNode.nodeName === 'BODY') {\n        var toNodeHtml = toNode;\n        toNode = doc.createElement('html');\n        toNode.innerHTML = toNodeHtml;\n      } else {\n        toNode = toElement(toNode);\n      }\n    } else if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n      toNode = toNode.firstElementChild;\n    }\n\n    var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n    var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n    var onNodeAdded = options.onNodeAdded || noop;\n    var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n    var onElUpdated = options.onElUpdated || noop;\n    var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n    var onNodeDiscarded = options.onNodeDiscarded || noop;\n    var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n    var skipFromChildren = options.skipFromChildren || noop;\n    var addChild = options.addChild || function(parent, child){ return parent.appendChild(child); };\n    var childrenOnly = options.childrenOnly === true;\n\n    // This object is used as a lookup to quickly find all keyed elements in the original DOM tree.\n    var fromNodesLookup = Object.create(null);\n    var keyedRemovalList = [];\n\n    function addKeyedRemoval(key) {\n      keyedRemovalList.push(key);\n    }\n\n    function walkDiscardedChildNodes(node, skipKeyedNodes) {\n      if (node.nodeType === ELEMENT_NODE) {\n        var curChild = node.firstChild;\n        while (curChild) {\n\n          var key = undefined;\n\n          if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n            // If we are skipping keyed nodes then we add the key\n            // to a list so that it can be handled at the very end.\n            addKeyedRemoval(key);\n          } else {\n            // Only report the node as discarded if it is not keyed. We do this because\n            // at the end we loop through all keyed elements that were unmatched\n            // and then discard them in one final pass.\n            onNodeDiscarded(curChild);\n            if (curChild.firstChild) {\n              walkDiscardedChildNodes(curChild, skipKeyedNodes);\n            }\n          }\n\n          curChild = curChild.nextSibling;\n        }\n      }\n    }\n\n    /**\n    * Removes a DOM node out of the original DOM\n    *\n    * @param  {Node} node The node to remove\n    * @param  {Node} parentNode The nodes parent\n    * @param  {Boolean} skipKeyedNodes If true then elements with keys will be skipped and not discarded.\n    * @return {undefined}\n    */\n    function removeNode(node, parentNode, skipKeyedNodes) {\n      if (onBeforeNodeDiscarded(node) === false) {\n        return;\n      }\n\n      if (parentNode) {\n        parentNode.removeChild(node);\n      }\n\n      onNodeDiscarded(node);\n      walkDiscardedChildNodes(node, skipKeyedNodes);\n    }\n\n    // // TreeWalker implementation is no faster, but keeping this around in case this changes in the future\n    // function indexTree(root) {\n    //     var treeWalker = document.createTreeWalker(\n    //         root,\n    //         NodeFilter.SHOW_ELEMENT);\n    //\n    //     var el;\n    //     while((el = treeWalker.nextNode())) {\n    //         var key = getNodeKey(el);\n    //         if (key) {\n    //             fromNodesLookup[key] = el;\n    //         }\n    //     }\n    // }\n\n    // // NodeIterator implementation is no faster, but keeping this around in case this changes in the future\n    //\n    // function indexTree(node) {\n    //     var nodeIterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT);\n    //     var el;\n    //     while((el = nodeIterator.nextNode())) {\n    //         var key = getNodeKey(el);\n    //         if (key) {\n    //             fromNodesLookup[key] = el;\n    //         }\n    //     }\n    // }\n\n    function indexTree(node) {\n      if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n        var curChild = node.firstChild;\n        while (curChild) {\n          var key = getNodeKey(curChild);\n          if (key) {\n            fromNodesLookup[key] = curChild;\n          }\n\n          // Walk recursively\n          indexTree(curChild);\n\n          curChild = curChild.nextSibling;\n        }\n      }\n    }\n\n    indexTree(fromNode);\n\n    function handleNodeAdded(el) {\n      onNodeAdded(el);\n\n      var curChild = el.firstChild;\n      while (curChild) {\n        var nextSibling = curChild.nextSibling;\n\n        var key = getNodeKey(curChild);\n        if (key) {\n          var unmatchedFromEl = fromNodesLookup[key];\n          // if we find a duplicate #id node in cache, replace `el` with cache value\n          // and morph it to the child node.\n          if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n            curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n            morphEl(unmatchedFromEl, curChild);\n          } else {\n            handleNodeAdded(curChild);\n          }\n        } else {\n          // recursively call for curChild and it's children to see if we find something in\n          // fromNodesLookup\n          handleNodeAdded(curChild);\n        }\n\n        curChild = nextSibling;\n      }\n    }\n\n    function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n      // We have processed all of the \"to nodes\". If curFromNodeChild is\n      // non-null then we still have some from nodes left over that need\n      // to be removed\n      while (curFromNodeChild) {\n        var fromNextSibling = curFromNodeChild.nextSibling;\n        if ((curFromNodeKey = getNodeKey(curFromNodeChild))) {\n          // Since the node is keyed it might be matched up later so we defer\n          // the actual removal to later\n          addKeyedRemoval(curFromNodeKey);\n        } else {\n          // NOTE: we skip nested keyed nodes from being removed since there is\n          //       still a chance they will be matched up later\n          removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n        }\n        curFromNodeChild = fromNextSibling;\n      }\n    }\n\n    function morphEl(fromEl, toEl, childrenOnly) {\n      var toElKey = getNodeKey(toEl);\n\n      if (toElKey) {\n        // If an element with an ID is being morphed then it will be in the final\n        // DOM so clear it out of the saved elements collection\n        delete fromNodesLookup[toElKey];\n      }\n\n      if (!childrenOnly) {\n        // optional\n        var beforeUpdateResult = onBeforeElUpdated(fromEl, toEl);\n        if (beforeUpdateResult === false) {\n          return;\n        } else if (beforeUpdateResult instanceof HTMLElement) {\n          fromEl = beforeUpdateResult;\n          // reindex the new fromEl in case it's not in the same\n          // tree as the original fromEl\n          // (Phoenix LiveView sometimes returns a cloned tree,\n          //  but keyed lookups would still point to the original tree)\n          indexTree(fromEl);\n        }\n\n        // update attributes on original DOM element first\n        morphAttrs(fromEl, toEl);\n        // optional\n        onElUpdated(fromEl);\n\n        if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n          return;\n        }\n      }\n\n      if (fromEl.nodeName !== 'TEXTAREA') {\n        morphChildren(fromEl, toEl);\n      } else {\n        specialElHandlers.TEXTAREA(fromEl, toEl);\n      }\n    }\n\n    function morphChildren(fromEl, toEl) {\n      var skipFrom = skipFromChildren(fromEl, toEl);\n      var curToNodeChild = toEl.firstChild;\n      var curFromNodeChild = fromEl.firstChild;\n      var curToNodeKey;\n      var curFromNodeKey;\n\n      var fromNextSibling;\n      var toNextSibling;\n      var matchingFromEl;\n\n      // walk the children\n      outer: while (curToNodeChild) {\n        toNextSibling = curToNodeChild.nextSibling;\n        curToNodeKey = getNodeKey(curToNodeChild);\n\n        // walk the fromNode children all the way through\n        while (!skipFrom && curFromNodeChild) {\n          fromNextSibling = curFromNodeChild.nextSibling;\n\n          if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n            curToNodeChild = toNextSibling;\n            curFromNodeChild = fromNextSibling;\n            continue outer;\n          }\n\n          curFromNodeKey = getNodeKey(curFromNodeChild);\n\n          var curFromNodeType = curFromNodeChild.nodeType;\n\n          // this means if the curFromNodeChild doesnt have a match with the curToNodeChild\n          var isCompatible = undefined;\n\n          if (curFromNodeType === curToNodeChild.nodeType) {\n            if (curFromNodeType === ELEMENT_NODE) {\n              // Both nodes being compared are Element nodes\n\n              if (curToNodeKey) {\n                // The target node has a key so we want to match it up with the correct element\n                // in the original DOM tree\n                if (curToNodeKey !== curFromNodeKey) {\n                  // The current element in the original DOM tree does not have a matching key so\n                  // let's check our lookup to see if there is a matching element in the original\n                  // DOM tree\n                  if ((matchingFromEl = fromNodesLookup[curToNodeKey])) {\n                    if (fromNextSibling === matchingFromEl) {\n                      // Special case for single element removals. To avoid removing the original\n                      // DOM node out of the tree (since that can break CSS transitions, etc.),\n                      // we will instead discard the current node and wait until the next\n                      // iteration to properly match up the keyed target element with its matching\n                      // element in the original tree\n                      isCompatible = false;\n                    } else {\n                      // We found a matching keyed element somewhere in the original DOM tree.\n                      // Let's move the original DOM node into the current position and morph\n                      // it.\n\n                      // NOTE: We use insertBefore instead of replaceChild because we want to go through\n                      // the `removeNode()` function for the node that is being discarded so that\n                      // all lifecycle hooks are correctly invoked\n                      fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n\n                      // fromNextSibling = curFromNodeChild.nextSibling;\n\n                      if (curFromNodeKey) {\n                        // Since the node is keyed it might be matched up later so we defer\n                        // the actual removal to later\n                        addKeyedRemoval(curFromNodeKey);\n                      } else {\n                        // NOTE: we skip nested keyed nodes from being removed since there is\n                        //       still a chance they will be matched up later\n                        removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n                      }\n\n                      curFromNodeChild = matchingFromEl;\n                      curFromNodeKey = getNodeKey(curFromNodeChild);\n                    }\n                  } else {\n                    // The nodes are not compatible since the \"to\" node has a key and there\n                    // is no matching keyed node in the source tree\n                    isCompatible = false;\n                  }\n                }\n              } else if (curFromNodeKey) {\n                // The original has a key\n                isCompatible = false;\n              }\n\n              isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n              if (isCompatible) {\n                // We found compatible DOM elements so transform\n                // the current \"from\" node to match the current\n                // target DOM node.\n                // MORPH\n                morphEl(curFromNodeChild, curToNodeChild);\n              }\n\n            } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n              // Both nodes being compared are Text or Comment nodes\n              isCompatible = true;\n              // Simply update nodeValue on the original node to\n              // change the text value\n              if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n                curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n              }\n\n            }\n          }\n\n          if (isCompatible) {\n            // Advance both the \"to\" child and the \"from\" child since we found a match\n            // Nothing else to do as we already recursively called morphChildren above\n            curToNodeChild = toNextSibling;\n            curFromNodeChild = fromNextSibling;\n            continue outer;\n          }\n\n          // No compatible match so remove the old node from the DOM and continue trying to find a\n          // match in the original DOM. However, we only do this if the from node is not keyed\n          // since it is possible that a keyed node might match up with a node somewhere else in the\n          // target tree and we don't want to discard it just yet since it still might find a\n          // home in the final DOM tree. After everything is done we will remove any keyed nodes\n          // that didn't find a home\n          if (curFromNodeKey) {\n            // Since the node is keyed it might be matched up later so we defer\n            // the actual removal to later\n            addKeyedRemoval(curFromNodeKey);\n          } else {\n            // NOTE: we skip nested keyed nodes from being removed since there is\n            //       still a chance they will be matched up later\n            removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n          }\n\n          curFromNodeChild = fromNextSibling;\n        } // END: while(curFromNodeChild) {}\n\n        // If we got this far then we did not find a candidate match for\n        // our \"to node\" and we exhausted all of the children \"from\"\n        // nodes. Therefore, we will just append the current \"to\" node\n        // to the end\n        if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n          // MORPH\n          if(!skipFrom){ addChild(fromEl, matchingFromEl); }\n          morphEl(matchingFromEl, curToNodeChild);\n        } else {\n          var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n          if (onBeforeNodeAddedResult !== false) {\n            if (onBeforeNodeAddedResult) {\n              curToNodeChild = onBeforeNodeAddedResult;\n            }\n\n            if (curToNodeChild.actualize) {\n              curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n            }\n            addChild(fromEl, curToNodeChild);\n            handleNodeAdded(curToNodeChild);\n          }\n        }\n\n        curToNodeChild = toNextSibling;\n        curFromNodeChild = fromNextSibling;\n      }\n\n      cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n\n      var specialElHandler = specialElHandlers[fromEl.nodeName];\n      if (specialElHandler) {\n        specialElHandler(fromEl, toEl);\n      }\n    } // END: morphChildren(...)\n\n    var morphedNode = fromNode;\n    var morphedNodeType = morphedNode.nodeType;\n    var toNodeType = toNode.nodeType;\n\n    if (!childrenOnly) {\n      // Handle the case where we are given two DOM nodes that are not\n      // compatible (e.g. <div> --> <span> or <div> --> TEXT)\n      if (morphedNodeType === ELEMENT_NODE) {\n        if (toNodeType === ELEMENT_NODE) {\n          if (!compareNodeNames(fromNode, toNode)) {\n            onNodeDiscarded(fromNode);\n            morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n          }\n        } else {\n          // Going from an element node to a text node\n          morphedNode = toNode;\n        }\n      } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node\n        if (toNodeType === morphedNodeType) {\n          if (morphedNode.nodeValue !== toNode.nodeValue) {\n            morphedNode.nodeValue = toNode.nodeValue;\n          }\n\n          return morphedNode;\n        } else {\n          // Text node to something else\n          morphedNode = toNode;\n        }\n      }\n    }\n\n    if (morphedNode === toNode) {\n      // The \"to node\" was not compatible with the \"from node\" so we had to\n      // toss out the \"from node\" and use the \"to node\"\n      onNodeDiscarded(fromNode);\n    } else {\n      if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n        return;\n      }\n\n      morphEl(morphedNode, toNode, childrenOnly);\n\n      // We now need to loop over any keyed nodes that might need to be\n      // removed. We only do the removal if we know that the keyed node\n      // never found a match. When a keyed node is matched up we remove\n      // it out of fromNodesLookup and we use fromNodesLookup to determine\n      // if a keyed node has been matched up or not\n      if (keyedRemovalList) {\n        for (var i=0, len=keyedRemovalList.length; i<len; i++) {\n          var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n          if (elToRemove) {\n            removeNode(elToRemove, elToRemove.parentNode, false);\n          }\n        }\n      }\n    }\n\n    if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n      if (morphedNode.actualize) {\n        morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n      }\n      // If we had to swap out the from node with a new node because the old\n      // node was not compatible with the target node then we need to\n      // replace the old DOM node in the original DOM tree. This is only\n      // possible if the original DOM node was part of a DOM tree which\n      // we know is the case if it has a parent node.\n      fromNode.parentNode.replaceChild(morphedNode, fromNode);\n    }\n\n    return morphedNode;\n  };\n}\n\nvar morphdom = morphdomFactory(morphAttrs);\n\nexport default morphdom;\n", "import {\n  PHX_COMPONENT,\n  PHX_PRUNE,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_SKIP,\n  PHX_MAGIC_ID,\n  PHX_STATIC,\n  PHX_TRIGGER_ACTION,\n  PHX_UPDATE,\n  PHX_REF_SRC,\n  PHX_REF_LOCK,\n  PHX_STREAM,\n  PHX_STREAM_REF,\n  PHX_VIEWPORT_TOP,\n  PHX_VIEWPORT_BOTTOM,\n} from \"./constants\"\n\nimport {\n  detectDuplicateIds,\n  isCid\n} from \"./utils\"\n\nimport DOM from \"./dom\"\nimport DOMPostMorphRestorer from \"./dom_post_morph_restorer\"\nimport morphdom from \"morphdom\"\n\nexport default class DOMPatch {\n  static patchWithClonedTree(container, clonedTree, liveSocket){\n    let focused = liveSocket.getActiveElement()\n    let {selectionStart, selectionEnd} = focused && DOM.hasSelectionRange(focused) ? focused : {}\n    let phxUpdate = liveSocket.binding(PHX_UPDATE)\n    let externalFormTriggered = null\n\n    morphdom(container, clonedTree, {\n      childrenOnly: false,\n      onBeforeElUpdated: (fromEl, toEl) => {\n        DOM.syncPendingAttrs(fromEl, toEl)\n        // we cannot morph locked children\n        if(!container.isSameNode(fromEl) && fromEl.hasAttribute(PHX_REF_LOCK)){ return false }\n        if(DOM.isIgnored(fromEl, phxUpdate)){ return false }\n        if(focused && focused.isSameNode(fromEl) && DOM.isFormInput(fromEl)){\n          DOM.mergeFocusedInput(fromEl, toEl)\n          return false\n        }\n        if(DOM.isNowTriggerFormExternal(toEl, liveSocket.binding(PHX_TRIGGER_ACTION))){\n          externalFormTriggered = toEl\n        }\n      }\n    })\n\n    if(externalFormTriggered){\n      liveSocket.unload()\n      // use prototype's submit in case there's a form control with name or id of \"submit\"\n      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n      Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered)\n    }\n\n    liveSocket.silenceEvents(() => DOM.restoreFocus(focused, selectionStart, selectionEnd))\n  }\n\n  constructor(view, container, id, html, streams, targetCID){\n    this.view = view\n    this.liveSocket = view.liveSocket\n    this.container = container\n    this.id = id\n    this.rootID = view.root.id\n    this.html = html\n    this.streams = streams\n    this.streamInserts = {}\n    this.streamComponentRestore = {}\n    this.targetCID = targetCID\n    this.cidPatch = isCid(this.targetCID)\n    this.pendingRemoves = []\n    this.phxRemove = this.liveSocket.binding(\"remove\")\n    this.targetContainer = this.isCIDPatch() ? this.targetCIDContainer(html) : container\n    this.callbacks = {\n      beforeadded: [], beforeupdated: [], beforephxChildAdded: [],\n      afteradded: [], afterupdated: [], afterdiscarded: [], afterphxChildAdded: [],\n      aftertransitionsDiscarded: []\n    }\n  }\n\n  before(kind, callback){ this.callbacks[`before${kind}`].push(callback) }\n  after(kind, callback){ this.callbacks[`after${kind}`].push(callback) }\n\n  trackBefore(kind, ...args){\n    this.callbacks[`before${kind}`].forEach(callback => callback(...args))\n  }\n\n  trackAfter(kind, ...args){\n    this.callbacks[`after${kind}`].forEach(callback => callback(...args))\n  }\n\n  markPrunableContentForRemoval(){\n    let phxUpdate = this.liveSocket.binding(PHX_UPDATE)\n    DOM.all(this.container, `[${phxUpdate}=append] > *, [${phxUpdate}=prepend] > *`, el => {\n      el.setAttribute(PHX_PRUNE, \"\")\n    })\n  }\n\n  perform(isJoinPatch){\n    let {view, liveSocket, html, container, targetContainer} = this\n    if(this.isCIDPatch() && !targetContainer){ return }\n\n    let focused = liveSocket.getActiveElement()\n    let {selectionStart, selectionEnd} = focused && DOM.hasSelectionRange(focused) ? focused : {}\n    let phxUpdate = liveSocket.binding(PHX_UPDATE)\n    let phxViewportTop = liveSocket.binding(PHX_VIEWPORT_TOP)\n    let phxViewportBottom = liveSocket.binding(PHX_VIEWPORT_BOTTOM)\n    let phxTriggerExternal = liveSocket.binding(PHX_TRIGGER_ACTION)\n    let added = []\n    let updates = []\n    let appendPrependUpdates = []\n\n    let externalFormTriggered = null\n\n    function morph(targetContainer, source, withChildren=false){\n      let morphCallbacks = {\n        // normally, we are running with childrenOnly, as the patch HTML for a LV\n        // does not include the LV attrs (data-phx-session, etc.)\n        // when we are patching a live component, we do want to patch the root element as well;\n        // another case is the recursive patch of a stream item that was kept on reset (-> onBeforeNodeAdded)\n        childrenOnly: targetContainer.getAttribute(PHX_COMPONENT) === null && !withChildren,\n        getNodeKey: (node) => {\n          if(DOM.isPhxDestroyed(node)){ return null }\n          // If we have a join patch, then by definition there was no PHX_MAGIC_ID.\n          // This is important to reduce the amount of elements morphdom discards.\n          if(isJoinPatch){ return node.id }\n          return node.id || (node.getAttribute && node.getAttribute(PHX_MAGIC_ID))\n        },\n        // skip indexing from children when container is stream\n        skipFromChildren: (from) => { return from.getAttribute(phxUpdate) === PHX_STREAM },\n        // tell morphdom how to add a child\n        addChild: (parent, child) => {\n          let {ref, streamAt} = this.getStreamInsert(child)\n          if(ref === undefined){ return parent.appendChild(child) }\n\n          this.setStreamRef(child, ref)\n\n          // streaming\n          if(streamAt === 0){\n            parent.insertAdjacentElement(\"afterbegin\", child)\n          } else if(streamAt === -1){\n            let lastChild = parent.lastElementChild\n            if(lastChild && !lastChild.hasAttribute(PHX_STREAM_REF)){\n              let nonStreamChild = Array.from(parent.children).find(c => !c.hasAttribute(PHX_STREAM_REF))\n              parent.insertBefore(child, nonStreamChild)\n            } else {\n              parent.appendChild(child)\n            }\n          } else if(streamAt > 0){\n            let sibling = Array.from(parent.children)[streamAt]\n            parent.insertBefore(child, sibling)\n          }\n        },\n        onBeforeNodeAdded: (el) => {\n          DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom)\n          this.trackBefore(\"added\", el)\n\n          let morphedEl = el\n          // this is a stream item that was kept on reset, recursively morph it\n          if(this.streamComponentRestore[el.id]){\n            morphedEl = this.streamComponentRestore[el.id]\n            delete this.streamComponentRestore[el.id]\n            morph.call(this, morphedEl, el, true)\n          }\n\n          return morphedEl\n        },\n        onNodeAdded: (el) => {\n          if(el.getAttribute){ this.maybeReOrderStream(el, true) }\n\n          // hack to fix Safari handling of img srcset and video tags\n          if(el instanceof HTMLImageElement && el.srcset){\n            el.srcset = el.srcset\n          } else if(el instanceof HTMLVideoElement && el.autoplay){\n            el.play()\n          }\n          if(DOM.isNowTriggerFormExternal(el, phxTriggerExternal)){\n            externalFormTriggered = el\n          }\n\n          // nested view handling\n          if((DOM.isPhxChild(el) && view.ownsElement(el)) || DOM.isPhxSticky(el) && view.ownsElement(el.parentNode)){\n            this.trackAfter(\"phxChildAdded\", el)\n          }\n          added.push(el)\n        },\n        onNodeDiscarded: (el) => this.onNodeDiscarded(el),\n        onBeforeNodeDiscarded: (el) => {\n          if(el.getAttribute && el.getAttribute(PHX_PRUNE) !== null){ return true }\n          if(el.parentElement !== null && el.id &&\n            DOM.isPhxUpdate(el.parentElement, phxUpdate, [PHX_STREAM, \"append\", \"prepend\"])){\n            return false\n          }\n          if(this.maybePendingRemove(el)){ return false }\n          if(this.skipCIDSibling(el)){ return false }\n\n          return true\n        },\n        onElUpdated: (el) => {\n          if(DOM.isNowTriggerFormExternal(el, phxTriggerExternal)){\n            externalFormTriggered = el\n          }\n          updates.push(el)\n          this.maybeReOrderStream(el, false)\n        },\n        onBeforeElUpdated: (fromEl, toEl) => {\n          // if we are patching the root target container and the id has changed, treat it as a new node\n          // by replacing the fromEl with the toEl, which ensures hooks are torn down and re-created\n          if(fromEl.id && fromEl.isSameNode(targetContainer) && fromEl.id !== toEl.id){\n            morphCallbacks.onNodeDiscarded(fromEl)\n            fromEl.replaceWith(toEl)\n            return morphCallbacks.onNodeAdded(toEl)\n          }\n          DOM.syncPendingAttrs(fromEl, toEl)\n          DOM.maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom)\n          DOM.cleanChildNodes(toEl, phxUpdate)\n          if(this.skipCIDSibling(toEl)){\n            // if this is a live component used in a stream, we may need to reorder it\n            this.maybeReOrderStream(fromEl)\n            return false\n          }\n          if(DOM.isPhxSticky(fromEl)){\n            [PHX_SESSION, PHX_STATIC, PHX_ROOT_ID]\n              .map(attr => [attr, fromEl.getAttribute(attr), toEl.getAttribute(attr)])\n              .forEach(([attr, fromVal, toVal]) => {\n                if(toVal && fromVal !== toVal){ fromEl.setAttribute(attr, toVal) }\n              })\n\n            return false\n          }\n          if(DOM.isIgnored(fromEl, phxUpdate) || (fromEl.form && fromEl.form.isSameNode(externalFormTriggered))){\n            this.trackBefore(\"updated\", fromEl, toEl)\n            DOM.mergeAttrs(fromEl, toEl, {isIgnored: DOM.isIgnored(fromEl, phxUpdate)})\n            updates.push(fromEl)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          }\n          if(fromEl.type === \"number\" && (fromEl.validity && fromEl.validity.badInput)){ return false }\n          // If the element has PHX_REF_SRC, it is loading or locked and awaiting an ack.\n          // If it's locked, we clone the fromEl tree and instruct morphdom to use\n          // the cloned tree as the source of the morph for this branch from here on out.\n          // We keep a reference to the cloned tree in the element's private data, and\n          // on ack (view.undoRefs), we morph the cloned tree with the true fromEl in the DOM to\n          // apply any changes that happened while the element was locked.\n          let isFocusedFormEl = focused && fromEl.isSameNode(focused) && DOM.isFormInput(fromEl)\n          let focusedSelectChanged = isFocusedFormEl && this.isChangedSelect(fromEl, toEl)\n          if(fromEl.hasAttribute(PHX_REF_SRC)){\n            if(DOM.isUploadInput(fromEl)){\n              DOM.mergeAttrs(fromEl, toEl, {isIgnored: true})\n              this.trackBefore(\"updated\", fromEl, toEl)\n              updates.push(fromEl)\n            }\n            DOM.applyStickyOperations(fromEl)\n            let isLocked = fromEl.hasAttribute(PHX_REF_LOCK)\n            let clone = isLocked ? DOM.private(fromEl, PHX_REF_LOCK) || fromEl.cloneNode(true) : null\n            if(clone){\n              DOM.putPrivate(fromEl, PHX_REF_LOCK, clone)\n              if(!isFocusedFormEl){\n                fromEl = clone\n              }\n            }\n          }\n\n          // nested view handling\n          if(DOM.isPhxChild(toEl)){\n            let prevSession = fromEl.getAttribute(PHX_SESSION)\n            DOM.mergeAttrs(fromEl, toEl, {exclude: [PHX_STATIC]})\n            if(prevSession !== \"\"){ fromEl.setAttribute(PHX_SESSION, prevSession) }\n            fromEl.setAttribute(PHX_ROOT_ID, this.rootID)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          }\n\n          // input handling\n          DOM.copyPrivates(toEl, fromEl)\n\n          // skip patching focused inputs unless focus is a select that has changed options\n          if(isFocusedFormEl && fromEl.type !== \"hidden\" && !focusedSelectChanged){\n            this.trackBefore(\"updated\", fromEl, toEl)\n            DOM.mergeFocusedInput(fromEl, toEl)\n            DOM.syncAttrsToProps(fromEl)\n            updates.push(fromEl)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          } else {\n            // blur focused select if it changed so native UI is updated (ie safari won't update visible options)\n            if(focusedSelectChanged){ fromEl.blur() }\n            if(DOM.isPhxUpdate(toEl, phxUpdate, [\"append\", \"prepend\"])){\n              appendPrependUpdates.push(new DOMPostMorphRestorer(fromEl, toEl, toEl.getAttribute(phxUpdate)))\n            }\n\n            DOM.syncAttrsToProps(toEl)\n            DOM.applyStickyOperations(toEl)\n            this.trackBefore(\"updated\", fromEl, toEl)\n            return fromEl\n          }\n        }\n      }\n      morphdom(targetContainer, source, morphCallbacks)\n    }\n\n    this.trackBefore(\"added\", container)\n    this.trackBefore(\"updated\", container, container)\n\n    liveSocket.time(\"morphdom\", () => {\n      this.streams.forEach(([ref, inserts, deleteIds, reset]) => {\n        inserts.forEach(([key, streamAt, limit]) => {\n          this.streamInserts[key] = {ref, streamAt, limit, reset}\n        })\n        if(reset !== undefined){\n          DOM.all(container, `[${PHX_STREAM_REF}=\"${ref}\"]`, child => {\n            this.removeStreamChildElement(child)\n          })\n        }\n        deleteIds.forEach(id => {\n          let child = container.querySelector(`[id=\"${id}\"]`)\n          if(child){ this.removeStreamChildElement(child) }\n        })\n      })\n\n      // clear stream items from the dead render if they are not inserted again\n      if(isJoinPatch){\n        DOM.all(this.container, `[${phxUpdate}=${PHX_STREAM}]`, el => {\n          // make sure to only remove elements owned by the current view\n          // see https://github.com/phoenixframework/phoenix_live_view/issues/3047\n          this.liveSocket.owner(el, (view) => {\n            if(view === this.view){\n              Array.from(el.children).forEach(child => {\n                this.removeStreamChildElement(child)\n              })\n            }\n          })\n        })\n      }\n\n      morph.call(this, targetContainer, html)\n    })\n\n    if(liveSocket.isDebugEnabled()){\n      detectDuplicateIds()\n      // warn if there are any inputs named \"id\"\n      Array.from(document.querySelectorAll(\"input[name=id]\")).forEach(node => {\n        if(node.form){\n          console.error(\"Detected an input with name=\\\"id\\\" inside a form! This will cause problems when patching the DOM.\\n\", node)\n        }\n      })\n    }\n\n    if(appendPrependUpdates.length > 0){\n      liveSocket.time(\"post-morph append/prepend restoration\", () => {\n        appendPrependUpdates.forEach(update => update.perform())\n      })\n    }\n\n    liveSocket.silenceEvents(() => DOM.restoreFocus(focused, selectionStart, selectionEnd))\n    DOM.dispatchEvent(document, \"phx:update\")\n    added.forEach(el => this.trackAfter(\"added\", el))\n    updates.forEach(el => this.trackAfter(\"updated\", el))\n\n    this.transitionPendingRemoves()\n\n    if(externalFormTriggered){\n      liveSocket.unload()\n      // use prototype's submit in case there's a form control with name or id of \"submit\"\n      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n      Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered)\n    }\n    return true\n  }\n\n  onNodeDiscarded(el){\n    // nested view handling\n    if(DOM.isPhxChild(el) || DOM.isPhxSticky(el)){ this.liveSocket.destroyViewByEl(el) }\n    this.trackAfter(\"discarded\", el)\n  }\n\n  maybePendingRemove(node){\n    if(node.getAttribute && node.getAttribute(this.phxRemove) !== null){\n      this.pendingRemoves.push(node)\n      return true\n    } else {\n      return false\n    }\n  }\n\n  removeStreamChildElement(child){\n    // we need to store the node if it is actually re-added in the same patch\n    // we do NOT want to execute phx-remove, we do NOT want to call onNodeDiscarded\n    if(this.streamInserts[child.id]){\n      this.streamComponentRestore[child.id] = child\n      child.remove()\n    } else {\n      // only remove the element now if it has no phx-remove binding\n      if(!this.maybePendingRemove(child)){\n        child.remove()\n        this.onNodeDiscarded(child)\n      }\n    }\n  }\n\n  getStreamInsert(el){\n    let insert = el.id ? this.streamInserts[el.id] : {}\n    return insert || {}\n  }\n\n  setStreamRef(el, ref){\n    DOM.putSticky(el, PHX_STREAM_REF, el => el.setAttribute(PHX_STREAM_REF, ref))\n  }\n\n  maybeReOrderStream(el, isNew){\n    let {ref, streamAt, reset} = this.getStreamInsert(el)\n    if(streamAt === undefined){ return }\n\n    // we need to set the PHX_STREAM_REF here as well as addChild is invoked only for parents\n    this.setStreamRef(el, ref)\n\n    if(!reset && !isNew){\n      // we only reorder if the element is new or it's a stream reset\n      return\n    }\n\n    // check if the element has a parent element;\n    // it doesn't if we are currently recursively morphing (restoring a saved stream child)\n    // because the element is not yet added to the real dom;\n    // reordering does not make sense in that case anyway\n    if(!el.parentElement){ return }\n\n    if(streamAt === 0){\n      el.parentElement.insertBefore(el, el.parentElement.firstElementChild)\n    } else if(streamAt > 0){\n      let children = Array.from(el.parentElement.children)\n      let oldIndex = children.indexOf(el)\n      if(streamAt >= children.length - 1){\n        el.parentElement.appendChild(el)\n      } else {\n        let sibling = children[streamAt]\n        if(oldIndex > streamAt){\n          el.parentElement.insertBefore(el, sibling)\n        } else {\n          el.parentElement.insertBefore(el, sibling.nextElementSibling)\n        }\n      }\n    }\n\n    this.maybeLimitStream(el)\n  }\n\n  maybeLimitStream(el){\n    let {limit} = this.getStreamInsert(el)\n    let children = limit !== null && Array.from(el.parentElement.children)\n    if(limit && limit < 0 && children.length > limit * -1){\n      children.slice(0, children.length + limit).forEach(child => this.removeStreamChildElement(child))\n    } else if(limit && limit >= 0 && children.length > limit){\n      children.slice(limit).forEach(child => this.removeStreamChildElement(child))\n    }\n  }\n\n  transitionPendingRemoves(){\n    let {pendingRemoves, liveSocket} = this\n    if(pendingRemoves.length > 0){\n      liveSocket.transitionRemoves(pendingRemoves, false, () => {\n        pendingRemoves.forEach(el => {\n          let child = DOM.firstPhxChild(el)\n          if(child){ liveSocket.destroyViewByEl(child) }\n          el.remove()\n        })\n        this.trackAfter(\"transitionsDiscarded\", pendingRemoves)\n      })\n    }\n  }\n\n  isChangedSelect(fromEl, toEl){\n    if(!(fromEl instanceof HTMLSelectElement) || fromEl.multiple){ return false }\n    if(fromEl.options.length !== toEl.options.length){ return true }\n\n    // keep the current value\n    toEl.value = fromEl.value\n\n    // in general we have to be very careful with using isEqualNode as it does not a reliable\n    // DOM tree equality check, but for selection attributes and options it works fine\n    return !fromEl.isEqualNode(toEl)\n  }\n\n  isCIDPatch(){ return this.cidPatch }\n\n  skipCIDSibling(el){\n    return el.nodeType === Node.ELEMENT_NODE && el.hasAttribute(PHX_SKIP)\n  }\n\n  targetCIDContainer(html){\n    if(!this.isCIDPatch()){ return }\n    let [first, ...rest] = DOM.findComponentNodeList(this.container, this.targetCID)\n    if(rest.length === 0 && DOM.childNodeLength(html) === 1){\n      return first\n    } else {\n      return first && first.parentNode\n    }\n  }\n\n  indexOf(parent, child){ return Array.from(parent.children).indexOf(child) }\n}\n", "import {\n  COMPONENTS,\n  DYNAMICS,\n  TEMPLATES,\n  EVENTS,\n  PHX_COMPONENT,\n  PHX_SKIP,\n  PHX_MAGIC_ID,\n  REPLY,\n  STATIC,\n  TITLE,\n  STREAM,\n  ROOT,\n} from \"./constants\"\n\nimport {\n  isObject,\n  logError,\n  isCid,\n} from \"./utils\"\n\nconst VOID_TAGS = new Set([\n  \"area\",\n  \"base\",\n  \"br\",\n  \"col\",\n  \"command\",\n  \"embed\",\n  \"hr\",\n  \"img\",\n  \"input\",\n  \"keygen\",\n  \"link\",\n  \"meta\",\n  \"param\",\n  \"source\",\n  \"track\",\n  \"wbr\"\n])\nconst quoteChars = new Set([\"'\", \"\\\"\"])\n\nexport let modifyRoot = (html, attrs, clearInnerHTML) => {\n  let i = 0\n  let insideComment = false\n  let beforeTag, afterTag, tag, tagNameEndsAt, id, newHTML\n\n  let lookahead = html.match(/^(\\s*(?:<!--.*?-->\\s*)*)<([^\\s\\/>]+)/)\n  if(lookahead === null){ throw new Error(`malformed html ${html}`) }\n\n  i = lookahead[0].length\n  beforeTag = lookahead[1]\n  tag = lookahead[2]\n  tagNameEndsAt = i\n\n  // Scan the opening tag for id, if there is any\n  for(i; i < html.length; i++){\n    if(html.charAt(i) === \">\" ){ break }\n    if(html.charAt(i) === \"=\"){\n      let isId = html.slice(i - 3, i) === \" id\"\n      i++\n      let char = html.charAt(i)\n      if(quoteChars.has(char)){\n        let attrStartsAt = i\n        i++\n        for(i; i < html.length; i++){\n          if(html.charAt(i) === char){ break }\n        }\n        if(isId){\n          id = html.slice(attrStartsAt + 1, i)\n          break\n        }\n      }\n    }\n  }\n\n  let closeAt = html.length - 1\n  insideComment = false\n  while(closeAt >= beforeTag.length + tag.length){\n    let char = html.charAt(closeAt)\n    if(insideComment){\n      if(char === \"-\" && html.slice(closeAt - 3, closeAt) === \"<!-\"){\n        insideComment = false\n        closeAt -= 4\n      } else {\n        closeAt -= 1\n      }\n    } else if(char === \">\" && html.slice(closeAt - 2, closeAt) === \"--\"){\n      insideComment = true\n      closeAt -= 3\n    } else if(char === \">\"){\n      break\n    } else {\n      closeAt -= 1\n    }\n  }\n  afterTag = html.slice(closeAt + 1, html.length)\n\n  let attrsStr =\n    Object.keys(attrs)\n      .map(attr => attrs[attr] === true ? attr : `${attr}=\"${attrs[attr]}\"`)\n      .join(\" \")\n\n  if(clearInnerHTML){\n    // Keep the id if any\n    let idAttrStr = id ? ` id=\"${id}\"` : \"\"\n    if(VOID_TAGS.has(tag)){\n      newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}/>`\n    } else {\n      newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}></${tag}>`\n    }\n  } else {\n    let rest = html.slice(tagNameEndsAt, closeAt + 1)\n    newHTML = `<${tag}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}${rest}`\n  }\n\n  return [newHTML, beforeTag, afterTag]\n}\n\nexport default class Rendered {\n  static extract(diff){\n    let {[REPLY]: reply, [EVENTS]: events, [TITLE]: title} = diff\n    delete diff[REPLY]\n    delete diff[EVENTS]\n    delete diff[TITLE]\n    return {diff, title, reply: reply || null, events: events || []}\n  }\n\n  constructor(viewId, rendered){\n    this.viewId = viewId\n    this.rendered = {}\n    this.magicId = 0\n    this.mergeDiff(rendered)\n  }\n\n  parentViewId(){ return this.viewId }\n\n  toString(onlyCids){\n    let [str, streams] = this.recursiveToString(this.rendered, this.rendered[COMPONENTS], onlyCids, true, {})\n    return [str, streams]\n  }\n\n  recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids, changeTracking, rootAttrs){\n    onlyCids = onlyCids ? new Set(onlyCids) : null\n    let output = {buffer: \"\", components: components, onlyCids: onlyCids, streams: new Set()}\n    this.toOutputBuffer(rendered, null, output, changeTracking, rootAttrs)\n    return [output.buffer, output.streams]\n  }\n\n  componentCIDs(diff){ return Object.keys(diff[COMPONENTS] || {}).map(i => parseInt(i)) }\n\n  isComponentOnlyDiff(diff){\n    if(!diff[COMPONENTS]){ return false }\n    return Object.keys(diff).length === 1\n  }\n\n  getComponent(diff, cid){ return diff[COMPONENTS][cid] }\n\n  resetRender(cid){\n    // we are racing a component destroy, it could not exist, so\n    // make sure that we don't try to set reset on undefined\n    if(this.rendered[COMPONENTS][cid]){\n      this.rendered[COMPONENTS][cid].reset = true\n    }\n  }\n\n  mergeDiff(diff){\n    let newc = diff[COMPONENTS]\n    let cache = {}\n    delete diff[COMPONENTS]\n    this.rendered = this.mutableMerge(this.rendered, diff)\n    this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {}\n\n    if(newc){\n      let oldc = this.rendered[COMPONENTS]\n\n      for(let cid in newc){\n        newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache)\n      }\n\n      for(let cid in newc){ oldc[cid] = newc[cid] }\n      diff[COMPONENTS] = newc\n    }\n  }\n\n  cachedFindComponent(cid, cdiff, oldc, newc, cache){\n    if(cache[cid]){\n      return cache[cid]\n    } else {\n      let ndiff, stat, scid = cdiff[STATIC]\n\n      if(isCid(scid)){\n        let tdiff\n\n        if(scid > 0){\n          tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache)\n        } else {\n          tdiff = oldc[-scid]\n        }\n\n        stat = tdiff[STATIC]\n        ndiff = this.cloneMerge(tdiff, cdiff, true)\n        ndiff[STATIC] = stat\n      } else {\n        ndiff = cdiff[STATIC] !== undefined || oldc[cid] === undefined ?\n          cdiff : this.cloneMerge(oldc[cid], cdiff, false)\n      }\n\n      cache[cid] = ndiff\n      return ndiff\n    }\n  }\n\n  mutableMerge(target, source){\n    if(source[STATIC] !== undefined){\n      return source\n    } else {\n      this.doMutableMerge(target, source)\n      return target\n    }\n  }\n\n  doMutableMerge(target, source){\n    for(let key in source){\n      let val = source[key]\n      let targetVal = target[key]\n      let isObjVal = isObject(val)\n      if(isObjVal && val[STATIC] === undefined && isObject(targetVal)){\n        this.doMutableMerge(targetVal, val)\n      } else {\n        target[key] = val\n      }\n    }\n    if(target[ROOT]){\n      target.newRender = true\n    }\n  }\n\n  // Merges cid trees together, copying statics from source tree.\n  //\n  // The `pruneMagicId` is passed to control pruning the magicId of the\n  // target. We must always prune the magicId when we are sharing statics\n  // from another component. If not pruning, we replicate the logic from\n  // mutableMerge, where we set newRender to true if there is a root\n  // (effectively forcing the new version to be rendered instead of skipped)\n  //\n  cloneMerge(target, source, pruneMagicId){\n    let merged = {...target, ...source}\n    for(let key in merged){\n      let val = source[key]\n      let targetVal = target[key]\n      if(isObject(val) && val[STATIC] === undefined && isObject(targetVal)){\n        merged[key] = this.cloneMerge(targetVal, val, pruneMagicId)\n      } else if(val === undefined && isObject(targetVal)){\n        merged[key] = this.cloneMerge(targetVal, {}, pruneMagicId)\n      }\n    }\n    if(pruneMagicId){\n      delete merged.magicId\n      delete merged.newRender\n    } else if(target[ROOT]){\n      merged.newRender = true\n    }\n    return merged\n  }\n\n  componentToString(cid){\n    let [str, streams] = this.recursiveCIDToString(this.rendered[COMPONENTS], cid, null)\n    let [strippedHTML, _before, _after] = modifyRoot(str, {})\n    return [strippedHTML, streams]\n  }\n\n  pruneCIDs(cids){\n    cids.forEach(cid => delete this.rendered[COMPONENTS][cid])\n  }\n\n  // private\n\n  get(){ return this.rendered }\n\n  isNewFingerprint(diff = {}){ return !!diff[STATIC] }\n\n  templateStatic(part, templates){\n    if(typeof (part) === \"number\"){\n      return templates[part]\n    } else {\n      return part\n    }\n  }\n\n  nextMagicID(){\n    this.magicId++\n    return `m${this.magicId}-${this.parentViewId()}`\n  }\n\n  // Converts rendered tree to output buffer.\n  //\n  // changeTracking controls if we can apply the PHX_SKIP optimization.\n  // It is disabled for comprehensions since we must re-render the entire collection\n  // and no individual element is tracked inside the comprehension.\n  toOutputBuffer(rendered, templates, output, changeTracking, rootAttrs = {}){\n    if(rendered[DYNAMICS]){ return this.comprehensionToBuffer(rendered, templates, output) }\n    let {[STATIC]: statics} = rendered\n    statics = this.templateStatic(statics, templates)\n    let isRoot = rendered[ROOT]\n    let prevBuffer = output.buffer\n    if(isRoot){ output.buffer = \"\" }\n\n    // this condition is called when first rendering an optimizable function component.\n    // LC have their magicId previously set\n    if(changeTracking && isRoot && !rendered.magicId){\n      rendered.newRender = true\n      rendered.magicId = this.nextMagicID()\n    }\n\n    output.buffer += statics[0]\n    for(let i = 1; i < statics.length; i++){\n      this.dynamicToBuffer(rendered[i - 1], templates, output, changeTracking)\n      output.buffer += statics[i]\n    }\n\n    // Applies the root tag \"skip\" optimization if supported, which clears\n    // the root tag attributes and innerHTML, and only maintains the magicId.\n    // We can only skip when changeTracking is supported (outside of a comprehension),\n    // and when the root element hasn't experienced an unrendered merge (newRender true).\n    if(isRoot){\n      let skip = false\n      let attrs\n      // When a LC is re-added to the page, we need to re-render the entire LC tree,\n      // therefore changeTracking is false; however, we need to keep all the magicIds\n      // from any function component so the next time the LC is updated, we can apply\n      // the skip optimization\n      if(changeTracking || rendered.magicId){\n        skip = changeTracking && !rendered.newRender\n        attrs = {[PHX_MAGIC_ID]: rendered.magicId, ...rootAttrs}\n      } else {\n        attrs = rootAttrs\n      }\n      if(skip){ attrs[PHX_SKIP] = true }\n      let [newRoot, commentBefore, commentAfter] = modifyRoot(output.buffer, attrs, skip)\n      rendered.newRender = false\n      output.buffer = prevBuffer + commentBefore + newRoot + commentAfter\n    }\n  }\n\n  comprehensionToBuffer(rendered, templates, output){\n    let {[DYNAMICS]: dynamics, [STATIC]: statics, [STREAM]: stream} = rendered\n    let [_ref, _inserts, deleteIds, reset] = stream || [null, {}, [], null]\n    statics = this.templateStatic(statics, templates)\n    let compTemplates = templates || rendered[TEMPLATES]\n    for(let d = 0; d < dynamics.length; d++){\n      let dynamic = dynamics[d]\n      output.buffer += statics[0]\n      for(let i = 1; i < statics.length; i++){\n        // Inside a comprehension, we don't track how dynamics change\n        // over time (and features like streams would make that impossible\n        // unless we move the stream diffing away from morphdom),\n        // so we can't perform root change tracking.\n        let changeTracking = false\n        this.dynamicToBuffer(dynamic[i - 1], compTemplates, output, changeTracking)\n        output.buffer += statics[i]\n      }\n    }\n\n    if(stream !== undefined && (rendered[DYNAMICS].length > 0 || deleteIds.length > 0 || reset)){\n      delete rendered[STREAM]\n      rendered[DYNAMICS] = []\n      output.streams.add(stream)\n    }\n  }\n\n  dynamicToBuffer(rendered, templates, output, changeTracking){\n    if(typeof (rendered) === \"number\"){\n      let [str, streams] = this.recursiveCIDToString(output.components, rendered, output.onlyCids)\n      output.buffer += str\n      output.streams = new Set([...output.streams, ...streams])\n    } else if(isObject(rendered)){\n      this.toOutputBuffer(rendered, templates, output, changeTracking, {})\n    } else {\n      output.buffer += rendered\n    }\n  }\n\n  recursiveCIDToString(components, cid, onlyCids){\n    let component = components[cid] || logError(`no component for CID ${cid}`, components)\n    let attrs = {[PHX_COMPONENT]: cid}\n    let skip = onlyCids && !onlyCids.has(cid)\n    // Two optimization paths apply here:\n    //\n    //   1. The onlyCids optimization works by the server diff telling us only specific\n    //     cid's have changed. This allows us to skip rendering any component that hasn't changed,\n    //     which ultimately sets PHX_SKIP root attribute and avoids rendering the innerHTML.\n    //\n    //   2. The root PHX_SKIP optimization generalizes to all HEEx function components, and\n    //     works in the same PHX_SKIP attribute fashion as 1, but the newRender tracking is done\n    //     at the general diff merge level. If we merge a diff with new dynamics, we necessarily have\n    //     experienced a change which must be a newRender, and thus we can't skip the render.\n    //\n    // Both optimization flows apply here. newRender is set based on the onlyCids optimization, and\n    // we track a deterministic magicId based on the cid.\n    //\n    // changeTracking is about the entire tree\n    // newRender is about the current root in the tree\n    //\n    // By default changeTracking is enabled, but we special case the flow where the client is pruning\n    // cids and the server adds the component back. In such cases, we explicitly disable changeTracking\n    // with resetRender for this cid, then re-enable it after the recursive call to skip the optimization\n    // for the entire component tree.\n    component.newRender = !skip\n    component.magicId = `c${cid}-${this.parentViewId()}`\n    // enable change tracking as long as the component hasn't been reset\n    let changeTracking = !component.reset\n    let [html, streams] = this.recursiveToString(component, components, onlyCids, changeTracking, attrs)\n    // disable reset after we've rendered\n    delete component.reset\n\n    return [html, streams]\n  }\n}\n", "import DOM from \"./dom\"\nimport ARIA from \"./aria\"\n\nlet focusStack = []\nlet default_transition_time = 200\n\nlet JS = {\n  // private\n  exec(e, eventType, phxEvent, view, sourceEl, defaults){\n    let [defaultKind, defaultArgs] = defaults || [null, {callback: defaults && defaults.callback}]\n    let commands = phxEvent.charAt(0) === \"[\" ?\n      JSON.parse(phxEvent) : [[defaultKind, defaultArgs]]\n\n    commands.forEach(([kind, args]) => {\n      if(kind === defaultKind){\n        // always prefer the args, but keep existing keys from the defaultArgs\n        args = {...defaultArgs, ...args}\n        args.callback = args.callback || defaultArgs.callback\n      }\n      this.filterToEls(view.liveSocket, sourceEl, args).forEach(el => {\n        this[`exec_${kind}`](e, eventType, phxEvent, view, sourceEl, el, args)\n      })\n    })\n  },\n\n  isVisible(el){\n    return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length > 0)\n  },\n\n  // returns true if any part of the element is inside the viewport\n  isInViewport(el){\n    const rect = el.getBoundingClientRect()\n    const windowHeight = window.innerHeight || document.documentElement.clientHeight\n    const windowWidth = window.innerWidth || document.documentElement.clientWidth\n\n    return (\n      rect.right > 0 &&\n      rect.bottom > 0 &&\n      rect.left < windowWidth &&\n      rect.top < windowHeight\n    )\n  },\n\n  // private\n\n  // commands\n\n  exec_exec(e, eventType, phxEvent, view, sourceEl, el, {attr, to}){\n    let nodes = to ? DOM.all(document, to) : [sourceEl]\n    nodes.forEach(node => {\n      let encodedJS = node.getAttribute(attr)\n      if(!encodedJS){ throw new Error(`expected ${attr} to contain JS command on \"${to}\"`) }\n      view.liveSocket.execJS(node, encodedJS, eventType)\n    })\n  },\n\n  exec_dispatch(e, eventType, phxEvent, view, sourceEl, el, {event, detail, bubbles}){\n    detail = detail || {}\n    detail.dispatcher = sourceEl\n    DOM.dispatchEvent(el, event, {detail, bubbles})\n  },\n\n  exec_push(e, eventType, phxEvent, view, sourceEl, el, args){\n    let {event, data, target, page_loading, loading, value, dispatcher, callback} = args\n    let pushOpts = {loading, value, target, page_loading: !!page_loading}\n    let targetSrc = eventType === \"change\" && dispatcher ? dispatcher : sourceEl\n    let phxTarget = target || targetSrc.getAttribute(view.binding(\"target\")) || targetSrc\n    const handler = (targetView, targetCtx) => {\n      if(!targetView.isConnected()){ return }\n      if(eventType === \"change\"){\n        let {newCid, _target} = args\n        _target = _target || (DOM.isFormInput(sourceEl) ? sourceEl.name : undefined)\n        if(_target){ pushOpts._target = _target }\n        targetView.pushInput(sourceEl, targetCtx, newCid, event || phxEvent, pushOpts, callback)\n      } else if(eventType === \"submit\"){\n        let {submitter} = args\n        targetView.submitForm(sourceEl, targetCtx, event || phxEvent, submitter, pushOpts, callback)\n      } else {\n        targetView.pushEvent(eventType, sourceEl, targetCtx, event || phxEvent, data, pushOpts, callback)\n      }\n    }\n    // in case of formRecovery, targetView and targetCtx are passed as argument\n    // as they are looked up in a template element, not the real DOM\n    if(args.targetView && args.targetCtx){\n      handler(args.targetView, args.targetCtx)\n    } else {\n      view.withinTargets(phxTarget, handler)\n    }\n  },\n\n  exec_navigate(e, eventType, phxEvent, view, sourceEl, el, {href, replace}){\n    view.liveSocket.historyRedirect(e, href, replace ? \"replace\" : \"push\", null, sourceEl)\n  },\n\n  exec_patch(e, eventType, phxEvent, view, sourceEl, el, {href, replace}){\n    view.liveSocket.pushHistoryPatch(e, href, replace ? \"replace\" : \"push\", sourceEl)\n  },\n\n  exec_focus(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => ARIA.attemptFocus(el))\n  },\n\n  exec_focus_first(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => ARIA.focusFirstInteractive(el) || ARIA.focusFirst(el))\n  },\n\n  exec_push_focus(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => focusStack.push(el || sourceEl))\n  },\n\n  exec_pop_focus(_e, _eventType, _phxEvent, _view, _sourceEl, _el){\n    window.requestAnimationFrame(() => {\n      const el = focusStack.pop()\n      if(el){ el.focus() }\n    })\n  },\n\n  exec_add_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.addOrRemoveClasses(el, names, [], transition, time, view, blocking)\n  },\n\n  exec_remove_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.addOrRemoveClasses(el, [], names, transition, time, view, blocking)\n  },\n\n  exec_toggle_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.toggleClasses(el, names, transition, time, view, blocking)\n  },\n\n  exec_toggle_attr(e, eventType, phxEvent, view, sourceEl, el, {attr: [attr, val1, val2]}){\n    this.toggleAttr(el, attr, val1, val2)\n  },\n\n  exec_transition(e, eventType, phxEvent, view, sourceEl, el, {time, transition, blocking}){\n    this.addOrRemoveClasses(el, [], [], transition, time, view, blocking)\n  },\n\n  exec_toggle(e, eventType, phxEvent, view, sourceEl, el, {display, ins, outs, time, blocking}){\n    this.toggle(eventType, view, el, display, ins, outs, time, blocking)\n  },\n\n  exec_show(e, eventType, phxEvent, view, sourceEl, el, {display, transition, time, blocking}){\n    this.show(eventType, view, el, display, transition, time, blocking)\n  },\n\n  exec_hide(e, eventType, phxEvent, view, sourceEl, el, {display, transition, time, blocking}){\n    this.hide(eventType, view, el, display, transition, time, blocking)\n  },\n\n  exec_set_attr(e, eventType, phxEvent, view, sourceEl, el, {attr: [attr, val]}){\n    this.setOrRemoveAttrs(el, [[attr, val]], [])\n  },\n\n  exec_remove_attr(e, eventType, phxEvent, view, sourceEl, el, {attr}){\n    this.setOrRemoveAttrs(el, [], [attr])\n  },\n\n  // utils for commands\n\n  show(eventType, view, el, display, transition, time, blocking){\n    if(!this.isVisible(el)){\n      this.toggle(eventType, view, el, display, transition, null, time, blocking)\n    }\n  },\n\n  hide(eventType, view, el, display, transition, time, blocking){\n    if(this.isVisible(el)){\n      this.toggle(eventType, view, el, display, null, transition, time, blocking)\n    }\n  },\n\n  toggle(eventType, view, el, display, ins, outs, time, blocking){\n    time = time || default_transition_time\n    let [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []]\n    let [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []]\n    if(inClasses.length > 0 || outClasses.length > 0){\n      if(this.isVisible(el)){\n        let onStart = () => {\n          this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses))\n          window.requestAnimationFrame(() => {\n            this.addOrRemoveClasses(el, outClasses, [])\n            window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses))\n          })\n        }\n        let onEnd = () => {\n          this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses))\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = \"none\")\n          el.dispatchEvent(new Event(\"phx:hide-end\"))\n        }\n        el.dispatchEvent(new Event(\"phx:hide-start\"))\n        if(blocking === false){\n          onStart()\n          setTimeout(onEnd, time)\n        } else {\n          view.transition(time, onStart, onEnd)\n        }\n      } else {\n        if(eventType === \"remove\"){ return }\n        let onStart = () => {\n          this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses))\n          let stickyDisplay = display || this.defaultDisplay(el)\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = stickyDisplay)\n          window.requestAnimationFrame(() => {\n            this.addOrRemoveClasses(el, inClasses, [])\n            window.requestAnimationFrame(() => this.addOrRemoveClasses(el, inEndClasses, inStartClasses))\n          })\n        }\n        let onEnd = () => {\n          this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses))\n          el.dispatchEvent(new Event(\"phx:show-end\"))\n        }\n        el.dispatchEvent(new Event(\"phx:show-start\"))\n        if(blocking === false){\n          onStart()\n          setTimeout(onEnd, time)\n        } else {\n          view.transition(time, onStart, onEnd)\n        }\n      }\n    } else {\n      if(this.isVisible(el)){\n        window.requestAnimationFrame(() => {\n          el.dispatchEvent(new Event(\"phx:hide-start\"))\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = \"none\")\n          el.dispatchEvent(new Event(\"phx:hide-end\"))\n        })\n      } else {\n        window.requestAnimationFrame(() => {\n          el.dispatchEvent(new Event(\"phx:show-start\"))\n          let stickyDisplay = display || this.defaultDisplay(el)\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = stickyDisplay)\n          el.dispatchEvent(new Event(\"phx:show-end\"))\n        })\n      }\n    }\n  },\n\n  toggleClasses(el, classes, transition, time, view, blocking){\n    window.requestAnimationFrame(() => {\n      let [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []])\n      let newAdds = classes.filter(name => prevAdds.indexOf(name) < 0 && !el.classList.contains(name))\n      let newRemoves = classes.filter(name => prevRemoves.indexOf(name) < 0 && el.classList.contains(name))\n      this.addOrRemoveClasses(el, newAdds, newRemoves, transition, time, view, blocking)\n    })\n  },\n\n  toggleAttr(el, attr, val1, val2){\n    if(el.hasAttribute(attr)){\n      if(val2 !== undefined){\n        // toggle between val1 and val2\n        if(el.getAttribute(attr) === val1){\n          this.setOrRemoveAttrs(el, [[attr, val2]], [])\n        } else {\n          this.setOrRemoveAttrs(el, [[attr, val1]], [])\n        }\n      } else {\n        // remove attr\n        this.setOrRemoveAttrs(el, [], [attr])\n      }\n    } else {\n      this.setOrRemoveAttrs(el, [[attr, val1]], [])\n    }\n  },\n\n  addOrRemoveClasses(el, adds, removes, transition, time, view, blocking){\n    time = time || default_transition_time\n    let [transitionRun, transitionStart, transitionEnd] = transition || [[], [], []]\n    if(transitionRun.length > 0){\n      let onStart = () => {\n        this.addOrRemoveClasses(el, transitionStart, [].concat(transitionRun).concat(transitionEnd))\n        window.requestAnimationFrame(() => {\n          this.addOrRemoveClasses(el, transitionRun, [])\n          window.requestAnimationFrame(() => this.addOrRemoveClasses(el, transitionEnd, transitionStart))\n        })\n      }\n      let onDone = () => this.addOrRemoveClasses(el, adds.concat(transitionEnd), removes.concat(transitionRun).concat(transitionStart))\n      if(blocking === false){\n        onStart()\n        setTimeout(onDone, time)\n      } else {\n        view.transition(time, onStart, onDone)\n      }\n      return\n    }\n\n    window.requestAnimationFrame(() => {\n      let [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []])\n      let keepAdds = adds.filter(name => prevAdds.indexOf(name) < 0 && !el.classList.contains(name))\n      let keepRemoves = removes.filter(name => prevRemoves.indexOf(name) < 0 && el.classList.contains(name))\n      let newAdds = prevAdds.filter(name => removes.indexOf(name) < 0).concat(keepAdds)\n      let newRemoves = prevRemoves.filter(name => adds.indexOf(name) < 0).concat(keepRemoves)\n\n      DOM.putSticky(el, \"classes\", currentEl => {\n        currentEl.classList.remove(...newRemoves)\n        currentEl.classList.add(...newAdds)\n        return [newAdds, newRemoves]\n      })\n    })\n  },\n\n  setOrRemoveAttrs(el, sets, removes){\n    let [prevSets, prevRemoves] = DOM.getSticky(el, \"attrs\", [[], []])\n\n    let alteredAttrs = sets.map(([attr, _val]) => attr).concat(removes)\n    let newSets = prevSets.filter(([attr, _val]) => !alteredAttrs.includes(attr)).concat(sets)\n    let newRemoves = prevRemoves.filter((attr) => !alteredAttrs.includes(attr)).concat(removes)\n\n    DOM.putSticky(el, \"attrs\", currentEl => {\n      newRemoves.forEach(attr => currentEl.removeAttribute(attr))\n      newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val))\n      return [newSets, newRemoves]\n    })\n  },\n\n  hasAllClasses(el, classes){ return classes.every(name => el.classList.contains(name)) },\n\n  isToggledOut(el, outClasses){\n    return !this.isVisible(el) || this.hasAllClasses(el, outClasses)\n  },\n\n  filterToEls(liveSocket, sourceEl, {to}){\n    let defaultQuery = () => {\n      if(typeof(to) === \"string\"){\n        return document.querySelectorAll(to)\n      } else if(to.closest){\n        let toEl = sourceEl.closest(to.closest)\n        return toEl ? [toEl] : []\n      } else if(to.inner){\n        return sourceEl.querySelectorAll(to.inner)\n      }\n    }\n    return to ? liveSocket.jsQuerySelectorAll(sourceEl, to, defaultQuery) : [sourceEl]\n  },\n\n  defaultDisplay(el){\n    return {tr: \"table-row\", td: \"table-cell\"}[el.tagName.toLowerCase()] || \"block\"\n  },\n\n  transitionClasses(val){\n    if(!val){ return null }\n\n    let [trans, tStart, tEnd] = Array.isArray(val) ? val : [val.split(\" \"), [], []]\n    trans = Array.isArray(trans) ? trans : trans.split(\" \")\n    tStart = Array.isArray(tStart) ? tStart : tStart.split(\" \")\n    tEnd = Array.isArray(tEnd) ? tEnd : tEnd.split(\" \")\n    return [trans, tStart, tEnd]\n  }\n}\n\nexport default JS\n", "import JS from \"./js\"\nimport DOM from \"./dom\"\n\nconst HOOK_ID = \"hookId\"\n\nlet viewHookID = 1\nexport default class ViewHook {\n  static makeID(){ return viewHookID++ }\n  static elementID(el){ return DOM.private(el, HOOK_ID) }\n\n  constructor(view, el, callbacks){\n    this.el = el\n    this.__attachView(view)\n    this.__callbacks = callbacks\n    this.__listeners = new Set()\n    this.__isDisconnected = false\n    DOM.putPrivate(this.el, HOOK_ID, this.constructor.makeID())\n    for(let key in this.__callbacks){ this[key] = this.__callbacks[key] }\n  }\n\n  __attachView(view){\n    if(view){\n      this.__view = () => view\n      this.liveSocket = view.liveSocket\n    } else {\n      this.__view = () => {\n        throw new Error(`hook not yet attached to a live view: ${this.el.outerHTML}`)\n      }\n      this.liveSocket = null\n    }\n  }\n\n  __mounted(){ this.mounted && this.mounted() }\n  __updated(){ this.updated && this.updated() }\n  __beforeUpdate(){ this.beforeUpdate && this.beforeUpdate() }\n  __destroyed(){\n    this.destroyed && this.destroyed()\n    DOM.deletePrivate(this.el, HOOK_ID) // https://github.com/phoenixframework/phoenix_live_view/issues/3496\n  }\n  __reconnected(){\n    if(this.__isDisconnected){\n      this.__isDisconnected = false\n      this.reconnected && this.reconnected()\n    }\n  }\n  __disconnected(){\n    this.__isDisconnected = true\n    this.disconnected && this.disconnected()\n  }\n\n  /**\n   * Binds the hook to JS commands.\n   *\n   * @param {ViewHook} hook - The ViewHook instance to bind.\n   *\n   * @returns {Object} An object with methods to manipulate the DOM and execute JavaScript.\n   */\n  js(){\n    let hook = this\n\n    return {\n      /**\n       * Executes encoded JavaScript in the context of the hook element.\n       *\n       * @param {string} encodedJS - The encoded JavaScript string to execute.\n       */\n      exec(encodedJS){\n        hook.__view().liveSocket.execJS(hook.el, encodedJS, \"hook\")\n      },\n\n      /**\n       * Shows an element.\n       *\n       * @param {HTMLElement} el - The element to show.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.display] - The CSS display value to set. Defaults \"block\".\n       * @param {string} [opts.transition] - The CSS transition classes to set when showing.\n       * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *  Defaults `true`.\n       */\n      show(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.show(\"hook\", owner, el, opts.display, opts.transition, opts.time, opts.blocking)\n      },\n\n      /**\n       * Hides an element.\n       *\n       * @param {HTMLElement} el - The element to hide.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set when hiding.\n       * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      hide(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.hide(\"hook\", owner, el, null, opts.transition, opts.time, opts.blocking)\n      },\n\n      /**\n       * Toggles the visibility of an element.\n       *\n       * @param {HTMLElement} el - The element to toggle.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.display] - The CSS display value to set. Defaults \"block\".\n       * @param {string} [opts.in] - The CSS transition classes for showing.\n       *   Accepts either the string of classes to apply when toggling in, or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]\n       *\n       * @param {string} [opts.out] - The CSS transition classes for hiding.\n       *   Accepts either string of classes to apply when toggling out, or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       *\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      toggle(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        opts.in = JS.transitionClasses(opts.in)\n        opts.out = JS.transitionClasses(opts.out)\n        JS.toggle(\"hook\", owner, el, opts.display, opts.in, opts.out, opts.time, opts.blocking)\n      },\n\n      /**\n       * Adds CSS classes to an element.\n       *\n       * @param {HTMLElement} el - The element to add classes to.\n       * @param {string|string[]} names - The class name(s) to add.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition property to set.\n       *   Accepts a string of classes to apply when adding classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      addClass(el, names, opts = {}){\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, names, [], opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Removes CSS classes from an element.\n       *\n       * @param {HTMLElement} el - The element to remove classes from.\n       * @param {string|string[]} names - The class name(s) to remove.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set.\n       *   Accepts a string of classes to apply when removing classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      removeClass(el, names, opts = {}){\n        opts.transition = JS.transitionClasses(opts.transition)\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, [], names, opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Toggles CSS classes on an element.\n       *\n       * @param {HTMLElement} el - The element to toggle classes on.\n       * @param {string|string[]} names - The class name(s) to toggle.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set.\n       *   Accepts a string of classes to apply when toggling classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      toggleClass(el, names, opts = {}){\n        opts.transition = JS.transitionClasses(opts.transition)\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.toggleClasses(el, names, opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Applies a CSS transition to an element.\n       *\n       * @param {HTMLElement} el - The element to apply the transition to.\n       * @param {string|string[]} transition - The transition class(es) to apply.\n       *   Accepts a string of classes to apply when transitioning or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      transition(el, transition, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, [], [], JS.transitionClasses(transition), opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Sets an attribute on an element.\n       *\n       * @param {HTMLElement} el - The element to set the attribute on.\n       * @param {string} attr - The attribute name to set.\n       * @param {string} val - The value to set for the attribute.\n       */\n      setAttribute(el, attr, val){ JS.setOrRemoveAttrs(el, [[attr, val]], []) },\n\n      /**\n       * Removes an attribute from an element.\n       *\n       * @param {HTMLElement} el - The element to remove the attribute from.\n       * @param {string} attr - The attribute name to remove.\n       */\n      removeAttribute(el, attr){ JS.setOrRemoveAttrs(el, [], [attr]) },\n\n      /**\n       * Toggles an attribute on an element between two values.\n       *\n       * @param {HTMLElement} el - The element to toggle the attribute on.\n       * @param {string} attr - The attribute name to toggle.\n       * @param {string} val1 - The first value to toggle between.\n       * @param {string} val2 - The second value to toggle between.\n       */\n      toggleAttribute(el, attr, val1, val2){ JS.toggleAttr(el, attr, val1, val2) },\n    }\n  }\n\n  pushEvent(event, payload = {}, onReply){\n    if(onReply === undefined){\n      return new Promise((resolve, reject) => {\n        try {\n          const ref = this.__view().pushHookEvent(this.el, null, event, payload, (reply, _ref) => resolve(reply))\n          if(ref === false){\n            reject(new Error(\"unable to push hook event. LiveView not connected\"))\n          }\n        } catch (error){\n          reject(error)\n        }\n      })\n    }\n    return this.__view().pushHookEvent(this.el, null, event, payload, onReply)\n  }\n\n  pushEventTo(phxTarget, event, payload = {}, onReply){\n    if(onReply === undefined){\n      return new Promise((resolve, reject) => {\n        try {\n          this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n            const ref = view.pushHookEvent(this.el, targetCtx, event, payload, (reply, _ref) => resolve(reply))\n            if(ref === false){\n              reject(new Error(\"unable to push hook event. LiveView not connected\"))\n            }\n          })\n        } catch (error){\n          reject(error)\n        }\n      })\n    }\n    return this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n      return view.pushHookEvent(this.el, targetCtx, event, payload, onReply)\n    })\n  }\n\n  handleEvent(event, callback){\n    let callbackRef = (customEvent, bypass) => bypass ? event : callback(customEvent.detail)\n    window.addEventListener(`phx:${event}`, callbackRef)\n    this.__listeners.add(callbackRef)\n    return callbackRef\n  }\n\n  removeHandleEvent(callbackRef){\n    let event = callbackRef(null, true)\n    window.removeEventListener(`phx:${event}`, callbackRef)\n    this.__listeners.delete(callbackRef)\n  }\n\n  upload(name, files){\n    return this.__view().dispatchUploads(null, name, files)\n  }\n\n  uploadTo(phxTarget, name, files){\n    return this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n      view.dispatchUploads(targetCtx, name, files)\n    })\n  }\n\n  __cleanup__(){\n    this.__listeners.forEach(callbackRef => this.removeHandleEvent(callbackRef))\n  }\n}\n", "import {\n  BEFORE_UNLOAD_LOADER_TIMEOUT,\n  CHECKABLE_INPUTS,\n  CONSECUTIVE_RELOADS,\n  PHX_AUTO_RECOVER,\n  PHX_COMPONENT,\n  PHX_CONNECTED_CLASS,\n  PHX_DISABLE_WITH,\n  PHX_DISABLE_WITH_RESTORE,\n  PHX_DISABLED,\n  PHX_LOADING_CLASS,\n  PHX_ERROR_CLASS,\n  PHX_CLIENT_ERROR_CLASS,\n  PHX_SERVER_ERROR_CLASS,\n  PHX_HAS_FOCUSED,\n  PHX_HAS_SUBMITTED,\n  PHX_HOOK,\n  PHX_PARENT_ID,\n  PHX_PROGRESS,\n  PHX_READONLY,\n  PHX_REF_LOADING,\n  PHX_REF_SRC,\n  PHX_REF_LOCK,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_STATIC,\n  PHX_TRACK_STATIC,\n  PHX_TRACK_UPLOADS,\n  PHX_UPDATE,\n  PHX_UPLOAD_REF,\n  PHX_VIEW_SELECTOR,\n  PHX_MAIN,\n  PHX_MOUNTED,\n  PUSH_TIMEOUT,\n  PHX_VIEWPORT_TOP,\n  PHX_VIEWPORT_BOTTOM,\n  MAX_CHILD_JOIN_ATTEMPTS\n} from \"./constants\"\n\nimport {\n  clone,\n  closestPhxBinding,\n  isEmpty,\n  isEqualObj,\n  logError,\n  maybe,\n  isCid,\n} from \"./utils\"\n\nimport Browser from \"./browser\"\nimport DOM from \"./dom\"\nimport ElementRef from \"./element_ref\"\nimport DOMPatch from \"./dom_patch\"\nimport LiveUploader from \"./live_uploader\"\nimport Rendered from \"./rendered\"\nimport ViewHook from \"./view_hook\"\nimport JS from \"./js\"\n\nexport let prependFormDataKey = (key, prefix) => {\n  let isArray = key.endsWith(\"[]\")\n  // Remove the \"[]\" if it's an array\n  let baseKey = isArray ? key.slice(0, -2) : key\n  // Replace last occurrence of key before a closing bracket or the end with key plus suffix\n  baseKey = baseKey.replace(/([^\\[\\]]+)(\\]?$)/, `${prefix}$1$2`)\n  // Add back the \"[]\" if it was an array\n  if(isArray){ baseKey += \"[]\" }\n  return baseKey\n}\n\nlet serializeForm = (form, metadata, onlyNames = []) => {\n  const {submitter, ...meta} = metadata\n\n  // We must inject the submitter in the order that it exists in the DOM\n  // relative to other inputs. For example, for checkbox groups, the order must be maintained.\n  let injectedElement\n  if(submitter && submitter.name){\n    const input = document.createElement(\"input\")\n    input.type = \"hidden\"\n    // set the form attribute if the submitter has one;\n    // this can happen if the element is outside the actual form element\n    const formId = submitter.getAttribute(\"form\")\n    if(formId){\n      input.setAttribute(\"form\", formId)\n    }\n    input.name = submitter.name\n    input.value = submitter.value\n    submitter.parentElement.insertBefore(input, submitter)\n    injectedElement = input\n  }\n\n  const formData = new FormData(form)\n  const toRemove = []\n\n  formData.forEach((val, key, _index) => {\n    if(val instanceof File){ toRemove.push(key) }\n  })\n\n  // Cleanup after building fileData\n  toRemove.forEach(key => formData.delete(key))\n\n  const params = new URLSearchParams()\n\n  let elements = Array.from(form.elements)\n  for(let [key, val] of formData.entries()){\n    if(onlyNames.length === 0 || onlyNames.indexOf(key) >= 0){\n      let inputs = elements.filter(input => input.name === key)\n      let isUnused = !inputs.some(input => (DOM.private(input, PHX_HAS_FOCUSED) || DOM.private(input, PHX_HAS_SUBMITTED)))\n      let hidden = inputs.every(input => input.type === \"hidden\")\n      if(isUnused && !(submitter && submitter.name == key) && !hidden){\n        params.append(prependFormDataKey(key, \"_unused_\"), \"\")\n      }\n      params.append(key, val)\n    }\n  }\n\n  // remove the injected element again\n  // (it would be removed by the next dom patch anyway, but this is cleaner)\n  if(submitter && injectedElement){\n    submitter.parentElement.removeChild(injectedElement)\n  }\n\n  for(let metaKey in meta){ params.append(metaKey, meta[metaKey]) }\n\n  return params.toString()\n}\n\nexport default class View {\n  static closestView(el){\n    let liveViewEl = el.closest(PHX_VIEW_SELECTOR)\n    return liveViewEl ? DOM.private(liveViewEl, \"view\") : null\n  }\n\n  constructor(el, liveSocket, parentView, flash, liveReferer){\n    this.isDead = false\n    this.liveSocket = liveSocket\n    this.flash = flash\n    this.parent = parentView\n    this.root = parentView ? parentView.root : this\n    this.el = el\n    DOM.putPrivate(this.el, \"view\", this)\n    this.id = this.el.id\n    this.ref = 0\n    this.lastAckRef = null\n    this.childJoins = 0\n    this.loaderTimer = null\n    this.pendingDiffs = []\n    this.pendingForms = new Set()\n    this.redirect = false\n    this.href = null\n    this.joinCount = this.parent ? this.parent.joinCount - 1 : 0\n    this.joinAttempts = 0\n    this.joinPending = true\n    this.destroyed = false\n    this.joinCallback = function(onDone){ onDone && onDone() }\n    this.stopCallback = function(){ }\n    this.pendingJoinOps = this.parent ? null : []\n    this.viewHooks = {}\n    this.formSubmits = []\n    this.children = this.parent ? null : {}\n    this.root.children[this.id] = {}\n    this.formsForRecovery = {}\n    this.channel = this.liveSocket.channel(`lv:${this.id}`, () => {\n      let url = this.href && this.expandURL(this.href)\n      return {\n        redirect: this.redirect ? url : undefined,\n        url: this.redirect ? undefined : url || undefined,\n        params: this.connectParams(liveReferer),\n        session: this.getSession(),\n        static: this.getStatic(),\n        flash: this.flash,\n      }\n    })\n  }\n\n  setHref(href){ this.href = href }\n\n  setRedirect(href){\n    this.redirect = true\n    this.href = href\n  }\n\n  isMain(){ return this.el.hasAttribute(PHX_MAIN) }\n\n  connectParams(liveReferer){\n    let params = this.liveSocket.params(this.el)\n    let manifest =\n      DOM.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`)\n        .map(node => node.src || node.href).filter(url => typeof (url) === \"string\")\n\n    if(manifest.length > 0){ params[\"_track_static\"] = manifest }\n    params[\"_mounts\"] = this.joinCount\n    params[\"_mount_attempts\"] = this.joinAttempts\n    params[\"_live_referer\"] = liveReferer\n    this.joinAttempts++\n\n    return params\n  }\n\n  isConnected(){ return this.channel.canPush() }\n\n  getSession(){ return this.el.getAttribute(PHX_SESSION) }\n\n  getStatic(){\n    let val = this.el.getAttribute(PHX_STATIC)\n    return val === \"\" ? null : val\n  }\n\n  destroy(callback = function (){ }){\n    this.destroyAllChildren()\n    this.destroyed = true\n    delete this.root.children[this.id]\n    if(this.parent){ delete this.root.children[this.parent.id][this.id] }\n    clearTimeout(this.loaderTimer)\n    let onFinished = () => {\n      callback()\n      for(let id in this.viewHooks){\n        this.destroyHook(this.viewHooks[id])\n      }\n    }\n\n    DOM.markPhxChildDestroyed(this.el)\n\n    this.log(\"destroyed\", () => [\"the child has been removed from the parent\"])\n    this.channel.leave()\n      .receive(\"ok\", onFinished)\n      .receive(\"error\", onFinished)\n      .receive(\"timeout\", onFinished)\n  }\n\n  setContainerClasses(...classes){\n    this.el.classList.remove(\n      PHX_CONNECTED_CLASS,\n      PHX_LOADING_CLASS,\n      PHX_ERROR_CLASS,\n      PHX_CLIENT_ERROR_CLASS,\n      PHX_SERVER_ERROR_CLASS\n    )\n    this.el.classList.add(...classes)\n  }\n\n  showLoader(timeout){\n    clearTimeout(this.loaderTimer)\n    if(timeout){\n      this.loaderTimer = setTimeout(() => this.showLoader(), timeout)\n    } else {\n      for(let id in this.viewHooks){ this.viewHooks[id].__disconnected() }\n      this.setContainerClasses(PHX_LOADING_CLASS)\n    }\n  }\n\n  execAll(binding){\n    DOM.all(this.el, `[${binding}]`, el => this.liveSocket.execJS(el, el.getAttribute(binding)))\n  }\n\n  hideLoader(){\n    clearTimeout(this.loaderTimer)\n    this.setContainerClasses(PHX_CONNECTED_CLASS)\n    this.execAll(this.binding(\"connected\"))\n  }\n\n  triggerReconnected(){\n    for(let id in this.viewHooks){ this.viewHooks[id].__reconnected() }\n  }\n\n  log(kind, msgCallback){\n    this.liveSocket.log(this, kind, msgCallback)\n  }\n\n  transition(time, onStart, onDone = function(){}){\n    this.liveSocket.transition(time, onStart, onDone)\n  }\n\n  // calls the callback with the view and target element for the given phxTarget\n  // targets can be:\n  //  * an element itself, then it is simply passed to liveSocket.owner;\n  //  * a CID (Component ID), then we first search the component's element in the DOM\n  //  * a selector, then we search the selector in the DOM and call the callback\n  //    for each element found with the corresponding owner view\n  withinTargets(phxTarget, callback, dom = document, viewEl){\n    // in the form recovery case we search in a template fragment instead of\n    // the real dom, therefore we optionally pass dom and viewEl\n\n    if(phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement){\n      return this.liveSocket.owner(phxTarget, view => callback(view, phxTarget))\n    }\n\n    if(isCid(phxTarget)){\n      let targets = DOM.findComponentNodeList(viewEl || this.el, phxTarget)\n      if(targets.length === 0){\n        logError(`no component found matching phx-target of ${phxTarget}`)\n      } else {\n        callback(this, parseInt(phxTarget))\n      }\n    } else {\n      let targets = Array.from(dom.querySelectorAll(phxTarget))\n      if(targets.length === 0){ logError(`nothing found matching the phx-target selector \"${phxTarget}\"`) }\n      targets.forEach(target => this.liveSocket.owner(target, view => callback(view, target)))\n    }\n  }\n\n  applyDiff(type, rawDiff, callback){\n    this.log(type, () => [\"\", clone(rawDiff)])\n    let {diff, reply, events, title} = Rendered.extract(rawDiff)\n    callback({diff, reply, events})\n    if(typeof title === \"string\" || type == \"mount\"){ window.requestAnimationFrame(() => DOM.putTitle(title)) }\n  }\n\n  onJoin(resp){\n    let {rendered, container, liveview_version} = resp\n    if(container){\n      let [tag, attrs] = container\n      this.el = DOM.replaceRootContainer(this.el, tag, attrs)\n    }\n    this.childJoins = 0\n    this.joinPending = true\n    this.flash = null\n    if(this.root === this){\n      this.formsForRecovery = this.getFormsForRecovery()\n    }\n    if(this.isMain() && window.history.state === null){\n      // set initial history entry if this is the first page load\n      this.liveSocket.replaceRootHistory()\n    }\n\n    if(liveview_version !== this.liveSocket.version()){\n      console.error(`LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${liveview_version}. To avoid issues, please ensure that your assets use the same version as the server.`)\n    }\n\n    Browser.dropLocal(this.liveSocket.localStorage, window.location.pathname, CONSECUTIVE_RELOADS)\n    this.applyDiff(\"mount\", rendered, ({diff, events}) => {\n      this.rendered = new Rendered(this.id, diff)\n      let [html, streams] = this.renderContainer(null, \"join\")\n      this.dropPendingRefs()\n      this.joinCount++\n      this.joinAttempts = 0\n\n      this.maybeRecoverForms(html, () => {\n        this.onJoinComplete(resp, html, streams, events)\n      })\n    })\n  }\n\n  dropPendingRefs(){\n    DOM.all(document, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, el => {\n      el.removeAttribute(PHX_REF_LOADING)\n      el.removeAttribute(PHX_REF_SRC)\n      el.removeAttribute(PHX_REF_LOCK)\n    })\n  }\n\n  onJoinComplete({live_patch}, html, streams, events){\n    // In order to provide a better experience, we want to join\n    // all LiveViews first and only then apply their patches.\n    if(this.joinCount > 1 || (this.parent && !this.parent.isJoinPending())){\n      return this.applyJoinPatch(live_patch, html, streams, events)\n    }\n\n    // One downside of this approach is that we need to find phxChildren\n    // in the html fragment, instead of directly on the DOM. The fragment\n    // also does not include PHX_STATIC, so we need to copy it over from\n    // the DOM.\n    let newChildren = DOM.findPhxChildrenInFragment(html, this.id).filter(toEl => {\n      let fromEl = toEl.id && this.el.querySelector(`[id=\"${toEl.id}\"]`)\n      let phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC)\n      if(phxStatic){ toEl.setAttribute(PHX_STATIC, phxStatic) }\n      // set PHX_ROOT_ID to prevent events from being dispatched to the root view\n      // while the child join is still pending\n      if(fromEl){ fromEl.setAttribute(PHX_ROOT_ID, this.root.id) }\n      return this.joinChild(toEl)\n    })\n\n    if(newChildren.length === 0){\n      if(this.parent){\n        this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)])\n        this.parent.ackJoin(this)\n      } else {\n        this.onAllChildJoinsComplete()\n        this.applyJoinPatch(live_patch, html, streams, events)\n      }\n    } else {\n      this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)])\n    }\n  }\n\n  attachTrueDocEl(){\n    this.el = DOM.byId(this.id)\n    this.el.setAttribute(PHX_ROOT_ID, this.root.id)\n  }\n\n  // this is invoked for dead and live views, so we must filter by\n  // by owner to ensure we aren't duplicating hooks across disconnect\n  // and connected states. This also handles cases where hooks exist\n  // in a root layout with a LV in the body\n  execNewMounted(parent = this.el){\n    let phxViewportTop = this.binding(PHX_VIEWPORT_TOP)\n    let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM)\n    DOM.all(parent, `[${phxViewportTop}], [${phxViewportBottom}]`, hookEl => {\n      if(this.ownsElement(hookEl)){\n        DOM.maintainPrivateHooks(hookEl, hookEl, phxViewportTop, phxViewportBottom)\n        this.maybeAddNewHook(hookEl)\n      }\n    })\n    DOM.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, hookEl => {\n      if(this.ownsElement(hookEl)){\n        this.maybeAddNewHook(hookEl)\n      }\n    })\n    DOM.all(parent, `[${this.binding(PHX_MOUNTED)}]`, el => {\n      if(this.ownsElement(el)){\n        this.maybeMounted(el)\n      }\n    })\n  }\n\n  applyJoinPatch(live_patch, html, streams, events){\n    this.attachTrueDocEl()\n    let patch = new DOMPatch(this, this.el, this.id, html, streams, null)\n    patch.markPrunableContentForRemoval()\n    this.performPatch(patch, false, true)\n    this.joinNewChildren()\n    this.execNewMounted()\n\n    this.joinPending = false\n    this.liveSocket.dispatchEvents(events)\n    this.applyPendingUpdates()\n\n    if(live_patch){\n      let {kind, to} = live_patch\n      this.liveSocket.historyPatch(to, kind)\n    }\n    this.hideLoader()\n    if(this.joinCount > 1){ this.triggerReconnected() }\n    this.stopCallback()\n  }\n\n  triggerBeforeUpdateHook(fromEl, toEl){\n    this.liveSocket.triggerDOM(\"onBeforeElUpdated\", [fromEl, toEl])\n    let hook = this.getHook(fromEl)\n    let isIgnored = hook && DOM.isIgnored(fromEl, this.binding(PHX_UPDATE))\n    if(hook && !fromEl.isEqualNode(toEl) && !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))){\n      hook.__beforeUpdate()\n      return hook\n    }\n  }\n\n  maybeMounted(el){\n    let phxMounted = el.getAttribute(this.binding(PHX_MOUNTED))\n    let hasBeenInvoked = phxMounted && DOM.private(el, \"mounted\")\n    if(phxMounted && !hasBeenInvoked){\n      this.liveSocket.execJS(el, phxMounted)\n      DOM.putPrivate(el, \"mounted\", true)\n    }\n  }\n\n  maybeAddNewHook(el){\n    let newHook = this.addHook(el)\n    if(newHook){ newHook.__mounted() }\n  }\n\n  performPatch(patch, pruneCids, isJoinPatch = false){\n    let removedEls = []\n    let phxChildrenAdded = false\n    let updatedHookIds = new Set()\n\n    this.liveSocket.triggerDOM(\"onPatchStart\", [patch.targetContainer])\n\n    patch.after(\"added\", el => {\n      this.liveSocket.triggerDOM(\"onNodeAdded\", [el])\n      let phxViewportTop = this.binding(PHX_VIEWPORT_TOP)\n      let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM)\n      DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom)\n      this.maybeAddNewHook(el)\n      if(el.getAttribute){ this.maybeMounted(el) }\n    })\n\n    patch.after(\"phxChildAdded\", el => {\n      if(DOM.isPhxSticky(el)){\n        this.liveSocket.joinRootViews()\n      } else {\n        phxChildrenAdded = true\n      }\n    })\n\n    patch.before(\"updated\", (fromEl, toEl) => {\n      let hook = this.triggerBeforeUpdateHook(fromEl, toEl)\n      if(hook){ updatedHookIds.add(fromEl.id) }\n    })\n\n    patch.after(\"updated\", el => {\n      if(updatedHookIds.has(el.id)){ this.getHook(el).__updated() }\n    })\n\n    patch.after(\"discarded\", (el) => {\n      if(el.nodeType === Node.ELEMENT_NODE){ removedEls.push(el) }\n    })\n\n    patch.after(\"transitionsDiscarded\", els => this.afterElementsRemoved(els, pruneCids))\n    patch.perform(isJoinPatch)\n    this.afterElementsRemoved(removedEls, pruneCids)\n\n    this.liveSocket.triggerDOM(\"onPatchEnd\", [patch.targetContainer])\n    return phxChildrenAdded\n  }\n\n  afterElementsRemoved(elements, pruneCids){\n    let destroyedCIDs = []\n    elements.forEach(parent => {\n      let components = DOM.all(parent, `[${PHX_COMPONENT}]`)\n      let hooks = DOM.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-hook]`)\n      components.concat(parent).forEach(el => {\n        let cid = this.componentID(el)\n        if(isCid(cid) && destroyedCIDs.indexOf(cid) === -1){ destroyedCIDs.push(cid) }\n      })\n      hooks.concat(parent).forEach(hookEl => {\n        let hook = this.getHook(hookEl)\n        hook && this.destroyHook(hook)\n      })\n    })\n    // We should not pruneCids on joins. Otherwise, in case of\n    // rejoins, we may notify cids that no longer belong to the\n    // current LiveView to be removed.\n    if(pruneCids){\n      this.maybePushComponentsDestroyed(destroyedCIDs)\n    }\n  }\n\n  joinNewChildren(){\n    DOM.findPhxChildren(this.el, this.id).forEach(el => this.joinChild(el))\n  }\n\n  maybeRecoverForms(html, callback){\n    const phxChange = this.binding(\"change\")\n    const oldForms = this.root.formsForRecovery\n    // So why do we create a template element here?\n    // One way to recover forms would be to immediately apply the mount\n    // patch and then afterwards recover the forms. However, this would\n    // cause a flicker, because the mount patch would remove the form content\n    // until it is restored. Therefore LV decided to do form recovery with the\n    // raw HTML before it is applied and delay the mount patch until the form\n    // recovery events are done.\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    // because we work with a template element, we must manually copy the attributes\n    // otherwise the owner / target helpers don't work properly\n    const rootEl = template.content.firstElementChild\n    rootEl.id = this.id\n    rootEl.setAttribute(PHX_ROOT_ID, this.root.id)\n    rootEl.setAttribute(PHX_SESSION, this.getSession())\n    rootEl.setAttribute(PHX_STATIC, this.getStatic())\n    rootEl.setAttribute(PHX_PARENT_ID, this.parent ? this.parent.id : null)\n\n    // we go over all form elements in the new HTML for the LV\n    // and look for old forms in the `formsForRecovery` object;\n    // the formsForRecovery can also contain forms from child views\n    const formsToRecover =\n      // we go over all forms in the new DOM; because this is only the HTML for the current\n      // view, we can be sure that all forms are owned by this view:\n      DOM.all(template.content, \"form\")\n        // only recover forms that have an id and are in the old DOM\n        .filter(newForm => newForm.id && oldForms[newForm.id])\n        // abandon forms we already tried to recover to prevent looping a failed state\n        .filter(newForm => !this.pendingForms.has(newForm.id))\n        // only recover if the form has the same phx-change value\n        .filter(newForm => oldForms[newForm.id].getAttribute(phxChange) === newForm.getAttribute(phxChange))\n        .map(newForm => {\n          return [oldForms[newForm.id], newForm]\n        })\n\n    if(formsToRecover.length === 0){\n      return callback()\n    }\n\n    formsToRecover.forEach(([oldForm, newForm], i) => {\n      this.pendingForms.add(newForm.id)\n      // it is important to use the firstElementChild of the template content\n      // because when traversing a documentFragment using parentNode, we won't ever arrive at\n      // the fragment; as the template is always a LiveView, we can be sure that there is only\n      // one child on the root level\n      this.pushFormRecovery(oldForm, newForm, template.content.firstElementChild, () => {\n        this.pendingForms.delete(newForm.id)\n        // we only call the callback once all forms have been recovered\n        if(i === formsToRecover.length - 1){\n          callback()\n        }\n      })\n    })\n  }\n\n  getChildById(id){ return this.root.children[this.id][id] }\n\n  getDescendentByEl(el){\n    if(el.id === this.id){\n      return this\n    } else {\n      return this.children[el.getAttribute(PHX_PARENT_ID)]?.[el.id]\n    }\n  }\n\n  destroyDescendent(id){\n    for(let parentId in this.root.children){\n      for(let childId in this.root.children[parentId]){\n        if(childId === id){ return this.root.children[parentId][childId].destroy() }\n      }\n    }\n  }\n\n  joinChild(el){\n    let child = this.getChildById(el.id)\n    if(!child){\n      let view = new View(el, this.liveSocket, this)\n      this.root.children[this.id][view.id] = view\n      view.join()\n      this.childJoins++\n      return true\n    }\n  }\n\n  isJoinPending(){ return this.joinPending }\n\n  ackJoin(_child){\n    this.childJoins--\n\n    if(this.childJoins === 0){\n      if(this.parent){\n        this.parent.ackJoin(this)\n      } else {\n        this.onAllChildJoinsComplete()\n      }\n    }\n  }\n\n  onAllChildJoinsComplete(){\n    // we can clear pending form recoveries now that we've joined.\n    // They either all resolved or were abandoned\n    this.pendingForms.clear()\n    // we can also clear the formsForRecovery object to not keep old form elements around\n    this.formsForRecovery = {}\n    this.joinCallback(() => {\n      this.pendingJoinOps.forEach(([view, op]) => {\n        if(!view.isDestroyed()){ op() }\n      })\n      this.pendingJoinOps = []\n    })\n  }\n\n  update(diff, events){\n    if(this.isJoinPending() || (this.liveSocket.hasPendingLink() && this.root.isMain())){\n      return this.pendingDiffs.push({diff, events})\n    }\n\n    this.rendered.mergeDiff(diff)\n    let phxChildrenAdded = false\n\n    // When the diff only contains component diffs, then walk components\n    // and patch only the parent component containers found in the diff.\n    // Otherwise, patch entire LV container.\n    if(this.rendered.isComponentOnlyDiff(diff)){\n      this.liveSocket.time(\"component patch complete\", () => {\n        let parentCids = DOM.findExistingParentCIDs(this.el, this.rendered.componentCIDs(diff))\n        parentCids.forEach(parentCID => {\n          if(this.componentPatch(this.rendered.getComponent(diff, parentCID), parentCID)){ phxChildrenAdded = true }\n        })\n      })\n    } else if(!isEmpty(diff)){\n      this.liveSocket.time(\"full patch complete\", () => {\n        let [html, streams] = this.renderContainer(diff, \"update\")\n        let patch = new DOMPatch(this, this.el, this.id, html, streams, null)\n        phxChildrenAdded = this.performPatch(patch, true)\n      })\n    }\n\n    this.liveSocket.dispatchEvents(events)\n    if(phxChildrenAdded){ this.joinNewChildren() }\n  }\n\n  renderContainer(diff, kind){\n    return this.liveSocket.time(`toString diff (${kind})`, () => {\n      let tag = this.el.tagName\n      // Don't skip any component in the diff nor any marked as pruned\n      // (as they may have been added back)\n      let cids = diff ? this.rendered.componentCIDs(diff) : null\n      let [html, streams] = this.rendered.toString(cids)\n      return [`<${tag}>${html}</${tag}>`, streams]\n    })\n  }\n\n  componentPatch(diff, cid){\n    if(isEmpty(diff)) return false\n    let [html, streams] = this.rendered.componentToString(cid)\n    let patch = new DOMPatch(this, this.el, this.id, html, streams, cid)\n    let childrenAdded = this.performPatch(patch, true)\n    return childrenAdded\n  }\n\n  getHook(el){ return this.viewHooks[ViewHook.elementID(el)] }\n\n  addHook(el){\n    let hookElId = ViewHook.elementID(el)\n\n    if(hookElId && !this.viewHooks[hookElId]){\n      // hook created, but not attached (createHook for web component)\n      let hook = DOM.getCustomElHook(el) || logError(`no hook found for custom element: ${el.id}`)\n      this.viewHooks[hookElId] = hook\n      hook.__attachView(this)\n      return hook\n    }\n    else if(hookElId || !el.getAttribute){\n      // no hook found\n      return\n    } else {\n      // new hook found with phx-hook attribute\n      let hookName = el.getAttribute(`data-phx-${PHX_HOOK}`) || el.getAttribute(this.binding(PHX_HOOK))\n      if(hookName && !this.ownsElement(el)){ return }\n      let callbacks = this.liveSocket.getHookCallbacks(hookName)\n\n      if(callbacks){\n        if(!el.id){ logError(`no DOM ID for hook \"${hookName}\". Hooks require a unique ID on each element.`, el) }\n        let hook = new ViewHook(this, el, callbacks)\n        this.viewHooks[ViewHook.elementID(hook.el)] = hook\n        return hook\n      } else if(hookName !== null){\n        logError(`unknown hook found for \"${hookName}\"`, el)\n      }\n    }\n  }\n\n  destroyHook(hook){\n    hook.__destroyed()\n    hook.__cleanup__()\n    delete this.viewHooks[ViewHook.elementID(hook.el)]\n  }\n\n  applyPendingUpdates(){\n    this.pendingDiffs.forEach(({diff, events}) => this.update(diff, events))\n    this.pendingDiffs = []\n    this.eachChild(child => child.applyPendingUpdates())\n  }\n\n  eachChild(callback){\n    let children = this.root.children[this.id] || {}\n    for(let id in children){ callback(this.getChildById(id)) }\n  }\n\n  onChannel(event, cb){\n    this.liveSocket.onChannel(this.channel, event, resp => {\n      if(this.isJoinPending()){\n        this.root.pendingJoinOps.push([this, () => cb(resp)])\n      } else {\n        this.liveSocket.requestDOMUpdate(() => cb(resp))\n      }\n    })\n  }\n\n  bindChannel(){\n    // The diff event should be handled by the regular update operations.\n    // All other operations are queued to be applied only after join.\n    this.liveSocket.onChannel(this.channel, \"diff\", (rawDiff) => {\n      this.liveSocket.requestDOMUpdate(() => {\n        this.applyDiff(\"update\", rawDiff, ({diff, events}) => this.update(diff, events))\n      })\n    })\n    this.onChannel(\"redirect\", ({to, flash}) => this.onRedirect({to, flash}))\n    this.onChannel(\"live_patch\", (redir) => this.onLivePatch(redir))\n    this.onChannel(\"live_redirect\", (redir) => this.onLiveRedirect(redir))\n    this.channel.onError(reason => this.onError(reason))\n    this.channel.onClose(reason => this.onClose(reason))\n  }\n\n  destroyAllChildren(){ this.eachChild(child => child.destroy()) }\n\n  onLiveRedirect(redir){\n    let {to, kind, flash} = redir\n    let url = this.expandURL(to)\n    let e = new CustomEvent(\"phx:server-navigate\", {detail: {to, kind, flash}})\n    this.liveSocket.historyRedirect(e, url, kind, flash)\n  }\n\n  onLivePatch(redir){\n    let {to, kind} = redir\n    this.href = this.expandURL(to)\n    this.liveSocket.historyPatch(to, kind)\n  }\n\n  expandURL(to){\n    return to.startsWith(\"/\") ? `${window.location.protocol}//${window.location.host}${to}` : to\n  }\n\n  onRedirect({to, flash, reloadToken}){ this.liveSocket.redirect(to, flash, reloadToken) }\n\n  isDestroyed(){ return this.destroyed }\n\n  joinDead(){ this.isDead = true }\n\n  joinPush(){\n    this.joinPush = this.joinPush || this.channel.join()\n    return this.joinPush\n  }\n\n  join(callback){\n    this.showLoader(this.liveSocket.loaderTimeout)\n    this.bindChannel()\n    if(this.isMain()){\n      this.stopCallback = this.liveSocket.withPageLoading({to: this.href, kind: \"initial\"})\n    }\n    this.joinCallback = (onDone) => {\n      onDone = onDone || function(){}\n      callback ? callback(this.joinCount, onDone) : onDone()\n    }\n\n    this.wrapPush(() => this.channel.join(), {\n      ok: (resp) => this.liveSocket.requestDOMUpdate(() => this.onJoin(resp)),\n      error: (error) => this.onJoinError(error),\n      timeout: () => this.onJoinError({reason: \"timeout\"})\n    })\n  }\n\n  onJoinError(resp){\n    if(resp.reason === \"reload\"){\n      this.log(\"error\", () => [`failed mount with ${resp.status}. Falling back to page reload`, resp])\n      this.onRedirect({to: this.root.href, reloadToken: resp.token})\n      return\n    } else if(resp.reason === \"unauthorized\" || resp.reason === \"stale\"){\n      this.log(\"error\", () => [\"unauthorized live_redirect. Falling back to page request\", resp])\n      this.onRedirect({to: this.root.href})\n      return\n    }\n    if(resp.redirect || resp.live_redirect){\n      this.joinPending = false\n      this.channel.leave()\n    }\n    if(resp.redirect){ return this.onRedirect(resp.redirect) }\n    if(resp.live_redirect){ return this.onLiveRedirect(resp.live_redirect) }\n    this.log(\"error\", () => [\"unable to join\", resp])\n    if(this.isMain()){\n      this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n      if(this.liveSocket.isConnected()){ this.liveSocket.reloadWithJitter(this) }\n    } else {\n      if(this.joinAttempts >= MAX_CHILD_JOIN_ATTEMPTS){\n        // put the root review into permanent error state, but don't destroy it as it can remain active\n        this.root.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n        this.log(\"error\", () => [`giving up trying to mount after ${MAX_CHILD_JOIN_ATTEMPTS} tries`, resp])\n        this.destroy()\n      }\n      let trueChildEl = DOM.byId(this.el.id)\n      if(trueChildEl){\n        DOM.mergeAttrs(trueChildEl, this.el)\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n        this.el = trueChildEl\n      } else {\n        this.destroy()\n      }\n    }\n  }\n\n  onClose(reason){\n    if(this.isDestroyed()){ return }\n    if(this.isMain() && this.liveSocket.hasPendingLink() && reason !== \"leave\"){\n      return this.liveSocket.reloadWithJitter(this)\n    }\n    this.destroyAllChildren()\n    this.liveSocket.dropActiveElement(this)\n    // document.activeElement can be null in Internet Explorer 11\n    if(document.activeElement){ document.activeElement.blur() }\n    if(this.liveSocket.isUnloaded()){\n      this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT)\n    }\n  }\n\n  onError(reason){\n    this.onClose(reason)\n    if(this.liveSocket.isConnected()){ this.log(\"error\", () => [\"view crashed\", reason]) }\n    if(!this.liveSocket.isUnloaded()){\n      if(this.liveSocket.isConnected()){\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n      } else {\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_CLIENT_ERROR_CLASS])\n      }\n    }\n  }\n\n  displayError(classes){\n    if(this.isMain()){ DOM.dispatchEvent(window, \"phx:page-loading-start\", {detail: {to: this.href, kind: \"error\"}}) }\n    this.showLoader()\n    this.setContainerClasses(...classes)\n    this.execAll(this.binding(\"disconnected\"))\n  }\n\n  wrapPush(callerPush, receives){\n    let latency = this.liveSocket.getLatencySim()\n    let withLatency = latency ?\n      (cb) => setTimeout(() => !this.isDestroyed() && cb(), latency) :\n      (cb) => !this.isDestroyed() && cb()\n\n    withLatency(() => {\n      callerPush()\n        .receive(\"ok\", resp => withLatency(() => receives.ok && receives.ok(resp)))\n        .receive(\"error\", reason => withLatency(() => receives.error && receives.error(reason)))\n        .receive(\"timeout\", () => withLatency(() => receives.timeout && receives.timeout()))\n    })\n  }\n\n  pushWithReply(refGenerator, event, payload){\n    if(!this.isConnected()){ return Promise.reject({error: \"noconnection\"}) }\n\n    let [ref, [el], opts] = refGenerator ? refGenerator() : [null, [], {}]\n    let oldJoinCount = this.joinCount\n    let onLoadingDone = function(){}\n    if(opts.page_loading){\n      onLoadingDone = this.liveSocket.withPageLoading({kind: \"element\", target: el})\n    }\n\n    if(typeof (payload.cid) !== \"number\"){ delete payload.cid }\n\n    return new Promise((resolve, reject) => {\n      this.wrapPush(() => this.channel.push(event, payload, PUSH_TIMEOUT), {\n        ok: (resp) => {\n          if(ref !== null){ this.lastAckRef = ref }\n          let finish = (hookReply) => {\n            if(resp.redirect){ this.onRedirect(resp.redirect) }\n            if(resp.live_patch){ this.onLivePatch(resp.live_patch) }\n            if(resp.live_redirect){ this.onLiveRedirect(resp.live_redirect) }\n            onLoadingDone()\n            resolve({resp: resp, reply: hookReply})\n          }\n          if(resp.diff){\n            this.liveSocket.requestDOMUpdate(() => {\n              this.applyDiff(\"update\", resp.diff, ({diff, reply, events}) => {\n                if(ref !== null){\n                  this.undoRefs(ref, payload.event)\n                }\n                this.update(diff, events)\n                finish(reply)\n              })\n            })\n          } else {\n            if(ref !== null){ this.undoRefs(ref, payload.event) }\n            finish(null)\n          }\n        },\n        error: (reason) => reject({error: reason}),\n        timeout: () => {\n          reject({timeout: true})\n          if(this.joinCount === oldJoinCount){\n            this.liveSocket.reloadWithJitter(this, () => {\n              this.log(\"timeout\", () => [\"received timeout while communicating with server. Falling back to hard refresh for recovery\"])\n            })\n          }\n        }\n      })\n    })\n  }\n\n  undoRefs(ref, phxEvent, onlyEls){\n    if(!this.isConnected()){ return } // exit if external form triggered\n    let selector = `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`\n\n    if(onlyEls){\n      onlyEls = new Set(onlyEls)\n      DOM.all(document, selector, parent => {\n        if(onlyEls && !onlyEls.has(parent)){ return }\n        // undo any child refs within parent first\n        DOM.all(parent, selector, child => this.undoElRef(child, ref, phxEvent))\n        this.undoElRef(parent, ref, phxEvent)\n      })\n    } else {\n      DOM.all(document, selector, el => this.undoElRef(el, ref, phxEvent))\n    }\n  }\n\n  undoElRef(el, ref, phxEvent){\n    let elRef = new ElementRef(el)\n\n    elRef.maybeUndo(ref, phxEvent, clonedTree => {\n      let hook = this.triggerBeforeUpdateHook(el, clonedTree)\n      DOMPatch.patchWithClonedTree(el, clonedTree, this.liveSocket)\n      DOM.all(el, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, child => this.undoElRef(child, ref, phxEvent))\n      this.execNewMounted(el)\n      if(hook){ hook.__updated() }\n    })\n  }\n\n  refSrc(){ return this.el.id }\n\n  putRef(elements, phxEvent, eventType, opts = {}){\n    let newRef = this.ref++\n    let disableWith = this.binding(PHX_DISABLE_WITH)\n    if(opts.loading){\n      let loadingEls = DOM.all(document, opts.loading).map(el => {\n        return {el, lock: true, loading: true}\n      })\n      elements = elements.concat(loadingEls)\n    }\n\n    for(let {el, lock, loading} of elements){\n      if(!lock && !loading){ throw new Error(\"putRef requires lock or loading\") }\n      el.setAttribute(PHX_REF_SRC, this.refSrc())\n      if(loading){ el.setAttribute(PHX_REF_LOADING, newRef) }\n      if(lock){ el.setAttribute(PHX_REF_LOCK, newRef) }\n\n      if(!loading || (opts.submitter && !(el === opts.submitter || el === opts.form))){ continue }\n\n      let lockCompletePromise = new Promise(resolve => {\n        el.addEventListener(`phx:undo-lock:${newRef}`, () => resolve(detail), {once: true})\n      })\n\n      let loadingCompletePromise = new Promise(resolve => {\n        el.addEventListener(`phx:undo-loading:${newRef}`, () => resolve(detail), {once: true})\n      })\n\n      el.classList.add(`phx-${eventType}-loading`)\n      let disableText = el.getAttribute(disableWith)\n      if(disableText !== null){\n        if(!el.getAttribute(PHX_DISABLE_WITH_RESTORE)){\n          el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText)\n        }\n        if(disableText !== \"\"){ el.innerText = disableText }\n        // PHX_DISABLED could have already been set in disableForm\n        el.setAttribute(PHX_DISABLED, el.getAttribute(PHX_DISABLED) || el.disabled)\n        el.setAttribute(\"disabled\", \"\")\n      }\n\n      let detail = {\n        event: phxEvent,\n        eventType: eventType,\n        ref: newRef,\n        isLoading: loading,\n        isLocked: lock,\n        lockElements: elements.filter(({lock}) => lock).map(({el}) => el),\n        loadingElements: elements.filter(({loading}) => loading).map(({el}) => el),\n        unlock: (els) => {\n          els = Array.isArray(els) ? els : [els]\n          this.undoRefs(newRef, phxEvent, els)\n        },\n        lockComplete: lockCompletePromise,\n        loadingComplete: loadingCompletePromise,\n        lock: (lockEl) => {\n          return new Promise(resolve => {\n            if(this.isAcked(newRef)){ return resolve(detail) }\n            lockEl.setAttribute(PHX_REF_LOCK, newRef)\n            lockEl.setAttribute(PHX_REF_SRC, this.refSrc())\n            lockEl.addEventListener(`phx:lock-stop:${newRef}`, () => resolve(detail), {once: true})\n          })\n        }\n      }\n      el.dispatchEvent(new CustomEvent(\"phx:push\", {\n        detail: detail,\n        bubbles: true,\n        cancelable: false\n      }))\n      if(phxEvent){\n        el.dispatchEvent(new CustomEvent(`phx:push:${phxEvent}`, {\n          detail: detail,\n          bubbles: true,\n          cancelable: false\n        }))\n      }\n    }\n    return [newRef, elements.map(({el}) => el), opts]\n  }\n\n  isAcked(ref){ return this.lastAckRef !== null && this.lastAckRef >= ref }\n\n  componentID(el){\n    let cid = el.getAttribute && el.getAttribute(PHX_COMPONENT)\n    return cid ? parseInt(cid) : null\n  }\n\n  targetComponentID(target, targetCtx, opts = {}){\n    if(isCid(targetCtx)){ return targetCtx }\n\n    let cidOrSelector = opts.target || target.getAttribute(this.binding(\"target\"))\n    if(isCid(cidOrSelector)){\n      return parseInt(cidOrSelector)\n    } else if(targetCtx && (cidOrSelector !== null || opts.target)){\n      return this.closestComponentID(targetCtx)\n    } else {\n      return null\n    }\n  }\n\n  closestComponentID(targetCtx){\n    if(isCid(targetCtx)){\n      return targetCtx\n    } else if(targetCtx){\n      return maybe(targetCtx.closest(`[${PHX_COMPONENT}]`), el => this.ownsElement(el) && this.componentID(el))\n    } else {\n      return null\n    }\n  }\n\n  pushHookEvent(el, targetCtx, event, payload, onReply){\n    if(!this.isConnected()){\n      this.log(\"hook\", () => [\"unable to push hook event. LiveView not connected\", event, payload])\n      return false\n    }\n    let [ref, els, opts] = this.putRef([{el, loading: true, lock: true}], event, \"hook\")\n    this.pushWithReply(() => [ref, els, opts], \"event\", {\n      type: \"hook\",\n      event: event,\n      value: payload,\n      cid: this.closestComponentID(targetCtx)\n    }).then(({resp: _resp, reply: hookReply}) => onReply(hookReply, ref))\n\n    return ref\n  }\n\n  extractMeta(el, meta, value){\n    let prefix = this.binding(\"value-\")\n    for(let i = 0; i < el.attributes.length; i++){\n      if(!meta){ meta = {} }\n      let name = el.attributes[i].name\n      if(name.startsWith(prefix)){ meta[name.replace(prefix, \"\")] = el.getAttribute(name) }\n    }\n    if(el.value !== undefined && !(el instanceof HTMLFormElement)){\n      if(!meta){ meta = {} }\n      meta.value = el.value\n\n      if(el.tagName === \"INPUT\" && CHECKABLE_INPUTS.indexOf(el.type) >= 0 && !el.checked){\n        delete meta.value\n      }\n    }\n    if(value){\n      if(!meta){ meta = {} }\n      for(let key in value){ meta[key] = value[key] }\n    }\n    return meta\n  }\n\n  pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}, onReply){\n    this.pushWithReply(() => this.putRef([{el, loading: true, lock: true}], phxEvent, type, opts), \"event\", {\n      type: type,\n      event: phxEvent,\n      value: this.extractMeta(el, meta, opts.value),\n      cid: this.targetComponentID(el, targetCtx, opts)\n    }).then(({reply}) => onReply && onReply(reply))\n  }\n\n  pushFileProgress(fileEl, entryRef, progress, onReply = function (){ }){\n    this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => {\n      view.pushWithReply(null, \"progress\", {\n        event: fileEl.getAttribute(view.binding(PHX_PROGRESS)),\n        ref: fileEl.getAttribute(PHX_UPLOAD_REF),\n        entry_ref: entryRef,\n        progress: progress,\n        cid: view.targetComponentID(fileEl.form, targetCtx)\n      }).then(({resp}) => onReply(resp))\n    })\n  }\n\n  pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback){\n    if(!inputEl.form){\n      throw new Error(\"form events require the input to be inside a form\")\n    }\n\n    let uploads\n    let cid = isCid(forceCid) ? forceCid : this.targetComponentID(inputEl.form, targetCtx, opts)\n    let refGenerator = () => {\n      return this.putRef([\n        {el: inputEl, loading: true, lock: true},\n        {el: inputEl.form, loading: true, lock: true}\n      ], phxEvent, \"change\", opts)\n    }\n    let formData\n    let meta  = this.extractMeta(inputEl.form)\n    if(inputEl instanceof HTMLButtonElement){ meta.submitter = inputEl }\n    if(inputEl.getAttribute(this.binding(\"change\"))){\n      formData = serializeForm(inputEl.form, {_target: opts._target, ...meta}, [inputEl.name])\n    } else {\n      formData = serializeForm(inputEl.form, {_target: opts._target, ...meta})\n    }\n    if(DOM.isUploadInput(inputEl) && inputEl.files && inputEl.files.length > 0){\n      LiveUploader.trackFiles(inputEl, Array.from(inputEl.files))\n    }\n    uploads = LiveUploader.serializeUploads(inputEl)\n\n    let event = {\n      type: \"form\",\n      event: phxEvent,\n      value: formData,\n      uploads: uploads,\n      cid: cid\n    }\n    this.pushWithReply(refGenerator, \"event\", event).then(({resp}) => {\n      if(DOM.isUploadInput(inputEl) && DOM.isAutoUpload(inputEl)){\n        if(LiveUploader.filesAwaitingPreflight(inputEl).length > 0){\n          let [ref, _els] = refGenerator()\n          this.undoRefs(ref, phxEvent, [inputEl.form])\n          this.uploadFiles(inputEl.form, phxEvent, targetCtx, ref, cid, (_uploads) => {\n            callback && callback(resp)\n            this.triggerAwaitingSubmit(inputEl.form, phxEvent)\n            this.undoRefs(ref, phxEvent)\n          })\n        }\n      } else {\n        callback && callback(resp)\n      }\n    })\n  }\n\n  triggerAwaitingSubmit(formEl, phxEvent){\n    let awaitingSubmit = this.getScheduledSubmit(formEl)\n    if(awaitingSubmit){\n      let [_el, _ref, _opts, callback] = awaitingSubmit\n      this.cancelSubmit(formEl, phxEvent)\n      callback()\n    }\n  }\n\n  getScheduledSubmit(formEl){\n    return this.formSubmits.find(([el, _ref, _opts, _callback]) => el.isSameNode(formEl))\n  }\n\n  scheduleSubmit(formEl, ref, opts, callback){\n    if(this.getScheduledSubmit(formEl)){ return true }\n    this.formSubmits.push([formEl, ref, opts, callback])\n  }\n\n  cancelSubmit(formEl, phxEvent){\n    this.formSubmits = this.formSubmits.filter(([el, ref, _opts, _callback]) => {\n      if(el.isSameNode(formEl)){\n        this.undoRefs(ref, phxEvent)\n        return false\n      } else {\n        return true\n      }\n    })\n  }\n\n  disableForm(formEl, phxEvent, opts = {}){\n    let filterIgnored = el => {\n      let userIgnored = closestPhxBinding(el, `${this.binding(PHX_UPDATE)}=ignore`, el.form)\n      return !(userIgnored || closestPhxBinding(el, \"data-phx-update=ignore\", el.form))\n    }\n    let filterDisables = el => {\n      return el.hasAttribute(this.binding(PHX_DISABLE_WITH))\n    }\n    let filterButton = el => el.tagName == \"BUTTON\"\n\n    let filterInput = el => [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(el.tagName)\n\n    let formElements = Array.from(formEl.elements)\n    let disables = formElements.filter(filterDisables)\n    let buttons = formElements.filter(filterButton).filter(filterIgnored)\n    let inputs = formElements.filter(filterInput).filter(filterIgnored)\n\n    buttons.forEach(button => {\n      button.setAttribute(PHX_DISABLED, button.disabled)\n      button.disabled = true\n    })\n    inputs.forEach(input => {\n      input.setAttribute(PHX_READONLY, input.readOnly)\n      input.readOnly = true\n      if(input.files){\n        input.setAttribute(PHX_DISABLED, input.disabled)\n        input.disabled = true\n      }\n    })\n    let formEls = disables.concat(buttons).concat(inputs).map(el => {\n      return {el, loading: true, lock: true}\n    })\n\n    // we reverse the order so form children are already locked by the time\n    // the form is locked\n    let els = [{el: formEl, loading: true, lock: false}].concat(formEls).reverse()\n    return this.putRef(els, phxEvent, \"submit\", opts)\n  }\n\n  pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply){\n    let refGenerator = () => this.disableForm(formEl, phxEvent, {\n      ...opts,\n      form: formEl,\n      submitter: submitter\n    })\n    let cid = this.targetComponentID(formEl, targetCtx)\n    if(LiveUploader.hasUploadsInProgress(formEl)){\n      let [ref, _els] = refGenerator()\n      let push = () => this.pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply)\n      return this.scheduleSubmit(formEl, ref, opts, push)\n    } else if(LiveUploader.inputsAwaitingPreflight(formEl).length > 0){\n      let [ref, els] = refGenerator()\n      let proxyRefGen = () => [ref, els, opts]\n      this.uploadFiles(formEl, phxEvent, targetCtx, ref, cid, (_uploads) => {\n        // if we still having pending preflights it means we have invalid entries\n        // and the phx-submit cannot be completed\n        if(LiveUploader.inputsAwaitingPreflight(formEl).length > 0){\n          return this.undoRefs(ref, phxEvent)\n        }\n        let meta = this.extractMeta(formEl)\n        let formData = serializeForm(formEl, {submitter, ...meta})\n        this.pushWithReply(proxyRefGen, \"event\", {\n          type: \"form\",\n          event: phxEvent,\n          value: formData,\n          cid: cid\n        }).then(({resp}) => onReply(resp))\n      })\n    } else if(!(formEl.hasAttribute(PHX_REF_SRC) && formEl.classList.contains(\"phx-submit-loading\"))){\n      let meta = this.extractMeta(formEl)\n      let formData = serializeForm(formEl, {submitter, ...meta})\n      this.pushWithReply(refGenerator, \"event\", {\n        type: \"form\",\n        event: phxEvent,\n        value: formData,\n        cid: cid\n      }).then(({resp}) => onReply(resp))\n    }\n  }\n\n  uploadFiles(formEl, phxEvent, targetCtx, ref, cid, onComplete){\n    let joinCountAtUpload = this.joinCount\n    let inputEls = LiveUploader.activeFileInputs(formEl)\n    let numFileInputsInProgress = inputEls.length\n\n    // get each file input\n    inputEls.forEach(inputEl => {\n      let uploader = new LiveUploader(inputEl, this, () => {\n        numFileInputsInProgress--\n        if(numFileInputsInProgress === 0){ onComplete() }\n      })\n\n      let entries = uploader.entries().map(entry => entry.toPreflightPayload())\n\n      if(entries.length === 0){\n        numFileInputsInProgress--\n        return\n      }\n\n      let payload = {\n        ref: inputEl.getAttribute(PHX_UPLOAD_REF),\n        entries: entries,\n        cid: this.targetComponentID(inputEl.form, targetCtx)\n      }\n\n      this.log(\"upload\", () => [\"sending preflight request\", payload])\n\n      this.pushWithReply(null, \"allow_upload\", payload).then(({resp}) => {\n        this.log(\"upload\", () => [\"got preflight response\", resp])\n        // the preflight will reject entries beyond the max entries\n        // so we error and cancel entries on the client that are missing from the response\n        uploader.entries().forEach(entry => {\n          if(resp.entries && !resp.entries[entry.ref]){\n            this.handleFailedEntryPreflight(entry.ref, \"failed preflight\", uploader)\n          }\n        })\n        // for auto uploads, we may have an empty entries response from the server\n        // for form submits that contain invalid entries\n        if(resp.error || Object.keys(resp.entries).length === 0){\n          this.undoRefs(ref, phxEvent)\n          let errors = resp.error || []\n          errors.map(([entry_ref, reason]) => {\n            this.handleFailedEntryPreflight(entry_ref, reason, uploader)\n          })\n        } else {\n          let onError = (callback) => {\n            this.channel.onError(() => {\n              if(this.joinCount === joinCountAtUpload){ callback() }\n            })\n          }\n          uploader.initAdapterUpload(resp, onError, this.liveSocket)\n        }\n      })\n    })\n  }\n\n  handleFailedEntryPreflight(uploadRef, reason, uploader){\n    if(uploader.isAutoUpload()){\n      // uploadRef may be top level upload config ref or entry ref\n      let entry = uploader.entries().find(entry => entry.ref === uploadRef.toString())\n      if(entry){ entry.cancel() }\n    } else {\n      uploader.entries().map(entry => entry.cancel())\n    }\n    this.log(\"upload\", () => [`error for entry ${uploadRef}`, reason])\n  }\n\n  dispatchUploads(targetCtx, name, filesOrBlobs){\n    let targetElement = this.targetCtxElement(targetCtx) || this.el\n    let inputs = DOM.findUploadInputs(targetElement).filter(el => el.name === name)\n    if(inputs.length === 0){ logError(`no live file inputs found matching the name \"${name}\"`) }\n    else if(inputs.length > 1){ logError(`duplicate live file inputs found matching the name \"${name}\"`) }\n    else { DOM.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, {detail: {files: filesOrBlobs}}) }\n  }\n\n  targetCtxElement(targetCtx){\n    if(isCid(targetCtx)){\n      let [target] = DOM.findComponentNodeList(this.el, targetCtx)\n      return target\n    } else if(targetCtx){\n      return targetCtx\n    } else {\n      return null\n    }\n  }\n\n  pushFormRecovery(oldForm, newForm, templateDom, callback){\n    // we are only recovering forms inside the current view, therefore it is safe to\n    // skip withinOwners here and always use this when referring to the view\n    const phxChange = this.binding(\"change\")\n    const phxTarget = newForm.getAttribute(this.binding(\"target\")) || newForm\n    const phxEvent = newForm.getAttribute(this.binding(PHX_AUTO_RECOVER)) || newForm.getAttribute(this.binding(\"change\"))\n    const inputs = Array.from(oldForm.elements).filter(el => DOM.isFormInput(el) && el.name && !el.hasAttribute(phxChange))\n    if(inputs.length === 0){ return }\n\n    // we must clear tracked uploads before recovery as they no longer have valid refs\n    inputs.forEach(input => input.hasAttribute(PHX_UPLOAD_REF) && LiveUploader.clearFiles(input))\n    // pushInput assumes that there is a source element that initiated the change;\n    // because this is not the case when we recover forms, we provide the first input we find\n    let input = inputs.find(el => el.type !== \"hidden\") || inputs[0]\n\n    // in the case that there are multiple targets, we count the number of pending recovery events\n    // and only call the callback once all events have been processed\n    let pending = 0\n    // withinTargets(phxTarget, callback, dom, viewEl)\n    this.withinTargets(phxTarget, (targetView, targetCtx) => {\n      const cid = this.targetComponentID(newForm, targetCtx)\n      pending++\n      let e = new CustomEvent(\"phx:form-recovery\", {detail: {sourceElement: oldForm}})\n      JS.exec(e, \"change\", phxEvent, this, input, [\"push\", {\n        _target: input.name,\n        targetView,\n        targetCtx,\n        newCid: cid,\n        callback: () => {\n          pending--\n          if(pending === 0){ callback() }\n        }\n      }])\n    }, templateDom, templateDom)\n  }\n\n  pushLinkPatch(e, href, targetEl, callback){\n    let linkRef = this.liveSocket.setPendingLink(href)\n    // only add loading states if event is trusted (it was triggered by user, such as click) and\n    // it's not a forward/back navigation from popstate\n    let loading = e.isTrusted && e.type !== \"popstate\"\n    let refGen = targetEl ? () => this.putRef([{el: targetEl, loading: loading, lock: true}], null, \"click\") : null\n    let fallback = () => this.liveSocket.redirect(window.location.href)\n    let url = href.startsWith(\"/\") ? `${location.protocol}//${location.host}${href}` : href\n\n    this.pushWithReply(refGen, \"live_patch\", {url}).then(\n      ({resp}) => {\n        this.liveSocket.requestDOMUpdate(() => {\n          if(resp.link_redirect){\n            this.liveSocket.replaceMain(href, null, callback, linkRef)\n          } else {\n            if(this.liveSocket.commitPendingLink(linkRef)){\n              this.href = href\n            }\n            this.applyPendingUpdates()\n            callback && callback(linkRef)\n          }\n        })\n      },\n      ({error: _error, timeout: _timeout}) => fallback()\n    )\n  }\n\n  getFormsForRecovery(){\n    if(this.joinCount === 0){ return {} }\n\n    let phxChange = this.binding(\"change\")\n\n    return DOM.all(this.el, `form[${phxChange}]`)\n      .filter(form => form.id)\n      .filter(form => form.elements.length > 0)\n      .filter(form => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== \"ignore\")\n      .map(form => form.cloneNode(true))\n      .reduce((acc, form) => {\n        acc[form.id] = form\n        return acc\n      }, {})\n  }\n\n  maybePushComponentsDestroyed(destroyedCIDs){\n    let willDestroyCIDs = destroyedCIDs.filter(cid => {\n      return DOM.findComponentNodeList(this.el, cid).length === 0\n    })\n\n    if(willDestroyCIDs.length > 0){\n      // we must reset the render change tracking for cids that\n      // could be added back from the server so we don't skip them\n      willDestroyCIDs.forEach(cid => this.rendered.resetRender(cid))\n\n      this.pushWithReply(null, \"cids_will_destroy\", {cids: willDestroyCIDs}).then(() => {\n        // we must wait for pending transitions to complete before determining\n        // if the cids were added back to the DOM in the meantime (#3139)\n        this.liveSocket.requestDOMUpdate(() => {\n          // See if any of the cids we wanted to destroy were added back,\n          // if they were added back, we don't actually destroy them.\n          let completelyDestroyCIDs = willDestroyCIDs.filter(cid => {\n            return DOM.findComponentNodeList(this.el, cid).length === 0\n          })\n\n          if(completelyDestroyCIDs.length > 0){\n            this.pushWithReply(null, \"cids_destroyed\", {cids: completelyDestroyCIDs}).then(({resp}) => {\n              this.rendered.pruneCIDs(resp.cids)\n            })\n          }\n        })\n      })\n    }\n  }\n\n  ownsElement(el){\n    let parentViewEl = el.closest(PHX_VIEW_SELECTOR)\n    return el.getAttribute(PHX_PARENT_ID) === this.id ||\n      (parentViewEl && parentViewEl.id === this.id) ||\n      (!parentViewEl && this.isDead)\n  }\n\n  submitForm(form, targetCtx, phxEvent, submitter, opts = {}){\n    DOM.putPrivate(form, PHX_HAS_SUBMITTED, true)\n    const inputs = Array.from(form.elements)\n    inputs.forEach(input => DOM.putPrivate(input, PHX_HAS_SUBMITTED, true))\n    this.liveSocket.blurActiveElement(this)\n    this.pushFormSubmit(form, targetCtx, phxEvent, submitter, opts, () => {\n      this.liveSocket.restorePreviouslyActiveFocus()\n    })\n  }\n\n  binding(kind){ return this.liveSocket.binding(kind) }\n}\n", "/** Initializes the LiveSocket\n *\n *\n * @param {string} endPoint - The string WebSocket endpoint, ie, `\"wss://example.com/live\"`,\n *                                               `\"/live\"` (inherited host & protocol)\n * @param {Phoenix.Socket} socket - the required Phoenix Socket class imported from \"phoenix\". For example:\n *\n *     import {Socket} from \"phoenix\"\n *     import {LiveSocket} from \"phoenix_live_view\"\n *     let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n *\n * @param {Object} [opts] - Optional configuration. Outside of keys listed below, all\n * configuration is passed directly to the Phoenix Socket constructor.\n * @param {Object} [opts.defaults] - The optional defaults to use for various bindings,\n * such as `phx-debounce`. Supports the following keys:\n *\n *   - debounce - the millisecond phx-debounce time. Defaults 300\n *   - throttle - the millisecond phx-throttle time. Defaults 300\n *\n * @param {Function} [opts.params] - The optional function for passing connect params.\n * The function receives the element associated with a given LiveView. For example:\n *\n *     (el) => {view: el.getAttribute(\"data-my-view-name\", token: window.myToken}\n *\n * @param {string} [opts.bindingPrefix] - The optional prefix to use for all phx DOM annotations.\n * Defaults to \"phx-\".\n * @param {Object} [opts.hooks] - The optional object for referencing LiveView hook callbacks.\n * @param {Object} [opts.uploaders] - The optional object for referencing LiveView uploader callbacks.\n * @param {integer} [opts.loaderTimeout] - The optional delay in milliseconds to wait before apply\n * loading states.\n * @param {integer} [opts.maxReloads] - The maximum reloads before entering failsafe mode.\n * @param {integer} [opts.reloadJitterMin] - The minimum time between normal reload attempts.\n * @param {integer} [opts.reloadJitterMax] - The maximum time between normal reload attempts.\n * @param {integer} [opts.failsafeJitter] - The time between reload attempts in failsafe mode.\n * @param {Function} [opts.viewLogger] - The optional function to log debug information. For example:\n *\n *     (view, kind, msg, obj) => console.log(`${view.id} ${kind}: ${msg} - `, obj)\n *\n * @param {Object} [opts.metadata] - The optional object mapping event names to functions for\n * populating event metadata. For example:\n *\n *     metadata: {\n *       click: (e, el) => {\n *         return {\n *           ctrlKey: e.ctrlKey,\n *           metaKey: e.metaKey,\n *           detail: e.detail || 1,\n *         }\n *       },\n *       keydown: (e, el) => {\n *         return {\n *           key: e.key,\n *           ctrlKey: e.ctrlKey,\n *           metaKey: e.metaKey,\n *           shiftKey: e.shiftKey\n *         }\n *       }\n *     }\n * @param {Object} [opts.sessionStorage] - An optional Storage compatible object\n * Useful when LiveView won't have access to `sessionStorage`.  For example, This could\n * happen if a site loads a cross-domain LiveView in an iframe.  Example usage:\n *\n *     class InMemoryStorage {\n *       constructor() { this.storage = {} }\n *       getItem(keyName) { return this.storage[keyName] || null }\n *       removeItem(keyName) { delete this.storage[keyName] }\n *       setItem(keyName, keyValue) { this.storage[keyName] = keyValue }\n *     }\n *\n * @param {Object} [opts.localStorage] - An optional Storage compatible object\n * Useful for when LiveView won't have access to `localStorage`.\n * See `opts.sessionStorage` for examples.\n*/\n\nimport {\n  BINDING_PREFIX,\n  CONSECUTIVE_RELOADS,\n  DEFAULTS,\n  FAILSAFE_JITTER,\n  LOADER_TIMEOUT,\n  MAX_RELOADS,\n  PHX_DEBOUNCE,\n  PHX_DROP_TARGET,\n  PHX_HAS_FOCUSED,\n  PHX_KEY,\n  PHX_LINK_STATE,\n  PHX_LIVE_LINK,\n  PHX_LV_DEBUG,\n  PHX_LV_LATENCY_SIM,\n  PHX_LV_PROFILE,\n  PHX_LV_HISTORY_POSITION,\n  PHX_MAIN,\n  PHX_PARENT_ID,\n  PHX_VIEW_SELECTOR,\n  PHX_ROOT_ID,\n  PHX_THROTTLE,\n  PHX_TRACK_UPLOADS,\n  PHX_SESSION,\n  RELOAD_JITTER_MIN,\n  RELOAD_JITTER_MAX,\n  PHX_REF_SRC,\n  PHX_RELOAD_STATUS\n} from \"./constants\"\n\nimport {\n  clone,\n  closestPhxBinding,\n  closure,\n  debug,\n  maybe\n} from \"./utils\"\n\nimport Browser from \"./browser\"\nimport DOM from \"./dom\"\nimport Hooks from \"./hooks\"\nimport LiveUploader from \"./live_uploader\"\nimport View from \"./view\"\nimport JS from \"./js\"\n\nexport let isUsedInput = (el) => DOM.isUsedInput(el)\n\nexport default class LiveSocket {\n  constructor(url, phxSocket, opts = {}){\n    this.unloaded = false\n    if(!phxSocket || phxSocket.constructor.name === \"Object\"){\n      throw new Error(`\n      a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:\n\n          import {Socket} from \"phoenix\"\n          import {LiveSocket} from \"phoenix_live_view\"\n          let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n      `)\n    }\n    this.socket = new phxSocket(url, opts)\n    this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX\n    this.opts = opts\n    this.params = closure(opts.params || {})\n    this.viewLogger = opts.viewLogger\n    this.metadataCallbacks = opts.metadata || {}\n    this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {})\n    this.activeElement = null\n    this.prevActive = null\n    this.silenced = false\n    this.main = null\n    this.outgoingMainEl = null\n    this.clickStartedAtTarget = null\n    this.linkRef = 1\n    this.roots = {}\n    this.href = window.location.href\n    this.pendingLink = null\n    this.currentLocation = clone(window.location)\n    this.hooks = opts.hooks || {}\n    this.uploaders = opts.uploaders || {}\n    this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT\n    this.reloadWithJitterTimer = null\n    this.maxReloads = opts.maxReloads || MAX_RELOADS\n    this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN\n    this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX\n    this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER\n    this.localStorage = opts.localStorage || window.localStorage\n    this.sessionStorage = opts.sessionStorage || window.sessionStorage\n    this.boundTopLevelEvents = false\n    this.boundEventNames = new Set()\n    this.serverCloseRef = null\n    this.domCallbacks = Object.assign({\n      jsQuerySelectorAll: null,\n      onPatchStart: closure(),\n      onPatchEnd: closure(),\n      onNodeAdded: closure(),\n      onBeforeElUpdated: closure()},\n    opts.dom || {})\n    this.transitions = new TransitionSet()\n    this.currentHistoryPosition = parseInt(this.sessionStorage.getItem(PHX_LV_HISTORY_POSITION)) || 0\n    window.addEventListener(\"pagehide\", _e => {\n      this.unloaded = true\n    })\n    this.socket.onOpen(() => {\n      if(this.isUnloaded()){\n        // reload page if being restored from back/forward cache and browser does not emit \"pageshow\"\n        window.location.reload()\n      }\n    })\n  }\n\n  // public\n\n  version(){ return LV_VSN }\n\n  isProfileEnabled(){ return this.sessionStorage.getItem(PHX_LV_PROFILE) === \"true\" }\n\n  isDebugEnabled(){ return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"true\" }\n\n  isDebugDisabled(){ return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"false\" }\n\n  enableDebug(){ this.sessionStorage.setItem(PHX_LV_DEBUG, \"true\") }\n\n  enableProfiling(){ this.sessionStorage.setItem(PHX_LV_PROFILE, \"true\") }\n\n  disableDebug(){ this.sessionStorage.setItem(PHX_LV_DEBUG, \"false\") }\n\n  disableProfiling(){ this.sessionStorage.removeItem(PHX_LV_PROFILE) }\n\n  enableLatencySim(upperBoundMs){\n    this.enableDebug()\n    console.log(\"latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable\")\n    this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs)\n  }\n\n  disableLatencySim(){ this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM) }\n\n  getLatencySim(){\n    let str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM)\n    return str ? parseInt(str) : null\n  }\n\n  getSocket(){ return this.socket }\n\n  connect(){\n    // enable debug by default if on localhost and not explicitly disabled\n    if(window.location.hostname === \"localhost\" && !this.isDebugDisabled()){ this.enableDebug() }\n    let doConnect = () => {\n      this.resetReloadStatus()\n      if(this.joinRootViews()){\n        this.bindTopLevelEvents()\n        this.socket.connect()\n      } else if(this.main){\n        this.socket.connect()\n      } else {\n        this.bindTopLevelEvents({dead: true})\n      }\n      this.joinDeadView()\n    }\n    if([\"complete\", \"loaded\", \"interactive\"].indexOf(document.readyState) >= 0){\n      doConnect()\n    } else {\n      document.addEventListener(\"DOMContentLoaded\", () => doConnect())\n    }\n  }\n\n  disconnect(callback){\n    clearTimeout(this.reloadWithJitterTimer)\n    // remove the socket close listener to avoid trying to handle\n    // a server close event when it is actually caused by us disconnecting\n    if(this.serverCloseRef){\n      this.socket.off(this.serverCloseRef)\n      this.serverCloseRef = null\n    }\n    this.socket.disconnect(callback)\n  }\n\n  replaceTransport(transport){\n    clearTimeout(this.reloadWithJitterTimer)\n    this.socket.replaceTransport(transport)\n    this.connect()\n  }\n\n  execJS(el, encodedJS, eventType = null){\n    let e = new CustomEvent(\"phx:exec\", {detail: {sourceElement: el}})\n    this.owner(el, view => JS.exec(e, eventType, encodedJS, view, el))\n  }\n\n  // private\n\n  execJSHookPush(el, phxEvent, data, callback){\n    this.withinOwners(el, view => {\n      let e = new CustomEvent(\"phx:exec\", {detail: {sourceElement: el}})\n      JS.exec(e, \"hook\", phxEvent, view, el, [\"push\", {data, callback}])\n    })\n  }\n\n  unload(){\n    if(this.unloaded){ return }\n    if(this.main && this.isConnected()){ this.log(this.main, \"socket\", () => [\"disconnect for page nav\"]) }\n    this.unloaded = true\n    this.destroyAllViews()\n    this.disconnect()\n  }\n\n  triggerDOM(kind, args){ this.domCallbacks[kind](...args) }\n\n  time(name, func){\n    if(!this.isProfileEnabled() || !console.time){ return func() }\n    console.time(name)\n    let result = func()\n    console.timeEnd(name)\n    return result\n  }\n\n  log(view, kind, msgCallback){\n    if(this.viewLogger){\n      let [msg, obj] = msgCallback()\n      this.viewLogger(view, kind, msg, obj)\n    } else if(this.isDebugEnabled()){\n      let [msg, obj] = msgCallback()\n      debug(view, kind, msg, obj)\n    }\n  }\n\n  requestDOMUpdate(callback){\n    this.transitions.after(callback)\n  }\n\n  transition(time, onStart, onDone = function(){}){\n    this.transitions.addTransition(time, onStart, onDone)\n  }\n\n  onChannel(channel, event, cb){\n    channel.on(event, data => {\n      let latency = this.getLatencySim()\n      if(!latency){\n        cb(data)\n      } else {\n        setTimeout(() => cb(data), latency)\n      }\n    })\n  }\n\n  reloadWithJitter(view, log){\n    clearTimeout(this.reloadWithJitterTimer)\n    this.disconnect()\n    let minMs = this.reloadJitterMin\n    let maxMs = this.reloadJitterMax\n    let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs\n    let tries = Browser.updateLocal(this.localStorage, window.location.pathname, CONSECUTIVE_RELOADS, 0, count => count + 1)\n    if(tries >= this.maxReloads){\n      afterMs = this.failsafeJitter\n    }\n    this.reloadWithJitterTimer = setTimeout(() => {\n      // if view has recovered, such as transport replaced, then cancel\n      if(view.isDestroyed() || view.isConnected()){ return }\n      view.destroy()\n      log ? log() : this.log(view, \"join\", () => [`encountered ${tries} consecutive reloads`])\n      if(tries >= this.maxReloads){\n        this.log(view, \"join\", () => [`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`])\n      }\n      if(this.hasPendingLink()){\n        window.location = this.pendingLink\n      } else {\n        window.location.reload()\n      }\n    }, afterMs)\n  }\n\n  getHookCallbacks(name){\n    return name && name.startsWith(\"Phoenix.\") ? Hooks[name.split(\".\")[1]] : this.hooks[name]\n  }\n\n  isUnloaded(){ return this.unloaded }\n\n  isConnected(){ return this.socket.isConnected() }\n\n  getBindingPrefix(){ return this.bindingPrefix }\n\n  binding(kind){ return `${this.getBindingPrefix()}${kind}` }\n\n  channel(topic, params){ return this.socket.channel(topic, params) }\n\n  joinDeadView(){\n    let body = document.body\n    if(body && !this.isPhxView(body) && !this.isPhxView(document.firstElementChild)){\n      let view = this.newRootView(body)\n      view.setHref(this.getHref())\n      view.joinDead()\n      if(!this.main){ this.main = view }\n      window.requestAnimationFrame(() => {\n        view.execNewMounted()\n        // restore scroll position when navigating from an external / non-live page\n        this.maybeScroll(history.state?.scroll)\n      })\n    }\n  }\n\n  joinRootViews(){\n    let rootsFound = false\n    DOM.all(document, `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, rootEl => {\n      if(!this.getRootById(rootEl.id)){\n        let view = this.newRootView(rootEl)\n        // stickies cannot be mounted at the router and therefore should not\n        // get a href set on them\n        if(!DOM.isPhxSticky(rootEl)){ view.setHref(this.getHref()) }\n        view.join()\n        if(rootEl.hasAttribute(PHX_MAIN)){ this.main = view }\n      }\n      rootsFound = true\n    })\n    return rootsFound\n  }\n\n  redirect(to, flash, reloadToken){\n    if(reloadToken){ Browser.setCookie(PHX_RELOAD_STATUS, reloadToken, 60) }\n    this.unload()\n    Browser.redirect(to, flash)\n  }\n\n  replaceMain(href, flash, callback = null, linkRef = this.setPendingLink(href)){\n    let liveReferer = this.currentLocation.href\n    this.outgoingMainEl = this.outgoingMainEl || this.main.el\n    let removeEls = DOM.all(this.outgoingMainEl, `[${this.binding(\"remove\")}]`)\n    let newMainEl = DOM.cloneNode(this.outgoingMainEl, \"\")\n    this.main.showLoader(this.loaderTimeout)\n    this.main.destroy()\n\n    this.main = this.newRootView(newMainEl, flash, liveReferer)\n    this.main.setRedirect(href)\n    this.transitionRemoves(removeEls, true)\n    this.main.join((joinCount, onDone) => {\n      if(joinCount === 1 && this.commitPendingLink(linkRef)){\n        this.requestDOMUpdate(() => {\n          // remove phx-remove els right before we replace the main element\n          removeEls.forEach(el => el.remove())\n          DOM.findPhxSticky(document).forEach(el => newMainEl.appendChild(el))\n          this.outgoingMainEl.replaceWith(newMainEl)\n          this.outgoingMainEl = null\n          callback && callback(linkRef)\n          onDone()\n        })\n      }\n    })\n  }\n\n  transitionRemoves(elements, skipSticky, callback){\n    let removeAttr = this.binding(\"remove\")\n    if(skipSticky){\n      const stickies = DOM.findPhxSticky(document) || []\n      elements = elements.filter(el => !DOM.isChildOfAny(el, stickies))\n    }\n    let silenceEvents = (e) => {\n      e.preventDefault()\n      e.stopImmediatePropagation()\n    }\n    elements.forEach(el => {\n      // prevent all listeners we care about from bubbling to window\n      // since we are removing the element\n      for(let event of this.boundEventNames){\n        el.addEventListener(event, silenceEvents, true)\n      }\n      this.execJS(el, el.getAttribute(removeAttr), \"remove\")\n    })\n    // remove the silenced listeners when transitions are done incase the element is re-used\n    // and call caller's callback as soon as we are done with transitions\n    this.requestDOMUpdate(() => {\n      elements.forEach(el => {\n        for(let event of this.boundEventNames){\n          el.removeEventListener(event, silenceEvents, true)\n        }\n      })\n      callback && callback()\n    })\n  }\n\n  isPhxView(el){ return el.getAttribute && el.getAttribute(PHX_SESSION) !== null }\n\n  newRootView(el, flash, liveReferer){\n    let view = new View(el, this, null, flash, liveReferer)\n    this.roots[view.id] = view\n    return view\n  }\n\n  owner(childEl, callback){\n    let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), el => this.getViewByEl(el)) || this.main\n    return view && callback ? callback(view) : view\n  }\n\n  withinOwners(childEl, callback){\n    this.owner(childEl, view => callback(view, childEl))\n  }\n\n  getViewByEl(el){\n    let rootId = el.getAttribute(PHX_ROOT_ID)\n    return maybe(this.getRootById(rootId), root => root.getDescendentByEl(el))\n  }\n\n  getRootById(id){ return this.roots[id] }\n\n  destroyAllViews(){\n    for(let id in this.roots){\n      this.roots[id].destroy()\n      delete this.roots[id]\n    }\n    this.main = null\n  }\n\n  destroyViewByEl(el){\n    let root = this.getRootById(el.getAttribute(PHX_ROOT_ID))\n    if(root && root.id === el.id){\n      root.destroy()\n      delete this.roots[root.id]\n    } else if(root){\n      root.destroyDescendent(el.id)\n    }\n  }\n\n  getActiveElement(){\n    return document.activeElement\n  }\n\n  dropActiveElement(view){\n    if(this.prevActive && view.ownsElement(this.prevActive)){\n      this.prevActive = null\n    }\n  }\n\n  restorePreviouslyActiveFocus(){\n    if(this.prevActive && this.prevActive !== document.body){\n      this.prevActive.focus()\n    }\n  }\n\n  blurActiveElement(){\n    this.prevActive = this.getActiveElement()\n    if(this.prevActive !== document.body){ this.prevActive.blur() }\n  }\n\n  bindTopLevelEvents({dead} = {}){\n    if(this.boundTopLevelEvents){ return }\n\n    this.boundTopLevelEvents = true\n    // enter failsafe reload if server has gone away intentionally, such as \"disconnect\" broadcast\n    this.serverCloseRef = this.socket.onClose(event => {\n      // failsafe reload if normal closure and we still have a main LV\n      if(event && event.code === 1000 && this.main){ return this.reloadWithJitter(this.main) }\n    })\n    document.body.addEventListener(\"click\", function (){ }) // ensure all click events bubble for mobile Safari\n    window.addEventListener(\"pageshow\", e => {\n      if(e.persisted){ // reload page if being restored from back/forward cache\n        this.getSocket().disconnect()\n        this.withPageLoading({to: window.location.href, kind: \"redirect\"})\n        window.location.reload()\n      }\n    }, true)\n    if(!dead){ this.bindNav() }\n    this.bindClicks()\n    if(!dead){ this.bindForms() }\n    this.bind({keyup: \"keyup\", keydown: \"keydown\"}, (e, type, view, targetEl, phxEvent, _phxTarget) => {\n      let matchKey = targetEl.getAttribute(this.binding(PHX_KEY))\n      let pressedKey = e.key && e.key.toLowerCase() // chrome clicked autocompletes send a keydown without key\n      if(matchKey && matchKey.toLowerCase() !== pressedKey){ return }\n\n      let data = {key: e.key, ...this.eventMeta(type, e, targetEl)}\n      JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n    })\n    this.bind({blur: \"focusout\", focus: \"focusin\"}, (e, type, view, targetEl, phxEvent, phxTarget) => {\n      if(!phxTarget){\n        let data = {key: e.key, ...this.eventMeta(type, e, targetEl)}\n        JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n      }\n    })\n    this.bind({blur: \"blur\", focus: \"focus\"}, (e, type, view, targetEl, phxEvent, phxTarget) => {\n      // blur and focus are triggered on document and window. Discard one to avoid dups\n      if(phxTarget === \"window\"){\n        let data = this.eventMeta(type, e, targetEl)\n        JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n      }\n    })\n    this.on(\"dragover\", e => e.preventDefault())\n    this.on(\"drop\", e => {\n      e.preventDefault()\n      let dropTargetId = maybe(closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), trueTarget => {\n        return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET))\n      })\n      let dropTarget = dropTargetId && document.getElementById(dropTargetId)\n      let files = Array.from(e.dataTransfer.files || [])\n      if(!dropTarget || dropTarget.disabled || files.length === 0 || !(dropTarget.files instanceof FileList)){ return }\n\n      LiveUploader.trackFiles(dropTarget, files, e.dataTransfer)\n      dropTarget.dispatchEvent(new Event(\"input\", {bubbles: true}))\n    })\n    this.on(PHX_TRACK_UPLOADS, e => {\n      let uploadTarget = e.target\n      if(!DOM.isUploadInput(uploadTarget)){ return }\n      let files = Array.from(e.detail.files || []).filter(f => f instanceof File || f instanceof Blob)\n      LiveUploader.trackFiles(uploadTarget, files)\n      uploadTarget.dispatchEvent(new Event(\"input\", {bubbles: true}))\n    })\n  }\n\n  eventMeta(eventName, e, targetEl){\n    let callback = this.metadataCallbacks[eventName]\n    return callback ? callback(e, targetEl) : {}\n  }\n\n  setPendingLink(href){\n    this.linkRef++\n    this.pendingLink = href\n    this.resetReloadStatus()\n    return this.linkRef\n  }\n\n  // anytime we are navigating or connecting, drop reload cookie in case\n  // we issue the cookie but the next request was interrupted and the server never dropped it\n  resetReloadStatus(){ Browser.deleteCookie(PHX_RELOAD_STATUS) }\n\n  commitPendingLink(linkRef){\n    if(this.linkRef !== linkRef){\n      return false\n    } else {\n      this.href = this.pendingLink\n      this.pendingLink = null\n      return true\n    }\n  }\n\n  getHref(){ return this.href }\n\n  hasPendingLink(){ return !!this.pendingLink }\n\n  bind(events, callback){\n    for(let event in events){\n      let browserEventName = events[event]\n\n      this.on(browserEventName, e => {\n        let binding = this.binding(event)\n        let windowBinding = this.binding(`window-${event}`)\n        let targetPhxEvent = e.target.getAttribute && e.target.getAttribute(binding)\n        if(targetPhxEvent){\n          this.debounce(e.target, e, browserEventName, () => {\n            this.withinOwners(e.target, view => {\n              callback(e, event, view, e.target, targetPhxEvent, null)\n            })\n          })\n        } else {\n          DOM.all(document, `[${windowBinding}]`, el => {\n            let phxEvent = el.getAttribute(windowBinding)\n            this.debounce(el, e, browserEventName, () => {\n              this.withinOwners(el, view => {\n                callback(e, event, view, el, phxEvent, \"window\")\n              })\n            })\n          })\n        }\n      })\n    }\n  }\n\n  bindClicks(){\n    this.on(\"mousedown\", e => this.clickStartedAtTarget = e.target)\n    this.bindClick(\"click\", \"click\")\n  }\n\n  bindClick(eventName, bindingName){\n    let click = this.binding(bindingName)\n    window.addEventListener(eventName, e => {\n      let target = null\n      // a synthetic click event (detail 0) will not have caused a mousedown event,\n      // therefore the clickStartedAtTarget is stale\n      if(e.detail === 0) this.clickStartedAtTarget = e.target\n      let clickStartedAtTarget = this.clickStartedAtTarget || e.target\n      // when searching the target for the click event, we always want to\n      // use the actual event target, see #3372\n      target = closestPhxBinding(e.target, click)\n      this.dispatchClickAway(e, clickStartedAtTarget)\n      this.clickStartedAtTarget = null\n      let phxEvent = target && target.getAttribute(click)\n      if(!phxEvent){\n        if(DOM.isNewPageClick(e, window.location)){ this.unload() }\n        return\n      }\n\n      if(target.getAttribute(\"href\") === \"#\"){ e.preventDefault() }\n\n      // noop if we are in the middle of awaiting an ack for this el already\n      if(target.hasAttribute(PHX_REF_SRC)){ return }\n\n      this.debounce(target, e, \"click\", () => {\n        this.withinOwners(target, view => {\n          JS.exec(e, \"click\", phxEvent, view, target, [\"push\", {data: this.eventMeta(\"click\", e, target)}])\n        })\n      })\n    }, false)\n  }\n\n  dispatchClickAway(e, clickStartedAt){\n    let phxClickAway = this.binding(\"click-away\")\n    DOM.all(document, `[${phxClickAway}]`, el => {\n      if(!(el.isSameNode(clickStartedAt) || el.contains(clickStartedAt))){\n        this.withinOwners(el, view => {\n          let phxEvent = el.getAttribute(phxClickAway)\n          if(JS.isVisible(el) && JS.isInViewport(el)){\n            JS.exec(e, \"click\", phxEvent, view, el, [\"push\", {data: this.eventMeta(\"click\", e, e.target)}])\n          }\n        })\n      }\n    })\n  }\n\n  bindNav(){\n    if(!Browser.canPushState()){ return }\n    if(history.scrollRestoration){ history.scrollRestoration = \"manual\" }\n    let scrollTimer = null\n    window.addEventListener(\"scroll\", _e => {\n      clearTimeout(scrollTimer)\n      scrollTimer = setTimeout(() => {\n        Browser.updateCurrentState(state => Object.assign(state, {scroll: window.scrollY}))\n      }, 100)\n    })\n    window.addEventListener(\"popstate\", event => {\n      if(!this.registerNewLocation(window.location)){ return }\n      let {type, backType, id, root, scroll, position} = event.state || {}\n      let href = window.location.href\n\n      // Compare positions to determine direction\n      let isForward = position > this.currentHistoryPosition\n\n      type = isForward ? type : (backType || type)\n\n      // Update current position\n      this.currentHistoryPosition = position || 0\n      this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n      DOM.dispatchEvent(window, \"phx:navigate\", {detail: {href, patch: type === \"patch\", pop: true, direction: isForward ? \"forward\" : \"backward\"}})\n      this.requestDOMUpdate(() => {\n        if(this.main.isConnected() && (type === \"patch\" && id === this.main.id)){\n          this.main.pushLinkPatch(event, href, null, () => {\n            this.maybeScroll(scroll)\n          })\n        } else {\n          this.replaceMain(href, null, () => {\n            if(root){ this.replaceRootHistory() }\n            this.maybeScroll(scroll)\n          })\n        }\n      })\n    }, false)\n    window.addEventListener(\"click\", e => {\n      let target = closestPhxBinding(e.target, PHX_LIVE_LINK)\n      let type = target && target.getAttribute(PHX_LIVE_LINK)\n      if(!type || !this.isConnected() || !this.main || DOM.wantsNewTab(e)){ return }\n\n      // When wrapping an SVG element in an anchor tag, the href can be an SVGAnimatedString\n      let href = target.href instanceof SVGAnimatedString ? target.href.baseVal : target.href\n\n      let linkState = target.getAttribute(PHX_LINK_STATE)\n      e.preventDefault()\n      e.stopImmediatePropagation() // do not bubble click to regular phx-click bindings\n      if(this.pendingLink === href){ return }\n\n      this.requestDOMUpdate(() => {\n        if(type === \"patch\"){\n          this.pushHistoryPatch(e, href, linkState, target)\n        } else if(type === \"redirect\"){\n          this.historyRedirect(e, href, linkState, null, target)\n        } else {\n          throw new Error(`expected ${PHX_LIVE_LINK} to be \"patch\" or \"redirect\", got: ${type}`)\n        }\n        let phxClick = target.getAttribute(this.binding(\"click\"))\n        if(phxClick){\n          this.requestDOMUpdate(() => this.execJS(target, phxClick, \"click\"))\n        }\n      })\n    }, false)\n  }\n\n  maybeScroll(scroll){\n    if(typeof(scroll) === \"number\"){\n      requestAnimationFrame(() => {\n        window.scrollTo(0, scroll)\n      }) // the body needs to render before we scroll.\n    }\n  }\n\n  dispatchEvent(event, payload = {}){\n    DOM.dispatchEvent(window, `phx:${event}`, {detail: payload})\n  }\n\n  dispatchEvents(events){\n    events.forEach(([event, payload]) => this.dispatchEvent(event, payload))\n  }\n\n  withPageLoading(info, callback){\n    DOM.dispatchEvent(window, \"phx:page-loading-start\", {detail: info})\n    let done = () => DOM.dispatchEvent(window, \"phx:page-loading-stop\", {detail: info})\n    return callback ? callback(done) : done\n  }\n\n  pushHistoryPatch(e, href, linkState, targetEl){\n    if(!this.isConnected() || !this.main.isMain()){ return Browser.redirect(href) }\n\n    this.withPageLoading({to: href, kind: \"patch\"}, done => {\n      this.main.pushLinkPatch(e, href, targetEl, linkRef => {\n        this.historyPatch(href, linkState, linkRef)\n        done()\n      })\n    })\n  }\n\n  historyPatch(href, linkState, linkRef = this.setPendingLink(href)){\n    if(!this.commitPendingLink(linkRef)){ return }\n\n    // Increment position for new state\n    this.currentHistoryPosition++\n    this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n    // store the type for back navigation\n    Browser.updateCurrentState((state) => ({...state, backType: \"patch\"}))\n\n    Browser.pushState(linkState, {\n      type: \"patch\",\n      id: this.main.id,\n      position: this.currentHistoryPosition\n    }, href)\n\n    DOM.dispatchEvent(window, \"phx:navigate\", {detail: {patch: true, href, pop: false, direction: \"forward\"}})\n    this.registerNewLocation(window.location)\n  }\n\n  historyRedirect(e, href, linkState, flash, targetEl){\n    if(targetEl && e.isTrusted && e.type !== \"popstate\"){ targetEl.classList.add(\"phx-click-loading\") }\n    if(!this.isConnected() || !this.main.isMain()){ return Browser.redirect(href, flash) }\n\n    // convert to full href if only path prefix\n    if(/^\\/$|^\\/[^\\/]+.*$/.test(href)){\n      let {protocol, host} = window.location\n      href = `${protocol}//${host}${href}`\n    }\n    let scroll = window.scrollY\n    this.withPageLoading({to: href, kind: \"redirect\"}, done => {\n      this.replaceMain(href, flash, (linkRef) => {\n        if(linkRef === this.linkRef){\n          // Increment position for new state\n          this.currentHistoryPosition++\n          this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n          // store the type for back navigation\n          Browser.updateCurrentState((state) => ({...state, backType: \"redirect\"}))\n\n          Browser.pushState(linkState, {\n            type: \"redirect\",\n            id: this.main.id,\n            scroll: scroll,\n            position: this.currentHistoryPosition\n          }, href)\n\n          DOM.dispatchEvent(window, \"phx:navigate\", {detail: {href, patch: false, pop: false, direction: \"forward\"}})\n          this.registerNewLocation(window.location)\n        }\n        done()\n      })\n    })\n  }\n\n  replaceRootHistory(){\n    Browser.pushState(\"replace\", {\n      root: true,\n      type: \"patch\",\n      id: this.main.id,\n      position: this.currentHistoryPosition // Preserve current position\n    })\n  }\n\n  registerNewLocation(newLocation){\n    let {pathname, search} = this.currentLocation\n    if(pathname + search === newLocation.pathname + newLocation.search){\n      return false\n    } else {\n      this.currentLocation = clone(newLocation)\n      return true\n    }\n  }\n\n  bindForms(){\n    let iterations = 0\n    let externalFormSubmitted = false\n\n    // disable forms on submit that track phx-change but perform external submit\n    this.on(\"submit\", e => {\n      let phxSubmit = e.target.getAttribute(this.binding(\"submit\"))\n      let phxChange = e.target.getAttribute(this.binding(\"change\"))\n      if(!externalFormSubmitted && phxChange && !phxSubmit){\n        externalFormSubmitted = true\n        e.preventDefault()\n        this.withinOwners(e.target, view => {\n          view.disableForm(e.target)\n          // safari needs next tick\n          window.requestAnimationFrame(() => {\n            if(DOM.isUnloadableFormSubmit(e)){ this.unload() }\n            e.target.submit()\n          })\n        })\n      }\n    })\n\n    this.on(\"submit\", e => {\n      let phxEvent = e.target.getAttribute(this.binding(\"submit\"))\n      if(!phxEvent){\n        if(DOM.isUnloadableFormSubmit(e)){ this.unload() }\n        return\n      }\n      e.preventDefault()\n      e.target.disabled = true\n      this.withinOwners(e.target, view => {\n        JS.exec(e, \"submit\", phxEvent, view, e.target, [\"push\", {submitter: e.submitter}])\n      })\n    })\n\n    for(let type of [\"change\", \"input\"]){\n      this.on(type, e => {\n        if(e instanceof CustomEvent && e.target.form === undefined){\n          // throw on invalid JS.dispatch target and noop if CustomEvent triggered outside JS.dispatch\n          if(e.detail && e.detail.dispatcher){\n            throw new Error(`dispatching a custom ${type} event is only supported on input elements inside a form`)\n          }\n          return\n        }\n        let phxChange = this.binding(\"change\")\n        let input = e.target\n        // do not fire phx-change if we are in the middle of a composition session\n        // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing\n        // Safari has issues if the input is updated while composing\n        // see https://github.com/phoenixframework/phoenix_live_view/issues/3322\n        if(e.isComposing){\n          const key = `composition-listener-${type}`\n          if(!DOM.private(input, key)){\n            DOM.putPrivate(input, key, true)\n            input.addEventListener(\"compositionend\", () => {\n              // trigger a new input/change event\n              input.dispatchEvent(new Event(type, {bubbles: true}))\n              DOM.deletePrivate(input, key)\n            }, {once: true})\n          }\n          return\n        }\n        let inputEvent = input.getAttribute(phxChange)\n        let formEvent = input.form && input.form.getAttribute(phxChange)\n        let phxEvent = inputEvent || formEvent\n        if(!phxEvent){ return }\n        if(input.type === \"number\" && input.validity && input.validity.badInput){ return }\n\n        let dispatcher = inputEvent ? input : input.form\n        let currentIterations = iterations\n        iterations++\n        let {at: at, type: lastType} = DOM.private(input, \"prev-iteration\") || {}\n        // Browsers should always fire at least one \"input\" event before every \"change\"\n        // Ignore \"change\" events, unless there was no prior \"input\" event.\n        // This could happen if user code triggers a \"change\" event, or if the browser is non-conforming.\n        if(at === currentIterations - 1 && type === \"change\" && lastType === \"input\"){ return }\n\n        DOM.putPrivate(input, \"prev-iteration\", {at: currentIterations, type: type})\n\n        this.debounce(input, e, type, () => {\n          this.withinOwners(dispatcher, view => {\n            DOM.putPrivate(input, PHX_HAS_FOCUSED, true)\n            JS.exec(e, \"change\", phxEvent, view, input, [\"push\", {_target: e.target.name, dispatcher: dispatcher}])\n          })\n        })\n      })\n    }\n    this.on(\"reset\", (e) => {\n      let form = e.target\n      DOM.resetForm(form)\n      let input = Array.from(form.elements).find(el => el.type === \"reset\")\n      if(input){\n        // wait until next tick to get updated input value\n        window.requestAnimationFrame(() => {\n          input.dispatchEvent(new Event(\"input\", {bubbles: true, cancelable: false}))\n        })\n      }\n    })\n  }\n\n  debounce(el, event, eventType, callback){\n    if(eventType === \"blur\" || eventType === \"focusout\"){ return callback() }\n\n    let phxDebounce = this.binding(PHX_DEBOUNCE)\n    let phxThrottle = this.binding(PHX_THROTTLE)\n    let defaultDebounce = this.defaults.debounce.toString()\n    let defaultThrottle = this.defaults.throttle.toString()\n\n    this.withinOwners(el, view => {\n      let asyncFilter = () => !view.isDestroyed() && document.body.contains(el)\n      DOM.debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, () => {\n        callback()\n      })\n    })\n  }\n\n  silenceEvents(callback){\n    this.silenced = true\n    callback()\n    this.silenced = false\n  }\n\n  on(event, callback){\n    this.boundEventNames.add(event)\n    window.addEventListener(event, e => {\n      if(!this.silenced){ callback(e) }\n    })\n  }\n\n  jsQuerySelectorAll(sourceEl, query, defaultQuery){\n    let all = this.domCallbacks.jsQuerySelectorAll\n    return all ? all(sourceEl, query, defaultQuery) : defaultQuery()\n  }\n}\n\nclass TransitionSet {\n  constructor(){\n    this.transitions = new Set()\n    this.pendingOps = []\n  }\n\n  reset(){\n    this.transitions.forEach(timer => {\n      clearTimeout(timer)\n      this.transitions.delete(timer)\n    })\n    this.flushPendingOps()\n  }\n\n  after(callback){\n    if(this.size() === 0){\n      callback()\n    } else {\n      this.pushPendingOp(callback)\n    }\n  }\n\n  addTransition(time, onStart, onDone){\n    onStart()\n    let timer = setTimeout(() => {\n      this.transitions.delete(timer)\n      onDone()\n      this.flushPendingOps()\n    }, time)\n    this.transitions.add(timer)\n  }\n\n  pushPendingOp(op){ this.pendingOps.push(op) }\n\n  size(){ return this.transitions.size }\n\n  flushPendingOps(){\n    if(this.size() > 0){ return }\n    let op = this.pendingOps.shift()\n    if(op){\n      op()\n      this.flushPendingOps()\n    }\n  }\n}\n", "/*\n================================================================================\nPhoenix LiveView JavaScript Client\n================================================================================\n\nSee the hexdocs at `https://hexdocs.pm/phoenix_live_view` for documentation.\n\n*/\n\nimport LiveSocket, {isUsedInput} from \"./live_socket\"\nimport DOM from \"./dom\"\nimport ViewHook from \"./view_hook\"\nimport View from \"./view\"\n\n/** Creates a ViewHook instance for the given element and callbacks.\n *\n * @param {HTMLElement} el - The element to associate with the hook.\n * @param {Object} [callbacks] - The list of hook callbacks, such as mounted,\n *   updated, destroyed, etc.\n *\n * @example\n *\n * class MyComponent extends HTMLElement {\n *   connectedCallback(){\n *     let onLiveViewMounted = () => this.hook.pushEvent(...))\n *     this.hook = createHook(this, {mounted: onLiveViewMounted})\n *   }\n * }\n *\n * *Note*: `createHook` must be called from the `connectedCallback` lifecycle\n * which is triggered after the element has been added to the DOM. If you try\n * to call `createHook` from the constructor, an error will be logged.\n *\n * @returns {ViewHook} Returns the ViewHook instance for the custom element.\n */\nlet createHook = (el, callbacks = {}) => {\n  let existingHook = DOM.getCustomElHook(el)\n  if(existingHook){ return existingHook }\n\n  let hook = new ViewHook(View.closestView(el), el, callbacks)\n  DOM.putCustomElHook(el, hook)\n  return hook\n}\n\nexport {\n  LiveSocket,\n  isUsedInput,\n  createHook\n}\n"],
-  "mappings": "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",
+  "sourcesContent": ["export const CONSECUTIVE_RELOADS = \"consecutive-reloads\"\nexport const MAX_RELOADS = 10\nexport const RELOAD_JITTER_MIN = 5000\nexport const RELOAD_JITTER_MAX = 10000\nexport const FAILSAFE_JITTER = 30000\nexport const PHX_EVENT_CLASSES = [\n  \"phx-click-loading\", \"phx-change-loading\", \"phx-submit-loading\",\n  \"phx-keydown-loading\", \"phx-keyup-loading\", \"phx-blur-loading\", \"phx-focus-loading\",\n  \"phx-hook-loading\"\n]\nexport const PHX_COMPONENT = \"data-phx-component\"\nexport const PHX_LIVE_LINK = \"data-phx-link\"\nexport const PHX_TRACK_STATIC = \"track-static\"\nexport const PHX_LINK_STATE = \"data-phx-link-state\"\nexport const PHX_REF_LOADING = \"data-phx-ref-loading\"\nexport const PHX_REF_SRC = \"data-phx-ref-src\"\nexport const PHX_REF_LOCK = \"data-phx-ref-lock\"\nexport const PHX_TRACK_UPLOADS = \"track-uploads\"\nexport const PHX_UPLOAD_REF = \"data-phx-upload-ref\"\nexport const PHX_PREFLIGHTED_REFS = \"data-phx-preflighted-refs\"\nexport const PHX_DONE_REFS = \"data-phx-done-refs\"\nexport const PHX_DROP_TARGET = \"drop-target\"\nexport const PHX_ACTIVE_ENTRY_REFS = \"data-phx-active-refs\"\nexport const PHX_LIVE_FILE_UPDATED = \"phx:live-file:updated\"\nexport const PHX_SKIP = \"data-phx-skip\"\nexport const PHX_MAGIC_ID = \"data-phx-id\"\nexport const PHX_PRUNE = \"data-phx-prune\"\nexport const PHX_CONNECTED_CLASS = \"phx-connected\"\nexport const PHX_LOADING_CLASS = \"phx-loading\"\nexport const PHX_ERROR_CLASS = \"phx-error\"\nexport const PHX_CLIENT_ERROR_CLASS = \"phx-client-error\"\nexport const PHX_SERVER_ERROR_CLASS = \"phx-server-error\"\nexport const PHX_PARENT_ID = \"data-phx-parent-id\"\nexport const PHX_MAIN = \"data-phx-main\"\nexport const PHX_ROOT_ID = \"data-phx-root-id\"\nexport const PHX_VIEWPORT_TOP = \"viewport-top\"\nexport const PHX_VIEWPORT_BOTTOM = \"viewport-bottom\"\nexport const PHX_TRIGGER_ACTION = \"trigger-action\"\nexport const PHX_HAS_FOCUSED = \"phx-has-focused\"\nexport const FOCUSABLE_INPUTS = [\"text\", \"textarea\", \"number\", \"email\", \"password\", \"search\", \"tel\", \"url\", \"date\", \"time\", \"datetime-local\", \"color\", \"range\"]\nexport const CHECKABLE_INPUTS = [\"checkbox\", \"radio\"]\nexport const PHX_HAS_SUBMITTED = \"phx-has-submitted\"\nexport const PHX_SESSION = \"data-phx-session\"\nexport const PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`\nexport const PHX_STICKY = \"data-phx-sticky\"\nexport const PHX_STATIC = \"data-phx-static\"\nexport const PHX_READONLY = \"data-phx-readonly\"\nexport const PHX_DISABLED = \"data-phx-disabled\"\nexport const PHX_DISABLE_WITH = \"disable-with\"\nexport const PHX_DISABLE_WITH_RESTORE = \"data-phx-disable-with-restore\"\nexport const PHX_HOOK = \"hook\"\nexport const PHX_DEBOUNCE = \"debounce\"\nexport const PHX_THROTTLE = \"throttle\"\nexport const PHX_UPDATE = \"update\"\nexport const PHX_STREAM = \"stream\"\nexport const PHX_STREAM_REF = \"data-phx-stream\"\nexport const PHX_KEY = \"key\"\nexport const PHX_PRIVATE = \"phxPrivate\"\nexport const PHX_AUTO_RECOVER = \"auto-recover\"\nexport const PHX_LV_DEBUG = \"phx:live-socket:debug\"\nexport const PHX_LV_PROFILE = \"phx:live-socket:profiling\"\nexport const PHX_LV_LATENCY_SIM = \"phx:live-socket:latency-sim\"\nexport const PHX_LV_HISTORY_POSITION = \"phx:nav-history-position\"\nexport const PHX_PROGRESS = \"progress\"\nexport const PHX_MOUNTED = \"mounted\"\nexport const PHX_RELOAD_STATUS = \"__phoenix_reload_status__\"\nexport const LOADER_TIMEOUT = 1\nexport const MAX_CHILD_JOIN_ATTEMPTS = 3\nexport const BEFORE_UNLOAD_LOADER_TIMEOUT = 200\nexport const BINDING_PREFIX = \"phx-\"\nexport const PUSH_TIMEOUT = 30000\nexport const LINK_HEADER = \"x-requested-with\"\nexport const RESPONSE_URL_HEADER = \"x-response-url\"\nexport const DEBOUNCE_TRIGGER = \"debounce-trigger\"\nexport const THROTTLED = \"throttled\"\nexport const DEBOUNCE_PREV_KEY = \"debounce-prev-key\"\nexport const DEFAULTS = {\n  debounce: 300,\n  throttle: 300\n}\nexport const PHX_PENDING_ATTRS = [PHX_REF_LOADING, PHX_REF_SRC, PHX_REF_LOCK]\n// Rendered\nexport const DYNAMICS = \"d\"\nexport const STATIC = \"s\"\nexport const ROOT = \"r\"\nexport const COMPONENTS = \"c\"\nexport const EVENTS = \"e\"\nexport const REPLY = \"r\"\nexport const TITLE = \"t\"\nexport const TEMPLATES = \"p\"\nexport const STREAM = \"stream\"\n", "import {\n  logError\n} from \"./utils\"\n\nexport default class EntryUploader {\n  constructor(entry, config, liveSocket){\n    let {chunk_size, chunk_timeout} = config\n    this.liveSocket = liveSocket\n    this.entry = entry\n    this.offset = 0\n    this.chunkSize = chunk_size\n    this.chunkTimeout = chunk_timeout\n    this.chunkTimer = null\n    this.errored = false\n    this.uploadChannel = liveSocket.channel(`lvu:${entry.ref}`, {token: entry.metadata()})\n  }\n\n  error(reason){\n    if(this.errored){ return }\n    this.uploadChannel.leave()\n    this.errored = true\n    clearTimeout(this.chunkTimer)\n    this.entry.error(reason)\n  }\n\n  upload(){\n    this.uploadChannel.onError(reason => this.error(reason))\n    this.uploadChannel.join()\n      .receive(\"ok\", _data => this.readNextChunk())\n      .receive(\"error\", reason => this.error(reason))\n  }\n\n  isDone(){ return this.offset >= this.entry.file.size }\n\n  readNextChunk(){\n    let reader = new window.FileReader()\n    let blob = this.entry.file.slice(this.offset, this.chunkSize + this.offset)\n    reader.onload = (e) => {\n      if(e.target.error === null){\n        this.offset += e.target.result.byteLength\n        this.pushChunk(e.target.result)\n      } else {\n        return logError(\"Read error: \" + e.target.error)\n      }\n    }\n    reader.readAsArrayBuffer(blob)\n  }\n\n  pushChunk(chunk){\n    if(!this.uploadChannel.isJoined()){ return }\n    this.uploadChannel.push(\"chunk\", chunk, this.chunkTimeout)\n      .receive(\"ok\", () => {\n        this.entry.progress((this.offset / this.entry.file.size) * 100)\n        if(!this.isDone()){\n          this.chunkTimer = setTimeout(() => this.readNextChunk(), this.liveSocket.getLatencySim() || 0)\n        }\n      })\n      .receive(\"error\", ({reason}) => this.error(reason))\n  }\n}\n", "import {\n  PHX_VIEW_SELECTOR\n} from \"./constants\"\n\nimport EntryUploader from \"./entry_uploader\"\n\nexport let logError = (msg, obj) => console.error && console.error(msg, obj)\n\nexport let isCid = (cid) => {\n  let type = typeof(cid)\n  return type === \"number\" || (type === \"string\" && /^(0|[1-9]\\d*)$/.test(cid))\n}\n\nexport function detectDuplicateIds(){\n  let ids = new Set()\n  let elems = document.querySelectorAll(\"*[id]\")\n  for(let i = 0, len = elems.length; i < len; i++){\n    if(ids.has(elems[i].id)){\n      console.error(`Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`)\n    } else {\n      ids.add(elems[i].id)\n    }\n  }\n}\n\nexport let debug = (view, kind, msg, obj) => {\n  if(view.liveSocket.isDebugEnabled()){\n    console.log(`${view.id} ${kind}: ${msg} - `, obj)\n  }\n}\n\n// wraps value in closure or returns closure\nexport let closure = (val) => typeof val === \"function\" ? val : function (){ return val }\n\nexport let clone = (obj) => { return JSON.parse(JSON.stringify(obj)) }\n\nexport let closestPhxBinding = (el, binding, borderEl) => {\n  do {\n    if(el.matches(`[${binding}]`) && !el.disabled){ return el }\n    el = el.parentElement || el.parentNode\n  } while(el !== null && el.nodeType === 1 && !((borderEl && borderEl.isSameNode(el)) || el.matches(PHX_VIEW_SELECTOR)))\n  return null\n}\n\nexport let isObject = (obj) => {\n  return obj !== null && typeof obj === \"object\" && !(obj instanceof Array)\n}\n\nexport let isEqualObj = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2)\n\nexport let isEmpty = (obj) => {\n  for(let x in obj){ return false }\n  return true\n}\n\nexport let maybe = (el, callback) => el && callback(el)\n\nexport let channelUploader = function (entries, onError, resp, liveSocket){\n  entries.forEach(entry => {\n    let entryUploader = new EntryUploader(entry, resp.config, liveSocket)\n    entryUploader.upload()\n  })\n}\n", "let Browser = {\n  canPushState(){ return (typeof (history.pushState) !== \"undefined\") },\n\n  dropLocal(localStorage, namespace, subkey){\n    return localStorage.removeItem(this.localKey(namespace, subkey))\n  },\n\n  updateLocal(localStorage, namespace, subkey, initial, func){\n    let current = this.getLocal(localStorage, namespace, subkey)\n    let key = this.localKey(namespace, subkey)\n    let newVal = current === null ? initial : func(current)\n    localStorage.setItem(key, JSON.stringify(newVal))\n    return newVal\n  },\n\n  getLocal(localStorage, namespace, subkey){\n    return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey)))\n  },\n\n  updateCurrentState(callback){\n    if(!this.canPushState()){ return }\n    history.replaceState(callback(history.state || {}), \"\", window.location.href)\n  },\n\n  pushState(kind, meta, to){\n    if(this.canPushState()){\n      if(to !== window.location.href){\n        if(meta.type == \"redirect\" && meta.scroll){\n          // If we're redirecting store the current scrollY for the current history state.\n          let currentState = history.state || {}\n          currentState.scroll = meta.scroll\n          history.replaceState(currentState, \"\", window.location.href)\n        }\n\n        delete meta.scroll // Only store the scroll in the redirect case.\n        history[kind + \"State\"](meta, \"\", to || null) // IE will coerce undefined to string\n\n        // when using navigate, we'd call pushState immediately before patching the DOM,\n        // jumping back to the top of the page, effectively ignoring the scrollIntoView;\n        // therefore we wait for the next frame (after the DOM patch) and only then try\n        // to scroll to the hashEl\n        window.requestAnimationFrame(() => {\n          let hashEl = this.getHashTargetEl(window.location.hash)\n  \n          if(hashEl){\n            hashEl.scrollIntoView()\n          } else if(meta.type === \"redirect\"){\n            window.scroll(0, 0)\n          }\n        })\n      }\n    } else {\n      this.redirect(to)\n    }\n  },\n\n  setCookie(name, value, maxAgeSeconds){\n    let expires = typeof(maxAgeSeconds) === \"number\" ? ` max-age=${maxAgeSeconds};` : \"\"\n    document.cookie = `${name}=${value};${expires} path=/`\n  },\n\n  getCookie(name){\n    return document.cookie.replace(new RegExp(`(?:(?:^|.*;\\s*)${name}\\s*\\=\\s*([^;]*).*$)|^.*$`), \"$1\")\n  },\n\n  deleteCookie(name){\n    document.cookie = `${name}=; max-age=-1; path=/`\n  },\n\n  redirect(toURL, flash){\n    if(flash){ this.setCookie(\"__phoenix_flash__\", flash, 60) }\n    window.location = toURL\n  },\n\n  localKey(namespace, subkey){ return `${namespace}-${subkey}` },\n\n  getHashTargetEl(maybeHash){\n    let hash = maybeHash.toString().substring(1)\n    if(hash === \"\"){ return }\n    return document.getElementById(hash) || document.querySelector(`a[name=\"${hash}\"]`)\n  }\n}\n\nexport default Browser\n", "import {\n  CHECKABLE_INPUTS,\n  DEBOUNCE_PREV_KEY,\n  DEBOUNCE_TRIGGER,\n  FOCUSABLE_INPUTS,\n  PHX_COMPONENT,\n  PHX_HAS_FOCUSED,\n  PHX_HAS_SUBMITTED,\n  PHX_MAIN,\n  PHX_PARENT_ID,\n  PHX_PRIVATE,\n  PHX_REF_SRC,\n  PHX_PENDING_ATTRS,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_STATIC,\n  PHX_UPLOAD_REF,\n  PHX_VIEW_SELECTOR,\n  PHX_STICKY,\n  PHX_EVENT_CLASSES,\n  THROTTLED,\n} from \"./constants\"\n\nimport {\n  logError\n} from \"./utils\"\n\nlet DOM = {\n  byId(id){ return document.getElementById(id) || logError(`no id found for ${id}`) },\n\n  removeClass(el, className){\n    el.classList.remove(className)\n    if(el.classList.length === 0){ el.removeAttribute(\"class\") }\n  },\n\n  all(node, query, callback){\n    if(!node){ return [] }\n    let array = Array.from(node.querySelectorAll(query))\n    return callback ? array.forEach(callback) : array\n  },\n\n  childNodeLength(html){\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    return template.content.childElementCount\n  },\n\n  isUploadInput(el){ return el.type === \"file\" && el.getAttribute(PHX_UPLOAD_REF) !== null },\n\n  isAutoUpload(inputEl){ return inputEl.hasAttribute(\"data-phx-auto-upload\") },\n\n  findUploadInputs(node){\n    const formId = node.id\n    const inputsOutsideForm = this.all(document, `input[type=\"file\"][${PHX_UPLOAD_REF}][form=\"${formId}\"]`)\n    return this.all(node, `input[type=\"file\"][${PHX_UPLOAD_REF}]`).concat(inputsOutsideForm)\n  },\n\n  findComponentNodeList(node, cid){\n    return this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}=\"${cid}\"]`), node)\n  },\n\n  isPhxDestroyed(node){\n    return node.id && DOM.private(node, \"destroyed\") ? true : false\n  },\n\n  wantsNewTab(e){\n    let wantsNewTab = e.ctrlKey || e.shiftKey || e.metaKey || (e.button && e.button === 1)\n    let isDownload = (e.target instanceof HTMLAnchorElement && e.target.hasAttribute(\"download\"))\n    let isTargetBlank = e.target.hasAttribute(\"target\") && e.target.getAttribute(\"target\").toLowerCase() === \"_blank\"\n    let isTargetNamedTab = e.target.hasAttribute(\"target\") && !e.target.getAttribute(\"target\").startsWith(\"_\")\n    return wantsNewTab || isTargetBlank || isDownload || isTargetNamedTab\n  },\n\n  isUnloadableFormSubmit(e){\n    // Ignore form submissions intended to close a native <dialog> element\n    // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog#usage_notes\n    let isDialogSubmit = (e.target && e.target.getAttribute(\"method\") === \"dialog\") ||\n      (e.submitter && e.submitter.getAttribute(\"formmethod\") === \"dialog\")\n\n    if(isDialogSubmit){\n      return false\n    } else {\n      return !e.defaultPrevented && !this.wantsNewTab(e)\n    }\n  },\n\n  isNewPageClick(e, currentLocation){\n    let href = e.target instanceof HTMLAnchorElement ? e.target.getAttribute(\"href\") : null\n    let url\n\n    if(e.defaultPrevented || href === null || this.wantsNewTab(e)){ return false }\n    if(href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")){ return false }\n    if(e.target.isContentEditable){ return false }\n\n    try {\n      url = new URL(href)\n    } catch {\n      try {\n        url = new URL(href, currentLocation)\n      } catch {\n        // bad URL, fallback to let browser try it as external\n        return true\n      }\n    }\n\n    if(url.host === currentLocation.host && url.protocol === currentLocation.protocol){\n      if(url.pathname === currentLocation.pathname && url.search === currentLocation.search){\n        return url.hash === \"\" && !url.href.endsWith(\"#\")\n      }\n    }\n    return url.protocol.startsWith(\"http\")\n  },\n\n  markPhxChildDestroyed(el){\n    if(this.isPhxChild(el)){ el.setAttribute(PHX_SESSION, \"\") }\n    this.putPrivate(el, \"destroyed\", true)\n  },\n\n  findPhxChildrenInFragment(html, parentId){\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    return this.findPhxChildren(template.content, parentId)\n  },\n\n  isIgnored(el, phxUpdate){\n    return (el.getAttribute(phxUpdate) || el.getAttribute(\"data-phx-update\")) === \"ignore\"\n  },\n\n  isPhxUpdate(el, phxUpdate, updateTypes){\n    return el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0\n  },\n\n  findPhxSticky(el){ return this.all(el, `[${PHX_STICKY}]`) },\n\n  findPhxChildren(el, parentId){\n    return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}=\"${parentId}\"]`)\n  },\n\n  findExistingParentCIDs(node, cids){\n    // we only want to find parents that exist on the page\n    // if a cid is not on the page, the only way it can be added back to the page\n    // is if a parent adds it back, therefore if a cid does not exist on the page,\n    // we should not try to render it by itself (because it would be rendered twice,\n    // one by the parent, and a second time by itself)\n    let parentCids = new Set()\n    let childrenCids = new Set()\n\n    cids.forEach(cid => {\n      this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}=\"${cid}\"]`), node).forEach(parent => {\n        parentCids.add(cid)\n        this.all(parent, `[${PHX_COMPONENT}]`)\n          .map(el => parseInt(el.getAttribute(PHX_COMPONENT)))\n          .forEach(childCID => childrenCids.add(childCID))\n      })\n    })\n\n    childrenCids.forEach(childCid => parentCids.delete(childCid))\n\n    return parentCids\n  },\n\n  filterWithinSameLiveView(nodes, parent){\n    if(parent.querySelector(PHX_VIEW_SELECTOR)){\n      return nodes.filter(el => this.withinSameLiveView(el, parent))\n    } else {\n      return nodes\n    }\n  },\n\n  withinSameLiveView(node, parent){\n    while(node = node.parentNode){\n      if(node.isSameNode(parent)){ return true }\n      if(node.getAttribute(PHX_SESSION) !== null){ return false }\n    }\n  },\n\n  private(el, key){ return el[PHX_PRIVATE] && el[PHX_PRIVATE][key] },\n\n  deletePrivate(el, key){ el[PHX_PRIVATE] && delete (el[PHX_PRIVATE][key]) },\n\n  putPrivate(el, key, value){\n    if(!el[PHX_PRIVATE]){ el[PHX_PRIVATE] = {} }\n    el[PHX_PRIVATE][key] = value\n  },\n\n  updatePrivate(el, key, defaultVal, updateFunc){\n    let existing = this.private(el, key)\n    if(existing === undefined){\n      this.putPrivate(el, key, updateFunc(defaultVal))\n    } else {\n      this.putPrivate(el, key, updateFunc(existing))\n    }\n  },\n\n  syncPendingAttrs(fromEl, toEl){\n    if(!fromEl.hasAttribute(PHX_REF_SRC)){ return }\n    PHX_EVENT_CLASSES.forEach(className => {\n      fromEl.classList.contains(className) && toEl.classList.add(className)\n    })\n    PHX_PENDING_ATTRS.filter(attr => fromEl.hasAttribute(attr)).forEach(attr => {\n      toEl.setAttribute(attr, fromEl.getAttribute(attr))\n    })\n  },\n\n  copyPrivates(target, source){\n    if(source[PHX_PRIVATE]){\n      target[PHX_PRIVATE] = source[PHX_PRIVATE]\n    }\n  },\n\n  putTitle(str){\n    let titleEl = document.querySelector(\"title\")\n    if(titleEl){\n      let {prefix, suffix, default: defaultTitle} = titleEl.dataset\n      let isEmpty = typeof(str) !== \"string\" || str.trim() === \"\"\n      if(isEmpty && typeof(defaultTitle) !== \"string\"){ return }\n\n      let inner = isEmpty ? defaultTitle : str\n      document.title = `${prefix || \"\"}${inner || \"\"}${suffix || \"\"}`\n    } else {\n      document.title = str\n    }\n  },\n\n  debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, callback){\n    let debounce = el.getAttribute(phxDebounce)\n    let throttle = el.getAttribute(phxThrottle)\n\n    if(debounce === \"\"){ debounce = defaultDebounce }\n    if(throttle === \"\"){ throttle = defaultThrottle }\n    let value = debounce || throttle\n    switch(value){\n      case null: return callback()\n\n      case \"blur\":\n        if(this.once(el, \"debounce-blur\")){\n          el.addEventListener(\"blur\", () => {\n            if(asyncFilter()){ callback() }\n          })\n        }\n        return\n\n      default:\n        let timeout = parseInt(value)\n        let trigger = () => throttle ? this.deletePrivate(el, THROTTLED) : callback()\n        let currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger)\n        if(isNaN(timeout)){ return logError(`invalid throttle/debounce value: ${value}`) }\n        if(throttle){\n          let newKeyDown = false\n          if(event.type === \"keydown\"){\n            let prevKey = this.private(el, DEBOUNCE_PREV_KEY)\n            this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key)\n            newKeyDown = prevKey !== event.key\n          }\n\n          if(!newKeyDown && this.private(el, THROTTLED)){\n            return false\n          } else {\n            callback()\n            const t = setTimeout(() => {\n              if(asyncFilter()){ this.triggerCycle(el, DEBOUNCE_TRIGGER) }\n            }, timeout)\n            this.putPrivate(el, THROTTLED, t)\n          }\n        } else {\n          setTimeout(() => {\n            if(asyncFilter()){ this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle) }\n          }, timeout)\n        }\n\n        let form = el.form\n        if(form && this.once(form, \"bind-debounce\")){\n          form.addEventListener(\"submit\", () => {\n            Array.from((new FormData(form)).entries(), ([name]) => {\n              let input = form.querySelector(`[name=\"${name}\"]`)\n              this.incCycle(input, DEBOUNCE_TRIGGER)\n              this.deletePrivate(input, THROTTLED)\n            })\n          })\n        }\n        if(this.once(el, \"bind-debounce\")){\n          el.addEventListener(\"blur\", () => {\n            // because we trigger the callback here,\n            // we also clear the throttle timeout to prevent the callback\n            // from being called again after the timeout fires\n            clearTimeout(this.private(el, THROTTLED))\n            this.triggerCycle(el, DEBOUNCE_TRIGGER)\n          })\n        }\n    }\n  },\n\n  triggerCycle(el, key, currentCycle){\n    let [cycle, trigger] = this.private(el, key)\n    if(!currentCycle){ currentCycle = cycle }\n    if(currentCycle === cycle){\n      this.incCycle(el, key)\n      trigger()\n    }\n  },\n\n  once(el, key){\n    if(this.private(el, key) === true){ return false }\n    this.putPrivate(el, key, true)\n    return true\n  },\n\n  incCycle(el, key, trigger = function (){ }){\n    let [currentCycle] = this.private(el, key) || [0, trigger]\n    currentCycle++\n    this.putPrivate(el, key, [currentCycle, trigger])\n    return currentCycle\n  },\n\n  // maintains or adds privately used hook information\n  // fromEl and toEl can be the same element in the case of a newly added node\n  // fromEl and toEl can be any HTML node type, so we need to check if it's an element node\n  maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom){\n    // maintain the hooks created with createHook\n    if(fromEl.hasAttribute && fromEl.hasAttribute(\"data-phx-hook\") && !toEl.hasAttribute(\"data-phx-hook\")){\n      toEl.setAttribute(\"data-phx-hook\", fromEl.getAttribute(\"data-phx-hook\"))\n    }\n    // add hooks to elements with viewport attributes\n    if(toEl.hasAttribute && (toEl.hasAttribute(phxViewportTop) || toEl.hasAttribute(phxViewportBottom))){\n      toEl.setAttribute(\"data-phx-hook\", \"Phoenix.InfiniteScroll\")\n    }\n  },\n\n  putCustomElHook(el, hook){\n    if(el.isConnected){\n      el.setAttribute(\"data-phx-hook\", \"\")\n    } else {\n      console.error(`\n        hook attached to non-connected DOM element\n        ensure you are calling createHook within your connectedCallback. ${el.outerHTML}\n      `)\n    }\n    this.putPrivate(el, \"custom-el-hook\", hook)\n  },\n\n  getCustomElHook(el){ return this.private(el, \"custom-el-hook\") },\n\n  isUsedInput(el){\n    return (el.nodeType === Node.ELEMENT_NODE &&\n      (this.private(el, PHX_HAS_FOCUSED) || this.private(el, PHX_HAS_SUBMITTED)))\n  },\n\n  resetForm(form){\n    Array.from(form.elements).forEach(input => {\n      this.deletePrivate(input, PHX_HAS_FOCUSED)\n      this.deletePrivate(input, PHX_HAS_SUBMITTED)\n    })\n  },\n\n  isPhxChild(node){\n    return node.getAttribute && node.getAttribute(PHX_PARENT_ID)\n  },\n\n  isPhxSticky(node){\n    return node.getAttribute && node.getAttribute(PHX_STICKY) !== null\n  },\n\n  isChildOfAny(el, parents){\n    return !!parents.find(parent => parent.contains(el))\n  },\n\n  firstPhxChild(el){\n    return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0]\n  },\n\n  dispatchEvent(target, name, opts = {}){\n    let defaultBubble = true\n    let isUploadTarget = target.nodeName === \"INPUT\" && target.type === \"file\"\n    if(isUploadTarget && name === \"click\"){\n      defaultBubble = false\n    }\n    let bubbles = opts.bubbles === undefined ? defaultBubble : !!opts.bubbles\n    let eventOpts = {bubbles: bubbles, cancelable: true, detail: opts.detail || {}}\n    let event = name === \"click\" ? new MouseEvent(\"click\", eventOpts) : new CustomEvent(name, eventOpts)\n    target.dispatchEvent(event)\n  },\n\n  cloneNode(node, html){\n    if(typeof (html) === \"undefined\"){\n      return node.cloneNode(true)\n    } else {\n      let cloned = node.cloneNode(false)\n      cloned.innerHTML = html\n      return cloned\n    }\n  },\n\n  // merge attributes from source to target\n  // if an element is ignored, we only merge data attributes\n  // including removing data attributes that are no longer in the source\n  mergeAttrs(target, source, opts = {}){\n    let exclude = new Set(opts.exclude || [])\n    let isIgnored = opts.isIgnored\n    let sourceAttrs = source.attributes\n    for(let i = sourceAttrs.length - 1; i >= 0; i--){\n      let name = sourceAttrs[i].name\n      if(!exclude.has(name)){\n        const sourceValue = source.getAttribute(name)\n        if(target.getAttribute(name) !== sourceValue && (!isIgnored || (isIgnored && name.startsWith(\"data-\")))){\n          target.setAttribute(name, sourceValue)\n        }\n      } else {\n        // We exclude the value from being merged on focused inputs, because the\n        // user's input should always win.\n        // We can still assign it as long as the value property is the same, though.\n        // This prevents a situation where the updated hook is not being triggered\n        // when an input is back in its \"original state\", because the attribute\n        // was never changed, see:\n        // https://github.com/phoenixframework/phoenix_live_view/issues/2163\n        if(name === \"value\" && target.value === source.value){\n          // actually set the value attribute to sync it with the value property\n          target.setAttribute(\"value\", source.getAttribute(name))\n        }\n      }\n    }\n\n    let targetAttrs = target.attributes\n    for(let i = targetAttrs.length - 1; i >= 0; i--){\n      let name = targetAttrs[i].name\n      if(isIgnored){\n        if(name.startsWith(\"data-\") && !source.hasAttribute(name) && !PHX_PENDING_ATTRS.includes(name)){ target.removeAttribute(name) }\n      } else {\n        if(!source.hasAttribute(name)){ target.removeAttribute(name) }\n      }\n    }\n  },\n\n  mergeFocusedInput(target, source){\n    // skip selects because FF will reset highlighted index for any setAttribute\n    if(!(target instanceof HTMLSelectElement)){ DOM.mergeAttrs(target, source, {exclude: [\"value\"]}) }\n\n    if(source.readOnly){\n      target.setAttribute(\"readonly\", true)\n    } else {\n      target.removeAttribute(\"readonly\")\n    }\n  },\n\n  hasSelectionRange(el){\n    return el.setSelectionRange && (el.type === \"text\" || el.type === \"textarea\")\n  },\n\n  restoreFocus(focused, selectionStart, selectionEnd){\n    if(focused instanceof HTMLSelectElement){ focused.focus() }\n    if(!DOM.isTextualInput(focused)){ return }\n\n    let wasFocused = focused.matches(\":focus\")\n    if(!wasFocused){ focused.focus() }\n    if(this.hasSelectionRange(focused)){\n      focused.setSelectionRange(selectionStart, selectionEnd)\n    }\n  },\n\n  isFormInput(el){ return /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== \"button\" },\n\n  syncAttrsToProps(el){\n    if(el instanceof HTMLInputElement && CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0){\n      el.checked = el.getAttribute(\"checked\") !== null\n    }\n  },\n\n  isTextualInput(el){ return FOCUSABLE_INPUTS.indexOf(el.type) >= 0 },\n\n  isNowTriggerFormExternal(el, phxTriggerExternal){\n    return el.getAttribute && el.getAttribute(phxTriggerExternal) !== null && document.body.contains(el)\n  },\n\n  cleanChildNodes(container, phxUpdate){\n    if(DOM.isPhxUpdate(container, phxUpdate, [\"append\", \"prepend\"])){\n      let toRemove = []\n      container.childNodes.forEach(childNode => {\n        if(!childNode.id){\n          // Skip warning if it's an empty text node (e.g. a new-line)\n          let isEmptyTextNode = childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue.trim() === \"\"\n          if(!isEmptyTextNode && childNode.nodeType !== Node.COMMENT_NODE){\n            logError(\"only HTML element tags with an id are allowed inside containers with phx-update.\\n\\n\" +\n              `removing illegal node: \"${(childNode.outerHTML || childNode.nodeValue).trim()}\"\\n\\n`)\n          }\n          toRemove.push(childNode)\n        }\n      })\n      toRemove.forEach(childNode => childNode.remove())\n    }\n  },\n\n  replaceRootContainer(container, tagName, attrs){\n    let retainedAttrs = new Set([\"id\", PHX_SESSION, PHX_STATIC, PHX_MAIN, PHX_ROOT_ID])\n    if(container.tagName.toLowerCase() === tagName.toLowerCase()){\n      Array.from(container.attributes)\n        .filter(attr => !retainedAttrs.has(attr.name.toLowerCase()))\n        .forEach(attr => container.removeAttribute(attr.name))\n\n      Object.keys(attrs)\n        .filter(name => !retainedAttrs.has(name.toLowerCase()))\n        .forEach(attr => container.setAttribute(attr, attrs[attr]))\n\n      return container\n\n    } else {\n      let newContainer = document.createElement(tagName)\n      Object.keys(attrs).forEach(attr => newContainer.setAttribute(attr, attrs[attr]))\n      retainedAttrs.forEach(attr => newContainer.setAttribute(attr, container.getAttribute(attr)))\n      newContainer.innerHTML = container.innerHTML\n      container.replaceWith(newContainer)\n      return newContainer\n    }\n  },\n\n  getSticky(el, name, defaultVal){\n    let op = (DOM.private(el, \"sticky\") || []).find(([existingName,]) => name === existingName)\n    if(op){\n      let [_name, _op, stashedResult] = op\n      return stashedResult\n    } else {\n      return typeof(defaultVal) === \"function\" ? defaultVal() : defaultVal\n    }\n  },\n\n  deleteSticky(el, name){\n    this.updatePrivate(el, \"sticky\", [], ops => {\n      return ops.filter(([existingName, _]) => existingName !== name)\n    })\n  },\n\n  putSticky(el, name, op){\n    let stashedResult = op(el)\n    this.updatePrivate(el, \"sticky\", [], ops => {\n      let existingIndex = ops.findIndex(([existingName,]) => name === existingName)\n      if(existingIndex >= 0){\n        ops[existingIndex] = [name, op, stashedResult]\n      } else {\n        ops.push([name, op, stashedResult])\n      }\n      return ops\n    })\n  },\n\n  applyStickyOperations(el){\n    let ops = DOM.private(el, \"sticky\")\n    if(!ops){ return }\n\n    ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op))\n  }\n}\n\nexport default DOM\n", "import {\n  PHX_ACTIVE_ENTRY_REFS,\n  PHX_LIVE_FILE_UPDATED,\n  PHX_PREFLIGHTED_REFS\n} from \"./constants\"\n\nimport {\n  channelUploader,\n  logError\n} from \"./utils\"\n\nimport LiveUploader from \"./live_uploader\"\n\nexport default class UploadEntry {\n  static isActive(fileEl, file){\n    let isNew = file._phxRef === undefined\n    let activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\")\n    let isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0\n    return file.size > 0 && (isNew || isActive)\n  }\n\n  static isPreflighted(fileEl, file){\n    let preflightedRefs = fileEl.getAttribute(PHX_PREFLIGHTED_REFS).split(\",\")\n    let isPreflighted = preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0\n    return isPreflighted && this.isActive(fileEl, file)\n  }\n\n  static isPreflightInProgress(file){\n    return file._preflightInProgress === true\n  }\n\n  static markPreflightInProgress(file){\n    file._preflightInProgress = true\n  }\n\n  constructor(fileEl, file, view, autoUpload){\n    this.ref = LiveUploader.genFileRef(file)\n    this.fileEl = fileEl\n    this.file = file\n    this.view = view\n    this.meta = null\n    this._isCancelled = false\n    this._isDone = false\n    this._progress = 0\n    this._lastProgressSent = -1\n    this._onDone = function(){ }\n    this._onElUpdated = this.onElUpdated.bind(this)\n    this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n    this.autoUpload = autoUpload\n  }\n\n  metadata(){ return this.meta }\n\n  progress(progress){\n    this._progress = Math.floor(progress)\n    if(this._progress > this._lastProgressSent){\n      if(this._progress >= 100){\n        this._progress = 100\n        this._lastProgressSent = 100\n        this._isDone = true\n        this.view.pushFileProgress(this.fileEl, this.ref, 100, () => {\n          LiveUploader.untrackFile(this.fileEl, this.file)\n          this._onDone()\n        })\n      } else {\n        this._lastProgressSent = this._progress\n        this.view.pushFileProgress(this.fileEl, this.ref, this._progress)\n      }\n    }\n  }\n\n  isCancelled(){ return this._isCancelled }\n\n  cancel(){\n    this.file._preflightInProgress = false\n    this._isCancelled = true\n    this._isDone = true\n    this._onDone()\n  }\n\n  isDone(){ return this._isDone }\n\n  error(reason = \"failed\"){\n    this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n    this.view.pushFileProgress(this.fileEl, this.ref, {error: reason})\n    if(!this.isAutoUpload()){ LiveUploader.clearFiles(this.fileEl) }\n  }\n\n  isAutoUpload(){ return this.autoUpload }\n\n  //private\n\n  onDone(callback){\n    this._onDone = () => {\n      this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated)\n      callback()\n    }\n  }\n\n  onElUpdated(){\n    let activeRefs = this.fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\")\n    if(activeRefs.indexOf(this.ref) === -1){\n      LiveUploader.untrackFile(this.fileEl, this.file)\n      this.cancel()\n    }\n  }\n\n  toPreflightPayload(){\n    return {\n      last_modified: this.file.lastModified,\n      name: this.file.name,\n      relative_path: this.file.webkitRelativePath,\n      size: this.file.size,\n      type: this.file.type,\n      ref: this.ref,\n      meta: typeof(this.file.meta) === \"function\" ? this.file.meta() : undefined\n    }\n  }\n\n  uploader(uploaders){\n    if(this.meta.uploader){\n      let callback = uploaders[this.meta.uploader] || logError(`no uploader configured for ${this.meta.uploader}`)\n      return {name: this.meta.uploader, callback: callback}\n    } else {\n      return {name: \"channel\", callback: channelUploader}\n    }\n  }\n\n  zipPostFlight(resp){\n    this.meta = resp.entries[this.ref]\n    if(!this.meta){ logError(`no preflight upload response returned with ref ${this.ref}`, {input: this.fileEl, response: resp}) }\n  }\n}\n", "import {\n  PHX_DONE_REFS,\n  PHX_PREFLIGHTED_REFS,\n  PHX_UPLOAD_REF\n} from \"./constants\"\n\nimport {\n} from \"./utils\"\n\nimport DOM from \"./dom\"\nimport UploadEntry from \"./upload_entry\"\n\nlet liveUploaderFileRef = 0\n\nexport default class LiveUploader {\n  static genFileRef(file){\n    let ref = file._phxRef\n    if(ref !== undefined){\n      return ref\n    } else {\n      file._phxRef = (liveUploaderFileRef++).toString()\n      return file._phxRef\n    }\n  }\n\n  static getEntryDataURL(inputEl, ref, callback){\n    let file = this.activeFiles(inputEl).find(file => this.genFileRef(file) === ref)\n    callback(URL.createObjectURL(file))\n  }\n\n  static hasUploadsInProgress(formEl){\n    let active = 0\n    DOM.findUploadInputs(formEl).forEach(input => {\n      if(input.getAttribute(PHX_PREFLIGHTED_REFS) !== input.getAttribute(PHX_DONE_REFS)){\n        active++\n      }\n    })\n    return active > 0\n  }\n\n  static serializeUploads(inputEl){\n    let files = this.activeFiles(inputEl)\n    let fileData = {}\n    files.forEach(file => {\n      let entry = {path: inputEl.name}\n      let uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF)\n      fileData[uploadRef] = fileData[uploadRef] || []\n      entry.ref = this.genFileRef(file)\n      entry.last_modified = file.lastModified\n      entry.name = file.name || entry.ref\n      entry.relative_path = file.webkitRelativePath\n      entry.type = file.type\n      entry.size = file.size\n      if(typeof(file.meta) === \"function\"){ entry.meta = file.meta() }\n      fileData[uploadRef].push(entry)\n    })\n    return fileData\n  }\n\n  static clearFiles(inputEl){\n    inputEl.value = null\n    inputEl.removeAttribute(PHX_UPLOAD_REF)\n    DOM.putPrivate(inputEl, \"files\", [])\n  }\n\n  static untrackFile(inputEl, file){\n    DOM.putPrivate(inputEl, \"files\", DOM.private(inputEl, \"files\").filter(f => !Object.is(f, file)))\n  }\n\n  static trackFiles(inputEl, files, dataTransfer){\n    if(inputEl.getAttribute(\"multiple\") !== null){\n      let newFiles = files.filter(file => !this.activeFiles(inputEl).find(f => Object.is(f, file)))\n      DOM.updatePrivate(inputEl, \"files\", [], (existing) => existing.concat(newFiles))\n      inputEl.value = null\n    } else {\n      // Reset inputEl files to align output with programmatic changes (i.e. drag and drop)\n      if(dataTransfer && dataTransfer.files.length > 0){ inputEl.files = dataTransfer.files }\n      DOM.putPrivate(inputEl, \"files\", files)\n    }\n  }\n\n  static activeFileInputs(formEl){\n    let fileInputs = DOM.findUploadInputs(formEl)\n    return Array.from(fileInputs).filter(el => el.files && this.activeFiles(el).length > 0)\n  }\n\n  static activeFiles(input){\n    return (DOM.private(input, \"files\") || []).filter(f => UploadEntry.isActive(input, f))\n  }\n\n  static inputsAwaitingPreflight(formEl){\n    let fileInputs = DOM.findUploadInputs(formEl)\n    return Array.from(fileInputs).filter(input => this.filesAwaitingPreflight(input).length > 0)\n  }\n\n  static filesAwaitingPreflight(input){\n    return this.activeFiles(input).filter(f => !UploadEntry.isPreflighted(input, f) && !UploadEntry.isPreflightInProgress(f))\n  }\n\n  static markPreflightInProgress(entries){\n    entries.forEach(entry => UploadEntry.markPreflightInProgress(entry.file))\n  }\n\n  constructor(inputEl, view, onComplete){\n    this.autoUpload = DOM.isAutoUpload(inputEl)\n    this.view = view\n    this.onComplete = onComplete\n    this._entries =\n      Array.from(LiveUploader.filesAwaitingPreflight(inputEl) || [])\n        .map(file => new UploadEntry(inputEl, file, view, this.autoUpload))\n\n    // prevent sending duplicate preflight requests\n    LiveUploader.markPreflightInProgress(this._entries)\n\n    this.numEntriesInProgress = this._entries.length\n  }\n\n  isAutoUpload(){ return this.autoUpload }\n\n  entries(){ return this._entries }\n\n  initAdapterUpload(resp, onError, liveSocket){\n    this._entries =\n      this._entries.map(entry => {\n        if(entry.isCancelled()){\n          this.numEntriesInProgress--\n          if(this.numEntriesInProgress === 0){ this.onComplete() }\n        } else {\n          entry.zipPostFlight(resp)\n          entry.onDone(() => {\n            this.numEntriesInProgress--\n            if(this.numEntriesInProgress === 0){ this.onComplete() }\n          })\n        }\n        return entry\n      })\n\n    let groupedEntries = this._entries.reduce((acc, entry) => {\n      if(!entry.meta){ return acc }\n      let {name, callback} = entry.uploader(liveSocket.uploaders)\n      acc[name] = acc[name] || {callback: callback, entries: []}\n      acc[name].entries.push(entry)\n      return acc\n    }, {})\n\n    for(let name in groupedEntries){\n      let {callback, entries} = groupedEntries[name]\n      callback(entries, onError, resp, liveSocket)\n    }\n  }\n}\n", "let ARIA = {\n  anyOf(instance, classes){ return classes.find(name => instance instanceof name) },\n\n  isFocusable(el, interactiveOnly){\n    return (\n      (el instanceof HTMLAnchorElement && el.rel !== \"ignore\") ||\n      (el instanceof HTMLAreaElement && el.href !== undefined) ||\n      (!el.disabled && (this.anyOf(el, [HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement, HTMLButtonElement]))) ||\n      (el instanceof HTMLIFrameElement) ||\n      (el.tabIndex > 0 || (!interactiveOnly && el.getAttribute(\"tabindex\") !== null && el.getAttribute(\"aria-hidden\") !== \"true\"))\n    )\n  },\n\n  attemptFocus(el, interactiveOnly){\n    if(this.isFocusable(el, interactiveOnly)){ try { el.focus() } catch {} }\n    return !!document.activeElement && document.activeElement.isSameNode(el)\n  },\n\n  focusFirstInteractive(el){\n    let child = el.firstElementChild\n    while(child){\n      if(this.attemptFocus(child, true) || this.focusFirstInteractive(child, true)){\n        return true\n      }\n      child = child.nextElementSibling\n    }\n  },\n\n  focusFirst(el){\n    let child = el.firstElementChild\n    while(child){\n      if(this.attemptFocus(child) || this.focusFirst(child)){\n        return true\n      }\n      child = child.nextElementSibling\n    }\n  },\n\n  focusLast(el){\n    let child = el.lastElementChild\n    while(child){\n      if(this.attemptFocus(child) || this.focusLast(child)){\n        return true\n      }\n      child = child.previousElementSibling\n    }\n  }\n}\nexport default ARIA\n", "import {\n  PHX_ACTIVE_ENTRY_REFS,\n  PHX_LIVE_FILE_UPDATED,\n  PHX_PREFLIGHTED_REFS,\n  PHX_UPLOAD_REF\n} from \"./constants\"\n\nimport LiveUploader from \"./live_uploader\"\nimport ARIA from \"./aria\"\n\nlet Hooks = {\n  LiveFileUpload: {\n    activeRefs(){ return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS) },\n\n    preflightedRefs(){ return this.el.getAttribute(PHX_PREFLIGHTED_REFS) },\n\n    mounted(){ this.preflightedWas = this.preflightedRefs() },\n\n    updated(){\n      let newPreflights = this.preflightedRefs()\n      if(this.preflightedWas !== newPreflights){\n        this.preflightedWas = newPreflights\n        if(newPreflights === \"\"){\n          this.__view().cancelSubmit(this.el.form)\n        }\n      }\n\n      if(this.activeRefs() === \"\"){ this.el.value = null }\n      this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED))\n    }\n  },\n\n  LiveImgPreview: {\n    mounted(){\n      this.ref = this.el.getAttribute(\"data-phx-entry-ref\")\n      this.inputEl = document.getElementById(this.el.getAttribute(PHX_UPLOAD_REF))\n      LiveUploader.getEntryDataURL(this.inputEl, this.ref, url => {\n        this.url = url\n        this.el.src = url\n      })\n    },\n    destroyed(){\n      URL.revokeObjectURL(this.url)\n    }\n  },\n  FocusWrap: {\n    mounted(){\n      this.focusStart = this.el.firstElementChild\n      this.focusEnd = this.el.lastElementChild\n      this.focusStart.addEventListener(\"focus\", () => ARIA.focusLast(this.el))\n      this.focusEnd.addEventListener(\"focus\", () => ARIA.focusFirst(this.el))\n      this.el.addEventListener(\"phx:show-end\", () => this.el.focus())\n      if(window.getComputedStyle(this.el).display !== \"none\"){\n        ARIA.focusFirst(this.el)\n      }\n    }\n  }\n}\n\nlet findScrollContainer = (el) => {\n  // the scroll event won't be fired on the html/body element even if overflow is set\n  // therefore we return null to instead listen for scroll events on document\n  if([\"HTML\", \"BODY\"].indexOf(el.nodeName.toUpperCase()) >= 0) return null\n  if([\"scroll\", \"auto\"].indexOf(getComputedStyle(el).overflowY) >= 0) return el\n  return findScrollContainer(el.parentElement)\n}\n\nlet scrollTop = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.scrollTop\n  } else {\n    return document.documentElement.scrollTop || document.body.scrollTop\n  }\n}\n\nlet bottom = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.getBoundingClientRect().bottom\n  } else {\n    // when we have no container, the whole page scrolls,\n    // therefore the bottom coordinate is the viewport height\n    return window.innerHeight || document.documentElement.clientHeight\n  }\n}\n\nlet top = (scrollContainer) => {\n  if(scrollContainer){\n    return scrollContainer.getBoundingClientRect().top\n  } else {\n    // when we have no container the whole page scrolls,\n    // therefore the top coordinate is 0\n    return 0\n  }\n}\n\nlet isAtViewportTop = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer)\n}\n\nlet isAtViewportBottom = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.bottom) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.bottom) <= bottom(scrollContainer)\n}\n\nlet isWithinViewport = (el, scrollContainer) => {\n  let rect = el.getBoundingClientRect()\n  return Math.ceil(rect.top) >= top(scrollContainer) && Math.ceil(rect.left) >= 0 && Math.floor(rect.top) <= bottom(scrollContainer)\n}\n\nHooks.InfiniteScroll = {\n  mounted(){\n    this.scrollContainer = findScrollContainer(this.el)\n    let scrollBefore = scrollTop(this.scrollContainer)\n    let topOverran = false\n    let throttleInterval = 500\n    let pendingOp = null\n\n    let onTopOverrun = this.throttle(throttleInterval, (topEvent, firstChild) => {\n      pendingOp = () => true\n      this.liveSocket.execJSHookPush(this.el, topEvent, {id: firstChild.id, _overran: true}, () => {\n        pendingOp = null\n      })\n    })\n\n    let onFirstChildAtTop = this.throttle(throttleInterval, (topEvent, firstChild) => {\n      pendingOp = () => firstChild.scrollIntoView({block: \"start\"})\n      this.liveSocket.execJSHookPush(this.el, topEvent, {id: firstChild.id}, () => {\n        pendingOp = null\n        // make sure that the DOM is patched by waiting for the next tick\n        window.requestAnimationFrame(() => {\n          if(!isWithinViewport(firstChild, this.scrollContainer)){\n            firstChild.scrollIntoView({block: \"start\"})\n          }\n        })\n      })\n    })\n\n    let onLastChildAtBottom = this.throttle(throttleInterval, (bottomEvent, lastChild) => {\n      pendingOp = () => lastChild.scrollIntoView({block: \"end\"})\n      this.liveSocket.execJSHookPush(this.el, bottomEvent, {id: lastChild.id}, () => {\n        pendingOp = null\n        // make sure that the DOM is patched by waiting for the next tick\n        window.requestAnimationFrame(() => {\n          if(!isWithinViewport(lastChild, this.scrollContainer)){\n            lastChild.scrollIntoView({block: \"end\"})\n          }\n        })\n      })\n    })\n\n    this.onScroll = (_e) => {\n      let scrollNow = scrollTop(this.scrollContainer)\n\n      if(pendingOp){\n        scrollBefore = scrollNow\n        return pendingOp()\n      }\n      let rect = this.el.getBoundingClientRect()\n      let topEvent = this.el.getAttribute(this.liveSocket.binding(\"viewport-top\"))\n      let bottomEvent = this.el.getAttribute(this.liveSocket.binding(\"viewport-bottom\"))\n      let lastChild = this.el.lastElementChild\n      let firstChild = this.el.firstElementChild\n      let isScrollingUp = scrollNow < scrollBefore\n      let isScrollingDown = scrollNow > scrollBefore\n\n      // el overran while scrolling up\n      if(isScrollingUp && topEvent && !topOverran && rect.top >= 0){\n        topOverran = true\n        onTopOverrun(topEvent, firstChild)\n      } else if(isScrollingDown && topOverran && rect.top <= 0){\n        topOverran = false\n      }\n\n      if(topEvent && isScrollingUp && isAtViewportTop(firstChild, this.scrollContainer)){\n        onFirstChildAtTop(topEvent, firstChild)\n      } else if(bottomEvent && isScrollingDown && isAtViewportBottom(lastChild, this.scrollContainer)){\n        onLastChildAtBottom(bottomEvent, lastChild)\n      }\n      scrollBefore = scrollNow\n    }\n\n    if(this.scrollContainer){\n      this.scrollContainer.addEventListener(\"scroll\", this.onScroll)\n    } else {\n      window.addEventListener(\"scroll\", this.onScroll)\n    }\n  },\n  \n  destroyed(){\n    if(this.scrollContainer){\n      this.scrollContainer.removeEventListener(\"scroll\", this.onScroll)\n    } else {\n      window.removeEventListener(\"scroll\", this.onScroll)\n    }\n  },\n\n  throttle(interval, callback){\n    let lastCallAt = 0\n    let timer\n\n    return (...args) => {\n      let now = Date.now()\n      let remainingTime = interval - (now - lastCallAt)\n\n      if(remainingTime <= 0 || remainingTime > interval){\n        if(timer){\n          clearTimeout(timer)\n          timer = null\n        }\n        lastCallAt = now\n        callback(...args)\n      } else if(!timer){\n        timer = setTimeout(() => {\n          lastCallAt = Date.now()\n          timer = null\n          callback(...args)\n        }, remainingTime)\n      }\n    }\n  }\n}\nexport default Hooks\n", "import {\n  PHX_REF_LOADING,\n  PHX_REF_LOCK,\n  PHX_REF_SRC,\n  PHX_EVENT_CLASSES,\n  PHX_DISABLED,\n  PHX_READONLY,\n  PHX_DISABLE_WITH_RESTORE\n} from \"./constants\"\n\nimport DOM from \"./dom\"\n\nexport default class ElementRef {\n  constructor(el){\n    this.el = el\n    this.loadingRef = el.hasAttribute(PHX_REF_LOADING) ? parseInt(el.getAttribute(PHX_REF_LOADING), 10) : null\n    this.lockRef = el.hasAttribute(PHX_REF_LOCK) ? parseInt(el.getAttribute(PHX_REF_LOCK), 10) : null\n  }\n\n  // public\n\n  maybeUndo(ref, phxEvent, eachCloneCallback){\n    if(!this.isWithin(ref)){ return }\n\n    // undo locks and apply clones\n    this.undoLocks(ref, phxEvent, eachCloneCallback)\n\n    // undo loading states\n    this.undoLoading(ref, phxEvent)\n\n    // clean up if fully resolved\n    if(this.isFullyResolvedBy(ref)){ this.el.removeAttribute(PHX_REF_SRC) }\n  }\n\n  // private\n\n  isWithin(ref){\n    return !((this.loadingRef !== null && this.loadingRef > ref) && (this.lockRef !== null && this.lockRef > ref))\n  }\n\n  // Check for cloned PHX_REF_LOCK element that has been morphed behind\n  // the scenes while this element was locked in the DOM.\n  // When we apply the cloned tree to the active DOM element, we must\n  //\n  //   1. execute pending mounted hooks for nodes now in the DOM\n  //   2. undo any ref inside the cloned tree that has since been ack'd\n  undoLocks(ref, phxEvent, eachCloneCallback){\n    if(!this.isLockUndoneBy(ref)){ return }\n\n    let clonedTree = DOM.private(this.el, PHX_REF_LOCK)\n    if(clonedTree){\n      eachCloneCallback(clonedTree)\n      DOM.deletePrivate(this.el, PHX_REF_LOCK)\n    }\n    this.el.removeAttribute(PHX_REF_LOCK)\n\n    let opts = {detail: {ref: ref, event: phxEvent}, bubbles: true, cancelable: false}\n    this.el.dispatchEvent(new CustomEvent(`phx:undo-lock:${this.lockRef}`, opts))\n  }\n\n  undoLoading(ref, phxEvent){\n    if(!this.isLoadingUndoneBy(ref)){\n      if(this.canUndoLoading(ref) && this.el.classList.contains(\"phx-submit-loading\")){\n        this.el.classList.remove(\"phx-change-loading\")\n      }\n      return\n    }\n\n    if(this.canUndoLoading(ref)){\n      this.el.removeAttribute(PHX_REF_LOADING)\n      let disabledVal = this.el.getAttribute(PHX_DISABLED)\n      let readOnlyVal = this.el.getAttribute(PHX_READONLY)\n      // restore inputs\n      if(readOnlyVal !== null){\n        this.el.readOnly = readOnlyVal === \"true\" ? true : false\n        this.el.removeAttribute(PHX_READONLY)\n      }\n      if(disabledVal !== null){\n        this.el.disabled = disabledVal === \"true\" ? true : false\n        this.el.removeAttribute(PHX_DISABLED)\n      }\n      // restore disables\n      let disableRestore = this.el.getAttribute(PHX_DISABLE_WITH_RESTORE)\n      if(disableRestore !== null){\n        this.el.innerText = disableRestore\n        this.el.removeAttribute(PHX_DISABLE_WITH_RESTORE)\n      }\n\n      let opts = {detail: {ref: ref, event: phxEvent}, bubbles: true, cancelable: false}\n      this.el.dispatchEvent(new CustomEvent(`phx:undo-loading:${this.loadingRef}`, opts))\n    }\n\n    // remove classes\n    PHX_EVENT_CLASSES.forEach(name => {\n      if(name !== \"phx-submit-loading\" || this.canUndoLoading(ref)){\n        DOM.removeClass(this.el, name)\n      }\n    })\n  }\n\n  isLoadingUndoneBy(ref){ return this.loadingRef === null ? false : this.loadingRef <= ref }\n  isLockUndoneBy(ref){ return this.lockRef === null ? false : this.lockRef <= ref }\n\n  isFullyResolvedBy(ref){\n    return (this.loadingRef === null || this.loadingRef <= ref) && (this.lockRef === null || this.lockRef <= ref)\n  }\n\n  // only remove the phx-submit-loading class if we are not locked\n  canUndoLoading(ref){ return this.lockRef === null || this.lockRef <= ref }\n}\n", "import {\n  maybe\n} from \"./utils\"\n\nimport DOM from \"./dom\"\n\nexport default class DOMPostMorphRestorer {\n  constructor(containerBefore, containerAfter, updateType){\n    let idsBefore = new Set()\n    let idsAfter = new Set([...containerAfter.children].map(child => child.id))\n\n    let elementsToModify = []\n\n    Array.from(containerBefore.children).forEach(child => {\n      if(child.id){ // all of our children should be elements with ids\n        idsBefore.add(child.id)\n        if(idsAfter.has(child.id)){\n          let previousElementId = child.previousElementSibling && child.previousElementSibling.id\n          elementsToModify.push({elementId: child.id, previousElementId: previousElementId})\n        }\n      }\n    })\n\n    this.containerId = containerAfter.id\n    this.updateType = updateType\n    this.elementsToModify = elementsToModify\n    this.elementIdsToAdd = [...idsAfter].filter(id => !idsBefore.has(id))\n  }\n\n  // We do the following to optimize append/prepend operations:\n  //   1) Track ids of modified elements & of new elements\n  //   2) All the modified elements are put back in the correct position in the DOM tree\n  //      by storing the id of their previous sibling\n  //   3) New elements are going to be put in the right place by morphdom during append.\n  //      For prepend, we move them to the first position in the container\n  perform(){\n    let container = DOM.byId(this.containerId)\n    this.elementsToModify.forEach(elementToModify => {\n      if(elementToModify.previousElementId){\n        maybe(document.getElementById(elementToModify.previousElementId), previousElem => {\n          maybe(document.getElementById(elementToModify.elementId), elem => {\n            let isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id\n            if(!isInRightPlace){\n              previousElem.insertAdjacentElement(\"afterend\", elem)\n            }\n          })\n        })\n      } else {\n        // This is the first element in the container\n        maybe(document.getElementById(elementToModify.elementId), elem => {\n          let isInRightPlace = elem.previousElementSibling == null\n          if(!isInRightPlace){\n            container.insertAdjacentElement(\"afterbegin\", elem)\n          }\n        })\n      }\n    })\n\n    if(this.updateType == \"prepend\"){\n      this.elementIdsToAdd.reverse().forEach(elemId => {\n        maybe(document.getElementById(elemId), elem => container.insertAdjacentElement(\"afterbegin\", elem))\n      })\n    }\n  }\n}\n", "var DOCUMENT_FRAGMENT_NODE = 11;\n\nfunction morphAttrs(fromNode, toNode) {\n    var toNodeAttrs = toNode.attributes;\n    var attr;\n    var attrName;\n    var attrNamespaceURI;\n    var attrValue;\n    var fromValue;\n\n    // document-fragments dont have attributes so lets not do anything\n    if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n      return;\n    }\n\n    // update attributes on original DOM element\n    for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n        attr = toNodeAttrs[i];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n        attrValue = attr.value;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n            fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n\n            if (fromValue !== attrValue) {\n                if (attr.prefix === 'xmlns'){\n                    attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix\n                }\n                fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n            }\n        } else {\n            fromValue = fromNode.getAttribute(attrName);\n\n            if (fromValue !== attrValue) {\n                fromNode.setAttribute(attrName, attrValue);\n            }\n        }\n    }\n\n    // Remove any extra attributes found on the original DOM element that\n    // weren't found on the target element.\n    var fromNodeAttrs = fromNode.attributes;\n\n    for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n        attr = fromNodeAttrs[d];\n        attrName = attr.name;\n        attrNamespaceURI = attr.namespaceURI;\n\n        if (attrNamespaceURI) {\n            attrName = attr.localName || attrName;\n\n            if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n                fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n            }\n        } else {\n            if (!toNode.hasAttribute(attrName)) {\n                fromNode.removeAttribute(attrName);\n            }\n        }\n    }\n}\n\nvar range; // Create a range object for efficently rendering strings to elements.\nvar NS_XHTML = 'http://www.w3.org/1999/xhtml';\n\nvar doc = typeof document === 'undefined' ? undefined : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();\n\nfunction createFragmentFromTemplate(str) {\n    var template = doc.createElement('template');\n    template.innerHTML = str;\n    return template.content.childNodes[0];\n}\n\nfunction createFragmentFromRange(str) {\n    if (!range) {\n        range = doc.createRange();\n        range.selectNode(doc.body);\n    }\n\n    var fragment = range.createContextualFragment(str);\n    return fragment.childNodes[0];\n}\n\nfunction createFragmentFromWrap(str) {\n    var fragment = doc.createElement('body');\n    fragment.innerHTML = str;\n    return fragment.childNodes[0];\n}\n\n/**\n * This is about the same\n * var html = new DOMParser().parseFromString(str, 'text/html');\n * return html.body.firstChild;\n *\n * @method toElement\n * @param {String} str\n */\nfunction toElement(str) {\n    str = str.trim();\n    if (HAS_TEMPLATE_SUPPORT) {\n      // avoid restrictions on content for things like `<tr><th>Hi</th></tr>` which\n      // createContextualFragment doesn't support\n      // <template> support not available in IE\n      return createFragmentFromTemplate(str);\n    } else if (HAS_RANGE_SUPPORT) {\n      return createFragmentFromRange(str);\n    }\n\n    return createFragmentFromWrap(str);\n}\n\n/**\n * Returns true if two node's names are the same.\n *\n * NOTE: We don't bother checking `namespaceURI` because you will never find two HTML elements with the same\n *       nodeName and different namespace URIs.\n *\n * @param {Element} a\n * @param {Element} b The target element\n * @return {boolean}\n */\nfunction compareNodeNames(fromEl, toEl) {\n    var fromNodeName = fromEl.nodeName;\n    var toNodeName = toEl.nodeName;\n    var fromCodeStart, toCodeStart;\n\n    if (fromNodeName === toNodeName) {\n        return true;\n    }\n\n    fromCodeStart = fromNodeName.charCodeAt(0);\n    toCodeStart = toNodeName.charCodeAt(0);\n\n    // If the target element is a virtual DOM node or SVG node then we may\n    // need to normalize the tag name before comparing. Normal HTML elements that are\n    // in the \"http://www.w3.org/1999/xhtml\"\n    // are converted to upper case\n    if (fromCodeStart <= 90 && toCodeStart >= 97) { // from is upper and to is lower\n        return fromNodeName === toNodeName.toUpperCase();\n    } else if (toCodeStart <= 90 && fromCodeStart >= 97) { // to is upper and from is lower\n        return toNodeName === fromNodeName.toUpperCase();\n    } else {\n        return false;\n    }\n}\n\n/**\n * Create an element, optionally with a known namespace URI.\n *\n * @param {string} name the element name, e.g. 'div' or 'svg'\n * @param {string} [namespaceURI] the element's namespace URI, i.e. the value of\n * its `xmlns` attribute or its inferred namespace.\n *\n * @return {Element}\n */\nfunction createElementNS(name, namespaceURI) {\n    return !namespaceURI || namespaceURI === NS_XHTML ?\n        doc.createElement(name) :\n        doc.createElementNS(namespaceURI, name);\n}\n\n/**\n * Copies the children of one DOM element to another DOM element\n */\nfunction moveChildren(fromEl, toEl) {\n    var curChild = fromEl.firstChild;\n    while (curChild) {\n        var nextChild = curChild.nextSibling;\n        toEl.appendChild(curChild);\n        curChild = nextChild;\n    }\n    return toEl;\n}\n\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n    if (fromEl[name] !== toEl[name]) {\n        fromEl[name] = toEl[name];\n        if (fromEl[name]) {\n            fromEl.setAttribute(name, '');\n        } else {\n            fromEl.removeAttribute(name);\n        }\n    }\n}\n\nvar specialElHandlers = {\n    OPTION: function(fromEl, toEl) {\n        var parentNode = fromEl.parentNode;\n        if (parentNode) {\n            var parentName = parentNode.nodeName.toUpperCase();\n            if (parentName === 'OPTGROUP') {\n                parentNode = parentNode.parentNode;\n                parentName = parentNode && parentNode.nodeName.toUpperCase();\n            }\n            if (parentName === 'SELECT' && !parentNode.hasAttribute('multiple')) {\n                if (fromEl.hasAttribute('selected') && !toEl.selected) {\n                    // Workaround for MS Edge bug where the 'selected' attribute can only be\n                    // removed if set to a non-empty value:\n                    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12087679/\n                    fromEl.setAttribute('selected', 'selected');\n                    fromEl.removeAttribute('selected');\n                }\n                // We have to reset select element's selectedIndex to -1, otherwise setting\n                // fromEl.selected using the syncBooleanAttrProp below has no effect.\n                // The correct selectedIndex will be set in the SELECT special handler below.\n                parentNode.selectedIndex = -1;\n            }\n        }\n        syncBooleanAttrProp(fromEl, toEl, 'selected');\n    },\n    /**\n     * The \"value\" attribute is special for the <input> element since it sets\n     * the initial value. Changing the \"value\" attribute without changing the\n     * \"value\" property will have no effect since it is only used to the set the\n     * initial value.  Similar for the \"checked\" attribute, and \"disabled\".\n     */\n    INPUT: function(fromEl, toEl) {\n        syncBooleanAttrProp(fromEl, toEl, 'checked');\n        syncBooleanAttrProp(fromEl, toEl, 'disabled');\n\n        if (fromEl.value !== toEl.value) {\n            fromEl.value = toEl.value;\n        }\n\n        if (!toEl.hasAttribute('value')) {\n            fromEl.removeAttribute('value');\n        }\n    },\n\n    TEXTAREA: function(fromEl, toEl) {\n        var newValue = toEl.value;\n        if (fromEl.value !== newValue) {\n            fromEl.value = newValue;\n        }\n\n        var firstChild = fromEl.firstChild;\n        if (firstChild) {\n            // Needed for IE. Apparently IE sets the placeholder as the\n            // node value and vise versa. This ignores an empty update.\n            var oldValue = firstChild.nodeValue;\n\n            if (oldValue == newValue || (!newValue && oldValue == fromEl.placeholder)) {\n                return;\n            }\n\n            firstChild.nodeValue = newValue;\n        }\n    },\n    SELECT: function(fromEl, toEl) {\n        if (!toEl.hasAttribute('multiple')) {\n            var selectedIndex = -1;\n            var i = 0;\n            // We have to loop through children of fromEl, not toEl since nodes can be moved\n            // from toEl to fromEl directly when morphing.\n            // At the time this special handler is invoked, all children have already been morphed\n            // and appended to / removed from fromEl, so using fromEl here is safe and correct.\n            var curChild = fromEl.firstChild;\n            var optgroup;\n            var nodeName;\n            while(curChild) {\n                nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n                if (nodeName === 'OPTGROUP') {\n                    optgroup = curChild;\n                    curChild = optgroup.firstChild;\n                } else {\n                    if (nodeName === 'OPTION') {\n                        if (curChild.hasAttribute('selected')) {\n                            selectedIndex = i;\n                            break;\n                        }\n                        i++;\n                    }\n                    curChild = curChild.nextSibling;\n                    if (!curChild && optgroup) {\n                        curChild = optgroup.nextSibling;\n                        optgroup = null;\n                    }\n                }\n            }\n\n            fromEl.selectedIndex = selectedIndex;\n        }\n    }\n};\n\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\n\nfunction noop() {}\n\nfunction defaultGetNodeKey(node) {\n  if (node) {\n    return (node.getAttribute && node.getAttribute('id')) || node.id;\n  }\n}\n\nfunction morphdomFactory(morphAttrs) {\n\n  return function morphdom(fromNode, toNode, options) {\n    if (!options) {\n      options = {};\n    }\n\n    if (typeof toNode === 'string') {\n      if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML' || fromNode.nodeName === 'BODY') {\n        var toNodeHtml = toNode;\n        toNode = doc.createElement('html');\n        toNode.innerHTML = toNodeHtml;\n      } else {\n        toNode = toElement(toNode);\n      }\n    } else if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n      toNode = toNode.firstElementChild;\n    }\n\n    var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n    var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n    var onNodeAdded = options.onNodeAdded || noop;\n    var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n    var onElUpdated = options.onElUpdated || noop;\n    var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n    var onNodeDiscarded = options.onNodeDiscarded || noop;\n    var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n    var skipFromChildren = options.skipFromChildren || noop;\n    var addChild = options.addChild || function(parent, child){ return parent.appendChild(child); };\n    var childrenOnly = options.childrenOnly === true;\n\n    // This object is used as a lookup to quickly find all keyed elements in the original DOM tree.\n    var fromNodesLookup = Object.create(null);\n    var keyedRemovalList = [];\n\n    function addKeyedRemoval(key) {\n      keyedRemovalList.push(key);\n    }\n\n    function walkDiscardedChildNodes(node, skipKeyedNodes) {\n      if (node.nodeType === ELEMENT_NODE) {\n        var curChild = node.firstChild;\n        while (curChild) {\n\n          var key = undefined;\n\n          if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n            // If we are skipping keyed nodes then we add the key\n            // to a list so that it can be handled at the very end.\n            addKeyedRemoval(key);\n          } else {\n            // Only report the node as discarded if it is not keyed. We do this because\n            // at the end we loop through all keyed elements that were unmatched\n            // and then discard them in one final pass.\n            onNodeDiscarded(curChild);\n            if (curChild.firstChild) {\n              walkDiscardedChildNodes(curChild, skipKeyedNodes);\n            }\n          }\n\n          curChild = curChild.nextSibling;\n        }\n      }\n    }\n\n    /**\n    * Removes a DOM node out of the original DOM\n    *\n    * @param  {Node} node The node to remove\n    * @param  {Node} parentNode The nodes parent\n    * @param  {Boolean} skipKeyedNodes If true then elements with keys will be skipped and not discarded.\n    * @return {undefined}\n    */\n    function removeNode(node, parentNode, skipKeyedNodes) {\n      if (onBeforeNodeDiscarded(node) === false) {\n        return;\n      }\n\n      if (parentNode) {\n        parentNode.removeChild(node);\n      }\n\n      onNodeDiscarded(node);\n      walkDiscardedChildNodes(node, skipKeyedNodes);\n    }\n\n    // // TreeWalker implementation is no faster, but keeping this around in case this changes in the future\n    // function indexTree(root) {\n    //     var treeWalker = document.createTreeWalker(\n    //         root,\n    //         NodeFilter.SHOW_ELEMENT);\n    //\n    //     var el;\n    //     while((el = treeWalker.nextNode())) {\n    //         var key = getNodeKey(el);\n    //         if (key) {\n    //             fromNodesLookup[key] = el;\n    //         }\n    //     }\n    // }\n\n    // // NodeIterator implementation is no faster, but keeping this around in case this changes in the future\n    //\n    // function indexTree(node) {\n    //     var nodeIterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT);\n    //     var el;\n    //     while((el = nodeIterator.nextNode())) {\n    //         var key = getNodeKey(el);\n    //         if (key) {\n    //             fromNodesLookup[key] = el;\n    //         }\n    //     }\n    // }\n\n    function indexTree(node) {\n      if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n        var curChild = node.firstChild;\n        while (curChild) {\n          var key = getNodeKey(curChild);\n          if (key) {\n            fromNodesLookup[key] = curChild;\n          }\n\n          // Walk recursively\n          indexTree(curChild);\n\n          curChild = curChild.nextSibling;\n        }\n      }\n    }\n\n    indexTree(fromNode);\n\n    function handleNodeAdded(el) {\n      onNodeAdded(el);\n\n      var curChild = el.firstChild;\n      while (curChild) {\n        var nextSibling = curChild.nextSibling;\n\n        var key = getNodeKey(curChild);\n        if (key) {\n          var unmatchedFromEl = fromNodesLookup[key];\n          // if we find a duplicate #id node in cache, replace `el` with cache value\n          // and morph it to the child node.\n          if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n            curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n            morphEl(unmatchedFromEl, curChild);\n          } else {\n            handleNodeAdded(curChild);\n          }\n        } else {\n          // recursively call for curChild and it's children to see if we find something in\n          // fromNodesLookup\n          handleNodeAdded(curChild);\n        }\n\n        curChild = nextSibling;\n      }\n    }\n\n    function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n      // We have processed all of the \"to nodes\". If curFromNodeChild is\n      // non-null then we still have some from nodes left over that need\n      // to be removed\n      while (curFromNodeChild) {\n        var fromNextSibling = curFromNodeChild.nextSibling;\n        if ((curFromNodeKey = getNodeKey(curFromNodeChild))) {\n          // Since the node is keyed it might be matched up later so we defer\n          // the actual removal to later\n          addKeyedRemoval(curFromNodeKey);\n        } else {\n          // NOTE: we skip nested keyed nodes from being removed since there is\n          //       still a chance they will be matched up later\n          removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n        }\n        curFromNodeChild = fromNextSibling;\n      }\n    }\n\n    function morphEl(fromEl, toEl, childrenOnly) {\n      var toElKey = getNodeKey(toEl);\n\n      if (toElKey) {\n        // If an element with an ID is being morphed then it will be in the final\n        // DOM so clear it out of the saved elements collection\n        delete fromNodesLookup[toElKey];\n      }\n\n      if (!childrenOnly) {\n        // optional\n        var beforeUpdateResult = onBeforeElUpdated(fromEl, toEl);\n        if (beforeUpdateResult === false) {\n          return;\n        } else if (beforeUpdateResult instanceof HTMLElement) {\n          fromEl = beforeUpdateResult;\n          // reindex the new fromEl in case it's not in the same\n          // tree as the original fromEl\n          // (Phoenix LiveView sometimes returns a cloned tree,\n          //  but keyed lookups would still point to the original tree)\n          indexTree(fromEl);\n        }\n\n        // update attributes on original DOM element first\n        morphAttrs(fromEl, toEl);\n        // optional\n        onElUpdated(fromEl);\n\n        if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n          return;\n        }\n      }\n\n      if (fromEl.nodeName !== 'TEXTAREA') {\n        morphChildren(fromEl, toEl);\n      } else {\n        specialElHandlers.TEXTAREA(fromEl, toEl);\n      }\n    }\n\n    function morphChildren(fromEl, toEl) {\n      var skipFrom = skipFromChildren(fromEl, toEl);\n      var curToNodeChild = toEl.firstChild;\n      var curFromNodeChild = fromEl.firstChild;\n      var curToNodeKey;\n      var curFromNodeKey;\n\n      var fromNextSibling;\n      var toNextSibling;\n      var matchingFromEl;\n\n      // walk the children\n      outer: while (curToNodeChild) {\n        toNextSibling = curToNodeChild.nextSibling;\n        curToNodeKey = getNodeKey(curToNodeChild);\n\n        // walk the fromNode children all the way through\n        while (!skipFrom && curFromNodeChild) {\n          fromNextSibling = curFromNodeChild.nextSibling;\n\n          if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n            curToNodeChild = toNextSibling;\n            curFromNodeChild = fromNextSibling;\n            continue outer;\n          }\n\n          curFromNodeKey = getNodeKey(curFromNodeChild);\n\n          var curFromNodeType = curFromNodeChild.nodeType;\n\n          // this means if the curFromNodeChild doesnt have a match with the curToNodeChild\n          var isCompatible = undefined;\n\n          if (curFromNodeType === curToNodeChild.nodeType) {\n            if (curFromNodeType === ELEMENT_NODE) {\n              // Both nodes being compared are Element nodes\n\n              if (curToNodeKey) {\n                // The target node has a key so we want to match it up with the correct element\n                // in the original DOM tree\n                if (curToNodeKey !== curFromNodeKey) {\n                  // The current element in the original DOM tree does not have a matching key so\n                  // let's check our lookup to see if there is a matching element in the original\n                  // DOM tree\n                  if ((matchingFromEl = fromNodesLookup[curToNodeKey])) {\n                    if (fromNextSibling === matchingFromEl) {\n                      // Special case for single element removals. To avoid removing the original\n                      // DOM node out of the tree (since that can break CSS transitions, etc.),\n                      // we will instead discard the current node and wait until the next\n                      // iteration to properly match up the keyed target element with its matching\n                      // element in the original tree\n                      isCompatible = false;\n                    } else {\n                      // We found a matching keyed element somewhere in the original DOM tree.\n                      // Let's move the original DOM node into the current position and morph\n                      // it.\n\n                      // NOTE: We use insertBefore instead of replaceChild because we want to go through\n                      // the `removeNode()` function for the node that is being discarded so that\n                      // all lifecycle hooks are correctly invoked\n                      fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n\n                      // fromNextSibling = curFromNodeChild.nextSibling;\n\n                      if (curFromNodeKey) {\n                        // Since the node is keyed it might be matched up later so we defer\n                        // the actual removal to later\n                        addKeyedRemoval(curFromNodeKey);\n                      } else {\n                        // NOTE: we skip nested keyed nodes from being removed since there is\n                        //       still a chance they will be matched up later\n                        removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n                      }\n\n                      curFromNodeChild = matchingFromEl;\n                      curFromNodeKey = getNodeKey(curFromNodeChild);\n                    }\n                  } else {\n                    // The nodes are not compatible since the \"to\" node has a key and there\n                    // is no matching keyed node in the source tree\n                    isCompatible = false;\n                  }\n                }\n              } else if (curFromNodeKey) {\n                // The original has a key\n                isCompatible = false;\n              }\n\n              isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n              if (isCompatible) {\n                // We found compatible DOM elements so transform\n                // the current \"from\" node to match the current\n                // target DOM node.\n                // MORPH\n                morphEl(curFromNodeChild, curToNodeChild);\n              }\n\n            } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n              // Both nodes being compared are Text or Comment nodes\n              isCompatible = true;\n              // Simply update nodeValue on the original node to\n              // change the text value\n              if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n                curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n              }\n\n            }\n          }\n\n          if (isCompatible) {\n            // Advance both the \"to\" child and the \"from\" child since we found a match\n            // Nothing else to do as we already recursively called morphChildren above\n            curToNodeChild = toNextSibling;\n            curFromNodeChild = fromNextSibling;\n            continue outer;\n          }\n\n          // No compatible match so remove the old node from the DOM and continue trying to find a\n          // match in the original DOM. However, we only do this if the from node is not keyed\n          // since it is possible that a keyed node might match up with a node somewhere else in the\n          // target tree and we don't want to discard it just yet since it still might find a\n          // home in the final DOM tree. After everything is done we will remove any keyed nodes\n          // that didn't find a home\n          if (curFromNodeKey) {\n            // Since the node is keyed it might be matched up later so we defer\n            // the actual removal to later\n            addKeyedRemoval(curFromNodeKey);\n          } else {\n            // NOTE: we skip nested keyed nodes from being removed since there is\n            //       still a chance they will be matched up later\n            removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n          }\n\n          curFromNodeChild = fromNextSibling;\n        } // END: while(curFromNodeChild) {}\n\n        // If we got this far then we did not find a candidate match for\n        // our \"to node\" and we exhausted all of the children \"from\"\n        // nodes. Therefore, we will just append the current \"to\" node\n        // to the end\n        if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n          // MORPH\n          if(!skipFrom){ addChild(fromEl, matchingFromEl); }\n          morphEl(matchingFromEl, curToNodeChild);\n        } else {\n          var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n          if (onBeforeNodeAddedResult !== false) {\n            if (onBeforeNodeAddedResult) {\n              curToNodeChild = onBeforeNodeAddedResult;\n            }\n\n            if (curToNodeChild.actualize) {\n              curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n            }\n            addChild(fromEl, curToNodeChild);\n            handleNodeAdded(curToNodeChild);\n          }\n        }\n\n        curToNodeChild = toNextSibling;\n        curFromNodeChild = fromNextSibling;\n      }\n\n      cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n\n      var specialElHandler = specialElHandlers[fromEl.nodeName];\n      if (specialElHandler) {\n        specialElHandler(fromEl, toEl);\n      }\n    } // END: morphChildren(...)\n\n    var morphedNode = fromNode;\n    var morphedNodeType = morphedNode.nodeType;\n    var toNodeType = toNode.nodeType;\n\n    if (!childrenOnly) {\n      // Handle the case where we are given two DOM nodes that are not\n      // compatible (e.g. <div> --> <span> or <div> --> TEXT)\n      if (morphedNodeType === ELEMENT_NODE) {\n        if (toNodeType === ELEMENT_NODE) {\n          if (!compareNodeNames(fromNode, toNode)) {\n            onNodeDiscarded(fromNode);\n            morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n          }\n        } else {\n          // Going from an element node to a text node\n          morphedNode = toNode;\n        }\n      } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node\n        if (toNodeType === morphedNodeType) {\n          if (morphedNode.nodeValue !== toNode.nodeValue) {\n            morphedNode.nodeValue = toNode.nodeValue;\n          }\n\n          return morphedNode;\n        } else {\n          // Text node to something else\n          morphedNode = toNode;\n        }\n      }\n    }\n\n    if (morphedNode === toNode) {\n      // The \"to node\" was not compatible with the \"from node\" so we had to\n      // toss out the \"from node\" and use the \"to node\"\n      onNodeDiscarded(fromNode);\n    } else {\n      if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n        return;\n      }\n\n      morphEl(morphedNode, toNode, childrenOnly);\n\n      // We now need to loop over any keyed nodes that might need to be\n      // removed. We only do the removal if we know that the keyed node\n      // never found a match. When a keyed node is matched up we remove\n      // it out of fromNodesLookup and we use fromNodesLookup to determine\n      // if a keyed node has been matched up or not\n      if (keyedRemovalList) {\n        for (var i=0, len=keyedRemovalList.length; i<len; i++) {\n          var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n          if (elToRemove) {\n            removeNode(elToRemove, elToRemove.parentNode, false);\n          }\n        }\n      }\n    }\n\n    if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n      if (morphedNode.actualize) {\n        morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n      }\n      // If we had to swap out the from node with a new node because the old\n      // node was not compatible with the target node then we need to\n      // replace the old DOM node in the original DOM tree. This is only\n      // possible if the original DOM node was part of a DOM tree which\n      // we know is the case if it has a parent node.\n      fromNode.parentNode.replaceChild(morphedNode, fromNode);\n    }\n\n    return morphedNode;\n  };\n}\n\nvar morphdom = morphdomFactory(morphAttrs);\n\nexport default morphdom;\n", "import {\n  PHX_COMPONENT,\n  PHX_PRUNE,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_SKIP,\n  PHX_MAGIC_ID,\n  PHX_STATIC,\n  PHX_TRIGGER_ACTION,\n  PHX_UPDATE,\n  PHX_REF_SRC,\n  PHX_REF_LOCK,\n  PHX_STREAM,\n  PHX_STREAM_REF,\n  PHX_VIEWPORT_TOP,\n  PHX_VIEWPORT_BOTTOM,\n} from \"./constants\"\n\nimport {\n  detectDuplicateIds,\n  isCid\n} from \"./utils\"\n\nimport DOM from \"./dom\"\nimport DOMPostMorphRestorer from \"./dom_post_morph_restorer\"\nimport morphdom from \"morphdom\"\n\nexport default class DOMPatch {\n  static patchWithClonedTree(container, clonedTree, liveSocket){\n    let focused = liveSocket.getActiveElement()\n    let {selectionStart, selectionEnd} = focused && DOM.hasSelectionRange(focused) ? focused : {}\n    let phxUpdate = liveSocket.binding(PHX_UPDATE)\n    let externalFormTriggered = null\n\n    morphdom(container, clonedTree, {\n      childrenOnly: false,\n      onBeforeElUpdated: (fromEl, toEl) => {\n        DOM.syncPendingAttrs(fromEl, toEl)\n        // we cannot morph locked children\n        if(!container.isSameNode(fromEl) && fromEl.hasAttribute(PHX_REF_LOCK)){ return false }\n        if(DOM.isIgnored(fromEl, phxUpdate)){ return false }\n        if(focused && focused.isSameNode(fromEl) && DOM.isFormInput(fromEl)){\n          DOM.mergeFocusedInput(fromEl, toEl)\n          return false\n        }\n        if(DOM.isNowTriggerFormExternal(toEl, liveSocket.binding(PHX_TRIGGER_ACTION))){\n          externalFormTriggered = toEl\n        }\n      }\n    })\n\n    if(externalFormTriggered){\n      liveSocket.unload()\n      // use prototype's submit in case there's a form control with name or id of \"submit\"\n      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n      Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered)\n    }\n\n    liveSocket.silenceEvents(() => DOM.restoreFocus(focused, selectionStart, selectionEnd))\n  }\n\n  constructor(view, container, id, html, streams, targetCID){\n    this.view = view\n    this.liveSocket = view.liveSocket\n    this.container = container\n    this.id = id\n    this.rootID = view.root.id\n    this.html = html\n    this.streams = streams\n    this.streamInserts = {}\n    this.streamComponentRestore = {}\n    this.targetCID = targetCID\n    this.cidPatch = isCid(this.targetCID)\n    this.pendingRemoves = []\n    this.phxRemove = this.liveSocket.binding(\"remove\")\n    this.targetContainer = this.isCIDPatch() ? this.targetCIDContainer(html) : container\n    this.callbacks = {\n      beforeadded: [], beforeupdated: [], beforephxChildAdded: [],\n      afteradded: [], afterupdated: [], afterdiscarded: [], afterphxChildAdded: [],\n      aftertransitionsDiscarded: []\n    }\n  }\n\n  before(kind, callback){ this.callbacks[`before${kind}`].push(callback) }\n  after(kind, callback){ this.callbacks[`after${kind}`].push(callback) }\n\n  trackBefore(kind, ...args){\n    this.callbacks[`before${kind}`].forEach(callback => callback(...args))\n  }\n\n  trackAfter(kind, ...args){\n    this.callbacks[`after${kind}`].forEach(callback => callback(...args))\n  }\n\n  markPrunableContentForRemoval(){\n    let phxUpdate = this.liveSocket.binding(PHX_UPDATE)\n    DOM.all(this.container, `[${phxUpdate}=append] > *, [${phxUpdate}=prepend] > *`, el => {\n      el.setAttribute(PHX_PRUNE, \"\")\n    })\n  }\n\n  perform(isJoinPatch){\n    let {view, liveSocket, html, container, targetContainer} = this\n    if(this.isCIDPatch() && !targetContainer){ return }\n\n    let focused = liveSocket.getActiveElement()\n    let {selectionStart, selectionEnd} = focused && DOM.hasSelectionRange(focused) ? focused : {}\n    let phxUpdate = liveSocket.binding(PHX_UPDATE)\n    let phxViewportTop = liveSocket.binding(PHX_VIEWPORT_TOP)\n    let phxViewportBottom = liveSocket.binding(PHX_VIEWPORT_BOTTOM)\n    let phxTriggerExternal = liveSocket.binding(PHX_TRIGGER_ACTION)\n    let added = []\n    let updates = []\n    let appendPrependUpdates = []\n\n    let externalFormTriggered = null\n\n    function morph(targetContainer, source, withChildren=false){\n      let morphCallbacks = {\n        // normally, we are running with childrenOnly, as the patch HTML for a LV\n        // does not include the LV attrs (data-phx-session, etc.)\n        // when we are patching a live component, we do want to patch the root element as well;\n        // another case is the recursive patch of a stream item that was kept on reset (-> onBeforeNodeAdded)\n        childrenOnly: targetContainer.getAttribute(PHX_COMPONENT) === null && !withChildren,\n        getNodeKey: (node) => {\n          if(DOM.isPhxDestroyed(node)){ return null }\n          // If we have a join patch, then by definition there was no PHX_MAGIC_ID.\n          // This is important to reduce the amount of elements morphdom discards.\n          if(isJoinPatch){ return node.id }\n          return node.id || (node.getAttribute && node.getAttribute(PHX_MAGIC_ID))\n        },\n        // skip indexing from children when container is stream\n        skipFromChildren: (from) => { return from.getAttribute(phxUpdate) === PHX_STREAM },\n        // tell morphdom how to add a child\n        addChild: (parent, child) => {\n          let {ref, streamAt} = this.getStreamInsert(child)\n          if(ref === undefined){ return parent.appendChild(child) }\n\n          this.setStreamRef(child, ref)\n\n          // streaming\n          if(streamAt === 0){\n            parent.insertAdjacentElement(\"afterbegin\", child)\n          } else if(streamAt === -1){\n            let lastChild = parent.lastElementChild\n            if(lastChild && !lastChild.hasAttribute(PHX_STREAM_REF)){\n              let nonStreamChild = Array.from(parent.children).find(c => !c.hasAttribute(PHX_STREAM_REF))\n              parent.insertBefore(child, nonStreamChild)\n            } else {\n              parent.appendChild(child)\n            }\n          } else if(streamAt > 0){\n            let sibling = Array.from(parent.children)[streamAt]\n            parent.insertBefore(child, sibling)\n          }\n        },\n        onBeforeNodeAdded: (el) => {\n          DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom)\n          this.trackBefore(\"added\", el)\n\n          let morphedEl = el\n          // this is a stream item that was kept on reset, recursively morph it\n          if(this.streamComponentRestore[el.id]){\n            morphedEl = this.streamComponentRestore[el.id]\n            delete this.streamComponentRestore[el.id]\n            morph.call(this, morphedEl, el, true)\n          }\n\n          return morphedEl\n        },\n        onNodeAdded: (el) => {\n          if(el.getAttribute){ this.maybeReOrderStream(el, true) }\n\n          // hack to fix Safari handling of img srcset and video tags\n          if(el instanceof HTMLImageElement && el.srcset){\n            el.srcset = el.srcset\n          } else if(el instanceof HTMLVideoElement && el.autoplay){\n            el.play()\n          }\n          if(DOM.isNowTriggerFormExternal(el, phxTriggerExternal)){\n            externalFormTriggered = el\n          }\n\n          // nested view handling\n          if((DOM.isPhxChild(el) && view.ownsElement(el)) || DOM.isPhxSticky(el) && view.ownsElement(el.parentNode)){\n            this.trackAfter(\"phxChildAdded\", el)\n          }\n          added.push(el)\n        },\n        onNodeDiscarded: (el) => this.onNodeDiscarded(el),\n        onBeforeNodeDiscarded: (el) => {\n          if(el.getAttribute && el.getAttribute(PHX_PRUNE) !== null){ return true }\n          if(el.parentElement !== null && el.id &&\n            DOM.isPhxUpdate(el.parentElement, phxUpdate, [PHX_STREAM, \"append\", \"prepend\"])){\n            return false\n          }\n          if(this.maybePendingRemove(el)){ return false }\n          if(this.skipCIDSibling(el)){ return false }\n\n          return true\n        },\n        onElUpdated: (el) => {\n          if(DOM.isNowTriggerFormExternal(el, phxTriggerExternal)){\n            externalFormTriggered = el\n          }\n          updates.push(el)\n          this.maybeReOrderStream(el, false)\n        },\n        onBeforeElUpdated: (fromEl, toEl) => {\n          // if we are patching the root target container and the id has changed, treat it as a new node\n          // by replacing the fromEl with the toEl, which ensures hooks are torn down and re-created\n          if(fromEl.id && fromEl.isSameNode(targetContainer) && fromEl.id !== toEl.id){\n            morphCallbacks.onNodeDiscarded(fromEl)\n            fromEl.replaceWith(toEl)\n            return morphCallbacks.onNodeAdded(toEl)\n          }\n          DOM.syncPendingAttrs(fromEl, toEl)\n          DOM.maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom)\n          DOM.cleanChildNodes(toEl, phxUpdate)\n          if(this.skipCIDSibling(toEl)){\n            // if this is a live component used in a stream, we may need to reorder it\n            this.maybeReOrderStream(fromEl)\n            return false\n          }\n          if(DOM.isPhxSticky(fromEl)){\n            [PHX_SESSION, PHX_STATIC, PHX_ROOT_ID]\n              .map(attr => [attr, fromEl.getAttribute(attr), toEl.getAttribute(attr)])\n              .forEach(([attr, fromVal, toVal]) => {\n                if(toVal && fromVal !== toVal){ fromEl.setAttribute(attr, toVal) }\n              })\n\n            return false\n          }\n          if(DOM.isIgnored(fromEl, phxUpdate) || (fromEl.form && fromEl.form.isSameNode(externalFormTriggered))){\n            this.trackBefore(\"updated\", fromEl, toEl)\n            DOM.mergeAttrs(fromEl, toEl, {isIgnored: DOM.isIgnored(fromEl, phxUpdate)})\n            updates.push(fromEl)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          }\n          if(fromEl.type === \"number\" && (fromEl.validity && fromEl.validity.badInput)){ return false }\n          // If the element has PHX_REF_SRC, it is loading or locked and awaiting an ack.\n          // If it's locked, we clone the fromEl tree and instruct morphdom to use\n          // the cloned tree as the source of the morph for this branch from here on out.\n          // We keep a reference to the cloned tree in the element's private data, and\n          // on ack (view.undoRefs), we morph the cloned tree with the true fromEl in the DOM to\n          // apply any changes that happened while the element was locked.\n          let isFocusedFormEl = focused && fromEl.isSameNode(focused) && DOM.isFormInput(fromEl)\n          let focusedSelectChanged = isFocusedFormEl && this.isChangedSelect(fromEl, toEl)\n          if(fromEl.hasAttribute(PHX_REF_SRC)){\n            if(DOM.isUploadInput(fromEl)){\n              DOM.mergeAttrs(fromEl, toEl, {isIgnored: true})\n              this.trackBefore(\"updated\", fromEl, toEl)\n              updates.push(fromEl)\n            }\n            DOM.applyStickyOperations(fromEl)\n            let isLocked = fromEl.hasAttribute(PHX_REF_LOCK)\n            let clone = isLocked ? DOM.private(fromEl, PHX_REF_LOCK) || fromEl.cloneNode(true) : null\n            if(clone){\n              DOM.putPrivate(fromEl, PHX_REF_LOCK, clone)\n              if(!isFocusedFormEl){\n                fromEl = clone\n              }\n            }\n          }\n\n          // nested view handling\n          if(DOM.isPhxChild(toEl)){\n            let prevSession = fromEl.getAttribute(PHX_SESSION)\n            DOM.mergeAttrs(fromEl, toEl, {exclude: [PHX_STATIC]})\n            if(prevSession !== \"\"){ fromEl.setAttribute(PHX_SESSION, prevSession) }\n            fromEl.setAttribute(PHX_ROOT_ID, this.rootID)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          }\n\n          // input handling\n          DOM.copyPrivates(toEl, fromEl)\n\n          // skip patching focused inputs unless focus is a select that has changed options\n          if(isFocusedFormEl && fromEl.type !== \"hidden\" && !focusedSelectChanged){\n            this.trackBefore(\"updated\", fromEl, toEl)\n            DOM.mergeFocusedInput(fromEl, toEl)\n            DOM.syncAttrsToProps(fromEl)\n            updates.push(fromEl)\n            DOM.applyStickyOperations(fromEl)\n            return false\n          } else {\n            // blur focused select if it changed so native UI is updated (ie safari won't update visible options)\n            if(focusedSelectChanged){ fromEl.blur() }\n            if(DOM.isPhxUpdate(toEl, phxUpdate, [\"append\", \"prepend\"])){\n              appendPrependUpdates.push(new DOMPostMorphRestorer(fromEl, toEl, toEl.getAttribute(phxUpdate)))\n            }\n\n            DOM.syncAttrsToProps(toEl)\n            DOM.applyStickyOperations(toEl)\n            this.trackBefore(\"updated\", fromEl, toEl)\n            return fromEl\n          }\n        }\n      }\n      morphdom(targetContainer, source, morphCallbacks)\n    }\n\n    this.trackBefore(\"added\", container)\n    this.trackBefore(\"updated\", container, container)\n\n    liveSocket.time(\"morphdom\", () => {\n      this.streams.forEach(([ref, inserts, deleteIds, reset]) => {\n        inserts.forEach(([key, streamAt, limit]) => {\n          this.streamInserts[key] = {ref, streamAt, limit, reset}\n        })\n        if(reset !== undefined){\n          DOM.all(container, `[${PHX_STREAM_REF}=\"${ref}\"]`, child => {\n            this.removeStreamChildElement(child)\n          })\n        }\n        deleteIds.forEach(id => {\n          let child = container.querySelector(`[id=\"${id}\"]`)\n          if(child){ this.removeStreamChildElement(child) }\n        })\n      })\n\n      // clear stream items from the dead render if they are not inserted again\n      if(isJoinPatch){\n        DOM.all(this.container, `[${phxUpdate}=${PHX_STREAM}]`, el => {\n          // make sure to only remove elements owned by the current view\n          // see https://github.com/phoenixframework/phoenix_live_view/issues/3047\n          this.liveSocket.owner(el, (view) => {\n            if(view === this.view){\n              Array.from(el.children).forEach(child => {\n                this.removeStreamChildElement(child)\n              })\n            }\n          })\n        })\n      }\n\n      morph.call(this, targetContainer, html)\n    })\n\n    if(liveSocket.isDebugEnabled()){\n      detectDuplicateIds()\n      // warn if there are any inputs named \"id\"\n      Array.from(document.querySelectorAll(\"input[name=id]\")).forEach(node => {\n        if(node.form){\n          console.error(\"Detected an input with name=\\\"id\\\" inside a form! This will cause problems when patching the DOM.\\n\", node)\n        }\n      })\n    }\n\n    if(appendPrependUpdates.length > 0){\n      liveSocket.time(\"post-morph append/prepend restoration\", () => {\n        appendPrependUpdates.forEach(update => update.perform())\n      })\n    }\n\n    liveSocket.silenceEvents(() => DOM.restoreFocus(focused, selectionStart, selectionEnd))\n    DOM.dispatchEvent(document, \"phx:update\")\n    added.forEach(el => this.trackAfter(\"added\", el))\n    updates.forEach(el => this.trackAfter(\"updated\", el))\n\n    this.transitionPendingRemoves()\n\n    if(externalFormTriggered){\n      liveSocket.unload()\n      // use prototype's submit in case there's a form control with name or id of \"submit\"\n      // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n      Object.getPrototypeOf(externalFormTriggered).submit.call(externalFormTriggered)\n    }\n    return true\n  }\n\n  onNodeDiscarded(el){\n    // nested view handling\n    if(DOM.isPhxChild(el) || DOM.isPhxSticky(el)){ this.liveSocket.destroyViewByEl(el) }\n    this.trackAfter(\"discarded\", el)\n  }\n\n  maybePendingRemove(node){\n    if(node.getAttribute && node.getAttribute(this.phxRemove) !== null){\n      this.pendingRemoves.push(node)\n      return true\n    } else {\n      return false\n    }\n  }\n\n  removeStreamChildElement(child){\n    // we need to store the node if it is actually re-added in the same patch\n    // we do NOT want to execute phx-remove, we do NOT want to call onNodeDiscarded\n    if(this.streamInserts[child.id]){\n      this.streamComponentRestore[child.id] = child\n      child.remove()\n    } else {\n      // only remove the element now if it has no phx-remove binding\n      if(!this.maybePendingRemove(child)){\n        child.remove()\n        this.onNodeDiscarded(child)\n      }\n    }\n  }\n\n  getStreamInsert(el){\n    let insert = el.id ? this.streamInserts[el.id] : {}\n    return insert || {}\n  }\n\n  setStreamRef(el, ref){\n    DOM.putSticky(el, PHX_STREAM_REF, el => el.setAttribute(PHX_STREAM_REF, ref))\n  }\n\n  maybeReOrderStream(el, isNew){\n    let {ref, streamAt, reset} = this.getStreamInsert(el)\n    if(streamAt === undefined){ return }\n\n    // we need to set the PHX_STREAM_REF here as well as addChild is invoked only for parents\n    this.setStreamRef(el, ref)\n\n    if(!reset && !isNew){\n      // we only reorder if the element is new or it's a stream reset\n      return\n    }\n\n    // check if the element has a parent element;\n    // it doesn't if we are currently recursively morphing (restoring a saved stream child)\n    // because the element is not yet added to the real dom;\n    // reordering does not make sense in that case anyway\n    if(!el.parentElement){ return }\n\n    if(streamAt === 0){\n      el.parentElement.insertBefore(el, el.parentElement.firstElementChild)\n    } else if(streamAt > 0){\n      let children = Array.from(el.parentElement.children)\n      let oldIndex = children.indexOf(el)\n      if(streamAt >= children.length - 1){\n        el.parentElement.appendChild(el)\n      } else {\n        let sibling = children[streamAt]\n        if(oldIndex > streamAt){\n          el.parentElement.insertBefore(el, sibling)\n        } else {\n          el.parentElement.insertBefore(el, sibling.nextElementSibling)\n        }\n      }\n    }\n\n    this.maybeLimitStream(el)\n  }\n\n  maybeLimitStream(el){\n    let {limit} = this.getStreamInsert(el)\n    let children = limit !== null && Array.from(el.parentElement.children)\n    if(limit && limit < 0 && children.length > limit * -1){\n      children.slice(0, children.length + limit).forEach(child => this.removeStreamChildElement(child))\n    } else if(limit && limit >= 0 && children.length > limit){\n      children.slice(limit).forEach(child => this.removeStreamChildElement(child))\n    }\n  }\n\n  transitionPendingRemoves(){\n    let {pendingRemoves, liveSocket} = this\n    if(pendingRemoves.length > 0){\n      liveSocket.transitionRemoves(pendingRemoves, false, () => {\n        pendingRemoves.forEach(el => {\n          let child = DOM.firstPhxChild(el)\n          if(child){ liveSocket.destroyViewByEl(child) }\n          el.remove()\n        })\n        this.trackAfter(\"transitionsDiscarded\", pendingRemoves)\n      })\n    }\n  }\n\n  isChangedSelect(fromEl, toEl){\n    if(!(fromEl instanceof HTMLSelectElement) || fromEl.multiple){ return false }\n    if(fromEl.options.length !== toEl.options.length){ return true }\n\n    // keep the current value\n    toEl.value = fromEl.value\n\n    // in general we have to be very careful with using isEqualNode as it does not a reliable\n    // DOM tree equality check, but for selection attributes and options it works fine\n    return !fromEl.isEqualNode(toEl)\n  }\n\n  isCIDPatch(){ return this.cidPatch }\n\n  skipCIDSibling(el){\n    return el.nodeType === Node.ELEMENT_NODE && el.hasAttribute(PHX_SKIP)\n  }\n\n  targetCIDContainer(html){\n    if(!this.isCIDPatch()){ return }\n    let [first, ...rest] = DOM.findComponentNodeList(this.container, this.targetCID)\n    if(rest.length === 0 && DOM.childNodeLength(html) === 1){\n      return first\n    } else {\n      return first && first.parentNode\n    }\n  }\n\n  indexOf(parent, child){ return Array.from(parent.children).indexOf(child) }\n}\n", "import {\n  COMPONENTS,\n  DYNAMICS,\n  TEMPLATES,\n  EVENTS,\n  PHX_COMPONENT,\n  PHX_SKIP,\n  PHX_MAGIC_ID,\n  REPLY,\n  STATIC,\n  TITLE,\n  STREAM,\n  ROOT,\n} from \"./constants\"\n\nimport {\n  isObject,\n  logError,\n  isCid,\n} from \"./utils\"\n\nconst VOID_TAGS = new Set([\n  \"area\",\n  \"base\",\n  \"br\",\n  \"col\",\n  \"command\",\n  \"embed\",\n  \"hr\",\n  \"img\",\n  \"input\",\n  \"keygen\",\n  \"link\",\n  \"meta\",\n  \"param\",\n  \"source\",\n  \"track\",\n  \"wbr\"\n])\nconst quoteChars = new Set([\"'\", \"\\\"\"])\n\nexport let modifyRoot = (html, attrs, clearInnerHTML) => {\n  let i = 0\n  let insideComment = false\n  let beforeTag, afterTag, tag, tagNameEndsAt, id, newHTML\n\n  let lookahead = html.match(/^(\\s*(?:<!--.*?-->\\s*)*)<([^\\s\\/>]+)/)\n  if(lookahead === null){ throw new Error(`malformed html ${html}`) }\n\n  i = lookahead[0].length\n  beforeTag = lookahead[1]\n  tag = lookahead[2]\n  tagNameEndsAt = i\n\n  // Scan the opening tag for id, if there is any\n  for(i; i < html.length; i++){\n    if(html.charAt(i) === \">\" ){ break }\n    if(html.charAt(i) === \"=\"){\n      let isId = html.slice(i - 3, i) === \" id\"\n      i++\n      let char = html.charAt(i)\n      if(quoteChars.has(char)){\n        let attrStartsAt = i\n        i++\n        for(i; i < html.length; i++){\n          if(html.charAt(i) === char){ break }\n        }\n        if(isId){\n          id = html.slice(attrStartsAt + 1, i)\n          break\n        }\n      }\n    }\n  }\n\n  let closeAt = html.length - 1\n  insideComment = false\n  while(closeAt >= beforeTag.length + tag.length){\n    let char = html.charAt(closeAt)\n    if(insideComment){\n      if(char === \"-\" && html.slice(closeAt - 3, closeAt) === \"<!-\"){\n        insideComment = false\n        closeAt -= 4\n      } else {\n        closeAt -= 1\n      }\n    } else if(char === \">\" && html.slice(closeAt - 2, closeAt) === \"--\"){\n      insideComment = true\n      closeAt -= 3\n    } else if(char === \">\"){\n      break\n    } else {\n      closeAt -= 1\n    }\n  }\n  afterTag = html.slice(closeAt + 1, html.length)\n\n  let attrsStr =\n    Object.keys(attrs)\n      .map(attr => attrs[attr] === true ? attr : `${attr}=\"${attrs[attr]}\"`)\n      .join(\" \")\n\n  if(clearInnerHTML){\n    // Keep the id if any\n    let idAttrStr = id ? ` id=\"${id}\"` : \"\"\n    if(VOID_TAGS.has(tag)){\n      newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}/>`\n    } else {\n      newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}></${tag}>`\n    }\n  } else {\n    let rest = html.slice(tagNameEndsAt, closeAt + 1)\n    newHTML = `<${tag}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}${rest}`\n  }\n\n  return [newHTML, beforeTag, afterTag]\n}\n\nexport default class Rendered {\n  static extract(diff){\n    let {[REPLY]: reply, [EVENTS]: events, [TITLE]: title} = diff\n    delete diff[REPLY]\n    delete diff[EVENTS]\n    delete diff[TITLE]\n    return {diff, title, reply: reply || null, events: events || []}\n  }\n\n  constructor(viewId, rendered){\n    this.viewId = viewId\n    this.rendered = {}\n    this.magicId = 0\n    this.mergeDiff(rendered)\n  }\n\n  parentViewId(){ return this.viewId }\n\n  toString(onlyCids){\n    let [str, streams] = this.recursiveToString(this.rendered, this.rendered[COMPONENTS], onlyCids, true, {})\n    return [str, streams]\n  }\n\n  recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids, changeTracking, rootAttrs){\n    onlyCids = onlyCids ? new Set(onlyCids) : null\n    let output = {buffer: \"\", components: components, onlyCids: onlyCids, streams: new Set()}\n    this.toOutputBuffer(rendered, null, output, changeTracking, rootAttrs)\n    return [output.buffer, output.streams]\n  }\n\n  componentCIDs(diff){ return Object.keys(diff[COMPONENTS] || {}).map(i => parseInt(i)) }\n\n  isComponentOnlyDiff(diff){\n    if(!diff[COMPONENTS]){ return false }\n    return Object.keys(diff).length === 1\n  }\n\n  getComponent(diff, cid){ return diff[COMPONENTS][cid] }\n\n  resetRender(cid){\n    // we are racing a component destroy, it could not exist, so\n    // make sure that we don't try to set reset on undefined\n    if(this.rendered[COMPONENTS][cid]){\n      this.rendered[COMPONENTS][cid].reset = true\n    }\n  }\n\n  mergeDiff(diff){\n    let newc = diff[COMPONENTS]\n    let cache = {}\n    delete diff[COMPONENTS]\n    this.rendered = this.mutableMerge(this.rendered, diff)\n    this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {}\n\n    if(newc){\n      let oldc = this.rendered[COMPONENTS]\n\n      for(let cid in newc){\n        newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache)\n      }\n\n      for(let cid in newc){ oldc[cid] = newc[cid] }\n      diff[COMPONENTS] = newc\n    }\n  }\n\n  cachedFindComponent(cid, cdiff, oldc, newc, cache){\n    if(cache[cid]){\n      return cache[cid]\n    } else {\n      let ndiff, stat, scid = cdiff[STATIC]\n\n      if(isCid(scid)){\n        let tdiff\n\n        if(scid > 0){\n          tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache)\n        } else {\n          tdiff = oldc[-scid]\n        }\n\n        stat = tdiff[STATIC]\n        ndiff = this.cloneMerge(tdiff, cdiff, true)\n        ndiff[STATIC] = stat\n      } else {\n        ndiff = cdiff[STATIC] !== undefined || oldc[cid] === undefined ?\n          cdiff : this.cloneMerge(oldc[cid], cdiff, false)\n      }\n\n      cache[cid] = ndiff\n      return ndiff\n    }\n  }\n\n  mutableMerge(target, source){\n    if(source[STATIC] !== undefined){\n      return source\n    } else {\n      this.doMutableMerge(target, source)\n      return target\n    }\n  }\n\n  doMutableMerge(target, source){\n    for(let key in source){\n      let val = source[key]\n      let targetVal = target[key]\n      let isObjVal = isObject(val)\n      if(isObjVal && val[STATIC] === undefined && isObject(targetVal)){\n        this.doMutableMerge(targetVal, val)\n      } else {\n        target[key] = val\n      }\n    }\n    if(target[ROOT]){\n      target.newRender = true\n    }\n  }\n\n  // Merges cid trees together, copying statics from source tree.\n  //\n  // The `pruneMagicId` is passed to control pruning the magicId of the\n  // target. We must always prune the magicId when we are sharing statics\n  // from another component. If not pruning, we replicate the logic from\n  // mutableMerge, where we set newRender to true if there is a root\n  // (effectively forcing the new version to be rendered instead of skipped)\n  //\n  cloneMerge(target, source, pruneMagicId){\n    let merged = {...target, ...source}\n    for(let key in merged){\n      let val = source[key]\n      let targetVal = target[key]\n      if(isObject(val) && val[STATIC] === undefined && isObject(targetVal)){\n        merged[key] = this.cloneMerge(targetVal, val, pruneMagicId)\n      } else if(val === undefined && isObject(targetVal)){\n        merged[key] = this.cloneMerge(targetVal, {}, pruneMagicId)\n      }\n    }\n    if(pruneMagicId){\n      delete merged.magicId\n      delete merged.newRender\n    } else if(target[ROOT]){\n      merged.newRender = true\n    }\n    return merged\n  }\n\n  componentToString(cid){\n    let [str, streams] = this.recursiveCIDToString(this.rendered[COMPONENTS], cid, null)\n    let [strippedHTML, _before, _after] = modifyRoot(str, {})\n    return [strippedHTML, streams]\n  }\n\n  pruneCIDs(cids){\n    cids.forEach(cid => delete this.rendered[COMPONENTS][cid])\n  }\n\n  // private\n\n  get(){ return this.rendered }\n\n  isNewFingerprint(diff = {}){ return !!diff[STATIC] }\n\n  templateStatic(part, templates){\n    if(typeof (part) === \"number\"){\n      return templates[part]\n    } else {\n      return part\n    }\n  }\n\n  nextMagicID(){\n    this.magicId++\n    return `m${this.magicId}-${this.parentViewId()}`\n  }\n\n  // Converts rendered tree to output buffer.\n  //\n  // changeTracking controls if we can apply the PHX_SKIP optimization.\n  // It is disabled for comprehensions since we must re-render the entire collection\n  // and no individual element is tracked inside the comprehension.\n  toOutputBuffer(rendered, templates, output, changeTracking, rootAttrs = {}){\n    if(rendered[DYNAMICS]){ return this.comprehensionToBuffer(rendered, templates, output) }\n    let {[STATIC]: statics} = rendered\n    statics = this.templateStatic(statics, templates)\n    let isRoot = rendered[ROOT]\n    let prevBuffer = output.buffer\n    if(isRoot){ output.buffer = \"\" }\n\n    // this condition is called when first rendering an optimizable function component.\n    // LC have their magicId previously set\n    if(changeTracking && isRoot && !rendered.magicId){\n      rendered.newRender = true\n      rendered.magicId = this.nextMagicID()\n    }\n\n    output.buffer += statics[0]\n    for(let i = 1; i < statics.length; i++){\n      this.dynamicToBuffer(rendered[i - 1], templates, output, changeTracking)\n      output.buffer += statics[i]\n    }\n\n    // Applies the root tag \"skip\" optimization if supported, which clears\n    // the root tag attributes and innerHTML, and only maintains the magicId.\n    // We can only skip when changeTracking is supported (outside of a comprehension),\n    // and when the root element hasn't experienced an unrendered merge (newRender true).\n    if(isRoot){\n      let skip = false\n      let attrs\n      // When a LC is re-added to the page, we need to re-render the entire LC tree,\n      // therefore changeTracking is false; however, we need to keep all the magicIds\n      // from any function component so the next time the LC is updated, we can apply\n      // the skip optimization\n      if(changeTracking || rendered.magicId){\n        skip = changeTracking && !rendered.newRender\n        attrs = {[PHX_MAGIC_ID]: rendered.magicId, ...rootAttrs}\n      } else {\n        attrs = rootAttrs\n      }\n      if(skip){ attrs[PHX_SKIP] = true }\n      let [newRoot, commentBefore, commentAfter] = modifyRoot(output.buffer, attrs, skip)\n      rendered.newRender = false\n      output.buffer = prevBuffer + commentBefore + newRoot + commentAfter\n    }\n  }\n\n  comprehensionToBuffer(rendered, templates, output){\n    let {[DYNAMICS]: dynamics, [STATIC]: statics, [STREAM]: stream} = rendered\n    let [_ref, _inserts, deleteIds, reset] = stream || [null, {}, [], null]\n    statics = this.templateStatic(statics, templates)\n    let compTemplates = templates || rendered[TEMPLATES]\n    for(let d = 0; d < dynamics.length; d++){\n      let dynamic = dynamics[d]\n      output.buffer += statics[0]\n      for(let i = 1; i < statics.length; i++){\n        // Inside a comprehension, we don't track how dynamics change\n        // over time (and features like streams would make that impossible\n        // unless we move the stream diffing away from morphdom),\n        // so we can't perform root change tracking.\n        let changeTracking = false\n        this.dynamicToBuffer(dynamic[i - 1], compTemplates, output, changeTracking)\n        output.buffer += statics[i]\n      }\n    }\n\n    if(stream !== undefined && (rendered[DYNAMICS].length > 0 || deleteIds.length > 0 || reset)){\n      delete rendered[STREAM]\n      rendered[DYNAMICS] = []\n      output.streams.add(stream)\n    }\n  }\n\n  dynamicToBuffer(rendered, templates, output, changeTracking){\n    if(typeof (rendered) === \"number\"){\n      let [str, streams] = this.recursiveCIDToString(output.components, rendered, output.onlyCids)\n      output.buffer += str\n      output.streams = new Set([...output.streams, ...streams])\n    } else if(isObject(rendered)){\n      this.toOutputBuffer(rendered, templates, output, changeTracking, {})\n    } else {\n      output.buffer += rendered\n    }\n  }\n\n  recursiveCIDToString(components, cid, onlyCids){\n    let component = components[cid] || logError(`no component for CID ${cid}`, components)\n    let attrs = {[PHX_COMPONENT]: cid}\n    let skip = onlyCids && !onlyCids.has(cid)\n    // Two optimization paths apply here:\n    //\n    //   1. The onlyCids optimization works by the server diff telling us only specific\n    //     cid's have changed. This allows us to skip rendering any component that hasn't changed,\n    //     which ultimately sets PHX_SKIP root attribute and avoids rendering the innerHTML.\n    //\n    //   2. The root PHX_SKIP optimization generalizes to all HEEx function components, and\n    //     works in the same PHX_SKIP attribute fashion as 1, but the newRender tracking is done\n    //     at the general diff merge level. If we merge a diff with new dynamics, we necessarily have\n    //     experienced a change which must be a newRender, and thus we can't skip the render.\n    //\n    // Both optimization flows apply here. newRender is set based on the onlyCids optimization, and\n    // we track a deterministic magicId based on the cid.\n    //\n    // changeTracking is about the entire tree\n    // newRender is about the current root in the tree\n    //\n    // By default changeTracking is enabled, but we special case the flow where the client is pruning\n    // cids and the server adds the component back. In such cases, we explicitly disable changeTracking\n    // with resetRender for this cid, then re-enable it after the recursive call to skip the optimization\n    // for the entire component tree.\n    component.newRender = !skip\n    component.magicId = `c${cid}-${this.parentViewId()}`\n    // enable change tracking as long as the component hasn't been reset\n    let changeTracking = !component.reset\n    let [html, streams] = this.recursiveToString(component, components, onlyCids, changeTracking, attrs)\n    // disable reset after we've rendered\n    delete component.reset\n\n    return [html, streams]\n  }\n}\n", "import DOM from \"./dom\"\nimport ARIA from \"./aria\"\n\nlet focusStack = []\nlet default_transition_time = 200\n\nlet JS = {\n  // private\n  exec(e, eventType, phxEvent, view, sourceEl, defaults){\n    let [defaultKind, defaultArgs] = defaults || [null, {callback: defaults && defaults.callback}]\n    let commands = phxEvent.charAt(0) === \"[\" ?\n      JSON.parse(phxEvent) : [[defaultKind, defaultArgs]]\n\n    commands.forEach(([kind, args]) => {\n      if(kind === defaultKind){\n        // always prefer the args, but keep existing keys from the defaultArgs\n        args = {...defaultArgs, ...args}\n        args.callback = args.callback || defaultArgs.callback\n      }\n      this.filterToEls(view.liveSocket, sourceEl, args).forEach(el => {\n        this[`exec_${kind}`](e, eventType, phxEvent, view, sourceEl, el, args)\n      })\n    })\n  },\n\n  isVisible(el){\n    return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length > 0)\n  },\n\n  // returns true if any part of the element is inside the viewport\n  isInViewport(el){\n    const rect = el.getBoundingClientRect()\n    const windowHeight = window.innerHeight || document.documentElement.clientHeight\n    const windowWidth = window.innerWidth || document.documentElement.clientWidth\n\n    return (\n      rect.right > 0 &&\n      rect.bottom > 0 &&\n      rect.left < windowWidth &&\n      rect.top < windowHeight\n    )\n  },\n\n  // private\n\n  // commands\n\n  exec_exec(e, eventType, phxEvent, view, sourceEl, el, {attr, to}){\n    let nodes = to ? DOM.all(document, to) : [sourceEl]\n    nodes.forEach(node => {\n      let encodedJS = node.getAttribute(attr)\n      if(!encodedJS){ throw new Error(`expected ${attr} to contain JS command on \"${to}\"`) }\n      view.liveSocket.execJS(node, encodedJS, eventType)\n    })\n  },\n\n  exec_dispatch(e, eventType, phxEvent, view, sourceEl, el, {event, detail, bubbles}){\n    detail = detail || {}\n    detail.dispatcher = sourceEl\n    DOM.dispatchEvent(el, event, {detail, bubbles})\n  },\n\n  exec_push(e, eventType, phxEvent, view, sourceEl, el, args){\n    let {event, data, target, page_loading, loading, value, dispatcher, callback} = args\n    let pushOpts = {loading, value, target, page_loading: !!page_loading}\n    let targetSrc = eventType === \"change\" && dispatcher ? dispatcher : sourceEl\n    let phxTarget = target || targetSrc.getAttribute(view.binding(\"target\")) || targetSrc\n    const handler = (targetView, targetCtx) => {\n      if(!targetView.isConnected()){ return }\n      if(eventType === \"change\"){\n        let {newCid, _target} = args\n        _target = _target || (DOM.isFormInput(sourceEl) ? sourceEl.name : undefined)\n        if(_target){ pushOpts._target = _target }\n        targetView.pushInput(sourceEl, targetCtx, newCid, event || phxEvent, pushOpts, callback)\n      } else if(eventType === \"submit\"){\n        let {submitter} = args\n        targetView.submitForm(sourceEl, targetCtx, event || phxEvent, submitter, pushOpts, callback)\n      } else {\n        targetView.pushEvent(eventType, sourceEl, targetCtx, event || phxEvent, data, pushOpts, callback)\n      }\n    }\n    // in case of formRecovery, targetView and targetCtx are passed as argument\n    // as they are looked up in a template element, not the real DOM\n    if(args.targetView && args.targetCtx){\n      handler(args.targetView, args.targetCtx)\n    } else {\n      view.withinTargets(phxTarget, handler)\n    }\n  },\n\n  exec_navigate(e, eventType, phxEvent, view, sourceEl, el, {href, replace}){\n    view.liveSocket.historyRedirect(e, href, replace ? \"replace\" : \"push\", null, sourceEl)\n  },\n\n  exec_patch(e, eventType, phxEvent, view, sourceEl, el, {href, replace}){\n    view.liveSocket.pushHistoryPatch(e, href, replace ? \"replace\" : \"push\", sourceEl)\n  },\n\n  exec_focus(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => ARIA.attemptFocus(el))\n  },\n\n  exec_focus_first(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => ARIA.focusFirstInteractive(el) || ARIA.focusFirst(el))\n  },\n\n  exec_push_focus(e, eventType, phxEvent, view, sourceEl, el){\n    window.requestAnimationFrame(() => focusStack.push(el || sourceEl))\n  },\n\n  exec_pop_focus(_e, _eventType, _phxEvent, _view, _sourceEl, _el){\n    window.requestAnimationFrame(() => {\n      const el = focusStack.pop()\n      if(el){ el.focus() }\n    })\n  },\n\n  exec_add_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.addOrRemoveClasses(el, names, [], transition, time, view, blocking)\n  },\n\n  exec_remove_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.addOrRemoveClasses(el, [], names, transition, time, view, blocking)\n  },\n\n  exec_toggle_class(e, eventType, phxEvent, view, sourceEl, el, {names, transition, time, blocking}){\n    this.toggleClasses(el, names, transition, time, view, blocking)\n  },\n\n  exec_toggle_attr(e, eventType, phxEvent, view, sourceEl, el, {attr: [attr, val1, val2]}){\n    this.toggleAttr(el, attr, val1, val2)\n  },\n\n  exec_transition(e, eventType, phxEvent, view, sourceEl, el, {time, transition, blocking}){\n    this.addOrRemoveClasses(el, [], [], transition, time, view, blocking)\n  },\n\n  exec_toggle(e, eventType, phxEvent, view, sourceEl, el, {display, ins, outs, time, blocking}){\n    this.toggle(eventType, view, el, display, ins, outs, time, blocking)\n  },\n\n  exec_show(e, eventType, phxEvent, view, sourceEl, el, {display, transition, time, blocking}){\n    this.show(eventType, view, el, display, transition, time, blocking)\n  },\n\n  exec_hide(e, eventType, phxEvent, view, sourceEl, el, {display, transition, time, blocking}){\n    this.hide(eventType, view, el, display, transition, time, blocking)\n  },\n\n  exec_set_attr(e, eventType, phxEvent, view, sourceEl, el, {attr: [attr, val]}){\n    this.setOrRemoveAttrs(el, [[attr, val]], [])\n  },\n\n  exec_remove_attr(e, eventType, phxEvent, view, sourceEl, el, {attr}){\n    this.setOrRemoveAttrs(el, [], [attr])\n  },\n\n  // utils for commands\n\n  show(eventType, view, el, display, transition, time, blocking){\n    if(!this.isVisible(el)){\n      this.toggle(eventType, view, el, display, transition, null, time, blocking)\n    }\n  },\n\n  hide(eventType, view, el, display, transition, time, blocking){\n    if(this.isVisible(el)){\n      this.toggle(eventType, view, el, display, null, transition, time, blocking)\n    }\n  },\n\n  toggle(eventType, view, el, display, ins, outs, time, blocking){\n    time = time || default_transition_time\n    let [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []]\n    let [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []]\n    if(inClasses.length > 0 || outClasses.length > 0){\n      if(this.isVisible(el)){\n        let onStart = () => {\n          this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses))\n          window.requestAnimationFrame(() => {\n            this.addOrRemoveClasses(el, outClasses, [])\n            window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses))\n          })\n        }\n        let onEnd = () => {\n          this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses))\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = \"none\")\n          el.dispatchEvent(new Event(\"phx:hide-end\"))\n        }\n        el.dispatchEvent(new Event(\"phx:hide-start\"))\n        if(blocking === false){\n          onStart()\n          setTimeout(onEnd, time)\n        } else {\n          view.transition(time, onStart, onEnd)\n        }\n      } else {\n        if(eventType === \"remove\"){ return }\n        let onStart = () => {\n          this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses))\n          let stickyDisplay = display || this.defaultDisplay(el)\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = stickyDisplay)\n          window.requestAnimationFrame(() => {\n            this.addOrRemoveClasses(el, inClasses, [])\n            window.requestAnimationFrame(() => this.addOrRemoveClasses(el, inEndClasses, inStartClasses))\n          })\n        }\n        let onEnd = () => {\n          this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses))\n          el.dispatchEvent(new Event(\"phx:show-end\"))\n        }\n        el.dispatchEvent(new Event(\"phx:show-start\"))\n        if(blocking === false){\n          onStart()\n          setTimeout(onEnd, time)\n        } else {\n          view.transition(time, onStart, onEnd)\n        }\n      }\n    } else {\n      if(this.isVisible(el)){\n        window.requestAnimationFrame(() => {\n          el.dispatchEvent(new Event(\"phx:hide-start\"))\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = \"none\")\n          el.dispatchEvent(new Event(\"phx:hide-end\"))\n        })\n      } else {\n        window.requestAnimationFrame(() => {\n          el.dispatchEvent(new Event(\"phx:show-start\"))\n          let stickyDisplay = display || this.defaultDisplay(el)\n          DOM.putSticky(el, \"toggle\", currentEl => currentEl.style.display = stickyDisplay)\n          el.dispatchEvent(new Event(\"phx:show-end\"))\n        })\n      }\n    }\n  },\n\n  toggleClasses(el, classes, transition, time, view, blocking){\n    window.requestAnimationFrame(() => {\n      let [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []])\n      let newAdds = classes.filter(name => prevAdds.indexOf(name) < 0 && !el.classList.contains(name))\n      let newRemoves = classes.filter(name => prevRemoves.indexOf(name) < 0 && el.classList.contains(name))\n      this.addOrRemoveClasses(el, newAdds, newRemoves, transition, time, view, blocking)\n    })\n  },\n\n  toggleAttr(el, attr, val1, val2){\n    if(el.hasAttribute(attr)){\n      if(val2 !== undefined){\n        // toggle between val1 and val2\n        if(el.getAttribute(attr) === val1){\n          this.setOrRemoveAttrs(el, [[attr, val2]], [])\n        } else {\n          this.setOrRemoveAttrs(el, [[attr, val1]], [])\n        }\n      } else {\n        // remove attr\n        this.setOrRemoveAttrs(el, [], [attr])\n      }\n    } else {\n      this.setOrRemoveAttrs(el, [[attr, val1]], [])\n    }\n  },\n\n  addOrRemoveClasses(el, adds, removes, transition, time, view, blocking){\n    time = time || default_transition_time\n    let [transitionRun, transitionStart, transitionEnd] = transition || [[], [], []]\n    if(transitionRun.length > 0){\n      let onStart = () => {\n        this.addOrRemoveClasses(el, transitionStart, [].concat(transitionRun).concat(transitionEnd))\n        window.requestAnimationFrame(() => {\n          this.addOrRemoveClasses(el, transitionRun, [])\n          window.requestAnimationFrame(() => this.addOrRemoveClasses(el, transitionEnd, transitionStart))\n        })\n      }\n      let onDone = () => this.addOrRemoveClasses(el, adds.concat(transitionEnd), removes.concat(transitionRun).concat(transitionStart))\n      if(blocking === false){\n        onStart()\n        setTimeout(onDone, time)\n      } else {\n        view.transition(time, onStart, onDone)\n      }\n      return\n    }\n\n    window.requestAnimationFrame(() => {\n      let [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []])\n      let keepAdds = adds.filter(name => prevAdds.indexOf(name) < 0 && !el.classList.contains(name))\n      let keepRemoves = removes.filter(name => prevRemoves.indexOf(name) < 0 && el.classList.contains(name))\n      let newAdds = prevAdds.filter(name => removes.indexOf(name) < 0).concat(keepAdds)\n      let newRemoves = prevRemoves.filter(name => adds.indexOf(name) < 0).concat(keepRemoves)\n\n      DOM.putSticky(el, \"classes\", currentEl => {\n        currentEl.classList.remove(...newRemoves)\n        currentEl.classList.add(...newAdds)\n        return [newAdds, newRemoves]\n      })\n    })\n  },\n\n  setOrRemoveAttrs(el, sets, removes){\n    let [prevSets, prevRemoves] = DOM.getSticky(el, \"attrs\", [[], []])\n\n    let alteredAttrs = sets.map(([attr, _val]) => attr).concat(removes)\n    let newSets = prevSets.filter(([attr, _val]) => !alteredAttrs.includes(attr)).concat(sets)\n    let newRemoves = prevRemoves.filter((attr) => !alteredAttrs.includes(attr)).concat(removes)\n\n    DOM.putSticky(el, \"attrs\", currentEl => {\n      newRemoves.forEach(attr => currentEl.removeAttribute(attr))\n      newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val))\n      return [newSets, newRemoves]\n    })\n  },\n\n  hasAllClasses(el, classes){ return classes.every(name => el.classList.contains(name)) },\n\n  isToggledOut(el, outClasses){\n    return !this.isVisible(el) || this.hasAllClasses(el, outClasses)\n  },\n\n  filterToEls(liveSocket, sourceEl, {to}){\n    let defaultQuery = () => {\n      if(typeof(to) === \"string\"){\n        return document.querySelectorAll(to)\n      } else if(to.closest){\n        let toEl = sourceEl.closest(to.closest)\n        return toEl ? [toEl] : []\n      } else if(to.inner){\n        return sourceEl.querySelectorAll(to.inner)\n      }\n    }\n    return to ? liveSocket.jsQuerySelectorAll(sourceEl, to, defaultQuery) : [sourceEl]\n  },\n\n  defaultDisplay(el){\n    return {tr: \"table-row\", td: \"table-cell\"}[el.tagName.toLowerCase()] || \"block\"\n  },\n\n  transitionClasses(val){\n    if(!val){ return null }\n\n    let [trans, tStart, tEnd] = Array.isArray(val) ? val : [val.split(\" \"), [], []]\n    trans = Array.isArray(trans) ? trans : trans.split(\" \")\n    tStart = Array.isArray(tStart) ? tStart : tStart.split(\" \")\n    tEnd = Array.isArray(tEnd) ? tEnd : tEnd.split(\" \")\n    return [trans, tStart, tEnd]\n  }\n}\n\nexport default JS\n", "import JS from \"./js\"\nimport DOM from \"./dom\"\n\nconst HOOK_ID = \"hookId\"\n\nlet viewHookID = 1\nexport default class ViewHook {\n  static makeID(){ return viewHookID++ }\n  static elementID(el){ return DOM.private(el, HOOK_ID) }\n\n  constructor(view, el, callbacks){\n    this.el = el\n    this.__attachView(view)\n    this.__callbacks = callbacks\n    this.__listeners = new Set()\n    this.__isDisconnected = false\n    DOM.putPrivate(this.el, HOOK_ID, this.constructor.makeID())\n    for(let key in this.__callbacks){ this[key] = this.__callbacks[key] }\n  }\n\n  __attachView(view){\n    if(view){\n      this.__view = () => view\n      this.liveSocket = view.liveSocket\n    } else {\n      this.__view = () => {\n        throw new Error(`hook not yet attached to a live view: ${this.el.outerHTML}`)\n      }\n      this.liveSocket = null\n    }\n  }\n\n  __mounted(){ this.mounted && this.mounted() }\n  __updated(){ this.updated && this.updated() }\n  __beforeUpdate(){ this.beforeUpdate && this.beforeUpdate() }\n  __destroyed(){\n    this.destroyed && this.destroyed()\n    DOM.deletePrivate(this.el, HOOK_ID) // https://github.com/phoenixframework/phoenix_live_view/issues/3496\n  }\n  __reconnected(){\n    if(this.__isDisconnected){\n      this.__isDisconnected = false\n      this.reconnected && this.reconnected()\n    }\n  }\n  __disconnected(){\n    this.__isDisconnected = true\n    this.disconnected && this.disconnected()\n  }\n\n  /**\n   * Binds the hook to JS commands.\n   *\n   * @param {ViewHook} hook - The ViewHook instance to bind.\n   *\n   * @returns {Object} An object with methods to manipulate the DOM and execute JavaScript.\n   */\n  js(){\n    let hook = this\n\n    return {\n      /**\n       * Executes encoded JavaScript in the context of the hook element.\n       *\n       * @param {string} encodedJS - The encoded JavaScript string to execute.\n       */\n      exec(encodedJS){\n        hook.__view().liveSocket.execJS(hook.el, encodedJS, \"hook\")\n      },\n\n      /**\n       * Shows an element.\n       *\n       * @param {HTMLElement} el - The element to show.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.display] - The CSS display value to set. Defaults \"block\".\n       * @param {string} [opts.transition] - The CSS transition classes to set when showing.\n       * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *  Defaults `true`.\n       */\n      show(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.show(\"hook\", owner, el, opts.display, opts.transition, opts.time, opts.blocking)\n      },\n\n      /**\n       * Hides an element.\n       *\n       * @param {HTMLElement} el - The element to hide.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set when hiding.\n       * @param {number} [opts.time] - The transition duration in milliseconds. Defaults 200.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      hide(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.hide(\"hook\", owner, el, null, opts.transition, opts.time, opts.blocking)\n      },\n\n      /**\n       * Toggles the visibility of an element.\n       *\n       * @param {HTMLElement} el - The element to toggle.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.display] - The CSS display value to set. Defaults \"block\".\n       * @param {string} [opts.in] - The CSS transition classes for showing.\n       *   Accepts either the string of classes to apply when toggling in, or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]\n       *\n       * @param {string} [opts.out] - The CSS transition classes for hiding.\n       *   Accepts either string of classes to apply when toggling out, or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       *\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      toggle(el, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        opts.in = JS.transitionClasses(opts.in)\n        opts.out = JS.transitionClasses(opts.out)\n        JS.toggle(\"hook\", owner, el, opts.display, opts.in, opts.out, opts.time, opts.blocking)\n      },\n\n      /**\n       * Adds CSS classes to an element.\n       *\n       * @param {HTMLElement} el - The element to add classes to.\n       * @param {string|string[]} names - The class name(s) to add.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition property to set.\n       *   Accepts a string of classes to apply when adding classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      addClass(el, names, opts = {}){\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, names, [], opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Removes CSS classes from an element.\n       *\n       * @param {HTMLElement} el - The element to remove classes from.\n       * @param {string|string[]} names - The class name(s) to remove.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set.\n       *   Accepts a string of classes to apply when removing classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      removeClass(el, names, opts = {}){\n        opts.transition = JS.transitionClasses(opts.transition)\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, [], names, opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Toggles CSS classes on an element.\n       *\n       * @param {HTMLElement} el - The element to toggle classes on.\n       * @param {string|string[]} names - The class name(s) to toggle.\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {string} [opts.transition] - The CSS transition classes to set.\n       *   Accepts a string of classes to apply when toggling classes or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      toggleClass(el, names, opts = {}){\n        opts.transition = JS.transitionClasses(opts.transition)\n        names = Array.isArray(names) ? names : names.split(\" \")\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.toggleClasses(el, names, opts.transition, opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Applies a CSS transition to an element.\n       *\n       * @param {HTMLElement} el - The element to apply the transition to.\n       * @param {string|string[]} transition - The transition class(es) to apply.\n       *   Accepts a string of classes to apply when transitioning or\n       *   a 3-tuple containing the transition class, the class to apply\n       *   to start the transition, and the ending transition class, such as:\n       *\n       *       [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n       *\n       * @param {Object} [opts={}] - Optional settings.\n       * @param {number} [opts.time] - The transition duration in milliseconds.\n       * @param {boolean} [opts.blocking] - The boolean flag to block the UI during the transition.\n       *   Defaults `true`.\n       */\n      transition(el, transition, opts = {}){\n        let owner = hook.__view().liveSocket.owner(el)\n        JS.addOrRemoveClasses(el, [], [], JS.transitionClasses(transition), opts.time, owner, opts.blocking)\n      },\n\n      /**\n       * Sets an attribute on an element.\n       *\n       * @param {HTMLElement} el - The element to set the attribute on.\n       * @param {string} attr - The attribute name to set.\n       * @param {string} val - The value to set for the attribute.\n       */\n      setAttribute(el, attr, val){ JS.setOrRemoveAttrs(el, [[attr, val]], []) },\n\n      /**\n       * Removes an attribute from an element.\n       *\n       * @param {HTMLElement} el - The element to remove the attribute from.\n       * @param {string} attr - The attribute name to remove.\n       */\n      removeAttribute(el, attr){ JS.setOrRemoveAttrs(el, [], [attr]) },\n\n      /**\n       * Toggles an attribute on an element between two values.\n       *\n       * @param {HTMLElement} el - The element to toggle the attribute on.\n       * @param {string} attr - The attribute name to toggle.\n       * @param {string} val1 - The first value to toggle between.\n       * @param {string} val2 - The second value to toggle between.\n       */\n      toggleAttribute(el, attr, val1, val2){ JS.toggleAttr(el, attr, val1, val2) },\n    }\n  }\n\n  pushEvent(event, payload = {}, onReply){\n    if(onReply === undefined){\n      return new Promise((resolve, reject) => {\n        try {\n          const ref = this.__view().pushHookEvent(this.el, null, event, payload, (reply, _ref) => resolve(reply))\n          if(ref === false){\n            reject(new Error(\"unable to push hook event. LiveView not connected\"))\n          }\n        } catch (error){\n          reject(error)\n        }\n      })\n    }\n    return this.__view().pushHookEvent(this.el, null, event, payload, onReply)\n  }\n\n  pushEventTo(phxTarget, event, payload = {}, onReply){\n    if(onReply === undefined){\n      return new Promise((resolve, reject) => {\n        try {\n          this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n            const ref = view.pushHookEvent(this.el, targetCtx, event, payload, (reply, _ref) => resolve(reply))\n            if(ref === false){\n              reject(new Error(\"unable to push hook event. LiveView not connected\"))\n            }\n          })\n        } catch (error){\n          reject(error)\n        }\n      })\n    }\n    return this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n      return view.pushHookEvent(this.el, targetCtx, event, payload, onReply)\n    })\n  }\n\n  handleEvent(event, callback){\n    let callbackRef = (customEvent, bypass) => bypass ? event : callback(customEvent.detail)\n    window.addEventListener(`phx:${event}`, callbackRef)\n    this.__listeners.add(callbackRef)\n    return callbackRef\n  }\n\n  removeHandleEvent(callbackRef){\n    let event = callbackRef(null, true)\n    window.removeEventListener(`phx:${event}`, callbackRef)\n    this.__listeners.delete(callbackRef)\n  }\n\n  upload(name, files){\n    return this.__view().dispatchUploads(null, name, files)\n  }\n\n  uploadTo(phxTarget, name, files){\n    return this.__view().withinTargets(phxTarget, (view, targetCtx) => {\n      view.dispatchUploads(targetCtx, name, files)\n    })\n  }\n\n  __cleanup__(){\n    this.__listeners.forEach(callbackRef => this.removeHandleEvent(callbackRef))\n  }\n}\n", "import {\n  BEFORE_UNLOAD_LOADER_TIMEOUT,\n  CHECKABLE_INPUTS,\n  CONSECUTIVE_RELOADS,\n  PHX_AUTO_RECOVER,\n  PHX_COMPONENT,\n  PHX_CONNECTED_CLASS,\n  PHX_DISABLE_WITH,\n  PHX_DISABLE_WITH_RESTORE,\n  PHX_DISABLED,\n  PHX_LOADING_CLASS,\n  PHX_ERROR_CLASS,\n  PHX_CLIENT_ERROR_CLASS,\n  PHX_SERVER_ERROR_CLASS,\n  PHX_HAS_FOCUSED,\n  PHX_HAS_SUBMITTED,\n  PHX_HOOK,\n  PHX_PARENT_ID,\n  PHX_PROGRESS,\n  PHX_READONLY,\n  PHX_REF_LOADING,\n  PHX_REF_SRC,\n  PHX_REF_LOCK,\n  PHX_ROOT_ID,\n  PHX_SESSION,\n  PHX_STATIC,\n  PHX_TRACK_STATIC,\n  PHX_TRACK_UPLOADS,\n  PHX_UPDATE,\n  PHX_UPLOAD_REF,\n  PHX_VIEW_SELECTOR,\n  PHX_MAIN,\n  PHX_MOUNTED,\n  PUSH_TIMEOUT,\n  PHX_VIEWPORT_TOP,\n  PHX_VIEWPORT_BOTTOM,\n  MAX_CHILD_JOIN_ATTEMPTS\n} from \"./constants\"\n\nimport {\n  clone,\n  closestPhxBinding,\n  isEmpty,\n  isEqualObj,\n  logError,\n  maybe,\n  isCid,\n} from \"./utils\"\n\nimport Browser from \"./browser\"\nimport DOM from \"./dom\"\nimport ElementRef from \"./element_ref\"\nimport DOMPatch from \"./dom_patch\"\nimport LiveUploader from \"./live_uploader\"\nimport Rendered from \"./rendered\"\nimport ViewHook from \"./view_hook\"\nimport JS from \"./js\"\n\nexport let prependFormDataKey = (key, prefix) => {\n  let isArray = key.endsWith(\"[]\")\n  // Remove the \"[]\" if it's an array\n  let baseKey = isArray ? key.slice(0, -2) : key\n  // Replace last occurrence of key before a closing bracket or the end with key plus suffix\n  baseKey = baseKey.replace(/([^\\[\\]]+)(\\]?$)/, `${prefix}$1$2`)\n  // Add back the \"[]\" if it was an array\n  if(isArray){ baseKey += \"[]\" }\n  return baseKey\n}\n\nlet serializeForm = (form, metadata, onlyNames = []) => {\n  const {submitter, ...meta} = metadata\n\n  // We must inject the submitter in the order that it exists in the DOM\n  // relative to other inputs. For example, for checkbox groups, the order must be maintained.\n  let injectedElement\n  if(submitter && submitter.name){\n    const input = document.createElement(\"input\")\n    input.type = \"hidden\"\n    // set the form attribute if the submitter has one;\n    // this can happen if the element is outside the actual form element\n    const formId = submitter.getAttribute(\"form\")\n    if(formId){\n      input.setAttribute(\"form\", formId)\n    }\n    input.name = submitter.name\n    input.value = submitter.value\n    submitter.parentElement.insertBefore(input, submitter)\n    injectedElement = input\n  }\n\n  const formData = new FormData(form)\n  const toRemove = []\n\n  formData.forEach((val, key, _index) => {\n    if(val instanceof File){ toRemove.push(key) }\n  })\n\n  // Cleanup after building fileData\n  toRemove.forEach(key => formData.delete(key))\n\n  const params = new URLSearchParams()\n\n  let elements = Array.from(form.elements)\n  for(let [key, val] of formData.entries()){\n    if(onlyNames.length === 0 || onlyNames.indexOf(key) >= 0){\n      let inputs = elements.filter(input => input.name === key)\n      let isUnused = !inputs.some(input => (DOM.private(input, PHX_HAS_FOCUSED) || DOM.private(input, PHX_HAS_SUBMITTED)))\n      let hidden = inputs.every(input => input.type === \"hidden\")\n      if(isUnused && !(submitter && submitter.name == key) && !hidden){\n        params.append(prependFormDataKey(key, \"_unused_\"), \"\")\n      }\n      params.append(key, val)\n    }\n  }\n\n  // remove the injected element again\n  // (it would be removed by the next dom patch anyway, but this is cleaner)\n  if(submitter && injectedElement){\n    submitter.parentElement.removeChild(injectedElement)\n  }\n\n  for(let metaKey in meta){ params.append(metaKey, meta[metaKey]) }\n\n  return params.toString()\n}\n\nexport default class View {\n  static closestView(el){\n    let liveViewEl = el.closest(PHX_VIEW_SELECTOR)\n    return liveViewEl ? DOM.private(liveViewEl, \"view\") : null\n  }\n\n  constructor(el, liveSocket, parentView, flash, liveReferer){\n    this.isDead = false\n    this.liveSocket = liveSocket\n    this.flash = flash\n    this.parent = parentView\n    this.root = parentView ? parentView.root : this\n    this.el = el\n    DOM.putPrivate(this.el, \"view\", this)\n    this.id = this.el.id\n    this.ref = 0\n    this.lastAckRef = null\n    this.childJoins = 0\n    this.loaderTimer = null\n    this.pendingDiffs = []\n    this.pendingForms = new Set()\n    this.redirect = false\n    this.href = null\n    this.joinCount = this.parent ? this.parent.joinCount - 1 : 0\n    this.joinAttempts = 0\n    this.joinPending = true\n    this.destroyed = false\n    this.joinCallback = function(onDone){ onDone && onDone() }\n    this.stopCallback = function(){ }\n    this.pendingJoinOps = this.parent ? null : []\n    this.viewHooks = {}\n    this.formSubmits = []\n    this.children = this.parent ? null : {}\n    this.root.children[this.id] = {}\n    this.formsForRecovery = {}\n    this.channel = this.liveSocket.channel(`lv:${this.id}`, () => {\n      let url = this.href && this.expandURL(this.href)\n      return {\n        redirect: this.redirect ? url : undefined,\n        url: this.redirect ? undefined : url || undefined,\n        params: this.connectParams(liveReferer),\n        session: this.getSession(),\n        static: this.getStatic(),\n        flash: this.flash,\n      }\n    })\n  }\n\n  setHref(href){ this.href = href }\n\n  setRedirect(href){\n    this.redirect = true\n    this.href = href\n  }\n\n  isMain(){ return this.el.hasAttribute(PHX_MAIN) }\n\n  connectParams(liveReferer){\n    let params = this.liveSocket.params(this.el)\n    let manifest =\n      DOM.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`)\n        .map(node => node.src || node.href).filter(url => typeof (url) === \"string\")\n\n    if(manifest.length > 0){ params[\"_track_static\"] = manifest }\n    params[\"_mounts\"] = this.joinCount\n    params[\"_mount_attempts\"] = this.joinAttempts\n    params[\"_live_referer\"] = liveReferer\n    this.joinAttempts++\n\n    return params\n  }\n\n  isConnected(){ return this.channel.canPush() }\n\n  getSession(){ return this.el.getAttribute(PHX_SESSION) }\n\n  getStatic(){\n    let val = this.el.getAttribute(PHX_STATIC)\n    return val === \"\" ? null : val\n  }\n\n  destroy(callback = function (){ }){\n    this.destroyAllChildren()\n    this.destroyed = true\n    delete this.root.children[this.id]\n    if(this.parent){ delete this.root.children[this.parent.id][this.id] }\n    clearTimeout(this.loaderTimer)\n    let onFinished = () => {\n      callback()\n      for(let id in this.viewHooks){\n        this.destroyHook(this.viewHooks[id])\n      }\n    }\n\n    DOM.markPhxChildDestroyed(this.el)\n\n    this.log(\"destroyed\", () => [\"the child has been removed from the parent\"])\n    this.channel.leave()\n      .receive(\"ok\", onFinished)\n      .receive(\"error\", onFinished)\n      .receive(\"timeout\", onFinished)\n  }\n\n  setContainerClasses(...classes){\n    this.el.classList.remove(\n      PHX_CONNECTED_CLASS,\n      PHX_LOADING_CLASS,\n      PHX_ERROR_CLASS,\n      PHX_CLIENT_ERROR_CLASS,\n      PHX_SERVER_ERROR_CLASS\n    )\n    this.el.classList.add(...classes)\n  }\n\n  showLoader(timeout){\n    clearTimeout(this.loaderTimer)\n    if(timeout){\n      this.loaderTimer = setTimeout(() => this.showLoader(), timeout)\n    } else {\n      for(let id in this.viewHooks){ this.viewHooks[id].__disconnected() }\n      this.setContainerClasses(PHX_LOADING_CLASS)\n    }\n  }\n\n  execAll(binding){\n    DOM.all(this.el, `[${binding}]`, el => this.liveSocket.execJS(el, el.getAttribute(binding)))\n  }\n\n  hideLoader(){\n    clearTimeout(this.loaderTimer)\n    this.setContainerClasses(PHX_CONNECTED_CLASS)\n    this.execAll(this.binding(\"connected\"))\n  }\n\n  triggerReconnected(){\n    for(let id in this.viewHooks){ this.viewHooks[id].__reconnected() }\n  }\n\n  log(kind, msgCallback){\n    this.liveSocket.log(this, kind, msgCallback)\n  }\n\n  transition(time, onStart, onDone = function(){}){\n    this.liveSocket.transition(time, onStart, onDone)\n  }\n\n  // calls the callback with the view and target element for the given phxTarget\n  // targets can be:\n  //  * an element itself, then it is simply passed to liveSocket.owner;\n  //  * a CID (Component ID), then we first search the component's element in the DOM\n  //  * a selector, then we search the selector in the DOM and call the callback\n  //    for each element found with the corresponding owner view\n  withinTargets(phxTarget, callback, dom = document, viewEl){\n    // in the form recovery case we search in a template fragment instead of\n    // the real dom, therefore we optionally pass dom and viewEl\n\n    if(phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement){\n      return this.liveSocket.owner(phxTarget, view => callback(view, phxTarget))\n    }\n\n    if(isCid(phxTarget)){\n      let targets = DOM.findComponentNodeList(viewEl || this.el, phxTarget)\n      if(targets.length === 0){\n        logError(`no component found matching phx-target of ${phxTarget}`)\n      } else {\n        callback(this, parseInt(phxTarget))\n      }\n    } else {\n      let targets = Array.from(dom.querySelectorAll(phxTarget))\n      if(targets.length === 0){ logError(`nothing found matching the phx-target selector \"${phxTarget}\"`) }\n      targets.forEach(target => this.liveSocket.owner(target, view => callback(view, target)))\n    }\n  }\n\n  applyDiff(type, rawDiff, callback){\n    this.log(type, () => [\"\", clone(rawDiff)])\n    let {diff, reply, events, title} = Rendered.extract(rawDiff)\n    callback({diff, reply, events})\n    if(typeof title === \"string\" || type == \"mount\"){ window.requestAnimationFrame(() => DOM.putTitle(title)) }\n  }\n\n  onJoin(resp){\n    let {rendered, container, liveview_version} = resp\n    if(container){\n      let [tag, attrs] = container\n      this.el = DOM.replaceRootContainer(this.el, tag, attrs)\n    }\n    this.childJoins = 0\n    this.joinPending = true\n    this.flash = null\n    if(this.root === this){\n      this.formsForRecovery = this.getFormsForRecovery()\n    }\n    if(this.isMain() && window.history.state === null){\n      // set initial history entry if this is the first page load\n      this.liveSocket.replaceRootHistory()\n    }\n\n    if(liveview_version !== this.liveSocket.version()){\n      console.error(`LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${liveview_version}. To avoid issues, please ensure that your assets use the same version as the server.`)\n    }\n\n    Browser.dropLocal(this.liveSocket.localStorage, window.location.pathname, CONSECUTIVE_RELOADS)\n    this.applyDiff(\"mount\", rendered, ({diff, events}) => {\n      this.rendered = new Rendered(this.id, diff)\n      let [html, streams] = this.renderContainer(null, \"join\")\n      this.dropPendingRefs()\n      this.joinCount++\n      this.joinAttempts = 0\n\n      this.maybeRecoverForms(html, () => {\n        this.onJoinComplete(resp, html, streams, events)\n      })\n    })\n  }\n\n  dropPendingRefs(){\n    DOM.all(document, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, el => {\n      el.removeAttribute(PHX_REF_LOADING)\n      el.removeAttribute(PHX_REF_SRC)\n      el.removeAttribute(PHX_REF_LOCK)\n    })\n  }\n\n  onJoinComplete({live_patch}, html, streams, events){\n    // In order to provide a better experience, we want to join\n    // all LiveViews first and only then apply their patches.\n    if(this.joinCount > 1 || (this.parent && !this.parent.isJoinPending())){\n      return this.applyJoinPatch(live_patch, html, streams, events)\n    }\n\n    // One downside of this approach is that we need to find phxChildren\n    // in the html fragment, instead of directly on the DOM. The fragment\n    // also does not include PHX_STATIC, so we need to copy it over from\n    // the DOM.\n    let newChildren = DOM.findPhxChildrenInFragment(html, this.id).filter(toEl => {\n      let fromEl = toEl.id && this.el.querySelector(`[id=\"${toEl.id}\"]`)\n      let phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC)\n      if(phxStatic){ toEl.setAttribute(PHX_STATIC, phxStatic) }\n      // set PHX_ROOT_ID to prevent events from being dispatched to the root view\n      // while the child join is still pending\n      if(fromEl){ fromEl.setAttribute(PHX_ROOT_ID, this.root.id) }\n      return this.joinChild(toEl)\n    })\n\n    if(newChildren.length === 0){\n      if(this.parent){\n        this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)])\n        this.parent.ackJoin(this)\n      } else {\n        this.onAllChildJoinsComplete()\n        this.applyJoinPatch(live_patch, html, streams, events)\n      }\n    } else {\n      this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, streams, events)])\n    }\n  }\n\n  attachTrueDocEl(){\n    this.el = DOM.byId(this.id)\n    this.el.setAttribute(PHX_ROOT_ID, this.root.id)\n  }\n\n  // this is invoked for dead and live views, so we must filter by\n  // by owner to ensure we aren't duplicating hooks across disconnect\n  // and connected states. This also handles cases where hooks exist\n  // in a root layout with a LV in the body\n  execNewMounted(parent = this.el){\n    let phxViewportTop = this.binding(PHX_VIEWPORT_TOP)\n    let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM)\n    DOM.all(parent, `[${phxViewportTop}], [${phxViewportBottom}]`, hookEl => {\n      if(this.ownsElement(hookEl)){\n        DOM.maintainPrivateHooks(hookEl, hookEl, phxViewportTop, phxViewportBottom)\n        this.maybeAddNewHook(hookEl)\n      }\n    })\n    DOM.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, hookEl => {\n      if(this.ownsElement(hookEl)){\n        this.maybeAddNewHook(hookEl)\n      }\n    })\n    DOM.all(parent, `[${this.binding(PHX_MOUNTED)}]`, el => {\n      if(this.ownsElement(el)){\n        this.maybeMounted(el)\n      }\n    })\n  }\n\n  applyJoinPatch(live_patch, html, streams, events){\n    this.attachTrueDocEl()\n    let patch = new DOMPatch(this, this.el, this.id, html, streams, null)\n    patch.markPrunableContentForRemoval()\n    this.performPatch(patch, false, true)\n    this.joinNewChildren()\n    this.execNewMounted()\n\n    this.joinPending = false\n    this.liveSocket.dispatchEvents(events)\n    this.applyPendingUpdates()\n\n    if(live_patch){\n      let {kind, to} = live_patch\n      this.liveSocket.historyPatch(to, kind)\n    }\n    this.hideLoader()\n    if(this.joinCount > 1){ this.triggerReconnected() }\n    this.stopCallback()\n  }\n\n  triggerBeforeUpdateHook(fromEl, toEl){\n    this.liveSocket.triggerDOM(\"onBeforeElUpdated\", [fromEl, toEl])\n    let hook = this.getHook(fromEl)\n    let isIgnored = hook && DOM.isIgnored(fromEl, this.binding(PHX_UPDATE))\n    if(hook && !fromEl.isEqualNode(toEl) && !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))){\n      hook.__beforeUpdate()\n      return hook\n    }\n  }\n\n  maybeMounted(el){\n    let phxMounted = el.getAttribute(this.binding(PHX_MOUNTED))\n    let hasBeenInvoked = phxMounted && DOM.private(el, \"mounted\")\n    if(phxMounted && !hasBeenInvoked){\n      this.liveSocket.execJS(el, phxMounted)\n      DOM.putPrivate(el, \"mounted\", true)\n    }\n  }\n\n  maybeAddNewHook(el){\n    let newHook = this.addHook(el)\n    if(newHook){ newHook.__mounted() }\n  }\n\n  performPatch(patch, pruneCids, isJoinPatch = false){\n    let removedEls = []\n    let phxChildrenAdded = false\n    let updatedHookIds = new Set()\n\n    this.liveSocket.triggerDOM(\"onPatchStart\", [patch.targetContainer])\n\n    patch.after(\"added\", el => {\n      this.liveSocket.triggerDOM(\"onNodeAdded\", [el])\n      let phxViewportTop = this.binding(PHX_VIEWPORT_TOP)\n      let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM)\n      DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom)\n      this.maybeAddNewHook(el)\n      if(el.getAttribute){ this.maybeMounted(el) }\n    })\n\n    patch.after(\"phxChildAdded\", el => {\n      if(DOM.isPhxSticky(el)){\n        this.liveSocket.joinRootViews()\n      } else {\n        phxChildrenAdded = true\n      }\n    })\n\n    patch.before(\"updated\", (fromEl, toEl) => {\n      let hook = this.triggerBeforeUpdateHook(fromEl, toEl)\n      if(hook){ updatedHookIds.add(fromEl.id) }\n    })\n\n    patch.after(\"updated\", el => {\n      if(updatedHookIds.has(el.id)){ this.getHook(el).__updated() }\n    })\n\n    patch.after(\"discarded\", (el) => {\n      if(el.nodeType === Node.ELEMENT_NODE){ removedEls.push(el) }\n    })\n\n    patch.after(\"transitionsDiscarded\", els => this.afterElementsRemoved(els, pruneCids))\n    patch.perform(isJoinPatch)\n    this.afterElementsRemoved(removedEls, pruneCids)\n\n    this.liveSocket.triggerDOM(\"onPatchEnd\", [patch.targetContainer])\n    return phxChildrenAdded\n  }\n\n  afterElementsRemoved(elements, pruneCids){\n    let destroyedCIDs = []\n    elements.forEach(parent => {\n      let components = DOM.all(parent, `[${PHX_COMPONENT}]`)\n      let hooks = DOM.all(parent, `[${this.binding(PHX_HOOK)}], [data-phx-hook]`)\n      components.concat(parent).forEach(el => {\n        let cid = this.componentID(el)\n        if(isCid(cid) && destroyedCIDs.indexOf(cid) === -1){ destroyedCIDs.push(cid) }\n      })\n      hooks.concat(parent).forEach(hookEl => {\n        let hook = this.getHook(hookEl)\n        hook && this.destroyHook(hook)\n      })\n    })\n    // We should not pruneCids on joins. Otherwise, in case of\n    // rejoins, we may notify cids that no longer belong to the\n    // current LiveView to be removed.\n    if(pruneCids){\n      this.maybePushComponentsDestroyed(destroyedCIDs)\n    }\n  }\n\n  joinNewChildren(){\n    DOM.findPhxChildren(this.el, this.id).forEach(el => this.joinChild(el))\n  }\n\n  maybeRecoverForms(html, callback){\n    const phxChange = this.binding(\"change\")\n    const oldForms = this.root.formsForRecovery\n    // So why do we create a template element here?\n    // One way to recover forms would be to immediately apply the mount\n    // patch and then afterwards recover the forms. However, this would\n    // cause a flicker, because the mount patch would remove the form content\n    // until it is restored. Therefore LV decided to do form recovery with the\n    // raw HTML before it is applied and delay the mount patch until the form\n    // recovery events are done.\n    let template = document.createElement(\"template\")\n    template.innerHTML = html\n    // because we work with a template element, we must manually copy the attributes\n    // otherwise the owner / target helpers don't work properly\n    const rootEl = template.content.firstElementChild\n    rootEl.id = this.id\n    rootEl.setAttribute(PHX_ROOT_ID, this.root.id)\n    rootEl.setAttribute(PHX_SESSION, this.getSession())\n    rootEl.setAttribute(PHX_STATIC, this.getStatic())\n    rootEl.setAttribute(PHX_PARENT_ID, this.parent ? this.parent.id : null)\n\n    // we go over all form elements in the new HTML for the LV\n    // and look for old forms in the `formsForRecovery` object;\n    // the formsForRecovery can also contain forms from child views\n    const formsToRecover =\n      // we go over all forms in the new DOM; because this is only the HTML for the current\n      // view, we can be sure that all forms are owned by this view:\n      DOM.all(template.content, \"form\")\n        // only recover forms that have an id and are in the old DOM\n        .filter(newForm => newForm.id && oldForms[newForm.id])\n        // abandon forms we already tried to recover to prevent looping a failed state\n        .filter(newForm => !this.pendingForms.has(newForm.id))\n        // only recover if the form has the same phx-change value\n        .filter(newForm => oldForms[newForm.id].getAttribute(phxChange) === newForm.getAttribute(phxChange))\n        .map(newForm => {\n          return [oldForms[newForm.id], newForm]\n        })\n\n    if(formsToRecover.length === 0){\n      return callback()\n    }\n\n    formsToRecover.forEach(([oldForm, newForm], i) => {\n      this.pendingForms.add(newForm.id)\n      // it is important to use the firstElementChild of the template content\n      // because when traversing a documentFragment using parentNode, we won't ever arrive at\n      // the fragment; as the template is always a LiveView, we can be sure that there is only\n      // one child on the root level\n      this.pushFormRecovery(oldForm, newForm, template.content.firstElementChild, () => {\n        this.pendingForms.delete(newForm.id)\n        // we only call the callback once all forms have been recovered\n        if(i === formsToRecover.length - 1){\n          callback()\n        }\n      })\n    })\n  }\n\n  getChildById(id){ return this.root.children[this.id][id] }\n\n  getDescendentByEl(el){\n    if(el.id === this.id){\n      return this\n    } else {\n      return this.children[el.getAttribute(PHX_PARENT_ID)]?.[el.id]\n    }\n  }\n\n  destroyDescendent(id){\n    for(let parentId in this.root.children){\n      for(let childId in this.root.children[parentId]){\n        if(childId === id){ return this.root.children[parentId][childId].destroy() }\n      }\n    }\n  }\n\n  joinChild(el){\n    let child = this.getChildById(el.id)\n    if(!child){\n      let view = new View(el, this.liveSocket, this)\n      this.root.children[this.id][view.id] = view\n      view.join()\n      this.childJoins++\n      return true\n    }\n  }\n\n  isJoinPending(){ return this.joinPending }\n\n  ackJoin(_child){\n    this.childJoins--\n\n    if(this.childJoins === 0){\n      if(this.parent){\n        this.parent.ackJoin(this)\n      } else {\n        this.onAllChildJoinsComplete()\n      }\n    }\n  }\n\n  onAllChildJoinsComplete(){\n    // we can clear pending form recoveries now that we've joined.\n    // They either all resolved or were abandoned\n    this.pendingForms.clear()\n    // we can also clear the formsForRecovery object to not keep old form elements around\n    this.formsForRecovery = {}\n    this.joinCallback(() => {\n      this.pendingJoinOps.forEach(([view, op]) => {\n        if(!view.isDestroyed()){ op() }\n      })\n      this.pendingJoinOps = []\n    })\n  }\n\n  update(diff, events){\n    if(this.isJoinPending() || (this.liveSocket.hasPendingLink() && this.root.isMain())){\n      return this.pendingDiffs.push({diff, events})\n    }\n\n    this.rendered.mergeDiff(diff)\n    let phxChildrenAdded = false\n\n    // When the diff only contains component diffs, then walk components\n    // and patch only the parent component containers found in the diff.\n    // Otherwise, patch entire LV container.\n    if(this.rendered.isComponentOnlyDiff(diff)){\n      this.liveSocket.time(\"component patch complete\", () => {\n        let parentCids = DOM.findExistingParentCIDs(this.el, this.rendered.componentCIDs(diff))\n        parentCids.forEach(parentCID => {\n          if(this.componentPatch(this.rendered.getComponent(diff, parentCID), parentCID)){ phxChildrenAdded = true }\n        })\n      })\n    } else if(!isEmpty(diff)){\n      this.liveSocket.time(\"full patch complete\", () => {\n        let [html, streams] = this.renderContainer(diff, \"update\")\n        let patch = new DOMPatch(this, this.el, this.id, html, streams, null)\n        phxChildrenAdded = this.performPatch(patch, true)\n      })\n    }\n\n    this.liveSocket.dispatchEvents(events)\n    if(phxChildrenAdded){ this.joinNewChildren() }\n  }\n\n  renderContainer(diff, kind){\n    return this.liveSocket.time(`toString diff (${kind})`, () => {\n      let tag = this.el.tagName\n      // Don't skip any component in the diff nor any marked as pruned\n      // (as they may have been added back)\n      let cids = diff ? this.rendered.componentCIDs(diff) : null\n      let [html, streams] = this.rendered.toString(cids)\n      return [`<${tag}>${html}</${tag}>`, streams]\n    })\n  }\n\n  componentPatch(diff, cid){\n    if(isEmpty(diff)) return false\n    let [html, streams] = this.rendered.componentToString(cid)\n    let patch = new DOMPatch(this, this.el, this.id, html, streams, cid)\n    let childrenAdded = this.performPatch(patch, true)\n    return childrenAdded\n  }\n\n  getHook(el){ return this.viewHooks[ViewHook.elementID(el)] }\n\n  addHook(el){\n    let hookElId = ViewHook.elementID(el)\n\n    if(hookElId && !this.viewHooks[hookElId]){\n      // hook created, but not attached (createHook for web component)\n      let hook = DOM.getCustomElHook(el) || logError(`no hook found for custom element: ${el.id}`)\n      this.viewHooks[hookElId] = hook\n      hook.__attachView(this)\n      return hook\n    }\n    else if(hookElId || !el.getAttribute){\n      // no hook found\n      return\n    } else {\n      // new hook found with phx-hook attribute\n      let hookName = el.getAttribute(`data-phx-${PHX_HOOK}`) || el.getAttribute(this.binding(PHX_HOOK))\n      if(hookName && !this.ownsElement(el)){ return }\n      let callbacks = this.liveSocket.getHookCallbacks(hookName)\n\n      if(callbacks){\n        if(!el.id){ logError(`no DOM ID for hook \"${hookName}\". Hooks require a unique ID on each element.`, el) }\n        let hook = new ViewHook(this, el, callbacks)\n        this.viewHooks[ViewHook.elementID(hook.el)] = hook\n        return hook\n      } else if(hookName !== null){\n        logError(`unknown hook found for \"${hookName}\"`, el)\n      }\n    }\n  }\n\n  destroyHook(hook){\n    // __destroyed clears the elementID from the hook, therefore\n    // we need to get it before calling __destroyed\n    const hookId = ViewHook.elementID(hook.el)\n    hook.__destroyed()\n    hook.__cleanup__()\n    delete this.viewHooks[hookId]\n  }\n\n  applyPendingUpdates(){\n    this.pendingDiffs.forEach(({diff, events}) => this.update(diff, events))\n    this.pendingDiffs = []\n    this.eachChild(child => child.applyPendingUpdates())\n  }\n\n  eachChild(callback){\n    let children = this.root.children[this.id] || {}\n    for(let id in children){ callback(this.getChildById(id)) }\n  }\n\n  onChannel(event, cb){\n    this.liveSocket.onChannel(this.channel, event, resp => {\n      if(this.isJoinPending()){\n        this.root.pendingJoinOps.push([this, () => cb(resp)])\n      } else {\n        this.liveSocket.requestDOMUpdate(() => cb(resp))\n      }\n    })\n  }\n\n  bindChannel(){\n    // The diff event should be handled by the regular update operations.\n    // All other operations are queued to be applied only after join.\n    this.liveSocket.onChannel(this.channel, \"diff\", (rawDiff) => {\n      this.liveSocket.requestDOMUpdate(() => {\n        this.applyDiff(\"update\", rawDiff, ({diff, events}) => this.update(diff, events))\n      })\n    })\n    this.onChannel(\"redirect\", ({to, flash}) => this.onRedirect({to, flash}))\n    this.onChannel(\"live_patch\", (redir) => this.onLivePatch(redir))\n    this.onChannel(\"live_redirect\", (redir) => this.onLiveRedirect(redir))\n    this.channel.onError(reason => this.onError(reason))\n    this.channel.onClose(reason => this.onClose(reason))\n  }\n\n  destroyAllChildren(){ this.eachChild(child => child.destroy()) }\n\n  onLiveRedirect(redir){\n    let {to, kind, flash} = redir\n    let url = this.expandURL(to)\n    let e = new CustomEvent(\"phx:server-navigate\", {detail: {to, kind, flash}})\n    this.liveSocket.historyRedirect(e, url, kind, flash)\n  }\n\n  onLivePatch(redir){\n    let {to, kind} = redir\n    this.href = this.expandURL(to)\n    this.liveSocket.historyPatch(to, kind)\n  }\n\n  expandURL(to){\n    return to.startsWith(\"/\") ? `${window.location.protocol}//${window.location.host}${to}` : to\n  }\n\n  onRedirect({to, flash, reloadToken}){ this.liveSocket.redirect(to, flash, reloadToken) }\n\n  isDestroyed(){ return this.destroyed }\n\n  joinDead(){ this.isDead = true }\n\n  joinPush(){\n    this.joinPush = this.joinPush || this.channel.join()\n    return this.joinPush\n  }\n\n  join(callback){\n    this.showLoader(this.liveSocket.loaderTimeout)\n    this.bindChannel()\n    if(this.isMain()){\n      this.stopCallback = this.liveSocket.withPageLoading({to: this.href, kind: \"initial\"})\n    }\n    this.joinCallback = (onDone) => {\n      onDone = onDone || function(){}\n      callback ? callback(this.joinCount, onDone) : onDone()\n    }\n\n    this.wrapPush(() => this.channel.join(), {\n      ok: (resp) => this.liveSocket.requestDOMUpdate(() => this.onJoin(resp)),\n      error: (error) => this.onJoinError(error),\n      timeout: () => this.onJoinError({reason: \"timeout\"})\n    })\n  }\n\n  onJoinError(resp){\n    if(resp.reason === \"reload\"){\n      this.log(\"error\", () => [`failed mount with ${resp.status}. Falling back to page reload`, resp])\n      this.onRedirect({to: this.root.href, reloadToken: resp.token})\n      return\n    } else if(resp.reason === \"unauthorized\" || resp.reason === \"stale\"){\n      this.log(\"error\", () => [\"unauthorized live_redirect. Falling back to page request\", resp])\n      this.onRedirect({to: this.root.href})\n      return\n    }\n    if(resp.redirect || resp.live_redirect){\n      this.joinPending = false\n      this.channel.leave()\n    }\n    if(resp.redirect){ return this.onRedirect(resp.redirect) }\n    if(resp.live_redirect){ return this.onLiveRedirect(resp.live_redirect) }\n    this.log(\"error\", () => [\"unable to join\", resp])\n    if(this.isMain()){\n      this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n      if(this.liveSocket.isConnected()){ this.liveSocket.reloadWithJitter(this) }\n    } else {\n      if(this.joinAttempts >= MAX_CHILD_JOIN_ATTEMPTS){\n        // put the root review into permanent error state, but don't destroy it as it can remain active\n        this.root.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n        this.log(\"error\", () => [`giving up trying to mount after ${MAX_CHILD_JOIN_ATTEMPTS} tries`, resp])\n        this.destroy()\n      }\n      let trueChildEl = DOM.byId(this.el.id)\n      if(trueChildEl){\n        DOM.mergeAttrs(trueChildEl, this.el)\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n        this.el = trueChildEl\n      } else {\n        this.destroy()\n      }\n    }\n  }\n\n  onClose(reason){\n    if(this.isDestroyed()){ return }\n    if(this.isMain() && this.liveSocket.hasPendingLink() && reason !== \"leave\"){\n      return this.liveSocket.reloadWithJitter(this)\n    }\n    this.destroyAllChildren()\n    this.liveSocket.dropActiveElement(this)\n    // document.activeElement can be null in Internet Explorer 11\n    if(document.activeElement){ document.activeElement.blur() }\n    if(this.liveSocket.isUnloaded()){\n      this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT)\n    }\n  }\n\n  onError(reason){\n    this.onClose(reason)\n    if(this.liveSocket.isConnected()){ this.log(\"error\", () => [\"view crashed\", reason]) }\n    if(!this.liveSocket.isUnloaded()){\n      if(this.liveSocket.isConnected()){\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_SERVER_ERROR_CLASS])\n      } else {\n        this.displayError([PHX_LOADING_CLASS, PHX_ERROR_CLASS, PHX_CLIENT_ERROR_CLASS])\n      }\n    }\n  }\n\n  displayError(classes){\n    if(this.isMain()){ DOM.dispatchEvent(window, \"phx:page-loading-start\", {detail: {to: this.href, kind: \"error\"}}) }\n    this.showLoader()\n    this.setContainerClasses(...classes)\n    this.execAll(this.binding(\"disconnected\"))\n  }\n\n  wrapPush(callerPush, receives){\n    let latency = this.liveSocket.getLatencySim()\n    let withLatency = latency ?\n      (cb) => setTimeout(() => !this.isDestroyed() && cb(), latency) :\n      (cb) => !this.isDestroyed() && cb()\n\n    withLatency(() => {\n      callerPush()\n        .receive(\"ok\", resp => withLatency(() => receives.ok && receives.ok(resp)))\n        .receive(\"error\", reason => withLatency(() => receives.error && receives.error(reason)))\n        .receive(\"timeout\", () => withLatency(() => receives.timeout && receives.timeout()))\n    })\n  }\n\n  pushWithReply(refGenerator, event, payload){\n    if(!this.isConnected()){ return Promise.reject({error: \"noconnection\"}) }\n\n    let [ref, [el], opts] = refGenerator ? refGenerator() : [null, [], {}]\n    let oldJoinCount = this.joinCount\n    let onLoadingDone = function(){}\n    if(opts.page_loading){\n      onLoadingDone = this.liveSocket.withPageLoading({kind: \"element\", target: el})\n    }\n\n    if(typeof (payload.cid) !== \"number\"){ delete payload.cid }\n\n    return new Promise((resolve, reject) => {\n      this.wrapPush(() => this.channel.push(event, payload, PUSH_TIMEOUT), {\n        ok: (resp) => {\n          if(ref !== null){ this.lastAckRef = ref }\n          let finish = (hookReply) => {\n            if(resp.redirect){ this.onRedirect(resp.redirect) }\n            if(resp.live_patch){ this.onLivePatch(resp.live_patch) }\n            if(resp.live_redirect){ this.onLiveRedirect(resp.live_redirect) }\n            onLoadingDone()\n            resolve({resp: resp, reply: hookReply})\n          }\n          if(resp.diff){\n            this.liveSocket.requestDOMUpdate(() => {\n              this.applyDiff(\"update\", resp.diff, ({diff, reply, events}) => {\n                if(ref !== null){\n                  this.undoRefs(ref, payload.event)\n                }\n                this.update(diff, events)\n                finish(reply)\n              })\n            })\n          } else {\n            if(ref !== null){ this.undoRefs(ref, payload.event) }\n            finish(null)\n          }\n        },\n        error: (reason) => reject({error: reason}),\n        timeout: () => {\n          reject({timeout: true})\n          if(this.joinCount === oldJoinCount){\n            this.liveSocket.reloadWithJitter(this, () => {\n              this.log(\"timeout\", () => [\"received timeout while communicating with server. Falling back to hard refresh for recovery\"])\n            })\n          }\n        }\n      })\n    })\n  }\n\n  undoRefs(ref, phxEvent, onlyEls){\n    if(!this.isConnected()){ return } // exit if external form triggered\n    let selector = `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`\n\n    if(onlyEls){\n      onlyEls = new Set(onlyEls)\n      DOM.all(document, selector, parent => {\n        if(onlyEls && !onlyEls.has(parent)){ return }\n        // undo any child refs within parent first\n        DOM.all(parent, selector, child => this.undoElRef(child, ref, phxEvent))\n        this.undoElRef(parent, ref, phxEvent)\n      })\n    } else {\n      DOM.all(document, selector, el => this.undoElRef(el, ref, phxEvent))\n    }\n  }\n\n  undoElRef(el, ref, phxEvent){\n    let elRef = new ElementRef(el)\n\n    elRef.maybeUndo(ref, phxEvent, clonedTree => {\n      let hook = this.triggerBeforeUpdateHook(el, clonedTree)\n      DOMPatch.patchWithClonedTree(el, clonedTree, this.liveSocket)\n      DOM.all(el, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, child => this.undoElRef(child, ref, phxEvent))\n      this.execNewMounted(el)\n      if(hook){ hook.__updated() }\n    })\n  }\n\n  refSrc(){ return this.el.id }\n\n  putRef(elements, phxEvent, eventType, opts = {}){\n    let newRef = this.ref++\n    let disableWith = this.binding(PHX_DISABLE_WITH)\n    if(opts.loading){\n      let loadingEls = DOM.all(document, opts.loading).map(el => {\n        return {el, lock: true, loading: true}\n      })\n      elements = elements.concat(loadingEls)\n    }\n\n    for(let {el, lock, loading} of elements){\n      if(!lock && !loading){ throw new Error(\"putRef requires lock or loading\") }\n      el.setAttribute(PHX_REF_SRC, this.refSrc())\n      if(loading){ el.setAttribute(PHX_REF_LOADING, newRef) }\n      if(lock){ el.setAttribute(PHX_REF_LOCK, newRef) }\n\n      if(!loading || (opts.submitter && !(el === opts.submitter || el === opts.form))){ continue }\n\n      let lockCompletePromise = new Promise(resolve => {\n        el.addEventListener(`phx:undo-lock:${newRef}`, () => resolve(detail), {once: true})\n      })\n\n      let loadingCompletePromise = new Promise(resolve => {\n        el.addEventListener(`phx:undo-loading:${newRef}`, () => resolve(detail), {once: true})\n      })\n\n      el.classList.add(`phx-${eventType}-loading`)\n      let disableText = el.getAttribute(disableWith)\n      if(disableText !== null){\n        if(!el.getAttribute(PHX_DISABLE_WITH_RESTORE)){\n          el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText)\n        }\n        if(disableText !== \"\"){ el.innerText = disableText }\n        // PHX_DISABLED could have already been set in disableForm\n        el.setAttribute(PHX_DISABLED, el.getAttribute(PHX_DISABLED) || el.disabled)\n        el.setAttribute(\"disabled\", \"\")\n      }\n\n      let detail = {\n        event: phxEvent,\n        eventType: eventType,\n        ref: newRef,\n        isLoading: loading,\n        isLocked: lock,\n        lockElements: elements.filter(({lock}) => lock).map(({el}) => el),\n        loadingElements: elements.filter(({loading}) => loading).map(({el}) => el),\n        unlock: (els) => {\n          els = Array.isArray(els) ? els : [els]\n          this.undoRefs(newRef, phxEvent, els)\n        },\n        lockComplete: lockCompletePromise,\n        loadingComplete: loadingCompletePromise,\n        lock: (lockEl) => {\n          return new Promise(resolve => {\n            if(this.isAcked(newRef)){ return resolve(detail) }\n            lockEl.setAttribute(PHX_REF_LOCK, newRef)\n            lockEl.setAttribute(PHX_REF_SRC, this.refSrc())\n            lockEl.addEventListener(`phx:lock-stop:${newRef}`, () => resolve(detail), {once: true})\n          })\n        }\n      }\n      el.dispatchEvent(new CustomEvent(\"phx:push\", {\n        detail: detail,\n        bubbles: true,\n        cancelable: false\n      }))\n      if(phxEvent){\n        el.dispatchEvent(new CustomEvent(`phx:push:${phxEvent}`, {\n          detail: detail,\n          bubbles: true,\n          cancelable: false\n        }))\n      }\n    }\n    return [newRef, elements.map(({el}) => el), opts]\n  }\n\n  isAcked(ref){ return this.lastAckRef !== null && this.lastAckRef >= ref }\n\n  componentID(el){\n    let cid = el.getAttribute && el.getAttribute(PHX_COMPONENT)\n    return cid ? parseInt(cid) : null\n  }\n\n  targetComponentID(target, targetCtx, opts = {}){\n    if(isCid(targetCtx)){ return targetCtx }\n\n    let cidOrSelector = opts.target || target.getAttribute(this.binding(\"target\"))\n    if(isCid(cidOrSelector)){\n      return parseInt(cidOrSelector)\n    } else if(targetCtx && (cidOrSelector !== null || opts.target)){\n      return this.closestComponentID(targetCtx)\n    } else {\n      return null\n    }\n  }\n\n  closestComponentID(targetCtx){\n    if(isCid(targetCtx)){\n      return targetCtx\n    } else if(targetCtx){\n      return maybe(targetCtx.closest(`[${PHX_COMPONENT}]`), el => this.ownsElement(el) && this.componentID(el))\n    } else {\n      return null\n    }\n  }\n\n  pushHookEvent(el, targetCtx, event, payload, onReply){\n    if(!this.isConnected()){\n      this.log(\"hook\", () => [\"unable to push hook event. LiveView not connected\", event, payload])\n      return false\n    }\n    let [ref, els, opts] = this.putRef([{el, loading: true, lock: true}], event, \"hook\")\n    this.pushWithReply(() => [ref, els, opts], \"event\", {\n      type: \"hook\",\n      event: event,\n      value: payload,\n      cid: this.closestComponentID(targetCtx)\n    }).then(({resp: _resp, reply: hookReply}) => onReply(hookReply, ref))\n\n    return ref\n  }\n\n  extractMeta(el, meta, value){\n    let prefix = this.binding(\"value-\")\n    for(let i = 0; i < el.attributes.length; i++){\n      if(!meta){ meta = {} }\n      let name = el.attributes[i].name\n      if(name.startsWith(prefix)){ meta[name.replace(prefix, \"\")] = el.getAttribute(name) }\n    }\n    if(el.value !== undefined && !(el instanceof HTMLFormElement)){\n      if(!meta){ meta = {} }\n      meta.value = el.value\n\n      if(el.tagName === \"INPUT\" && CHECKABLE_INPUTS.indexOf(el.type) >= 0 && !el.checked){\n        delete meta.value\n      }\n    }\n    if(value){\n      if(!meta){ meta = {} }\n      for(let key in value){ meta[key] = value[key] }\n    }\n    return meta\n  }\n\n  pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}, onReply){\n    this.pushWithReply(() => this.putRef([{el, loading: true, lock: true}], phxEvent, type, opts), \"event\", {\n      type: type,\n      event: phxEvent,\n      value: this.extractMeta(el, meta, opts.value),\n      cid: this.targetComponentID(el, targetCtx, opts)\n    }).then(({reply}) => onReply && onReply(reply))\n  }\n\n  pushFileProgress(fileEl, entryRef, progress, onReply = function (){ }){\n    this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => {\n      view.pushWithReply(null, \"progress\", {\n        event: fileEl.getAttribute(view.binding(PHX_PROGRESS)),\n        ref: fileEl.getAttribute(PHX_UPLOAD_REF),\n        entry_ref: entryRef,\n        progress: progress,\n        cid: view.targetComponentID(fileEl.form, targetCtx)\n      }).then(({resp}) => onReply(resp))\n    })\n  }\n\n  pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback){\n    if(!inputEl.form){\n      throw new Error(\"form events require the input to be inside a form\")\n    }\n\n    let uploads\n    let cid = isCid(forceCid) ? forceCid : this.targetComponentID(inputEl.form, targetCtx, opts)\n    let refGenerator = () => {\n      return this.putRef([\n        {el: inputEl, loading: true, lock: true},\n        {el: inputEl.form, loading: true, lock: true}\n      ], phxEvent, \"change\", opts)\n    }\n    let formData\n    let meta  = this.extractMeta(inputEl.form)\n    if(inputEl instanceof HTMLButtonElement){ meta.submitter = inputEl }\n    if(inputEl.getAttribute(this.binding(\"change\"))){\n      formData = serializeForm(inputEl.form, {_target: opts._target, ...meta}, [inputEl.name])\n    } else {\n      formData = serializeForm(inputEl.form, {_target: opts._target, ...meta})\n    }\n    if(DOM.isUploadInput(inputEl) && inputEl.files && inputEl.files.length > 0){\n      LiveUploader.trackFiles(inputEl, Array.from(inputEl.files))\n    }\n    uploads = LiveUploader.serializeUploads(inputEl)\n\n    let event = {\n      type: \"form\",\n      event: phxEvent,\n      value: formData,\n      uploads: uploads,\n      cid: cid\n    }\n    this.pushWithReply(refGenerator, \"event\", event).then(({resp}) => {\n      if(DOM.isUploadInput(inputEl) && DOM.isAutoUpload(inputEl)){\n        if(LiveUploader.filesAwaitingPreflight(inputEl).length > 0){\n          let [ref, _els] = refGenerator()\n          this.undoRefs(ref, phxEvent, [inputEl.form])\n          this.uploadFiles(inputEl.form, phxEvent, targetCtx, ref, cid, (_uploads) => {\n            callback && callback(resp)\n            this.triggerAwaitingSubmit(inputEl.form, phxEvent)\n            this.undoRefs(ref, phxEvent)\n          })\n        }\n      } else {\n        callback && callback(resp)\n      }\n    })\n  }\n\n  triggerAwaitingSubmit(formEl, phxEvent){\n    let awaitingSubmit = this.getScheduledSubmit(formEl)\n    if(awaitingSubmit){\n      let [_el, _ref, _opts, callback] = awaitingSubmit\n      this.cancelSubmit(formEl, phxEvent)\n      callback()\n    }\n  }\n\n  getScheduledSubmit(formEl){\n    return this.formSubmits.find(([el, _ref, _opts, _callback]) => el.isSameNode(formEl))\n  }\n\n  scheduleSubmit(formEl, ref, opts, callback){\n    if(this.getScheduledSubmit(formEl)){ return true }\n    this.formSubmits.push([formEl, ref, opts, callback])\n  }\n\n  cancelSubmit(formEl, phxEvent){\n    this.formSubmits = this.formSubmits.filter(([el, ref, _opts, _callback]) => {\n      if(el.isSameNode(formEl)){\n        this.undoRefs(ref, phxEvent)\n        return false\n      } else {\n        return true\n      }\n    })\n  }\n\n  disableForm(formEl, phxEvent, opts = {}){\n    let filterIgnored = el => {\n      let userIgnored = closestPhxBinding(el, `${this.binding(PHX_UPDATE)}=ignore`, el.form)\n      return !(userIgnored || closestPhxBinding(el, \"data-phx-update=ignore\", el.form))\n    }\n    let filterDisables = el => {\n      return el.hasAttribute(this.binding(PHX_DISABLE_WITH))\n    }\n    let filterButton = el => el.tagName == \"BUTTON\"\n\n    let filterInput = el => [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(el.tagName)\n\n    let formElements = Array.from(formEl.elements)\n    let disables = formElements.filter(filterDisables)\n    let buttons = formElements.filter(filterButton).filter(filterIgnored)\n    let inputs = formElements.filter(filterInput).filter(filterIgnored)\n\n    buttons.forEach(button => {\n      button.setAttribute(PHX_DISABLED, button.disabled)\n      button.disabled = true\n    })\n    inputs.forEach(input => {\n      input.setAttribute(PHX_READONLY, input.readOnly)\n      input.readOnly = true\n      if(input.files){\n        input.setAttribute(PHX_DISABLED, input.disabled)\n        input.disabled = true\n      }\n    })\n    let formEls = disables.concat(buttons).concat(inputs).map(el => {\n      return {el, loading: true, lock: true}\n    })\n\n    // we reverse the order so form children are already locked by the time\n    // the form is locked\n    let els = [{el: formEl, loading: true, lock: false}].concat(formEls).reverse()\n    return this.putRef(els, phxEvent, \"submit\", opts)\n  }\n\n  pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply){\n    let refGenerator = () => this.disableForm(formEl, phxEvent, {\n      ...opts,\n      form: formEl,\n      submitter: submitter\n    })\n    let cid = this.targetComponentID(formEl, targetCtx)\n    if(LiveUploader.hasUploadsInProgress(formEl)){\n      let [ref, _els] = refGenerator()\n      let push = () => this.pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply)\n      return this.scheduleSubmit(formEl, ref, opts, push)\n    } else if(LiveUploader.inputsAwaitingPreflight(formEl).length > 0){\n      let [ref, els] = refGenerator()\n      let proxyRefGen = () => [ref, els, opts]\n      this.uploadFiles(formEl, phxEvent, targetCtx, ref, cid, (_uploads) => {\n        // if we still having pending preflights it means we have invalid entries\n        // and the phx-submit cannot be completed\n        if(LiveUploader.inputsAwaitingPreflight(formEl).length > 0){\n          return this.undoRefs(ref, phxEvent)\n        }\n        let meta = this.extractMeta(formEl)\n        let formData = serializeForm(formEl, {submitter, ...meta})\n        this.pushWithReply(proxyRefGen, \"event\", {\n          type: \"form\",\n          event: phxEvent,\n          value: formData,\n          cid: cid\n        }).then(({resp}) => onReply(resp))\n      })\n    } else if(!(formEl.hasAttribute(PHX_REF_SRC) && formEl.classList.contains(\"phx-submit-loading\"))){\n      let meta = this.extractMeta(formEl)\n      let formData = serializeForm(formEl, {submitter, ...meta})\n      this.pushWithReply(refGenerator, \"event\", {\n        type: \"form\",\n        event: phxEvent,\n        value: formData,\n        cid: cid\n      }).then(({resp}) => onReply(resp))\n    }\n  }\n\n  uploadFiles(formEl, phxEvent, targetCtx, ref, cid, onComplete){\n    let joinCountAtUpload = this.joinCount\n    let inputEls = LiveUploader.activeFileInputs(formEl)\n    let numFileInputsInProgress = inputEls.length\n\n    // get each file input\n    inputEls.forEach(inputEl => {\n      let uploader = new LiveUploader(inputEl, this, () => {\n        numFileInputsInProgress--\n        if(numFileInputsInProgress === 0){ onComplete() }\n      })\n\n      let entries = uploader.entries().map(entry => entry.toPreflightPayload())\n\n      if(entries.length === 0){\n        numFileInputsInProgress--\n        return\n      }\n\n      let payload = {\n        ref: inputEl.getAttribute(PHX_UPLOAD_REF),\n        entries: entries,\n        cid: this.targetComponentID(inputEl.form, targetCtx)\n      }\n\n      this.log(\"upload\", () => [\"sending preflight request\", payload])\n\n      this.pushWithReply(null, \"allow_upload\", payload).then(({resp}) => {\n        this.log(\"upload\", () => [\"got preflight response\", resp])\n        // the preflight will reject entries beyond the max entries\n        // so we error and cancel entries on the client that are missing from the response\n        uploader.entries().forEach(entry => {\n          if(resp.entries && !resp.entries[entry.ref]){\n            this.handleFailedEntryPreflight(entry.ref, \"failed preflight\", uploader)\n          }\n        })\n        // for auto uploads, we may have an empty entries response from the server\n        // for form submits that contain invalid entries\n        if(resp.error || Object.keys(resp.entries).length === 0){\n          this.undoRefs(ref, phxEvent)\n          let errors = resp.error || []\n          errors.map(([entry_ref, reason]) => {\n            this.handleFailedEntryPreflight(entry_ref, reason, uploader)\n          })\n        } else {\n          let onError = (callback) => {\n            this.channel.onError(() => {\n              if(this.joinCount === joinCountAtUpload){ callback() }\n            })\n          }\n          uploader.initAdapterUpload(resp, onError, this.liveSocket)\n        }\n      })\n    })\n  }\n\n  handleFailedEntryPreflight(uploadRef, reason, uploader){\n    if(uploader.isAutoUpload()){\n      // uploadRef may be top level upload config ref or entry ref\n      let entry = uploader.entries().find(entry => entry.ref === uploadRef.toString())\n      if(entry){ entry.cancel() }\n    } else {\n      uploader.entries().map(entry => entry.cancel())\n    }\n    this.log(\"upload\", () => [`error for entry ${uploadRef}`, reason])\n  }\n\n  dispatchUploads(targetCtx, name, filesOrBlobs){\n    let targetElement = this.targetCtxElement(targetCtx) || this.el\n    let inputs = DOM.findUploadInputs(targetElement).filter(el => el.name === name)\n    if(inputs.length === 0){ logError(`no live file inputs found matching the name \"${name}\"`) }\n    else if(inputs.length > 1){ logError(`duplicate live file inputs found matching the name \"${name}\"`) }\n    else { DOM.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, {detail: {files: filesOrBlobs}}) }\n  }\n\n  targetCtxElement(targetCtx){\n    if(isCid(targetCtx)){\n      let [target] = DOM.findComponentNodeList(this.el, targetCtx)\n      return target\n    } else if(targetCtx){\n      return targetCtx\n    } else {\n      return null\n    }\n  }\n\n  pushFormRecovery(oldForm, newForm, templateDom, callback){\n    // we are only recovering forms inside the current view, therefore it is safe to\n    // skip withinOwners here and always use this when referring to the view\n    const phxChange = this.binding(\"change\")\n    const phxTarget = newForm.getAttribute(this.binding(\"target\")) || newForm\n    const phxEvent = newForm.getAttribute(this.binding(PHX_AUTO_RECOVER)) || newForm.getAttribute(this.binding(\"change\"))\n    const inputs = Array.from(oldForm.elements).filter(el => DOM.isFormInput(el) && el.name && !el.hasAttribute(phxChange))\n    if(inputs.length === 0){ return }\n\n    // we must clear tracked uploads before recovery as they no longer have valid refs\n    inputs.forEach(input => input.hasAttribute(PHX_UPLOAD_REF) && LiveUploader.clearFiles(input))\n    // pushInput assumes that there is a source element that initiated the change;\n    // because this is not the case when we recover forms, we provide the first input we find\n    let input = inputs.find(el => el.type !== \"hidden\") || inputs[0]\n\n    // in the case that there are multiple targets, we count the number of pending recovery events\n    // and only call the callback once all events have been processed\n    let pending = 0\n    // withinTargets(phxTarget, callback, dom, viewEl)\n    this.withinTargets(phxTarget, (targetView, targetCtx) => {\n      const cid = this.targetComponentID(newForm, targetCtx)\n      pending++\n      let e = new CustomEvent(\"phx:form-recovery\", {detail: {sourceElement: oldForm}})\n      JS.exec(e, \"change\", phxEvent, this, input, [\"push\", {\n        _target: input.name,\n        targetView,\n        targetCtx,\n        newCid: cid,\n        callback: () => {\n          pending--\n          if(pending === 0){ callback() }\n        }\n      }])\n    }, templateDom, templateDom)\n  }\n\n  pushLinkPatch(e, href, targetEl, callback){\n    let linkRef = this.liveSocket.setPendingLink(href)\n    // only add loading states if event is trusted (it was triggered by user, such as click) and\n    // it's not a forward/back navigation from popstate\n    let loading = e.isTrusted && e.type !== \"popstate\"\n    let refGen = targetEl ? () => this.putRef([{el: targetEl, loading: loading, lock: true}], null, \"click\") : null\n    let fallback = () => this.liveSocket.redirect(window.location.href)\n    let url = href.startsWith(\"/\") ? `${location.protocol}//${location.host}${href}` : href\n\n    this.pushWithReply(refGen, \"live_patch\", {url}).then(\n      ({resp}) => {\n        this.liveSocket.requestDOMUpdate(() => {\n          if(resp.link_redirect){\n            this.liveSocket.replaceMain(href, null, callback, linkRef)\n          } else {\n            if(this.liveSocket.commitPendingLink(linkRef)){\n              this.href = href\n            }\n            this.applyPendingUpdates()\n            callback && callback(linkRef)\n          }\n        })\n      },\n      ({error: _error, timeout: _timeout}) => fallback()\n    )\n  }\n\n  getFormsForRecovery(){\n    if(this.joinCount === 0){ return {} }\n\n    let phxChange = this.binding(\"change\")\n\n    return DOM.all(this.el, `form[${phxChange}]`)\n      .filter(form => form.id)\n      .filter(form => form.elements.length > 0)\n      .filter(form => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== \"ignore\")\n      .map(form => form.cloneNode(true))\n      .reduce((acc, form) => {\n        acc[form.id] = form\n        return acc\n      }, {})\n  }\n\n  maybePushComponentsDestroyed(destroyedCIDs){\n    let willDestroyCIDs = destroyedCIDs.filter(cid => {\n      return DOM.findComponentNodeList(this.el, cid).length === 0\n    })\n\n    if(willDestroyCIDs.length > 0){\n      // we must reset the render change tracking for cids that\n      // could be added back from the server so we don't skip them\n      willDestroyCIDs.forEach(cid => this.rendered.resetRender(cid))\n\n      this.pushWithReply(null, \"cids_will_destroy\", {cids: willDestroyCIDs}).then(() => {\n        // we must wait for pending transitions to complete before determining\n        // if the cids were added back to the DOM in the meantime (#3139)\n        this.liveSocket.requestDOMUpdate(() => {\n          // See if any of the cids we wanted to destroy were added back,\n          // if they were added back, we don't actually destroy them.\n          let completelyDestroyCIDs = willDestroyCIDs.filter(cid => {\n            return DOM.findComponentNodeList(this.el, cid).length === 0\n          })\n\n          if(completelyDestroyCIDs.length > 0){\n            this.pushWithReply(null, \"cids_destroyed\", {cids: completelyDestroyCIDs}).then(({resp}) => {\n              this.rendered.pruneCIDs(resp.cids)\n            })\n          }\n        })\n      })\n    }\n  }\n\n  ownsElement(el){\n    let parentViewEl = el.closest(PHX_VIEW_SELECTOR)\n    return el.getAttribute(PHX_PARENT_ID) === this.id ||\n      (parentViewEl && parentViewEl.id === this.id) ||\n      (!parentViewEl && this.isDead)\n  }\n\n  submitForm(form, targetCtx, phxEvent, submitter, opts = {}){\n    DOM.putPrivate(form, PHX_HAS_SUBMITTED, true)\n    const inputs = Array.from(form.elements)\n    inputs.forEach(input => DOM.putPrivate(input, PHX_HAS_SUBMITTED, true))\n    this.liveSocket.blurActiveElement(this)\n    this.pushFormSubmit(form, targetCtx, phxEvent, submitter, opts, () => {\n      this.liveSocket.restorePreviouslyActiveFocus()\n    })\n  }\n\n  binding(kind){ return this.liveSocket.binding(kind) }\n}\n", "/** Initializes the LiveSocket\n *\n *\n * @param {string} endPoint - The string WebSocket endpoint, ie, `\"wss://example.com/live\"`,\n *                                               `\"/live\"` (inherited host & protocol)\n * @param {Phoenix.Socket} socket - the required Phoenix Socket class imported from \"phoenix\". For example:\n *\n *     import {Socket} from \"phoenix\"\n *     import {LiveSocket} from \"phoenix_live_view\"\n *     let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n *\n * @param {Object} [opts] - Optional configuration. Outside of keys listed below, all\n * configuration is passed directly to the Phoenix Socket constructor.\n * @param {Object} [opts.defaults] - The optional defaults to use for various bindings,\n * such as `phx-debounce`. Supports the following keys:\n *\n *   - debounce - the millisecond phx-debounce time. Defaults 300\n *   - throttle - the millisecond phx-throttle time. Defaults 300\n *\n * @param {Function} [opts.params] - The optional function for passing connect params.\n * The function receives the element associated with a given LiveView. For example:\n *\n *     (el) => {view: el.getAttribute(\"data-my-view-name\", token: window.myToken}\n *\n * @param {string} [opts.bindingPrefix] - The optional prefix to use for all phx DOM annotations.\n * Defaults to \"phx-\".\n * @param {Object} [opts.hooks] - The optional object for referencing LiveView hook callbacks.\n * @param {Object} [opts.uploaders] - The optional object for referencing LiveView uploader callbacks.\n * @param {integer} [opts.loaderTimeout] - The optional delay in milliseconds to wait before apply\n * loading states.\n * @param {integer} [opts.maxReloads] - The maximum reloads before entering failsafe mode.\n * @param {integer} [opts.reloadJitterMin] - The minimum time between normal reload attempts.\n * @param {integer} [opts.reloadJitterMax] - The maximum time between normal reload attempts.\n * @param {integer} [opts.failsafeJitter] - The time between reload attempts in failsafe mode.\n * @param {Function} [opts.viewLogger] - The optional function to log debug information. For example:\n *\n *     (view, kind, msg, obj) => console.log(`${view.id} ${kind}: ${msg} - `, obj)\n *\n * @param {Object} [opts.metadata] - The optional object mapping event names to functions for\n * populating event metadata. For example:\n *\n *     metadata: {\n *       click: (e, el) => {\n *         return {\n *           ctrlKey: e.ctrlKey,\n *           metaKey: e.metaKey,\n *           detail: e.detail || 1,\n *         }\n *       },\n *       keydown: (e, el) => {\n *         return {\n *           key: e.key,\n *           ctrlKey: e.ctrlKey,\n *           metaKey: e.metaKey,\n *           shiftKey: e.shiftKey\n *         }\n *       }\n *     }\n * @param {Object} [opts.sessionStorage] - An optional Storage compatible object\n * Useful when LiveView won't have access to `sessionStorage`.  For example, This could\n * happen if a site loads a cross-domain LiveView in an iframe.  Example usage:\n *\n *     class InMemoryStorage {\n *       constructor() { this.storage = {} }\n *       getItem(keyName) { return this.storage[keyName] || null }\n *       removeItem(keyName) { delete this.storage[keyName] }\n *       setItem(keyName, keyValue) { this.storage[keyName] = keyValue }\n *     }\n *\n * @param {Object} [opts.localStorage] - An optional Storage compatible object\n * Useful for when LiveView won't have access to `localStorage`.\n * See `opts.sessionStorage` for examples.\n*/\n\nimport {\n  BINDING_PREFIX,\n  CONSECUTIVE_RELOADS,\n  DEFAULTS,\n  FAILSAFE_JITTER,\n  LOADER_TIMEOUT,\n  MAX_RELOADS,\n  PHX_DEBOUNCE,\n  PHX_DROP_TARGET,\n  PHX_HAS_FOCUSED,\n  PHX_KEY,\n  PHX_LINK_STATE,\n  PHX_LIVE_LINK,\n  PHX_LV_DEBUG,\n  PHX_LV_LATENCY_SIM,\n  PHX_LV_PROFILE,\n  PHX_LV_HISTORY_POSITION,\n  PHX_MAIN,\n  PHX_PARENT_ID,\n  PHX_VIEW_SELECTOR,\n  PHX_ROOT_ID,\n  PHX_THROTTLE,\n  PHX_TRACK_UPLOADS,\n  PHX_SESSION,\n  RELOAD_JITTER_MIN,\n  RELOAD_JITTER_MAX,\n  PHX_REF_SRC,\n  PHX_RELOAD_STATUS\n} from \"./constants\"\n\nimport {\n  clone,\n  closestPhxBinding,\n  closure,\n  debug,\n  maybe\n} from \"./utils\"\n\nimport Browser from \"./browser\"\nimport DOM from \"./dom\"\nimport Hooks from \"./hooks\"\nimport LiveUploader from \"./live_uploader\"\nimport View from \"./view\"\nimport JS from \"./js\"\n\nexport let isUsedInput = (el) => DOM.isUsedInput(el)\n\nexport default class LiveSocket {\n  constructor(url, phxSocket, opts = {}){\n    this.unloaded = false\n    if(!phxSocket || phxSocket.constructor.name === \"Object\"){\n      throw new Error(`\n      a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:\n\n          import {Socket} from \"phoenix\"\n          import {LiveSocket} from \"phoenix_live_view\"\n          let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n      `)\n    }\n    this.socket = new phxSocket(url, opts)\n    this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX\n    this.opts = opts\n    this.params = closure(opts.params || {})\n    this.viewLogger = opts.viewLogger\n    this.metadataCallbacks = opts.metadata || {}\n    this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {})\n    this.activeElement = null\n    this.prevActive = null\n    this.silenced = false\n    this.main = null\n    this.outgoingMainEl = null\n    this.clickStartedAtTarget = null\n    this.linkRef = 1\n    this.roots = {}\n    this.href = window.location.href\n    this.pendingLink = null\n    this.currentLocation = clone(window.location)\n    this.hooks = opts.hooks || {}\n    this.uploaders = opts.uploaders || {}\n    this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT\n    this.reloadWithJitterTimer = null\n    this.maxReloads = opts.maxReloads || MAX_RELOADS\n    this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN\n    this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX\n    this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER\n    this.localStorage = opts.localStorage || window.localStorage\n    this.sessionStorage = opts.sessionStorage || window.sessionStorage\n    this.boundTopLevelEvents = false\n    this.boundEventNames = new Set()\n    this.serverCloseRef = null\n    this.domCallbacks = Object.assign({\n      jsQuerySelectorAll: null,\n      onPatchStart: closure(),\n      onPatchEnd: closure(),\n      onNodeAdded: closure(),\n      onBeforeElUpdated: closure()},\n    opts.dom || {})\n    this.transitions = new TransitionSet()\n    this.currentHistoryPosition = parseInt(this.sessionStorage.getItem(PHX_LV_HISTORY_POSITION)) || 0\n    window.addEventListener(\"pagehide\", _e => {\n      this.unloaded = true\n    })\n    this.socket.onOpen(() => {\n      if(this.isUnloaded()){\n        // reload page if being restored from back/forward cache and browser does not emit \"pageshow\"\n        window.location.reload()\n      }\n    })\n  }\n\n  // public\n\n  version(){ return LV_VSN }\n\n  isProfileEnabled(){ return this.sessionStorage.getItem(PHX_LV_PROFILE) === \"true\" }\n\n  isDebugEnabled(){ return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"true\" }\n\n  isDebugDisabled(){ return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"false\" }\n\n  enableDebug(){ this.sessionStorage.setItem(PHX_LV_DEBUG, \"true\") }\n\n  enableProfiling(){ this.sessionStorage.setItem(PHX_LV_PROFILE, \"true\") }\n\n  disableDebug(){ this.sessionStorage.setItem(PHX_LV_DEBUG, \"false\") }\n\n  disableProfiling(){ this.sessionStorage.removeItem(PHX_LV_PROFILE) }\n\n  enableLatencySim(upperBoundMs){\n    this.enableDebug()\n    console.log(\"latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable\")\n    this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs)\n  }\n\n  disableLatencySim(){ this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM) }\n\n  getLatencySim(){\n    let str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM)\n    return str ? parseInt(str) : null\n  }\n\n  getSocket(){ return this.socket }\n\n  connect(){\n    // enable debug by default if on localhost and not explicitly disabled\n    if(window.location.hostname === \"localhost\" && !this.isDebugDisabled()){ this.enableDebug() }\n    let doConnect = () => {\n      this.resetReloadStatus()\n      if(this.joinRootViews()){\n        this.bindTopLevelEvents()\n        this.socket.connect()\n      } else if(this.main){\n        this.socket.connect()\n      } else {\n        this.bindTopLevelEvents({dead: true})\n      }\n      this.joinDeadView()\n    }\n    if([\"complete\", \"loaded\", \"interactive\"].indexOf(document.readyState) >= 0){\n      doConnect()\n    } else {\n      document.addEventListener(\"DOMContentLoaded\", () => doConnect())\n    }\n  }\n\n  disconnect(callback){\n    clearTimeout(this.reloadWithJitterTimer)\n    // remove the socket close listener to avoid trying to handle\n    // a server close event when it is actually caused by us disconnecting\n    if(this.serverCloseRef){\n      this.socket.off(this.serverCloseRef)\n      this.serverCloseRef = null\n    }\n    this.socket.disconnect(callback)\n  }\n\n  replaceTransport(transport){\n    clearTimeout(this.reloadWithJitterTimer)\n    this.socket.replaceTransport(transport)\n    this.connect()\n  }\n\n  execJS(el, encodedJS, eventType = null){\n    let e = new CustomEvent(\"phx:exec\", {detail: {sourceElement: el}})\n    this.owner(el, view => JS.exec(e, eventType, encodedJS, view, el))\n  }\n\n  // private\n\n  execJSHookPush(el, phxEvent, data, callback){\n    this.withinOwners(el, view => {\n      let e = new CustomEvent(\"phx:exec\", {detail: {sourceElement: el}})\n      JS.exec(e, \"hook\", phxEvent, view, el, [\"push\", {data, callback}])\n    })\n  }\n\n  unload(){\n    if(this.unloaded){ return }\n    if(this.main && this.isConnected()){ this.log(this.main, \"socket\", () => [\"disconnect for page nav\"]) }\n    this.unloaded = true\n    this.destroyAllViews()\n    this.disconnect()\n  }\n\n  triggerDOM(kind, args){ this.domCallbacks[kind](...args) }\n\n  time(name, func){\n    if(!this.isProfileEnabled() || !console.time){ return func() }\n    console.time(name)\n    let result = func()\n    console.timeEnd(name)\n    return result\n  }\n\n  log(view, kind, msgCallback){\n    if(this.viewLogger){\n      let [msg, obj] = msgCallback()\n      this.viewLogger(view, kind, msg, obj)\n    } else if(this.isDebugEnabled()){\n      let [msg, obj] = msgCallback()\n      debug(view, kind, msg, obj)\n    }\n  }\n\n  requestDOMUpdate(callback){\n    this.transitions.after(callback)\n  }\n\n  transition(time, onStart, onDone = function(){}){\n    this.transitions.addTransition(time, onStart, onDone)\n  }\n\n  onChannel(channel, event, cb){\n    channel.on(event, data => {\n      let latency = this.getLatencySim()\n      if(!latency){\n        cb(data)\n      } else {\n        setTimeout(() => cb(data), latency)\n      }\n    })\n  }\n\n  reloadWithJitter(view, log){\n    clearTimeout(this.reloadWithJitterTimer)\n    this.disconnect()\n    let minMs = this.reloadJitterMin\n    let maxMs = this.reloadJitterMax\n    let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs\n    let tries = Browser.updateLocal(this.localStorage, window.location.pathname, CONSECUTIVE_RELOADS, 0, count => count + 1)\n    if(tries >= this.maxReloads){\n      afterMs = this.failsafeJitter\n    }\n    this.reloadWithJitterTimer = setTimeout(() => {\n      // if view has recovered, such as transport replaced, then cancel\n      if(view.isDestroyed() || view.isConnected()){ return }\n      view.destroy()\n      log ? log() : this.log(view, \"join\", () => [`encountered ${tries} consecutive reloads`])\n      if(tries >= this.maxReloads){\n        this.log(view, \"join\", () => [`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`])\n      }\n      if(this.hasPendingLink()){\n        window.location = this.pendingLink\n      } else {\n        window.location.reload()\n      }\n    }, afterMs)\n  }\n\n  getHookCallbacks(name){\n    return name && name.startsWith(\"Phoenix.\") ? Hooks[name.split(\".\")[1]] : this.hooks[name]\n  }\n\n  isUnloaded(){ return this.unloaded }\n\n  isConnected(){ return this.socket.isConnected() }\n\n  getBindingPrefix(){ return this.bindingPrefix }\n\n  binding(kind){ return `${this.getBindingPrefix()}${kind}` }\n\n  channel(topic, params){ return this.socket.channel(topic, params) }\n\n  joinDeadView(){\n    let body = document.body\n    if(body && !this.isPhxView(body) && !this.isPhxView(document.firstElementChild)){\n      let view = this.newRootView(body)\n      view.setHref(this.getHref())\n      view.joinDead()\n      if(!this.main){ this.main = view }\n      window.requestAnimationFrame(() => {\n        view.execNewMounted()\n        // restore scroll position when navigating from an external / non-live page\n        this.maybeScroll(history.state?.scroll)\n      })\n    }\n  }\n\n  joinRootViews(){\n    let rootsFound = false\n    DOM.all(document, `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, rootEl => {\n      if(!this.getRootById(rootEl.id)){\n        let view = this.newRootView(rootEl)\n        // stickies cannot be mounted at the router and therefore should not\n        // get a href set on them\n        if(!DOM.isPhxSticky(rootEl)){ view.setHref(this.getHref()) }\n        view.join()\n        if(rootEl.hasAttribute(PHX_MAIN)){ this.main = view }\n      }\n      rootsFound = true\n    })\n    return rootsFound\n  }\n\n  redirect(to, flash, reloadToken){\n    if(reloadToken){ Browser.setCookie(PHX_RELOAD_STATUS, reloadToken, 60) }\n    this.unload()\n    Browser.redirect(to, flash)\n  }\n\n  replaceMain(href, flash, callback = null, linkRef = this.setPendingLink(href)){\n    let liveReferer = this.currentLocation.href\n    this.outgoingMainEl = this.outgoingMainEl || this.main.el\n    let removeEls = DOM.all(this.outgoingMainEl, `[${this.binding(\"remove\")}]`)\n    let newMainEl = DOM.cloneNode(this.outgoingMainEl, \"\")\n    this.main.showLoader(this.loaderTimeout)\n    this.main.destroy()\n\n    this.main = this.newRootView(newMainEl, flash, liveReferer)\n    this.main.setRedirect(href)\n    this.transitionRemoves(removeEls, true)\n    this.main.join((joinCount, onDone) => {\n      if(joinCount === 1 && this.commitPendingLink(linkRef)){\n        this.requestDOMUpdate(() => {\n          // remove phx-remove els right before we replace the main element\n          removeEls.forEach(el => el.remove())\n          DOM.findPhxSticky(document).forEach(el => newMainEl.appendChild(el))\n          this.outgoingMainEl.replaceWith(newMainEl)\n          this.outgoingMainEl = null\n          callback && callback(linkRef)\n          onDone()\n        })\n      }\n    })\n  }\n\n  transitionRemoves(elements, skipSticky, callback){\n    let removeAttr = this.binding(\"remove\")\n    if(skipSticky){\n      const stickies = DOM.findPhxSticky(document) || []\n      elements = elements.filter(el => !DOM.isChildOfAny(el, stickies))\n    }\n    let silenceEvents = (e) => {\n      e.preventDefault()\n      e.stopImmediatePropagation()\n    }\n    elements.forEach(el => {\n      // prevent all listeners we care about from bubbling to window\n      // since we are removing the element\n      for(let event of this.boundEventNames){\n        el.addEventListener(event, silenceEvents, true)\n      }\n      this.execJS(el, el.getAttribute(removeAttr), \"remove\")\n    })\n    // remove the silenced listeners when transitions are done incase the element is re-used\n    // and call caller's callback as soon as we are done with transitions\n    this.requestDOMUpdate(() => {\n      elements.forEach(el => {\n        for(let event of this.boundEventNames){\n          el.removeEventListener(event, silenceEvents, true)\n        }\n      })\n      callback && callback()\n    })\n  }\n\n  isPhxView(el){ return el.getAttribute && el.getAttribute(PHX_SESSION) !== null }\n\n  newRootView(el, flash, liveReferer){\n    let view = new View(el, this, null, flash, liveReferer)\n    this.roots[view.id] = view\n    return view\n  }\n\n  owner(childEl, callback){\n    let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), el => this.getViewByEl(el)) || this.main\n    return view && callback ? callback(view) : view\n  }\n\n  withinOwners(childEl, callback){\n    this.owner(childEl, view => callback(view, childEl))\n  }\n\n  getViewByEl(el){\n    let rootId = el.getAttribute(PHX_ROOT_ID)\n    return maybe(this.getRootById(rootId), root => root.getDescendentByEl(el))\n  }\n\n  getRootById(id){ return this.roots[id] }\n\n  destroyAllViews(){\n    for(let id in this.roots){\n      this.roots[id].destroy()\n      delete this.roots[id]\n    }\n    this.main = null\n  }\n\n  destroyViewByEl(el){\n    let root = this.getRootById(el.getAttribute(PHX_ROOT_ID))\n    if(root && root.id === el.id){\n      root.destroy()\n      delete this.roots[root.id]\n    } else if(root){\n      root.destroyDescendent(el.id)\n    }\n  }\n\n  getActiveElement(){\n    return document.activeElement\n  }\n\n  dropActiveElement(view){\n    if(this.prevActive && view.ownsElement(this.prevActive)){\n      this.prevActive = null\n    }\n  }\n\n  restorePreviouslyActiveFocus(){\n    if(this.prevActive && this.prevActive !== document.body){\n      this.prevActive.focus()\n    }\n  }\n\n  blurActiveElement(){\n    this.prevActive = this.getActiveElement()\n    if(this.prevActive !== document.body){ this.prevActive.blur() }\n  }\n\n  bindTopLevelEvents({dead} = {}){\n    if(this.boundTopLevelEvents){ return }\n\n    this.boundTopLevelEvents = true\n    // enter failsafe reload if server has gone away intentionally, such as \"disconnect\" broadcast\n    this.serverCloseRef = this.socket.onClose(event => {\n      // failsafe reload if normal closure and we still have a main LV\n      if(event && event.code === 1000 && this.main){ return this.reloadWithJitter(this.main) }\n    })\n    document.body.addEventListener(\"click\", function (){ }) // ensure all click events bubble for mobile Safari\n    window.addEventListener(\"pageshow\", e => {\n      if(e.persisted){ // reload page if being restored from back/forward cache\n        this.getSocket().disconnect()\n        this.withPageLoading({to: window.location.href, kind: \"redirect\"})\n        window.location.reload()\n      }\n    }, true)\n    if(!dead){ this.bindNav() }\n    this.bindClicks()\n    if(!dead){ this.bindForms() }\n    this.bind({keyup: \"keyup\", keydown: \"keydown\"}, (e, type, view, targetEl, phxEvent, _phxTarget) => {\n      let matchKey = targetEl.getAttribute(this.binding(PHX_KEY))\n      let pressedKey = e.key && e.key.toLowerCase() // chrome clicked autocompletes send a keydown without key\n      if(matchKey && matchKey.toLowerCase() !== pressedKey){ return }\n\n      let data = {key: e.key, ...this.eventMeta(type, e, targetEl)}\n      JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n    })\n    this.bind({blur: \"focusout\", focus: \"focusin\"}, (e, type, view, targetEl, phxEvent, phxTarget) => {\n      if(!phxTarget){\n        let data = {key: e.key, ...this.eventMeta(type, e, targetEl)}\n        JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n      }\n    })\n    this.bind({blur: \"blur\", focus: \"focus\"}, (e, type, view, targetEl, phxEvent, phxTarget) => {\n      // blur and focus are triggered on document and window. Discard one to avoid dups\n      if(phxTarget === \"window\"){\n        let data = this.eventMeta(type, e, targetEl)\n        JS.exec(e, type, phxEvent, view, targetEl, [\"push\", {data}])\n      }\n    })\n    this.on(\"dragover\", e => e.preventDefault())\n    this.on(\"drop\", e => {\n      e.preventDefault()\n      let dropTargetId = maybe(closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), trueTarget => {\n        return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET))\n      })\n      let dropTarget = dropTargetId && document.getElementById(dropTargetId)\n      let files = Array.from(e.dataTransfer.files || [])\n      if(!dropTarget || dropTarget.disabled || files.length === 0 || !(dropTarget.files instanceof FileList)){ return }\n\n      LiveUploader.trackFiles(dropTarget, files, e.dataTransfer)\n      dropTarget.dispatchEvent(new Event(\"input\", {bubbles: true}))\n    })\n    this.on(PHX_TRACK_UPLOADS, e => {\n      let uploadTarget = e.target\n      if(!DOM.isUploadInput(uploadTarget)){ return }\n      let files = Array.from(e.detail.files || []).filter(f => f instanceof File || f instanceof Blob)\n      LiveUploader.trackFiles(uploadTarget, files)\n      uploadTarget.dispatchEvent(new Event(\"input\", {bubbles: true}))\n    })\n  }\n\n  eventMeta(eventName, e, targetEl){\n    let callback = this.metadataCallbacks[eventName]\n    return callback ? callback(e, targetEl) : {}\n  }\n\n  setPendingLink(href){\n    this.linkRef++\n    this.pendingLink = href\n    this.resetReloadStatus()\n    return this.linkRef\n  }\n\n  // anytime we are navigating or connecting, drop reload cookie in case\n  // we issue the cookie but the next request was interrupted and the server never dropped it\n  resetReloadStatus(){ Browser.deleteCookie(PHX_RELOAD_STATUS) }\n\n  commitPendingLink(linkRef){\n    if(this.linkRef !== linkRef){\n      return false\n    } else {\n      this.href = this.pendingLink\n      this.pendingLink = null\n      return true\n    }\n  }\n\n  getHref(){ return this.href }\n\n  hasPendingLink(){ return !!this.pendingLink }\n\n  bind(events, callback){\n    for(let event in events){\n      let browserEventName = events[event]\n\n      this.on(browserEventName, e => {\n        let binding = this.binding(event)\n        let windowBinding = this.binding(`window-${event}`)\n        let targetPhxEvent = e.target.getAttribute && e.target.getAttribute(binding)\n        if(targetPhxEvent){\n          this.debounce(e.target, e, browserEventName, () => {\n            this.withinOwners(e.target, view => {\n              callback(e, event, view, e.target, targetPhxEvent, null)\n            })\n          })\n        } else {\n          DOM.all(document, `[${windowBinding}]`, el => {\n            let phxEvent = el.getAttribute(windowBinding)\n            this.debounce(el, e, browserEventName, () => {\n              this.withinOwners(el, view => {\n                callback(e, event, view, el, phxEvent, \"window\")\n              })\n            })\n          })\n        }\n      })\n    }\n  }\n\n  bindClicks(){\n    this.on(\"mousedown\", e => this.clickStartedAtTarget = e.target)\n    this.bindClick(\"click\", \"click\")\n  }\n\n  bindClick(eventName, bindingName){\n    let click = this.binding(bindingName)\n    window.addEventListener(eventName, e => {\n      let target = null\n      // a synthetic click event (detail 0) will not have caused a mousedown event,\n      // therefore the clickStartedAtTarget is stale\n      if(e.detail === 0) this.clickStartedAtTarget = e.target\n      let clickStartedAtTarget = this.clickStartedAtTarget || e.target\n      // when searching the target for the click event, we always want to\n      // use the actual event target, see #3372\n      target = closestPhxBinding(e.target, click)\n      this.dispatchClickAway(e, clickStartedAtTarget)\n      this.clickStartedAtTarget = null\n      let phxEvent = target && target.getAttribute(click)\n      if(!phxEvent){\n        if(DOM.isNewPageClick(e, window.location)){ this.unload() }\n        return\n      }\n\n      if(target.getAttribute(\"href\") === \"#\"){ e.preventDefault() }\n\n      // noop if we are in the middle of awaiting an ack for this el already\n      if(target.hasAttribute(PHX_REF_SRC)){ return }\n\n      this.debounce(target, e, \"click\", () => {\n        this.withinOwners(target, view => {\n          JS.exec(e, \"click\", phxEvent, view, target, [\"push\", {data: this.eventMeta(\"click\", e, target)}])\n        })\n      })\n    }, false)\n  }\n\n  dispatchClickAway(e, clickStartedAt){\n    let phxClickAway = this.binding(\"click-away\")\n    DOM.all(document, `[${phxClickAway}]`, el => {\n      if(!(el.isSameNode(clickStartedAt) || el.contains(clickStartedAt))){\n        this.withinOwners(el, view => {\n          let phxEvent = el.getAttribute(phxClickAway)\n          if(JS.isVisible(el) && JS.isInViewport(el)){\n            JS.exec(e, \"click\", phxEvent, view, el, [\"push\", {data: this.eventMeta(\"click\", e, e.target)}])\n          }\n        })\n      }\n    })\n  }\n\n  bindNav(){\n    if(!Browser.canPushState()){ return }\n    if(history.scrollRestoration){ history.scrollRestoration = \"manual\" }\n    let scrollTimer = null\n    window.addEventListener(\"scroll\", _e => {\n      clearTimeout(scrollTimer)\n      scrollTimer = setTimeout(() => {\n        Browser.updateCurrentState(state => Object.assign(state, {scroll: window.scrollY}))\n      }, 100)\n    })\n    window.addEventListener(\"popstate\", event => {\n      if(!this.registerNewLocation(window.location)){ return }\n      let {type, backType, id, root, scroll, position} = event.state || {}\n      let href = window.location.href\n\n      // Compare positions to determine direction\n      let isForward = position > this.currentHistoryPosition\n\n      type = isForward ? type : (backType || type)\n\n      // Update current position\n      this.currentHistoryPosition = position || 0\n      this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n      DOM.dispatchEvent(window, \"phx:navigate\", {detail: {href, patch: type === \"patch\", pop: true, direction: isForward ? \"forward\" : \"backward\"}})\n      this.requestDOMUpdate(() => {\n        if(this.main.isConnected() && (type === \"patch\" && id === this.main.id)){\n          this.main.pushLinkPatch(event, href, null, () => {\n            this.maybeScroll(scroll)\n          })\n        } else {\n          this.replaceMain(href, null, () => {\n            if(root){ this.replaceRootHistory() }\n            this.maybeScroll(scroll)\n          })\n        }\n      })\n    }, false)\n    window.addEventListener(\"click\", e => {\n      let target = closestPhxBinding(e.target, PHX_LIVE_LINK)\n      let type = target && target.getAttribute(PHX_LIVE_LINK)\n      if(!type || !this.isConnected() || !this.main || DOM.wantsNewTab(e)){ return }\n\n      // When wrapping an SVG element in an anchor tag, the href can be an SVGAnimatedString\n      let href = target.href instanceof SVGAnimatedString ? target.href.baseVal : target.href\n\n      let linkState = target.getAttribute(PHX_LINK_STATE)\n      e.preventDefault()\n      e.stopImmediatePropagation() // do not bubble click to regular phx-click bindings\n      if(this.pendingLink === href){ return }\n\n      this.requestDOMUpdate(() => {\n        if(type === \"patch\"){\n          this.pushHistoryPatch(e, href, linkState, target)\n        } else if(type === \"redirect\"){\n          this.historyRedirect(e, href, linkState, null, target)\n        } else {\n          throw new Error(`expected ${PHX_LIVE_LINK} to be \"patch\" or \"redirect\", got: ${type}`)\n        }\n        let phxClick = target.getAttribute(this.binding(\"click\"))\n        if(phxClick){\n          this.requestDOMUpdate(() => this.execJS(target, phxClick, \"click\"))\n        }\n      })\n    }, false)\n  }\n\n  maybeScroll(scroll){\n    if(typeof(scroll) === \"number\"){\n      requestAnimationFrame(() => {\n        window.scrollTo(0, scroll)\n      }) // the body needs to render before we scroll.\n    }\n  }\n\n  dispatchEvent(event, payload = {}){\n    DOM.dispatchEvent(window, `phx:${event}`, {detail: payload})\n  }\n\n  dispatchEvents(events){\n    events.forEach(([event, payload]) => this.dispatchEvent(event, payload))\n  }\n\n  withPageLoading(info, callback){\n    DOM.dispatchEvent(window, \"phx:page-loading-start\", {detail: info})\n    let done = () => DOM.dispatchEvent(window, \"phx:page-loading-stop\", {detail: info})\n    return callback ? callback(done) : done\n  }\n\n  pushHistoryPatch(e, href, linkState, targetEl){\n    if(!this.isConnected() || !this.main.isMain()){ return Browser.redirect(href) }\n\n    this.withPageLoading({to: href, kind: \"patch\"}, done => {\n      this.main.pushLinkPatch(e, href, targetEl, linkRef => {\n        this.historyPatch(href, linkState, linkRef)\n        done()\n      })\n    })\n  }\n\n  historyPatch(href, linkState, linkRef = this.setPendingLink(href)){\n    if(!this.commitPendingLink(linkRef)){ return }\n\n    // Increment position for new state\n    this.currentHistoryPosition++\n    this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n    // store the type for back navigation\n    Browser.updateCurrentState((state) => ({...state, backType: \"patch\"}))\n\n    Browser.pushState(linkState, {\n      type: \"patch\",\n      id: this.main.id,\n      position: this.currentHistoryPosition\n    }, href)\n\n    DOM.dispatchEvent(window, \"phx:navigate\", {detail: {patch: true, href, pop: false, direction: \"forward\"}})\n    this.registerNewLocation(window.location)\n  }\n\n  historyRedirect(e, href, linkState, flash, targetEl){\n    if(targetEl && e.isTrusted && e.type !== \"popstate\"){ targetEl.classList.add(\"phx-click-loading\") }\n    if(!this.isConnected() || !this.main.isMain()){ return Browser.redirect(href, flash) }\n\n    // convert to full href if only path prefix\n    if(/^\\/$|^\\/[^\\/]+.*$/.test(href)){\n      let {protocol, host} = window.location\n      href = `${protocol}//${host}${href}`\n    }\n    let scroll = window.scrollY\n    this.withPageLoading({to: href, kind: \"redirect\"}, done => {\n      this.replaceMain(href, flash, (linkRef) => {\n        if(linkRef === this.linkRef){\n          // Increment position for new state\n          this.currentHistoryPosition++\n          this.sessionStorage.setItem(PHX_LV_HISTORY_POSITION, this.currentHistoryPosition.toString())\n\n          // store the type for back navigation\n          Browser.updateCurrentState((state) => ({...state, backType: \"redirect\"}))\n\n          Browser.pushState(linkState, {\n            type: \"redirect\",\n            id: this.main.id,\n            scroll: scroll,\n            position: this.currentHistoryPosition\n          }, href)\n\n          DOM.dispatchEvent(window, \"phx:navigate\", {detail: {href, patch: false, pop: false, direction: \"forward\"}})\n          this.registerNewLocation(window.location)\n        }\n        done()\n      })\n    })\n  }\n\n  replaceRootHistory(){\n    Browser.pushState(\"replace\", {\n      root: true,\n      type: \"patch\",\n      id: this.main.id,\n      position: this.currentHistoryPosition // Preserve current position\n    })\n  }\n\n  registerNewLocation(newLocation){\n    let {pathname, search} = this.currentLocation\n    if(pathname + search === newLocation.pathname + newLocation.search){\n      return false\n    } else {\n      this.currentLocation = clone(newLocation)\n      return true\n    }\n  }\n\n  bindForms(){\n    let iterations = 0\n    let externalFormSubmitted = false\n\n    // disable forms on submit that track phx-change but perform external submit\n    this.on(\"submit\", e => {\n      let phxSubmit = e.target.getAttribute(this.binding(\"submit\"))\n      let phxChange = e.target.getAttribute(this.binding(\"change\"))\n      if(!externalFormSubmitted && phxChange && !phxSubmit){\n        externalFormSubmitted = true\n        e.preventDefault()\n        this.withinOwners(e.target, view => {\n          view.disableForm(e.target)\n          // safari needs next tick\n          window.requestAnimationFrame(() => {\n            if(DOM.isUnloadableFormSubmit(e)){ this.unload() }\n            e.target.submit()\n          })\n        })\n      }\n    })\n\n    this.on(\"submit\", e => {\n      let phxEvent = e.target.getAttribute(this.binding(\"submit\"))\n      if(!phxEvent){\n        if(DOM.isUnloadableFormSubmit(e)){ this.unload() }\n        return\n      }\n      e.preventDefault()\n      e.target.disabled = true\n      this.withinOwners(e.target, view => {\n        JS.exec(e, \"submit\", phxEvent, view, e.target, [\"push\", {submitter: e.submitter}])\n      })\n    })\n\n    for(let type of [\"change\", \"input\"]){\n      this.on(type, e => {\n        if(e instanceof CustomEvent && e.target.form === undefined){\n          // throw on invalid JS.dispatch target and noop if CustomEvent triggered outside JS.dispatch\n          if(e.detail && e.detail.dispatcher){\n            throw new Error(`dispatching a custom ${type} event is only supported on input elements inside a form`)\n          }\n          return\n        }\n        let phxChange = this.binding(\"change\")\n        let input = e.target\n        // do not fire phx-change if we are in the middle of a composition session\n        // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing\n        // Safari has issues if the input is updated while composing\n        // see https://github.com/phoenixframework/phoenix_live_view/issues/3322\n        if(e.isComposing){\n          const key = `composition-listener-${type}`\n          if(!DOM.private(input, key)){\n            DOM.putPrivate(input, key, true)\n            input.addEventListener(\"compositionend\", () => {\n              // trigger a new input/change event\n              input.dispatchEvent(new Event(type, {bubbles: true}))\n              DOM.deletePrivate(input, key)\n            }, {once: true})\n          }\n          return\n        }\n        let inputEvent = input.getAttribute(phxChange)\n        let formEvent = input.form && input.form.getAttribute(phxChange)\n        let phxEvent = inputEvent || formEvent\n        if(!phxEvent){ return }\n        if(input.type === \"number\" && input.validity && input.validity.badInput){ return }\n\n        let dispatcher = inputEvent ? input : input.form\n        let currentIterations = iterations\n        iterations++\n        let {at: at, type: lastType} = DOM.private(input, \"prev-iteration\") || {}\n        // Browsers should always fire at least one \"input\" event before every \"change\"\n        // Ignore \"change\" events, unless there was no prior \"input\" event.\n        // This could happen if user code triggers a \"change\" event, or if the browser is non-conforming.\n        if(at === currentIterations - 1 && type === \"change\" && lastType === \"input\"){ return }\n\n        DOM.putPrivate(input, \"prev-iteration\", {at: currentIterations, type: type})\n\n        this.debounce(input, e, type, () => {\n          this.withinOwners(dispatcher, view => {\n            DOM.putPrivate(input, PHX_HAS_FOCUSED, true)\n            JS.exec(e, \"change\", phxEvent, view, input, [\"push\", {_target: e.target.name, dispatcher: dispatcher}])\n          })\n        })\n      })\n    }\n    this.on(\"reset\", (e) => {\n      let form = e.target\n      DOM.resetForm(form)\n      let input = Array.from(form.elements).find(el => el.type === \"reset\")\n      if(input){\n        // wait until next tick to get updated input value\n        window.requestAnimationFrame(() => {\n          input.dispatchEvent(new Event(\"input\", {bubbles: true, cancelable: false}))\n        })\n      }\n    })\n  }\n\n  debounce(el, event, eventType, callback){\n    if(eventType === \"blur\" || eventType === \"focusout\"){ return callback() }\n\n    let phxDebounce = this.binding(PHX_DEBOUNCE)\n    let phxThrottle = this.binding(PHX_THROTTLE)\n    let defaultDebounce = this.defaults.debounce.toString()\n    let defaultThrottle = this.defaults.throttle.toString()\n\n    this.withinOwners(el, view => {\n      let asyncFilter = () => !view.isDestroyed() && document.body.contains(el)\n      DOM.debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, asyncFilter, () => {\n        callback()\n      })\n    })\n  }\n\n  silenceEvents(callback){\n    this.silenced = true\n    callback()\n    this.silenced = false\n  }\n\n  on(event, callback){\n    this.boundEventNames.add(event)\n    window.addEventListener(event, e => {\n      if(!this.silenced){ callback(e) }\n    })\n  }\n\n  jsQuerySelectorAll(sourceEl, query, defaultQuery){\n    let all = this.domCallbacks.jsQuerySelectorAll\n    return all ? all(sourceEl, query, defaultQuery) : defaultQuery()\n  }\n}\n\nclass TransitionSet {\n  constructor(){\n    this.transitions = new Set()\n    this.pendingOps = []\n  }\n\n  reset(){\n    this.transitions.forEach(timer => {\n      clearTimeout(timer)\n      this.transitions.delete(timer)\n    })\n    this.flushPendingOps()\n  }\n\n  after(callback){\n    if(this.size() === 0){\n      callback()\n    } else {\n      this.pushPendingOp(callback)\n    }\n  }\n\n  addTransition(time, onStart, onDone){\n    onStart()\n    let timer = setTimeout(() => {\n      this.transitions.delete(timer)\n      onDone()\n      this.flushPendingOps()\n    }, time)\n    this.transitions.add(timer)\n  }\n\n  pushPendingOp(op){ this.pendingOps.push(op) }\n\n  size(){ return this.transitions.size }\n\n  flushPendingOps(){\n    if(this.size() > 0){ return }\n    let op = this.pendingOps.shift()\n    if(op){\n      op()\n      this.flushPendingOps()\n    }\n  }\n}\n", "/*\n================================================================================\nPhoenix LiveView JavaScript Client\n================================================================================\n\nSee the hexdocs at `https://hexdocs.pm/phoenix_live_view` for documentation.\n\n*/\n\nimport LiveSocket, {isUsedInput} from \"./live_socket\"\nimport DOM from \"./dom\"\nimport ViewHook from \"./view_hook\"\nimport View from \"./view\"\n\n/** Creates a ViewHook instance for the given element and callbacks.\n *\n * @param {HTMLElement} el - The element to associate with the hook.\n * @param {Object} [callbacks] - The list of hook callbacks, such as mounted,\n *   updated, destroyed, etc.\n *\n * @example\n *\n * class MyComponent extends HTMLElement {\n *   connectedCallback(){\n *     let onLiveViewMounted = () => this.hook.pushEvent(...))\n *     this.hook = createHook(this, {mounted: onLiveViewMounted})\n *   }\n * }\n *\n * *Note*: `createHook` must be called from the `connectedCallback` lifecycle\n * which is triggered after the element has been added to the DOM. If you try\n * to call `createHook` from the constructor, an error will be logged.\n *\n * @returns {ViewHook} Returns the ViewHook instance for the custom element.\n */\nlet createHook = (el, callbacks = {}) => {\n  let existingHook = DOM.getCustomElHook(el)\n  if(existingHook){ return existingHook }\n\n  let hook = new ViewHook(View.closestView(el), el, callbacks)\n  DOM.putCustomElHook(el, hook)\n  return hook\n}\n\nexport {\n  LiveSocket,\n  isUsedInput,\n  createHook\n}\n"],
+  "mappings": "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",
   "names": ["isEmpty", "file", "morphAttrs", "morphdom", "childrenOnly", "targetContainer", "clone", "view", "el", "lock", "el", "loading", "entry", "input"]
 }
diff --git a/priv/static/phoenix_live_view.js b/priv/static/phoenix_live_view.js
index b781de7e5..deb52ed22 100644
--- a/priv/static/phoenix_live_view.js
+++ b/priv/static/phoenix_live_view.js
@@ -3949,9 +3949,10 @@ removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}"
       }
     }
     destroyHook(hook) {
+      const hookId = ViewHook.elementID(hook.el);
       hook.__destroyed();
       hook.__cleanup__();
-      delete this.viewHooks[ViewHook.elementID(hook.el)];
+      delete this.viewHooks[hookId];
     }
     applyPendingUpdates() {
       this.pendingDiffs.forEach(({ diff, events }) => this.update(diff, events));
diff --git a/priv/static/phoenix_live_view.min.js b/priv/static/phoenix_live_view.min.js
index f0c58b435..78aecb08d 100644
--- a/priv/static/phoenix_live_view.min.js
+++ b/priv/static/phoenix_live_view.min.js
@@ -6,7 +6,7 @@ var LiveView=(()=>{var Ye=Object.defineProperty,Ei=Object.defineProperties,yi=Ob
 removing illegal node: "${(i.outerHTML||i.nodeValue).trim()}"
 
 `),t.push(i))}),t.forEach(i=>i.remove())}},replaceRootContainer(r,e,t){let i=new Set(["id",M,ee,ke,J]);if(r.tagName.toLowerCase()===e.toLowerCase())return Array.from(r.attributes).filter(s=>!i.has(s.name.toLowerCase())).forEach(s=>r.removeAttribute(s.name)),Object.keys(t).filter(s=>!i.has(s.toLowerCase())).forEach(s=>r.setAttribute(s,t[s])),r;{let s=document.createElement(e);return Object.keys(t).forEach(n=>s.setAttribute(n,t[n])),i.forEach(n=>s.setAttribute(n,r.getAttribute(n))),s.innerHTML=r.innerHTML,r.replaceWith(s),s}},getSticky(r,e,t){let i=(Ae.private(r,"sticky")||[]).find(([s])=>e===s);if(i){let[s,n,o]=i;return o}else return typeof t=="function"?t():t},deleteSticky(r,e){this.updatePrivate(r,"sticky",[],t=>t.filter(([i,s])=>i!==e))},putSticky(r,e,t){let i=t(r);this.updatePrivate(r,"sticky",[],s=>{let n=s.findIndex(([o])=>e===o);return n>=0?s[n]=[e,t,i]:s.push([e,t,i]),s})},applyStickyOperations(r){let e=Ae.private(r,"sticky");e&&e.forEach(([t,i,s])=>this.putSticky(r,t,i))}},h=Ae;var se=class{static isActive(e,t){let i=t._phxRef===void 0,n=e.getAttribute(Ne).split(",").indexOf(C.genFileRef(t))>=0;return t.size>0&&(i||n)}static isPreflighted(e,t){return e.getAttribute(Ee).split(",").indexOf(C.genFileRef(t))>=0&&this.isActive(e,t)}static isPreflightInProgress(e){return e._preflightInProgress===!0}static markPreflightInProgress(e){e._preflightInProgress=!0}constructor(e,t,i,s){this.ref=C.genFileRef(t),this.fileEl=e,this.file=t,this.view=i,this.meta=null,this._isCancelled=!1,this._isDone=!1,this._progress=0,this._lastProgressSent=-1,this._onDone=function(){},this._onElUpdated=this.onElUpdated.bind(this),this.fileEl.addEventListener(ye,this._onElUpdated),this.autoUpload=s}metadata(){return this.meta}progress(e){this._progress=Math.floor(e),this._progress>this._lastProgressSent&&(this._progress>=100?(this._progress=100,this._lastProgressSent=100,this._isDone=!0,this.view.pushFileProgress(this.fileEl,this.ref,100,()=>{C.untrackFile(this.fileEl,this.file),this._onDone()})):(this._lastProgressSent=this._progress,this.view.pushFileProgress(this.fileEl,this.ref,this._progress)))}isCancelled(){return this._isCancelled}cancel(){this.file._preflightInProgress=!1,this._isCancelled=!0,this._isDone=!0,this._onDone()}isDone(){return this._isDone}error(e="failed"){this.fileEl.removeEventListener(ye,this._onElUpdated),this.view.pushFileProgress(this.fileEl,this.ref,{error:e}),this.isAutoUpload()||C.clearFiles(this.fileEl)}isAutoUpload(){return this.autoUpload}onDone(e){this._onDone=()=>{this.fileEl.removeEventListener(ye,this._onElUpdated),e()}}onElUpdated(){this.fileEl.getAttribute(Ne).split(",").indexOf(this.ref)===-1&&(C.untrackFile(this.fileEl,this.file),this.cancel())}toPreflightPayload(){return{last_modified:this.file.lastModified,name:this.file.name,relative_path:this.file.webkitRelativePath,size:this.file.size,type:this.file.type,ref:this.ref,meta:typeof this.file.meta=="function"?this.file.meta():void 0}}uploader(e){if(this.meta.uploader){let t=e[this.meta.uploader]||x(`no uploader configured for ${this.meta.uploader}`);return{name:this.meta.uploader,callback:t}}else return{name:"channel",callback:li}}zipPostFlight(e){this.meta=e.entries[this.ref],this.meta||x(`no preflight upload response returned with ref ${this.ref}`,{input:this.fileEl,response:e})}};var Ii=0,C=class r{static genFileRef(e){let t=e._phxRef;return t!==void 0?t:(e._phxRef=(Ii++).toString(),e._phxRef)}static getEntryDataURL(e,t,i){let s=this.activeFiles(e).find(n=>this.genFileRef(n)===t);i(URL.createObjectURL(s))}static hasUploadsInProgress(e){let t=0;return h.findUploadInputs(e).forEach(i=>{i.getAttribute(Ee)!==i.getAttribute(Wt)&&t++}),t>0}static serializeUploads(e){let t=this.activeFiles(e),i={};return t.forEach(s=>{let n={path:e.name},o=e.getAttribute(B);i[o]=i[o]||[],n.ref=this.genFileRef(s),n.last_modified=s.lastModified,n.name=s.name||n.ref,n.relative_path=s.webkitRelativePath,n.type=s.type,n.size=s.size,typeof s.meta=="function"&&(n.meta=s.meta()),i[o].push(n)}),i}static clearFiles(e){e.value=null,e.removeAttribute(B),h.putPrivate(e,"files",[])}static untrackFile(e,t){h.putPrivate(e,"files",h.private(e,"files").filter(i=>!Object.is(i,t)))}static trackFiles(e,t,i){if(e.getAttribute("multiple")!==null){let s=t.filter(n=>!this.activeFiles(e).find(o=>Object.is(o,n)));h.updatePrivate(e,"files",[],n=>n.concat(s)),e.value=null}else i&&i.files.length>0&&(e.files=i.files),h.putPrivate(e,"files",t)}static activeFileInputs(e){let t=h.findUploadInputs(e);return Array.from(t).filter(i=>i.files&&this.activeFiles(i).length>0)}static activeFiles(e){return(h.private(e,"files")||[]).filter(t=>se.isActive(e,t))}static inputsAwaitingPreflight(e){let t=h.findUploadInputs(e);return Array.from(t).filter(i=>this.filesAwaitingPreflight(i).length>0)}static filesAwaitingPreflight(e){return this.activeFiles(e).filter(t=>!se.isPreflighted(e,t)&&!se.isPreflightInProgress(t))}static markPreflightInProgress(e){e.forEach(t=>se.markPreflightInProgress(t.file))}constructor(e,t,i){this.autoUpload=h.isAutoUpload(e),this.view=t,this.onComplete=i,this._entries=Array.from(r.filesAwaitingPreflight(e)||[]).map(s=>new se(e,s,t,this.autoUpload)),r.markPreflightInProgress(this._entries),this.numEntriesInProgress=this._entries.length}isAutoUpload(){return this.autoUpload}entries(){return this._entries}initAdapterUpload(e,t,i){this._entries=this._entries.map(n=>(n.isCancelled()?(this.numEntriesInProgress--,this.numEntriesInProgress===0&&this.onComplete()):(n.zipPostFlight(e),n.onDone(()=>{this.numEntriesInProgress--,this.numEntriesInProgress===0&&this.onComplete()})),n));let s=this._entries.reduce((n,o)=>{if(!o.meta)return n;let{name:l,callback:a}=o.uploader(i.uploaders);return n[l]=n[l]||{callback:a,entries:[]},n[l].entries.push(o),n},{});for(let n in s){let{callback:o,entries:l}=s[n];o(l,t,e,i)}}};var Oi={anyOf(r,e){return e.find(t=>r instanceof t)},isFocusable(r,e){return r instanceof HTMLAnchorElement&&r.rel!=="ignore"||r instanceof HTMLAreaElement&&r.href!==void 0||!r.disabled&&this.anyOf(r,[HTMLInputElement,HTMLSelectElement,HTMLTextAreaElement,HTMLButtonElement])||r instanceof HTMLIFrameElement||r.tabIndex>0||!e&&r.getAttribute("tabindex")!==null&&r.getAttribute("aria-hidden")!=="true"},attemptFocus(r,e){if(this.isFocusable(r,e))try{r.focus()}catch(t){}return!!document.activeElement&&document.activeElement.isSameNode(r)},focusFirstInteractive(r){let e=r.firstElementChild;for(;e;){if(this.attemptFocus(e,!0)||this.focusFirstInteractive(e,!0))return!0;e=e.nextElementSibling}},focusFirst(r){let e=r.firstElementChild;for(;e;){if(this.attemptFocus(e)||this.focusFirst(e))return!0;e=e.nextElementSibling}},focusLast(r){let e=r.lastElementChild;for(;e;){if(this.attemptFocus(e)||this.focusLast(e))return!0;e=e.previousElementSibling}}},de=Oi;var di={LiveFileUpload:{activeRefs(){return this.el.getAttribute(Ne)},preflightedRefs(){return this.el.getAttribute(Ee)},mounted(){this.preflightedWas=this.preflightedRefs()},updated(){let r=this.preflightedRefs();this.preflightedWas!==r&&(this.preflightedWas=r,r===""&&this.__view().cancelSubmit(this.el.form)),this.activeRefs()===""&&(this.el.value=null),this.el.dispatchEvent(new CustomEvent(ye))}},LiveImgPreview:{mounted(){this.ref=this.el.getAttribute("data-phx-entry-ref"),this.inputEl=document.getElementById(this.el.getAttribute(B)),C.getEntryDataURL(this.inputEl,this.ref,r=>{this.url=r,this.el.src=r})},destroyed(){URL.revokeObjectURL(this.url)}},FocusWrap:{mounted(){this.focusStart=this.el.firstElementChild,this.focusEnd=this.el.lastElementChild,this.focusStart.addEventListener("focus",()=>de.focusLast(this.el)),this.focusEnd.addEventListener("focus",()=>de.focusFirst(this.el)),this.el.addEventListener("phx:show-end",()=>this.el.focus()),window.getComputedStyle(this.el).display!=="none"&&de.focusFirst(this.el)}}},ui=r=>["HTML","BODY"].indexOf(r.nodeName.toUpperCase())>=0?null:["scroll","auto"].indexOf(getComputedStyle(r).overflowY)>=0?r:ui(r.parentElement),ai=r=>r?r.scrollTop:document.documentElement.scrollTop||document.body.scrollTop,Ht=r=>r?r.getBoundingClientRect().bottom:window.innerHeight||document.documentElement.clientHeight,Dt=r=>r?r.getBoundingClientRect().top:0,Li=(r,e)=>{let t=r.getBoundingClientRect();return Math.ceil(t.top)>=Dt(e)&&Math.ceil(t.left)>=0&&Math.floor(t.top)<=Ht(e)},Hi=(r,e)=>{let t=r.getBoundingClientRect();return Math.ceil(t.bottom)>=Dt(e)&&Math.ceil(t.left)>=0&&Math.floor(t.bottom)<=Ht(e)},hi=(r,e)=>{let t=r.getBoundingClientRect();return Math.ceil(t.top)>=Dt(e)&&Math.ceil(t.left)>=0&&Math.floor(t.top)<=Ht(e)};di.InfiniteScroll={mounted(){this.scrollContainer=ui(this.el);let r=ai(this.scrollContainer),e=!1,t=500,i=null,s=this.throttle(t,(l,a)=>{i=()=>!0,this.liveSocket.execJSHookPush(this.el,l,{id:a.id,_overran:!0},()=>{i=null})}),n=this.throttle(t,(l,a)=>{i=()=>a.scrollIntoView({block:"start"}),this.liveSocket.execJSHookPush(this.el,l,{id:a.id},()=>{i=null,window.requestAnimationFrame(()=>{hi(a,this.scrollContainer)||a.scrollIntoView({block:"start"})})})}),o=this.throttle(t,(l,a)=>{i=()=>a.scrollIntoView({block:"end"}),this.liveSocket.execJSHookPush(this.el,l,{id:a.id},()=>{i=null,window.requestAnimationFrame(()=>{hi(a,this.scrollContainer)||a.scrollIntoView({block:"end"})})})});this.onScroll=l=>{let a=ai(this.scrollContainer);if(i)return r=a,i();let d=this.el.getBoundingClientRect(),c=this.el.getAttribute(this.liveSocket.binding("viewport-top")),p=this.el.getAttribute(this.liveSocket.binding("viewport-bottom")),m=this.el.lastElementChild,g=this.el.firstElementChild,u=a<r,v=a>r;u&&c&&!e&&d.top>=0?(e=!0,s(c,g)):v&&e&&d.top<=0&&(e=!1),c&&u&&Li(g,this.scrollContainer)?n(c,g):p&&v&&Hi(m,this.scrollContainer)&&o(p,m),r=a},this.scrollContainer?this.scrollContainer.addEventListener("scroll",this.onScroll):window.addEventListener("scroll",this.onScroll)},destroyed(){this.scrollContainer?this.scrollContainer.removeEventListener("scroll",this.onScroll):window.removeEventListener("scroll",this.onScroll)},throttle(r,e){let t=0,i;return(...s)=>{let n=Date.now(),o=r-(n-t);o<=0||o>r?(i&&(clearTimeout(i),i=null),t=n,e(...s)):i||(i=setTimeout(()=>{t=Date.now(),i=null,e(...s)},o))}}};var ci=di;var je=class{constructor(e){this.el=e,this.loadingRef=e.hasAttribute(le)?parseInt(e.getAttribute(le),10):null,this.lockRef=e.hasAttribute(L)?parseInt(e.getAttribute(L),10):null}maybeUndo(e,t,i){this.isWithin(e)&&(this.undoLocks(e,t,i),this.undoLoading(e,t),this.isFullyResolvedBy(e)&&this.el.removeAttribute(O))}isWithin(e){return!(this.loadingRef!==null&&this.loadingRef>e&&this.lockRef!==null&&this.lockRef>e)}undoLocks(e,t,i){if(!this.isLockUndoneBy(e))return;let s=h.private(this.el,L);s&&(i(s),h.deletePrivate(this.el,L)),this.el.removeAttribute(L);let n={detail:{ref:e,event:t},bubbles:!0,cancelable:!1};this.el.dispatchEvent(new CustomEvent(`phx:undo-lock:${this.lockRef}`,n))}undoLoading(e,t){if(!this.isLoadingUndoneBy(e)){this.canUndoLoading(e)&&this.el.classList.contains("phx-submit-loading")&&this.el.classList.remove("phx-change-loading");return}if(this.canUndoLoading(e)){this.el.removeAttribute(le);let i=this.el.getAttribute(he),s=this.el.getAttribute(Ue);s!==null&&(this.el.readOnly=s==="true",this.el.removeAttribute(Ue)),i!==null&&(this.el.disabled=i==="true",this.el.removeAttribute(he));let n=this.el.getAttribute(Ce);n!==null&&(this.el.innerText=n,this.el.removeAttribute(Ce));let o={detail:{ref:e,event:t},bubbles:!0,cancelable:!1};this.el.dispatchEvent(new CustomEvent(`phx:undo-loading:${this.loadingRef}`,o))}Ze.forEach(i=>{(i!=="phx-submit-loading"||this.canUndoLoading(e))&&h.removeClass(this.el,i)})}isLoadingUndoneBy(e){return this.loadingRef===null?!1:this.loadingRef<=e}isLockUndoneBy(e){return this.lockRef===null?!1:this.lockRef<=e}isFullyResolvedBy(e){return(this.loadingRef===null||this.loadingRef<=e)&&(this.lockRef===null||this.lockRef<=e)}canUndoLoading(e){return this.lockRef===null||this.lockRef<=e}};var Je=class{constructor(e,t,i){let s=new Set,n=new Set([...t.children].map(l=>l.id)),o=[];Array.from(e.children).forEach(l=>{if(l.id&&(s.add(l.id),n.has(l.id))){let a=l.previousElementSibling&&l.previousElementSibling.id;o.push({elementId:l.id,previousElementId:a})}}),this.containerId=t.id,this.updateType=i,this.elementsToModify=o,this.elementIdsToAdd=[...n].filter(l=>!s.has(l))}perform(){let e=h.byId(this.containerId);this.elementsToModify.forEach(t=>{t.previousElementId?z(document.getElementById(t.previousElementId),i=>{z(document.getElementById(t.elementId),s=>{s.previousElementSibling&&s.previousElementSibling.id==i.id||i.insertAdjacentElement("afterend",s)})}):z(document.getElementById(t.elementId),i=>{i.previousElementSibling==null||e.insertAdjacentElement("afterbegin",i)})}),this.updateType=="prepend"&&this.elementIdsToAdd.reverse().forEach(t=>{z(document.getElementById(t),i=>e.insertAdjacentElement("afterbegin",i))})}};var fi=11;function Di(r,e){var t=e.attributes,i,s,n,o,l;if(!(e.nodeType===fi||r.nodeType===fi)){for(var a=t.length-1;a>=0;a--)i=t[a],s=i.name,n=i.namespaceURI,o=i.value,n?(s=i.localName||s,l=r.getAttributeNS(n,s),l!==o&&(i.prefix==="xmlns"&&(s=i.name),r.setAttributeNS(n,s,o))):(l=r.getAttribute(s),l!==o&&r.setAttribute(s,o));for(var d=r.attributes,c=d.length-1;c>=0;c--)i=d[c],s=i.name,n=i.namespaceURI,n?(s=i.localName||s,e.hasAttributeNS(n,s)||r.removeAttributeNS(n,s)):e.hasAttribute(s)||r.removeAttribute(s)}}var ht,Ni="http://www.w3.org/1999/xhtml",U=typeof document=="undefined"?void 0:document,Fi=!!U&&"content"in U.createElement("template"),Mi=!!U&&U.createRange&&"createContextualFragment"in U.createRange();function Ui(r){var e=U.createElement("template");return e.innerHTML=r,e.content.childNodes[0]}function Xi(r){ht||(ht=U.createRange(),ht.selectNode(U.body));var e=ht.createContextualFragment(r);return e.childNodes[0]}function $i(r){var e=U.createElement("body");return e.innerHTML=r,e.childNodes[0]}function Bi(r){return r=r.trim(),Fi?Ui(r):Mi?Xi(r):$i(r)}function dt(r,e){var t=r.nodeName,i=e.nodeName,s,n;return t===i?!0:(s=t.charCodeAt(0),n=i.charCodeAt(0),s<=90&&n>=97?t===i.toUpperCase():n<=90&&s>=97?i===t.toUpperCase():!1)}function Vi(r,e){return!e||e===Ni?U.createElement(r):U.createElementNS(e,r)}function ji(r,e){for(var t=r.firstChild;t;){var i=t.nextSibling;e.appendChild(t),t=i}return e}function Nt(r,e,t){r[t]!==e[t]&&(r[t]=e[t],r[t]?r.setAttribute(t,""):r.removeAttribute(t))}var pi={OPTION:function(r,e){var t=r.parentNode;if(t){var i=t.nodeName.toUpperCase();i==="OPTGROUP"&&(t=t.parentNode,i=t&&t.nodeName.toUpperCase()),i==="SELECT"&&!t.hasAttribute("multiple")&&(r.hasAttribute("selected")&&!e.selected&&(r.setAttribute("selected","selected"),r.removeAttribute("selected")),t.selectedIndex=-1)}Nt(r,e,"selected")},INPUT:function(r,e){Nt(r,e,"checked"),Nt(r,e,"disabled"),r.value!==e.value&&(r.value=e.value),e.hasAttribute("value")||r.removeAttribute("value")},TEXTAREA:function(r,e){var t=e.value;r.value!==t&&(r.value=t);var i=r.firstChild;if(i){var s=i.nodeValue;if(s==t||!t&&s==r.placeholder)return;i.nodeValue=t}},SELECT:function(r,e){if(!e.hasAttribute("multiple")){for(var t=-1,i=0,s=r.firstChild,n,o;s;)if(o=s.nodeName&&s.nodeName.toUpperCase(),o==="OPTGROUP")n=s,s=n.firstChild;else{if(o==="OPTION"){if(s.hasAttribute("selected")){t=i;break}i++}s=s.nextSibling,!s&&n&&(s=n.nextSibling,n=null)}r.selectedIndex=t}}},We=1,mi=11,gi=3,vi=8;function ue(){}function Ji(r){if(r)return r.getAttribute&&r.getAttribute("id")||r.id}function Wi(r){return function(t,i,s){if(s||(s={}),typeof i=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var n=i;i=U.createElement("html"),i.innerHTML=n}else i=Bi(i);else i.nodeType===mi&&(i=i.firstElementChild);var o=s.getNodeKey||Ji,l=s.onBeforeNodeAdded||ue,a=s.onNodeAdded||ue,d=s.onBeforeElUpdated||ue,c=s.onElUpdated||ue,p=s.onBeforeNodeDiscarded||ue,m=s.onNodeDiscarded||ue,g=s.onBeforeElChildrenUpdated||ue,u=s.skipFromChildren||ue,v=s.addChild||function(_,S){return _.appendChild(S)},b=s.childrenOnly===!0,T=Object.create(null),Q=[];function P(_){Q.push(_)}function V(_,S){if(_.nodeType===We)for(var R=_.firstChild;R;){var w=void 0;S&&(w=o(R))?P(w):(m(R),R.firstChild&&V(R,S)),R=R.nextSibling}}function F(_,S,R){p(_)!==!1&&(S&&S.removeChild(_),m(_),V(_,R))}function N(_){if(_.nodeType===We||_.nodeType===mi)for(var S=_.firstChild;S;){var R=o(S);R&&(T[R]=S),N(S),S=S.nextSibling}}N(t);function f(_){a(_);for(var S=_.firstChild;S;){var R=S.nextSibling,w=o(S);if(w){var k=T[w];k&&dt(S,k)?(S.parentNode.replaceChild(k,S),X(k,S)):f(S)}else f(S);S=R}}function A(_,S,R){for(;S;){var w=S.nextSibling;(R=o(S))?P(R):F(S,_,!0),S=w}}function X(_,S,R){var w=o(S);if(w&&delete T[w],!R){var k=d(_,S);if(k===!1||(k instanceof HTMLElement&&(_=k,N(_)),r(_,S),c(_),g(_,S)===!1))return}_.nodeName!=="TEXTAREA"?te(_,S):pi.TEXTAREA(_,S)}function te(_,S){var R=u(_,S),w=S.firstChild,k=_.firstChild,Se,ie,we,Ke,ne;e:for(;w;){for(Ke=w.nextSibling,Se=o(w);!R&&k;){if(we=k.nextSibling,w.isSameNode&&w.isSameNode(k)){w=Ke,k=we;continue e}ie=o(k);var Ge=k.nodeType,oe=void 0;if(Ge===w.nodeType&&(Ge===We?(Se?Se!==ie&&((ne=T[Se])?we===ne?oe=!1:(_.insertBefore(ne,k),ie?P(ie):F(k,_,!0),k=ne,ie=o(k)):oe=!1):ie&&(oe=!1),oe=oe!==!1&&dt(k,w),oe&&X(k,w)):(Ge===gi||Ge==vi)&&(oe=!0,k.nodeValue!==w.nodeValue&&(k.nodeValue=w.nodeValue))),oe){w=Ke,k=we;continue e}ie?P(ie):F(k,_,!0),k=we}if(Se&&(ne=T[Se])&&dt(ne,w))R||v(_,ne),X(ne,w);else{var pt=l(w);pt!==!1&&(pt&&(w=pt),w.actualize&&(w=w.actualize(_.ownerDocument||U)),v(_,w),f(w))}w=Ke,k=we}A(_,k,ie);var Xt=pi[_.nodeName];Xt&&Xt(_,S)}var E=t,j=E.nodeType,re=i.nodeType;if(!b){if(j===We)re===We?dt(t,i)||(m(t),E=ji(t,Vi(i.nodeName,i.namespaceURI))):E=i;else if(j===gi||j===vi){if(re===j)return E.nodeValue!==i.nodeValue&&(E.nodeValue=i.nodeValue),E;E=i}}if(E===i)m(t);else{if(i.isSameNode&&i.isSameNode(E))return;if(X(E,i,b),Q)for(var ct=0,wi=Q.length;ct<wi;ct++){var ft=T[Q[ct]];ft&&F(ft,ft.parentNode,!1)}}return!b&&E!==t&&t.parentNode&&(E.actualize&&(E=E.actualize(t.ownerDocument||U)),t.parentNode.replaceChild(E,t)),E}}var qi=Wi(Di),Ft=qi;var ce=class{static patchWithClonedTree(e,t,i){let s=i.getActiveElement(),{selectionStart:n,selectionEnd:o}=s&&h.hasSelectionRange(s)?s:{},l=i.binding(ge),a=null;Ft(e,t,{childrenOnly:!1,onBeforeElUpdated:(d,c)=>{if(h.syncPendingAttrs(d,c),!e.isSameNode(d)&&d.hasAttribute(L)||h.isIgnored(d,l))return!1;if(s&&s.isSameNode(d)&&h.isFormInput(d))return h.mergeFocusedInput(d,c),!1;h.isNowTriggerFormExternal(c,i.binding(_t))&&(a=c)}}),a&&(i.unload(),Object.getPrototypeOf(a).submit.call(a)),i.silenceEvents(()=>h.restoreFocus(s,n,o))}constructor(e,t,i,s,n,o){this.view=e,this.liveSocket=e.liveSocket,this.container=t,this.id=i,this.rootID=e.root.id,this.html=s,this.streams=n,this.streamInserts={},this.streamComponentRestore={},this.targetCID=o,this.cidPatch=W(this.targetCID),this.pendingRemoves=[],this.phxRemove=this.liveSocket.binding("remove"),this.targetContainer=this.isCIDPatch()?this.targetCIDContainer(s):t,this.callbacks={beforeadded:[],beforeupdated:[],beforephxChildAdded:[],afteradded:[],afterupdated:[],afterdiscarded:[],afterphxChildAdded:[],aftertransitionsDiscarded:[]}}before(e,t){this.callbacks[`before${e}`].push(t)}after(e,t){this.callbacks[`after${e}`].push(t)}trackBefore(e,...t){this.callbacks[`before${e}`].forEach(i=>i(...t))}trackAfter(e,...t){this.callbacks[`after${e}`].forEach(i=>i(...t))}markPrunableContentForRemoval(){let e=this.liveSocket.binding(ge);h.all(this.container,`[${e}=append] > *, [${e}=prepend] > *`,t=>{t.setAttribute(vt,"")})}perform(e){let{view:t,liveSocket:i,html:s,container:n,targetContainer:o}=this;if(this.isCIDPatch()&&!o)return;let l=i.getActiveElement(),{selectionStart:a,selectionEnd:d}=l&&h.hasSelectionRange(l)?l:{},c=i.binding(ge),p=i.binding(Fe),m=i.binding(Me),g=i.binding(_t),u=[],v=[],b=[],T=null;function Q(P,V,F=!1){let N={childrenOnly:P.getAttribute($)===null&&!F,getNodeKey:f=>h.isPhxDestroyed(f)?null:e?f.id:f.id||f.getAttribute&&f.getAttribute(st),skipFromChildren:f=>f.getAttribute(c)===nt,addChild:(f,A)=>{let{ref:X,streamAt:te}=this.getStreamInsert(A);if(X===void 0)return f.appendChild(A);if(this.setStreamRef(A,X),te===0)f.insertAdjacentElement("afterbegin",A);else if(te===-1){let E=f.lastElementChild;if(E&&!E.hasAttribute(Te)){let j=Array.from(f.children).find(re=>!re.hasAttribute(Te));f.insertBefore(A,j)}else f.appendChild(A)}else if(te>0){let E=Array.from(f.children)[te];f.insertBefore(A,E)}},onBeforeNodeAdded:f=>{h.maintainPrivateHooks(f,f,p,m),this.trackBefore("added",f);let A=f;return this.streamComponentRestore[f.id]&&(A=this.streamComponentRestore[f.id],delete this.streamComponentRestore[f.id],Q.call(this,A,f,!0)),A},onNodeAdded:f=>{f.getAttribute&&this.maybeReOrderStream(f,!0),f instanceof HTMLImageElement&&f.srcset?f.srcset=f.srcset:f instanceof HTMLVideoElement&&f.autoplay&&f.play(),h.isNowTriggerFormExternal(f,g)&&(T=f),(h.isPhxChild(f)&&t.ownsElement(f)||h.isPhxSticky(f)&&t.ownsElement(f.parentNode))&&this.trackAfter("phxChildAdded",f),u.push(f)},onNodeDiscarded:f=>this.onNodeDiscarded(f),onBeforeNodeDiscarded:f=>f.getAttribute&&f.getAttribute(vt)!==null?!0:!(f.parentElement!==null&&f.id&&h.isPhxUpdate(f.parentElement,c,[nt,"append","prepend"])||this.maybePendingRemove(f)||this.skipCIDSibling(f)),onElUpdated:f=>{h.isNowTriggerFormExternal(f,g)&&(T=f),v.push(f),this.maybeReOrderStream(f,!1)},onBeforeElUpdated:(f,A)=>{if(f.id&&f.isSameNode(P)&&f.id!==A.id)return N.onNodeDiscarded(f),f.replaceWith(A),N.onNodeAdded(A);if(h.syncPendingAttrs(f,A),h.maintainPrivateHooks(f,A,p,m),h.cleanChildNodes(A,c),this.skipCIDSibling(A))return this.maybeReOrderStream(f),!1;if(h.isPhxSticky(f))return[M,ee,J].map(E=>[E,f.getAttribute(E),A.getAttribute(E)]).forEach(([E,j,re])=>{re&&j!==re&&f.setAttribute(E,re)}),!1;if(h.isIgnored(f,c)||f.form&&f.form.isSameNode(T))return this.trackBefore("updated",f,A),h.mergeAttrs(f,A,{isIgnored:h.isIgnored(f,c)}),v.push(f),h.applyStickyOperations(f),!1;if(f.type==="number"&&f.validity&&f.validity.badInput)return!1;let X=l&&f.isSameNode(l)&&h.isFormInput(f),te=X&&this.isChangedSelect(f,A);if(f.hasAttribute(O)){h.isUploadInput(f)&&(h.mergeAttrs(f,A,{isIgnored:!0}),this.trackBefore("updated",f,A),v.push(f)),h.applyStickyOperations(f);let j=f.hasAttribute(L)?h.private(f,L)||f.cloneNode(!0):null;j&&(h.putPrivate(f,L,j),X||(f=j))}if(h.isPhxChild(A)){let E=f.getAttribute(M);return h.mergeAttrs(f,A,{exclude:[ee]}),E!==""&&f.setAttribute(M,E),f.setAttribute(J,this.rootID),h.applyStickyOperations(f),!1}return h.copyPrivates(A,f),X&&f.type!=="hidden"&&!te?(this.trackBefore("updated",f,A),h.mergeFocusedInput(f,A),h.syncAttrsToProps(f),v.push(f),h.applyStickyOperations(f),!1):(te&&f.blur(),h.isPhxUpdate(A,c,["append","prepend"])&&b.push(new Je(f,A,A.getAttribute(c))),h.syncAttrsToProps(A),h.applyStickyOperations(A),this.trackBefore("updated",f,A),f)}};Ft(P,V,N)}return this.trackBefore("added",n),this.trackBefore("updated",n,n),i.time("morphdom",()=>{this.streams.forEach(([P,V,F,N])=>{V.forEach(([f,A,X])=>{this.streamInserts[f]={ref:P,streamAt:A,limit:X,reset:N}}),N!==void 0&&h.all(n,`[${Te}="${P}"]`,f=>{this.removeStreamChildElement(f)}),F.forEach(f=>{let A=n.querySelector(`[id="${f}"]`);A&&this.removeStreamChildElement(A)})}),e&&h.all(this.container,`[${c}=${nt}]`,P=>{this.liveSocket.owner(P,V=>{V===this.view&&Array.from(P.children).forEach(F=>{this.removeStreamChildElement(F)})})}),Q.call(this,o,s)}),i.isDebugEnabled()&&(ri(),Array.from(document.querySelectorAll("input[name=id]")).forEach(P=>{P.form&&console.error(`Detected an input with name="id" inside a form! This will cause problems when patching the DOM.
-`,P)})),b.length>0&&i.time("post-morph append/prepend restoration",()=>{b.forEach(P=>P.perform())}),i.silenceEvents(()=>h.restoreFocus(l,a,d)),h.dispatchEvent(document,"phx:update"),u.forEach(P=>this.trackAfter("added",P)),v.forEach(P=>this.trackAfter("updated",P)),this.transitionPendingRemoves(),T&&(i.unload(),Object.getPrototypeOf(T).submit.call(T)),!0}onNodeDiscarded(e){(h.isPhxChild(e)||h.isPhxSticky(e))&&this.liveSocket.destroyViewByEl(e),this.trackAfter("discarded",e)}maybePendingRemove(e){return e.getAttribute&&e.getAttribute(this.phxRemove)!==null?(this.pendingRemoves.push(e),!0):!1}removeStreamChildElement(e){this.streamInserts[e.id]?(this.streamComponentRestore[e.id]=e,e.remove()):this.maybePendingRemove(e)||(e.remove(),this.onNodeDiscarded(e))}getStreamInsert(e){return(e.id?this.streamInserts[e.id]:{})||{}}setStreamRef(e,t){h.putSticky(e,Te,i=>i.setAttribute(Te,t))}maybeReOrderStream(e,t){let{ref:i,streamAt:s,reset:n}=this.getStreamInsert(e);if(s!==void 0&&(this.setStreamRef(e,i),!(!n&&!t)&&e.parentElement)){if(s===0)e.parentElement.insertBefore(e,e.parentElement.firstElementChild);else if(s>0){let o=Array.from(e.parentElement.children),l=o.indexOf(e);if(s>=o.length-1)e.parentElement.appendChild(e);else{let a=o[s];l>s?e.parentElement.insertBefore(e,a):e.parentElement.insertBefore(e,a.nextElementSibling)}}this.maybeLimitStream(e)}}maybeLimitStream(e){let{limit:t}=this.getStreamInsert(e),i=t!==null&&Array.from(e.parentElement.children);t&&t<0&&i.length>t*-1?i.slice(0,i.length+t).forEach(s=>this.removeStreamChildElement(s)):t&&t>=0&&i.length>t&&i.slice(t).forEach(s=>this.removeStreamChildElement(s))}transitionPendingRemoves(){let{pendingRemoves:e,liveSocket:t}=this;e.length>0&&t.transitionRemoves(e,!1,()=>{e.forEach(i=>{let s=h.firstPhxChild(i);s&&t.destroyViewByEl(s),i.remove()}),this.trackAfter("transitionsDiscarded",e)})}isChangedSelect(e,t){return!(e instanceof HTMLSelectElement)||e.multiple?!1:e.options.length!==t.options.length?!0:(t.value=e.value,!e.isEqualNode(t))}isCIDPatch(){return this.cidPatch}skipCIDSibling(e){return e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute(it)}targetCIDContainer(e){if(!this.isCIDPatch())return;let[t,...i]=h.findComponentNodeList(this.container,this.targetCID);return i.length===0&&h.childNodeLength(e)===1?t:t&&t.parentNode}indexOf(e,t){return Array.from(e.children).indexOf(t)}};var Ki=new Set(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),Gi=new Set(["'",'"']),bi=(r,e,t)=>{let i=0,s=!1,n,o,l,a,d,c,p=r.match(/^(\s*(?:<!--.*?-->\s*)*)<([^\s\/>]+)/);if(p===null)throw new Error(`malformed html ${r}`);for(i=p[0].length,n=p[1],l=p[2],a=i,i;i<r.length&&r.charAt(i)!==">";i++)if(r.charAt(i)==="="){let u=r.slice(i-3,i)===" id";i++;let v=r.charAt(i);if(Gi.has(v)){let b=i;for(i++,i;i<r.length&&r.charAt(i)!==v;i++);if(u){d=r.slice(b+1,i);break}}}let m=r.length-1;for(s=!1;m>=n.length+l.length;){let u=r.charAt(m);if(s)u==="-"&&r.slice(m-3,m)==="<!-"?(s=!1,m-=4):m-=1;else if(u===">"&&r.slice(m-2,m)==="--")s=!0,m-=3;else{if(u===">")break;m-=1}}o=r.slice(m+1,r.length);let g=Object.keys(e).map(u=>e[u]===!0?u:`${u}="${e[u]}"`).join(" ");if(t){let u=d?` id="${d}"`:"";Ki.has(l)?c=`<${l}${u}${g===""?"":" "}${g}/>`:c=`<${l}${u}${g===""?"":" "}${g}></${l}>`}else{let u=r.slice(a,m+1);c=`<${l}${g===""?"":" "}${g}${u}`}return[c,n,o]},He=class{static extract(e){let{[xt]:t,[Tt]:i,[It]:s}=e;return delete e[xt],delete e[Tt],delete e[It],{diff:e,title:s,reply:t||null,events:i||[]}}constructor(e,t){this.viewId=e,this.rendered={},this.magicId=0,this.mergeDiff(t)}parentViewId(){return this.viewId}toString(e){let[t,i]=this.recursiveToString(this.rendered,this.rendered[H],e,!0,{});return[t,i]}recursiveToString(e,t=e[H],i,s,n){i=i?new Set(i):null;let o={buffer:"",components:t,onlyCids:i,streams:new Set};return this.toOutputBuffer(e,null,o,s,n),[o.buffer,o.streams]}componentCIDs(e){return Object.keys(e[H]||{}).map(t=>parseInt(t))}isComponentOnlyDiff(e){return e[H]?Object.keys(e).length===1:!1}getComponent(e,t){return e[H][t]}resetRender(e){this.rendered[H][e]&&(this.rendered[H][e].reset=!0)}mergeDiff(e){let t=e[H],i={};if(delete e[H],this.rendered=this.mutableMerge(this.rendered,e),this.rendered[H]=this.rendered[H]||{},t){let s=this.rendered[H];for(let n in t)t[n]=this.cachedFindComponent(n,t[n],s,t,i);for(let n in t)s[n]=t[n];e[H]=t}}cachedFindComponent(e,t,i,s,n){if(n[e])return n[e];{let o,l,a=t[G];if(W(a)){let d;a>0?d=this.cachedFindComponent(a,s[a],i,s,n):d=i[-a],l=d[G],o=this.cloneMerge(d,t,!0),o[G]=l}else o=t[G]!==void 0||i[e]===void 0?t:this.cloneMerge(i[e],t,!1);return n[e]=o,o}}mutableMerge(e,t){return t[G]!==void 0?t:(this.doMutableMerge(e,t),e)}doMutableMerge(e,t){for(let i in t){let s=t[i],n=e[i];be(s)&&s[G]===void 0&&be(n)?this.doMutableMerge(n,s):e[i]=s}e[at]&&(e.newRender=!0)}cloneMerge(e,t,i){let s=I(I({},e),t);for(let n in s){let o=t[n],l=e[n];be(o)&&o[G]===void 0&&be(l)?s[n]=this.cloneMerge(l,o,i):o===void 0&&be(l)&&(s[n]=this.cloneMerge(l,{},i))}return i?(delete s.magicId,delete s.newRender):e[at]&&(s.newRender=!0),s}componentToString(e){let[t,i]=this.recursiveCIDToString(this.rendered[H],e,null),[s,n,o]=bi(t,{});return[s,i]}pruneCIDs(e){e.forEach(t=>delete this.rendered[H][t])}get(){return this.rendered}isNewFingerprint(e={}){return!!e[G]}templateStatic(e,t){return typeof e=="number"?t[e]:e}nextMagicID(){return this.magicId++,`m${this.magicId}-${this.parentViewId()}`}toOutputBuffer(e,t,i,s,n={}){if(e[Be])return this.comprehensionToBuffer(e,t,i);let{[G]:o}=e;o=this.templateStatic(o,t);let l=e[at],a=i.buffer;l&&(i.buffer=""),s&&l&&!e.magicId&&(e.newRender=!0,e.magicId=this.nextMagicID()),i.buffer+=o[0];for(let d=1;d<o.length;d++)this.dynamicToBuffer(e[d-1],t,i,s),i.buffer+=o[d];if(l){let d=!1,c;s||e.magicId?(d=s&&!e.newRender,c=I({[st]:e.magicId},n)):c=n,d&&(c[it]=!0);let[p,m,g]=bi(i.buffer,c,d);e.newRender=!1,i.buffer=a+m+p+g}}comprehensionToBuffer(e,t,i){let{[Be]:s,[G]:n,[Ot]:o}=e,[l,a,d,c]=o||[null,{},[],null];n=this.templateStatic(n,t);let p=t||e[si];for(let m=0;m<s.length;m++){let g=s[m];i.buffer+=n[0];for(let u=1;u<n.length;u++)this.dynamicToBuffer(g[u-1],p,i,!1),i.buffer+=n[u]}o!==void 0&&(e[Be].length>0||d.length>0||c)&&(delete e[Ot],e[Be]=[],i.streams.add(o))}dynamicToBuffer(e,t,i,s){if(typeof e=="number"){let[n,o]=this.recursiveCIDToString(i.components,e,i.onlyCids);i.buffer+=n,i.streams=new Set([...i.streams,...o])}else be(e)?this.toOutputBuffer(e,t,i,s,{}):i.buffer+=e}recursiveCIDToString(e,t,i){let s=e[t]||x(`no component for CID ${t}`,e),n={[$]:t},o=i&&!i.has(t);s.newRender=!o,s.magicId=`c${t}-${this.parentViewId()}`;let l=!s.reset,[a,d]=this.recursiveToString(s,e,i,l,n);return delete s.reset,[a,d]}};var Ai=[],_i=200,zi={exec(r,e,t,i,s,n){let[o,l]=n||[null,{callback:n&&n.callback}];(t.charAt(0)==="["?JSON.parse(t):[[o,l]]).forEach(([d,c])=>{d===o&&(c=I(I({},l),c),c.callback=c.callback||l.callback),this.filterToEls(i.liveSocket,s,c).forEach(p=>{this[`exec_${d}`](r,e,t,i,s,p,c)})})},isVisible(r){return!!(r.offsetWidth||r.offsetHeight||r.getClientRects().length>0)},isInViewport(r){let e=r.getBoundingClientRect(),t=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return e.right>0&&e.bottom>0&&e.left<i&&e.top<t},exec_exec(r,e,t,i,s,n,{attr:o,to:l}){(l?h.all(document,l):[s]).forEach(d=>{let c=d.getAttribute(o);if(!c)throw new Error(`expected ${o} to contain JS command on "${l}"`);i.liveSocket.execJS(d,c,e)})},exec_dispatch(r,e,t,i,s,n,{event:o,detail:l,bubbles:a}){l=l||{},l.dispatcher=s,h.dispatchEvent(n,o,{detail:l,bubbles:a})},exec_push(r,e,t,i,s,n,o){let{event:l,data:a,target:d,page_loading:c,loading:p,value:m,dispatcher:g,callback:u}=o,v={loading:p,value:m,target:d,page_loading:!!c},b=e==="change"&&g?g:s,T=d||b.getAttribute(i.binding("target"))||b,Q=(P,V)=>{if(P.isConnected())if(e==="change"){let{newCid:F,_target:N}=o;N=N||(h.isFormInput(s)?s.name:void 0),N&&(v._target=N),P.pushInput(s,V,F,l||t,v,u)}else if(e==="submit"){let{submitter:F}=o;P.submitForm(s,V,l||t,F,v,u)}else P.pushEvent(e,s,V,l||t,a,v,u)};o.targetView&&o.targetCtx?Q(o.targetView,o.targetCtx):i.withinTargets(T,Q)},exec_navigate(r,e,t,i,s,n,{href:o,replace:l}){i.liveSocket.historyRedirect(r,o,l?"replace":"push",null,s)},exec_patch(r,e,t,i,s,n,{href:o,replace:l}){i.liveSocket.pushHistoryPatch(r,o,l?"replace":"push",s)},exec_focus(r,e,t,i,s,n){window.requestAnimationFrame(()=>de.attemptFocus(n))},exec_focus_first(r,e,t,i,s,n){window.requestAnimationFrame(()=>de.focusFirstInteractive(n)||de.focusFirst(n))},exec_push_focus(r,e,t,i,s,n){window.requestAnimationFrame(()=>Ai.push(n||s))},exec_pop_focus(r,e,t,i,s,n){window.requestAnimationFrame(()=>{let o=Ai.pop();o&&o.focus()})},exec_add_class(r,e,t,i,s,n,{names:o,transition:l,time:a,blocking:d}){this.addOrRemoveClasses(n,o,[],l,a,i,d)},exec_remove_class(r,e,t,i,s,n,{names:o,transition:l,time:a,blocking:d}){this.addOrRemoveClasses(n,[],o,l,a,i,d)},exec_toggle_class(r,e,t,i,s,n,{names:o,transition:l,time:a,blocking:d}){this.toggleClasses(n,o,l,a,i,d)},exec_toggle_attr(r,e,t,i,s,n,{attr:[o,l,a]}){this.toggleAttr(n,o,l,a)},exec_transition(r,e,t,i,s,n,{time:o,transition:l,blocking:a}){this.addOrRemoveClasses(n,[],[],l,o,i,a)},exec_toggle(r,e,t,i,s,n,{display:o,ins:l,outs:a,time:d,blocking:c}){this.toggle(e,i,n,o,l,a,d,c)},exec_show(r,e,t,i,s,n,{display:o,transition:l,time:a,blocking:d}){this.show(e,i,n,o,l,a,d)},exec_hide(r,e,t,i,s,n,{display:o,transition:l,time:a,blocking:d}){this.hide(e,i,n,o,l,a,d)},exec_set_attr(r,e,t,i,s,n,{attr:[o,l]}){this.setOrRemoveAttrs(n,[[o,l]],[])},exec_remove_attr(r,e,t,i,s,n,{attr:o}){this.setOrRemoveAttrs(n,[],[o])},show(r,e,t,i,s,n,o){this.isVisible(t)||this.toggle(r,e,t,i,s,null,n,o)},hide(r,e,t,i,s,n,o){this.isVisible(t)&&this.toggle(r,e,t,i,null,s,n,o)},toggle(r,e,t,i,s,n,o,l){o=o||_i;let[a,d,c]=s||[[],[],[]],[p,m,g]=n||[[],[],[]];if(a.length>0||p.length>0)if(this.isVisible(t)){let u=()=>{this.addOrRemoveClasses(t,m,a.concat(d).concat(c)),window.requestAnimationFrame(()=>{this.addOrRemoveClasses(t,p,[]),window.requestAnimationFrame(()=>this.addOrRemoveClasses(t,g,m))})},v=()=>{this.addOrRemoveClasses(t,[],p.concat(g)),h.putSticky(t,"toggle",b=>b.style.display="none"),t.dispatchEvent(new Event("phx:hide-end"))};t.dispatchEvent(new Event("phx:hide-start")),l===!1?(u(),setTimeout(v,o)):e.transition(o,u,v)}else{if(r==="remove")return;let u=()=>{this.addOrRemoveClasses(t,d,p.concat(m).concat(g));let b=i||this.defaultDisplay(t);h.putSticky(t,"toggle",T=>T.style.display=b),window.requestAnimationFrame(()=>{this.addOrRemoveClasses(t,a,[]),window.requestAnimationFrame(()=>this.addOrRemoveClasses(t,c,d))})},v=()=>{this.addOrRemoveClasses(t,[],a.concat(c)),t.dispatchEvent(new Event("phx:show-end"))};t.dispatchEvent(new Event("phx:show-start")),l===!1?(u(),setTimeout(v,o)):e.transition(o,u,v)}else this.isVisible(t)?window.requestAnimationFrame(()=>{t.dispatchEvent(new Event("phx:hide-start")),h.putSticky(t,"toggle",u=>u.style.display="none"),t.dispatchEvent(new Event("phx:hide-end"))}):window.requestAnimationFrame(()=>{t.dispatchEvent(new Event("phx:show-start"));let u=i||this.defaultDisplay(t);h.putSticky(t,"toggle",v=>v.style.display=u),t.dispatchEvent(new Event("phx:show-end"))})},toggleClasses(r,e,t,i,s,n){window.requestAnimationFrame(()=>{let[o,l]=h.getSticky(r,"classes",[[],[]]),a=e.filter(c=>o.indexOf(c)<0&&!r.classList.contains(c)),d=e.filter(c=>l.indexOf(c)<0&&r.classList.contains(c));this.addOrRemoveClasses(r,a,d,t,i,s,n)})},toggleAttr(r,e,t,i){r.hasAttribute(e)?i!==void 0?r.getAttribute(e)===t?this.setOrRemoveAttrs(r,[[e,i]],[]):this.setOrRemoveAttrs(r,[[e,t]],[]):this.setOrRemoveAttrs(r,[],[e]):this.setOrRemoveAttrs(r,[[e,t]],[])},addOrRemoveClasses(r,e,t,i,s,n,o){s=s||_i;let[l,a,d]=i||[[],[],[]];if(l.length>0){let c=()=>{this.addOrRemoveClasses(r,a,[].concat(l).concat(d)),window.requestAnimationFrame(()=>{this.addOrRemoveClasses(r,l,[]),window.requestAnimationFrame(()=>this.addOrRemoveClasses(r,d,a))})},p=()=>this.addOrRemoveClasses(r,e.concat(d),t.concat(l).concat(a));o===!1?(c(),setTimeout(p,s)):n.transition(s,c,p);return}window.requestAnimationFrame(()=>{let[c,p]=h.getSticky(r,"classes",[[],[]]),m=e.filter(b=>c.indexOf(b)<0&&!r.classList.contains(b)),g=t.filter(b=>p.indexOf(b)<0&&r.classList.contains(b)),u=c.filter(b=>t.indexOf(b)<0).concat(m),v=p.filter(b=>e.indexOf(b)<0).concat(g);h.putSticky(r,"classes",b=>(b.classList.remove(...v),b.classList.add(...u),[u,v]))})},setOrRemoveAttrs(r,e,t){let[i,s]=h.getSticky(r,"attrs",[[],[]]),n=e.map(([a,d])=>a).concat(t),o=i.filter(([a,d])=>!n.includes(a)).concat(e),l=s.filter(a=>!n.includes(a)).concat(t);h.putSticky(r,"attrs",a=>(l.forEach(d=>a.removeAttribute(d)),o.forEach(([d,c])=>a.setAttribute(d,c)),[o,l]))},hasAllClasses(r,e){return e.every(t=>r.classList.contains(t))},isToggledOut(r,e){return!this.isVisible(r)||this.hasAllClasses(r,e)},filterToEls(r,e,{to:t}){let i=()=>{if(typeof t=="string")return document.querySelectorAll(t);if(t.closest){let s=e.closest(t.closest);return s?[s]:[]}else if(t.inner)return e.querySelectorAll(t.inner)};return t?r.jsQuerySelectorAll(e,t,i):[e]},defaultDisplay(r){return{tr:"table-row",td:"table-cell"}[r.tagName.toLowerCase()]||"block"},transitionClasses(r){if(!r)return null;let[e,t,i]=Array.isArray(r)?r:[r.split(" "),[],[]];return e=Array.isArray(e)?e:e.split(" "),t=Array.isArray(t)?t:t.split(" "),i=Array.isArray(i)?i:i.split(" "),[e,t,i]}},y=zi;var Mt="hookId",Yi=1,Y=class{static makeID(){return Yi++}static elementID(e){return h.private(e,Mt)}constructor(e,t,i){this.el=t,this.__attachView(e),this.__callbacks=i,this.__listeners=new Set,this.__isDisconnected=!1,h.putPrivate(this.el,Mt,this.constructor.makeID());for(let s in this.__callbacks)this[s]=this.__callbacks[s]}__attachView(e){e?(this.__view=()=>e,this.liveSocket=e.liveSocket):(this.__view=()=>{throw new Error(`hook not yet attached to a live view: ${this.el.outerHTML}`)},this.liveSocket=null)}__mounted(){this.mounted&&this.mounted()}__updated(){this.updated&&this.updated()}__beforeUpdate(){this.beforeUpdate&&this.beforeUpdate()}__destroyed(){this.destroyed&&this.destroyed(),h.deletePrivate(this.el,Mt)}__reconnected(){this.__isDisconnected&&(this.__isDisconnected=!1,this.reconnected&&this.reconnected())}__disconnected(){this.__isDisconnected=!0,this.disconnected&&this.disconnected()}js(){let e=this;return{exec(t){e.__view().liveSocket.execJS(e.el,t,"hook")},show(t,i={}){let s=e.__view().liveSocket.owner(t);y.show("hook",s,t,i.display,i.transition,i.time,i.blocking)},hide(t,i={}){let s=e.__view().liveSocket.owner(t);y.hide("hook",s,t,null,i.transition,i.time,i.blocking)},toggle(t,i={}){let s=e.__view().liveSocket.owner(t);i.in=y.transitionClasses(i.in),i.out=y.transitionClasses(i.out),y.toggle("hook",s,t,i.display,i.in,i.out,i.time,i.blocking)},addClass(t,i,s={}){i=Array.isArray(i)?i:i.split(" ");let n=e.__view().liveSocket.owner(t);y.addOrRemoveClasses(t,i,[],s.transition,s.time,n,s.blocking)},removeClass(t,i,s={}){s.transition=y.transitionClasses(s.transition),i=Array.isArray(i)?i:i.split(" ");let n=e.__view().liveSocket.owner(t);y.addOrRemoveClasses(t,[],i,s.transition,s.time,n,s.blocking)},toggleClass(t,i,s={}){s.transition=y.transitionClasses(s.transition),i=Array.isArray(i)?i:i.split(" ");let n=e.__view().liveSocket.owner(t);y.toggleClasses(t,i,s.transition,s.time,n,s.blocking)},transition(t,i,s={}){let n=e.__view().liveSocket.owner(t);y.addOrRemoveClasses(t,[],[],y.transitionClasses(i),s.time,n,s.blocking)},setAttribute(t,i,s){y.setOrRemoveAttrs(t,[[i,s]],[])},removeAttribute(t,i){y.setOrRemoveAttrs(t,[],[i])},toggleAttribute(t,i,s,n){y.toggleAttr(t,i,s,n)}}}pushEvent(e,t={},i){return i===void 0?new Promise((s,n)=>{try{this.__view().pushHookEvent(this.el,null,e,t,(l,a)=>s(l))===!1&&n(new Error("unable to push hook event. LiveView not connected"))}catch(o){n(o)}}):this.__view().pushHookEvent(this.el,null,e,t,i)}pushEventTo(e,t,i={},s){return s===void 0?new Promise((n,o)=>{try{this.__view().withinTargets(e,(l,a)=>{l.pushHookEvent(this.el,a,t,i,(c,p)=>n(c))===!1&&o(new Error("unable to push hook event. LiveView not connected"))})}catch(l){o(l)}}):this.__view().withinTargets(e,(n,o)=>n.pushHookEvent(this.el,o,t,i,s))}handleEvent(e,t){let i=(s,n)=>n?e:t(s.detail);return window.addEventListener(`phx:${e}`,i),this.__listeners.add(i),i}removeHandleEvent(e){let t=e(null,!0);window.removeEventListener(`phx:${t}`,e),this.__listeners.delete(e)}upload(e,t){return this.__view().dispatchUploads(null,e,t)}uploadTo(e,t,i){return this.__view().withinTargets(e,(s,n)=>{s.dispatchUploads(n,t,i)})}__cleanup__(){this.__listeners.forEach(e=>this.removeHandleEvent(e))}};var Qi=(r,e)=>{let t=r.endsWith("[]"),i=t?r.slice(0,-2):r;return i=i.replace(/([^\[\]]+)(\]?$)/,`${e}$1$2`),t&&(i+="[]"),i},ut=(r,e,t=[])=>{let c=e,{submitter:i}=c,s=Vt(c,["submitter"]),n;if(i&&i.name){let p=document.createElement("input");p.type="hidden";let m=i.getAttribute("form");m&&p.setAttribute("form",m),p.name=i.name,p.value=i.value,i.parentElement.insertBefore(p,i),n=p}let o=new FormData(r),l=[];o.forEach((p,m,g)=>{p instanceof File&&l.push(m)}),l.forEach(p=>o.delete(p));let a=new URLSearchParams,d=Array.from(r.elements);for(let[p,m]of o.entries())if(t.length===0||t.indexOf(p)>=0){let g=d.filter(b=>b.name===p),u=!g.some(b=>h.private(b,pe)||h.private(b,me)),v=g.every(b=>b.type==="hidden");u&&!(i&&i.name==p)&&!v&&a.append(Qi(p,"_unused_"),""),a.append(p,m)}i&&n&&i.parentElement.removeChild(n);for(let p in s)a.append(p,s[p]);return a.toString()},_e=class r{static closestView(e){let t=e.closest(q);return t?h.private(t,"view"):null}constructor(e,t,i,s,n){this.isDead=!1,this.liveSocket=t,this.flash=s,this.parent=i,this.root=i?i.root:this,this.el=e,h.putPrivate(this.el,"view",this),this.id=this.el.id,this.ref=0,this.lastAckRef=null,this.childJoins=0,this.loaderTimer=null,this.pendingDiffs=[],this.pendingForms=new Set,this.redirect=!1,this.href=null,this.joinCount=this.parent?this.parent.joinCount-1:0,this.joinAttempts=0,this.joinPending=!0,this.destroyed=!1,this.joinCallback=function(o){o&&o()},this.stopCallback=function(){},this.pendingJoinOps=this.parent?null:[],this.viewHooks={},this.formSubmits=[],this.children=this.parent?null:{},this.root.children[this.id]={},this.formsForRecovery={},this.channel=this.liveSocket.channel(`lv:${this.id}`,()=>{let o=this.href&&this.expandURL(this.href);return{redirect:this.redirect?o:void 0,url:this.redirect?void 0:o||void 0,params:this.connectParams(n),session:this.getSession(),static:this.getStatic(),flash:this.flash}})}setHref(e){this.href=e}setRedirect(e){this.redirect=!0,this.href=e}isMain(){return this.el.hasAttribute(ke)}connectParams(e){let t=this.liveSocket.params(this.el),i=h.all(document,`[${this.binding(jt)}]`).map(s=>s.src||s.href).filter(s=>typeof s=="string");return i.length>0&&(t._track_static=i),t._mounts=this.joinCount,t._mount_attempts=this.joinAttempts,t._live_referer=e,this.joinAttempts++,t}isConnected(){return this.channel.canPush()}getSession(){return this.el.getAttribute(M)}getStatic(){let e=this.el.getAttribute(ee);return e===""?null:e}destroy(e=function(){}){this.destroyAllChildren(),this.destroyed=!0,delete this.root.children[this.id],this.parent&&delete this.root.children[this.parent.id][this.id],clearTimeout(this.loaderTimer);let t=()=>{e();for(let i in this.viewHooks)this.destroyHook(this.viewHooks[i])};h.markPhxChildDestroyed(this.el),this.log("destroyed",()=>["the child has been removed from the parent"]),this.channel.leave().receive("ok",t).receive("error",t).receive("timeout",t)}setContainerClasses(...e){this.el.classList.remove(bt,ae,fe,At,Pe),this.el.classList.add(...e)}showLoader(e){if(clearTimeout(this.loaderTimer),e)this.loaderTimer=setTimeout(()=>this.showLoader(),e);else{for(let t in this.viewHooks)this.viewHooks[t].__disconnected();this.setContainerClasses(ae)}}execAll(e){h.all(this.el,`[${e}]`,t=>this.liveSocket.execJS(t,t.getAttribute(e)))}hideLoader(){clearTimeout(this.loaderTimer),this.setContainerClasses(bt),this.execAll(this.binding("connected"))}triggerReconnected(){for(let e in this.viewHooks)this.viewHooks[e].__reconnected()}log(e,t){this.liveSocket.log(this,e,t)}transition(e,t,i=function(){}){this.liveSocket.transition(e,t,i)}withinTargets(e,t,i=document,s){if(e instanceof HTMLElement||e instanceof SVGElement)return this.liveSocket.owner(e,n=>t(n,e));if(W(e))h.findComponentNodeList(s||this.el,e).length===0?x(`no component found matching phx-target of ${e}`):t(this,parseInt(e));else{let n=Array.from(i.querySelectorAll(e));n.length===0&&x(`nothing found matching the phx-target selector "${e}"`),n.forEach(o=>this.liveSocket.owner(o,l=>t(l,o)))}}applyDiff(e,t,i){this.log(e,()=>["",Le(t)]);let{diff:s,reply:n,events:o,title:l}=He.extract(t);i({diff:s,reply:n,events:o}),(typeof l=="string"||e=="mount")&&window.requestAnimationFrame(()=>h.putTitle(l))}onJoin(e){let{rendered:t,container:i,liveview_version:s}=e;if(i){let[n,o]=i;this.el=h.replaceRootContainer(this.el,n,o)}this.childJoins=0,this.joinPending=!0,this.flash=null,this.root===this&&(this.formsForRecovery=this.getFormsForRecovery()),this.isMain()&&window.history.state===null&&this.liveSocket.replaceRootHistory(),s!==this.liveSocket.version()&&console.error(`LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${s}. To avoid issues, please ensure that your assets use the same version as the server.`),D.dropLocal(this.liveSocket.localStorage,window.location.pathname,Qe),this.applyDiff("mount",t,({diff:n,events:o})=>{this.rendered=new He(this.id,n);let[l,a]=this.renderContainer(null,"join");this.dropPendingRefs(),this.joinCount++,this.joinAttempts=0,this.maybeRecoverForms(l,()=>{this.onJoinComplete(e,l,a,o)})})}dropPendingRefs(){h.all(document,`[${O}="${this.refSrc()}"]`,e=>{e.removeAttribute(le),e.removeAttribute(O),e.removeAttribute(L)})}onJoinComplete({live_patch:e},t,i,s){if(this.joinCount>1||this.parent&&!this.parent.isJoinPending())return this.applyJoinPatch(e,t,i,s);h.findPhxChildrenInFragment(t,this.id).filter(o=>{let l=o.id&&this.el.querySelector(`[id="${o.id}"]`),a=l&&l.getAttribute(ee);return a&&o.setAttribute(ee,a),l&&l.setAttribute(J,this.root.id),this.joinChild(o)}).length===0?this.parent?(this.root.pendingJoinOps.push([this,()=>this.applyJoinPatch(e,t,i,s)]),this.parent.ackJoin(this)):(this.onAllChildJoinsComplete(),this.applyJoinPatch(e,t,i,s)):this.root.pendingJoinOps.push([this,()=>this.applyJoinPatch(e,t,i,s)])}attachTrueDocEl(){this.el=h.byId(this.id),this.el.setAttribute(J,this.root.id)}execNewMounted(e=this.el){let t=this.binding(Fe),i=this.binding(Me);h.all(e,`[${t}], [${i}]`,s=>{this.ownsElement(s)&&(h.maintainPrivateHooks(s,s,t,i),this.maybeAddNewHook(s))}),h.all(e,`[${this.binding(Re)}], [data-phx-${Re}]`,s=>{this.ownsElement(s)&&this.maybeAddNewHook(s)}),h.all(e,`[${this.binding(yt)}]`,s=>{this.ownsElement(s)&&this.maybeMounted(s)})}applyJoinPatch(e,t,i,s){this.attachTrueDocEl();let n=new ce(this,this.el,this.id,t,i,null);if(n.markPrunableContentForRemoval(),this.performPatch(n,!1,!0),this.joinNewChildren(),this.execNewMounted(),this.joinPending=!1,this.liveSocket.dispatchEvents(s),this.applyPendingUpdates(),e){let{kind:o,to:l}=e;this.liveSocket.historyPatch(l,o)}this.hideLoader(),this.joinCount>1&&this.triggerReconnected(),this.stopCallback()}triggerBeforeUpdateHook(e,t){this.liveSocket.triggerDOM("onBeforeElUpdated",[e,t]);let i=this.getHook(e),s=i&&h.isIgnored(e,this.binding(ge));if(i&&!e.isEqualNode(t)&&!(s&&oi(e.dataset,t.dataset)))return i.__beforeUpdate(),i}maybeMounted(e){let t=e.getAttribute(this.binding(yt)),i=t&&h.private(e,"mounted");t&&!i&&(this.liveSocket.execJS(e,t),h.putPrivate(e,"mounted",!0))}maybeAddNewHook(e){let t=this.addHook(e);t&&t.__mounted()}performPatch(e,t,i=!1){let s=[],n=!1,o=new Set;return this.liveSocket.triggerDOM("onPatchStart",[e.targetContainer]),e.after("added",l=>{this.liveSocket.triggerDOM("onNodeAdded",[l]);let a=this.binding(Fe),d=this.binding(Me);h.maintainPrivateHooks(l,l,a,d),this.maybeAddNewHook(l),l.getAttribute&&this.maybeMounted(l)}),e.after("phxChildAdded",l=>{h.isPhxSticky(l)?this.liveSocket.joinRootViews():n=!0}),e.before("updated",(l,a)=>{this.triggerBeforeUpdateHook(l,a)&&o.add(l.id)}),e.after("updated",l=>{o.has(l.id)&&this.getHook(l).__updated()}),e.after("discarded",l=>{l.nodeType===Node.ELEMENT_NODE&&s.push(l)}),e.after("transitionsDiscarded",l=>this.afterElementsRemoved(l,t)),e.perform(i),this.afterElementsRemoved(s,t),this.liveSocket.triggerDOM("onPatchEnd",[e.targetContainer]),n}afterElementsRemoved(e,t){let i=[];e.forEach(s=>{let n=h.all(s,`[${$}]`),o=h.all(s,`[${this.binding(Re)}], [data-phx-hook]`);n.concat(s).forEach(l=>{let a=this.componentID(l);W(a)&&i.indexOf(a)===-1&&i.push(a)}),o.concat(s).forEach(l=>{let a=this.getHook(l);a&&this.destroyHook(a)})}),t&&this.maybePushComponentsDestroyed(i)}joinNewChildren(){h.findPhxChildren(this.el,this.id).forEach(e=>this.joinChild(e))}maybeRecoverForms(e,t){let i=this.binding("change"),s=this.root.formsForRecovery,n=document.createElement("template");n.innerHTML=e;let o=n.content.firstElementChild;o.id=this.id,o.setAttribute(J,this.root.id),o.setAttribute(M,this.getSession()),o.setAttribute(ee,this.getStatic()),o.setAttribute(Z,this.parent?this.parent.id:null);let l=h.all(n.content,"form").filter(a=>a.id&&s[a.id]).filter(a=>!this.pendingForms.has(a.id)).filter(a=>s[a.id].getAttribute(i)===a.getAttribute(i)).map(a=>[s[a.id],a]);if(l.length===0)return t();l.forEach(([a,d],c)=>{this.pendingForms.add(d.id),this.pushFormRecovery(a,d,n.content.firstElementChild,()=>{this.pendingForms.delete(d.id),c===l.length-1&&t()})})}getChildById(e){return this.root.children[this.id][e]}getDescendentByEl(e){var t;return e.id===this.id?this:(t=this.children[e.getAttribute(Z)])==null?void 0:t[e.id]}destroyDescendent(e){for(let t in this.root.children)for(let i in this.root.children[t])if(i===e)return this.root.children[t][i].destroy()}joinChild(e){if(!this.getChildById(e.id)){let i=new r(e,this.liveSocket,this);return this.root.children[this.id][i.id]=i,i.join(),this.childJoins++,!0}}isJoinPending(){return this.joinPending}ackJoin(e){this.childJoins--,this.childJoins===0&&(this.parent?this.parent.ackJoin(this):this.onAllChildJoinsComplete())}onAllChildJoinsComplete(){this.pendingForms.clear(),this.formsForRecovery={},this.joinCallback(()=>{this.pendingJoinOps.forEach(([e,t])=>{e.isDestroyed()||t()}),this.pendingJoinOps=[]})}update(e,t){if(this.isJoinPending()||this.liveSocket.hasPendingLink()&&this.root.isMain())return this.pendingDiffs.push({diff:e,events:t});this.rendered.mergeDiff(e);let i=!1;this.rendered.isComponentOnlyDiff(e)?this.liveSocket.time("component patch complete",()=>{h.findExistingParentCIDs(this.el,this.rendered.componentCIDs(e)).forEach(n=>{this.componentPatch(this.rendered.getComponent(e,n),n)&&(i=!0)})}):Lt(e)||this.liveSocket.time("full patch complete",()=>{let[s,n]=this.renderContainer(e,"update"),o=new ce(this,this.el,this.id,s,n,null);i=this.performPatch(o,!0)}),this.liveSocket.dispatchEvents(t),i&&this.joinNewChildren()}renderContainer(e,t){return this.liveSocket.time(`toString diff (${t})`,()=>{let i=this.el.tagName,s=e?this.rendered.componentCIDs(e):null,[n,o]=this.rendered.toString(s);return[`<${i}>${n}</${i}>`,o]})}componentPatch(e,t){if(Lt(e))return!1;let[i,s]=this.rendered.componentToString(t),n=new ce(this,this.el,this.id,i,s,t);return this.performPatch(n,!0)}getHook(e){return this.viewHooks[Y.elementID(e)]}addHook(e){let t=Y.elementID(e);if(t&&!this.viewHooks[t]){let i=h.getCustomElHook(e)||x(`no hook found for custom element: ${e.id}`);return this.viewHooks[t]=i,i.__attachView(this),i}else{if(t||!e.getAttribute)return;{let i=e.getAttribute(`data-phx-${Re}`)||e.getAttribute(this.binding(Re));if(i&&!this.ownsElement(e))return;let s=this.liveSocket.getHookCallbacks(i);if(s){e.id||x(`no DOM ID for hook "${i}". Hooks require a unique ID on each element.`,e);let n=new Y(this,e,s);return this.viewHooks[Y.elementID(n.el)]=n,n}else i!==null&&x(`unknown hook found for "${i}"`,e)}}}destroyHook(e){e.__destroyed(),e.__cleanup__(),delete this.viewHooks[Y.elementID(e.el)]}applyPendingUpdates(){this.pendingDiffs.forEach(({diff:e,events:t})=>this.update(e,t)),this.pendingDiffs=[],this.eachChild(e=>e.applyPendingUpdates())}eachChild(e){let t=this.root.children[this.id]||{};for(let i in t)e(this.getChildById(i))}onChannel(e,t){this.liveSocket.onChannel(this.channel,e,i=>{this.isJoinPending()?this.root.pendingJoinOps.push([this,()=>t(i)]):this.liveSocket.requestDOMUpdate(()=>t(i))})}bindChannel(){this.liveSocket.onChannel(this.channel,"diff",e=>{this.liveSocket.requestDOMUpdate(()=>{this.applyDiff("update",e,({diff:t,events:i})=>this.update(t,i))})}),this.onChannel("redirect",({to:e,flash:t})=>this.onRedirect({to:e,flash:t})),this.onChannel("live_patch",e=>this.onLivePatch(e)),this.onChannel("live_redirect",e=>this.onLiveRedirect(e)),this.channel.onError(e=>this.onError(e)),this.channel.onClose(e=>this.onClose(e))}destroyAllChildren(){this.eachChild(e=>e.destroy())}onLiveRedirect(e){let{to:t,kind:i,flash:s}=e,n=this.expandURL(t),o=new CustomEvent("phx:server-navigate",{detail:{to:t,kind:i,flash:s}});this.liveSocket.historyRedirect(o,n,i,s)}onLivePatch(e){let{to:t,kind:i}=e;this.href=this.expandURL(t),this.liveSocket.historyPatch(t,i)}expandURL(e){return e.startsWith("/")?`${window.location.protocol}//${window.location.host}${e}`:e}onRedirect({to:e,flash:t,reloadToken:i}){this.liveSocket.redirect(e,t,i)}isDestroyed(){return this.destroyed}joinDead(){this.isDead=!0}joinPush(){return this.joinPush=this.joinPush||this.channel.join(),this.joinPush}join(e){this.showLoader(this.liveSocket.loaderTimeout),this.bindChannel(),this.isMain()&&(this.stopCallback=this.liveSocket.withPageLoading({to:this.href,kind:"initial"})),this.joinCallback=t=>{t=t||function(){},e?e(this.joinCount,t):t()},this.wrapPush(()=>this.channel.join(),{ok:t=>this.liveSocket.requestDOMUpdate(()=>this.onJoin(t)),error:t=>this.onJoinError(t),timeout:()=>this.onJoinError({reason:"timeout"})})}onJoinError(e){if(e.reason==="reload"){this.log("error",()=>[`failed mount with ${e.status}. Falling back to page reload`,e]),this.onRedirect({to:this.root.href,reloadToken:e.token});return}else if(e.reason==="unauthorized"||e.reason==="stale"){this.log("error",()=>["unauthorized live_redirect. Falling back to page request",e]),this.onRedirect({to:this.root.href});return}if((e.redirect||e.live_redirect)&&(this.joinPending=!1,this.channel.leave()),e.redirect)return this.onRedirect(e.redirect);if(e.live_redirect)return this.onLiveRedirect(e.live_redirect);if(this.log("error",()=>["unable to join",e]),this.isMain())this.displayError([ae,fe,Pe]),this.liveSocket.isConnected()&&this.liveSocket.reloadWithJitter(this);else{this.joinAttempts>=kt&&(this.root.displayError([ae,fe,Pe]),this.log("error",()=>[`giving up trying to mount after ${kt} tries`,e]),this.destroy());let t=h.byId(this.el.id);t?(h.mergeAttrs(t,this.el),this.displayError([ae,fe,Pe]),this.el=t):this.destroy()}}onClose(e){if(!this.isDestroyed()){if(this.isMain()&&this.liveSocket.hasPendingLink()&&e!=="leave")return this.liveSocket.reloadWithJitter(this);this.destroyAllChildren(),this.liveSocket.dropActiveElement(this),document.activeElement&&document.activeElement.blur(),this.liveSocket.isUnloaded()&&this.showLoader(Zt)}}onError(e){this.onClose(e),this.liveSocket.isConnected()&&this.log("error",()=>["view crashed",e]),this.liveSocket.isUnloaded()||(this.liveSocket.isConnected()?this.displayError([ae,fe,Pe]):this.displayError([ae,fe,At]))}displayError(e){this.isMain()&&h.dispatchEvent(window,"phx:page-loading-start",{detail:{to:this.href,kind:"error"}}),this.showLoader(),this.setContainerClasses(...e),this.execAll(this.binding("disconnected"))}wrapPush(e,t){let i=this.liveSocket.getLatencySim(),s=i?n=>setTimeout(()=>!this.isDestroyed()&&n(),i):n=>!this.isDestroyed()&&n();s(()=>{e().receive("ok",n=>s(()=>t.ok&&t.ok(n))).receive("error",n=>s(()=>t.error&&t.error(n))).receive("timeout",()=>s(()=>t.timeout&&t.timeout()))})}pushWithReply(e,t,i){if(!this.isConnected())return Promise.reject({error:"noconnection"});let[s,[n],o]=e?e():[null,[],{}],l=this.joinCount,a=function(){};return o.page_loading&&(a=this.liveSocket.withPageLoading({kind:"element",target:n})),typeof i.cid!="number"&&delete i.cid,new Promise((d,c)=>{this.wrapPush(()=>this.channel.push(t,i,ti),{ok:p=>{s!==null&&(this.lastAckRef=s);let m=g=>{p.redirect&&this.onRedirect(p.redirect),p.live_patch&&this.onLivePatch(p.live_patch),p.live_redirect&&this.onLiveRedirect(p.live_redirect),a(),d({resp:p,reply:g})};p.diff?this.liveSocket.requestDOMUpdate(()=>{this.applyDiff("update",p.diff,({diff:g,reply:u,events:v})=>{s!==null&&this.undoRefs(s,i.event),this.update(g,v),m(u)})}):(s!==null&&this.undoRefs(s,i.event),m(null))},error:p=>c({error:p}),timeout:()=>{c({timeout:!0}),this.joinCount===l&&this.liveSocket.reloadWithJitter(this,()=>{this.log("timeout",()=>["received timeout while communicating with server. Falling back to hard refresh for recovery"])})}})})}undoRefs(e,t,i){if(!this.isConnected())return;let s=`[${O}="${this.refSrc()}"]`;i?(i=new Set(i),h.all(document,s,n=>{i&&!i.has(n)||(h.all(n,s,o=>this.undoElRef(o,e,t)),this.undoElRef(n,e,t))})):h.all(document,s,n=>this.undoElRef(n,e,t))}undoElRef(e,t,i){new je(e).maybeUndo(t,i,n=>{let o=this.triggerBeforeUpdateHook(e,n);ce.patchWithClonedTree(e,n,this.liveSocket),h.all(e,`[${O}="${this.refSrc()}"]`,l=>this.undoElRef(l,t,i)),this.execNewMounted(e),o&&o.__updated()})}refSrc(){return this.el.id}putRef(e,t,i,s={}){let n=this.ref++,o=this.binding(wt);if(s.loading){let l=h.all(document,s.loading).map(a=>({el:a,lock:!0,loading:!0}));e=e.concat(l)}for(let{el:l,lock:a,loading:d}of e){if(!a&&!d)throw new Error("putRef requires lock or loading");if(l.setAttribute(O,this.refSrc()),d&&l.setAttribute(le,n),a&&l.setAttribute(L,n),!d||s.submitter&&!(l===s.submitter||l===s.form))continue;let c=new Promise(u=>{l.addEventListener(`phx:undo-lock:${n}`,()=>u(g),{once:!0})}),p=new Promise(u=>{l.addEventListener(`phx:undo-loading:${n}`,()=>u(g),{once:!0})});l.classList.add(`phx-${i}-loading`);let m=l.getAttribute(o);m!==null&&(l.getAttribute(Ce)||l.setAttribute(Ce,l.innerText),m!==""&&(l.innerText=m),l.setAttribute(he,l.getAttribute(he)||l.disabled),l.setAttribute("disabled",""));let g={event:t,eventType:i,ref:n,isLoading:d,isLocked:a,lockElements:e.filter(({lock:u})=>u).map(({el:u})=>u),loadingElements:e.filter(({loading:u})=>u).map(({el:u})=>u),unlock:u=>{u=Array.isArray(u)?u:[u],this.undoRefs(n,t,u)},lockComplete:c,loadingComplete:p,lock:u=>new Promise(v=>{if(this.isAcked(n))return v(g);u.setAttribute(L,n),u.setAttribute(O,this.refSrc()),u.addEventListener(`phx:lock-stop:${n}`,()=>v(g),{once:!0})})};l.dispatchEvent(new CustomEvent("phx:push",{detail:g,bubbles:!0,cancelable:!1})),t&&l.dispatchEvent(new CustomEvent(`phx:push:${t}`,{detail:g,bubbles:!0,cancelable:!1}))}return[n,e.map(({el:l})=>l),s]}isAcked(e){return this.lastAckRef!==null&&this.lastAckRef>=e}componentID(e){let t=e.getAttribute&&e.getAttribute($);return t?parseInt(t):null}targetComponentID(e,t,i={}){if(W(t))return t;let s=i.target||e.getAttribute(this.binding("target"));return W(s)?parseInt(s):t&&(s!==null||i.target)?this.closestComponentID(t):null}closestComponentID(e){return W(e)?e:e?z(e.closest(`[${$}]`),t=>this.ownsElement(t)&&this.componentID(t)):null}pushHookEvent(e,t,i,s,n){if(!this.isConnected())return this.log("hook",()=>["unable to push hook event. LiveView not connected",i,s]),!1;let[o,l,a]=this.putRef([{el:e,loading:!0,lock:!0}],i,"hook");return this.pushWithReply(()=>[o,l,a],"event",{type:"hook",event:i,value:s,cid:this.closestComponentID(t)}).then(({resp:d,reply:c})=>n(c,o)),o}extractMeta(e,t,i){let s=this.binding("value-");for(let n=0;n<e.attributes.length;n++){t||(t={});let o=e.attributes[n].name;o.startsWith(s)&&(t[o.replace(s,"")]=e.getAttribute(o))}if(e.value!==void 0&&!(e instanceof HTMLFormElement)&&(t||(t={}),t.value=e.value,e.tagName==="INPUT"&&rt.indexOf(e.type)>=0&&!e.checked&&delete t.value),i){t||(t={});for(let n in i)t[n]=i[n]}return t}pushEvent(e,t,i,s,n,o={},l){this.pushWithReply(()=>this.putRef([{el:t,loading:!0,lock:!0}],s,e,o),"event",{type:e,event:s,value:this.extractMeta(t,n,o.value),cid:this.targetComponentID(t,i,o)}).then(({reply:a})=>l&&l(a))}pushFileProgress(e,t,i,s=function(){}){this.liveSocket.withinOwners(e.form,(n,o)=>{n.pushWithReply(null,"progress",{event:e.getAttribute(n.binding(Yt)),ref:e.getAttribute(B),entry_ref:t,progress:i,cid:n.targetComponentID(e.form,o)}).then(({resp:l})=>s(l))})}pushInput(e,t,i,s,n,o){if(!e.form)throw new Error("form events require the input to be inside a form");let l,a=W(i)?i:this.targetComponentID(e.form,t,n),d=()=>this.putRef([{el:e,loading:!0,lock:!0},{el:e.form,loading:!0,lock:!0}],s,"change",n),c,p=this.extractMeta(e.form);e instanceof HTMLButtonElement&&(p.submitter=e),e.getAttribute(this.binding("change"))?c=ut(e.form,I({_target:n._target},p),[e.name]):c=ut(e.form,I({_target:n._target},p)),h.isUploadInput(e)&&e.files&&e.files.length>0&&C.trackFiles(e,Array.from(e.files)),l=C.serializeUploads(e);let m={type:"form",event:s,value:c,uploads:l,cid:a};this.pushWithReply(d,"event",m).then(({resp:g})=>{if(h.isUploadInput(e)&&h.isAutoUpload(e)){if(C.filesAwaitingPreflight(e).length>0){let[u,v]=d();this.undoRefs(u,s,[e.form]),this.uploadFiles(e.form,s,t,u,a,b=>{o&&o(g),this.triggerAwaitingSubmit(e.form,s),this.undoRefs(u,s)})}}else o&&o(g)})}triggerAwaitingSubmit(e,t){let i=this.getScheduledSubmit(e);if(i){let[s,n,o,l]=i;this.cancelSubmit(e,t),l()}}getScheduledSubmit(e){return this.formSubmits.find(([t,i,s,n])=>t.isSameNode(e))}scheduleSubmit(e,t,i,s){if(this.getScheduledSubmit(e))return!0;this.formSubmits.push([e,t,i,s])}cancelSubmit(e,t){this.formSubmits=this.formSubmits.filter(([i,s,n,o])=>i.isSameNode(e)?(this.undoRefs(s,t),!1):!0)}disableForm(e,t,i={}){let s=u=>!(ve(u,`${this.binding(ge)}=ignore`,u.form)||ve(u,"data-phx-update=ignore",u.form)),n=u=>u.hasAttribute(this.binding(wt)),o=u=>u.tagName=="BUTTON",l=u=>["INPUT","TEXTAREA","SELECT"].includes(u.tagName),a=Array.from(e.elements),d=a.filter(n),c=a.filter(o).filter(s),p=a.filter(l).filter(s);c.forEach(u=>{u.setAttribute(he,u.disabled),u.disabled=!0}),p.forEach(u=>{u.setAttribute(Ue,u.readOnly),u.readOnly=!0,u.files&&(u.setAttribute(he,u.disabled),u.disabled=!0)});let m=d.concat(c).concat(p).map(u=>({el:u,loading:!0,lock:!0})),g=[{el:e,loading:!0,lock:!1}].concat(m).reverse();return this.putRef(g,t,"submit",i)}pushFormSubmit(e,t,i,s,n,o){let l=()=>this.disableForm(e,i,De(I({},n),{form:e,submitter:s})),a=this.targetComponentID(e,t);if(C.hasUploadsInProgress(e)){let[d,c]=l(),p=()=>this.pushFormSubmit(e,t,i,s,n,o);return this.scheduleSubmit(e,d,n,p)}else if(C.inputsAwaitingPreflight(e).length>0){let[d,c]=l(),p=()=>[d,c,n];this.uploadFiles(e,i,t,d,a,m=>{if(C.inputsAwaitingPreflight(e).length>0)return this.undoRefs(d,i);let g=this.extractMeta(e),u=ut(e,I({submitter:s},g));this.pushWithReply(p,"event",{type:"form",event:i,value:u,cid:a}).then(({resp:v})=>o(v))})}else if(!(e.hasAttribute(O)&&e.classList.contains("phx-submit-loading"))){let d=this.extractMeta(e),c=ut(e,I({submitter:s},d));this.pushWithReply(l,"event",{type:"form",event:i,value:c,cid:a}).then(({resp:p})=>o(p))}}uploadFiles(e,t,i,s,n,o){let l=this.joinCount,a=C.activeFileInputs(e),d=a.length;a.forEach(c=>{let p=new C(c,this,()=>{d--,d===0&&o()}),m=p.entries().map(u=>u.toPreflightPayload());if(m.length===0){d--;return}let g={ref:c.getAttribute(B),entries:m,cid:this.targetComponentID(c.form,i)};this.log("upload",()=>["sending preflight request",g]),this.pushWithReply(null,"allow_upload",g).then(({resp:u})=>{if(this.log("upload",()=>["got preflight response",u]),p.entries().forEach(v=>{u.entries&&!u.entries[v.ref]&&this.handleFailedEntryPreflight(v.ref,"failed preflight",p)}),u.error||Object.keys(u.entries).length===0)this.undoRefs(s,t),(u.error||[]).map(([b,T])=>{this.handleFailedEntryPreflight(b,T,p)});else{let v=b=>{this.channel.onError(()=>{this.joinCount===l&&b()})};p.initAdapterUpload(u,v,this.liveSocket)}})})}handleFailedEntryPreflight(e,t,i){if(i.isAutoUpload()){let s=i.entries().find(n=>n.ref===e.toString());s&&s.cancel()}else i.entries().map(s=>s.cancel());this.log("upload",()=>[`error for entry ${e}`,t])}dispatchUploads(e,t,i){let s=this.targetCtxElement(e)||this.el,n=h.findUploadInputs(s).filter(o=>o.name===t);n.length===0?x(`no live file inputs found matching the name "${t}"`):n.length>1?x(`duplicate live file inputs found matching the name "${t}"`):h.dispatchEvent(n[0],tt,{detail:{files:i}})}targetCtxElement(e){if(W(e)){let[t]=h.findComponentNodeList(this.el,e);return t}else return e||null}pushFormRecovery(e,t,i,s){let n=this.binding("change"),o=t.getAttribute(this.binding("target"))||t,l=t.getAttribute(this.binding(Et))||t.getAttribute(this.binding("change")),a=Array.from(e.elements).filter(p=>h.isFormInput(p)&&p.name&&!p.hasAttribute(n));if(a.length===0)return;a.forEach(p=>p.hasAttribute(B)&&C.clearFiles(p));let d=a.find(p=>p.type!=="hidden")||a[0],c=0;this.withinTargets(o,(p,m)=>{let g=this.targetComponentID(t,m);c++;let u=new CustomEvent("phx:form-recovery",{detail:{sourceElement:e}});y.exec(u,"change",l,this,d,["push",{_target:d.name,targetView:p,targetCtx:m,newCid:g,callback:()=>{c--,c===0&&s()}}])},i,i)}pushLinkPatch(e,t,i,s){let n=this.liveSocket.setPendingLink(t),o=e.isTrusted&&e.type!=="popstate",l=i?()=>this.putRef([{el:i,loading:o,lock:!0}],null,"click"):null,a=()=>this.liveSocket.redirect(window.location.href),d=t.startsWith("/")?`${location.protocol}//${location.host}${t}`:t;this.pushWithReply(l,"live_patch",{url:d}).then(({resp:c})=>{this.liveSocket.requestDOMUpdate(()=>{c.link_redirect?this.liveSocket.replaceMain(t,null,s,n):(this.liveSocket.commitPendingLink(n)&&(this.href=t),this.applyPendingUpdates(),s&&s(n))})},({error:c,timeout:p})=>a())}getFormsForRecovery(){if(this.joinCount===0)return{};let e=this.binding("change");return h.all(this.el,`form[${e}]`).filter(t=>t.id).filter(t=>t.elements.length>0).filter(t=>t.getAttribute(this.binding(Et))!=="ignore").map(t=>t.cloneNode(!0)).reduce((t,i)=>(t[i.id]=i,t),{})}maybePushComponentsDestroyed(e){let t=e.filter(i=>h.findComponentNodeList(this.el,i).length===0);t.length>0&&(t.forEach(i=>this.rendered.resetRender(i)),this.pushWithReply(null,"cids_will_destroy",{cids:t}).then(()=>{this.liveSocket.requestDOMUpdate(()=>{let i=t.filter(s=>h.findComponentNodeList(this.el,s).length===0);i.length>0&&this.pushWithReply(null,"cids_destroyed",{cids:i}).then(({resp:s})=>{this.rendered.pruneCIDs(s.cids)})})}))}ownsElement(e){let t=e.closest(q);return e.getAttribute(Z)===this.id||t&&t.id===this.id||!t&&this.isDead}submitForm(e,t,i,s,n={}){h.putPrivate(e,me,!0),Array.from(e.elements).forEach(l=>h.putPrivate(l,me,!0)),this.liveSocket.blurActiveElement(this),this.pushFormSubmit(e,t,i,s,n,()=>{this.liveSocket.restorePreviouslyActiveFocus()})}binding(e){return this.liveSocket.binding(e)}};var Si=r=>h.isUsedInput(r),qe=class{constructor(e,t,i={}){if(this.unloaded=!1,!t||t.constructor.name==="Object")throw new Error(`
+`,P)})),b.length>0&&i.time("post-morph append/prepend restoration",()=>{b.forEach(P=>P.perform())}),i.silenceEvents(()=>h.restoreFocus(l,a,d)),h.dispatchEvent(document,"phx:update"),u.forEach(P=>this.trackAfter("added",P)),v.forEach(P=>this.trackAfter("updated",P)),this.transitionPendingRemoves(),T&&(i.unload(),Object.getPrototypeOf(T).submit.call(T)),!0}onNodeDiscarded(e){(h.isPhxChild(e)||h.isPhxSticky(e))&&this.liveSocket.destroyViewByEl(e),this.trackAfter("discarded",e)}maybePendingRemove(e){return e.getAttribute&&e.getAttribute(this.phxRemove)!==null?(this.pendingRemoves.push(e),!0):!1}removeStreamChildElement(e){this.streamInserts[e.id]?(this.streamComponentRestore[e.id]=e,e.remove()):this.maybePendingRemove(e)||(e.remove(),this.onNodeDiscarded(e))}getStreamInsert(e){return(e.id?this.streamInserts[e.id]:{})||{}}setStreamRef(e,t){h.putSticky(e,Te,i=>i.setAttribute(Te,t))}maybeReOrderStream(e,t){let{ref:i,streamAt:s,reset:n}=this.getStreamInsert(e);if(s!==void 0&&(this.setStreamRef(e,i),!(!n&&!t)&&e.parentElement)){if(s===0)e.parentElement.insertBefore(e,e.parentElement.firstElementChild);else if(s>0){let o=Array.from(e.parentElement.children),l=o.indexOf(e);if(s>=o.length-1)e.parentElement.appendChild(e);else{let a=o[s];l>s?e.parentElement.insertBefore(e,a):e.parentElement.insertBefore(e,a.nextElementSibling)}}this.maybeLimitStream(e)}}maybeLimitStream(e){let{limit:t}=this.getStreamInsert(e),i=t!==null&&Array.from(e.parentElement.children);t&&t<0&&i.length>t*-1?i.slice(0,i.length+t).forEach(s=>this.removeStreamChildElement(s)):t&&t>=0&&i.length>t&&i.slice(t).forEach(s=>this.removeStreamChildElement(s))}transitionPendingRemoves(){let{pendingRemoves:e,liveSocket:t}=this;e.length>0&&t.transitionRemoves(e,!1,()=>{e.forEach(i=>{let s=h.firstPhxChild(i);s&&t.destroyViewByEl(s),i.remove()}),this.trackAfter("transitionsDiscarded",e)})}isChangedSelect(e,t){return!(e instanceof HTMLSelectElement)||e.multiple?!1:e.options.length!==t.options.length?!0:(t.value=e.value,!e.isEqualNode(t))}isCIDPatch(){return this.cidPatch}skipCIDSibling(e){return e.nodeType===Node.ELEMENT_NODE&&e.hasAttribute(it)}targetCIDContainer(e){if(!this.isCIDPatch())return;let[t,...i]=h.findComponentNodeList(this.container,this.targetCID);return i.length===0&&h.childNodeLength(e)===1?t:t&&t.parentNode}indexOf(e,t){return Array.from(e.children).indexOf(t)}};var Ki=new Set(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),Gi=new Set(["'",'"']),bi=(r,e,t)=>{let i=0,s=!1,n,o,l,a,d,c,p=r.match(/^(\s*(?:<!--.*?-->\s*)*)<([^\s\/>]+)/);if(p===null)throw new Error(`malformed html ${r}`);for(i=p[0].length,n=p[1],l=p[2],a=i,i;i<r.length&&r.charAt(i)!==">";i++)if(r.charAt(i)==="="){let u=r.slice(i-3,i)===" id";i++;let v=r.charAt(i);if(Gi.has(v)){let b=i;for(i++,i;i<r.length&&r.charAt(i)!==v;i++);if(u){d=r.slice(b+1,i);break}}}let m=r.length-1;for(s=!1;m>=n.length+l.length;){let u=r.charAt(m);if(s)u==="-"&&r.slice(m-3,m)==="<!-"?(s=!1,m-=4):m-=1;else if(u===">"&&r.slice(m-2,m)==="--")s=!0,m-=3;else{if(u===">")break;m-=1}}o=r.slice(m+1,r.length);let g=Object.keys(e).map(u=>e[u]===!0?u:`${u}="${e[u]}"`).join(" ");if(t){let u=d?` id="${d}"`:"";Ki.has(l)?c=`<${l}${u}${g===""?"":" "}${g}/>`:c=`<${l}${u}${g===""?"":" "}${g}></${l}>`}else{let u=r.slice(a,m+1);c=`<${l}${g===""?"":" "}${g}${u}`}return[c,n,o]},He=class{static extract(e){let{[xt]:t,[Tt]:i,[It]:s}=e;return delete e[xt],delete e[Tt],delete e[It],{diff:e,title:s,reply:t||null,events:i||[]}}constructor(e,t){this.viewId=e,this.rendered={},this.magicId=0,this.mergeDiff(t)}parentViewId(){return this.viewId}toString(e){let[t,i]=this.recursiveToString(this.rendered,this.rendered[H],e,!0,{});return[t,i]}recursiveToString(e,t=e[H],i,s,n){i=i?new Set(i):null;let o={buffer:"",components:t,onlyCids:i,streams:new Set};return this.toOutputBuffer(e,null,o,s,n),[o.buffer,o.streams]}componentCIDs(e){return Object.keys(e[H]||{}).map(t=>parseInt(t))}isComponentOnlyDiff(e){return e[H]?Object.keys(e).length===1:!1}getComponent(e,t){return e[H][t]}resetRender(e){this.rendered[H][e]&&(this.rendered[H][e].reset=!0)}mergeDiff(e){let t=e[H],i={};if(delete e[H],this.rendered=this.mutableMerge(this.rendered,e),this.rendered[H]=this.rendered[H]||{},t){let s=this.rendered[H];for(let n in t)t[n]=this.cachedFindComponent(n,t[n],s,t,i);for(let n in t)s[n]=t[n];e[H]=t}}cachedFindComponent(e,t,i,s,n){if(n[e])return n[e];{let o,l,a=t[G];if(W(a)){let d;a>0?d=this.cachedFindComponent(a,s[a],i,s,n):d=i[-a],l=d[G],o=this.cloneMerge(d,t,!0),o[G]=l}else o=t[G]!==void 0||i[e]===void 0?t:this.cloneMerge(i[e],t,!1);return n[e]=o,o}}mutableMerge(e,t){return t[G]!==void 0?t:(this.doMutableMerge(e,t),e)}doMutableMerge(e,t){for(let i in t){let s=t[i],n=e[i];be(s)&&s[G]===void 0&&be(n)?this.doMutableMerge(n,s):e[i]=s}e[at]&&(e.newRender=!0)}cloneMerge(e,t,i){let s=I(I({},e),t);for(let n in s){let o=t[n],l=e[n];be(o)&&o[G]===void 0&&be(l)?s[n]=this.cloneMerge(l,o,i):o===void 0&&be(l)&&(s[n]=this.cloneMerge(l,{},i))}return i?(delete s.magicId,delete s.newRender):e[at]&&(s.newRender=!0),s}componentToString(e){let[t,i]=this.recursiveCIDToString(this.rendered[H],e,null),[s,n,o]=bi(t,{});return[s,i]}pruneCIDs(e){e.forEach(t=>delete this.rendered[H][t])}get(){return this.rendered}isNewFingerprint(e={}){return!!e[G]}templateStatic(e,t){return typeof e=="number"?t[e]:e}nextMagicID(){return this.magicId++,`m${this.magicId}-${this.parentViewId()}`}toOutputBuffer(e,t,i,s,n={}){if(e[Be])return this.comprehensionToBuffer(e,t,i);let{[G]:o}=e;o=this.templateStatic(o,t);let l=e[at],a=i.buffer;l&&(i.buffer=""),s&&l&&!e.magicId&&(e.newRender=!0,e.magicId=this.nextMagicID()),i.buffer+=o[0];for(let d=1;d<o.length;d++)this.dynamicToBuffer(e[d-1],t,i,s),i.buffer+=o[d];if(l){let d=!1,c;s||e.magicId?(d=s&&!e.newRender,c=I({[st]:e.magicId},n)):c=n,d&&(c[it]=!0);let[p,m,g]=bi(i.buffer,c,d);e.newRender=!1,i.buffer=a+m+p+g}}comprehensionToBuffer(e,t,i){let{[Be]:s,[G]:n,[Ot]:o}=e,[l,a,d,c]=o||[null,{},[],null];n=this.templateStatic(n,t);let p=t||e[si];for(let m=0;m<s.length;m++){let g=s[m];i.buffer+=n[0];for(let u=1;u<n.length;u++)this.dynamicToBuffer(g[u-1],p,i,!1),i.buffer+=n[u]}o!==void 0&&(e[Be].length>0||d.length>0||c)&&(delete e[Ot],e[Be]=[],i.streams.add(o))}dynamicToBuffer(e,t,i,s){if(typeof e=="number"){let[n,o]=this.recursiveCIDToString(i.components,e,i.onlyCids);i.buffer+=n,i.streams=new Set([...i.streams,...o])}else be(e)?this.toOutputBuffer(e,t,i,s,{}):i.buffer+=e}recursiveCIDToString(e,t,i){let s=e[t]||x(`no component for CID ${t}`,e),n={[$]:t},o=i&&!i.has(t);s.newRender=!o,s.magicId=`c${t}-${this.parentViewId()}`;let l=!s.reset,[a,d]=this.recursiveToString(s,e,i,l,n);return delete s.reset,[a,d]}};var Ai=[],_i=200,zi={exec(r,e,t,i,s,n){let[o,l]=n||[null,{callback:n&&n.callback}];(t.charAt(0)==="["?JSON.parse(t):[[o,l]]).forEach(([d,c])=>{d===o&&(c=I(I({},l),c),c.callback=c.callback||l.callback),this.filterToEls(i.liveSocket,s,c).forEach(p=>{this[`exec_${d}`](r,e,t,i,s,p,c)})})},isVisible(r){return!!(r.offsetWidth||r.offsetHeight||r.getClientRects().length>0)},isInViewport(r){let e=r.getBoundingClientRect(),t=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;return e.right>0&&e.bottom>0&&e.left<i&&e.top<t},exec_exec(r,e,t,i,s,n,{attr:o,to:l}){(l?h.all(document,l):[s]).forEach(d=>{let c=d.getAttribute(o);if(!c)throw new Error(`expected ${o} to contain JS command on "${l}"`);i.liveSocket.execJS(d,c,e)})},exec_dispatch(r,e,t,i,s,n,{event:o,detail:l,bubbles:a}){l=l||{},l.dispatcher=s,h.dispatchEvent(n,o,{detail:l,bubbles:a})},exec_push(r,e,t,i,s,n,o){let{event:l,data:a,target:d,page_loading:c,loading:p,value:m,dispatcher:g,callback:u}=o,v={loading:p,value:m,target:d,page_loading:!!c},b=e==="change"&&g?g:s,T=d||b.getAttribute(i.binding("target"))||b,Q=(P,V)=>{if(P.isConnected())if(e==="change"){let{newCid:F,_target:N}=o;N=N||(h.isFormInput(s)?s.name:void 0),N&&(v._target=N),P.pushInput(s,V,F,l||t,v,u)}else if(e==="submit"){let{submitter:F}=o;P.submitForm(s,V,l||t,F,v,u)}else P.pushEvent(e,s,V,l||t,a,v,u)};o.targetView&&o.targetCtx?Q(o.targetView,o.targetCtx):i.withinTargets(T,Q)},exec_navigate(r,e,t,i,s,n,{href:o,replace:l}){i.liveSocket.historyRedirect(r,o,l?"replace":"push",null,s)},exec_patch(r,e,t,i,s,n,{href:o,replace:l}){i.liveSocket.pushHistoryPatch(r,o,l?"replace":"push",s)},exec_focus(r,e,t,i,s,n){window.requestAnimationFrame(()=>de.attemptFocus(n))},exec_focus_first(r,e,t,i,s,n){window.requestAnimationFrame(()=>de.focusFirstInteractive(n)||de.focusFirst(n))},exec_push_focus(r,e,t,i,s,n){window.requestAnimationFrame(()=>Ai.push(n||s))},exec_pop_focus(r,e,t,i,s,n){window.requestAnimationFrame(()=>{let o=Ai.pop();o&&o.focus()})},exec_add_class(r,e,t,i,s,n,{names:o,transition:l,time:a,blocking:d}){this.addOrRemoveClasses(n,o,[],l,a,i,d)},exec_remove_class(r,e,t,i,s,n,{names:o,transition:l,time:a,blocking:d}){this.addOrRemoveClasses(n,[],o,l,a,i,d)},exec_toggle_class(r,e,t,i,s,n,{names:o,transition:l,time:a,blocking:d}){this.toggleClasses(n,o,l,a,i,d)},exec_toggle_attr(r,e,t,i,s,n,{attr:[o,l,a]}){this.toggleAttr(n,o,l,a)},exec_transition(r,e,t,i,s,n,{time:o,transition:l,blocking:a}){this.addOrRemoveClasses(n,[],[],l,o,i,a)},exec_toggle(r,e,t,i,s,n,{display:o,ins:l,outs:a,time:d,blocking:c}){this.toggle(e,i,n,o,l,a,d,c)},exec_show(r,e,t,i,s,n,{display:o,transition:l,time:a,blocking:d}){this.show(e,i,n,o,l,a,d)},exec_hide(r,e,t,i,s,n,{display:o,transition:l,time:a,blocking:d}){this.hide(e,i,n,o,l,a,d)},exec_set_attr(r,e,t,i,s,n,{attr:[o,l]}){this.setOrRemoveAttrs(n,[[o,l]],[])},exec_remove_attr(r,e,t,i,s,n,{attr:o}){this.setOrRemoveAttrs(n,[],[o])},show(r,e,t,i,s,n,o){this.isVisible(t)||this.toggle(r,e,t,i,s,null,n,o)},hide(r,e,t,i,s,n,o){this.isVisible(t)&&this.toggle(r,e,t,i,null,s,n,o)},toggle(r,e,t,i,s,n,o,l){o=o||_i;let[a,d,c]=s||[[],[],[]],[p,m,g]=n||[[],[],[]];if(a.length>0||p.length>0)if(this.isVisible(t)){let u=()=>{this.addOrRemoveClasses(t,m,a.concat(d).concat(c)),window.requestAnimationFrame(()=>{this.addOrRemoveClasses(t,p,[]),window.requestAnimationFrame(()=>this.addOrRemoveClasses(t,g,m))})},v=()=>{this.addOrRemoveClasses(t,[],p.concat(g)),h.putSticky(t,"toggle",b=>b.style.display="none"),t.dispatchEvent(new Event("phx:hide-end"))};t.dispatchEvent(new Event("phx:hide-start")),l===!1?(u(),setTimeout(v,o)):e.transition(o,u,v)}else{if(r==="remove")return;let u=()=>{this.addOrRemoveClasses(t,d,p.concat(m).concat(g));let b=i||this.defaultDisplay(t);h.putSticky(t,"toggle",T=>T.style.display=b),window.requestAnimationFrame(()=>{this.addOrRemoveClasses(t,a,[]),window.requestAnimationFrame(()=>this.addOrRemoveClasses(t,c,d))})},v=()=>{this.addOrRemoveClasses(t,[],a.concat(c)),t.dispatchEvent(new Event("phx:show-end"))};t.dispatchEvent(new Event("phx:show-start")),l===!1?(u(),setTimeout(v,o)):e.transition(o,u,v)}else this.isVisible(t)?window.requestAnimationFrame(()=>{t.dispatchEvent(new Event("phx:hide-start")),h.putSticky(t,"toggle",u=>u.style.display="none"),t.dispatchEvent(new Event("phx:hide-end"))}):window.requestAnimationFrame(()=>{t.dispatchEvent(new Event("phx:show-start"));let u=i||this.defaultDisplay(t);h.putSticky(t,"toggle",v=>v.style.display=u),t.dispatchEvent(new Event("phx:show-end"))})},toggleClasses(r,e,t,i,s,n){window.requestAnimationFrame(()=>{let[o,l]=h.getSticky(r,"classes",[[],[]]),a=e.filter(c=>o.indexOf(c)<0&&!r.classList.contains(c)),d=e.filter(c=>l.indexOf(c)<0&&r.classList.contains(c));this.addOrRemoveClasses(r,a,d,t,i,s,n)})},toggleAttr(r,e,t,i){r.hasAttribute(e)?i!==void 0?r.getAttribute(e)===t?this.setOrRemoveAttrs(r,[[e,i]],[]):this.setOrRemoveAttrs(r,[[e,t]],[]):this.setOrRemoveAttrs(r,[],[e]):this.setOrRemoveAttrs(r,[[e,t]],[])},addOrRemoveClasses(r,e,t,i,s,n,o){s=s||_i;let[l,a,d]=i||[[],[],[]];if(l.length>0){let c=()=>{this.addOrRemoveClasses(r,a,[].concat(l).concat(d)),window.requestAnimationFrame(()=>{this.addOrRemoveClasses(r,l,[]),window.requestAnimationFrame(()=>this.addOrRemoveClasses(r,d,a))})},p=()=>this.addOrRemoveClasses(r,e.concat(d),t.concat(l).concat(a));o===!1?(c(),setTimeout(p,s)):n.transition(s,c,p);return}window.requestAnimationFrame(()=>{let[c,p]=h.getSticky(r,"classes",[[],[]]),m=e.filter(b=>c.indexOf(b)<0&&!r.classList.contains(b)),g=t.filter(b=>p.indexOf(b)<0&&r.classList.contains(b)),u=c.filter(b=>t.indexOf(b)<0).concat(m),v=p.filter(b=>e.indexOf(b)<0).concat(g);h.putSticky(r,"classes",b=>(b.classList.remove(...v),b.classList.add(...u),[u,v]))})},setOrRemoveAttrs(r,e,t){let[i,s]=h.getSticky(r,"attrs",[[],[]]),n=e.map(([a,d])=>a).concat(t),o=i.filter(([a,d])=>!n.includes(a)).concat(e),l=s.filter(a=>!n.includes(a)).concat(t);h.putSticky(r,"attrs",a=>(l.forEach(d=>a.removeAttribute(d)),o.forEach(([d,c])=>a.setAttribute(d,c)),[o,l]))},hasAllClasses(r,e){return e.every(t=>r.classList.contains(t))},isToggledOut(r,e){return!this.isVisible(r)||this.hasAllClasses(r,e)},filterToEls(r,e,{to:t}){let i=()=>{if(typeof t=="string")return document.querySelectorAll(t);if(t.closest){let s=e.closest(t.closest);return s?[s]:[]}else if(t.inner)return e.querySelectorAll(t.inner)};return t?r.jsQuerySelectorAll(e,t,i):[e]},defaultDisplay(r){return{tr:"table-row",td:"table-cell"}[r.tagName.toLowerCase()]||"block"},transitionClasses(r){if(!r)return null;let[e,t,i]=Array.isArray(r)?r:[r.split(" "),[],[]];return e=Array.isArray(e)?e:e.split(" "),t=Array.isArray(t)?t:t.split(" "),i=Array.isArray(i)?i:i.split(" "),[e,t,i]}},y=zi;var Mt="hookId",Yi=1,Y=class{static makeID(){return Yi++}static elementID(e){return h.private(e,Mt)}constructor(e,t,i){this.el=t,this.__attachView(e),this.__callbacks=i,this.__listeners=new Set,this.__isDisconnected=!1,h.putPrivate(this.el,Mt,this.constructor.makeID());for(let s in this.__callbacks)this[s]=this.__callbacks[s]}__attachView(e){e?(this.__view=()=>e,this.liveSocket=e.liveSocket):(this.__view=()=>{throw new Error(`hook not yet attached to a live view: ${this.el.outerHTML}`)},this.liveSocket=null)}__mounted(){this.mounted&&this.mounted()}__updated(){this.updated&&this.updated()}__beforeUpdate(){this.beforeUpdate&&this.beforeUpdate()}__destroyed(){this.destroyed&&this.destroyed(),h.deletePrivate(this.el,Mt)}__reconnected(){this.__isDisconnected&&(this.__isDisconnected=!1,this.reconnected&&this.reconnected())}__disconnected(){this.__isDisconnected=!0,this.disconnected&&this.disconnected()}js(){let e=this;return{exec(t){e.__view().liveSocket.execJS(e.el,t,"hook")},show(t,i={}){let s=e.__view().liveSocket.owner(t);y.show("hook",s,t,i.display,i.transition,i.time,i.blocking)},hide(t,i={}){let s=e.__view().liveSocket.owner(t);y.hide("hook",s,t,null,i.transition,i.time,i.blocking)},toggle(t,i={}){let s=e.__view().liveSocket.owner(t);i.in=y.transitionClasses(i.in),i.out=y.transitionClasses(i.out),y.toggle("hook",s,t,i.display,i.in,i.out,i.time,i.blocking)},addClass(t,i,s={}){i=Array.isArray(i)?i:i.split(" ");let n=e.__view().liveSocket.owner(t);y.addOrRemoveClasses(t,i,[],s.transition,s.time,n,s.blocking)},removeClass(t,i,s={}){s.transition=y.transitionClasses(s.transition),i=Array.isArray(i)?i:i.split(" ");let n=e.__view().liveSocket.owner(t);y.addOrRemoveClasses(t,[],i,s.transition,s.time,n,s.blocking)},toggleClass(t,i,s={}){s.transition=y.transitionClasses(s.transition),i=Array.isArray(i)?i:i.split(" ");let n=e.__view().liveSocket.owner(t);y.toggleClasses(t,i,s.transition,s.time,n,s.blocking)},transition(t,i,s={}){let n=e.__view().liveSocket.owner(t);y.addOrRemoveClasses(t,[],[],y.transitionClasses(i),s.time,n,s.blocking)},setAttribute(t,i,s){y.setOrRemoveAttrs(t,[[i,s]],[])},removeAttribute(t,i){y.setOrRemoveAttrs(t,[],[i])},toggleAttribute(t,i,s,n){y.toggleAttr(t,i,s,n)}}}pushEvent(e,t={},i){return i===void 0?new Promise((s,n)=>{try{this.__view().pushHookEvent(this.el,null,e,t,(l,a)=>s(l))===!1&&n(new Error("unable to push hook event. LiveView not connected"))}catch(o){n(o)}}):this.__view().pushHookEvent(this.el,null,e,t,i)}pushEventTo(e,t,i={},s){return s===void 0?new Promise((n,o)=>{try{this.__view().withinTargets(e,(l,a)=>{l.pushHookEvent(this.el,a,t,i,(c,p)=>n(c))===!1&&o(new Error("unable to push hook event. LiveView not connected"))})}catch(l){o(l)}}):this.__view().withinTargets(e,(n,o)=>n.pushHookEvent(this.el,o,t,i,s))}handleEvent(e,t){let i=(s,n)=>n?e:t(s.detail);return window.addEventListener(`phx:${e}`,i),this.__listeners.add(i),i}removeHandleEvent(e){let t=e(null,!0);window.removeEventListener(`phx:${t}`,e),this.__listeners.delete(e)}upload(e,t){return this.__view().dispatchUploads(null,e,t)}uploadTo(e,t,i){return this.__view().withinTargets(e,(s,n)=>{s.dispatchUploads(n,t,i)})}__cleanup__(){this.__listeners.forEach(e=>this.removeHandleEvent(e))}};var Qi=(r,e)=>{let t=r.endsWith("[]"),i=t?r.slice(0,-2):r;return i=i.replace(/([^\[\]]+)(\]?$)/,`${e}$1$2`),t&&(i+="[]"),i},ut=(r,e,t=[])=>{let c=e,{submitter:i}=c,s=Vt(c,["submitter"]),n;if(i&&i.name){let p=document.createElement("input");p.type="hidden";let m=i.getAttribute("form");m&&p.setAttribute("form",m),p.name=i.name,p.value=i.value,i.parentElement.insertBefore(p,i),n=p}let o=new FormData(r),l=[];o.forEach((p,m,g)=>{p instanceof File&&l.push(m)}),l.forEach(p=>o.delete(p));let a=new URLSearchParams,d=Array.from(r.elements);for(let[p,m]of o.entries())if(t.length===0||t.indexOf(p)>=0){let g=d.filter(b=>b.name===p),u=!g.some(b=>h.private(b,pe)||h.private(b,me)),v=g.every(b=>b.type==="hidden");u&&!(i&&i.name==p)&&!v&&a.append(Qi(p,"_unused_"),""),a.append(p,m)}i&&n&&i.parentElement.removeChild(n);for(let p in s)a.append(p,s[p]);return a.toString()},_e=class r{static closestView(e){let t=e.closest(q);return t?h.private(t,"view"):null}constructor(e,t,i,s,n){this.isDead=!1,this.liveSocket=t,this.flash=s,this.parent=i,this.root=i?i.root:this,this.el=e,h.putPrivate(this.el,"view",this),this.id=this.el.id,this.ref=0,this.lastAckRef=null,this.childJoins=0,this.loaderTimer=null,this.pendingDiffs=[],this.pendingForms=new Set,this.redirect=!1,this.href=null,this.joinCount=this.parent?this.parent.joinCount-1:0,this.joinAttempts=0,this.joinPending=!0,this.destroyed=!1,this.joinCallback=function(o){o&&o()},this.stopCallback=function(){},this.pendingJoinOps=this.parent?null:[],this.viewHooks={},this.formSubmits=[],this.children=this.parent?null:{},this.root.children[this.id]={},this.formsForRecovery={},this.channel=this.liveSocket.channel(`lv:${this.id}`,()=>{let o=this.href&&this.expandURL(this.href);return{redirect:this.redirect?o:void 0,url:this.redirect?void 0:o||void 0,params:this.connectParams(n),session:this.getSession(),static:this.getStatic(),flash:this.flash}})}setHref(e){this.href=e}setRedirect(e){this.redirect=!0,this.href=e}isMain(){return this.el.hasAttribute(ke)}connectParams(e){let t=this.liveSocket.params(this.el),i=h.all(document,`[${this.binding(jt)}]`).map(s=>s.src||s.href).filter(s=>typeof s=="string");return i.length>0&&(t._track_static=i),t._mounts=this.joinCount,t._mount_attempts=this.joinAttempts,t._live_referer=e,this.joinAttempts++,t}isConnected(){return this.channel.canPush()}getSession(){return this.el.getAttribute(M)}getStatic(){let e=this.el.getAttribute(ee);return e===""?null:e}destroy(e=function(){}){this.destroyAllChildren(),this.destroyed=!0,delete this.root.children[this.id],this.parent&&delete this.root.children[this.parent.id][this.id],clearTimeout(this.loaderTimer);let t=()=>{e();for(let i in this.viewHooks)this.destroyHook(this.viewHooks[i])};h.markPhxChildDestroyed(this.el),this.log("destroyed",()=>["the child has been removed from the parent"]),this.channel.leave().receive("ok",t).receive("error",t).receive("timeout",t)}setContainerClasses(...e){this.el.classList.remove(bt,ae,fe,At,Pe),this.el.classList.add(...e)}showLoader(e){if(clearTimeout(this.loaderTimer),e)this.loaderTimer=setTimeout(()=>this.showLoader(),e);else{for(let t in this.viewHooks)this.viewHooks[t].__disconnected();this.setContainerClasses(ae)}}execAll(e){h.all(this.el,`[${e}]`,t=>this.liveSocket.execJS(t,t.getAttribute(e)))}hideLoader(){clearTimeout(this.loaderTimer),this.setContainerClasses(bt),this.execAll(this.binding("connected"))}triggerReconnected(){for(let e in this.viewHooks)this.viewHooks[e].__reconnected()}log(e,t){this.liveSocket.log(this,e,t)}transition(e,t,i=function(){}){this.liveSocket.transition(e,t,i)}withinTargets(e,t,i=document,s){if(e instanceof HTMLElement||e instanceof SVGElement)return this.liveSocket.owner(e,n=>t(n,e));if(W(e))h.findComponentNodeList(s||this.el,e).length===0?x(`no component found matching phx-target of ${e}`):t(this,parseInt(e));else{let n=Array.from(i.querySelectorAll(e));n.length===0&&x(`nothing found matching the phx-target selector "${e}"`),n.forEach(o=>this.liveSocket.owner(o,l=>t(l,o)))}}applyDiff(e,t,i){this.log(e,()=>["",Le(t)]);let{diff:s,reply:n,events:o,title:l}=He.extract(t);i({diff:s,reply:n,events:o}),(typeof l=="string"||e=="mount")&&window.requestAnimationFrame(()=>h.putTitle(l))}onJoin(e){let{rendered:t,container:i,liveview_version:s}=e;if(i){let[n,o]=i;this.el=h.replaceRootContainer(this.el,n,o)}this.childJoins=0,this.joinPending=!0,this.flash=null,this.root===this&&(this.formsForRecovery=this.getFormsForRecovery()),this.isMain()&&window.history.state===null&&this.liveSocket.replaceRootHistory(),s!==this.liveSocket.version()&&console.error(`LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${s}. To avoid issues, please ensure that your assets use the same version as the server.`),D.dropLocal(this.liveSocket.localStorage,window.location.pathname,Qe),this.applyDiff("mount",t,({diff:n,events:o})=>{this.rendered=new He(this.id,n);let[l,a]=this.renderContainer(null,"join");this.dropPendingRefs(),this.joinCount++,this.joinAttempts=0,this.maybeRecoverForms(l,()=>{this.onJoinComplete(e,l,a,o)})})}dropPendingRefs(){h.all(document,`[${O}="${this.refSrc()}"]`,e=>{e.removeAttribute(le),e.removeAttribute(O),e.removeAttribute(L)})}onJoinComplete({live_patch:e},t,i,s){if(this.joinCount>1||this.parent&&!this.parent.isJoinPending())return this.applyJoinPatch(e,t,i,s);h.findPhxChildrenInFragment(t,this.id).filter(o=>{let l=o.id&&this.el.querySelector(`[id="${o.id}"]`),a=l&&l.getAttribute(ee);return a&&o.setAttribute(ee,a),l&&l.setAttribute(J,this.root.id),this.joinChild(o)}).length===0?this.parent?(this.root.pendingJoinOps.push([this,()=>this.applyJoinPatch(e,t,i,s)]),this.parent.ackJoin(this)):(this.onAllChildJoinsComplete(),this.applyJoinPatch(e,t,i,s)):this.root.pendingJoinOps.push([this,()=>this.applyJoinPatch(e,t,i,s)])}attachTrueDocEl(){this.el=h.byId(this.id),this.el.setAttribute(J,this.root.id)}execNewMounted(e=this.el){let t=this.binding(Fe),i=this.binding(Me);h.all(e,`[${t}], [${i}]`,s=>{this.ownsElement(s)&&(h.maintainPrivateHooks(s,s,t,i),this.maybeAddNewHook(s))}),h.all(e,`[${this.binding(Re)}], [data-phx-${Re}]`,s=>{this.ownsElement(s)&&this.maybeAddNewHook(s)}),h.all(e,`[${this.binding(yt)}]`,s=>{this.ownsElement(s)&&this.maybeMounted(s)})}applyJoinPatch(e,t,i,s){this.attachTrueDocEl();let n=new ce(this,this.el,this.id,t,i,null);if(n.markPrunableContentForRemoval(),this.performPatch(n,!1,!0),this.joinNewChildren(),this.execNewMounted(),this.joinPending=!1,this.liveSocket.dispatchEvents(s),this.applyPendingUpdates(),e){let{kind:o,to:l}=e;this.liveSocket.historyPatch(l,o)}this.hideLoader(),this.joinCount>1&&this.triggerReconnected(),this.stopCallback()}triggerBeforeUpdateHook(e,t){this.liveSocket.triggerDOM("onBeforeElUpdated",[e,t]);let i=this.getHook(e),s=i&&h.isIgnored(e,this.binding(ge));if(i&&!e.isEqualNode(t)&&!(s&&oi(e.dataset,t.dataset)))return i.__beforeUpdate(),i}maybeMounted(e){let t=e.getAttribute(this.binding(yt)),i=t&&h.private(e,"mounted");t&&!i&&(this.liveSocket.execJS(e,t),h.putPrivate(e,"mounted",!0))}maybeAddNewHook(e){let t=this.addHook(e);t&&t.__mounted()}performPatch(e,t,i=!1){let s=[],n=!1,o=new Set;return this.liveSocket.triggerDOM("onPatchStart",[e.targetContainer]),e.after("added",l=>{this.liveSocket.triggerDOM("onNodeAdded",[l]);let a=this.binding(Fe),d=this.binding(Me);h.maintainPrivateHooks(l,l,a,d),this.maybeAddNewHook(l),l.getAttribute&&this.maybeMounted(l)}),e.after("phxChildAdded",l=>{h.isPhxSticky(l)?this.liveSocket.joinRootViews():n=!0}),e.before("updated",(l,a)=>{this.triggerBeforeUpdateHook(l,a)&&o.add(l.id)}),e.after("updated",l=>{o.has(l.id)&&this.getHook(l).__updated()}),e.after("discarded",l=>{l.nodeType===Node.ELEMENT_NODE&&s.push(l)}),e.after("transitionsDiscarded",l=>this.afterElementsRemoved(l,t)),e.perform(i),this.afterElementsRemoved(s,t),this.liveSocket.triggerDOM("onPatchEnd",[e.targetContainer]),n}afterElementsRemoved(e,t){let i=[];e.forEach(s=>{let n=h.all(s,`[${$}]`),o=h.all(s,`[${this.binding(Re)}], [data-phx-hook]`);n.concat(s).forEach(l=>{let a=this.componentID(l);W(a)&&i.indexOf(a)===-1&&i.push(a)}),o.concat(s).forEach(l=>{let a=this.getHook(l);a&&this.destroyHook(a)})}),t&&this.maybePushComponentsDestroyed(i)}joinNewChildren(){h.findPhxChildren(this.el,this.id).forEach(e=>this.joinChild(e))}maybeRecoverForms(e,t){let i=this.binding("change"),s=this.root.formsForRecovery,n=document.createElement("template");n.innerHTML=e;let o=n.content.firstElementChild;o.id=this.id,o.setAttribute(J,this.root.id),o.setAttribute(M,this.getSession()),o.setAttribute(ee,this.getStatic()),o.setAttribute(Z,this.parent?this.parent.id:null);let l=h.all(n.content,"form").filter(a=>a.id&&s[a.id]).filter(a=>!this.pendingForms.has(a.id)).filter(a=>s[a.id].getAttribute(i)===a.getAttribute(i)).map(a=>[s[a.id],a]);if(l.length===0)return t();l.forEach(([a,d],c)=>{this.pendingForms.add(d.id),this.pushFormRecovery(a,d,n.content.firstElementChild,()=>{this.pendingForms.delete(d.id),c===l.length-1&&t()})})}getChildById(e){return this.root.children[this.id][e]}getDescendentByEl(e){var t;return e.id===this.id?this:(t=this.children[e.getAttribute(Z)])==null?void 0:t[e.id]}destroyDescendent(e){for(let t in this.root.children)for(let i in this.root.children[t])if(i===e)return this.root.children[t][i].destroy()}joinChild(e){if(!this.getChildById(e.id)){let i=new r(e,this.liveSocket,this);return this.root.children[this.id][i.id]=i,i.join(),this.childJoins++,!0}}isJoinPending(){return this.joinPending}ackJoin(e){this.childJoins--,this.childJoins===0&&(this.parent?this.parent.ackJoin(this):this.onAllChildJoinsComplete())}onAllChildJoinsComplete(){this.pendingForms.clear(),this.formsForRecovery={},this.joinCallback(()=>{this.pendingJoinOps.forEach(([e,t])=>{e.isDestroyed()||t()}),this.pendingJoinOps=[]})}update(e,t){if(this.isJoinPending()||this.liveSocket.hasPendingLink()&&this.root.isMain())return this.pendingDiffs.push({diff:e,events:t});this.rendered.mergeDiff(e);let i=!1;this.rendered.isComponentOnlyDiff(e)?this.liveSocket.time("component patch complete",()=>{h.findExistingParentCIDs(this.el,this.rendered.componentCIDs(e)).forEach(n=>{this.componentPatch(this.rendered.getComponent(e,n),n)&&(i=!0)})}):Lt(e)||this.liveSocket.time("full patch complete",()=>{let[s,n]=this.renderContainer(e,"update"),o=new ce(this,this.el,this.id,s,n,null);i=this.performPatch(o,!0)}),this.liveSocket.dispatchEvents(t),i&&this.joinNewChildren()}renderContainer(e,t){return this.liveSocket.time(`toString diff (${t})`,()=>{let i=this.el.tagName,s=e?this.rendered.componentCIDs(e):null,[n,o]=this.rendered.toString(s);return[`<${i}>${n}</${i}>`,o]})}componentPatch(e,t){if(Lt(e))return!1;let[i,s]=this.rendered.componentToString(t),n=new ce(this,this.el,this.id,i,s,t);return this.performPatch(n,!0)}getHook(e){return this.viewHooks[Y.elementID(e)]}addHook(e){let t=Y.elementID(e);if(t&&!this.viewHooks[t]){let i=h.getCustomElHook(e)||x(`no hook found for custom element: ${e.id}`);return this.viewHooks[t]=i,i.__attachView(this),i}else{if(t||!e.getAttribute)return;{let i=e.getAttribute(`data-phx-${Re}`)||e.getAttribute(this.binding(Re));if(i&&!this.ownsElement(e))return;let s=this.liveSocket.getHookCallbacks(i);if(s){e.id||x(`no DOM ID for hook "${i}". Hooks require a unique ID on each element.`,e);let n=new Y(this,e,s);return this.viewHooks[Y.elementID(n.el)]=n,n}else i!==null&&x(`unknown hook found for "${i}"`,e)}}}destroyHook(e){let t=Y.elementID(e.el);e.__destroyed(),e.__cleanup__(),delete this.viewHooks[t]}applyPendingUpdates(){this.pendingDiffs.forEach(({diff:e,events:t})=>this.update(e,t)),this.pendingDiffs=[],this.eachChild(e=>e.applyPendingUpdates())}eachChild(e){let t=this.root.children[this.id]||{};for(let i in t)e(this.getChildById(i))}onChannel(e,t){this.liveSocket.onChannel(this.channel,e,i=>{this.isJoinPending()?this.root.pendingJoinOps.push([this,()=>t(i)]):this.liveSocket.requestDOMUpdate(()=>t(i))})}bindChannel(){this.liveSocket.onChannel(this.channel,"diff",e=>{this.liveSocket.requestDOMUpdate(()=>{this.applyDiff("update",e,({diff:t,events:i})=>this.update(t,i))})}),this.onChannel("redirect",({to:e,flash:t})=>this.onRedirect({to:e,flash:t})),this.onChannel("live_patch",e=>this.onLivePatch(e)),this.onChannel("live_redirect",e=>this.onLiveRedirect(e)),this.channel.onError(e=>this.onError(e)),this.channel.onClose(e=>this.onClose(e))}destroyAllChildren(){this.eachChild(e=>e.destroy())}onLiveRedirect(e){let{to:t,kind:i,flash:s}=e,n=this.expandURL(t),o=new CustomEvent("phx:server-navigate",{detail:{to:t,kind:i,flash:s}});this.liveSocket.historyRedirect(o,n,i,s)}onLivePatch(e){let{to:t,kind:i}=e;this.href=this.expandURL(t),this.liveSocket.historyPatch(t,i)}expandURL(e){return e.startsWith("/")?`${window.location.protocol}//${window.location.host}${e}`:e}onRedirect({to:e,flash:t,reloadToken:i}){this.liveSocket.redirect(e,t,i)}isDestroyed(){return this.destroyed}joinDead(){this.isDead=!0}joinPush(){return this.joinPush=this.joinPush||this.channel.join(),this.joinPush}join(e){this.showLoader(this.liveSocket.loaderTimeout),this.bindChannel(),this.isMain()&&(this.stopCallback=this.liveSocket.withPageLoading({to:this.href,kind:"initial"})),this.joinCallback=t=>{t=t||function(){},e?e(this.joinCount,t):t()},this.wrapPush(()=>this.channel.join(),{ok:t=>this.liveSocket.requestDOMUpdate(()=>this.onJoin(t)),error:t=>this.onJoinError(t),timeout:()=>this.onJoinError({reason:"timeout"})})}onJoinError(e){if(e.reason==="reload"){this.log("error",()=>[`failed mount with ${e.status}. Falling back to page reload`,e]),this.onRedirect({to:this.root.href,reloadToken:e.token});return}else if(e.reason==="unauthorized"||e.reason==="stale"){this.log("error",()=>["unauthorized live_redirect. Falling back to page request",e]),this.onRedirect({to:this.root.href});return}if((e.redirect||e.live_redirect)&&(this.joinPending=!1,this.channel.leave()),e.redirect)return this.onRedirect(e.redirect);if(e.live_redirect)return this.onLiveRedirect(e.live_redirect);if(this.log("error",()=>["unable to join",e]),this.isMain())this.displayError([ae,fe,Pe]),this.liveSocket.isConnected()&&this.liveSocket.reloadWithJitter(this);else{this.joinAttempts>=kt&&(this.root.displayError([ae,fe,Pe]),this.log("error",()=>[`giving up trying to mount after ${kt} tries`,e]),this.destroy());let t=h.byId(this.el.id);t?(h.mergeAttrs(t,this.el),this.displayError([ae,fe,Pe]),this.el=t):this.destroy()}}onClose(e){if(!this.isDestroyed()){if(this.isMain()&&this.liveSocket.hasPendingLink()&&e!=="leave")return this.liveSocket.reloadWithJitter(this);this.destroyAllChildren(),this.liveSocket.dropActiveElement(this),document.activeElement&&document.activeElement.blur(),this.liveSocket.isUnloaded()&&this.showLoader(Zt)}}onError(e){this.onClose(e),this.liveSocket.isConnected()&&this.log("error",()=>["view crashed",e]),this.liveSocket.isUnloaded()||(this.liveSocket.isConnected()?this.displayError([ae,fe,Pe]):this.displayError([ae,fe,At]))}displayError(e){this.isMain()&&h.dispatchEvent(window,"phx:page-loading-start",{detail:{to:this.href,kind:"error"}}),this.showLoader(),this.setContainerClasses(...e),this.execAll(this.binding("disconnected"))}wrapPush(e,t){let i=this.liveSocket.getLatencySim(),s=i?n=>setTimeout(()=>!this.isDestroyed()&&n(),i):n=>!this.isDestroyed()&&n();s(()=>{e().receive("ok",n=>s(()=>t.ok&&t.ok(n))).receive("error",n=>s(()=>t.error&&t.error(n))).receive("timeout",()=>s(()=>t.timeout&&t.timeout()))})}pushWithReply(e,t,i){if(!this.isConnected())return Promise.reject({error:"noconnection"});let[s,[n],o]=e?e():[null,[],{}],l=this.joinCount,a=function(){};return o.page_loading&&(a=this.liveSocket.withPageLoading({kind:"element",target:n})),typeof i.cid!="number"&&delete i.cid,new Promise((d,c)=>{this.wrapPush(()=>this.channel.push(t,i,ti),{ok:p=>{s!==null&&(this.lastAckRef=s);let m=g=>{p.redirect&&this.onRedirect(p.redirect),p.live_patch&&this.onLivePatch(p.live_patch),p.live_redirect&&this.onLiveRedirect(p.live_redirect),a(),d({resp:p,reply:g})};p.diff?this.liveSocket.requestDOMUpdate(()=>{this.applyDiff("update",p.diff,({diff:g,reply:u,events:v})=>{s!==null&&this.undoRefs(s,i.event),this.update(g,v),m(u)})}):(s!==null&&this.undoRefs(s,i.event),m(null))},error:p=>c({error:p}),timeout:()=>{c({timeout:!0}),this.joinCount===l&&this.liveSocket.reloadWithJitter(this,()=>{this.log("timeout",()=>["received timeout while communicating with server. Falling back to hard refresh for recovery"])})}})})}undoRefs(e,t,i){if(!this.isConnected())return;let s=`[${O}="${this.refSrc()}"]`;i?(i=new Set(i),h.all(document,s,n=>{i&&!i.has(n)||(h.all(n,s,o=>this.undoElRef(o,e,t)),this.undoElRef(n,e,t))})):h.all(document,s,n=>this.undoElRef(n,e,t))}undoElRef(e,t,i){new je(e).maybeUndo(t,i,n=>{let o=this.triggerBeforeUpdateHook(e,n);ce.patchWithClonedTree(e,n,this.liveSocket),h.all(e,`[${O}="${this.refSrc()}"]`,l=>this.undoElRef(l,t,i)),this.execNewMounted(e),o&&o.__updated()})}refSrc(){return this.el.id}putRef(e,t,i,s={}){let n=this.ref++,o=this.binding(wt);if(s.loading){let l=h.all(document,s.loading).map(a=>({el:a,lock:!0,loading:!0}));e=e.concat(l)}for(let{el:l,lock:a,loading:d}of e){if(!a&&!d)throw new Error("putRef requires lock or loading");if(l.setAttribute(O,this.refSrc()),d&&l.setAttribute(le,n),a&&l.setAttribute(L,n),!d||s.submitter&&!(l===s.submitter||l===s.form))continue;let c=new Promise(u=>{l.addEventListener(`phx:undo-lock:${n}`,()=>u(g),{once:!0})}),p=new Promise(u=>{l.addEventListener(`phx:undo-loading:${n}`,()=>u(g),{once:!0})});l.classList.add(`phx-${i}-loading`);let m=l.getAttribute(o);m!==null&&(l.getAttribute(Ce)||l.setAttribute(Ce,l.innerText),m!==""&&(l.innerText=m),l.setAttribute(he,l.getAttribute(he)||l.disabled),l.setAttribute("disabled",""));let g={event:t,eventType:i,ref:n,isLoading:d,isLocked:a,lockElements:e.filter(({lock:u})=>u).map(({el:u})=>u),loadingElements:e.filter(({loading:u})=>u).map(({el:u})=>u),unlock:u=>{u=Array.isArray(u)?u:[u],this.undoRefs(n,t,u)},lockComplete:c,loadingComplete:p,lock:u=>new Promise(v=>{if(this.isAcked(n))return v(g);u.setAttribute(L,n),u.setAttribute(O,this.refSrc()),u.addEventListener(`phx:lock-stop:${n}`,()=>v(g),{once:!0})})};l.dispatchEvent(new CustomEvent("phx:push",{detail:g,bubbles:!0,cancelable:!1})),t&&l.dispatchEvent(new CustomEvent(`phx:push:${t}`,{detail:g,bubbles:!0,cancelable:!1}))}return[n,e.map(({el:l})=>l),s]}isAcked(e){return this.lastAckRef!==null&&this.lastAckRef>=e}componentID(e){let t=e.getAttribute&&e.getAttribute($);return t?parseInt(t):null}targetComponentID(e,t,i={}){if(W(t))return t;let s=i.target||e.getAttribute(this.binding("target"));return W(s)?parseInt(s):t&&(s!==null||i.target)?this.closestComponentID(t):null}closestComponentID(e){return W(e)?e:e?z(e.closest(`[${$}]`),t=>this.ownsElement(t)&&this.componentID(t)):null}pushHookEvent(e,t,i,s,n){if(!this.isConnected())return this.log("hook",()=>["unable to push hook event. LiveView not connected",i,s]),!1;let[o,l,a]=this.putRef([{el:e,loading:!0,lock:!0}],i,"hook");return this.pushWithReply(()=>[o,l,a],"event",{type:"hook",event:i,value:s,cid:this.closestComponentID(t)}).then(({resp:d,reply:c})=>n(c,o)),o}extractMeta(e,t,i){let s=this.binding("value-");for(let n=0;n<e.attributes.length;n++){t||(t={});let o=e.attributes[n].name;o.startsWith(s)&&(t[o.replace(s,"")]=e.getAttribute(o))}if(e.value!==void 0&&!(e instanceof HTMLFormElement)&&(t||(t={}),t.value=e.value,e.tagName==="INPUT"&&rt.indexOf(e.type)>=0&&!e.checked&&delete t.value),i){t||(t={});for(let n in i)t[n]=i[n]}return t}pushEvent(e,t,i,s,n,o={},l){this.pushWithReply(()=>this.putRef([{el:t,loading:!0,lock:!0}],s,e,o),"event",{type:e,event:s,value:this.extractMeta(t,n,o.value),cid:this.targetComponentID(t,i,o)}).then(({reply:a})=>l&&l(a))}pushFileProgress(e,t,i,s=function(){}){this.liveSocket.withinOwners(e.form,(n,o)=>{n.pushWithReply(null,"progress",{event:e.getAttribute(n.binding(Yt)),ref:e.getAttribute(B),entry_ref:t,progress:i,cid:n.targetComponentID(e.form,o)}).then(({resp:l})=>s(l))})}pushInput(e,t,i,s,n,o){if(!e.form)throw new Error("form events require the input to be inside a form");let l,a=W(i)?i:this.targetComponentID(e.form,t,n),d=()=>this.putRef([{el:e,loading:!0,lock:!0},{el:e.form,loading:!0,lock:!0}],s,"change",n),c,p=this.extractMeta(e.form);e instanceof HTMLButtonElement&&(p.submitter=e),e.getAttribute(this.binding("change"))?c=ut(e.form,I({_target:n._target},p),[e.name]):c=ut(e.form,I({_target:n._target},p)),h.isUploadInput(e)&&e.files&&e.files.length>0&&C.trackFiles(e,Array.from(e.files)),l=C.serializeUploads(e);let m={type:"form",event:s,value:c,uploads:l,cid:a};this.pushWithReply(d,"event",m).then(({resp:g})=>{if(h.isUploadInput(e)&&h.isAutoUpload(e)){if(C.filesAwaitingPreflight(e).length>0){let[u,v]=d();this.undoRefs(u,s,[e.form]),this.uploadFiles(e.form,s,t,u,a,b=>{o&&o(g),this.triggerAwaitingSubmit(e.form,s),this.undoRefs(u,s)})}}else o&&o(g)})}triggerAwaitingSubmit(e,t){let i=this.getScheduledSubmit(e);if(i){let[s,n,o,l]=i;this.cancelSubmit(e,t),l()}}getScheduledSubmit(e){return this.formSubmits.find(([t,i,s,n])=>t.isSameNode(e))}scheduleSubmit(e,t,i,s){if(this.getScheduledSubmit(e))return!0;this.formSubmits.push([e,t,i,s])}cancelSubmit(e,t){this.formSubmits=this.formSubmits.filter(([i,s,n,o])=>i.isSameNode(e)?(this.undoRefs(s,t),!1):!0)}disableForm(e,t,i={}){let s=u=>!(ve(u,`${this.binding(ge)}=ignore`,u.form)||ve(u,"data-phx-update=ignore",u.form)),n=u=>u.hasAttribute(this.binding(wt)),o=u=>u.tagName=="BUTTON",l=u=>["INPUT","TEXTAREA","SELECT"].includes(u.tagName),a=Array.from(e.elements),d=a.filter(n),c=a.filter(o).filter(s),p=a.filter(l).filter(s);c.forEach(u=>{u.setAttribute(he,u.disabled),u.disabled=!0}),p.forEach(u=>{u.setAttribute(Ue,u.readOnly),u.readOnly=!0,u.files&&(u.setAttribute(he,u.disabled),u.disabled=!0)});let m=d.concat(c).concat(p).map(u=>({el:u,loading:!0,lock:!0})),g=[{el:e,loading:!0,lock:!1}].concat(m).reverse();return this.putRef(g,t,"submit",i)}pushFormSubmit(e,t,i,s,n,o){let l=()=>this.disableForm(e,i,De(I({},n),{form:e,submitter:s})),a=this.targetComponentID(e,t);if(C.hasUploadsInProgress(e)){let[d,c]=l(),p=()=>this.pushFormSubmit(e,t,i,s,n,o);return this.scheduleSubmit(e,d,n,p)}else if(C.inputsAwaitingPreflight(e).length>0){let[d,c]=l(),p=()=>[d,c,n];this.uploadFiles(e,i,t,d,a,m=>{if(C.inputsAwaitingPreflight(e).length>0)return this.undoRefs(d,i);let g=this.extractMeta(e),u=ut(e,I({submitter:s},g));this.pushWithReply(p,"event",{type:"form",event:i,value:u,cid:a}).then(({resp:v})=>o(v))})}else if(!(e.hasAttribute(O)&&e.classList.contains("phx-submit-loading"))){let d=this.extractMeta(e),c=ut(e,I({submitter:s},d));this.pushWithReply(l,"event",{type:"form",event:i,value:c,cid:a}).then(({resp:p})=>o(p))}}uploadFiles(e,t,i,s,n,o){let l=this.joinCount,a=C.activeFileInputs(e),d=a.length;a.forEach(c=>{let p=new C(c,this,()=>{d--,d===0&&o()}),m=p.entries().map(u=>u.toPreflightPayload());if(m.length===0){d--;return}let g={ref:c.getAttribute(B),entries:m,cid:this.targetComponentID(c.form,i)};this.log("upload",()=>["sending preflight request",g]),this.pushWithReply(null,"allow_upload",g).then(({resp:u})=>{if(this.log("upload",()=>["got preflight response",u]),p.entries().forEach(v=>{u.entries&&!u.entries[v.ref]&&this.handleFailedEntryPreflight(v.ref,"failed preflight",p)}),u.error||Object.keys(u.entries).length===0)this.undoRefs(s,t),(u.error||[]).map(([b,T])=>{this.handleFailedEntryPreflight(b,T,p)});else{let v=b=>{this.channel.onError(()=>{this.joinCount===l&&b()})};p.initAdapterUpload(u,v,this.liveSocket)}})})}handleFailedEntryPreflight(e,t,i){if(i.isAutoUpload()){let s=i.entries().find(n=>n.ref===e.toString());s&&s.cancel()}else i.entries().map(s=>s.cancel());this.log("upload",()=>[`error for entry ${e}`,t])}dispatchUploads(e,t,i){let s=this.targetCtxElement(e)||this.el,n=h.findUploadInputs(s).filter(o=>o.name===t);n.length===0?x(`no live file inputs found matching the name "${t}"`):n.length>1?x(`duplicate live file inputs found matching the name "${t}"`):h.dispatchEvent(n[0],tt,{detail:{files:i}})}targetCtxElement(e){if(W(e)){let[t]=h.findComponentNodeList(this.el,e);return t}else return e||null}pushFormRecovery(e,t,i,s){let n=this.binding("change"),o=t.getAttribute(this.binding("target"))||t,l=t.getAttribute(this.binding(Et))||t.getAttribute(this.binding("change")),a=Array.from(e.elements).filter(p=>h.isFormInput(p)&&p.name&&!p.hasAttribute(n));if(a.length===0)return;a.forEach(p=>p.hasAttribute(B)&&C.clearFiles(p));let d=a.find(p=>p.type!=="hidden")||a[0],c=0;this.withinTargets(o,(p,m)=>{let g=this.targetComponentID(t,m);c++;let u=new CustomEvent("phx:form-recovery",{detail:{sourceElement:e}});y.exec(u,"change",l,this,d,["push",{_target:d.name,targetView:p,targetCtx:m,newCid:g,callback:()=>{c--,c===0&&s()}}])},i,i)}pushLinkPatch(e,t,i,s){let n=this.liveSocket.setPendingLink(t),o=e.isTrusted&&e.type!=="popstate",l=i?()=>this.putRef([{el:i,loading:o,lock:!0}],null,"click"):null,a=()=>this.liveSocket.redirect(window.location.href),d=t.startsWith("/")?`${location.protocol}//${location.host}${t}`:t;this.pushWithReply(l,"live_patch",{url:d}).then(({resp:c})=>{this.liveSocket.requestDOMUpdate(()=>{c.link_redirect?this.liveSocket.replaceMain(t,null,s,n):(this.liveSocket.commitPendingLink(n)&&(this.href=t),this.applyPendingUpdates(),s&&s(n))})},({error:c,timeout:p})=>a())}getFormsForRecovery(){if(this.joinCount===0)return{};let e=this.binding("change");return h.all(this.el,`form[${e}]`).filter(t=>t.id).filter(t=>t.elements.length>0).filter(t=>t.getAttribute(this.binding(Et))!=="ignore").map(t=>t.cloneNode(!0)).reduce((t,i)=>(t[i.id]=i,t),{})}maybePushComponentsDestroyed(e){let t=e.filter(i=>h.findComponentNodeList(this.el,i).length===0);t.length>0&&(t.forEach(i=>this.rendered.resetRender(i)),this.pushWithReply(null,"cids_will_destroy",{cids:t}).then(()=>{this.liveSocket.requestDOMUpdate(()=>{let i=t.filter(s=>h.findComponentNodeList(this.el,s).length===0);i.length>0&&this.pushWithReply(null,"cids_destroyed",{cids:i}).then(({resp:s})=>{this.rendered.pruneCIDs(s.cids)})})}))}ownsElement(e){let t=e.closest(q);return e.getAttribute(Z)===this.id||t&&t.id===this.id||!t&&this.isDead}submitForm(e,t,i,s,n={}){h.putPrivate(e,me,!0),Array.from(e.elements).forEach(l=>h.putPrivate(l,me,!0)),this.liveSocket.blurActiveElement(this),this.pushFormSubmit(e,t,i,s,n,()=>{this.liveSocket.restorePreviouslyActiveFocus()})}binding(e){return this.liveSocket.binding(e)}};var Si=r=>h.isUsedInput(r),qe=class{constructor(e,t,i={}){if(this.unloaded=!1,!t||t.constructor.name==="Object")throw new Error(`
       a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:
 
           import {Socket} from "phoenix"