{
  "version": 3,
  "sources": ["../../../node_modules/@rails/actioncable/src/adapters.js", "../../../node_modules/@rails/actioncable/src/logger.js", "../../../node_modules/@rails/actioncable/src/connection_monitor.js", "../../../node_modules/@rails/actioncable/src/internal.js", "../../../node_modules/@rails/actioncable/src/connection.js", "../../../node_modules/@rails/actioncable/src/subscription.js", "../../../node_modules/@rails/actioncable/src/subscription_guarantor.js", "../../../node_modules/@rails/actioncable/src/subscriptions.js", "../../../node_modules/@rails/actioncable/src/consumer.js", "../../../node_modules/@rails/actioncable/src/index.js", "../../../node_modules/trix/dist/trix.js", "../../../node_modules/@rails/activestorage/app/assets/javascripts/activestorage.js", "../../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js", "../../../node_modules/@hotwired/stimulus/dist/stimulus.js", "../../javascript/controllers/application.js", "../../../node_modules/el-transition/index.js", "../../javascript/controllers/alert_controller.ts", "../../../node_modules/@kurkle/color/dist/color.esm.js", "../../../node_modules/chart.js/src/helpers/helpers.core.ts", "../../../node_modules/chart.js/src/helpers/helpers.math.ts", "../../../node_modules/chart.js/src/helpers/helpers.collection.ts", "../../../node_modules/chart.js/src/helpers/helpers.extras.ts", "../../../node_modules/chart.js/src/helpers/helpers.easing.ts", "../../../node_modules/chart.js/src/helpers/helpers.color.ts", "../../../node_modules/chart.js/src/core/core.animations.defaults.js", "../../../node_modules/chart.js/src/core/core.layouts.defaults.js", "../../../node_modules/chart.js/src/helpers/helpers.intl.ts", "../../../node_modules/chart.js/src/core/core.ticks.js", "../../../node_modules/chart.js/src/core/core.scale.defaults.js", "../../../node_modules/chart.js/src/core/core.defaults.js", "../../../node_modules/chart.js/src/helpers/helpers.canvas.ts", "../../../node_modules/chart.js/src/helpers/helpers.options.ts", "../../../node_modules/chart.js/src/helpers/helpers.config.ts", "../../../node_modules/chart.js/src/helpers/helpers.curve.ts", "../../../node_modules/chart.js/src/helpers/helpers.dom.ts", "../../../node_modules/chart.js/src/helpers/helpers.interpolation.ts", "../../../node_modules/chart.js/src/helpers/helpers.rtl.ts", "../../../node_modules/chart.js/src/helpers/helpers.segment.js", "../../../node_modules/chart.js/src/helpers/helpers.dataset.ts", "../../../node_modules/chart.js/src/core/core.animator.js", "../../../node_modules/chart.js/src/core/core.animation.js", "../../../node_modules/chart.js/src/core/core.animations.js", "../../../node_modules/chart.js/src/core/core.datasetController.js", "../../../node_modules/chart.js/src/controllers/controller.bar.js", "../../../node_modules/chart.js/src/controllers/controller.bubble.js", "../../../node_modules/chart.js/src/controllers/controller.doughnut.js", "../../../node_modules/chart.js/src/controllers/controller.line.js", "../../../node_modules/chart.js/src/controllers/controller.polarArea.js", "../../../node_modules/chart.js/src/controllers/controller.pie.js", "../../../node_modules/chart.js/src/controllers/controller.radar.js", "../../../node_modules/chart.js/src/controllers/controller.scatter.js", "../../../node_modules/chart.js/src/core/core.adapters.ts", "../../../node_modules/chart.js/src/core/core.interaction.js", "../../../node_modules/chart.js/src/core/core.layouts.js", "../../../node_modules/chart.js/src/platform/platform.base.js", "../../../node_modules/chart.js/src/platform/platform.basic.js", "../../../node_modules/chart.js/src/platform/platform.dom.js", "../../../node_modules/chart.js/src/platform/index.js", "../../../node_modules/chart.js/src/core/core.element.ts", "../../../node_modules/chart.js/src/core/core.scale.autoskip.js", "../../../node_modules/chart.js/src/core/core.scale.js", "../../../node_modules/chart.js/src/core/core.typedRegistry.js", "../../../node_modules/chart.js/src/core/core.registry.js", "../../../node_modules/chart.js/src/core/core.plugins.js", "../../../node_modules/chart.js/src/core/core.config.js", "../../../node_modules/chart.js/src/core/core.controller.js", "../../../node_modules/chart.js/src/elements/element.arc.ts", "../../../node_modules/chart.js/src/elements/element.line.js", "../../../node_modules/chart.js/src/elements/element.point.ts", "../../../node_modules/chart.js/src/elements/element.bar.js", "../../../node_modules/chart.js/src/plugins/plugin.colors.ts", "../../../node_modules/chart.js/src/plugins/plugin.decimation.js", "../../../node_modules/chart.js/src/plugins/plugin.filler/filler.segment.js", "../../../node_modules/chart.js/src/plugins/plugin.filler/filler.helper.js", "../../../node_modules/chart.js/src/plugins/plugin.filler/filler.options.js", "../../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.stack.js", "../../../node_modules/chart.js/src/plugins/plugin.filler/simpleArc.js", "../../../node_modules/chart.js/src/plugins/plugin.filler/filler.target.js", "../../../node_modules/chart.js/src/plugins/plugin.filler/filler.drawing.js", "../../../node_modules/chart.js/src/plugins/plugin.filler/index.js", "../../../node_modules/chart.js/src/plugins/plugin.legend.js", "../../../node_modules/chart.js/src/plugins/plugin.title.js", "../../../node_modules/chart.js/src/plugins/plugin.subtitle.js", "../../../node_modules/chart.js/src/plugins/plugin.tooltip.js", "../../../node_modules/chart.js/src/scales/scale.category.js", "../../../node_modules/chart.js/src/scales/scale.linearbase.js", "../../../node_modules/chart.js/src/scales/scale.linear.js", "../../../node_modules/chart.js/src/scales/scale.logarithmic.js", "../../../node_modules/chart.js/src/scales/scale.radialLinear.js", "../../../node_modules/chart.js/src/scales/scale.time.js", "../../../node_modules/chart.js/src/scales/scale.timeseries.js", "../../../node_modules/chart.js/src/index.ts", "../../../node_modules/chart.js/auto/auto.js", "../../../node_modules/chart.js/dist/helpers.js", "../../../node_modules/chartjs-plugin-annotation/dist/chartjs-plugin-annotation.esm.js", "../../javascript/controllers/analytics/ci_chart_controller.js", "../../javascript/controllers/analytics/game_log_component_controller.js", "../../javascript/controllers/analytics/grade_performance_chart_component_controller.js", "../../javascript/controllers/analytics/grade_performance_tabs_component_controller.js", "../../javascript/controllers/analytics/performance_chart_component_controller.js", "../../javascript/controllers/charts/base_controller.js", "../../javascript/controllers/clipboard_controller.js", "../../javascript/controllers/confirmation_controller.ts", "../../javascript/controllers/context_menu_controller.js", "../../javascript/controllers/dependent_checkbox_controller.js", "../../javascript/controllers/dropdown_controller.ts", "../../javascript/controllers/game/analysis/camera_component_controller.js", "../../javascript/controllers/game/analysis/cameras_component_controller.js", "../../javascript/controllers/game/analysis/charts/rebound_result_breakdown_chart_component_controller.js", "../../javascript/controllers/game/analysis/charts/safe_area_rebound_rate_chart_component_controller.js", "../../javascript/controllers/game/analysis/charts/shot_breakdown_chart_component_controller.js", "../../javascript/controllers/game/analysis/charts/xg_breakdown_chart_component_controller.js", "../../javascript/controllers/game/analysis/goaltender_assignment_controller.js", "../../javascript/controllers/game/analysis/location_component_controller.js", "../../javascript/controllers/game/analysis/play_viewer_component_controller.js", "../../javascript/controllers/game/analysis/setup_component_controller.js", "../../javascript/controllers/game/analysis/shot_list_controller.js", "../../javascript/controllers/game/analysis/shot_map_component_controller.js", "../../javascript/controllers/game/analysis/video_file_upload_component_controller.js", "../../javascript/controllers/game/analysis/video_player_controller.js", "../../javascript/controllers/game_form_controller.js", "../../javascript/controllers/game_list_item_controller.js", "../../javascript/controllers/goaltender_assignment_modal_controller.js", "../../javascript/controllers/manual_clip_duration_controller.js", "../../javascript/controllers/mobile_menu_controller.ts", "../../javascript/controllers/modal_controller.js", "../../javascript/controllers/navigate_controller.js", "../../javascript/controllers/nested_fields_controller.ts", "../../javascript/controllers/public/biographical_info_component_controller.js", "../../javascript/controllers/public/game_card_component_controller.js", "../../javascript/controllers/public/highlight_reel_component_controller.js", "../../javascript/controllers/public/recent_games_grid_component_controller.js", "../../javascript/controllers/public/team_info_component_controller.js", "../../javascript/controllers/public/trust_indicator_component_controller.js", "../../javascript/controllers/review/annotation/clip_point_overlay_component_controller.js", "../../javascript/controllers/review/annotation/custom_fields/grid_component_controller.js", "../../javascript/controllers/review/annotation/custom_fields/play_situation_field_component_controller.js", "../../javascript/controllers/review/annotation/custom_fields/radio_group_component_controller.js", "../../javascript/controllers/review/annotation/event_form_component_controller.js", "../../javascript/controllers/review/annotation/event_sequence_component_controller.js", "../../javascript/controllers/review/annotation/event_type_selector_component_controller.js", "../../javascript/controllers/review/annotation/ice_map_component_controller.js", "../../javascript/controllers/review/annotation/studio_component_controller.js", "../../javascript/controllers/review/annotation_point_component_controller.js", "../../javascript/controllers/review/camera_context_menu_component_controller.js", "../../javascript/utils/hls_config.js", "../../javascript/controllers/review/camera_sync_modal_component_controller.js", "../../javascript/controllers/review/clip_point_component_controller.js", "../../javascript/controllers/review/debug/classification_toggle_controller.js", "../../javascript/controllers/review/event_sequence_list_item_controller.js", "../../javascript/controllers/review/keybinding_manager_controller.js", "../../javascript/controllers/review/player_component_controller.js", "../../javascript/controllers/review/player_set_component_controller.js", "../../javascript/controllers/review/queues/base_component_controller.js", "../../javascript/controllers/review/queues/classifications_component_controller.js", "../../javascript/controllers/review/queues/games_component_controller.js", "../../javascript/controllers/review/queues/plays_component_controller.js", "../../javascript/controllers/review/queues/queue_item_component_controller.js", "../../javascript/utils/time_formatter.js", "../../javascript/controllers/review/seeker_component_controller.js", "../../javascript/controllers/review/studio_component_controller.js", "../../javascript/controllers/review/timeline_component_controller.js", "../../javascript/controllers/review/timeline_item_controller.js", "../../javascript/controllers/settings/profile_photo_upload_component_controller.js", "../../javascript/controllers/shared/goaltender_switcher_component_controller.js", "../../javascript/controllers/shared/player_keyboard_controller.js", "../../javascript/controllers/team_season_typeahead_controller.js", "../../javascript/controllers/timezone_guesser_controller.ts", "../../javascript/controllers/tooltip_controller.js", "../../javascript/controllers/tournament_team_form_controller.js", "../../javascript/controllers/ui/dual_range_slider_component_controller.js", "../../javascript/controllers/ui/goaltender_select_dropdown_component_controller.js", "../../javascript/controllers/ui/keyboard_shortcuts_component_controller.js", "../../javascript/controllers/ui/multi_select_dropdown_component_controller.js", "../../javascript/controllers/ui/radio_group_component_controller.js", "../../javascript/controllers/ui/tabs_component_controller.js", "../../javascript/controllers/video/clip_component_controller.js", "../../javascript/controllers/video/clip_edit_component_controller.js", "../../javascript/controllers/video/clip_result_component_controller.js", "../../javascript/controllers/video/clips/location_filter_grid_controller.js", "../../javascript/controllers/video/clips/shot_origin_filter_controller.js", "../../javascript/controllers/video/clips_filter_controller.js", "../../javascript/controllers/video/clips_selection_controller.js", "../../javascript/controllers/video/compilation_clip_item_component_controller.js", "../../javascript/controllers/video/compilation_component_controller.js", "../../javascript/controllers/video/compilation_player_component_controller.js", "../../../node_modules/@rails/request.js/src/fetch_response.js", "../../../node_modules/@rails/request.js/src/request_interceptor.js", "../../../node_modules/@rails/request.js/src/lib/utils.js", "../../../node_modules/@rails/request.js/src/fetch_request.js", "../../../node_modules/@rails/request.js/src/verbs.js", "../../javascript/controllers/video/studio_controller.js", "../../javascript/controllers/video/feed_clip_component_controller.js", "../../javascript/controllers/video/feed_collection_component_controller.js", "../../javascript/controllers/video/feed_component_controller.js", "../../javascript/controllers/video/feed_player_component_controller.js", "../../javascript/controllers/video/feed_seeker_component_controller.js", "../../javascript/controllers/video/player_collection_component_controller.js", "../../javascript/controllers/video/player_component_controller.js", "../../javascript/controllers/video/studio_component_controller.js", "../../javascript/controllers/index.js", "../../javascript/application.js", "../../../node_modules/@rails/actiontext/app/javascript/actiontext/attachment_upload.js", "../../../node_modules/@rails/actiontext/app/javascript/actiontext/index.js"],
  "sourcesContent": ["export default {\n  logger: typeof console !== \"undefined\" ? console : undefined,\n  WebSocket: typeof WebSocket !== \"undefined\" ? WebSocket : undefined,\n}\n", "import adapters from \"./adapters\"\n\n// The logger is disabled by default. You can enable it with:\n//\n//   ActionCable.logger.enabled = true\n//\n//   Example:\n//\n//   import * as ActionCable from '@rails/actioncable'\n//\n//   ActionCable.logger.enabled = true\n//   ActionCable.logger.log('Connection Established.')\n//\n\nexport default {\n  log(...messages) {\n    if (this.enabled) {\n      messages.push(Date.now())\n      adapters.logger.log(\"[ActionCable]\", ...messages)\n    }\n  },\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting\n// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.\n\nconst now = () => new Date().getTime()\n\nconst secondsSince = time => (now() - time) / 1000\n\nclass ConnectionMonitor {\n  constructor(connection) {\n    this.visibilityDidChange = this.visibilityDidChange.bind(this)\n    this.connection = connection\n    this.reconnectAttempts = 0\n  }\n\n  start() {\n    if (!this.isRunning()) {\n      this.startedAt = now()\n      delete this.stoppedAt\n      this.startPolling()\n      addEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`)\n    }\n  }\n\n  stop() {\n    if (this.isRunning()) {\n      this.stoppedAt = now()\n      this.stopPolling()\n      removeEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(\"ConnectionMonitor stopped\")\n    }\n  }\n\n  isRunning() {\n    return this.startedAt && !this.stoppedAt\n  }\n\n  recordMessage() {\n    this.pingedAt = now()\n  }\n\n  recordConnect() {\n    this.reconnectAttempts = 0\n    delete this.disconnectedAt\n    logger.log(\"ConnectionMonitor recorded connect\")\n  }\n\n  recordDisconnect() {\n    this.disconnectedAt = now()\n    logger.log(\"ConnectionMonitor recorded disconnect\")\n  }\n\n  // Private\n\n  startPolling() {\n    this.stopPolling()\n    this.poll()\n  }\n\n  stopPolling() {\n    clearTimeout(this.pollTimeout)\n  }\n\n  poll() {\n    this.pollTimeout = setTimeout(() => {\n      this.reconnectIfStale()\n      this.poll()\n    }\n    , this.getPollInterval())\n  }\n\n  getPollInterval() {\n    const { staleThreshold, reconnectionBackoffRate } = this.constructor\n    const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10))\n    const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate\n    const jitter = jitterMax * Math.random()\n    return staleThreshold * 1000 * backoff * (1 + jitter)\n  }\n\n  reconnectIfStale() {\n    if (this.connectionIsStale()) {\n      logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`)\n      this.reconnectAttempts++\n      if (this.disconnectedRecently()) {\n        logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`)\n      } else {\n        logger.log(\"ConnectionMonitor reopening\")\n        this.connection.reopen()\n      }\n    }\n  }\n\n  get refreshedAt() {\n    return this.pingedAt ? this.pingedAt : this.startedAt\n  }\n\n  connectionIsStale() {\n    return secondsSince(this.refreshedAt) > this.constructor.staleThreshold\n  }\n\n  disconnectedRecently() {\n    return this.disconnectedAt && (secondsSince(this.disconnectedAt) < this.constructor.staleThreshold)\n  }\n\n  visibilityDidChange() {\n    if (document.visibilityState === \"visible\") {\n      setTimeout(() => {\n        if (this.connectionIsStale() || !this.connection.isOpen()) {\n          logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`)\n          this.connection.reopen()\n        }\n      }\n      , 200)\n    }\n  }\n\n}\n\nConnectionMonitor.staleThreshold = 6 // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)\nConnectionMonitor.reconnectionBackoffRate = 0.15\n\nexport default ConnectionMonitor\n", "export default {\n  \"message_types\": {\n    \"welcome\": \"welcome\",\n    \"disconnect\": \"disconnect\",\n    \"ping\": \"ping\",\n    \"confirmation\": \"confirm_subscription\",\n    \"rejection\": \"reject_subscription\"\n  },\n  \"disconnect_reasons\": {\n    \"unauthorized\": \"unauthorized\",\n    \"invalid_request\": \"invalid_request\",\n    \"server_restart\": \"server_restart\",\n    \"remote\": \"remote\"\n  },\n  \"default_mount_path\": \"/cable\",\n  \"protocols\": [\n    \"actioncable-v1-json\",\n    \"actioncable-unsupported\"\n  ]\n}\n", "import adapters from \"./adapters\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\n\n// Encapsulate the cable connection held by the consumer. This is an internal class not intended for direct user manipulation.\n\nconst {message_types, protocols} = INTERNAL\nconst supportedProtocols = protocols.slice(0, protocols.length - 1)\n\nconst indexOf = [].indexOf\n\nclass Connection {\n  constructor(consumer) {\n    this.open = this.open.bind(this)\n    this.consumer = consumer\n    this.subscriptions = this.consumer.subscriptions\n    this.monitor = new ConnectionMonitor(this)\n    this.disconnected = true\n  }\n\n  send(data) {\n    if (this.isOpen()) {\n      this.webSocket.send(JSON.stringify(data))\n      return true\n    } else {\n      return false\n    }\n  }\n\n  open() {\n    if (this.isActive()) {\n      logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)\n      return false\n    } else {\n      const socketProtocols = [...protocols, ...this.consumer.subprotocols || []]\n      logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`)\n      if (this.webSocket) { this.uninstallEventHandlers() }\n      this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols)\n      this.installEventHandlers()\n      this.monitor.start()\n      return true\n    }\n  }\n\n  close({allowReconnect} = {allowReconnect: true}) {\n    if (!allowReconnect) { this.monitor.stop() }\n    // Avoid closing websockets in a \"connecting\" state due to Safari 15.1+ bug. See: https://github.com/rails/rails/issues/43835#issuecomment-1002288478\n    if (this.isOpen()) {\n      return this.webSocket.close()\n    }\n  }\n\n  reopen() {\n    logger.log(`Reopening WebSocket, current state is ${this.getState()}`)\n    if (this.isActive()) {\n      try {\n        return this.close()\n      } catch (error) {\n        logger.log(\"Failed to reopen WebSocket\", error)\n      }\n      finally {\n        logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`)\n        setTimeout(this.open, this.constructor.reopenDelay)\n      }\n    } else {\n      return this.open()\n    }\n  }\n\n  getProtocol() {\n    if (this.webSocket) {\n      return this.webSocket.protocol\n    }\n  }\n\n  isOpen() {\n    return this.isState(\"open\")\n  }\n\n  isActive() {\n    return this.isState(\"open\", \"connecting\")\n  }\n\n  triedToReconnect() {\n    return this.monitor.reconnectAttempts > 0\n  }\n\n  // Private\n\n  isProtocolSupported() {\n    return indexOf.call(supportedProtocols, this.getProtocol()) >= 0\n  }\n\n  isState(...states) {\n    return indexOf.call(states, this.getState()) >= 0\n  }\n\n  getState() {\n    if (this.webSocket) {\n      for (let state in adapters.WebSocket) {\n        if (adapters.WebSocket[state] === this.webSocket.readyState) {\n          return state.toLowerCase()\n        }\n      }\n    }\n    return null\n  }\n\n  installEventHandlers() {\n    for (let eventName in this.events) {\n      const handler = this.events[eventName].bind(this)\n      this.webSocket[`on${eventName}`] = handler\n    }\n  }\n\n  uninstallEventHandlers() {\n    for (let eventName in this.events) {\n      this.webSocket[`on${eventName}`] = function() {}\n    }\n  }\n\n}\n\nConnection.reopenDelay = 500\n\nConnection.prototype.events = {\n  message(event) {\n    if (!this.isProtocolSupported()) { return }\n    const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)\n    this.monitor.recordMessage()\n    switch (type) {\n      case message_types.welcome:\n        if (this.triedToReconnect()) {\n          this.reconnectAttempted = true\n        }\n        this.monitor.recordConnect()\n        return this.subscriptions.reload()\n      case message_types.disconnect:\n        logger.log(`Disconnecting. Reason: ${reason}`)\n        return this.close({allowReconnect: reconnect})\n      case message_types.ping:\n        return null\n      case message_types.confirmation:\n        this.subscriptions.confirmSubscription(identifier)\n        if (this.reconnectAttempted) {\n          this.reconnectAttempted = false\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: true})\n        } else {\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: false})\n        }\n      case message_types.rejection:\n        return this.subscriptions.reject(identifier)\n      default:\n        return this.subscriptions.notify(identifier, \"received\", message)\n    }\n  },\n\n  open() {\n    logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`)\n    this.disconnected = false\n    if (!this.isProtocolSupported()) {\n      logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\")\n      return this.close({allowReconnect: false})\n    }\n  },\n\n  close(event) {\n    logger.log(\"WebSocket onclose event\")\n    if (this.disconnected) { return }\n    this.disconnected = true\n    this.monitor.recordDisconnect()\n    return this.subscriptions.notifyAll(\"disconnected\", {willAttemptReconnect: this.monitor.isRunning()})\n  },\n\n  error() {\n    logger.log(\"WebSocket onerror event\")\n  }\n}\n\nexport default Connection\n", "// A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.\n// It provides a number of callbacks and a method for calling remote procedure calls on the corresponding\n// Channel instance on the server side.\n//\n// An example demonstrates the basic functionality:\n//\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\", {\n//     connected() {\n//       // Called once the subscription has been successfully completed\n//     },\n//\n//     disconnected({ willAttemptReconnect: boolean }) {\n//       // Called when the client has disconnected with the server.\n//       // The object will have an `willAttemptReconnect` property which\n//       // says whether the client has the intention of attempting\n//       // to reconnect.\n//     },\n//\n//     appear() {\n//       this.perform('appear', {appearing_on: this.appearingOn()})\n//     },\n//\n//     away() {\n//       this.perform('away')\n//     },\n//\n//     appearingOn() {\n//       $('main').data('appearing-on')\n//     }\n//   })\n//\n// The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server\n// by calling the `perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).\n// The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.\n//\n// This is how the server component would look:\n//\n//   class AppearanceChannel < ApplicationActionCable::Channel\n//     def subscribed\n//       current_user.appear\n//     end\n//\n//     def unsubscribed\n//       current_user.disappear\n//     end\n//\n//     def appear(data)\n//       current_user.appear on: data['appearing_on']\n//     end\n//\n//     def away\n//       current_user.away\n//     end\n//   end\n//\n// The \"AppearanceChannel\" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.\n// The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the perform method.\n\nconst extend = function(object, properties) {\n  if (properties != null) {\n    for (let key in properties) {\n      const value = properties[key]\n      object[key] = value\n    }\n  }\n  return object\n}\n\nexport default class Subscription {\n  constructor(consumer, params = {}, mixin) {\n    this.consumer = consumer\n    this.identifier = JSON.stringify(params)\n    extend(this, mixin)\n  }\n\n  // Perform a channel action with the optional data passed as an attribute\n  perform(action, data = {}) {\n    data.action = action\n    return this.send(data)\n  }\n\n  send(data) {\n    return this.consumer.send({command: \"message\", identifier: this.identifier, data: JSON.stringify(data)})\n  }\n\n  unsubscribe() {\n    return this.consumer.subscriptions.remove(this)\n  }\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received.\n// Internal class, not intended for direct user manipulation.\n\nclass SubscriptionGuarantor {\n  constructor(subscriptions) {\n    this.subscriptions = subscriptions\n    this.pendingSubscriptions = []\n  }\n\n  guarantee(subscription) {\n    if(this.pendingSubscriptions.indexOf(subscription) == -1){ \n      logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)\n      this.pendingSubscriptions.push(subscription) \n    }\n    else {\n      logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)\n    }\n    this.startGuaranteeing()\n  }\n\n  forget(subscription) {\n    logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)\n    this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))\n  }\n\n  startGuaranteeing() {\n    this.stopGuaranteeing()\n    this.retrySubscribing()\n  }\n  \n  stopGuaranteeing() {\n    clearTimeout(this.retryTimeout)\n  }\n\n  retrySubscribing() {\n    this.retryTimeout = setTimeout(() => {\n      if (this.subscriptions && typeof(this.subscriptions.subscribe) === \"function\") {\n        this.pendingSubscriptions.map((subscription) => {\n          logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)\n          this.subscriptions.subscribe(subscription)\n        })\n      }\n    }\n    , 500)\n  }\n}\n\nexport default SubscriptionGuarantor", "import Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport logger from \"./logger\"\n\n// Collection class for creating (and internally managing) channel subscriptions.\n// The only method intended to be triggered by the user is ActionCable.Subscriptions#create,\n// and it should be called through the consumer like so:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n\nexport default class Subscriptions {\n  constructor(consumer) {\n    this.consumer = consumer\n    this.guarantor = new SubscriptionGuarantor(this)\n    this.subscriptions = []\n  }\n\n  create(channelName, mixin) {\n    const channel = channelName\n    const params = typeof channel === \"object\" ? channel : {channel}\n    const subscription = new Subscription(this.consumer, params, mixin)\n    return this.add(subscription)\n  }\n\n  // Private\n\n  add(subscription) {\n    this.subscriptions.push(subscription)\n    this.consumer.ensureActiveConnection()\n    this.notify(subscription, \"initialized\")\n    this.subscribe(subscription)\n    return subscription\n  }\n\n  remove(subscription) {\n    this.forget(subscription)\n    if (!this.findAll(subscription.identifier).length) {\n      this.sendCommand(subscription, \"unsubscribe\")\n    }\n    return subscription\n  }\n\n  reject(identifier) {\n    return this.findAll(identifier).map((subscription) => {\n      this.forget(subscription)\n      this.notify(subscription, \"rejected\")\n      return subscription\n    })\n  }\n\n  forget(subscription) {\n    this.guarantor.forget(subscription)\n    this.subscriptions = (this.subscriptions.filter((s) => s !== subscription))\n    return subscription\n  }\n\n  findAll(identifier) {\n    return this.subscriptions.filter((s) => s.identifier === identifier)\n  }\n\n  reload() {\n    return this.subscriptions.map((subscription) =>\n      this.subscribe(subscription))\n  }\n\n  notifyAll(callbackName, ...args) {\n    return this.subscriptions.map((subscription) =>\n      this.notify(subscription, callbackName, ...args))\n  }\n\n  notify(subscription, callbackName, ...args) {\n    let subscriptions\n    if (typeof subscription === \"string\") {\n      subscriptions = this.findAll(subscription)\n    } else {\n      subscriptions = [subscription]\n    }\n\n    return subscriptions.map((subscription) =>\n      (typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined))\n  }\n\n  subscribe(subscription) {\n    if (this.sendCommand(subscription, \"subscribe\")) {\n      this.guarantor.guarantee(subscription)\n    }\n  }\n\n  confirmSubscription(identifier) {\n    logger.log(`Subscription confirmed ${identifier}`)\n    this.findAll(identifier).map((subscription) =>\n      this.guarantor.forget(subscription))\n  }\n\n  sendCommand(subscription, command) {\n    const {identifier} = subscription\n    return this.consumer.send({command, identifier})\n  }\n}\n", "import Connection from \"./connection\"\nimport Subscriptions from \"./subscriptions\"\n\n// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,\n// the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.\n// The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription\n// method.\n//\n// The following example shows how this can be set up:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n//\n// When a consumer is created, it automatically connects with the server.\n//\n// To disconnect from the server, call\n//\n//   App.cable.disconnect()\n//\n// and to restart the connection:\n//\n//   App.cable.connect()\n//\n// Any channel subscriptions which existed prior to disconnecting will\n// automatically resubscribe.\n\nexport default class Consumer {\n  constructor(url) {\n    this._url = url\n    this.subscriptions = new Subscriptions(this)\n    this.connection = new Connection(this)\n    this.subprotocols = []\n  }\n\n  get url() {\n    return createWebSocketURL(this._url)\n  }\n\n  send(data) {\n    return this.connection.send(data)\n  }\n\n  connect() {\n    return this.connection.open()\n  }\n\n  disconnect() {\n    return this.connection.close({allowReconnect: false})\n  }\n\n  ensureActiveConnection() {\n    if (!this.connection.isActive()) {\n      return this.connection.open()\n    }\n  }\n\n  addSubProtocol(subprotocol) {\n    this.subprotocols = [...this.subprotocols, subprotocol]\n  }\n}\n\nexport function createWebSocketURL(url) {\n  if (typeof url === \"function\") {\n    url = url()\n  }\n\n  if (url && !/^wss?:/i.test(url)) {\n    const a = document.createElement(\"a\")\n    a.href = url\n    // Fix populating Location properties in IE. Otherwise, protocol will be blank.\n    a.href = a.href\n    a.protocol = a.protocol.replace(\"http\", \"ws\")\n    return a.href\n  } else {\n    return url\n  }\n}\n", "import Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport Subscription from \"./subscription\"\nimport Subscriptions from \"./subscriptions\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport adapters from \"./adapters\"\nimport logger from \"./logger\"\n\nexport {\n  Connection,\n  ConnectionMonitor,\n  Consumer,\n  INTERNAL,\n  Subscription,\n  Subscriptions,\n  SubscriptionGuarantor,\n  adapters,\n  createWebSocketURL,\n  logger,\n}\n\nexport function createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n  return new Consumer(url)\n}\n\nexport function getConfig(name) {\n  const element = document.head.querySelector(`meta[name='action-cable-${name}']`)\n  if (element) {\n    return element.getAttribute(\"content\")\n  }\n}\n", "/*\nTrix 1.3.5\nCopyright \u00A9 2024 37signals, LLC\nhttp://trix-editor.org/\n */\n(function(){}).call(this),function(){var t;null==window.Set&&(window.Set=t=function(){function t(){this.clear()}return t.prototype.clear=function(){return this.values=[]},t.prototype.has=function(t){return-1!==this.values.indexOf(t)},t.prototype.add=function(t){return this.has(t)||this.values.push(t),this},t.prototype[\"delete\"]=function(t){var e;return-1===(e=this.values.indexOf(t))?!1:(this.values.splice(e,1),!0)},t.prototype.forEach=function(){var t;return(t=this.values).forEach.apply(t,arguments)},t}())}.call(this),function(t){function e(){}function n(t,e){return function(){t.apply(e,arguments)}}function i(t){if(\"object\"!=typeof this)throw new TypeError(\"Promises must be constructed via new\");if(\"function\"!=typeof t)throw new TypeError(\"not a function\");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],c(t,this)}function o(t,e){for(;3===t._state;)t=t._value;return 0===t._state?void t._deferreds.push(e):(t._handled=!0,void h(function(){var n=1===t._state?e.onFulfilled:e.onRejected;if(null===n)return void(1===t._state?r:s)(e.promise,t._value);var i;try{i=n(t._value)}catch(o){return void s(e.promise,o)}r(e.promise,i)}))}function r(t,e){try{if(e===t)throw new TypeError(\"A promise cannot be resolved with itself.\");if(e&&(\"object\"==typeof e||\"function\"==typeof e)){var o=e.then;if(e instanceof i)return t._state=3,t._value=e,void a(t);if(\"function\"==typeof o)return void c(n(o,e),t)}t._state=1,t._value=e,a(t)}catch(r){s(t,r)}}function s(t,e){t._state=2,t._value=e,a(t)}function a(t){2===t._state&&0===t._deferreds.length&&setTimeout(function(){t._handled||p(t._value)},1);for(var e=0,n=t._deferreds.length;n>e;e++)o(t,t._deferreds[e]);t._deferreds=null}function u(t,e,n){this.onFulfilled=\"function\"==typeof t?t:null,this.onRejected=\"function\"==typeof e?e:null,this.promise=n}function c(t,e){var n=!1;try{t(function(t){n||(n=!0,r(e,t))},function(t){n||(n=!0,s(e,t))})}catch(i){if(n)return;n=!0,s(e,i)}}var l=setTimeout,h=\"function\"==typeof setImmediate&&setImmediate||function(t){l(t,1)},p=function(t){\"undefined\"!=typeof console&&console&&console.warn(\"Possible Unhandled Promise Rejection:\",t)};i.prototype[\"catch\"]=function(t){return this.then(null,t)},i.prototype.then=function(t,n){var r=new i(e);return o(this,new u(t,n,r)),r},i.all=function(t){var e=Array.prototype.slice.call(t);return new i(function(t,n){function i(r,s){try{if(s&&(\"object\"==typeof s||\"function\"==typeof s)){var a=s.then;if(\"function\"==typeof a)return void a.call(s,function(t){i(r,t)},n)}e[r]=s,0===--o&&t(e)}catch(u){n(u)}}if(0===e.length)return t([]);for(var o=e.length,r=0;r<e.length;r++)i(r,e[r])})},i.resolve=function(t){return t&&\"object\"==typeof t&&t.constructor===i?t:new i(function(e){e(t)})},i.reject=function(t){return new i(function(e,n){n(t)})},i.race=function(t){return new i(function(e,n){for(var i=0,o=t.length;o>i;i++)t[i].then(e,n)})},i._setImmediateFn=function(t){h=t},i._setUnhandledRejectionFn=function(t){p=t},\"undefined\"!=typeof module&&module.exports?module.exports=i:t.Promise||(t.Promise=i)}(this),function(){var t=\"object\"==typeof window.customElements,e=\"function\"==typeof document.registerElement,n=t||e;n||(/**\n * @license\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\"undefined\"==typeof WeakMap&&!function(){var t=Object.defineProperty,e=Date.now()%1e9,n=function(){this.name=\"__st\"+(1e9*Math.random()>>>0)+(e++ +\"__\")};n.prototype={set:function(e,n){var i=e[this.name];return i&&i[0]===e?i[1]=n:t(e,this.name,{value:[e,n],writable:!0}),this},get:function(t){var e;return(e=t[this.name])&&e[0]===t?e[1]:void 0},\"delete\":function(t){var e=t[this.name];return e&&e[0]===t?(e[0]=e[1]=void 0,!0):!1},has:function(t){var e=t[this.name];return e?e[0]===t:!1}},window.WeakMap=n}(),function(t){function e(t){A.push(t),b||(b=!0,g(i))}function n(t){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(t)||t}function i(){b=!1;var t=A;A=[],t.sort(function(t,e){return t.uid_-e.uid_});var e=!1;t.forEach(function(t){var n=t.takeRecords();o(t),n.length&&(t.callback_(n,t),e=!0)}),e&&i()}function o(t){t.nodes_.forEach(function(e){var n=m.get(e);n&&n.forEach(function(e){e.observer===t&&e.removeTransientObservers()})})}function r(t,e){for(var n=t;n;n=n.parentNode){var i=m.get(n);if(i)for(var o=0;o<i.length;o++){var r=i[o],s=r.options;if(n===t||s.subtree){var a=e(s);a&&r.enqueue(a)}}}}function s(t){this.callback_=t,this.nodes_=[],this.records_=[],this.uid_=++C}function a(t,e){this.type=t,this.target=e,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function u(t){var e=new a(t.type,t.target);return e.addedNodes=t.addedNodes.slice(),e.removedNodes=t.removedNodes.slice(),e.previousSibling=t.previousSibling,e.nextSibling=t.nextSibling,e.attributeName=t.attributeName,e.attributeNamespace=t.attributeNamespace,e.oldValue=t.oldValue,e}function c(t,e){return x=new a(t,e)}function l(t){return w?w:(w=u(x),w.oldValue=t,w)}function h(){x=w=void 0}function p(t){return t===w||t===x}function d(t,e){return t===e?t:w&&p(t)?w:null}function f(t,e,n){this.observer=t,this.target=e,this.options=n,this.transientObservedNodes=[]}if(!t.JsMutationObserver){var g,m=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))g=setTimeout;else if(window.setImmediate)g=window.setImmediate;else{var v=[],y=String(Math.random());window.addEventListener(\"message\",function(t){if(t.data===y){var e=v;v=[],e.forEach(function(t){t()})}}),g=function(t){v.push(t),window.postMessage(y,\"*\")}}var b=!1,A=[],C=0;s.prototype={observe:function(t,e){if(t=n(t),!e.childList&&!e.attributes&&!e.characterData||e.attributeOldValue&&!e.attributes||e.attributeFilter&&e.attributeFilter.length&&!e.attributes||e.characterDataOldValue&&!e.characterData)throw new SyntaxError;var i=m.get(t);i||m.set(t,i=[]);for(var o,r=0;r<i.length;r++)if(i[r].observer===this){o=i[r],o.removeListeners(),o.options=e;break}o||(o=new f(this,t,e),i.push(o),this.nodes_.push(t)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(t){for(var e=m.get(t),n=0;n<e.length;n++){var i=e[n];if(i.observer===this){i.removeListeners(),e.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var t=this.records_;return this.records_=[],t}};var x,w;f.prototype={enqueue:function(t){var n=this.observer.records_,i=n.length;if(n.length>0){var o=n[i-1],r=d(o,t);if(r)return void(n[i-1]=r)}else e(this.observer);n[i]=t},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(t){var e=this.options;e.attributes&&t.addEventListener(\"DOMAttrModified\",this,!0),e.characterData&&t.addEventListener(\"DOMCharacterDataModified\",this,!0),e.childList&&t.addEventListener(\"DOMNodeInserted\",this,!0),(e.childList||e.subtree)&&t.addEventListener(\"DOMNodeRemoved\",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(t){var e=this.options;e.attributes&&t.removeEventListener(\"DOMAttrModified\",this,!0),e.characterData&&t.removeEventListener(\"DOMCharacterDataModified\",this,!0),e.childList&&t.removeEventListener(\"DOMNodeInserted\",this,!0),(e.childList||e.subtree)&&t.removeEventListener(\"DOMNodeRemoved\",this,!0)},addTransientObserver:function(t){if(t!==this.target){this.addListeners_(t),this.transientObservedNodes.push(t);var e=m.get(t);e||m.set(t,e=[]),e.push(this)}},removeTransientObservers:function(){var t=this.transientObservedNodes;this.transientObservedNodes=[],t.forEach(function(t){this.removeListeners_(t);for(var e=m.get(t),n=0;n<e.length;n++)if(e[n]===this){e.splice(n,1);break}},this)},handleEvent:function(t){switch(t.stopImmediatePropagation(),t.type){case\"DOMAttrModified\":var e=t.attrName,n=t.relatedNode.namespaceURI,i=t.target,o=new c(\"attributes\",i);o.attributeName=e,o.attributeNamespace=n;var s=t.attrChange===MutationEvent.ADDITION?null:t.prevValue;r(i,function(t){return!t.attributes||t.attributeFilter&&t.attributeFilter.length&&-1===t.attributeFilter.indexOf(e)&&-1===t.attributeFilter.indexOf(n)?void 0:t.attributeOldValue?l(s):o});break;case\"DOMCharacterDataModified\":var i=t.target,o=c(\"characterData\",i),s=t.prevValue;r(i,function(t){return t.characterData?t.characterDataOldValue?l(s):o:void 0});break;case\"DOMNodeRemoved\":this.addTransientObserver(t.target);case\"DOMNodeInserted\":var a,u,p=t.target;\"DOMNodeInserted\"===t.type?(a=[p],u=[]):(a=[],u=[p]);var d=p.previousSibling,f=p.nextSibling,o=c(\"childList\",t.target.parentNode);o.addedNodes=a,o.removedNodes=u,o.previousSibling=d,o.nextSibling=f,r(t.relatedNode,function(t){return t.childList?o:void 0})}h()}},t.JsMutationObserver=s,t.MutationObserver||(t.MutationObserver=s,s._isPolyfilled=!0)}}(self),function(){\"use strict\";if(!window.performance||!window.performance.now){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var t=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return t?function(e){return t(function(){e(performance.now())})}:function(t){return window.setTimeout(t,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(t){clearTimeout(t)}}());var e=function(){var t=document.createEvent(\"Event\");return t.initEvent(\"foo\",!0,!0),t.preventDefault(),t.defaultPrevented}();if(!e){var n=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(n.call(this),Object.defineProperty(this,\"defaultPrevented\",{get:function(){return!0},configurable:!0}))}}var i=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||i&&\"function\"!=typeof window.CustomEvent)&&(window.CustomEvent=function(t,e){e=e||{};var n=document.createEvent(\"CustomEvent\");return n.initCustomEvent(t,Boolean(e.bubbles),Boolean(e.cancelable),e.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||i&&\"function\"!=typeof window.Event){var o=window.Event;window.Event=function(t,e){e=e||{};var n=document.createEvent(\"Event\");return n.initEvent(t,Boolean(e.bubbles),Boolean(e.cancelable)),n},window.Event.prototype=o.prototype}}(window.WebComponents),window.CustomElements=window.CustomElements||{flags:{}},function(t){var e=t.flags,n=[],i=function(t){n.push(t)},o=function(){n.forEach(function(e){e(t)})};t.addModule=i,t.initializeModules=o,t.hasNative=Boolean(document.registerElement),t.isIE=/Trident/.test(navigator.userAgent),t.useNative=!e.register&&t.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(t){function e(t,e){n(t,function(t){return e(t)?!0:void i(t,e)}),i(t,e)}function n(t,e,i){var o=t.firstElementChild;if(!o)for(o=t.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)e(o,i)!==!0&&n(o,e,i),o=o.nextElementSibling;return null}function i(t,n){for(var i=t.shadowRoot;i;)e(i,n),i=i.olderShadowRoot}function o(t,e){r(t,e,[])}function r(t,e,n){if(t=window.wrap(t),!(n.indexOf(t)>=0)){n.push(t);for(var i,o=t.querySelectorAll(\"link[rel=\"+s+\"]\"),a=0,u=o.length;u>a&&(i=o[a]);a++)i.import&&r(i.import,e,n);e(t)}}var s=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:\"none\";t.forDocumentTree=o,t.forSubtree=e}),window.CustomElements.addModule(function(t){function e(t,e){return n(t,e)||i(t,e)}function n(e,n){return t.upgrade(e,n)?!0:void(n&&s(e))}function i(t,e){b(t,function(t){return n(t,e)?!0:void 0})}function o(t){w.push(t),x||(x=!0,setTimeout(r))}function r(){x=!1;for(var t,e=w,n=0,i=e.length;i>n&&(t=e[n]);n++)t();w=[]}function s(t){C?o(function(){a(t)}):a(t)}function a(t){t.__upgraded__&&!t.__attached&&(t.__attached=!0,t.attachedCallback&&t.attachedCallback())}function u(t){c(t),b(t,function(t){c(t)})}function c(t){C?o(function(){l(t)}):l(t)}function l(t){t.__upgraded__&&t.__attached&&(t.__attached=!1,t.detachedCallback&&t.detachedCallback())}function h(t){for(var e=t,n=window.wrap(document);e;){if(e==n)return!0;e=e.parentNode||e.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&e.host}}function p(t){if(t.shadowRoot&&!t.shadowRoot.__watched){y.dom&&console.log(\"watching shadow-root for: \",t.localName);for(var e=t.shadowRoot;e;)g(e),e=e.olderShadowRoot}}function d(t,n){if(y.dom){var i=n[0];if(i&&\"childList\"===i.type&&i.addedNodes&&i.addedNodes){for(var o=i.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var r=o&&(o.URL||o._URL||o.host&&o.host.localName)||\"\";r=r.split(\"/?\").shift().split(\"/\").pop()}console.group(\"mutations (%d) [%s]\",n.length,r||\"\")}var s=h(t);n.forEach(function(t){\"childList\"===t.type&&(E(t.addedNodes,function(t){t.localName&&e(t,s)}),E(t.removedNodes,function(t){t.localName&&u(t)}))}),y.dom&&console.groupEnd()}function f(t){for(t=window.wrap(t),t||(t=window.wrap(document));t.parentNode;)t=t.parentNode;var e=t.__observer;e&&(d(t,e.takeRecords()),r())}function g(t){if(!t.__observer){var e=new MutationObserver(d.bind(this,t));e.observe(t,{childList:!0,subtree:!0}),t.__observer=e}}function m(t){t=window.wrap(t),y.dom&&console.group(\"upgradeDocument: \",t.baseURI.split(\"/\").pop());var n=t===window.wrap(document);e(t,n),g(t),y.dom&&console.groupEnd()}function v(t){A(t,m)}var y=t.flags,b=t.forSubtree,A=t.forDocumentTree,C=window.MutationObserver._isPolyfilled&&y[\"throttle-attached\"];t.hasPolyfillMutations=C,t.hasThrottledAttached=C;var x=!1,w=[],E=Array.prototype.forEach.call.bind(Array.prototype.forEach),S=Element.prototype.createShadowRoot;S&&(Element.prototype.createShadowRoot=function(){var t=S.call(this);return window.CustomElements.watchShadow(this),t}),t.watchShadow=p,t.upgradeDocumentTree=v,t.upgradeDocument=m,t.upgradeSubtree=i,t.upgradeAll=e,t.attached=s,t.takeRecords=f}),window.CustomElements.addModule(function(t){function e(e,i){if(\"template\"===e.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(e),!e.__upgraded__&&e.nodeType===Node.ELEMENT_NODE){var o=e.getAttribute(\"is\"),r=t.getRegisteredDefinition(e.localName)||t.getRegisteredDefinition(o);if(r&&(o&&r.tag==e.localName||!o&&!r.extends))return n(e,r,i)}}function n(e,n,o){return s.upgrade&&console.group(\"upgrade:\",e.localName),n.is&&e.setAttribute(\"is\",n.is),i(e,n),e.__upgraded__=!0,r(e),o&&t.attached(e),t.upgradeSubtree(e,o),s.upgrade&&console.groupEnd(),e}function i(t,e){Object.__proto__?t.__proto__=e.prototype:(o(t,e.prototype,e.native),t.__proto__=e.prototype)}function o(t,e,n){for(var i={},o=e;o!==n&&o!==HTMLElement.prototype;){for(var r,s=Object.getOwnPropertyNames(o),a=0;r=s[a];a++)i[r]||(Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(o,r)),i[r]=1);o=Object.getPrototypeOf(o)}}function r(t){t.createdCallback&&t.createdCallback()}var s=t.flags;t.upgrade=e,t.upgradeWithDefinition=n,t.implementPrototype=i}),window.CustomElements.addModule(function(t){function e(e,i){var u=i||{};if(!e)throw new Error(\"document.registerElement: first argument `name` must not be empty\");if(e.indexOf(\"-\")<0)throw new Error(\"document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '\"+String(e)+\"'.\");if(o(e))throw new Error(\"Failed to execute 'registerElement' on 'Document': Registration failed for type '\"+String(e)+\"'. The type name is invalid.\");if(c(e))throw new Error(\"DuplicateDefinitionError: a type with name '\"+String(e)+\"' is already registered\");return u.prototype||(u.prototype=Object.create(HTMLElement.prototype)),u.__name=e.toLowerCase(),u.extends&&(u.extends=u.extends.toLowerCase()),u.lifecycle=u.lifecycle||{},u.ancestry=r(u.extends),s(u),a(u),n(u.prototype),l(u.__name,u),u.ctor=h(u),u.ctor.prototype=u.prototype,u.prototype.constructor=u.ctor,t.ready&&m(document),u.ctor}function n(t){if(!t.setAttribute._polyfilled){var e=t.setAttribute;t.setAttribute=function(t,n){i.call(this,t,n,e)};var n=t.removeAttribute;t.removeAttribute=function(t){i.call(this,t,null,n)},t.setAttribute._polyfilled=!0}}function i(t,e,n){t=t.toLowerCase();var i=this.getAttribute(t);n.apply(this,arguments);var o=this.getAttribute(t);this.attributeChangedCallback&&o!==i&&this.attributeChangedCallback(t,i,o)}function o(t){for(var e=0;e<C.length;e++)if(t===C[e])return!0}function r(t){var e=c(t);return e?r(e.extends).concat([e]):[]}function s(t){for(var e,n=t.extends,i=0;e=t.ancestry[i];i++)n=e.is&&e.tag;t.tag=n||t.__name,n&&(t.is=t.__name)}function a(t){if(!Object.__proto__){var e=HTMLElement.prototype;if(t.is){var n=document.createElement(t.tag);e=Object.getPrototypeOf(n)}for(var i,o=t.prototype,r=!1;o;)o==e&&(r=!0),i=Object.getPrototypeOf(o),i&&(o.__proto__=i),o=i;r||console.warn(t.tag+\" prototype not found in prototype chain for \"+t.is),t.native=e}}function u(t){return y(E(t.tag),t)}function c(t){return t?x[t.toLowerCase()]:void 0}function l(t,e){x[t]=e}function h(t){return function(){return u(t)}}function p(t,e,n){return t===w?d(e,n):S(t,e)}function d(t,e){t&&(t=t.toLowerCase()),e&&(e=e.toLowerCase());var n=c(e||t);if(n){if(t==n.tag&&e==n.is)return new n.ctor;if(!e&&!n.is)return new n.ctor}var i;return e?(i=d(t),i.setAttribute(\"is\",e),i):(i=E(t),t.indexOf(\"-\")>=0&&b(i,HTMLElement),i)}function f(t,e){var n=t[e];t[e]=function(){var t=n.apply(this,arguments);return v(t),t}}var g,m=(t.isIE,t.upgradeDocumentTree),v=t.upgradeAll,y=t.upgradeWithDefinition,b=t.implementPrototype,A=t.useNative,C=[\"annotation-xml\",\"color-profile\",\"font-face\",\"font-face-src\",\"font-face-uri\",\"font-face-format\",\"font-face-name\",\"missing-glyph\"],x={},w=\"http://www.w3.org/1999/xhtml\",E=document.createElement.bind(document),S=document.createElementNS.bind(document);g=Object.__proto__||A?function(t,e){return t instanceof e}:function(t,e){if(t instanceof e)return!0;for(var n=t;n;){if(n===e.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,\"cloneNode\"),f(document,\"importNode\"),document.registerElement=e,document.createElement=d,document.createElementNS=p,t.registry=x,t.instanceof=g,t.reservedTagList=C,t.getRegisteredDefinition=c,document.register=document.registerElement}),function(t){function e(){r(window.wrap(document)),window.CustomElements.ready=!0;var t=window.requestAnimationFrame||function(t){setTimeout(t,16)};t(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent(\"WebComponentsReady\",{bubbles:!0}))})})}var n=t.useNative,i=t.initializeModules;if(t.isIE,n){var o=function(){};t.watchShadow=o,t.upgrade=o,t.upgradeAll=o,t.upgradeDocumentTree=o,t.upgradeSubtree=o,t.takeRecords=o,t.instanceof=function(t,e){return t instanceof e}}else i();var r=t.upgradeDocumentTree,s=t.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(t){return t}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(t){t.import&&s(wrap(t.import))}),\"complete\"===document.readyState||t.flags.eager)e();else if(\"interactive\"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var a=window.HTMLImports&&!window.HTMLImports.ready?\"HTMLImportsLoaded\":\"DOMContentLoaded\";window.addEventListener(a,e)}else e()}(window.CustomElements))}.call(this),function(){}.call(this),function(){var t=this;(function(){(function(){this.Trix={VERSION:\"1.3.5\",ZERO_WIDTH_SPACE:\"\\ufeff\",NON_BREAKING_SPACE:\"\\xa0\",OBJECT_REPLACEMENT_CHARACTER:\"\\ufffc\",browser:{composesExistingText:/Android.*Chrome/.test(navigator.userAgent),forcesObjectResizing:/Trident.*rv:11/.test(navigator.userAgent),supportsInputEvents:function(){var t,e,n,i;if(\"undefined\"==typeof InputEvent)return!1;for(i=[\"data\",\"getTargetRanges\",\"inputType\"],t=0,e=i.length;e>t;t++)if(n=i[t],!(n in InputEvent.prototype))return!1;return!0}()},config:{}}}).call(this)}).call(t);var e=t.Trix;(function(){(function(){e.BasicObject=function(){function t(){}var e,n,i;return t.proxyMethod=function(t){var i,o,r,s,a;return r=n(t),i=r.name,s=r.toMethod,a=r.toProperty,o=r.optional,this.prototype[i]=function(){var t,n;return t=null!=s?o?\"function\"==typeof this[s]?this[s]():void 0:this[s]():null!=a?this[a]:void 0,o?(n=null!=t?t[i]:void 0,null!=n?e.call(n,t,arguments):void 0):(n=t[i],e.call(n,t,arguments))}},n=function(t){var e,n;if(!(n=t.match(i)))throw new Error(\"can't parse @proxyMethod expression: \"+t);return e={name:n[4]},null!=n[2]?e.toMethod=n[1]:e.toProperty=n[1],null!=n[3]&&(e.optional=!0),e},e=Function.prototype.apply,i=/^(.+?)(\\(\\))?(\\?)?\\.(.+?)$/,t}()}).call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.Object=function(n){function i(){this.id=++o}var o;return t(i,n),o=0,i.fromJSONString=function(t){return this.fromJSON(JSON.parse(t))},i.prototype.hasSameConstructorAs=function(t){return this.constructor===(null!=t?t.constructor:void 0)},i.prototype.isEqualTo=function(t){return this===t},i.prototype.inspect=function(){var t,e,n;return t=function(){var t,i,o;i=null!=(t=this.contentsForInspection())?t:{},o=[];for(e in i)n=i[e],o.push(e+\"=\"+n);return o}.call(this),\"#<\"+this.constructor.name+\":\"+this.id+(t.length?\" \"+t.join(\", \"):\"\")+\">\"},i.prototype.contentsForInspection=function(){},i.prototype.toJSONString=function(){return JSON.stringify(this)},i.prototype.toUTF16String=function(){return e.UTF16String.box(this)},i.prototype.getCacheKey=function(){return this.id.toString()},i}(e.BasicObject)}.call(this),function(){e.extend=function(t){var e,n;for(e in t)n=t[e],this[e]=n;return this}}.call(this),function(){e.extend({defer:function(t){return setTimeout(t,1)}})}.call(this),function(){var t,n;e.extend({normalizeSpaces:function(t){return t.replace(RegExp(\"\"+e.ZERO_WIDTH_SPACE,\"g\"),\"\").replace(RegExp(\"\"+e.NON_BREAKING_SPACE,\"g\"),\" \")},normalizeNewlines:function(t){return t.replace(/\\r\\n/g,\"\\n\")},breakableWhitespacePattern:RegExp(\"[^\\\\S\"+e.NON_BREAKING_SPACE+\"]\"),squishBreakableWhitespace:function(t){return t.replace(RegExp(\"\"+e.breakableWhitespacePattern.source,\"g\"),\" \").replace(/\\ {2,}/g,\" \")},summarizeStringChange:function(t,i){var o,r,s,a;return t=e.UTF16String.box(t),i=e.UTF16String.box(i),i.length<t.length?(r=n(t,i),a=r[0],o=r[1]):(s=n(i,t),o=s[0],a=s[1]),{added:o,removed:a}}}),n=function(n,i){var o,r,s,a,u;return n.isEqualTo(i)?[\"\",\"\"]:(r=t(n,i),a=r.utf16String.length,s=a?(u=r.offset,r,o=n.codepoints.slice(0,u).concat(n.codepoints.slice(u+a)),t(i,e.UTF16String.fromCodepoints(o))):t(i,n),[r.utf16String.toString(),s.utf16String.toString()])},t=function(t,e){var n,i,o;for(n=0,i=t.length,o=e.length;i>n&&t.charAt(n).isEqualTo(e.charAt(n));)n++;for(;i>n+1&&t.charAt(i-1).isEqualTo(e.charAt(o-1));)i--,o--;return{utf16String:t.slice(n,i),offset:n}}}.call(this),function(){e.extend({copyObject:function(t){var e,n,i;null==t&&(t={}),n={};for(e in t)i=t[e],n[e]=i;return n},objectsAreEqual:function(t,e){var n,i;if(null==t&&(t={}),null==e&&(e={}),Object.keys(t).length!==Object.keys(e).length)return!1;for(n in t)if(i=t[n],i!==e[n])return!1;return!0}})}.call(this),function(){var t=[].slice;e.extend({arraysAreEqual:function(t,e){var n,i,o,r;if(null==t&&(t=[]),null==e&&(e=[]),t.length!==e.length)return!1;for(i=n=0,o=t.length;o>n;i=++n)if(r=t[i],r!==e[i])return!1;return!0},arrayStartsWith:function(t,n){return null==t&&(t=[]),null==n&&(n=[]),e.arraysAreEqual(t.slice(0,n.length),n)},spliceArray:function(){var e,n,i;return n=arguments[0],e=2<=arguments.length?t.call(arguments,1):[],i=n.slice(0),i.splice.apply(i,e),i},summarizeArrayChange:function(t,e){var n,i,o,r,s,a,u,c,l,h,p;for(null==t&&(t=[]),null==e&&(e=[]),n=[],h=[],o=new Set,r=0,u=t.length;u>r;r++)p=t[r],o.add(p);for(i=new Set,s=0,c=e.length;c>s;s++)p=e[s],i.add(p),o.has(p)||n.push(p);for(a=0,l=t.length;l>a;a++)p=t[a],i.has(p)||h.push(p);return{added:n,removed:h}}})}.call(this),function(){var t,n,i,o;t=null,n=null,o=null,i=null,e.extend({getAllAttributeNames:function(){return null!=t?t:t=e.getTextAttributeNames().concat(e.getBlockAttributeNames())},getBlockConfig:function(t){return e.config.blockAttributes[t]},getBlockAttributeNames:function(){return null!=n?n:n=Object.keys(e.config.blockAttributes)},getTextConfig:function(t){return e.config.textAttributes[t]},getTextAttributeNames:function(){return null!=o?o:o=Object.keys(e.config.textAttributes)},getListAttributeNames:function(){var t,n;return null!=i?i:i=function(){var i,o;i=e.config.blockAttributes,o=[];for(t in i)n=i[t].listAttribute,null!=n&&o.push(n);return o}()}})}.call(this),function(){var t,n,i,o,r,s=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1};t=document.documentElement,n=null!=(i=null!=(o=null!=(r=t.matchesSelector)?r:t.webkitMatchesSelector)?o:t.msMatchesSelector)?i:t.mozMatchesSelector,e.extend({handleEvent:function(n,i){var o,r,s,a,u,c,l,h,p,d,f,g;return h=null!=i?i:{},c=h.onElement,u=h.matchingSelector,g=h.withCallback,a=h.inPhase,l=h.preventDefault,d=h.times,r=null!=c?c:t,p=u,o=g,f=\"capturing\"===a,s=function(t){var n;return null!=d&&0===--d&&s.destroy(),n=e.findClosestElementFromNode(t.target,{matchingSelector:p}),null!=n&&(null!=g&&g.call(n,t,n),l)?t.preventDefault():void 0},s.destroy=function(){return r.removeEventListener(n,s,f)},r.addEventListener(n,s,f),s},handleEventOnce:function(t,n){return null==n&&(n={}),n.times=1,e.handleEvent(t,n)},triggerEvent:function(n,i){var o,r,s,a,u,c,l;return l=null!=i?i:{},c=l.onElement,r=l.bubbles,s=l.cancelable,o=l.attributes,a=null!=c?c:t,r=r!==!1,s=s!==!1,u=document.createEvent(\"Events\"),u.initEvent(n,r,s),null!=o&&e.extend.call(u,o),a.dispatchEvent(u)},elementMatchesSelector:function(t,e){return 1===(null!=t?t.nodeType:void 0)?n.call(t,e):void 0},findClosestElementFromNode:function(t,n){var i,o,r;for(o=null!=n?n:{},i=o.matchingSelector,r=o.untilNode;null!=t&&t.nodeType!==Node.ELEMENT_NODE;)t=t.parentNode;if(null!=t){if(null==i)return t;if(t.closest&&null==r)return t.closest(i);for(;t&&t!==r;){if(e.elementMatchesSelector(t,i))return t;t=t.parentNode}}},findInnerElement:function(t){for(;null!=t?t.firstElementChild:void 0;)t=t.firstElementChild;return t},innerElementIsActive:function(t){return document.activeElement!==t&&e.elementContainsNode(t,document.activeElement)},elementContainsNode:function(t,e){if(t&&e)for(;e;){if(e===t)return!0;e=e.parentNode}},findNodeFromContainerAndOffset:function(t,e){var n;if(t)return t.nodeType===Node.TEXT_NODE?t:0===e?null!=(n=t.firstChild)?n:t:t.childNodes.item(e-1)},findElementFromContainerAndOffset:function(t,n){var i;return i=e.findNodeFromContainerAndOffset(t,n),e.findClosestElementFromNode(i)},findChildIndexOfNode:function(t){var e;if(null!=t?t.parentNode:void 0){for(e=0;t=t.previousSibling;)e++;return e}},removeNode:function(t){var e;return null!=t&&null!=(e=t.parentNode)?e.removeChild(t):void 0},walkTree:function(t,e){var n,i,o,r,s;return o=null!=e?e:{},i=o.onlyNodesOfType,r=o.usingFilter,n=o.expandEntityReferences,s=function(){switch(i){case\"element\":return NodeFilter.SHOW_ELEMENT;case\"text\":return NodeFilter.SHOW_TEXT;case\"comment\":return NodeFilter.SHOW_COMMENT;default:return NodeFilter.SHOW_ALL}}(),document.createTreeWalker(t,s,null!=r?r:null,n===!0)},tagName:function(t){var e;return null!=t&&null!=(e=t.tagName)?e.toLowerCase():void 0},makeElement:function(t,e){var n,i,o,r,s,a,u,c,l,h,p,d,f,g;if(null==e&&(e={}),\"object\"==typeof t?(e=t,t=e.tagName):e={attributes:e},o=document.createElement(t),null!=e.editable&&(null==e.attributes&&(e.attributes={}),e.attributes.contenteditable=e.editable),e.attributes){l=e.attributes;for(a in l)g=l[a],o.setAttribute(a,g)}if(e.style){h=e.style;for(a in h)g=h[a],o.style[a]=g}if(e.data){p=e.data;for(a in p)g=p[a],o.dataset[a]=g}if(e.className)for(d=e.className.split(\" \"),r=0,u=d.length;u>r;r++)i=d[r],o.classList.add(i);if(e.textContent&&(o.textContent=e.textContent),e.childNodes)for(f=[].concat(e.childNodes),s=0,c=f.length;c>s;s++)n=f[s],o.appendChild(n);return o},getBlockTagNames:function(){var t,n;return null!=e.blockTagNames?e.blockTagNames:e.blockTagNames=function(){var i,o;i=e.config.blockAttributes,o=[];for(t in i)n=i[t].tagName,n&&o.push(n);return o}()},nodeIsBlockContainer:function(t){return e.nodeIsBlockStartComment(null!=t?t.firstChild:void 0)},nodeProbablyIsBlockContainer:function(t){var n,i;return n=e.tagName(t),s.call(e.getBlockTagNames(),n)>=0&&(i=e.tagName(t.firstChild),s.call(e.getBlockTagNames(),i)<0)},nodeIsBlockStart:function(t,n){var i;return i=(null!=n?n:{strict:!0}).strict,i?e.nodeIsBlockStartComment(t):e.nodeIsBlockStartComment(t)||!e.nodeIsBlockStartComment(t.firstChild)&&e.nodeProbablyIsBlockContainer(t)},nodeIsBlockStartComment:function(t){return e.nodeIsCommentNode(t)&&\"block\"===(null!=t?t.data:void 0)},nodeIsCommentNode:function(t){return(null!=t?t.nodeType:void 0)===Node.COMMENT_NODE},nodeIsCursorTarget:function(t,n){var i;return i=(null!=n?n:{}).name,t?e.nodeIsTextNode(t)?t.data===e.ZERO_WIDTH_SPACE?i?t.parentNode.dataset.trixCursorTarget===i:!0:void 0:e.nodeIsCursorTarget(t.firstChild):void 0},nodeIsAttachmentElement:function(t){return e.elementMatchesSelector(t,e.AttachmentView.attachmentSelector)},nodeIsEmptyTextNode:function(t){return e.nodeIsTextNode(t)&&\"\"===(null!=t?t.data:void 0)},nodeIsTextNode:function(t){return(null!=t?t.nodeType:void 0)===Node.TEXT_NODE}})}.call(this),function(){var t,n,i,o,r;t=e.copyObject,o=e.objectsAreEqual,e.extend({normalizeRange:i=function(t){var e;if(null!=t)return Array.isArray(t)||(t=[t,t]),[n(t[0]),n(null!=(e=t[1])?e:t[0])]},rangeIsCollapsed:function(t){var e,n,o;if(null!=t)return n=i(t),o=n[0],e=n[1],r(o,e)},rangesAreEqual:function(t,e){var n,o,s,a,u,c;if(null!=t&&null!=e)return s=i(t),o=s[0],n=s[1],a=i(e),c=a[0],u=a[1],r(o,c)&&r(n,u)}}),n=function(e){return\"number\"==typeof e?e:t(e)},r=function(t,e){return\"number\"==typeof t?t===e:o(t,e)}}.call(this),function(){var t,n,i,o,r,s,a;e.registerElement=function(t,e){var n,i;return null==e&&(e={}),t=t.toLowerCase(),e=a(e),i=s(e),(n=i.defaultCSS)&&(delete i.defaultCSS,o(n,t)),r(t,i)},o=function(t,e){var n;return n=i(e),n.textContent=t.replace(/%t/g,e)},i=function(e){var n,i;return n=document.createElement(\"style\"),n.setAttribute(\"type\",\"text/css\"),n.setAttribute(\"data-tag-name\",e.toLowerCase()),(i=t())&&n.setAttribute(\"nonce\",i),document.head.insertBefore(n,document.head.firstChild),n},t=function(){var t;return(t=n(\"trix-csp-nonce\")||n(\"csp-nonce\"))?t.getAttribute(\"content\"):void 0},n=function(t){return document.head.querySelector(\"meta[name=\"+t+\"]\")},s=function(t){var e,n,i;n={};for(e in t)i=t[e],n[e]=\"function\"==typeof i?{value:i}:i;return n},a=function(){var t;return t=function(t){var e,n,i,o,r;for(e={},r=[\"initialize\",\"connect\",\"disconnect\"],n=0,o=r.length;o>n;n++)i=r[n],e[i]=t[i],delete t[i];return e},window.customElements?function(e){var n,i,o,r,s;return s=t(e),o=s.initialize,n=s.connect,i=s.disconnect,o&&(r=n,n=function(){return this.initialized||(this.initialized=!0,o.call(this)),null!=r?r.call(this):void 0}),n&&(e.connectedCallback=n),i&&(e.disconnectedCallback=i),e}:function(e){var n,i,o,r;return r=t(e),o=r.initialize,n=r.connect,i=r.disconnect,o&&(e.createdCallback=o),n&&(e.attachedCallback=n),i&&(e.detachedCallback=i),e}}(),r=function(){return window.customElements?function(t,e){var n;return n=function(){return\"object\"==typeof Reflect?Reflect.construct(HTMLElement,[],n):HTMLElement.apply(this)},Object.setPrototypeOf(n.prototype,HTMLElement.prototype),Object.setPrototypeOf(n,HTMLElement),Object.defineProperties(n.prototype,e),window.customElements.define(t,n),n}:function(t,e){var n,i;return i=Object.create(HTMLElement.prototype,e),n=document.registerElement(t,{prototype:i}),Object.defineProperty(i,\"constructor\",{value:n}),n}}()}.call(this),function(){var t,n;e.extend({getDOMSelection:function(){var t;return t=window.getSelection(),t.rangeCount>0?t:void 0},getDOMRange:function(){var n,i;return(n=null!=(i=e.getDOMSelection())?i.getRangeAt(0):void 0)&&!t(n)?n:void 0},setDOMRange:function(t){var n;return n=window.getSelection(),n.removeAllRanges(),n.addRange(t),e.selectionChangeObserver.update()}}),t=function(t){return n(t.startContainer)||n(t.endContainer)},n=function(t){return!Object.getPrototypeOf(t)}}.call(this),function(){var t;t={\"application/x-trix-feature-detection\":\"test\"},e.extend({dataTransferIsPlainText:function(t){var e,n,i;return i=t.getData(\"text/plain\"),n=t.getData(\"text/html\"),i&&n?(e=(new DOMParser).parseFromString(n,\"text/html\").body,e.textContent===i?!e.querySelector(\"*\"):void 0):null!=i?i.length:void 0},dataTransferIsWritable:function(e){var n,i;if(null!=(null!=e?e.setData:void 0)){for(n in t)if(i=t[n],!function(){try{return e.setData(n,i),e.getData(n)===i}catch(t){}}())return;return!0}},keyEventIsKeyboardCommand:function(){return/Mac|^iP/.test(navigator.platform)?function(t){return t.metaKey}:function(t){return t.ctrlKey}}()})}.call(this),function(){e.extend({RTL_PATTERN:/[\\u05BE\\u05C0\\u05C3\\u05D0-\\u05EA\\u05F0-\\u05F4\\u061B\\u061F\\u0621-\\u063A\\u0640-\\u064A\\u066D\\u0671-\\u06B7\\u06BA-\\u06BE\\u06C0-\\u06CE\\u06D0-\\u06D5\\u06E5\\u06E6\\u200F\\u202B\\u202E\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE72\\uFE74\\uFE76-\\uFEFC]/,getDirection:function(){var t,n,i,o;return n=e.makeElement(\"input\",{dir:\"auto\",name:\"x\",dirName:\"x.dir\"}),t=e.makeElement(\"form\"),t.appendChild(n),i=function(){try{return new FormData(t).has(n.dirName)}catch(e){}}(),o=function(){try{return n.matches(\":dir(ltr),:dir(rtl)\")}catch(t){}}(),i?function(e){return n.value=e,new FormData(t).get(n.dirName)}:o?function(t){return n.value=t,n.matches(\":dir(rtl)\")?\"rtl\":\"ltr\"}:function(t){var n;return n=t.trim().charAt(0),e.RTL_PATTERN.test(n)?\"rtl\":\"ltr\"}}()})}.call(this),function(){}.call(this),function(){var t,n=function(t,e){function n(){this.constructor=t}for(var o in e)i.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},i={}.hasOwnProperty;t=e.arraysAreEqual,e.Hash=function(i){function o(t){null==t&&(t={}),this.values=s(t),o.__super__.constructor.apply(this,arguments)}var r,s,a,u,c;return n(o,i),o.fromCommonAttributesOfObjects=function(t){var e,n,i,o,s,a;if(null==t&&(t=[]),!t.length)return new this;for(e=r(t[0]),i=e.getKeys(),a=t.slice(1),n=0,o=a.length;o>n;n++)s=a[n],i=e.getKeysCommonToHash(r(s)),e=e.slice(i);return e},o.box=function(t){return r(t)},o.prototype.add=function(t,e){return this.merge(u(t,e))},o.prototype.remove=function(t){return new e.Hash(s(this.values,t))},o.prototype.get=function(t){return this.values[t]},o.prototype.has=function(t){return t in this.values},o.prototype.merge=function(t){return new e.Hash(a(this.values,c(t)))},o.prototype.slice=function(t){var n,i,o,r;for(r={},n=0,o=t.length;o>n;n++)i=t[n],this.has(i)&&(r[i]=this.values[i]);return new e.Hash(r)},o.prototype.getKeys=function(){return Object.keys(this.values)},o.prototype.getKeysCommonToHash=function(t){var e,n,i,o,s;for(t=r(t),o=this.getKeys(),s=[],e=0,i=o.length;i>e;e++)n=o[e],this.values[n]===t.values[n]&&s.push(n);return s},o.prototype.isEqualTo=function(e){return t(this.toArray(),r(e).toArray())},o.prototype.isEmpty=function(){return 0===this.getKeys().length},o.prototype.toArray=function(){var t,e,n;return(null!=this.array?this.array:this.array=function(){var i;e=[],i=this.values;for(t in i)n=i[t],e.push(t,n);return e}.call(this)).slice(0)},o.prototype.toObject=function(){return s(this.values)},o.prototype.toJSON=function(){return this.toObject()},o.prototype.contentsForInspection=function(){return{values:JSON.stringify(this.values)}},u=function(t,e){var n;return n={},n[t]=e,n},a=function(t,e){var n,i,o;i=s(t);for(n in e)o=e[n],i[n]=o;return i},s=function(t,e){var n,i,o,r,s;for(r={},s=Object.keys(t).sort(),n=0,o=s.length;o>n;n++)i=s[n],i!==e&&(r[i]=t[i]);return r},r=function(t){return t instanceof e.Hash?t:new e.Hash(t)},c=function(t){return t instanceof e.Hash?t.values:t\n},o}(e.Object)}.call(this),function(){e.ObjectGroup=function(){function t(t,e){var n,i;this.objects=null!=t?t:[],i=e.depth,n=e.asTree,n&&(this.depth=i,this.objects=this.constructor.groupObjects(this.objects,{asTree:n,depth:this.depth+1}))}return t.groupObjects=function(t,e){var n,i,o,r,s,a,u,c,l;for(null==t&&(t=[]),l=null!=e?e:{},o=l.depth,n=l.asTree,n&&null==o&&(o=0),c=[],s=0,a=t.length;a>s;s++){if(u=t[s],r){if((\"function\"==typeof u.canBeGrouped?u.canBeGrouped(o):void 0)&&(\"function\"==typeof(i=r[r.length-1]).canBeGroupedWith?i.canBeGroupedWith(u,o):void 0)){r.push(u);continue}c.push(new this(r,{depth:o,asTree:n})),r=null}(\"function\"==typeof u.canBeGrouped?u.canBeGrouped(o):void 0)?r=[u]:c.push(u)}return r&&c.push(new this(r,{depth:o,asTree:n})),c},t.prototype.getObjects=function(){return this.objects},t.prototype.getDepth=function(){return this.depth},t.prototype.getCacheKey=function(){var t,e,n,i,o;for(e=[\"objectGroup\"],o=this.getObjects(),t=0,n=o.length;n>t;t++)i=o[t],e.push(i.getCacheKey());return e.join(\"/\")},t}()}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.ObjectMap=function(e){function n(t){var e,n,i,o,r;for(null==t&&(t=[]),this.objects={},i=0,o=t.length;o>i;i++)r=t[i],n=JSON.stringify(r),null==(e=this.objects)[n]&&(e[n]=r)}return t(n,e),n.prototype.find=function(t){var e;return e=JSON.stringify(t),this.objects[e]},n}(e.BasicObject)}.call(this),function(){e.ElementStore=function(){function t(t){this.reset(t)}var e;return t.prototype.add=function(t){var n;return n=e(t),this.elements[n]=t},t.prototype.remove=function(t){var n,i;return n=e(t),(i=this.elements[n])?(delete this.elements[n],i):void 0},t.prototype.reset=function(t){var e,n,i;for(null==t&&(t=[]),this.elements={},n=0,i=t.length;i>n;n++)e=t[n],this.add(e);return t},e=function(t){return t.dataset.trixStoreKey},t}()}.call(this),function(){}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.Operation=function(e){function n(){return n.__super__.constructor.apply(this,arguments)}return t(n,e),n.prototype.isPerforming=function(){return this.performing===!0},n.prototype.hasPerformed=function(){return this.performed===!0},n.prototype.hasSucceeded=function(){return this.performed&&this.succeeded},n.prototype.hasFailed=function(){return this.performed&&!this.succeeded},n.prototype.getPromise=function(){return null!=this.promise?this.promise:this.promise=new Promise(function(t){return function(e,n){return t.performing=!0,t.perform(function(i,o){return t.succeeded=i,t.performing=!1,t.performed=!0,t.succeeded?e(o):n(o)})}}(this))},n.prototype.perform=function(t){return t(!1)},n.prototype.release=function(){var t;return null!=(t=this.promise)&&\"function\"==typeof t.cancel&&t.cancel(),this.promise=null,this.performing=null,this.performed=null,this.succeeded=null},n.proxyMethod(\"getPromise().then\"),n.proxyMethod(\"getPromise().catch\"),n}(e.BasicObject)}.call(this),function(){var t,n,i,o,r,s=function(t,e){function n(){this.constructor=t}for(var i in e)a.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},a={}.hasOwnProperty;e.UTF16String=function(t){function e(t,e){this.ucs2String=t,this.codepoints=e,this.length=this.codepoints.length,this.ucs2Length=this.ucs2String.length}return s(e,t),e.box=function(t){return null==t&&(t=\"\"),t instanceof this?t:this.fromUCS2String(null!=t?t.toString():void 0)},e.fromUCS2String=function(t){return new this(t,o(t))},e.fromCodepoints=function(t){return new this(r(t),t)},e.prototype.offsetToUCS2Offset=function(t){return r(this.codepoints.slice(0,Math.max(0,t))).length},e.prototype.offsetFromUCS2Offset=function(t){return o(this.ucs2String.slice(0,Math.max(0,t))).length},e.prototype.slice=function(){var t;return this.constructor.fromCodepoints((t=this.codepoints).slice.apply(t,arguments))},e.prototype.charAt=function(t){return this.slice(t,t+1)},e.prototype.isEqualTo=function(t){return this.constructor.box(t).ucs2String===this.ucs2String},e.prototype.toJSON=function(){return this.ucs2String},e.prototype.getCacheKey=function(){return this.ucs2String},e.prototype.toString=function(){return this.ucs2String},e}(e.BasicObject),t=1===(\"function\"==typeof Array.from?Array.from(\"\\ud83d\\udc7c\").length:void 0),n=null!=(\"function\"==typeof\" \".codePointAt?\" \".codePointAt(0):void 0),i=\" \\ud83d\\udc7c\"===(\"function\"==typeof String.fromCodePoint?String.fromCodePoint(32,128124):void 0),o=t&&n?function(t){return Array.from(t).map(function(t){return t.codePointAt(0)})}:function(t){var e,n,i,o,r;for(o=[],e=0,i=t.length;i>e;)r=t.charCodeAt(e++),r>=55296&&56319>=r&&i>e&&(n=t.charCodeAt(e++),56320===(64512&n)?r=((1023&r)<<10)+(1023&n)+65536:e--),o.push(r);return o},r=i?function(t){return String.fromCodePoint.apply(String,t)}:function(t){var e,n,i;return e=function(){var e,o,r;for(r=[],e=0,o=t.length;o>e;e++)i=t[e],n=\"\",i>65535&&(i-=65536,n+=String.fromCharCode(i>>>10&1023|55296),i=56320|1023&i),r.push(n+String.fromCharCode(i));return r}(),e.join(\"\")}}.call(this),function(){}.call(this),function(){}.call(this),function(){e.config.lang={attachFiles:\"Attach Files\",bold:\"Bold\",bullets:\"Bullets\",\"byte\":\"Byte\",bytes:\"Bytes\",captionPlaceholder:\"Add a caption\\u2026\",code:\"Code\",heading1:\"Heading\",indent:\"Increase Level\",italic:\"Italic\",link:\"Link\",numbers:\"Numbers\",outdent:\"Decrease Level\",quote:\"Quote\",redo:\"Redo\",remove:\"Remove\",strike:\"Strikethrough\",undo:\"Undo\",unlink:\"Unlink\",url:\"URL\",urlPlaceholder:\"Enter a URL\\u2026\",GB:\"GB\",KB:\"KB\",MB:\"MB\",PB:\"PB\",TB:\"TB\"}}.call(this),function(){e.config.css={attachment:\"attachment\",attachmentCaption:\"attachment__caption\",attachmentCaptionEditor:\"attachment__caption-editor\",attachmentMetadata:\"attachment__metadata\",attachmentMetadataContainer:\"attachment__metadata-container\",attachmentName:\"attachment__name\",attachmentProgress:\"attachment__progress\",attachmentSize:\"attachment__size\",attachmentToolbar:\"attachment__toolbar\",attachmentGallery:\"attachment-gallery\"}}.call(this),function(){var t;e.config.blockAttributes=t={\"default\":{tagName:\"div\",parse:!1},quote:{tagName:\"blockquote\",nestable:!0},heading1:{tagName:\"h1\",terminal:!0,breakOnReturn:!0,group:!1},code:{tagName:\"pre\",terminal:!0,text:{plaintext:!0}},bulletList:{tagName:\"ul\",parse:!1},bullet:{tagName:\"li\",listAttribute:\"bulletList\",group:!1,nestable:!0,test:function(n){return e.tagName(n.parentNode)===t[this.listAttribute].tagName}},numberList:{tagName:\"ol\",parse:!1},number:{tagName:\"li\",listAttribute:\"numberList\",group:!1,nestable:!0,test:function(n){return e.tagName(n.parentNode)===t[this.listAttribute].tagName}},attachmentGallery:{tagName:\"div\",exclusive:!0,terminal:!0,parse:!1,group:!1}}}.call(this),function(){var t,n;t=e.config.lang,n=[t.bytes,t.KB,t.MB,t.GB,t.TB,t.PB],e.config.fileSize={prefix:\"IEC\",precision:2,formatter:function(e){var i,o,r,s,a;switch(e){case 0:return\"0 \"+t.bytes;case 1:return\"1 \"+t.byte;default:return i=function(){switch(this.prefix){case\"SI\":return 1e3;case\"IEC\":return 1024}}.call(this),o=Math.floor(Math.log(e)/Math.log(i)),r=e/Math.pow(i,o),s=r.toFixed(this.precision),a=s.replace(/0*$/,\"\").replace(/\\.$/,\"\"),a+\" \"+n[o]}}}}.call(this),function(){e.config.textAttributes={bold:{tagName:\"strong\",inheritable:!0,parser:function(t){var e;return e=window.getComputedStyle(t),\"bold\"===e.fontWeight||e.fontWeight>=600}},italic:{tagName:\"em\",inheritable:!0,parser:function(t){var e;return e=window.getComputedStyle(t),\"italic\"===e.fontStyle}},href:{groupTagName:\"a\",parser:function(t){var n,i,o;return n=e.AttachmentView.attachmentSelector,o=\"a:not(\"+n+\")\",(i=e.findClosestElementFromNode(t,{matchingSelector:o}))?i.getAttribute(\"href\"):void 0}},strike:{tagName:\"del\",inheritable:!0},frozen:{style:{backgroundColor:\"highlight\"}}}}.call(this),function(){var t,n,i,o,r;r=\"[data-trix-serialize=false]\",o=[\"contenteditable\",\"data-trix-id\",\"data-trix-store-key\",\"data-trix-mutable\",\"data-trix-placeholder\",\"tabindex\"],n=\"data-trix-serialized-attributes\",i=\"[\"+n+\"]\",t=new RegExp(\"<!--block-->\",\"g\"),e.extend({serializers:{\"application/json\":function(t){var n;if(t instanceof e.Document)n=t;else{if(!(t instanceof HTMLElement))throw new Error(\"unserializable object\");n=e.Document.fromHTML(t.innerHTML)}return n.toSerializableDocument().toJSONString()},\"text/html\":function(s){var a,u,c,l,h,p,d,f,g,m,v,y,b,A,C,x,w;if(s instanceof e.Document)l=e.DocumentView.render(s);else{if(!(s instanceof HTMLElement))throw new Error(\"unserializable object\");l=s.cloneNode(!0)}for(A=l.querySelectorAll(r),h=0,g=A.length;g>h;h++)c=A[h],e.removeNode(c);for(p=0,m=o.length;m>p;p++)for(a=o[p],C=l.querySelectorAll(\"[\"+a+\"]\"),d=0,v=C.length;v>d;d++)c=C[d],c.removeAttribute(a);for(x=l.querySelectorAll(i),f=0,y=x.length;y>f;f++){c=x[f];try{u=JSON.parse(c.getAttribute(n)),c.removeAttribute(n);for(b in u)w=u[b],c.setAttribute(b,w)}catch(E){}}return l.innerHTML.replace(t,\"\")}},deserializers:{\"application/json\":function(t){return e.Document.fromJSONString(t)},\"text/html\":function(t){return e.Document.fromHTML(t)}},serializeToContentType:function(t,n){var i;if(i=e.serializers[n])return i(t);throw new Error(\"unknown content type: \"+n)},deserializeFromContentType:function(t,n){var i;if(i=e.deserializers[n])return i(t);throw new Error(\"unknown content type: \"+n)}})}.call(this),function(){var t;t=e.config.lang,e.config.toolbar={getDefaultHTML:function(){return'<div class=\"trix-button-row\">\\n  <span class=\"trix-button-group trix-button-group--text-tools\" data-trix-button-group=\"text-tools\">\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-bold\" data-trix-attribute=\"bold\" data-trix-key=\"b\" title=\"'+t.bold+'\" tabindex=\"-1\">'+t.bold+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-italic\" data-trix-attribute=\"italic\" data-trix-key=\"i\" title=\"'+t.italic+'\" tabindex=\"-1\">'+t.italic+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-strike\" data-trix-attribute=\"strike\" title=\"'+t.strike+'\" tabindex=\"-1\">'+t.strike+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-link\" data-trix-attribute=\"href\" data-trix-action=\"link\" data-trix-key=\"k\" title=\"'+t.link+'\" tabindex=\"-1\">'+t.link+'</button>\\n  </span>\\n\\n  <span class=\"trix-button-group trix-button-group--block-tools\" data-trix-button-group=\"block-tools\">\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-heading-1\" data-trix-attribute=\"heading1\" title=\"'+t.heading1+'\" tabindex=\"-1\">'+t.heading1+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-quote\" data-trix-attribute=\"quote\" title=\"'+t.quote+'\" tabindex=\"-1\">'+t.quote+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-code\" data-trix-attribute=\"code\" title=\"'+t.code+'\" tabindex=\"-1\">'+t.code+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-bullet-list\" data-trix-attribute=\"bullet\" title=\"'+t.bullets+'\" tabindex=\"-1\">'+t.bullets+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-number-list\" data-trix-attribute=\"number\" title=\"'+t.numbers+'\" tabindex=\"-1\">'+t.numbers+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-decrease-nesting-level\" data-trix-action=\"decreaseNestingLevel\" title=\"'+t.outdent+'\" tabindex=\"-1\">'+t.outdent+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-increase-nesting-level\" data-trix-action=\"increaseNestingLevel\" title=\"'+t.indent+'\" tabindex=\"-1\">'+t.indent+'</button>\\n  </span>\\n\\n  <span class=\"trix-button-group trix-button-group--file-tools\" data-trix-button-group=\"file-tools\">\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-attach\" data-trix-action=\"attachFiles\" title=\"'+t.attachFiles+'\" tabindex=\"-1\">'+t.attachFiles+'</button>\\n  </span>\\n\\n  <span class=\"trix-button-group-spacer\"></span>\\n\\n  <span class=\"trix-button-group trix-button-group--history-tools\" data-trix-button-group=\"history-tools\">\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-undo\" data-trix-action=\"undo\" data-trix-key=\"z\" title=\"'+t.undo+'\" tabindex=\"-1\">'+t.undo+'</button>\\n    <button type=\"button\" class=\"trix-button trix-button--icon trix-button--icon-redo\" data-trix-action=\"redo\" data-trix-key=\"shift+z\" title=\"'+t.redo+'\" tabindex=\"-1\">'+t.redo+'</button>\\n  </span>\\n</div>\\n\\n<div class=\"trix-dialogs\" data-trix-dialogs>\\n  <div class=\"trix-dialog trix-dialog--link\" data-trix-dialog=\"href\" data-trix-dialog-attribute=\"href\">\\n    <div class=\"trix-dialog__link-fields\">\\n      <input type=\"url\" name=\"href\" class=\"trix-input trix-input--dialog\" placeholder=\"'+t.urlPlaceholder+'\" aria-label=\"'+t.url+'\" required data-trix-input>\\n      <div class=\"trix-button-group\">\\n        <input type=\"button\" class=\"trix-button trix-button--dialog\" value=\"'+t.link+'\" data-trix-method=\"setAttribute\">\\n        <input type=\"button\" class=\"trix-button trix-button--dialog\" value=\"'+t.unlink+'\" data-trix-method=\"removeAttribute\">\\n      </div>\\n    </div>\\n  </div>\\n</div>'}}}.call(this),function(){e.config.undoInterval=5e3}.call(this),function(){e.config.attachments={preview:{presentation:\"gallery\",caption:{name:!0,size:!0}},file:{caption:{size:!0}}}}.call(this),function(){e.config.keyNames={8:\"backspace\",9:\"tab\",13:\"return\",27:\"escape\",37:\"left\",39:\"right\",46:\"delete\",68:\"d\",72:\"h\",79:\"o\"}}.call(this),function(){e.config.input={level2Enabled:!0,getLevel:function(){return this.level2Enabled&&e.browser.supportsInputEvents?2:0},pickFiles:function(t){var n;return n=e.makeElement(\"input\",{type:\"file\",multiple:!0,hidden:!0,id:this.fileInputId}),n.addEventListener(\"change\",function(){return t(n.files),e.removeNode(n)}),e.removeNode(document.getElementById(this.fileInputId)),document.body.appendChild(n),n.click()},fileInputId:\"trix-file-input-\"+Date.now().toString(16)}}.call(this),function(){}.call(this),function(){e.registerElement(\"trix-toolbar\",{defaultCSS:\"%t {\\n  display: block;\\n}\\n\\n%t {\\n  white-space: nowrap;\\n}\\n\\n%t [data-trix-dialog] {\\n  display: none;\\n}\\n\\n%t [data-trix-dialog][data-trix-active] {\\n  display: block;\\n}\\n\\n%t [data-trix-dialog] [data-trix-validate]:invalid {\\n  background-color: #ffdddd;\\n}\",initialize:function(){return\"\"===this.innerHTML?this.innerHTML=e.config.toolbar.getDefaultHTML():void 0}})}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty,i=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1};e.ObjectView=function(n){function o(t,e){this.object=t,this.options=null!=e?e:{},this.childViews=[],this.rootView=this}return t(o,n),o.prototype.getNodes=function(){var t,e,n,i,o;for(null==this.nodes&&(this.nodes=this.createNodes()),i=this.nodes,o=[],t=0,e=i.length;e>t;t++)n=i[t],o.push(n.cloneNode(!0));return o},o.prototype.invalidate=function(){var t;return this.nodes=null,this.childViews=[],null!=(t=this.parentView)?t.invalidate():void 0},o.prototype.invalidateViewForObject=function(t){var e;return null!=(e=this.findViewForObject(t))?e.invalidate():void 0},o.prototype.findOrCreateCachedChildView=function(t,e){var n;return(n=this.getCachedViewForObject(e))?this.recordChildView(n):(n=this.createChildView.apply(this,arguments),this.cacheViewForObject(n,e)),n},o.prototype.createChildView=function(t,n,i){var o;return null==i&&(i={}),n instanceof e.ObjectGroup&&(i.viewClass=t,t=e.ObjectGroupView),o=new t(n,i),this.recordChildView(o)},o.prototype.recordChildView=function(t){return t.parentView=this,t.rootView=this.rootView,this.childViews.push(t),t},o.prototype.getAllChildViews=function(){var t,e,n,i,o;for(o=[],i=this.childViews,e=0,n=i.length;n>e;e++)t=i[e],o.push(t),o=o.concat(t.getAllChildViews());return o},o.prototype.findElement=function(){return this.findElementForObject(this.object)},o.prototype.findElementForObject=function(t){var e;return(e=null!=t?t.id:void 0)?this.rootView.element.querySelector(\"[data-trix-id='\"+e+\"']\"):void 0},o.prototype.findViewForObject=function(t){var e,n,i,o;for(i=this.getAllChildViews(),e=0,n=i.length;n>e;e++)if(o=i[e],o.object===t)return o},o.prototype.getViewCache=function(){return this.rootView!==this?this.rootView.getViewCache():this.isViewCachingEnabled()?null!=this.viewCache?this.viewCache:this.viewCache={}:void 0},o.prototype.isViewCachingEnabled=function(){return this.shouldCacheViews!==!1},o.prototype.enableViewCaching=function(){return this.shouldCacheViews=!0},o.prototype.disableViewCaching=function(){return this.shouldCacheViews=!1},o.prototype.getCachedViewForObject=function(t){var e;return null!=(e=this.getViewCache())?e[t.getCacheKey()]:void 0},o.prototype.cacheViewForObject=function(t,e){var n;return null!=(n=this.getViewCache())?n[e.getCacheKey()]=t:void 0},o.prototype.garbageCollectCachedViews=function(){var t,e,n,o,r,s;if(t=this.getViewCache()){s=this.getAllChildViews().concat(this),n=function(){var t,e,n;for(n=[],t=0,e=s.length;e>t;t++)r=s[t],n.push(r.object.getCacheKey());return n}(),o=[];for(e in t)i.call(n,e)<0&&o.push(delete t[e]);return o}},o}(e.BasicObject)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.ObjectGroupView=function(e){function n(){n.__super__.constructor.apply(this,arguments),this.objectGroup=this.object,this.viewClass=this.options.viewClass,delete this.options.viewClass}return t(n,e),n.prototype.getChildViews=function(){var t,e,n,i;if(!this.childViews.length)for(i=this.objectGroup.getObjects(),t=0,e=i.length;e>t;t++)n=i[t],this.findOrCreateCachedChildView(this.viewClass,n,this.options);return this.childViews},n.prototype.createNodes=function(){var t,e,n,i,o,r,s,a,u;for(t=this.createContainerElement(),s=this.getChildViews(),e=0,i=s.length;i>e;e++)for(u=s[e],a=u.getNodes(),n=0,o=a.length;o>n;n++)r=a[n],t.appendChild(r);return[t]},n.prototype.createContainerElement=function(t){return null==t&&(t=this.objectGroup.getDepth()),this.getChildViews()[0].createContainerElement(t)},n}(e.ObjectView)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.Controller=function(e){function n(){return n.__super__.constructor.apply(this,arguments)}return t(n,e),n}(e.BasicObject)}.call(this),function(){var t,n,i,o,r,s,a=function(t,e){return function(){return t.apply(e,arguments)}},u=function(t,e){function n(){this.constructor=t}for(var i in e)c.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},c={}.hasOwnProperty,l=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1};t=e.findClosestElementFromNode,i=e.nodeIsEmptyTextNode,n=e.nodeIsBlockStartComment,o=e.normalizeSpaces,r=e.summarizeStringChange,s=e.tagName,e.MutationObserver=function(e){function c(t){this.element=t,this.didMutate=a(this.didMutate,this),this.observer=new window.MutationObserver(this.didMutate),this.start()}var h,p,d,f;return u(c,e),p=\"data-trix-mutable\",d=\"[\"+p+\"]\",f={attributes:!0,childList:!0,characterData:!0,characterDataOldValue:!0,subtree:!0},c.prototype.start=function(){return this.reset(),this.observer.observe(this.element,f)},c.prototype.stop=function(){return this.observer.disconnect()},c.prototype.didMutate=function(t){var e,n;return(e=this.mutations).push.apply(e,this.findSignificantMutations(t)),this.mutations.length?(null!=(n=this.delegate)&&\"function\"==typeof n.elementDidMutate&&n.elementDidMutate(this.getMutationSummary()),this.reset()):void 0},c.prototype.reset=function(){return this.mutations=[]},c.prototype.findSignificantMutations=function(t){var e,n,i,o;for(o=[],e=0,n=t.length;n>e;e++)i=t[e],this.mutationIsSignificant(i)&&o.push(i);return o},c.prototype.mutationIsSignificant=function(t){var e,n,i,o;if(this.nodeIsMutable(t.target))return!1;for(o=this.nodesModifiedByMutation(t),e=0,n=o.length;n>e;e++)if(i=o[e],this.nodeIsSignificant(i))return!0;return!1},c.prototype.nodeIsSignificant=function(t){return t!==this.element&&!this.nodeIsMutable(t)&&!i(t)},c.prototype.nodeIsMutable=function(e){return t(e,{matchingSelector:d})},c.prototype.nodesModifiedByMutation=function(t){var e;switch(e=[],t.type){case\"attributes\":t.attributeName!==p&&e.push(t.target);break;case\"characterData\":e.push(t.target.parentNode),e.push(t.target);break;case\"childList\":e.push.apply(e,t.addedNodes),e.push.apply(e,t.removedNodes)}return e},c.prototype.getMutationSummary=function(){return this.getTextMutationSummary()},c.prototype.getTextMutationSummary=function(){var t,e,n,i,o,r,s,a,u,c,h;for(a=this.getTextChangesFromCharacterData(),n=a.additions,o=a.deletions,h=this.getTextChangesFromChildList(),u=h.additions,r=0,s=u.length;s>r;r++)e=u[r],l.call(n,e)<0&&n.push(e);return o.push.apply(o,h.deletions),c={},(t=n.join(\"\"))&&(c.textAdded=t),(i=o.join(\"\"))&&(c.textDeleted=i),c},c.prototype.getMutationsByType=function(t){var e,n,i,o,r;for(o=this.mutations,r=[],e=0,n=o.length;n>e;e++)i=o[e],i.type===t&&r.push(i);return r},c.prototype.getTextChangesFromChildList=function(){var t,e,i,r,s,a,u,c,l,p,d;for(t=[],u=[],a=this.getMutationsByType(\"childList\"),e=0,r=a.length;r>e;e++)s=a[e],t.push.apply(t,s.addedNodes),u.push.apply(u,s.removedNodes);return c=0===t.length&&1===u.length&&n(u[0]),c?(p=[],d=[\"\\n\"]):(p=h(t),d=h(u)),{additions:function(){var t,e,n;for(n=[],i=t=0,e=p.length;e>t;i=++t)l=p[i],l!==d[i]&&n.push(o(l));return n}(),deletions:function(){var t,e,n;for(n=[],i=t=0,e=d.length;e>t;i=++t)l=d[i],l!==p[i]&&n.push(o(l));return n}()}},c.prototype.getTextChangesFromCharacterData=function(){var t,e,n,i,s,a,u,c;return e=this.getMutationsByType(\"characterData\"),e.length&&(c=e[0],n=e[e.length-1],s=o(c.oldValue),i=o(n.target.data),a=r(s,i),t=a.added,u=a.removed),{additions:t?[t]:[],deletions:u?[u]:[]}},h=function(t){var e,n,i,o;for(null==t&&(t=[]),o=[],e=0,n=t.length;n>e;e++)switch(i=t[e],i.nodeType){case Node.TEXT_NODE:o.push(i.data);break;case Node.ELEMENT_NODE:\"br\"===s(i)?o.push(\"\\n\"):o.push.apply(o,h(i.childNodes))}return o},c}(e.BasicObject)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.FileVerificationOperation=function(e){function n(t){this.file=t}return t(n,e),n.prototype.perform=function(t){var e;return e=new FileReader,e.onerror=function(){return t(!1)},e.onload=function(n){return function(){e.onerror=null;try{e.abort()}catch(i){}return t(!0,n.file)}}(this),e.readAsArrayBuffer(this.file)},n}(e.Operation)}.call(this),function(){var t,n,i=function(t,e){function n(){this.constructor=t}for(var i in e)o.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},o={}.hasOwnProperty;t=e.handleEvent,n=e.innerElementIsActive,e.InputController=function(o){function r(n){var i;this.element=n,this.mutationObserver=new e.MutationObserver(this.element),this.mutationObserver.delegate=this;for(i in this.events)t(i,{onElement:this.element,withCallback:this.handlerFor(i)})}return i(r,o),r.prototype.events={},r.prototype.elementDidMutate=function(){},r.prototype.editorWillSyncDocumentView=function(){return this.mutationObserver.stop()},r.prototype.editorDidSyncDocumentView=function(){return this.mutationObserver.start()},r.prototype.requestRender=function(){var t;return null!=(t=this.delegate)&&\"function\"==typeof t.inputControllerDidRequestRender?t.inputControllerDidRequestRender():void 0},r.prototype.requestReparse=function(){var t;return null!=(t=this.delegate)&&\"function\"==typeof t.inputControllerDidRequestReparse&&t.inputControllerDidRequestReparse(),this.requestRender()},r.prototype.attachFiles=function(t){var n,i;return i=function(){var i,o,r;for(r=[],i=0,o=t.length;o>i;i++)n=t[i],r.push(new e.FileVerificationOperation(n));return r}(),Promise.all(i).then(function(t){return function(e){return t.handleInput(function(){var t,n;return null!=(t=this.delegate)&&t.inputControllerWillAttachFiles(),null!=(n=this.responder)&&n.insertFiles(e),this.requestRender()})}}(this))},r.prototype.handlerFor=function(t){return function(e){return function(i){return i.defaultPrevented?void 0:e.handleInput(function(){return n(this.element)?void 0:(this.eventName=t,this.events[t].call(this,i))})}}(this)},r.prototype.handleInput=function(t){var e,n;try{return null!=(e=this.delegate)&&e.inputControllerWillHandleInput(),t.call(this)}finally{null!=(n=this.delegate)&&n.inputControllerDidHandleInput()}},r.prototype.createLinkHTML=function(t,e){var n;return n=document.createElement(\"a\"),n.href=t,n.textContent=null!=e?e:t,n.outerHTML},r}(e.BasicObject)}.call(this),function(){var t,n,i,o,r,s,a,u,c,l,h,p,d,f=function(t,e){function n(){this.constructor=t}for(var i in e)g.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},g={}.hasOwnProperty,m=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1};c=e.makeElement,l=e.objectsAreEqual,d=e.tagName,n=e.browser,a=e.keyEventIsKeyboardCommand,o=e.dataTransferIsWritable,i=e.dataTransferIsPlainText,u=e.config.keyNames,e.Level0InputController=function(n){function s(){s.__super__.constructor.apply(this,arguments),this.resetInputSummary()}var d;return f(s,n),d=0,s.prototype.setInputSummary=function(t){var e,n;null==t&&(t={}),this.inputSummary.eventName=this.eventName;for(e in t)n=t[e],this.inputSummary[e]=n;return this.inputSummary},s.prototype.resetInputSummary=function(){return this.inputSummary={}},s.prototype.reset=function(){return this.resetInputSummary(),e.selectionChangeObserver.reset()},s.prototype.elementDidMutate=function(t){var e;return this.isComposing()?null!=(e=this.delegate)&&\"function\"==typeof e.inputControllerDidAllowUnhandledInput?e.inputControllerDidAllowUnhandledInput():void 0:this.handleInput(function(){return this.mutationIsSignificant(t)&&(this.mutationIsExpected(t)?this.requestRender():this.requestReparse()),this.reset()})},s.prototype.mutationIsExpected=function(t){var e,n,i,o,r,s,a,u,c,l;return a=t.textAdded,u=t.textDeleted,this.inputSummary.preferDocument?!0:(e=null!=a?a===this.inputSummary.textAdded:!this.inputSummary.textAdded,n=null!=u?this.inputSummary.didDelete:!this.inputSummary.didDelete,c=(\"\\n\"===a||\" \\n\"===a)&&!e,l=\"\\n\"===u&&!n,s=c&&!l||l&&!c,s&&(o=this.getSelectedRange())&&(i=c?a.replace(/\\n$/,\"\").length||-1:(null!=a?a.length:void 0)||1,null!=(r=this.responder)?r.positionIsBlockBreak(o[1]+i):void 0)?!0:e&&n)},s.prototype.mutationIsSignificant=function(t){var e,n,i;return i=Object.keys(t).length>0,e=\"\"===(null!=(n=this.compositionInput)?n.getEndData():void 0),i||!e},s.prototype.events={keydown:function(t){var n,i,o,r,s,c,l,h,p;if(this.isComposing()||this.resetInputSummary(),this.inputSummary.didInput=!0,r=u[t.keyCode]){for(i=this.keys,h=[\"ctrl\",\"alt\",\"shift\",\"meta\"],o=0,c=h.length;c>o;o++)l=h[o],t[l+\"Key\"]&&(\"ctrl\"===l&&(l=\"control\"),i=null!=i?i[l]:void 0);null!=(null!=i?i[r]:void 0)&&(this.setInputSummary({keyName:r}),e.selectionChangeObserver.reset(),i[r].call(this,t))}return a(t)&&(n=String.fromCharCode(t.keyCode).toLowerCase())&&(s=function(){var e,n,i,o;for(i=[\"alt\",\"shift\"],o=[],e=0,n=i.length;n>e;e++)l=i[e],t[l+\"Key\"]&&o.push(l);return o}(),s.push(n),null!=(p=this.delegate)?p.inputControllerDidReceiveKeyboardCommand(s):void 0)?t.preventDefault():void 0},keypress:function(t){var e,n,i;if(null==this.inputSummary.eventName&&!t.metaKey&&(!t.ctrlKey||t.altKey))return(i=p(t))?(null!=(e=this.delegate)&&e.inputControllerWillPerformTyping(),null!=(n=this.responder)&&n.insertString(i),this.setInputSummary({textAdded:i,didDelete:this.selectionIsExpanded()})):void 0},textInput:function(t){var e,n,i,o;return e=t.data,o=this.inputSummary.textAdded,o&&o!==e&&o.toUpperCase()===e?(n=this.getSelectedRange(),this.setSelectedRange([n[0],n[1]+o.length]),null!=(i=this.responder)&&i.insertString(e),this.setInputSummary({textAdded:e}),this.setSelectedRange(n)):void 0},dragenter:function(t){return t.preventDefault()},dragstart:function(t){var e,n;return n=t.target,this.serializeSelectionToDataTransfer(t.dataTransfer),this.draggedRange=this.getSelectedRange(),null!=(e=this.delegate)&&\"function\"==typeof e.inputControllerDidStartDrag?e.inputControllerDidStartDrag():void 0},dragover:function(t){var e,n;return!this.draggedRange&&!this.canAcceptDataTransfer(t.dataTransfer)||(t.preventDefault(),e={x:t.clientX,y:t.clientY},l(e,this.draggingPoint))?void 0:(this.draggingPoint=e,null!=(n=this.delegate)&&\"function\"==typeof n.inputControllerDidReceiveDragOverPoint?n.inputControllerDidReceiveDragOverPoint(this.draggingPoint):void 0)},dragend:function(){var t;return null!=(t=this.delegate)&&\"function\"==typeof t.inputControllerDidCancelDrag&&t.inputControllerDidCancelDrag(),this.draggedRange=null,this.draggingPoint=null},drop:function(t){var n,i,o,r,s,a,u,c,l;return t.preventDefault(),o=null!=(s=t.dataTransfer)?s.files:void 0,r={x:t.clientX,y:t.clientY},null!=(a=this.responder)&&a.setLocationRangeFromPointRange(r),(null!=o?o.length:void 0)?this.attachFiles(o):this.draggedRange?(null!=(u=this.delegate)&&u.inputControllerWillMoveText(),null!=(c=this.responder)&&c.moveTextFromRange(this.draggedRange),this.draggedRange=null,this.requestRender()):(i=t.dataTransfer.getData(\"application/x-trix-document\"))&&(n=e.Document.fromJSONString(i),null!=(l=this.responder)&&l.insertDocument(n),this.requestRender()),this.draggedRange=null,this.draggingPoint=null},cut:function(t){var e,n;return(null!=(e=this.responder)?e.selectionIsExpanded():void 0)&&(this.serializeSelectionToDataTransfer(t.clipboardData)&&t.preventDefault(),null!=(n=this.delegate)&&n.inputControllerWillCutText(),this.deleteInDirection(\"backward\"),t.defaultPrevented)?this.requestRender():void 0},copy:function(t){var e;return(null!=(e=this.responder)?e.selectionIsExpanded():void 0)&&this.serializeSelectionToDataTransfer(t.clipboardData)?t.preventDefault():void 0},paste:function(t){var n,o,s,a,u,c,l,p,f,g,v,y,b,A,C,x,w,E,S,R,k,D,L;return n=null!=(p=t.clipboardData)?p:t.testClipboardData,l={clipboard:n},null==n||h(t)?void this.getPastedHTMLUsingHiddenElement(function(t){return function(e){var n,i,o;return l.type=\"text/html\",l.html=e,null!=(n=t.delegate)&&n.inputControllerWillPaste(l),null!=(i=t.responder)&&i.insertHTML(l.html),t.requestRender(),null!=(o=t.delegate)?o.inputControllerDidPaste(l):void 0}}(this)):((a=n.getData(\"URL\"))?(l.type=\"text/html\",L=(c=n.getData(\"public.url-name\"))?e.squishBreakableWhitespace(c).trim():a,l.html=this.createLinkHTML(a,L),null!=(f=this.delegate)&&f.inputControllerWillPaste(l),this.setInputSummary({textAdded:L,didDelete:this.selectionIsExpanded()}),null!=(C=this.responder)&&C.insertHTML(l.html),this.requestRender(),null!=(x=this.delegate)&&x.inputControllerDidPaste(l)):i(n)?(l.type=\"text/plain\",l.string=n.getData(\"text/plain\"),null!=(w=this.delegate)&&w.inputControllerWillPaste(l),this.setInputSummary({textAdded:l.string,didDelete:this.selectionIsExpanded()}),null!=(E=this.responder)&&E.insertString(l.string),this.requestRender(),null!=(S=this.delegate)&&S.inputControllerDidPaste(l)):(u=n.getData(\"text/html\"))?(l.type=\"text/html\",l.html=u,null!=(R=this.delegate)&&R.inputControllerWillPaste(l),null!=(k=this.responder)&&k.insertHTML(l.html),this.requestRender(),null!=(D=this.delegate)&&D.inputControllerDidPaste(l)):m.call(n.types,\"Files\")>=0&&(s=null!=(g=n.items)&&null!=(v=g[0])&&\"function\"==typeof v.getAsFile?v.getAsFile():void 0)&&(!s.name&&(o=r(s))&&(s.name=\"pasted-file-\"+ ++d+\".\"+o),l.type=\"File\",l.file=s,null!=(y=this.delegate)&&y.inputControllerWillAttachFiles(),null!=(b=this.responder)&&b.insertFile(l.file),this.requestRender(),null!=(A=this.delegate)&&A.inputControllerDidPaste(l)),t.preventDefault())},compositionstart:function(t){return this.getCompositionInput().start(t.data)},compositionupdate:function(t){return this.getCompositionInput().update(t.data)},compositionend:function(t){return this.getCompositionInput().end(t.data)},beforeinput:function(){return this.inputSummary.didInput=!0\n},input:function(t){return this.inputSummary.didInput=!0,t.stopPropagation()}},s.prototype.keys={backspace:function(t){var e;return null!=(e=this.delegate)&&e.inputControllerWillPerformTyping(),this.deleteInDirection(\"backward\",t)},\"delete\":function(t){var e;return null!=(e=this.delegate)&&e.inputControllerWillPerformTyping(),this.deleteInDirection(\"forward\",t)},\"return\":function(){var t,e;return this.setInputSummary({preferDocument:!0}),null!=(t=this.delegate)&&t.inputControllerWillPerformTyping(),null!=(e=this.responder)?e.insertLineBreak():void 0},tab:function(t){var e,n;return(null!=(e=this.responder)?e.canIncreaseNestingLevel():void 0)?(null!=(n=this.responder)&&n.increaseNestingLevel(),this.requestRender(),t.preventDefault()):void 0},left:function(t){var e;return this.selectionIsInCursorTarget()?(t.preventDefault(),null!=(e=this.responder)?e.moveCursorInDirection(\"backward\"):void 0):void 0},right:function(t){var e;return this.selectionIsInCursorTarget()?(t.preventDefault(),null!=(e=this.responder)?e.moveCursorInDirection(\"forward\"):void 0):void 0},control:{d:function(t){var e;return null!=(e=this.delegate)&&e.inputControllerWillPerformTyping(),this.deleteInDirection(\"forward\",t)},h:function(t){var e;return null!=(e=this.delegate)&&e.inputControllerWillPerformTyping(),this.deleteInDirection(\"backward\",t)},o:function(t){var e,n;return t.preventDefault(),null!=(e=this.delegate)&&e.inputControllerWillPerformTyping(),null!=(n=this.responder)&&n.insertString(\"\\n\",{updatePosition:!1}),this.requestRender()}},shift:{\"return\":function(t){var e,n;return null!=(e=this.delegate)&&e.inputControllerWillPerformTyping(),null!=(n=this.responder)&&n.insertString(\"\\n\"),this.requestRender(),t.preventDefault()},tab:function(t){var e,n;return(null!=(e=this.responder)?e.canDecreaseNestingLevel():void 0)?(null!=(n=this.responder)&&n.decreaseNestingLevel(),this.requestRender(),t.preventDefault()):void 0},left:function(t){return this.selectionIsInCursorTarget()?(t.preventDefault(),this.expandSelectionInDirection(\"backward\")):void 0},right:function(t){return this.selectionIsInCursorTarget()?(t.preventDefault(),this.expandSelectionInDirection(\"forward\")):void 0}},alt:{backspace:function(){var t;return this.setInputSummary({preferDocument:!1}),null!=(t=this.delegate)?t.inputControllerWillPerformTyping():void 0}},meta:{backspace:function(){var t;return this.setInputSummary({preferDocument:!1}),null!=(t=this.delegate)?t.inputControllerWillPerformTyping():void 0}}},s.prototype.getCompositionInput=function(){return this.isComposing()?this.compositionInput:this.compositionInput=new t(this)},s.prototype.isComposing=function(){return null!=this.compositionInput&&!this.compositionInput.isEnded()},s.prototype.deleteInDirection=function(t,e){var n;return(null!=(n=this.responder)?n.deleteInDirection(t):void 0)!==!1?this.setInputSummary({didDelete:!0}):e?(e.preventDefault(),this.requestRender()):void 0},s.prototype.serializeSelectionToDataTransfer=function(t){var n,i;if(o(t))return n=null!=(i=this.responder)?i.getSelectedDocument().toSerializableDocument():void 0,t.setData(\"application/x-trix-document\",JSON.stringify(n)),t.setData(\"text/html\",e.DocumentView.render(n).innerHTML),t.setData(\"text/plain\",n.toString().replace(/\\n$/,\"\")),!0},s.prototype.canAcceptDataTransfer=function(t){var e,n,i,o,r,s;for(s={},o=null!=(i=null!=t?t.types:void 0)?i:[],e=0,n=o.length;n>e;e++)r=o[e],s[r]=!0;return s.Files||s[\"application/x-trix-document\"]||s[\"text/html\"]||s[\"text/plain\"]},s.prototype.getPastedHTMLUsingHiddenElement=function(t){var n,i,o;return i=this.getSelectedRange(),o={position:\"absolute\",left:window.pageXOffset+\"px\",top:window.pageYOffset+\"px\",opacity:0},n=c({style:o,tagName:\"div\",editable:!0}),document.body.appendChild(n),n.focus(),requestAnimationFrame(function(o){return function(){var r;return r=n.innerHTML,e.removeNode(n),o.setSelectedRange(i),t(r)}}(this))},s.proxyMethod(\"responder?.getSelectedRange\"),s.proxyMethod(\"responder?.setSelectedRange\"),s.proxyMethod(\"responder?.expandSelectionInDirection\"),s.proxyMethod(\"responder?.selectionIsInCursorTarget\"),s.proxyMethod(\"responder?.selectionIsExpanded\"),s}(e.InputController),r=function(t){var e,n;return null!=(e=t.type)&&null!=(n=e.match(/\\/(\\w+)$/))?n[1]:void 0},s=null!=(\"function\"==typeof\" \".codePointAt?\" \".codePointAt(0):void 0),p=function(t){var n;return t.key&&s&&t.key.codePointAt(0)===t.keyCode?t.key:(null===t.which?n=t.keyCode:0!==t.which&&0!==t.charCode&&(n=t.charCode),null!=n&&\"escape\"!==u[n]?e.UTF16String.fromCodepoints([n]).toString():void 0)},h=function(t){var e,n,i,o,r,s,a,u,c,l;if(u=t.clipboardData){if(m.call(u.types,\"text/html\")>=0){for(c=u.types,i=0,s=c.length;s>i;i++)if(l=c[i],e=/^CorePasteboardFlavorType/.test(l),n=/^dyn\\./.test(l)&&u.getData(l),a=e||n)return!0;return!1}return o=m.call(u.types,\"com.apple.webarchive\")>=0,r=m.call(u.types,\"com.apple.flat-rtfd\")>=0,o||r}},t=function(t){function e(t){var e;this.inputController=t,e=this.inputController,this.responder=e.responder,this.delegate=e.delegate,this.inputSummary=e.inputSummary,this.data={}}return f(e,t),e.prototype.start=function(t){var e,n;return this.data.start=t,this.isSignificant()?(\"keypress\"===this.inputSummary.eventName&&this.inputSummary.textAdded&&null!=(e=this.responder)&&e.deleteInDirection(\"left\"),this.selectionIsExpanded()||(this.insertPlaceholder(),this.requestRender()),this.range=null!=(n=this.responder)?n.getSelectedRange():void 0):void 0},e.prototype.update=function(t){var e;return this.data.update=t,this.isSignificant()&&(e=this.selectPlaceholder())?(this.forgetPlaceholder(),this.range=e):void 0},e.prototype.end=function(t){var e,n,i,o;return this.data.end=t,this.isSignificant()?(this.forgetPlaceholder(),this.canApplyToDocument()?(this.setInputSummary({preferDocument:!0,didInput:!1}),null!=(e=this.delegate)&&e.inputControllerWillPerformTyping(),null!=(n=this.responder)&&n.setSelectedRange(this.range),null!=(i=this.responder)&&i.insertString(this.data.end),null!=(o=this.responder)?o.setSelectedRange(this.range[0]+this.data.end.length):void 0):null!=this.data.start||null!=this.data.update?(this.requestReparse(),this.inputController.reset()):void 0):this.inputController.reset()},e.prototype.getEndData=function(){return this.data.end},e.prototype.isEnded=function(){return null!=this.getEndData()},e.prototype.isSignificant=function(){return n.composesExistingText?this.inputSummary.didInput:!0},e.prototype.canApplyToDocument=function(){var t,e;return 0===(null!=(t=this.data.start)?t.length:void 0)&&(null!=(e=this.data.end)?e.length:void 0)>0&&null!=this.range},e.proxyMethod(\"inputController.setInputSummary\"),e.proxyMethod(\"inputController.requestRender\"),e.proxyMethod(\"inputController.requestReparse\"),e.proxyMethod(\"responder?.selectionIsExpanded\"),e.proxyMethod(\"responder?.insertPlaceholder\"),e.proxyMethod(\"responder?.selectPlaceholder\"),e.proxyMethod(\"responder?.forgetPlaceholder\"),e}(e.BasicObject)}.call(this),function(){var t,n,i,o=function(t,e){return function(){return t.apply(e,arguments)}},r=function(t,e){function n(){this.constructor=t}for(var i in e)s.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},s={}.hasOwnProperty,a=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1};t=e.dataTransferIsPlainText,n=e.keyEventIsKeyboardCommand,i=e.objectsAreEqual,e.Level2InputController=function(s){function u(){return this.render=o(this.render,this),u.__super__.constructor.apply(this,arguments)}var c,l,h,p,d,f;return r(u,s),u.prototype.elementDidMutate=function(){var t;return this.scheduledRender?this.composing&&null!=(t=this.delegate)&&\"function\"==typeof t.inputControllerDidAllowUnhandledInput?t.inputControllerDidAllowUnhandledInput():void 0:this.reparse()},u.prototype.scheduleRender=function(){return null!=this.scheduledRender?this.scheduledRender:this.scheduledRender=requestAnimationFrame(this.render)},u.prototype.render=function(){var t;return cancelAnimationFrame(this.scheduledRender),this.scheduledRender=null,this.composing||null!=(t=this.delegate)&&t.render(),\"function\"==typeof this.afterRender&&this.afterRender(),this.afterRender=null},u.prototype.reparse=function(){var t;return null!=(t=this.delegate)?t.reparse():void 0},u.prototype.events={keydown:function(t){var e,i,o,r;if(n(t)){if(e=l(t),null!=(r=this.delegate)?r.inputControllerDidReceiveKeyboardCommand(e):void 0)return t.preventDefault()}else if(o=t.key,t.altKey&&(o+=\"+Alt\"),t.shiftKey&&(o+=\"+Shift\"),i=this.keys[o])return this.withEvent(t,i)},paste:function(t){var e,n,i,o,r,s,a,u,c;return h(t)?(t.preventDefault(),this.attachFiles(t.clipboardData.files)):p(t)?(t.preventDefault(),n={type:\"text/plain\",string:t.clipboardData.getData(\"text/plain\")},null!=(i=this.delegate)&&i.inputControllerWillPaste(n),null!=(o=this.responder)&&o.insertString(n.string),this.render(),null!=(r=this.delegate)?r.inputControllerDidPaste(n):void 0):(e=null!=(s=t.clipboardData)?s.getData(\"URL\"):void 0)?(t.preventDefault(),n={type:\"text/html\",html:this.createLinkHTML(e)},null!=(a=this.delegate)&&a.inputControllerWillPaste(n),null!=(u=this.responder)&&u.insertHTML(n.html),this.render(),null!=(c=this.delegate)?c.inputControllerDidPaste(n):void 0):void 0},beforeinput:function(t){var e;return(e=this.inputTypes[t.inputType])?(this.withEvent(t,e),this.scheduleRender()):void 0},input:function(){return e.selectionChangeObserver.reset()},dragstart:function(t){var e,n;return(null!=(e=this.responder)?e.selectionContainsAttachments():void 0)?(t.dataTransfer.setData(\"application/x-trix-dragging\",!0),this.dragging={range:null!=(n=this.responder)?n.getSelectedRange():void 0,point:d(t)}):void 0},dragenter:function(t){return c(t)?t.preventDefault():void 0},dragover:function(t){var e,n;if(this.dragging){if(t.preventDefault(),e=d(t),!i(e,this.dragging.point))return this.dragging.point=e,null!=(n=this.responder)?n.setLocationRangeFromPointRange(e):void 0}else if(c(t))return t.preventDefault()},drop:function(t){var e,n,i,o;return this.dragging?(t.preventDefault(),null!=(n=this.delegate)&&n.inputControllerWillMoveText(),null!=(i=this.responder)&&i.moveTextFromRange(this.dragging.range),this.dragging=null,this.scheduleRender()):c(t)?(t.preventDefault(),e=d(t),null!=(o=this.responder)&&o.setLocationRangeFromPointRange(e),this.attachFiles(t.dataTransfer.files)):void 0},dragend:function(){var t;return this.dragging?(null!=(t=this.responder)&&t.setSelectedRange(this.dragging.range),this.dragging=null):void 0},compositionend:function(){return this.composing?(this.composing=!1,this.scheduleRender()):void 0}},u.prototype.keys={ArrowLeft:function(){var t,e;return(null!=(t=this.responder)?t.shouldManageMovingCursorInDirection(\"backward\"):void 0)?(this.event.preventDefault(),null!=(e=this.responder)?e.moveCursorInDirection(\"backward\"):void 0):void 0},ArrowRight:function(){var t,e;return(null!=(t=this.responder)?t.shouldManageMovingCursorInDirection(\"forward\"):void 0)?(this.event.preventDefault(),null!=(e=this.responder)?e.moveCursorInDirection(\"forward\"):void 0):void 0},Backspace:function(){var t,e,n;return(null!=(t=this.responder)?t.shouldManageDeletingInDirection(\"backward\"):void 0)?(this.event.preventDefault(),null!=(e=this.delegate)&&e.inputControllerWillPerformTyping(),null!=(n=this.responder)&&n.deleteInDirection(\"backward\"),this.render()):void 0},Tab:function(){var t,e;return(null!=(t=this.responder)?t.canIncreaseNestingLevel():void 0)?(this.event.preventDefault(),null!=(e=this.responder)&&e.increaseNestingLevel(),this.render()):void 0},\"Tab+Shift\":function(){var t,e;return(null!=(t=this.responder)?t.canDecreaseNestingLevel():void 0)?(this.event.preventDefault(),null!=(e=this.responder)&&e.decreaseNestingLevel(),this.render()):void 0}},u.prototype.inputTypes={deleteByComposition:function(){return this.deleteInDirection(\"backward\",{recordUndoEntry:!1})},deleteByCut:function(){return this.deleteInDirection(\"backward\")},deleteByDrag:function(){return this.event.preventDefault(),this.withTargetDOMRange(function(){var t;return this.deleteByDragRange=null!=(t=this.responder)?t.getSelectedRange():void 0})},deleteCompositionText:function(){return this.deleteInDirection(\"backward\",{recordUndoEntry:!1})},deleteContent:function(){return this.deleteInDirection(\"backward\")},deleteContentBackward:function(){return this.deleteInDirection(\"backward\")},deleteContentForward:function(){return this.deleteInDirection(\"forward\")},deleteEntireSoftLine:function(){return this.deleteInDirection(\"forward\")},deleteHardLineBackward:function(){return this.deleteInDirection(\"backward\")},deleteHardLineForward:function(){return this.deleteInDirection(\"forward\")},deleteSoftLineBackward:function(){return this.deleteInDirection(\"backward\")},deleteSoftLineForward:function(){return this.deleteInDirection(\"forward\")},deleteWordBackward:function(){return this.deleteInDirection(\"backward\")},deleteWordForward:function(){return this.deleteInDirection(\"forward\")},formatBackColor:function(){return this.activateAttributeIfSupported(\"backgroundColor\",this.event.data)},formatBold:function(){return this.toggleAttributeIfSupported(\"bold\")},formatFontColor:function(){return this.activateAttributeIfSupported(\"color\",this.event.data)},formatFontName:function(){return this.activateAttributeIfSupported(\"font\",this.event.data)},formatIndent:function(){var t;return(null!=(t=this.responder)?t.canIncreaseNestingLevel():void 0)?this.withTargetDOMRange(function(){var t;return null!=(t=this.responder)?t.increaseNestingLevel():void 0}):void 0},formatItalic:function(){return this.toggleAttributeIfSupported(\"italic\")},formatJustifyCenter:function(){return this.toggleAttributeIfSupported(\"justifyCenter\")},formatJustifyFull:function(){return this.toggleAttributeIfSupported(\"justifyFull\")},formatJustifyLeft:function(){return this.toggleAttributeIfSupported(\"justifyLeft\")},formatJustifyRight:function(){return this.toggleAttributeIfSupported(\"justifyRight\")},formatOutdent:function(){var t;return(null!=(t=this.responder)?t.canDecreaseNestingLevel():void 0)?this.withTargetDOMRange(function(){var t;return null!=(t=this.responder)?t.decreaseNestingLevel():void 0}):void 0},formatRemove:function(){return this.withTargetDOMRange(function(){var t,e,n,i;i=[];for(t in null!=(e=this.responder)?e.getCurrentAttributes():void 0)i.push(null!=(n=this.responder)?n.removeCurrentAttribute(t):void 0);return i})},formatSetBlockTextDirection:function(){return this.activateAttributeIfSupported(\"blockDir\",this.event.data)},formatSetInlineTextDirection:function(){return this.activateAttributeIfSupported(\"textDir\",this.event.data)},formatStrikeThrough:function(){return this.toggleAttributeIfSupported(\"strike\")},formatSubscript:function(){return this.toggleAttributeIfSupported(\"sub\")},formatSuperscript:function(){return this.toggleAttributeIfSupported(\"sup\")},formatUnderline:function(){return this.toggleAttributeIfSupported(\"underline\")},historyRedo:function(){var t;return null!=(t=this.delegate)?t.inputControllerWillPerformRedo():void 0},historyUndo:function(){var t;return null!=(t=this.delegate)?t.inputControllerWillPerformUndo():void 0},insertCompositionText:function(){return this.composing=!0,this.insertString(this.event.data)},insertFromComposition:function(){return this.composing=!1,this.insertString(this.event.data)},insertFromDrop:function(){var t,e;return(t=this.deleteByDragRange)?(this.deleteByDragRange=null,null!=(e=this.delegate)&&e.inputControllerWillMoveText(),this.withTargetDOMRange(function(){var e;return null!=(e=this.responder)?e.moveTextFromRange(t):void 0})):void 0},insertFromPaste:function(){var n,i,o,r,s,a,u,c,l,h,p;return n=this.event.dataTransfer,s={dataTransfer:n},(i=n.getData(\"URL\"))?(this.event.preventDefault(),s.type=\"text/html\",p=(r=n.getData(\"public.url-name\"))?e.squishBreakableWhitespace(r).trim():i,s.html=this.createLinkHTML(i,p),null!=(a=this.delegate)&&a.inputControllerWillPaste(s),this.withTargetDOMRange(function(){var t;return null!=(t=this.responder)?t.insertHTML(s.html):void 0}),this.afterRender=function(t){return function(){var e;return null!=(e=t.delegate)?e.inputControllerDidPaste(s):void 0}}(this)):t(n)?(s.type=\"text/plain\",s.string=n.getData(\"text/plain\"),null!=(u=this.delegate)&&u.inputControllerWillPaste(s),this.withTargetDOMRange(function(){var t;return null!=(t=this.responder)?t.insertString(s.string):void 0}),this.afterRender=function(t){return function(){var e;return null!=(e=t.delegate)?e.inputControllerDidPaste(s):void 0}}(this)):(o=n.getData(\"text/html\"))?(this.event.preventDefault(),s.type=\"text/html\",s.html=o,null!=(c=this.delegate)&&c.inputControllerWillPaste(s),this.withTargetDOMRange(function(){var t;return null!=(t=this.responder)?t.insertHTML(s.html):void 0}),this.afterRender=function(t){return function(){var e;return null!=(e=t.delegate)?e.inputControllerDidPaste(s):void 0}}(this)):(null!=(l=n.files)?l.length:void 0)?(s.type=\"File\",s.file=n.files[0],null!=(h=this.delegate)&&h.inputControllerWillPaste(s),this.withTargetDOMRange(function(){var t;return null!=(t=this.responder)?t.insertFile(s.file):void 0}),this.afterRender=function(t){return function(){var e;return null!=(e=t.delegate)?e.inputControllerDidPaste(s):void 0}}(this)):void 0},insertFromYank:function(){return this.insertString(this.event.data)},insertLineBreak:function(){return this.insertString(\"\\n\")},insertLink:function(){return this.activateAttributeIfSupported(\"href\",this.event.data)},insertOrderedList:function(){return this.toggleAttributeIfSupported(\"number\")},insertParagraph:function(){var t;return null!=(t=this.delegate)&&t.inputControllerWillPerformTyping(),this.withTargetDOMRange(function(){var t;return null!=(t=this.responder)?t.insertLineBreak():void 0})},insertReplacementText:function(){return this.insertString(this.event.dataTransfer.getData(\"text/plain\"),{updatePosition:!1})},insertText:function(){var t,e;return this.insertString(null!=(t=this.event.data)?t:null!=(e=this.event.dataTransfer)?e.getData(\"text/plain\"):void 0)},insertTranspose:function(){return this.insertString(this.event.data)},insertUnorderedList:function(){return this.toggleAttributeIfSupported(\"bullet\")}},u.prototype.insertString=function(t,e){var n;return null==t&&(t=\"\"),null!=(n=this.delegate)&&n.inputControllerWillPerformTyping(),this.withTargetDOMRange(function(){var n;return null!=(n=this.responder)?n.insertString(t,e):void 0})},u.prototype.toggleAttributeIfSupported=function(t){var n;return a.call(e.getAllAttributeNames(),t)>=0?(null!=(n=this.delegate)&&n.inputControllerWillPerformFormatting(t),this.withTargetDOMRange(function(){var e;return null!=(e=this.responder)?e.toggleCurrentAttribute(t):void 0})):void 0},u.prototype.activateAttributeIfSupported=function(t,n){var i;return a.call(e.getAllAttributeNames(),t)>=0?(null!=(i=this.delegate)&&i.inputControllerWillPerformFormatting(t),this.withTargetDOMRange(function(){var e;return null!=(e=this.responder)?e.setCurrentAttribute(t,n):void 0})):void 0},u.prototype.deleteInDirection=function(t,e){var n,i,o,r;return o=(null!=e?e:{recordUndoEntry:!0}).recordUndoEntry,o&&null!=(r=this.delegate)&&r.inputControllerWillPerformTyping(),i=function(e){return function(){var n;return null!=(n=e.responder)?n.deleteInDirection(t):void 0}}(this),(n=this.getTargetDOMRange({minLength:2}))?this.withTargetDOMRange(n,i):i()},u.prototype.withTargetDOMRange=function(t,n){var i;return\"function\"==typeof t&&(n=t,t=this.getTargetDOMRange()),t?null!=(i=this.responder)?i.withTargetDOMRange(t,n.bind(this)):void 0:(e.selectionChangeObserver.reset(),n.call(this))},u.prototype.getTargetDOMRange=function(t){var e,n,i,o;return i=(null!=t?t:{minLength:0}).minLength,(o=\"function\"==typeof(e=this.event).getTargetRanges?e.getTargetRanges():void 0)&&o.length&&(n=f(o[0]),0===i||n.toString().length>=i)?n:void 0},f=function(t){var e;return e=document.createRange(),e.setStart(t.startContainer,t.startOffset),e.setEnd(t.endContainer,t.endOffset),e},u.prototype.withEvent=function(t,e){var n;this.event=t;try{n=e.call(this)}finally{this.event=null}return n},c=function(t){var e,n;return a.call(null!=(e=null!=(n=t.dataTransfer)?n.types:void 0)?e:[],\"Files\")>=0},h=function(t){var e;return(e=t.clipboardData)?a.call(e.types,\"Files\")>=0&&1===e.types.length&&e.files.length>=1:void 0},p=function(t){var e;return(e=t.clipboardData)?a.call(e.types,\"text/plain\")>=0&&1===e.types.length:void 0},l=function(t){var e;return e=[],t.altKey&&e.push(\"alt\"),t.shiftKey&&e.push(\"shift\"),e.push(t.key),e},d=function(t){return{x:t.clientX,y:t.clientY}},u}(e.InputController)}.call(this),function(){var t,n,i,o,r,s,a,u,c=function(t,e){return function(){return t.apply(e,arguments)}},l=function(t,e){function n(){this.constructor=t}for(var i in e)h.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},h={}.hasOwnProperty;n=e.defer,i=e.handleEvent,s=e.makeElement,u=e.tagName,a=e.config,r=a.lang,t=a.css,o=a.keyNames,e.AttachmentEditorController=function(a){function h(t,e,n,i){this.attachmentPiece=t,this.element=e,this.container=n,this.options=null!=i?i:{},this.didBlurCaption=c(this.didBlurCaption,this),this.didChangeCaption=c(this.didChangeCaption,this),this.didInputCaption=c(this.didInputCaption,this),this.didKeyDownCaption=c(this.didKeyDownCaption,this),this.didClickActionButton=c(this.didClickActionButton,this),this.didClickToolbar=c(this.didClickToolbar,this),this.attachment=this.attachmentPiece.attachment,\"a\"===u(this.element)&&(this.element=this.element.firstChild),this.install()}var p;return l(h,a),p=function(t){return function(){var e;return e=t.apply(this,arguments),e[\"do\"](),null==this.undos&&(this.undos=[]),this.undos.push(e.undo)}},h.prototype.install=function(){return this.makeElementMutable(),this.addToolbar(),this.attachment.isPreviewable()?this.installCaptionEditor():void 0},h.prototype.uninstall=function(){var t,e;for(this.savePendingCaption();e=this.undos.pop();)e();return null!=(t=this.delegate)?t.didUninstallAttachmentEditor(this):void 0},h.prototype.savePendingCaption=function(){var t,e,n;return null!=this.pendingCaption?(t=this.pendingCaption,this.pendingCaption=null,t?null!=(e=this.delegate)&&\"function\"==typeof e.attachmentEditorDidRequestUpdatingAttributesForAttachment?e.attachmentEditorDidRequestUpdatingAttributesForAttachment({caption:t},this.attachment):void 0:null!=(n=this.delegate)&&\"function\"==typeof n.attachmentEditorDidRequestRemovingAttributeForAttachment?n.attachmentEditorDidRequestRemovingAttributeForAttachment(\"caption\",this.attachment):void 0):void 0},h.prototype.makeElementMutable=p(function(){return{\"do\":function(t){return function(){return t.element.dataset.trixMutable=!0}}(this),undo:function(t){return function(){return delete t.element.dataset.trixMutable}}(this)}}),h.prototype.addToolbar=p(function(){var n;return n=s({tagName:\"div\",className:t.attachmentToolbar,data:{trixMutable:!0},childNodes:s({tagName:\"div\",className:\"trix-button-row\",childNodes:s({tagName:\"span\",className:\"trix-button-group trix-button-group--actions\",childNodes:s({tagName:\"button\",className:\"trix-button trix-button--remove\",textContent:r.remove,attributes:{title:r.remove},data:{trixAction:\"remove\"}})})})}),this.attachment.isPreviewable()&&n.appendChild(s({tagName:\"div\",className:t.attachmentMetadataContainer,childNodes:s({tagName:\"span\",className:t.attachmentMetadata,childNodes:[s({tagName:\"span\",className:t.attachmentName,textContent:this.attachment.getFilename(),attributes:{title:this.attachment.getFilename()}}),s({tagName:\"span\",className:t.attachmentSize,textContent:this.attachment.getFormattedFilesize()})]})})),i(\"click\",{onElement:n,withCallback:this.didClickToolbar}),i(\"click\",{onElement:n,matchingSelector:\"[data-trix-action]\",withCallback:this.didClickActionButton}),{\"do\":function(t){return function(){return t.element.appendChild(n)}}(this),undo:function(){return function(){return e.removeNode(n)}}(this)}}),h.prototype.installCaptionEditor=p(function(){var o,a,u,c,l;return c=s({tagName:\"textarea\",className:t.attachmentCaptionEditor,attributes:{placeholder:r.captionPlaceholder},data:{trixMutable:!0}}),c.value=this.attachmentPiece.getCaption(),l=c.cloneNode(),l.classList.add(\"trix-autoresize-clone\"),l.tabIndex=-1,o=function(){return l.value=c.value,c.style.height=l.scrollHeight+\"px\"},i(\"input\",{onElement:c,withCallback:o}),i(\"input\",{onElement:c,withCallback:this.didInputCaption}),i(\"keydown\",{onElement:c,withCallback:this.didKeyDownCaption}),i(\"change\",{onElement:c,withCallback:this.didChangeCaption}),i(\"blur\",{onElement:c,withCallback:this.didBlurCaption}),u=this.element.querySelector(\"figcaption\"),a=u.cloneNode(),{\"do\":function(e){return function(){return u.style.display=\"none\",a.appendChild(c),a.appendChild(l),a.classList.add(t.attachmentCaption+\"--editing\"),u.parentElement.insertBefore(a,u),o(),e.options.editCaption?n(function(){return c.focus()}):void 0}}(this),undo:function(){return e.removeNode(a),u.style.display=null}}}),h.prototype.didClickToolbar=function(t){return t.preventDefault(),t.stopPropagation()},h.prototype.didClickActionButton=function(t){var e,n;switch(e=t.target.getAttribute(\"data-trix-action\")){case\"remove\":return null!=(n=this.delegate)?n.attachmentEditorDidRequestRemovalOfAttachment(this.attachment):void 0}},h.prototype.didKeyDownCaption=function(t){var e;return\"return\"===o[t.keyCode]?(t.preventDefault(),this.savePendingCaption(),null!=(e=this.delegate)&&\"function\"==typeof e.attachmentEditorDidRequestDeselectingAttachment?e.attachmentEditorDidRequestDeselectingAttachment(this.attachment):void 0):void 0},h.prototype.didInputCaption=function(t){return this.pendingCaption=t.target.value.replace(/\\s/g,\" \").trim()},h.prototype.didChangeCaption=function(){return this.savePendingCaption()},h.prototype.didBlurCaption=function(){return this.savePendingCaption()},h}(e.BasicObject)}.call(this),function(){var t,n,i,o=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;i=e.makeElement,t=e.config.css,e.AttachmentView=function(r){function s(){s.__super__.constructor.apply(this,arguments),this.attachment=this.object,this.attachment.uploadProgressDelegate=this,this.attachmentPiece=this.options.piece}var a;return o(s,r),s.attachmentSelector=\"[data-trix-attachment]\",s.prototype.createContentNodes=function(){return[]},s.prototype.createNodes=function(){var n,o,r,s,u,c,l;if(n=s=i({tagName:\"figure\",className:this.getClassName(),data:this.getData(),editable:!1}),(o=this.getHref())&&(s=i({tagName:\"a\",editable:!1,attributes:{href:o,tabindex:-1}}),n.appendChild(s)),this.attachment.hasContent())e.HTMLSanitizer.setHTML(s,this.attachment.getContent());else for(l=this.createContentNodes(),r=0,u=l.length;u>r;r++)c=l[r],s.appendChild(c);return s.appendChild(this.createCaptionElement()),this.attachment.isPending()&&(this.progressElement=i({tagName:\"progress\",attributes:{\"class\":t.attachmentProgress,value:this.attachment.getUploadProgress(),max:100},data:{trixMutable:!0,trixStoreKey:[\"progressElement\",this.attachment.id].join(\"/\")}}),n.appendChild(this.progressElement)),[a(\"left\"),n,a(\"right\")]},s.prototype.createCaptionElement=function(){var e,n,o,r,s,a,u;return o=i({tagName:\"figcaption\",className:t.attachmentCaption}),(e=this.attachmentPiece.getCaption())?(o.classList.add(t.attachmentCaption+\"--edited\"),o.textContent=e):(n=this.getCaptionConfig(),n.name&&(r=this.attachment.getFilename()),n.size&&(a=this.attachment.getFormattedFilesize()),r&&(s=i({tagName:\"span\",className:t.attachmentName,textContent:r}),o.appendChild(s)),a&&(r&&o.appendChild(document.createTextNode(\" \")),u=i({tagName:\"span\",className:t.attachmentSize,textContent:a}),o.appendChild(u))),o},s.prototype.getClassName=function(){var e,n;return n=[t.attachment,t.attachment+\"--\"+this.attachment.getType()],(e=this.attachment.getExtension())&&n.push(t.attachment+\"--\"+e),n.join(\" \")},s.prototype.getData=function(){var t,e;return e={trixAttachment:JSON.stringify(this.attachment),trixContentType:this.attachment.getContentType(),trixId:this.attachment.id},t=this.attachmentPiece.attributes,t.isEmpty()||(e.trixAttributes=JSON.stringify(t)),this.attachment.isPending()&&(e.trixSerialize=!1),e},s.prototype.getHref=function(){return n(this.attachment.getContent(),\"a\")?void 0:this.attachment.getHref()},s.prototype.getCaptionConfig=function(){var t,n,i;return i=this.attachment.getType(),t=e.copyObject(null!=(n=e.config.attachments[i])?n.caption:void 0),\"file\"===i&&(t.name=!0),t},s.prototype.findProgressElement=function(){var t;return null!=(t=this.findElement())?t.querySelector(\"progress\"):void 0},a=function(t){return i({tagName:\"span\",textContent:e.ZERO_WIDTH_SPACE,data:{trixCursorTarget:t,trixSerialize:!1}})},s.prototype.attachmentDidChangeUploadProgress=function(){var t,e;return e=this.attachment.getUploadProgress(),null!=(t=this.findProgressElement())?t.value=e:void 0},s}(e.ObjectView),n=function(t,n){var o;return o=i(\"div\"),e.HTMLSanitizer.setHTML(o,t||\"\"),o.querySelector(n)}}.call(this),function(){var t,n=function(t,e){function n(){this.constructor=t}for(var o in e)i.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},i={}.hasOwnProperty;t=e.makeElement,e.PreviewableAttachmentView=function(i){function o(){o.__super__.constructor.apply(this,arguments),this.attachment.previewDelegate=this}return n(o,i),o.prototype.createContentNodes=function(){return this.image=t({tagName:\"img\",attributes:{src:\"\"},data:{trixMutable:!0}}),this.refresh(this.image),[this.image]},o.prototype.createCaptionElement=function(){var t;return t=o.__super__.createCaptionElement.apply(this,arguments),t.textContent||t.setAttribute(\"data-trix-placeholder\",e.config.lang.captionPlaceholder),t},o.prototype.refresh=function(t){var e;return null==t&&(t=null!=(e=this.findElement())?e.querySelector(\"img\"):void 0),t?this.updateAttributesForImage(t):void 0},o.prototype.updateAttributesForImage=function(t){var e,n,i,o,r,s;return r=this.attachment.getURL(),n=this.attachment.getPreviewURL(),t.src=n||r,n===r?t.removeAttribute(\"data-trix-serialized-attributes\"):(i=JSON.stringify({src:r}),t.setAttribute(\"data-trix-serialized-attributes\",i)),s=this.attachment.getWidth(),e=this.attachment.getHeight(),null!=s&&(t.width=s),null!=e&&(t.height=e),o=[\"imageElement\",this.attachment.id,t.src,t.width,t.height].join(\"/\"),t.dataset.trixStoreKey=o},o.prototype.attachmentDidChangeAttributes=function(){return this.refresh(this.image),this.refresh()},o}(e.AttachmentView)}.call(this),function(){var t,n,i,o=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;i=e.makeElement,t=e.findInnerElement,n=e.getTextConfig,e.PieceView=function(r){function s(){var t;s.__super__.constructor.apply(this,arguments),this.piece=this.object,this.attributes=this.piece.getAttributes(),t=this.options,this.textConfig=t.textConfig,this.context=t.context,this.piece.attachment?this.attachment=this.piece.attachment:this.string=this.piece.toString()}var a;return o(s,r),s.prototype.createNodes=function(){var e,n,i,o,r,s;if(s=this.attachment?this.createAttachmentNodes():this.createStringNodes(),e=this.createElement()){for(i=t(e),n=0,o=s.length;o>n;n++)r=s[n],i.appendChild(r);s=[e]}return s},s.prototype.createAttachmentNodes=function(){var t,n;return t=this.attachment.isPreviewable()?e.PreviewableAttachmentView:e.AttachmentView,n=this.createChildView(t,this.piece.attachment,{piece:this.piece}),n.getNodes()},s.prototype.createStringNodes=function(){var t,e,n,o,r,s,a,u,c,l;if(null!=(u=this.textConfig)?u.plaintext:void 0)return[document.createTextNode(this.string)];for(a=[],c=this.string.split(\"\\n\"),n=e=0,o=c.length;o>e;n=++e)l=c[n],n>0&&(t=i(\"br\"),a.push(t)),(r=l.length)&&(s=document.createTextNode(this.preserveSpaces(l)),a.push(s));return a},s.prototype.createElement=function(){var t,e,o,r,s,a,u,c,l;c={},a=this.attributes;for(r in a)if(l=a[r],(t=n(r))&&(t.tagName&&(s=i(t.tagName),o?(o.appendChild(s),o=s):e=o=s),t.styleProperty&&(c[t.styleProperty]=l),t.style)){u=t.style;for(r in u)l=u[r],c[r]=l}if(Object.keys(c).length){null==e&&(e=i(\"span\"));for(r in c)l=c[r],e.style[r]=l}return e},s.prototype.createContainerElement=function(){var t,e,o,r,s;r=this.attributes;for(o in r)if(s=r[o],(e=n(o))&&e.groupTagName)return t={},t[o]=s,i(e.groupTagName,t)},a=e.NON_BREAKING_SPACE,s.prototype.preserveSpaces=function(t){return this.context.isLast&&(t=t.replace(/\\ $/,a)),t=t.replace(/(\\S)\\ {3}(\\S)/g,\"$1 \"+a+\" $2\").replace(/\\ {2}/g,a+\" \").replace(/\\ {2}/g,\" \"+a),(this.context.isFirst||this.context.followsWhitespace)&&(t=t.replace(/^\\ /,a)),t},s}(e.ObjectView)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t\n}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.TextView=function(n){function i(){i.__super__.constructor.apply(this,arguments),this.text=this.object,this.textConfig=this.options.textConfig}var o;return t(i,n),i.prototype.createNodes=function(){var t,n,i,r,s,a,u,c,l,h;for(a=[],c=e.ObjectGroup.groupObjects(this.getPieces()),r=c.length-1,i=n=0,s=c.length;s>n;i=++n)u=c[i],t={},0===i&&(t.isFirst=!0),i===r&&(t.isLast=!0),o(l)&&(t.followsWhitespace=!0),h=this.findOrCreateCachedChildView(e.PieceView,u,{textConfig:this.textConfig,context:t}),a.push.apply(a,h.getNodes()),l=u;return a},i.prototype.getPieces=function(){var t,e,n,i,o;for(i=this.text.getPieces(),o=[],t=0,e=i.length;e>t;t++)n=i[t],n.hasAttribute(\"blockBreak\")||o.push(n);return o},o=function(t){return/\\s$/.test(null!=t?t.toString():void 0)},i}(e.ObjectView)}.call(this),function(){var t,n,i,o=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;i=e.makeElement,n=e.getBlockConfig,t=e.config.css,e.BlockView=function(r){function s(){s.__super__.constructor.apply(this,arguments),this.block=this.object,this.attributes=this.block.getAttributes()}return o(s,r),s.prototype.createNodes=function(){var t,o,r,s,a,u,c,l,h,p,d;if(o=document.createComment(\"block\"),c=[o],this.block.isEmpty()?c.push(i(\"br\")):(p=null!=(l=n(this.block.getLastAttribute()))?l.text:void 0,d=this.findOrCreateCachedChildView(e.TextView,this.block.text,{textConfig:p}),c.push.apply(c,d.getNodes()),this.shouldAddExtraNewlineElement()&&c.push(i(\"br\"))),this.attributes.length)return c;for(h=e.config.blockAttributes[\"default\"].tagName,this.block.isRTL()&&(t={dir:\"rtl\"}),r=i({tagName:h,attributes:t}),s=0,a=c.length;a>s;s++)u=c[s],r.appendChild(u);return[r]},s.prototype.createContainerElement=function(e){var o,r,s,a,u;return o=this.attributes[e],u=n(o).tagName,0===e&&this.block.isRTL()&&(r={dir:\"rtl\"}),\"attachmentGallery\"===o&&(a=this.block.getBlockBreakPosition(),s=t.attachmentGallery+\" \"+t.attachmentGallery+\"--\"+a),i({tagName:u,className:s,attributes:r})},s.prototype.shouldAddExtraNewlineElement=function(){return/\\n\\n$/.test(this.block.toString())},s}(e.ObjectView)}.call(this),function(){var t,n,i=function(t,e){function n(){this.constructor=t}for(var i in e)o.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},o={}.hasOwnProperty;t=e.defer,n=e.makeElement,e.DocumentView=function(o){function r(){r.__super__.constructor.apply(this,arguments),this.element=this.options.element,this.elementStore=new e.ElementStore,this.setDocument(this.object)}var s,a,u;return i(r,o),r.render=function(t){var e,i;return e=n(\"div\"),i=new this(t,{element:e}),i.render(),i.sync(),e},r.prototype.setDocument=function(t){return t.isEqualTo(this.document)?void 0:this.document=this.object=t},r.prototype.render=function(){var t,i,o,r,s,a,u;if(this.childViews=[],this.shadowElement=n(\"div\"),!this.document.isEmpty()){for(s=e.ObjectGroup.groupObjects(this.document.getBlocks(),{asTree:!0}),a=[],t=0,i=s.length;i>t;t++)r=s[t],u=this.findOrCreateCachedChildView(e.BlockView,r),a.push(function(){var t,e,n,i;for(n=u.getNodes(),i=[],t=0,e=n.length;e>t;t++)o=n[t],i.push(this.shadowElement.appendChild(o));return i}.call(this));return a}},r.prototype.isSynced=function(){return s(this.shadowElement,this.element)},r.prototype.sync=function(){var t;for(t=this.createDocumentFragmentForSync();this.element.lastChild;)this.element.removeChild(this.element.lastChild);return this.element.appendChild(t),this.didSync()},r.prototype.didSync=function(){return this.elementStore.reset(a(this.element)),t(function(t){return function(){return t.garbageCollectCachedViews()}}(this))},r.prototype.createDocumentFragmentForSync=function(){var t,e,n,i,o,r,s,u,c,l;for(e=document.createDocumentFragment(),u=this.shadowElement.childNodes,n=0,o=u.length;o>n;n++)s=u[n],e.appendChild(s.cloneNode(!0));for(c=a(e),i=0,r=c.length;r>i;i++)t=c[i],(l=this.elementStore.remove(t))&&t.parentNode.replaceChild(l,t);return e},a=function(t){return t.querySelectorAll(\"[data-trix-store-key]\")},s=function(t,e){return u(t.innerHTML)===u(e.innerHTML)},u=function(t){return t.replace(/&nbsp;/g,\" \")},r}(e.ObjectView)}.call(this),function(){var t,n,i,o,r,s=function(t,e){return function(){return t.apply(e,arguments)}},a=function(t,e){function n(){this.constructor=t}for(var i in e)u.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},u={}.hasOwnProperty;i=e.findClosestElementFromNode,o=e.handleEvent,r=e.innerElementIsActive,n=e.defer,t=e.AttachmentView.attachmentSelector,e.CompositionController=function(u){function c(n,i){this.element=n,this.composition=i,this.didClickAttachment=s(this.didClickAttachment,this),this.didBlur=s(this.didBlur,this),this.didFocus=s(this.didFocus,this),this.documentView=new e.DocumentView(this.composition.document,{element:this.element}),o(\"focus\",{onElement:this.element,withCallback:this.didFocus}),o(\"blur\",{onElement:this.element,withCallback:this.didBlur}),o(\"click\",{onElement:this.element,matchingSelector:\"a[contenteditable=false]\",preventDefault:!0}),o(\"mousedown\",{onElement:this.element,matchingSelector:t,withCallback:this.didClickAttachment}),o(\"click\",{onElement:this.element,matchingSelector:\"a\"+t,preventDefault:!0})}return a(c,u),c.prototype.didFocus=function(){var t,e,n;return t=function(t){return function(){var e;return t.focused?void 0:(t.focused=!0,null!=(e=t.delegate)&&\"function\"==typeof e.compositionControllerDidFocus?e.compositionControllerDidFocus():void 0)}}(this),null!=(e=null!=(n=this.blurPromise)?n.then(t):void 0)?e:t()},c.prototype.didBlur=function(){return this.blurPromise=new Promise(function(t){return function(e){return n(function(){var n;return r(t.element)||(t.focused=null,null!=(n=t.delegate)&&\"function\"==typeof n.compositionControllerDidBlur&&n.compositionControllerDidBlur()),t.blurPromise=null,e()})}}(this))},c.prototype.didClickAttachment=function(t,e){var n,o,r;return n=this.findAttachmentForElement(e),o=null!=i(t.target,{matchingSelector:\"figcaption\"}),null!=(r=this.delegate)&&\"function\"==typeof r.compositionControllerDidSelectAttachment?r.compositionControllerDidSelectAttachment(n,{editCaption:o}):void 0},c.prototype.getSerializableElement=function(){return this.isEditingAttachment()?this.documentView.shadowElement:this.element},c.prototype.render=function(){var t,e,n;return this.revision!==this.composition.revision&&(this.documentView.setDocument(this.composition.document),this.documentView.render(),this.revision=this.composition.revision),this.canSyncDocumentView()&&!this.documentView.isSynced()&&(null!=(t=this.delegate)&&\"function\"==typeof t.compositionControllerWillSyncDocumentView&&t.compositionControllerWillSyncDocumentView(),this.documentView.sync(),null!=(e=this.delegate)&&\"function\"==typeof e.compositionControllerDidSyncDocumentView&&e.compositionControllerDidSyncDocumentView()),null!=(n=this.delegate)&&\"function\"==typeof n.compositionControllerDidRender?n.compositionControllerDidRender():void 0},c.prototype.rerenderViewForObject=function(t){return this.invalidateViewForObject(t),this.render()},c.prototype.invalidateViewForObject=function(t){return this.documentView.invalidateViewForObject(t)},c.prototype.isViewCachingEnabled=function(){return this.documentView.isViewCachingEnabled()},c.prototype.enableViewCaching=function(){return this.documentView.enableViewCaching()},c.prototype.disableViewCaching=function(){return this.documentView.disableViewCaching()},c.prototype.refreshViewCache=function(){return this.documentView.garbageCollectCachedViews()},c.prototype.isEditingAttachment=function(){return null!=this.attachmentEditor},c.prototype.installAttachmentEditorForAttachment=function(t,n){var i,o,r;if((null!=(r=this.attachmentEditor)?r.attachment:void 0)!==t&&(o=this.documentView.findElementForObject(t)))return this.uninstallAttachmentEditor(),i=this.composition.document.getAttachmentPieceForAttachment(t),this.attachmentEditor=new e.AttachmentEditorController(i,o,this.element,n),this.attachmentEditor.delegate=this},c.prototype.uninstallAttachmentEditor=function(){var t;return null!=(t=this.attachmentEditor)?t.uninstall():void 0},c.prototype.didUninstallAttachmentEditor=function(){return this.attachmentEditor=null,this.render()},c.prototype.attachmentEditorDidRequestUpdatingAttributesForAttachment=function(t,e){var n;return null!=(n=this.delegate)&&\"function\"==typeof n.compositionControllerWillUpdateAttachment&&n.compositionControllerWillUpdateAttachment(e),this.composition.updateAttributesForAttachment(t,e)},c.prototype.attachmentEditorDidRequestRemovingAttributeForAttachment=function(t,e){var n;return null!=(n=this.delegate)&&\"function\"==typeof n.compositionControllerWillUpdateAttachment&&n.compositionControllerWillUpdateAttachment(e),this.composition.removeAttributeForAttachment(t,e)},c.prototype.attachmentEditorDidRequestRemovalOfAttachment=function(t){var e;return null!=(e=this.delegate)&&\"function\"==typeof e.compositionControllerDidRequestRemovalOfAttachment?e.compositionControllerDidRequestRemovalOfAttachment(t):void 0},c.prototype.attachmentEditorDidRequestDeselectingAttachment=function(t){var e;return null!=(e=this.delegate)&&\"function\"==typeof e.compositionControllerDidRequestDeselectingAttachment?e.compositionControllerDidRequestDeselectingAttachment(t):void 0},c.prototype.canSyncDocumentView=function(){return!this.isEditingAttachment()},c.prototype.findAttachmentForElement=function(t){return this.composition.document.getAttachmentById(parseInt(t.dataset.trixId,10))},c}(e.BasicObject)}.call(this),function(){var t,n,i,o=function(t,e){return function(){return t.apply(e,arguments)}},r=function(t,e){function n(){this.constructor=t}for(var i in e)s.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},s={}.hasOwnProperty;n=e.handleEvent,i=e.triggerEvent,t=e.findClosestElementFromNode,e.ToolbarController=function(e){function s(t){this.element=t,this.didKeyDownDialogInput=o(this.didKeyDownDialogInput,this),this.didClickDialogButton=o(this.didClickDialogButton,this),this.didClickAttributeButton=o(this.didClickAttributeButton,this),this.didClickActionButton=o(this.didClickActionButton,this),this.attributes={},this.actions={},this.resetDialogInputs(),n(\"mousedown\",{onElement:this.element,matchingSelector:a,withCallback:this.didClickActionButton}),n(\"mousedown\",{onElement:this.element,matchingSelector:c,withCallback:this.didClickAttributeButton}),n(\"click\",{onElement:this.element,matchingSelector:v,preventDefault:!0}),n(\"click\",{onElement:this.element,matchingSelector:l,withCallback:this.didClickDialogButton}),n(\"keydown\",{onElement:this.element,matchingSelector:h,withCallback:this.didKeyDownDialogInput})}var a,u,c,l,h,p,d,f,g,m,v;return r(s,e),c=\"[data-trix-attribute]\",a=\"[data-trix-action]\",v=c+\", \"+a,p=\"[data-trix-dialog]\",u=p+\"[data-trix-active]\",l=p+\" [data-trix-method]\",h=p+\" [data-trix-input]\",s.prototype.didClickActionButton=function(t,e){var n,i,o;return null!=(i=this.delegate)&&i.toolbarDidClickButton(),t.preventDefault(),n=d(e),this.getDialog(n)?this.toggleDialog(n):null!=(o=this.delegate)?o.toolbarDidInvokeAction(n):void 0},s.prototype.didClickAttributeButton=function(t,e){var n,i,o;return null!=(i=this.delegate)&&i.toolbarDidClickButton(),t.preventDefault(),n=f(e),this.getDialog(n)?this.toggleDialog(n):null!=(o=this.delegate)&&o.toolbarDidToggleAttribute(n),this.refreshAttributeButtons()},s.prototype.didClickDialogButton=function(e,n){var i,o;return i=t(n,{matchingSelector:p}),o=n.getAttribute(\"data-trix-method\"),this[o].call(this,i)},s.prototype.didKeyDownDialogInput=function(t,e){var n,i;return 13===t.keyCode&&(t.preventDefault(),n=e.getAttribute(\"name\"),i=this.getDialog(n),this.setAttribute(i)),27===t.keyCode?(t.preventDefault(),this.hideDialog()):void 0},s.prototype.updateActions=function(t){return this.actions=t,this.refreshActionButtons()},s.prototype.refreshActionButtons=function(){return this.eachActionButton(function(t){return function(e,n){return e.disabled=t.actions[n]===!1}}(this))},s.prototype.eachActionButton=function(t){var e,n,i,o,r;for(o=this.element.querySelectorAll(a),r=[],n=0,i=o.length;i>n;n++)e=o[n],r.push(t(e,d(e)));return r},s.prototype.updateAttributes=function(t){return this.attributes=t,this.refreshAttributeButtons()},s.prototype.refreshAttributeButtons=function(){return this.eachAttributeButton(function(t){return function(e,n){return e.disabled=t.attributes[n]===!1,t.attributes[n]||t.dialogIsVisible(n)?(e.setAttribute(\"data-trix-active\",\"\"),e.classList.add(\"trix-active\")):(e.removeAttribute(\"data-trix-active\"),e.classList.remove(\"trix-active\"))}}(this))},s.prototype.eachAttributeButton=function(t){var e,n,i,o,r;for(o=this.element.querySelectorAll(c),r=[],n=0,i=o.length;i>n;n++)e=o[n],r.push(t(e,f(e)));return r},s.prototype.applyKeyboardCommand=function(t){var e,n,o,r,s,a,u;for(s=JSON.stringify(t.sort()),u=this.element.querySelectorAll(\"[data-trix-key]\"),r=0,a=u.length;a>r;r++)if(e=u[r],o=e.getAttribute(\"data-trix-key\").split(\"+\"),n=JSON.stringify(o.sort()),n===s)return i(\"mousedown\",{onElement:e}),!0;return!1},s.prototype.dialogIsVisible=function(t){var e;return(e=this.getDialog(t))?e.hasAttribute(\"data-trix-active\"):void 0},s.prototype.toggleDialog=function(t){return this.dialogIsVisible(t)?this.hideDialog():this.showDialog(t)},s.prototype.showDialog=function(t){var e,n,i,o,r,s,a,u,c,l;for(this.hideDialog(),null!=(a=this.delegate)&&a.toolbarWillShowDialog(),i=this.getDialog(t),i.setAttribute(\"data-trix-active\",\"\"),i.classList.add(\"trix-active\"),u=i.querySelectorAll(\"input[disabled]\"),o=0,s=u.length;s>o;o++)n=u[o],n.removeAttribute(\"disabled\");return(e=f(i))&&(r=m(i,t))&&(r.value=null!=(c=this.attributes[e])?c:\"\",r.select()),null!=(l=this.delegate)?l.toolbarDidShowDialog(t):void 0},s.prototype.setAttribute=function(t){var e,n,i;return e=f(t),n=m(t,e),n.willValidate&&!n.checkValidity()?(n.setAttribute(\"data-trix-validate\",\"\"),n.classList.add(\"trix-validate\"),n.focus()):(null!=(i=this.delegate)&&i.toolbarDidUpdateAttribute(e,n.value),this.hideDialog())},s.prototype.removeAttribute=function(t){var e,n;return e=f(t),null!=(n=this.delegate)&&n.toolbarDidRemoveAttribute(e),this.hideDialog()},s.prototype.hideDialog=function(){var t,e;return(t=this.element.querySelector(u))?(t.removeAttribute(\"data-trix-active\"),t.classList.remove(\"trix-active\"),this.resetDialogInputs(),null!=(e=this.delegate)?e.toolbarDidHideDialog(g(t)):void 0):void 0},s.prototype.resetDialogInputs=function(){var t,e,n,i,o;for(i=this.element.querySelectorAll(h),o=[],t=0,n=i.length;n>t;t++)e=i[t],e.setAttribute(\"disabled\",\"disabled\"),e.removeAttribute(\"data-trix-validate\"),o.push(e.classList.remove(\"trix-validate\"));return o},s.prototype.getDialog=function(t){return this.element.querySelector(\"[data-trix-dialog=\"+t+\"]\")},m=function(t,e){return null==e&&(e=f(t)),t.querySelector(\"[data-trix-input][name='\"+e+\"']\")},d=function(t){return t.getAttribute(\"data-trix-action\")},f=function(t){var e;return null!=(e=t.getAttribute(\"data-trix-attribute\"))?e:t.getAttribute(\"data-trix-dialog-attribute\")},g=function(t){return t.getAttribute(\"data-trix-dialog\")},s}(e.BasicObject)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.ImagePreloadOperation=function(e){function n(t){this.url=t}return t(n,e),n.prototype.perform=function(t){var e;return e=new Image,e.onload=function(n){return function(){return e.width=n.width=e.naturalWidth,e.height=n.height=e.naturalHeight,t(!0,e)}}(this),e.onerror=function(){return t(!1)},e.src=this.url},n}(e.Operation)}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}},n=function(t,e){function n(){this.constructor=t}for(var o in e)i.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},i={}.hasOwnProperty;e.Attachment=function(i){function o(n){null==n&&(n={}),this.releaseFile=t(this.releaseFile,this),o.__super__.constructor.apply(this,arguments),this.attributes=e.Hash.box(n),this.didChangeAttributes()}return n(o,i),o.previewablePattern=/^image(\\/(gif|png|jpe?g)|$)/,o.attachmentForFile=function(t){var e,n;return n=this.attributesForFile(t),e=new this(n),e.setFile(t),e},o.attributesForFile=function(t){return new e.Hash({filename:t.name,filesize:t.size,contentType:t.type})},o.fromJSON=function(t){return new this(t)},o.prototype.getAttribute=function(t){return this.attributes.get(t)},o.prototype.hasAttribute=function(t){return this.attributes.has(t)},o.prototype.getAttributes=function(){return this.attributes.toObject()},o.prototype.setAttributes=function(t){var e,n,i;return null==t&&(t={}),e=this.attributes.merge(t),this.attributes.isEqualTo(e)?void 0:(this.attributes=e,this.didChangeAttributes(),null!=(n=this.previewDelegate)&&\"function\"==typeof n.attachmentDidChangeAttributes&&n.attachmentDidChangeAttributes(this),null!=(i=this.delegate)&&\"function\"==typeof i.attachmentDidChangeAttributes?i.attachmentDidChangeAttributes(this):void 0)},o.prototype.didChangeAttributes=function(){return this.isPreviewable()?this.preloadURL():void 0},o.prototype.isPending=function(){return null!=this.file&&!(this.getURL()||this.getHref())},o.prototype.isPreviewable=function(){return this.attributes.has(\"previewable\")?this.attributes.get(\"previewable\"):this.constructor.previewablePattern.test(this.getContentType())},o.prototype.getType=function(){return this.hasContent()?\"content\":this.isPreviewable()?\"preview\":\"file\"},o.prototype.getURL=function(){return this.attributes.get(\"url\")},o.prototype.getHref=function(){return this.attributes.get(\"href\")},o.prototype.getFilename=function(){var t;return null!=(t=this.attributes.get(\"filename\"))?t:\"\"},o.prototype.getFilesize=function(){return this.attributes.get(\"filesize\")},o.prototype.getFormattedFilesize=function(){var t;return t=this.attributes.get(\"filesize\"),\"number\"==typeof t?e.config.fileSize.formatter(t):\"\"},o.prototype.getExtension=function(){var t;return null!=(t=this.getFilename().match(/\\.(\\w+)$/))?t[1].toLowerCase():void 0},o.prototype.getContentType=function(){return this.attributes.get(\"contentType\")},o.prototype.hasContent=function(){return this.attributes.has(\"content\")},o.prototype.getContent=function(){return this.attributes.get(\"content\")},o.prototype.getWidth=function(){return this.attributes.get(\"width\")},o.prototype.getHeight=function(){return this.attributes.get(\"height\")},o.prototype.getFile=function(){return this.file},o.prototype.setFile=function(t){return this.file=t,this.isPreviewable()?this.preloadFile():void 0},o.prototype.releaseFile=function(){return this.releasePreloadedFile(),this.file=null},o.prototype.getUploadProgress=function(){var t;return null!=(t=this.uploadProgress)?t:0},o.prototype.setUploadProgress=function(t){var e;return this.uploadProgress!==t?(this.uploadProgress=t,null!=(e=this.uploadProgressDelegate)&&\"function\"==typeof e.attachmentDidChangeUploadProgress?e.attachmentDidChangeUploadProgress(this):void 0):void 0},o.prototype.toJSON=function(){return this.getAttributes()},o.prototype.getCacheKey=function(){return[o.__super__.getCacheKey.apply(this,arguments),this.attributes.getCacheKey(),this.getPreviewURL()].join(\"/\")},o.prototype.getPreviewURL=function(){return this.previewURL||this.preloadingURL},o.prototype.setPreviewURL=function(t){var e,n;return t!==this.getPreviewURL()?(this.previewURL=t,null!=(e=this.previewDelegate)&&\"function\"==typeof e.attachmentDidChangeAttributes&&e.attachmentDidChangeAttributes(this),null!=(n=this.delegate)&&\"function\"==typeof n.attachmentDidChangePreviewURL?n.attachmentDidChangePreviewURL(this):void 0):void 0},o.prototype.preloadURL=function(){return this.preload(this.getURL(),this.releaseFile)},o.prototype.preloadFile=function(){return this.file?(this.fileObjectURL=URL.createObjectURL(this.file),this.preload(this.fileObjectURL)):void 0},o.prototype.releasePreloadedFile=function(){return this.fileObjectURL?(URL.revokeObjectURL(this.fileObjectURL),this.fileObjectURL=null):void 0},o.prototype.preload=function(t,n){var i;return t&&t!==this.getPreviewURL()?(this.preloadingURL=t,i=new e.ImagePreloadOperation(t),i.then(function(e){return function(i){var o,r;return r=i.width,o=i.height,e.getWidth()&&e.getHeight()||e.setAttributes({width:r,height:o}),e.preloadingURL=null,e.setPreviewURL(t),\"function\"==typeof n?n():void 0}}(this))[\"catch\"](function(t){return function(){return t.preloadingURL=null,\"function\"==typeof n?n():void 0}}(this))):void 0},o}(e.Object)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.Piece=function(n){function i(t,n){null==n&&(n={}),i.__super__.constructor.apply(this,arguments),this.attributes=e.Hash.box(n)}return t(i,n),i.types={},i.registerType=function(t,e){return e.type=t,this.types[t]=e},i.fromJSON=function(t){var e;return(e=this.types[t.type])?e.fromJSON(t):void 0},i.prototype.copyWithAttributes=function(t){return new this.constructor(this.getValue(),t)},i.prototype.copyWithAdditionalAttributes=function(t){return this.copyWithAttributes(this.attributes.merge(t))},i.prototype.copyWithoutAttribute=function(t){return this.copyWithAttributes(this.attributes.remove(t))},i.prototype.copy=function(){return this.copyWithAttributes(this.attributes)},i.prototype.getAttribute=function(t){return this.attributes.get(t)},i.prototype.getAttributesHash=function(){return this.attributes},i.prototype.getAttributes=function(){return this.attributes.toObject()},i.prototype.getCommonAttributes=function(){var t,e,n;return(n=pieceList.getPieceAtIndex(0))?(t=n.attributes,e=t.getKeys(),pieceList.eachPiece(function(n){return e=t.getKeysCommonToHash(n.attributes),t=t.slice(e)}),t.toObject()):{}},i.prototype.hasAttribute=function(t){return this.attributes.has(t)},i.prototype.hasSameStringValueAsPiece=function(t){return null!=t&&this.toString()===t.toString()},i.prototype.hasSameAttributesAsPiece=function(t){return null!=t&&(this.attributes===t.attributes||this.attributes.isEqualTo(t.attributes))},i.prototype.isBlockBreak=function(){return!1},i.prototype.isEqualTo=function(t){return i.__super__.isEqualTo.apply(this,arguments)||this.hasSameConstructorAs(t)&&this.hasSameStringValueAsPiece(t)&&this.hasSameAttributesAsPiece(t)},i.prototype.isEmpty=function(){return 0===this.length},i.prototype.isSerializable=function(){return!0},i.prototype.toJSON=function(){return{type:this.constructor.type,attributes:this.getAttributes()}},i.prototype.contentsForInspection=function(){return{type:this.constructor.type,attributes:this.attributes.inspect()}},i.prototype.canBeGrouped=function(){return this.hasAttribute(\"href\")},i.prototype.canBeGroupedWith=function(t){return this.getAttribute(\"href\")===t.getAttribute(\"href\")},i.prototype.getLength=function(){return this.length},i.prototype.canBeConsolidatedWith=function(){return!1},i}(e.Object)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.Piece.registerType(\"attachment\",e.AttachmentPiece=function(n){function i(t){this.attachment=t,i.__super__.constructor.apply(this,arguments),this.length=1,this.ensureAttachmentExclusivelyHasAttribute(\"href\"),this.attachment.hasContent()||this.removeProhibitedAttributes()}return t(i,n),i.fromJSON=function(t){return new this(e.Attachment.fromJSON(t.attachment),t.attributes)},i.permittedAttributes=[\"caption\",\"presentation\"],i.prototype.ensureAttachmentExclusivelyHasAttribute=function(t){return this.hasAttribute(t)?(this.attachment.hasAttribute(t)||this.attachment.setAttributes(this.attributes.slice(t)),this.attributes=this.attributes.remove(t)):void 0},i.prototype.removeProhibitedAttributes=function(){var t;return t=this.attributes.slice(this.constructor.permittedAttributes),t.isEqualTo(this.attributes)?void 0:this.attributes=t},i.prototype.getValue=function(){return this.attachment},i.prototype.isSerializable=function(){return!this.attachment.isPending()},i.prototype.getCaption=function(){var t;return null!=(t=this.attributes.get(\"caption\"))?t:\"\"},i.prototype.isEqualTo=function(t){var e;return i.__super__.isEqualTo.apply(this,arguments)&&this.attachment.id===(null!=t&&null!=(e=t.attachment)?e.id:void 0)},i.prototype.toString=function(){return e.OBJECT_REPLACEMENT_CHARACTER},i.prototype.toJSON=function(){var t;return t=i.__super__.toJSON.apply(this,arguments),t.attachment=this.attachment,t},i.prototype.getCacheKey=function(){return[i.__super__.getCacheKey.apply(this,arguments),this.attachment.getCacheKey()].join(\"/\")},i.prototype.toConsole=function(){return JSON.stringify(this.toString())},i}(e.Piece))}.call(this),function(){var t,n=function(t,e){function n(){this.constructor=t}for(var o in e)i.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},i={}.hasOwnProperty;t=e.normalizeNewlines,e.Piece.registerType(\"string\",e.StringPiece=function(e){function i(e){i.__super__.constructor.apply(this,arguments),this.string=t(e),this.length=this.string.length}return n(i,e),i.fromJSON=function(t){return new this(t.string,t.attributes)},i.prototype.getValue=function(){return this.string},i.prototype.toString=function(){return this.string.toString()},i.prototype.isBlockBreak=function(){return\"\\n\"===this.toString()&&this.getAttribute(\"blockBreak\")===!0},i.prototype.toJSON=function(){var t;return t=i.__super__.toJSON.apply(this,arguments),t.string=this.string,t},i.prototype.canBeConsolidatedWith=function(t){return null!=t&&this.hasSameConstructorAs(t)&&this.hasSameAttributesAsPiece(t)},i.prototype.consolidateWith=function(t){return new this.constructor(this.toString()+t.toString(),this.attributes)},i.prototype.splitAtOffset=function(t){var e,n;return 0===t?(e=null,n=this):t===this.length?(e=this,n=null):(e=new this.constructor(this.string.slice(0,t),this.attributes),n=new this.constructor(this.string.slice(t),this.attributes)),[e,n]},i.prototype.toConsole=function(){var t;return t=this.string,t.length>15&&(t=t.slice(0,14)+\"\\u2026\"),JSON.stringify(t.toString())},i}(e.Piece))}.call(this),function(){var t,n=function(t,e){function n(){this.constructor=t}for(var o in e)i.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},i={}.hasOwnProperty,o=[].slice;t=e.spliceArray,e.SplittableList=function(e){function i(t){null==t&&(t=[]),i.__super__.constructor.apply(this,arguments),this.objects=t.slice(0),this.length=this.objects.length}var r,s,a;return n(i,e),i.box=function(t){return t instanceof this?t:new this(t)},i.prototype.indexOf=function(t){return this.objects.indexOf(t)},i.prototype.splice=function(){var e;return e=1<=arguments.length?o.call(arguments,0):[],new this.constructor(t.apply(null,[this.objects].concat(o.call(e))))},i.prototype.eachObject=function(t){var e,n,i,o,r,s;for(r=this.objects,s=[],n=e=0,i=r.length;i>e;n=++e)o=r[n],s.push(t(o,n));return s},i.prototype.insertObjectAtIndex=function(t,e){return this.splice(e,0,t)},i.prototype.insertSplittableListAtIndex=function(t,e){return this.splice.apply(this,[e,0].concat(o.call(t.objects)))},i.prototype.insertSplittableListAtPosition=function(t,e){var n,i,o;return o=this.splitObjectAtPosition(e),i=o[0],n=o[1],new this.constructor(i).insertSplittableListAtIndex(t,n)},i.prototype.editObjectAtIndex=function(t,e){return this.replaceObjectAtIndex(e(this.objects[t]),t)},i.prototype.replaceObjectAtIndex=function(t,e){return this.splice(e,1,t)},i.prototype.removeObjectAtIndex=function(t){return this.splice(t,1)},i.prototype.getObjectAtIndex=function(t){return this.objects[t]},i.prototype.getSplittableListInRange=function(t){var e,n,i,o;return i=this.splitObjectsAtRange(t),n=i[0],e=i[1],o=i[2],new this.constructor(n.slice(e,o+1))},i.prototype.selectSplittableList=function(t){var e,n;return n=function(){var n,i,o,r;for(o=this.objects,r=[],n=0,i=o.length;i>n;n++)e=o[n],t(e)&&r.push(e);return r}.call(this),new this.constructor(n)},i.prototype.removeObjectsInRange=function(t){var e,n,i,o;return i=this.splitObjectsAtRange(t),n=i[0],e=i[1],o=i[2],new this.constructor(n).splice(e,o-e+1)},i.prototype.transformObjectsInRange=function(t,e){var n,i,o,r,s,a,u;return s=this.splitObjectsAtRange(t),r=s[0],i=s[1],a=s[2],u=function(){var t,s,u;for(u=[],n=t=0,s=r.length;s>t;n=++t)o=r[n],u.push(n>=i&&a>=n?e(o):o);return u}(),new this.constructor(u)},i.prototype.splitObjectsAtRange=function(t){var e,n,i,o,s,u;return o=this.splitObjectAtPosition(a(t)),n=o[0],e=o[1],i=o[2],s=new this.constructor(n).splitObjectAtPosition(r(t)+i),n=s[0],u=s[1],[n,e,u-1]},i.prototype.getObjectAtPosition=function(t){var e,n,i;return i=this.findIndexAndOffsetAtPosition(t),e=i.index,n=i.offset,this.objects[e]},i.prototype.splitObjectAtPosition=function(t){var e,n,i,o,r,s,a,u,c,l;return s=this.findIndexAndOffsetAtPosition(t),e=s.index,r=s.offset,o=this.objects.slice(0),null!=e?0===r?(c=e,l=0):(i=this.getObjectAtIndex(e),a=i.splitAtOffset(r),n=a[0],u=a[1],o.splice(e,1,n,u),c=e+1,l=n.getLength()-r):(c=o.length,l=0),[o,c,l]},i.prototype.consolidate=function(){var t,e,n,i,o,r;for(i=[],o=this.objects[0],r=this.objects.slice(1),t=0,e=r.length;e>t;t++)n=r[t],(\"function\"==typeof o.canBeConsolidatedWith?o.canBeConsolidatedWith(n):void 0)?o=o.consolidateWith(n):(i.push(o),o=n);return null!=o&&i.push(o),new this.constructor(i)},i.prototype.consolidateFromIndexToIndex=function(t,e){var n,i,r;return i=this.objects.slice(0),r=i.slice(t,e+1),n=new this.constructor(r).consolidate().toArray(),this.splice.apply(this,[t,r.length].concat(o.call(n)))},i.prototype.findIndexAndOffsetAtPosition=function(t){var e,n,i,o,r,s,a;for(e=0,a=this.objects,i=n=0,o=a.length;o>n;i=++n){if(s=a[i],r=e+s.getLength(),t>=e&&r>t)return{index:i,offset:t-e};e=r}return{index:null,offset:null}},i.prototype.findPositionAtIndexAndOffset=function(t,e){var n,i,o,r,s,a;for(s=0,a=this.objects,n=i=0,o=a.length;o>i;n=++i)if(r=a[n],t>n)s+=r.getLength();else if(n===t){s+=e;break}return s},i.prototype.getEndPosition=function(){var t,e;return null!=this.endPosition?this.endPosition:this.endPosition=function(){var n,i,o;for(e=0,o=this.objects,n=0,i=o.length;i>n;n++)t=o[n],e+=t.getLength();return e}.call(this)},i.prototype.toString=function(){return this.objects.join(\"\")},i.prototype.toArray=function(){return this.objects.slice(0)},i.prototype.toJSON=function(){return this.toArray()},i.prototype.isEqualTo=function(t){return i.__super__.isEqualTo.apply(this,arguments)||s(this.objects,null!=t?t.objects:void 0)},s=function(t,e){var n,i,o,r,s;if(null==e&&(e=[]),t.length!==e.length)return!1;for(s=!0,i=n=0,o=t.length;o>n;i=++n)r=t[i],s&&!r.isEqualTo(e[i])&&(s=!1);return s},i.prototype.contentsForInspection=function(){var t;return{objects:\"[\"+function(){var e,n,i,o;for(i=this.objects,o=[],e=0,n=i.length;n>e;e++)t=i[e],o.push(t.inspect());return o}.call(this).join(\", \")+\"]\"}},a=function(t){return t[0]},r=function(t){return t[1]},i}(e.Object)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.Text=function(n){function i(t){var n;null==t&&(t=[]),i.__super__.constructor.apply(this,arguments),this.pieceList=new e.SplittableList(function(){var e,i,o;for(o=[],e=0,i=t.length;i>e;e++)n=t[e],n.isEmpty()||o.push(n);return o}())}return t(i,n),i.textForAttachmentWithAttributes=function(t,n){var i;return i=new e.AttachmentPiece(t,n),new this([i])},i.textForStringWithAttributes=function(t,n){var i;return i=new e.StringPiece(t,n),new this([i])},i.fromJSON=function(t){var n,i;return i=function(){var i,o,r;for(r=[],i=0,o=t.length;o>i;i++)n=t[i],r.push(e.Piece.fromJSON(n));return r}(),new this(i)},i.prototype.copy=function(){return this.copyWithPieceList(this.pieceList)},i.prototype.copyWithPieceList=function(t){return new this.constructor(t.consolidate().toArray())},i.prototype.copyUsingObjectMap=function(t){var e,n;return n=function(){var n,i,o,r,s;for(o=this.getPieces(),s=[],n=0,i=o.length;i>n;n++)e=o[n],s.push(null!=(r=t.find(e))?r:e);return s}.call(this),new this.constructor(n)},i.prototype.appendText=function(t){return this.insertTextAtPosition(t,this.getLength())},i.prototype.insertTextAtPosition=function(t,e){return this.copyWithPieceList(this.pieceList.insertSplittableListAtPosition(t.pieceList,e))\n},i.prototype.removeTextAtRange=function(t){return this.copyWithPieceList(this.pieceList.removeObjectsInRange(t))},i.prototype.replaceTextAtRange=function(t,e){return this.removeTextAtRange(e).insertTextAtPosition(t,e[0])},i.prototype.moveTextFromRangeToPosition=function(t,e){var n,i;if(!(t[0]<=e&&e<=t[1]))return i=this.getTextAtRange(t),n=i.getLength(),t[0]<e&&(e-=n),this.removeTextAtRange(t).insertTextAtPosition(i,e)},i.prototype.addAttributeAtRange=function(t,e,n){var i;return i={},i[t]=e,this.addAttributesAtRange(i,n)},i.prototype.addAttributesAtRange=function(t,e){return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e,function(e){return e.copyWithAdditionalAttributes(t)}))},i.prototype.removeAttributeAtRange=function(t,e){return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e,function(e){return e.copyWithoutAttribute(t)}))},i.prototype.setAttributesAtRange=function(t,e){return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e,function(e){return e.copyWithAttributes(t)}))},i.prototype.getAttributesAtPosition=function(t){var e,n;return null!=(e=null!=(n=this.pieceList.getObjectAtPosition(t))?n.getAttributes():void 0)?e:{}},i.prototype.getCommonAttributes=function(){var t,n;return t=function(){var t,e,i,o;for(i=this.pieceList.toArray(),o=[],t=0,e=i.length;e>t;t++)n=i[t],o.push(n.getAttributes());return o}.call(this),e.Hash.fromCommonAttributesOfObjects(t).toObject()},i.prototype.getCommonAttributesAtRange=function(t){var e;return null!=(e=this.getTextAtRange(t).getCommonAttributes())?e:{}},i.prototype.getExpandedRangeForAttributeAtOffset=function(t,e){var n,i,o;for(n=o=e,i=this.getLength();n>0&&this.getCommonAttributesAtRange([n-1,o])[t];)n--;for(;i>o&&this.getCommonAttributesAtRange([e,o+1])[t];)o++;return[n,o]},i.prototype.getTextAtRange=function(t){return this.copyWithPieceList(this.pieceList.getSplittableListInRange(t))},i.prototype.getStringAtRange=function(t){return this.pieceList.getSplittableListInRange(t).toString()},i.prototype.getStringAtPosition=function(t){return this.getStringAtRange([t,t+1])},i.prototype.startsWithString=function(t){return this.getStringAtRange([0,t.length])===t},i.prototype.endsWithString=function(t){var e;return e=this.getLength(),this.getStringAtRange([e-t.length,e])===t},i.prototype.getAttachmentPieces=function(){var t,e,n,i,o;for(i=this.pieceList.toArray(),o=[],t=0,e=i.length;e>t;t++)n=i[t],null!=n.attachment&&o.push(n);return o},i.prototype.getAttachments=function(){var t,e,n,i,o;for(i=this.getAttachmentPieces(),o=[],t=0,e=i.length;e>t;t++)n=i[t],o.push(n.attachment);return o},i.prototype.getAttachmentAndPositionById=function(t){var e,n,i,o,r,s;for(o=0,r=this.pieceList.toArray(),e=0,n=r.length;n>e;e++){if(i=r[e],(null!=(s=i.attachment)?s.id:void 0)===t)return{attachment:i.attachment,position:o};o+=i.length}return{attachment:null,position:null}},i.prototype.getAttachmentById=function(t){var e,n,i;return i=this.getAttachmentAndPositionById(t),e=i.attachment,n=i.position,e},i.prototype.getRangeOfAttachment=function(t){var e,n;return n=this.getAttachmentAndPositionById(t.id),t=n.attachment,e=n.position,null!=t?[e,e+1]:void 0},i.prototype.updateAttributesForAttachment=function(t,e){var n;return(n=this.getRangeOfAttachment(e))?this.addAttributesAtRange(t,n):this},i.prototype.getLength=function(){return this.pieceList.getEndPosition()},i.prototype.isEmpty=function(){return 0===this.getLength()},i.prototype.isEqualTo=function(t){var e;return i.__super__.isEqualTo.apply(this,arguments)||(null!=t&&null!=(e=t.pieceList)?e.isEqualTo(this.pieceList):void 0)},i.prototype.isBlockBreak=function(){return 1===this.getLength()&&this.pieceList.getObjectAtIndex(0).isBlockBreak()},i.prototype.eachPiece=function(t){return this.pieceList.eachObject(t)},i.prototype.getPieces=function(){return this.pieceList.toArray()},i.prototype.getPieceAtPosition=function(t){return this.pieceList.getObjectAtPosition(t)},i.prototype.contentsForInspection=function(){return{pieceList:this.pieceList.inspect()}},i.prototype.toSerializableText=function(){var t;return t=this.pieceList.selectSplittableList(function(t){return t.isSerializable()}),this.copyWithPieceList(t)},i.prototype.toString=function(){return this.pieceList.toString()},i.prototype.toJSON=function(){return this.pieceList.toJSON()},i.prototype.toConsole=function(){var t;return JSON.stringify(function(){var e,n,i,o;for(i=this.pieceList.toArray(),o=[],e=0,n=i.length;n>e;e++)t=i[e],o.push(JSON.parse(t.toConsole()));return o}.call(this))},i.prototype.getDirection=function(){return e.getDirection(this.toString())},i.prototype.isRTL=function(){return\"rtl\"===this.getDirection()},i}(e.Object)}.call(this),function(){var t,n,i,o,r,s=function(t,e){function n(){this.constructor=t}for(var i in e)a.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},a={}.hasOwnProperty,u=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1},c=[].slice;t=e.arraysAreEqual,r=e.spliceArray,i=e.getBlockConfig,n=e.getBlockAttributeNames,o=e.getListAttributeNames,e.Block=function(n){function a(t,n){null==t&&(t=new e.Text),null==n&&(n=[]),a.__super__.constructor.apply(this,arguments),this.text=h(t),this.attributes=n}var l,h,p,d,f,g,m,v,y;return s(a,n),a.fromJSON=function(t){var n;return n=e.Text.fromJSON(t.text),new this(n,t.attributes)},a.prototype.isEmpty=function(){return this.text.isBlockBreak()},a.prototype.isEqualTo=function(e){return a.__super__.isEqualTo.apply(this,arguments)||this.text.isEqualTo(null!=e?e.text:void 0)&&t(this.attributes,null!=e?e.attributes:void 0)},a.prototype.copyWithText=function(t){return new this.constructor(t,this.attributes)},a.prototype.copyWithoutText=function(){return this.copyWithText(null)},a.prototype.copyWithAttributes=function(t){return new this.constructor(this.text,t)},a.prototype.copyWithoutAttributes=function(){return this.copyWithAttributes(null)},a.prototype.copyUsingObjectMap=function(t){var e;return this.copyWithText((e=t.find(this.text))?e:this.text.copyUsingObjectMap(t))},a.prototype.addAttribute=function(t){var e;return e=this.attributes.concat(d(t)),this.copyWithAttributes(e)},a.prototype.removeAttribute=function(t){var e,n;return n=i(t).listAttribute,e=g(g(this.attributes,t),n),this.copyWithAttributes(e)},a.prototype.removeLastAttribute=function(){return this.removeAttribute(this.getLastAttribute())},a.prototype.getLastAttribute=function(){return f(this.attributes)},a.prototype.getAttributes=function(){return this.attributes.slice(0)},a.prototype.getAttributeLevel=function(){return this.attributes.length},a.prototype.getAttributeAtLevel=function(t){return this.attributes[t-1]},a.prototype.hasAttribute=function(t){return u.call(this.attributes,t)>=0},a.prototype.hasAttributes=function(){return this.getAttributeLevel()>0},a.prototype.getLastNestableAttribute=function(){return f(this.getNestableAttributes())},a.prototype.getNestableAttributes=function(){var t,e,n,o,r;for(o=this.attributes,r=[],e=0,n=o.length;n>e;e++)t=o[e],i(t).nestable&&r.push(t);return r},a.prototype.getNestingLevel=function(){return this.getNestableAttributes().length},a.prototype.decreaseNestingLevel=function(){var t;return(t=this.getLastNestableAttribute())?this.removeAttribute(t):this},a.prototype.increaseNestingLevel=function(){var t,e,n;return(t=this.getLastNestableAttribute())?(n=this.attributes.lastIndexOf(t),e=r.apply(null,[this.attributes,n+1,0].concat(c.call(d(t)))),this.copyWithAttributes(e)):this},a.prototype.getListItemAttributes=function(){var t,e,n,o,r;for(o=this.attributes,r=[],e=0,n=o.length;n>e;e++)t=o[e],i(t).listAttribute&&r.push(t);return r},a.prototype.isListItem=function(){var t;return null!=(t=i(this.getLastAttribute()))?t.listAttribute:void 0},a.prototype.isTerminalBlock=function(){var t;return null!=(t=i(this.getLastAttribute()))?t.terminal:void 0},a.prototype.breaksOnReturn=function(){var t;return null!=(t=i(this.getLastAttribute()))?t.breakOnReturn:void 0},a.prototype.findLineBreakInDirectionFromPosition=function(t,e){var n,i;return i=this.toString(),n=function(){switch(t){case\"forward\":return i.indexOf(\"\\n\",e);case\"backward\":return i.slice(0,e).lastIndexOf(\"\\n\")}}(),-1!==n?n:void 0},a.prototype.contentsForInspection=function(){return{text:this.text.inspect(),attributes:this.attributes}},a.prototype.toString=function(){return this.text.toString()},a.prototype.toJSON=function(){return{text:this.text,attributes:this.attributes}},a.prototype.getDirection=function(){return this.text.getDirection()},a.prototype.isRTL=function(){return this.text.isRTL()},a.prototype.getLength=function(){return this.text.getLength()},a.prototype.canBeConsolidatedWith=function(t){return!this.hasAttributes()&&!t.hasAttributes()&&this.getDirection()===t.getDirection()},a.prototype.consolidateWith=function(t){var n,i;return n=e.Text.textForStringWithAttributes(\"\\n\"),i=this.getTextWithoutBlockBreak().appendText(n),this.copyWithText(i.appendText(t.text))},a.prototype.splitAtOffset=function(t){var e,n;return 0===t?(e=null,n=this):t===this.getLength()?(e=this,n=null):(e=this.copyWithText(this.text.getTextAtRange([0,t])),n=this.copyWithText(this.text.getTextAtRange([t,this.getLength()]))),[e,n]},a.prototype.getBlockBreakPosition=function(){return this.text.getLength()-1},a.prototype.getTextWithoutBlockBreak=function(){return m(this.text)?this.text.getTextAtRange([0,this.getBlockBreakPosition()]):this.text.copy()},a.prototype.canBeGrouped=function(t){return this.attributes[t]},a.prototype.canBeGroupedWith=function(t,e){var n,r,s,a;return s=t.getAttributes(),r=s[e],n=this.attributes[e],!(n!==r||i(n).group===!1&&(a=s[e+1],u.call(o(),a)<0)||this.getDirection()!==t.getDirection()&&!t.isEmpty())},h=function(t){return t=y(t),t=l(t)},y=function(t){var n,i,o,r,s,a;return r=!1,a=t.getPieces(),i=2<=a.length?c.call(a,0,n=a.length-1):(n=0,[]),o=a[n++],null==o?t:(i=function(){var t,e,n;for(n=[],t=0,e=i.length;e>t;t++)s=i[t],s.isBlockBreak()?(r=!0,n.push(v(s))):n.push(s);return n}(),r?new e.Text(c.call(i).concat([o])):t)},p=e.Text.textForStringWithAttributes(\"\\n\",{blockBreak:!0}),l=function(t){return m(t)?t:t.appendText(p)},m=function(t){var e,n;return n=t.getLength(),0===n?!1:(e=t.getTextAtRange([n-1,n]),e.isBlockBreak())},v=function(t){return t.copyWithoutAttribute(\"blockBreak\")},d=function(t){var e;return e=i(t).listAttribute,null!=e?[e,t]:[t]},f=function(t){return t.slice(-1)[0]},g=function(t,e){var n;return n=t.lastIndexOf(e),-1===n?t:r(t,n,1)},a}(e.Object)}.call(this),function(){var t,n,i,o=function(t,e){function n(){this.constructor=t}for(var i in e)r.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty,s=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1},a=[].slice;n=e.tagName,i=e.walkTree,t=e.nodeIsAttachmentElement,e.HTMLSanitizer=function(r){function u(t,e){var n;n=null!=e?e:{},this.allowedAttributes=n.allowedAttributes,this.forbiddenProtocols=n.forbiddenProtocols,this.forbiddenElements=n.forbiddenElements,null==this.allowedAttributes&&(this.allowedAttributes=c),null==this.forbiddenProtocols&&(this.forbiddenProtocols=h),null==this.forbiddenElements&&(this.forbiddenElements=l),this.body=p(t)}var c,l,h,p;return o(u,r),c=\"style href src width height class\".split(\" \"),h=\"javascript:\".split(\" \"),l=\"script iframe form noscript embed math\".split(\" \"),u.setHTML=function(t,e){var n,i,o;return o=new this(e),n=o.sanitize(),i=null!=n.getHTML?n.getHTML():n.outerHTML,t.innerHTML=i},u.sanitize=function(t,e){var n;return n=new this(t,e),n.sanitize(),n},u.prototype.sanitize=function(){return this.sanitizeElements(),this.normalizeListElementNesting()},u.prototype.getHTML=function(){return this.body.innerHTML},u.prototype.getBody=function(){return this.body},u.prototype.sanitizeElements=function(){var t,n,o,r,s;for(s=i(this.body),r=[];s.nextNode();)switch(o=s.currentNode,o.nodeType){case Node.ELEMENT_NODE:this.elementIsRemovable(o)?r.push(o):this.sanitizeElement(o);break;case Node.COMMENT_NODE:r.push(o)}for(t=0,n=r.length;n>t;t++)o=r[t],e.removeNode(o);return this.body},u.prototype.sanitizeElement=function(t){var e,n,i,o,r;for(t.hasAttribute(\"href\")&&(o=t.protocol,s.call(this.forbiddenProtocols,o)>=0&&t.removeAttribute(\"href\")),r=a.call(t.attributes),e=0,n=r.length;n>e;e++)i=r[e].name,s.call(this.allowedAttributes,i)>=0||0===i.indexOf(\"data-trix\")||t.removeAttribute(i);return t},u.prototype.normalizeListElementNesting=function(){var t,e,i,o,r;for(r=a.call(this.body.querySelectorAll(\"ul,ol\")),t=0,e=r.length;e>t;t++)i=r[t],(o=i.previousElementSibling)&&\"li\"===n(o)&&o.appendChild(i);return this.body},u.prototype.elementIsRemovable=function(t){return(null!=t?t.nodeType:void 0)===Node.ELEMENT_NODE?this.elementIsForbidden(t)||this.elementIsntSerializable(t):void 0},u.prototype.elementIsForbidden=function(t){var e;return e=n(t),s.call(this.forbiddenElements,e)>=0},u.prototype.elementIsntSerializable=function(e){return\"false\"===e.getAttribute(\"data-trix-serialize\")&&!t(e)},p=function(t){var e,n,i,o,r;for(null==t&&(t=\"\"),t=t.replace(/<\\/html[^>]*>[^]*$/i,\"</html>\"),e=document.implementation.createHTMLDocument(\"\"),e.documentElement.innerHTML=t,r=e.head.querySelectorAll(\"style\"),i=0,o=r.length;o>i;i++)n=r[i],e.body.appendChild(n);return e.body},u}(e.BasicObject)}.call(this),function(){var t,n,i,o,r,s,a,u,c,l,h,p=function(t,e){function n(){this.constructor=t}for(var i in e)d.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},d={}.hasOwnProperty,f=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1};t=e.arraysAreEqual,s=e.makeElement,l=e.tagName,r=e.getBlockTagNames,h=e.walkTree,o=e.findClosestElementFromNode,i=e.elementContainsNode,a=e.nodeIsAttachmentElement,u=e.normalizeSpaces,n=e.breakableWhitespacePattern,c=e.squishBreakableWhitespace,e.HTMLParser=function(d){function g(t,e){this.html=t,this.referenceElement=(null!=e?e:{}).referenceElement,this.blocks=[],this.blockElements=[],this.processedElements=[]}var m,v,y,b,A,C,x,w,E,S,R,k;return p(g,d),g.parse=function(t,e){var n;return n=new this(t,e),n.parse(),n},g.prototype.getDocument=function(){return e.Document.fromJSON(this.blocks)},g.prototype.parse=function(){var t;try{for(this.createHiddenContainer(),e.HTMLSanitizer.setHTML(this.containerElement,this.html),t=h(this.containerElement,{usingFilter:x});t.nextNode();)this.processNode(t.currentNode);return this.translateBlockElementMarginsToNewlines()}finally{this.removeHiddenContainer()}},g.prototype.createHiddenContainer=function(){return this.referenceElement?(this.containerElement=this.referenceElement.cloneNode(!1),this.containerElement.removeAttribute(\"id\"),this.containerElement.setAttribute(\"data-trix-internal\",\"\"),this.containerElement.style.display=\"none\",this.referenceElement.parentNode.insertBefore(this.containerElement,this.referenceElement.nextSibling)):(this.containerElement=s({tagName:\"div\",style:{display:\"none\"}}),document.body.appendChild(this.containerElement))},g.prototype.removeHiddenContainer=function(){return e.removeNode(this.containerElement)},x=function(t){return\"style\"===l(t)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},g.prototype.processNode=function(t){switch(t.nodeType){case Node.TEXT_NODE:if(!this.isInsignificantTextNode(t))return this.appendBlockForTextNode(t),this.processTextNode(t);break;case Node.ELEMENT_NODE:return this.appendBlockForElement(t),this.processElement(t)}},g.prototype.appendBlockForTextNode=function(e){var n,i,o;return i=e.parentNode,i===this.currentBlockElement&&this.isBlockElement(e.previousSibling)?this.appendStringWithAttributes(\"\\n\"):i!==this.containerElement&&!this.isBlockElement(i)||(n=this.getBlockAttributes(i),t(n,null!=(o=this.currentBlock)?o.attributes:void 0))?void 0:(this.currentBlock=this.appendBlockForAttributesWithElement(n,i),this.currentBlockElement=i)},g.prototype.appendBlockForElement=function(e){var n,o,r,s;if(r=this.isBlockElement(e),o=i(this.currentBlockElement,e),r&&!this.isBlockElement(e.firstChild)){if((!this.isInsignificantTextNode(e.firstChild)||!this.isBlockElement(e.firstElementChild))&&(n=this.getBlockAttributes(e),e.firstChild))return o&&t(n,this.currentBlock.attributes)?this.appendStringWithAttributes(\"\\n\"):(this.currentBlock=this.appendBlockForAttributesWithElement(n,e),this.currentBlockElement=e)}else if(this.currentBlockElement&&!o&&!r)return(s=this.findParentBlockElement(e))?this.appendBlockForElement(s):(this.currentBlock=this.appendEmptyBlock(),this.currentBlockElement=null)},g.prototype.findParentBlockElement=function(t){var e;for(e=t.parentElement;e&&e!==this.containerElement;){if(this.isBlockElement(e)&&f.call(this.blockElements,e)>=0)return e;e=e.parentElement}return null},g.prototype.processTextNode=function(t){var e,n;return n=t.data,v(t.parentNode)||(n=c(n),R(null!=(e=t.previousSibling)?e.textContent:void 0)&&(n=A(n))),this.appendStringWithAttributes(n,this.getTextAttributes(t.parentNode))},g.prototype.processElement=function(t){var e,n,i,o,r;if(a(t))return e=w(t,\"attachment\"),Object.keys(e).length&&(o=this.getTextAttributes(t),this.appendAttachmentWithAttributes(e,o),t.innerHTML=\"\"),this.processedElements.push(t);switch(l(t)){case\"br\":return this.isExtraBR(t)||this.isBlockElement(t.nextSibling)||this.appendStringWithAttributes(\"\\n\",this.getTextAttributes(t)),this.processedElements.push(t);case\"img\":e={url:t.getAttribute(\"src\"),contentType:\"image\"},i=b(t);for(n in i)r=i[n],e[n]=r;return this.appendAttachmentWithAttributes(e,this.getTextAttributes(t)),this.processedElements.push(t);case\"tr\":if(t.parentNode.firstChild!==t)return this.appendStringWithAttributes(\"\\n\");break;case\"td\":if(t.parentNode.firstChild!==t)return this.appendStringWithAttributes(\" | \")}},g.prototype.appendBlockForAttributesWithElement=function(t,e){var n;return this.blockElements.push(e),n=m(t),this.blocks.push(n),n},g.prototype.appendEmptyBlock=function(){return this.appendBlockForAttributesWithElement([],null)},g.prototype.appendStringWithAttributes=function(t,e){return this.appendPiece(S(t,e))},g.prototype.appendAttachmentWithAttributes=function(t,e){return this.appendPiece(E(t,e))},g.prototype.appendPiece=function(t){return 0===this.blocks.length&&this.appendEmptyBlock(),this.blocks[this.blocks.length-1].text.push(t)},g.prototype.appendStringToTextAtIndex=function(t,e){var n,i;return i=this.blocks[e].text,n=i[i.length-1],\"string\"===(null!=n?n.type:void 0)?n.string+=t:i.push(S(t))},g.prototype.prependStringToTextAtIndex=function(t,e){var n,i;return i=this.blocks[e].text,n=i[0],\"string\"===(null!=n?n.type:void 0)?n.string=t+n.string:i.unshift(S(t))},S=function(t,e){var n;return null==e&&(e={}),n=\"string\",t=u(t),{string:t,attributes:e,type:n}},E=function(t,e){var n;return null==e&&(e={}),n=\"attachment\",{attachment:t,attributes:e,type:n}},m=function(t){var e;return null==t&&(t={}),e=[],{text:e,attributes:t}},g.prototype.getTextAttributes=function(t){var n,i,r,s,u,c,l,h,p,d,f,g;r={},p=e.config.textAttributes;for(n in p)if(u=p[n],u.tagName&&o(t,{matchingSelector:u.tagName,untilNode:this.containerElement}))r[n]=!0;else if(u.parser){if(g=u.parser(t)){for(i=!1,d=this.findBlockElementAncestors(t),c=0,h=d.length;h>c;c++)if(s=d[c],u.parser(s)===g){i=!0;break}i||(r[n]=g)}}else u.styleProperty&&(g=t.style[u.styleProperty])&&(r[n]=g);if(a(t)){f=w(t,\"attributes\");for(l in f)g=f[l],r[l]=g}return r},g.prototype.getBlockAttributes=function(t){var n,i,o,r;for(i=[];t&&t!==this.containerElement;){r=e.config.blockAttributes;for(n in r)o=r[n],o.parse!==!1&&l(t)===o.tagName&&((\"function\"==typeof o.test?o.test(t):void 0)||!o.test)&&(i.push(n),o.listAttribute&&i.push(o.listAttribute));t=t.parentNode}return i.reverse()},g.prototype.findBlockElementAncestors=function(t){var e,n;for(e=[];t&&t!==this.containerElement;)n=l(t),f.call(r(),n)>=0&&e.push(t),t=t.parentNode;return e},w=function(t,e){try{return JSON.parse(t.getAttribute(\"data-trix-\"+e))}catch(n){return{}}},b=function(t){var e,n,i;return i=t.getAttribute(\"width\"),n=t.getAttribute(\"height\"),e={},i&&(e.width=parseInt(i,10)),n&&(e.height=parseInt(n,10)),e},g.prototype.isBlockElement=function(t){var e;if((null!=t?t.nodeType:void 0)===Node.ELEMENT_NODE&&!a(t)&&!o(t,{matchingSelector:\"td\",untilNode:this.containerElement}))return e=l(t),f.call(r(),e)>=0||\"block\"===window.getComputedStyle(t).display},g.prototype.isInsignificantTextNode=function(t){var e,n,i;if((null!=t?t.nodeType:void 0)===Node.TEXT_NODE&&k(t.data)&&(n=t.parentNode,i=t.previousSibling,e=t.nextSibling,(!C(n.previousSibling)||this.isBlockElement(n.previousSibling))&&!v(n)))return!i||this.isBlockElement(i)||!e||this.isBlockElement(e)},g.prototype.isExtraBR=function(t){return\"br\"===l(t)&&this.isBlockElement(t.parentNode)&&t.parentNode.lastChild===t},v=function(t){var e;return e=window.getComputedStyle(t).whiteSpace,\"pre\"===e||\"pre-wrap\"===e||\"pre-line\"===e},C=function(t){return t&&!R(t.textContent)},g.prototype.translateBlockElementMarginsToNewlines=function(){var t,e,n,i,o,r,s,a;for(e=this.getMarginOfDefaultBlockElement(),s=this.blocks,a=[],i=n=0,o=s.length;o>n;i=++n)t=s[i],(r=this.getMarginOfBlockElementAtIndex(i))&&(r.top>2*e.top&&this.prependStringToTextAtIndex(\"\\n\",i),a.push(r.bottom>2*e.bottom?this.appendStringToTextAtIndex(\"\\n\",i):void 0));return a},g.prototype.getMarginOfBlockElementAtIndex=function(t){var e,n;return!(e=this.blockElements[t])||!e.textContent||(n=l(e),f.call(r(),n)>=0||f.call(this.processedElements,e)>=0)?void 0:y(e)},g.prototype.getMarginOfDefaultBlockElement=function(){var t;return t=s(e.config.blockAttributes[\"default\"].tagName),this.containerElement.appendChild(t),y(t)},y=function(t){var e;return e=window.getComputedStyle(t),\"block\"===e.display?{top:parseInt(e.marginTop),bottom:parseInt(e.marginBottom)}:void 0},A=function(t){return t.replace(RegExp(\"^\"+n.source+\"+\"),\"\")},k=function(t){return RegExp(\"^\"+n.source+\"*$\").test(t)},R=function(t){return/\\s$/.test(t)},g}(e.BasicObject)}.call(this),function(){var t,n,i,o,r=function(t,e){function n(){this.constructor=t}for(var i in e)s.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},s={}.hasOwnProperty,a=[].slice,u=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1};t=e.arraysAreEqual,i=e.normalizeRange,o=e.rangeIsCollapsed,n=e.getBlockConfig,e.Document=function(s){function c(t){null==t&&(t=[]),c.__super__.constructor.apply(this,arguments),0===t.length&&(t=[new e.Block]),this.blockList=e.SplittableList.box(t)}var l;return r(c,s),c.fromJSON=function(t){var n,i;return i=function(){var i,o,r;for(r=[],i=0,o=t.length;o>i;i++)n=t[i],r.push(e.Block.fromJSON(n));return r}(),new this(i)},c.fromHTML=function(t,n){return e.HTMLParser.parse(t,n).getDocument()},c.fromString=function(t,n){var i;return i=e.Text.textForStringWithAttributes(t,n),new this([new e.Block(i)])},c.prototype.isEmpty=function(){var t;return 1===this.blockList.length&&(t=this.getBlockAtIndex(0),t.isEmpty()&&!t.hasAttributes())},c.prototype.copy=function(t){var e;return null==t&&(t={}),e=t.consolidateBlocks?this.blockList.consolidate().toArray():this.blockList.toArray(),new this.constructor(e)},c.prototype.copyUsingObjectsFromDocument=function(t){var n;return n=new e.ObjectMap(t.getObjects()),this.copyUsingObjectMap(n)},c.prototype.copyUsingObjectMap=function(t){var e,n,i;return n=function(){var n,o,r,s;for(r=this.getBlocks(),s=[],n=0,o=r.length;o>n;n++)e=r[n],s.push((i=t.find(e))?i:e.copyUsingObjectMap(t));return s}.call(this),new this.constructor(n)},c.prototype.copyWithBaseBlockAttributes=function(t){var e,n,i;return null==t&&(t=[]),i=function(){var i,o,r,s;for(r=this.getBlocks(),s=[],i=0,o=r.length;o>i;i++)n=r[i],e=t.concat(n.getAttributes()),s.push(n.copyWithAttributes(e));return s}.call(this),new this.constructor(i)},c.prototype.replaceBlock=function(t,e){var n;return n=this.blockList.indexOf(t),-1===n?this:new this.constructor(this.blockList.replaceObjectAtIndex(e,n))},c.prototype.insertDocumentAtRange=function(t,e){var n,r,s,a,u,c,l;return r=t.blockList,u=(e=i(e))[0],c=this.locationFromPosition(u),s=c.index,a=c.offset,l=this,n=this.getBlockAtPosition(u),o(e)&&n.isEmpty()&&!n.hasAttributes()?l=new this.constructor(l.blockList.removeObjectAtIndex(s)):n.getBlockBreakPosition()===a&&u++,l=l.removeTextAtRange(e),new this.constructor(l.blockList.insertSplittableListAtPosition(r,u))},c.prototype.mergeDocumentAtRange=function(e,n){var o,r,s,a,u,c,l,h,p,d,f,g;return f=(n=i(n))[0],d=this.locationFromPosition(f),r=this.getBlockAtIndex(d.index).getAttributes(),o=e.getBaseBlockAttributes(),g=r.slice(-o.length),t(o,g)?(l=r.slice(0,-o.length),c=e.copyWithBaseBlockAttributes(l)):c=e.copy({consolidateBlocks:!0}).copyWithBaseBlockAttributes(r),s=c.getBlockCount(),a=c.getBlockAtIndex(0),t(r,a.getAttributes())?(u=a.getTextWithoutBlockBreak(),p=this.insertTextAtRange(u,n),s>1&&(c=new this.constructor(c.getBlocks().slice(1)),h=f+u.getLength(),p=p.insertDocumentAtRange(c,h))):p=this.insertDocumentAtRange(c,n),p},c.prototype.insertTextAtRange=function(t,e){var n,o,r,s,a;return a=(e=i(e))[0],s=this.locationFromPosition(a),o=s.index,r=s.offset,n=this.removeTextAtRange(e),new this.constructor(n.blockList.editObjectAtIndex(o,function(e){return e.copyWithText(e.text.insertTextAtPosition(t,r))}))},c.prototype.removeTextAtRange=function(t){var e,n,r,s,a,u,c,l,h,p,d,f,g,m,v,y,b,A,C,x,w;return p=t=i(t),l=p[0],A=p[1],o(t)?this:(d=this.locationRangeFromRange(t),u=d[0],y=d[1],a=u.index,c=u.offset,s=this.getBlockAtIndex(a),v=y.index,b=y.offset,m=this.getBlockAtIndex(v),f=A-l===1&&s.getBlockBreakPosition()===c&&m.getBlockBreakPosition()!==b&&\"\\n\"===m.text.getStringAtPosition(b),f?r=this.blockList.editObjectAtIndex(v,function(t){return t.copyWithText(t.text.removeTextAtRange([b,b+1]))}):(h=s.text.getTextAtRange([0,c]),C=m.text.getTextAtRange([b,m.getLength()]),x=h.appendText(C),g=a!==v&&0===c,w=g&&s.getAttributeLevel()>=m.getAttributeLevel(),n=w?m.copyWithText(x):s.copyWithText(x),e=v+1-a,r=this.blockList.splice(a,e,n)),new this.constructor(r))},c.prototype.moveTextFromRangeToPosition=function(t,e){var n,o,r,s,u,c,l,h,p,d;return c=t=i(t),p=c[0],r=c[1],e>=p&&r>=e?this:(o=this.getDocumentAtRange(t),h=this.removeTextAtRange(t),u=e>p,u&&(e-=o.getLength()),l=o.getBlocks(),s=l[0],n=2<=l.length?a.call(l,1):[],0===n.length?(d=s.getTextWithoutBlockBreak(),u&&(e+=1)):d=s.text,h=h.insertTextAtRange(d,e),0===n.length?h:(o=new this.constructor(n),e+=d.getLength(),h.insertDocumentAtRange(o,e)))},c.prototype.addAttributeAtRange=function(t,e,i){var o;return o=this.blockList,this.eachBlockAtRange(i,function(i,r,s){return o=o.editObjectAtIndex(s,function(){return n(t)?i.addAttribute(t,e):r[0]===r[1]?i:i.copyWithText(i.text.addAttributeAtRange(t,e,r))})}),new this.constructor(o)},c.prototype.addAttribute=function(t,e){var n;return n=this.blockList,this.eachBlock(function(i,o){return n=n.editObjectAtIndex(o,function(){return i.addAttribute(t,e)})}),new this.constructor(n)},c.prototype.removeAttributeAtRange=function(t,e){var i;return i=this.blockList,this.eachBlockAtRange(e,function(e,o,r){return n(t)?i=i.editObjectAtIndex(r,function(){return e.removeAttribute(t)}):o[0]!==o[1]?i=i.editObjectAtIndex(r,function(){return e.copyWithText(e.text.removeAttributeAtRange(t,o))}):void 0}),new this.constructor(i)},c.prototype.updateAttributesForAttachment=function(t,e){var n,i,o,r;return o=(i=this.getRangeOfAttachment(e))[0],n=this.locationFromPosition(o).index,r=this.getTextAtIndex(n),new this.constructor(this.blockList.editObjectAtIndex(n,function(n){return n.copyWithText(r.updateAttributesForAttachment(t,e))}))},c.prototype.removeAttributeForAttachment=function(t,e){var n;return n=this.getRangeOfAttachment(e),this.removeAttributeAtRange(t,n)},c.prototype.insertBlockBreakAtRange=function(t){var n,o,r,s;return s=(t=i(t))[0],r=this.locationFromPosition(s).offset,o=this.removeTextAtRange(t),0===r&&(n=[new e.Block]),new this.constructor(o.blockList.insertSplittableListAtPosition(new e.SplittableList(n),s))},c.prototype.applyBlockAttributeAtRange=function(t,e,i){var o,r,s,a;return s=this.expandRangeToLineBreaksAndSplitBlocks(i),r=s.document,i=s.range,o=n(t),o.listAttribute?(r=r.removeLastListAttributeAtRange(i,{exceptAttributeName:t}),a=r.convertLineBreaksToBlockBreaksInRange(i),r=a.document,i=a.range):r=o.exclusive?r.removeBlockAttributesAtRange(i):o.terminal?r.removeLastTerminalAttributeAtRange(i):r.consolidateBlocksAtRange(i),r.addAttributeAtRange(t,e,i)},c.prototype.removeLastListAttributeAtRange=function(t,e){var i;return null==e&&(e={}),i=this.blockList,this.eachBlockAtRange(t,function(t,o,r){var s;if((s=t.getLastAttribute())&&n(s).listAttribute&&s!==e.exceptAttributeName)return i=i.editObjectAtIndex(r,function(){return t.removeAttribute(s)})}),new this.constructor(i)},c.prototype.removeLastTerminalAttributeAtRange=function(t){var e;return e=this.blockList,this.eachBlockAtRange(t,function(t,i,o){var r;if((r=t.getLastAttribute())&&n(r).terminal)return e=e.editObjectAtIndex(o,function(){return t.removeAttribute(r)})}),new this.constructor(e)},c.prototype.removeBlockAttributesAtRange=function(t){var e;return e=this.blockList,this.eachBlockAtRange(t,function(t,n,i){return t.hasAttributes()?e=e.editObjectAtIndex(i,function(){return t.copyWithoutAttributes()}):void 0}),new this.constructor(e)},c.prototype.expandRangeToLineBreaksAndSplitBlocks=function(t){var e,n,o,r,s,a,u,c,l;return a=t=i(t),l=a[0],r=a[1],c=this.locationFromPosition(l),o=this.locationFromPosition(r),e=this,u=e.getBlockAtIndex(c.index),null!=(c.offset=u.findLineBreakInDirectionFromPosition(\"backward\",c.offset))&&(s=e.positionFromLocation(c),e=e.insertBlockBreakAtRange([s,s+1]),o.index+=1,o.offset-=e.getBlockAtIndex(c.index).getLength(),c.index+=1),c.offset=0,0===o.offset&&o.index>c.index?(o.index-=1,o.offset=e.getBlockAtIndex(o.index).getBlockBreakPosition()):(n=e.getBlockAtIndex(o.index),\"\\n\"===n.text.getStringAtRange([o.offset-1,o.offset])?o.offset-=1:o.offset=n.findLineBreakInDirectionFromPosition(\"forward\",o.offset),o.offset!==n.getBlockBreakPosition()&&(s=e.positionFromLocation(o),e=e.insertBlockBreakAtRange([s,s+1]))),l=e.positionFromLocation(c),r=e.positionFromLocation(o),t=i([l,r]),{document:e,range:t}},c.prototype.convertLineBreaksToBlockBreaksInRange=function(t){var e,n,o;return n=(t=i(t))[0],o=this.getStringAtRange(t).slice(0,-1),e=this,o.replace(/.*?\\n/g,function(t){return n+=t.length,e=e.insertBlockBreakAtRange([n-1,n])}),{document:e,range:t}},c.prototype.consolidateBlocksAtRange=function(t){var e,n,o,r,s;return o=t=i(t),s=o[0],n=o[1],r=this.locationFromPosition(s).index,e=this.locationFromPosition(n).index,new this.constructor(this.blockList.consolidateFromIndexToIndex(r,e))},c.prototype.getDocumentAtRange=function(t){var e;return t=i(t),e=this.blockList.getSplittableListInRange(t).toArray(),new this.constructor(e)},c.prototype.getStringAtRange=function(t){var e,n,o;return o=t=i(t),n=o[o.length-1],n!==this.getLength()&&(e=-1),this.getDocumentAtRange(t).toString().slice(0,e)},c.prototype.getBlockAtIndex=function(t){return this.blockList.getObjectAtIndex(t)},c.prototype.getBlockAtPosition=function(t){var e;return e=this.locationFromPosition(t).index,this.getBlockAtIndex(e)},c.prototype.getTextAtIndex=function(t){var e;return null!=(e=this.getBlockAtIndex(t))?e.text:void 0},c.prototype.getTextAtPosition=function(t){var e;return e=this.locationFromPosition(t).index,this.getTextAtIndex(e)},c.prototype.getPieceAtPosition=function(t){var e,n,i;return i=this.locationFromPosition(t),e=i.index,n=i.offset,this.getTextAtIndex(e).getPieceAtPosition(n)},c.prototype.getCharacterAtPosition=function(t){var e,n,i;return i=this.locationFromPosition(t),e=i.index,n=i.offset,this.getTextAtIndex(e).getStringAtRange([n,n+1])},c.prototype.getLength=function(){return this.blockList.getEndPosition()},c.prototype.getBlocks=function(){return this.blockList.toArray()},c.prototype.getBlockCount=function(){return this.blockList.length},c.prototype.getEditCount=function(){return this.editCount},c.prototype.eachBlock=function(t){return this.blockList.eachObject(t)},c.prototype.eachBlockAtRange=function(t,e){var n,o,r,s,a,u,c,l,h,p,d,f;if(u=t=i(t),d=u[0],r=u[1],p=this.locationFromPosition(d),o=this.locationFromPosition(r),p.index===o.index)return n=this.getBlockAtIndex(p.index),f=[p.offset,o.offset],e(n,f,p.index);for(h=[],a=s=c=p.index,l=o.index;l>=c?l>=s:s>=l;a=l>=c?++s:--s)(n=this.getBlockAtIndex(a))?(f=function(){switch(a){case p.index:return[p.offset,n.text.getLength()];case o.index:return[0,o.offset];default:return[0,n.text.getLength()]}}(),h.push(e(n,f,a))):h.push(void 0);return h},c.prototype.getCommonAttributesAtRange=function(t){var n,r,s;\nreturn r=(t=i(t))[0],o(t)?this.getCommonAttributesAtPosition(r):(s=[],n=[],this.eachBlockAtRange(t,function(t,e){return e[0]!==e[1]?(s.push(t.text.getCommonAttributesAtRange(e)),n.push(l(t))):void 0}),e.Hash.fromCommonAttributesOfObjects(s).merge(e.Hash.fromCommonAttributesOfObjects(n)).toObject())},c.prototype.getCommonAttributesAtPosition=function(t){var n,i,o,r,s,a,c,h,p,d;if(p=this.locationFromPosition(t),s=p.index,h=p.offset,o=this.getBlockAtIndex(s),!o)return{};r=l(o),n=o.text.getAttributesAtPosition(h),i=o.text.getAttributesAtPosition(h-1),a=function(){var t,n;t=e.config.textAttributes,n=[];for(c in t)d=t[c],d.inheritable&&n.push(c);return n}();for(c in i)d=i[c],(d===n[c]||u.call(a,c)>=0)&&(r[c]=d);return r},c.prototype.getRangeOfCommonAttributeAtPosition=function(t,e){var n,o,r,s,a,u,c,l,h;return a=this.locationFromPosition(e),r=a.index,s=a.offset,h=this.getTextAtIndex(r),u=h.getExpandedRangeForAttributeAtOffset(t,s),l=u[0],o=u[1],c=this.positionFromLocation({index:r,offset:l}),n=this.positionFromLocation({index:r,offset:o}),i([c,n])},c.prototype.getBaseBlockAttributes=function(){var t,e,n,i,o,r,s;for(t=this.getBlockAtIndex(0).getAttributes(),n=i=1,s=this.getBlockCount();s>=1?s>i:i>s;n=s>=1?++i:--i)e=this.getBlockAtIndex(n).getAttributes(),r=Math.min(t.length,e.length),t=function(){var n,i,s;for(s=[],o=n=0,i=r;(i>=0?i>n:n>i)&&e[o]===t[o];o=i>=0?++n:--n)s.push(e[o]);return s}();return t},l=function(t){var e,n;return n={},(e=t.getLastAttribute())&&(n[e]=!0),n},c.prototype.getAttachmentById=function(t){var e,n,i,o;for(o=this.getAttachments(),n=0,i=o.length;i>n;n++)if(e=o[n],e.id===t)return e},c.prototype.getAttachmentPieces=function(){var t;return t=[],this.blockList.eachObject(function(e){var n;return n=e.text,t=t.concat(n.getAttachmentPieces())}),t},c.prototype.getAttachments=function(){var t,e,n,i,o;for(i=this.getAttachmentPieces(),o=[],t=0,e=i.length;e>t;t++)n=i[t],o.push(n.attachment);return o},c.prototype.getRangeOfAttachment=function(t){var e,n,o,r,s,a,u;for(r=0,s=this.blockList.toArray(),n=e=0,o=s.length;o>e;n=++e){if(a=s[n].text,u=a.getRangeOfAttachment(t))return i([r+u[0],r+u[1]]);r+=a.getLength()}},c.prototype.getLocationRangeOfAttachment=function(t){var e;return e=this.getRangeOfAttachment(t),this.locationRangeFromRange(e)},c.prototype.getAttachmentPieceForAttachment=function(t){var e,n,i,o;for(o=this.getAttachmentPieces(),e=0,n=o.length;n>e;e++)if(i=o[e],i.attachment===t)return i},c.prototype.findRangesForBlockAttribute=function(t){var e,n,i,o,r,s,a;for(r=0,s=[],a=this.getBlocks(),n=0,i=a.length;i>n;n++)e=a[n],o=e.getLength(),e.hasAttribute(t)&&s.push([r,r+o]),r+=o;return s},c.prototype.findRangesForTextAttribute=function(t,e){var n,i,o,r,s,a,u,c,l,h;for(h=(null!=e?e:{}).withValue,a=0,u=[],c=[],r=function(e){return null!=h?e.getAttribute(t)===h:e.hasAttribute(t)},l=this.getPieces(),n=0,i=l.length;i>n;n++)s=l[n],o=s.getLength(),r(s)&&(u[1]===a?u[1]=a+o:c.push(u=[a,a+o])),a+=o;return c},c.prototype.locationFromPosition=function(t){var e,n;return n=this.blockList.findIndexAndOffsetAtPosition(Math.max(0,t)),null!=n.index?n:(e=this.getBlocks(),{index:e.length-1,offset:e[e.length-1].getLength()})},c.prototype.positionFromLocation=function(t){return this.blockList.findPositionAtIndexAndOffset(t.index,t.offset)},c.prototype.locationRangeFromPosition=function(t){return i(this.locationFromPosition(t))},c.prototype.locationRangeFromRange=function(t){var e,n,o,r;if(t=i(t))return r=t[0],n=t[1],o=this.locationFromPosition(r),e=this.locationFromPosition(n),i([o,e])},c.prototype.rangeFromLocationRange=function(t){var e,n;return t=i(t),e=this.positionFromLocation(t[0]),o(t)||(n=this.positionFromLocation(t[1])),i([e,n])},c.prototype.isEqualTo=function(t){return this.blockList.isEqualTo(null!=t?t.blockList:void 0)},c.prototype.getTexts=function(){var t,e,n,i,o;for(i=this.getBlocks(),o=[],e=0,n=i.length;n>e;e++)t=i[e],o.push(t.text);return o},c.prototype.getPieces=function(){var t,e,n,i,o;for(n=[],i=this.getTexts(),t=0,e=i.length;e>t;t++)o=i[t],n.push.apply(n,o.getPieces());return n},c.prototype.getObjects=function(){return this.getBlocks().concat(this.getTexts()).concat(this.getPieces())},c.prototype.toSerializableDocument=function(){var t;return t=[],this.blockList.eachObject(function(e){return t.push(e.copyWithText(e.text.toSerializableText()))}),new this.constructor(t)},c.prototype.toString=function(){return this.blockList.toString()},c.prototype.toJSON=function(){return this.blockList.toJSON()},c.prototype.toConsole=function(){var t;return JSON.stringify(function(){var e,n,i,o;for(i=this.blockList.toArray(),o=[],e=0,n=i.length;n>e;e++)t=i[e],o.push(JSON.parse(t.text.toConsole()));return o}.call(this))},c}(e.Object)}.call(this),function(){e.LineBreakInsertion=function(){function t(t){var e;this.composition=t,this.document=this.composition.document,e=this.composition.getSelectedRange(),this.startPosition=e[0],this.endPosition=e[1],this.startLocation=this.document.locationFromPosition(this.startPosition),this.endLocation=this.document.locationFromPosition(this.endPosition),this.block=this.document.getBlockAtIndex(this.endLocation.index),this.breaksOnReturn=this.block.breaksOnReturn(),this.previousCharacter=this.block.text.getStringAtPosition(this.endLocation.offset-1),this.nextCharacter=this.block.text.getStringAtPosition(this.endLocation.offset)}return t.prototype.shouldInsertBlockBreak=function(){return this.block.hasAttributes()&&this.block.isListItem()&&!this.block.isEmpty()?0!==this.startLocation.offset:this.breaksOnReturn&&\"\\n\"!==this.nextCharacter},t.prototype.shouldBreakFormattedBlock=function(){return this.block.hasAttributes()&&!this.block.isListItem()&&(this.breaksOnReturn&&\"\\n\"===this.nextCharacter||\"\\n\"===this.previousCharacter)},t.prototype.shouldDecreaseListLevel=function(){return this.block.hasAttributes()&&this.block.isListItem()&&this.block.isEmpty()},t.prototype.shouldPrependListItem=function(){return this.block.isListItem()&&0===this.startLocation.offset&&!this.block.isEmpty()},t.prototype.shouldRemoveLastBlockAttribute=function(){return this.block.hasAttributes()&&!this.block.isListItem()&&this.block.isEmpty()},t}()}.call(this),function(){var t,n,i,o,r,s,a,u,c,l,h=function(t,e){function n(){this.constructor=t}for(var i in e)p.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},p={}.hasOwnProperty;s=e.normalizeRange,c=e.rangesAreEqual,u=e.rangeIsCollapsed,a=e.objectsAreEqual,t=e.arrayStartsWith,l=e.summarizeArrayChange,i=e.getAllAttributeNames,o=e.getBlockConfig,r=e.getTextConfig,n=e.extend,e.Composition=function(p){function d(){this.document=new e.Document,this.attachments=[],this.currentAttributes={},this.revision=0}var f;return h(d,p),d.prototype.setDocument=function(t){var e;return t.isEqualTo(this.document)?void 0:(this.document=t,this.refreshAttachments(),this.revision++,null!=(e=this.delegate)&&\"function\"==typeof e.compositionDidChangeDocument?e.compositionDidChangeDocument(t):void 0)},d.prototype.getSnapshot=function(){return{document:this.document,selectedRange:this.getSelectedRange()}},d.prototype.loadSnapshot=function(t){var n,i,o,r;return n=t.document,r=t.selectedRange,null!=(i=this.delegate)&&\"function\"==typeof i.compositionWillLoadSnapshot&&i.compositionWillLoadSnapshot(),this.setDocument(null!=n?n:new e.Document),this.setSelection(null!=r?r:[0,0]),null!=(o=this.delegate)&&\"function\"==typeof o.compositionDidLoadSnapshot?o.compositionDidLoadSnapshot():void 0},d.prototype.insertText=function(t,e){var n,i,o,r;return r=(null!=e?e:{updatePosition:!0}).updatePosition,i=this.getSelectedRange(),this.setDocument(this.document.insertTextAtRange(t,i)),o=i[0],n=o+t.getLength(),r&&this.setSelection(n),this.notifyDelegateOfInsertionAtRange([o,n])},d.prototype.insertBlock=function(t){var n;return null==t&&(t=new e.Block),n=new e.Document([t]),this.insertDocument(n)},d.prototype.insertDocument=function(t){var n,i,o;return null==t&&(t=new e.Document),i=this.getSelectedRange(),this.setDocument(this.document.insertDocumentAtRange(t,i)),o=i[0],n=o+t.getLength(),this.setSelection(n),this.notifyDelegateOfInsertionAtRange([o,n])},d.prototype.insertString=function(t,n){var i,o;return i=this.getCurrentTextAttributes(),o=e.Text.textForStringWithAttributes(t,i),this.insertText(o,n)},d.prototype.insertBlockBreak=function(){var t,e,n;return e=this.getSelectedRange(),this.setDocument(this.document.insertBlockBreakAtRange(e)),n=e[0],t=n+1,this.setSelection(t),this.notifyDelegateOfInsertionAtRange([n,t])},d.prototype.insertLineBreak=function(){var t,n;return n=new e.LineBreakInsertion(this),n.shouldDecreaseListLevel()?(this.decreaseListLevel(),this.setSelection(n.startPosition)):n.shouldPrependListItem()?(t=new e.Document([n.block.copyWithoutText()]),this.insertDocument(t)):n.shouldInsertBlockBreak()?this.insertBlockBreak():n.shouldRemoveLastBlockAttribute()?this.removeLastBlockAttribute():n.shouldBreakFormattedBlock()?this.breakFormattedBlock(n):this.insertString(\"\\n\")},d.prototype.insertHTML=function(t){var n,i,o,r;return n=e.Document.fromHTML(t),o=this.getSelectedRange(),this.setDocument(this.document.mergeDocumentAtRange(n,o)),r=o[0],i=r+n.getLength()-1,this.setSelection(i),this.notifyDelegateOfInsertionAtRange([r,i])},d.prototype.replaceHTML=function(t){var n,i,o;return n=e.Document.fromHTML(t).copyUsingObjectsFromDocument(this.document),i=this.getLocationRange({strict:!1}),o=this.document.rangeFromLocationRange(i),this.setDocument(n),this.setSelection(o)},d.prototype.insertFile=function(t){return this.insertFiles([t])},d.prototype.insertFiles=function(t){var n,i,o,r,s,a;for(i=[],r=0,s=t.length;s>r;r++)o=t[r],(null!=(a=this.delegate)?a.compositionShouldAcceptFile(o):void 0)&&(n=e.Attachment.attachmentForFile(o),i.push(n));return this.insertAttachments(i)},d.prototype.insertAttachment=function(t){return this.insertAttachments([t])},d.prototype.insertAttachments=function(t){var n,i,o,r,s,a,u,c,l;for(c=new e.Text,r=0,s=t.length;s>r;r++)n=t[r],l=n.getType(),a=null!=(u=e.config.attachments[l])?u.presentation:void 0,o=this.getCurrentTextAttributes(),a&&(o.presentation=a),i=e.Text.textForAttachmentWithAttributes(n,o),c=c.appendText(i);return this.insertText(c)},d.prototype.shouldManageDeletingInDirection=function(t){var e;if(e=this.getLocationRange(),u(e)){if(\"backward\"===t&&0===e[0].offset)return!0;if(this.shouldManageMovingCursorInDirection(t))return!0}else if(e[0].index!==e[1].index)return!0;return!1},d.prototype.deleteInDirection=function(t,e){var n,i,o,r,s,a,c,l;return r=(null!=e?e:{}).length,s=this.getLocationRange(),a=this.getSelectedRange(),c=u(a),c?o=\"backward\"===t&&0===s[0].offset:l=s[0].index!==s[1].index,o&&this.canDecreaseBlockAttributeLevel()&&(i=this.getBlock(),i.isListItem()?this.decreaseListLevel():this.decreaseBlockAttributeLevel(),this.setSelection(a[0]),i.isEmpty())?!1:(c&&(a=this.getExpandedRangeInDirection(t,{length:r}),\"backward\"===t&&(n=this.getAttachmentAtRange(a))),n?(this.editAttachment(n),!1):(this.setDocument(this.document.removeTextAtRange(a)),this.setSelection(a[0]),o||l?!1:void 0))},d.prototype.moveTextFromRange=function(t){var e;return e=this.getSelectedRange()[0],this.setDocument(this.document.moveTextFromRangeToPosition(t,e)),this.setSelection(e)},d.prototype.removeAttachment=function(t){var e;return(e=this.document.getRangeOfAttachment(t))?(this.stopEditingAttachment(),this.setDocument(this.document.removeTextAtRange(e)),this.setSelection(e[0])):void 0},d.prototype.removeLastBlockAttribute=function(){var t,e,n,i;return n=this.getSelectedRange(),i=n[0],e=n[1],t=this.document.getBlockAtPosition(e),this.removeCurrentAttribute(t.getLastAttribute()),this.setSelection(i)},f=\" \",d.prototype.insertPlaceholder=function(){return this.placeholderPosition=this.getPosition(),this.insertString(f)},d.prototype.selectPlaceholder=function(){return null!=this.placeholderPosition?(this.setSelectedRange([this.placeholderPosition,this.placeholderPosition+f.length]),this.getSelectedRange()):void 0},d.prototype.forgetPlaceholder=function(){return this.placeholderPosition=null},d.prototype.hasCurrentAttribute=function(t){var e;return e=this.currentAttributes[t],null!=e&&e!==!1},d.prototype.toggleCurrentAttribute=function(t){var e;return(e=!this.currentAttributes[t])?this.setCurrentAttribute(t,e):this.removeCurrentAttribute(t)},d.prototype.canSetCurrentAttribute=function(t){return o(t)?this.canSetCurrentBlockAttribute(t):this.canSetCurrentTextAttribute(t)},d.prototype.canSetCurrentTextAttribute=function(){var t,e,n,i,o;if(e=this.getSelectedDocument()){for(o=e.getAttachments(),n=0,i=o.length;i>n;n++)if(t=o[n],!t.hasContent())return!1;return!0}},d.prototype.canSetCurrentBlockAttribute=function(){var t;if(t=this.getBlock())return!t.isTerminalBlock()},d.prototype.setCurrentAttribute=function(t,e){return o(t)?this.setBlockAttribute(t,e):(this.setTextAttribute(t,e),this.currentAttributes[t]=e,this.notifyDelegateOfCurrentAttributesChange())},d.prototype.setTextAttribute=function(t,n){var i,o,r,s;if(o=this.getSelectedRange())return r=o[0],i=o[1],r!==i?this.setDocument(this.document.addAttributeAtRange(t,n,o)):\"href\"===t?(s=e.Text.textForStringWithAttributes(n,{href:n}),this.insertText(s)):void 0},d.prototype.setBlockAttribute=function(t,e){var n,i;if(i=this.getSelectedRange())return this.canSetCurrentAttribute(t)?(n=this.getBlock(),this.setDocument(this.document.applyBlockAttributeAtRange(t,e,i)),this.setSelection(i)):void 0},d.prototype.removeCurrentAttribute=function(t){return o(t)?(this.removeBlockAttribute(t),this.updateCurrentAttributes()):(this.removeTextAttribute(t),delete this.currentAttributes[t],this.notifyDelegateOfCurrentAttributesChange())},d.prototype.removeTextAttribute=function(t){var e;if(e=this.getSelectedRange())return this.setDocument(this.document.removeAttributeAtRange(t,e))},d.prototype.removeBlockAttribute=function(t){var e;if(e=this.getSelectedRange())return this.setDocument(this.document.removeAttributeAtRange(t,e))},d.prototype.canDecreaseNestingLevel=function(){var t;return(null!=(t=this.getBlock())?t.getNestingLevel():void 0)>0},d.prototype.canIncreaseNestingLevel=function(){var e,n,i;if(e=this.getBlock())return(null!=(i=o(e.getLastNestableAttribute()))?i.listAttribute:0)?(n=this.getPreviousBlock())?t(n.getListItemAttributes(),e.getListItemAttributes()):void 0:e.getNestingLevel()>0},d.prototype.decreaseNestingLevel=function(){var t;if(t=this.getBlock())return this.setDocument(this.document.replaceBlock(t,t.decreaseNestingLevel()))},d.prototype.increaseNestingLevel=function(){var t;if(t=this.getBlock())return this.setDocument(this.document.replaceBlock(t,t.increaseNestingLevel()))},d.prototype.canDecreaseBlockAttributeLevel=function(){var t;return(null!=(t=this.getBlock())?t.getAttributeLevel():void 0)>0},d.prototype.decreaseBlockAttributeLevel=function(){var t,e;return(t=null!=(e=this.getBlock())?e.getLastAttribute():void 0)?this.removeCurrentAttribute(t):void 0},d.prototype.decreaseListLevel=function(){var t,e,n,i,o,r;for(r=this.getSelectedRange()[0],o=this.document.locationFromPosition(r).index,n=o,t=this.getBlock().getAttributeLevel();(e=this.document.getBlockAtIndex(n+1))&&e.isListItem()&&e.getAttributeLevel()>t;)n++;return r=this.document.positionFromLocation({index:o,offset:0}),i=this.document.positionFromLocation({index:n,offset:0}),this.setDocument(this.document.removeLastListAttributeAtRange([r,i]))},d.prototype.updateCurrentAttributes=function(){var t,e,n,o,r,s;if(s=this.getSelectedRange({ignoreLock:!0})){for(e=this.document.getCommonAttributesAtRange(s),r=i(),n=0,o=r.length;o>n;n++)t=r[n],e[t]||this.canSetCurrentAttribute(t)||(e[t]=!1);if(!a(e,this.currentAttributes))return this.currentAttributes=e,this.notifyDelegateOfCurrentAttributesChange()}},d.prototype.getCurrentAttributes=function(){return n.call({},this.currentAttributes)},d.prototype.getCurrentTextAttributes=function(){var t,e,n,i;t={},n=this.currentAttributes;for(e in n)i=n[e],i!==!1&&r(e)&&(t[e]=i);return t},d.prototype.freezeSelection=function(){return this.setCurrentAttribute(\"frozen\",!0)},d.prototype.thawSelection=function(){return this.removeCurrentAttribute(\"frozen\")},d.prototype.hasFrozenSelection=function(){return this.hasCurrentAttribute(\"frozen\")},d.proxyMethod(\"getSelectionManager().getPointRange\"),d.proxyMethod(\"getSelectionManager().setLocationRangeFromPointRange\"),d.proxyMethod(\"getSelectionManager().createLocationRangeFromDOMRange\"),d.proxyMethod(\"getSelectionManager().locationIsCursorTarget\"),d.proxyMethod(\"getSelectionManager().selectionIsExpanded\"),d.proxyMethod(\"delegate?.getSelectionManager\"),d.prototype.setSelection=function(t){var e,n;return e=this.document.locationRangeFromRange(t),null!=(n=this.delegate)?n.compositionDidRequestChangingSelectionToLocationRange(e):void 0},d.prototype.getSelectedRange=function(){var t;return(t=this.getLocationRange())?this.document.rangeFromLocationRange(t):void 0},d.prototype.setSelectedRange=function(t){var e;return e=this.document.locationRangeFromRange(t),this.getSelectionManager().setLocationRange(e)},d.prototype.getPosition=function(){var t;return(t=this.getLocationRange())?this.document.positionFromLocation(t[0]):void 0},d.prototype.getLocationRange=function(t){var e,n;return null!=(e=null!=(n=this.targetLocationRange)?n:this.getSelectionManager().getLocationRange(t))?e:s({index:0,offset:0})},d.prototype.withTargetLocationRange=function(t,e){var n;this.targetLocationRange=t;try{n=e()}finally{this.targetLocationRange=null}return n},d.prototype.withTargetRange=function(t,e){var n;return n=this.document.locationRangeFromRange(t),this.withTargetLocationRange(n,e)},d.prototype.withTargetDOMRange=function(t,e){var n;return n=this.createLocationRangeFromDOMRange(t,{strict:!1}),this.withTargetLocationRange(n,e)},d.prototype.getExpandedRangeInDirection=function(t,e){var n,i,o,r;return i=(null!=e?e:{}).length,o=this.getSelectedRange(),r=o[0],n=o[1],\"backward\"===t?i?r-=i:r=this.translateUTF16PositionFromOffset(r,-1):i?n+=i:n=this.translateUTF16PositionFromOffset(n,1),s([r,n])},d.prototype.shouldManageMovingCursorInDirection=function(t){var e;return this.editingAttachment?!0:(e=this.getExpandedRangeInDirection(t),null!=this.getAttachmentAtRange(e))},d.prototype.moveCursorInDirection=function(t){var e,n,i,o;return this.editingAttachment?i=this.document.getRangeOfAttachment(this.editingAttachment):(o=this.getSelectedRange(),i=this.getExpandedRangeInDirection(t),n=!c(o,i)),this.setSelectedRange(\"backward\"===t?i[0]:i[1]),n&&(e=this.getAttachmentAtRange(i))?this.editAttachment(e):void 0},d.prototype.expandSelectionInDirection=function(t,e){var n,i;return n=(null!=e?e:{}).length,i=this.getExpandedRangeInDirection(t,{length:n}),this.setSelectedRange(i)},d.prototype.expandSelectionForEditing=function(){return this.hasCurrentAttribute(\"href\")?this.expandSelectionAroundCommonAttribute(\"href\"):void 0},d.prototype.expandSelectionAroundCommonAttribute=function(t){var e,n;return e=this.getPosition(),n=this.document.getRangeOfCommonAttributeAtPosition(t,e),this.setSelectedRange(n)},d.prototype.selectionContainsAttachments=function(){var t;return(null!=(t=this.getSelectedAttachments())?t.length:void 0)>0},d.prototype.selectionIsInCursorTarget=function(){return this.editingAttachment||this.positionIsCursorTarget(this.getPosition())},d.prototype.positionIsCursorTarget=function(t){var e;return(e=this.document.locationFromPosition(t))?this.locationIsCursorTarget(e):void 0},d.prototype.positionIsBlockBreak=function(t){var e;return null!=(e=this.document.getPieceAtPosition(t))?e.isBlockBreak():void 0},d.prototype.getSelectedDocument=function(){var t;return(t=this.getSelectedRange())?this.document.getDocumentAtRange(t):void 0},d.prototype.getSelectedAttachments=function(){var t;return null!=(t=this.getSelectedDocument())?t.getAttachments():void 0},d.prototype.getAttachments=function(){return this.attachments.slice(0)},d.prototype.refreshAttachments=function(){var t,e,n,i,o,r,s,a,u,c,h,p;for(n=this.document.getAttachments(),a=l(this.attachments,n),t=a.added,h=a.removed,this.attachments=n,i=0,r=h.length;r>i;i++)e=h[i],e.delegate=null,null!=(u=this.delegate)&&\"function\"==typeof u.compositionDidRemoveAttachment&&u.compositionDidRemoveAttachment(e);for(p=[],o=0,s=t.length;s>o;o++)e=t[o],e.delegate=this,p.push(null!=(c=this.delegate)&&\"function\"==typeof c.compositionDidAddAttachment?c.compositionDidAddAttachment(e):void 0);return p},d.prototype.attachmentDidChangeAttributes=function(t){var e;return this.revision++,null!=(e=this.delegate)&&\"function\"==typeof e.compositionDidEditAttachment?e.compositionDidEditAttachment(t):void 0},d.prototype.attachmentDidChangePreviewURL=function(t){var e;return this.revision++,null!=(e=this.delegate)&&\"function\"==typeof e.compositionDidChangeAttachmentPreviewURL?e.compositionDidChangeAttachmentPreviewURL(t):void 0},d.prototype.editAttachment=function(t,e){var n;if(t!==this.editingAttachment)return this.stopEditingAttachment(),this.editingAttachment=t,null!=(n=this.delegate)&&\"function\"==typeof n.compositionDidStartEditingAttachment?n.compositionDidStartEditingAttachment(this.editingAttachment,e):void 0},d.prototype.stopEditingAttachment=function(){var t;if(this.editingAttachment)return null!=(t=this.delegate)&&\"function\"==typeof t.compositionDidStopEditingAttachment&&t.compositionDidStopEditingAttachment(this.editingAttachment),this.editingAttachment=null},d.prototype.updateAttributesForAttachment=function(t,e){return this.setDocument(this.document.updateAttributesForAttachment(t,e))},d.prototype.removeAttributeForAttachment=function(t,e){return this.setDocument(this.document.removeAttributeForAttachment(t,e))},d.prototype.breakFormattedBlock=function(t){var n,i,o,r,s;return i=t.document,n=t.block,r=t.startPosition,s=[r-1,r],n.getBlockBreakPosition()===t.startLocation.offset?(n.breaksOnReturn()&&\"\\n\"===t.nextCharacter?r+=1:i=i.removeTextAtRange(s),s=[r,r]):\"\\n\"===t.nextCharacter?\"\\n\"===t.previousCharacter?s=[r-1,r+1]:(s=[r,r+1],r+=1):t.startLocation.offset-1!==0&&(r+=1),o=new e.Document([n.removeLastAttribute().copyWithoutText()]),this.setDocument(i.insertDocumentAtRange(o,s)),this.setSelection(r)},d.prototype.getPreviousBlock=function(){var t,e;return(e=this.getLocationRange())&&(t=e[0].index,t>0)?this.document.getBlockAtIndex(t-1):void 0},d.prototype.getBlock=function(){var t;return(t=this.getLocationRange())?this.document.getBlockAtIndex(t[0].index):void 0},d.prototype.getAttachmentAtRange=function(t){var n;return n=this.document.getDocumentAtRange(t),n.toString()===e.OBJECT_REPLACEMENT_CHARACTER+\"\\n\"?n.getAttachments()[0]:void 0},d.prototype.notifyDelegateOfCurrentAttributesChange=function(){var t;return null!=(t=this.delegate)&&\"function\"==typeof t.compositionDidChangeCurrentAttributes?t.compositionDidChangeCurrentAttributes(this.currentAttributes):void 0},d.prototype.notifyDelegateOfInsertionAtRange=function(t){var e;return null!=(e=this.delegate)&&\"function\"==typeof e.compositionDidPerformInsertionAtRange?e.compositionDidPerformInsertionAtRange(t):void 0},d.prototype.translateUTF16PositionFromOffset=function(t,e){var n,i;return i=this.document.toUTF16String(),n=i.offsetFromUCS2Offset(t),i.offsetToUCS2Offset(n+e)},d}(e.BasicObject)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.UndoManager=function(e){function n(t){this.composition=t,this.undoEntries=[],this.redoEntries=[]}var i;return t(n,e),n.prototype.recordUndoEntry=function(t,e){var n,o,r,s,a;return s=null!=e?e:{},o=s.context,n=s.consolidatable,r=this.undoEntries.slice(-1)[0],n&&i(r,t,o)?void 0:(a=this.createEntry({description:t,context:o}),this.undoEntries.push(a),this.redoEntries=[])},n.prototype.undo=function(){var t,e;return(e=this.undoEntries.pop())?(t=this.createEntry(e),this.redoEntries.push(t),this.composition.loadSnapshot(e.snapshot)):void 0},n.prototype.redo=function(){var t,e;return(t=this.redoEntries.pop())?(e=this.createEntry(t),this.undoEntries.push(e),this.composition.loadSnapshot(t.snapshot)):void 0},n.prototype.canUndo=function(){return this.undoEntries.length>0},n.prototype.canRedo=function(){return this.redoEntries.length>0},n.prototype.createEntry=function(t){var e,n,i;return i=null!=t?t:{},n=i.description,e=i.context,{description:null!=n?n.toString():void 0,context:JSON.stringify(e),snapshot:this.composition.getSnapshot()}},i=function(t,e,n){return(null!=t?t.description:void 0)===(null!=e?e.toString():void 0)&&(null!=t?t.context:void 0)===JSON.stringify(n)},n}(e.BasicObject)}.call(this),function(){var t;e.attachmentGalleryFilter=function(e){var n;return n=new t(e),n.perform(),n.getSnapshot()},t=function(){function t(t){this.document=t.document,this.selectedRange=t.selectedRange}var e,n,i;return e=\"attachmentGallery\",n=\"presentation\",i=\"gallery\",t.prototype.perform=function(){return this.removeBlockAttribute(),this.applyBlockAttribute()},t.prototype.getSnapshot=function(){return{document:this.document,selectedRange:this.selectedRange}},t.prototype.removeBlockAttribute=function(){var t,n,i,o,r;for(o=this.findRangesOfBlocks(),r=[],t=0,n=o.length;n>t;t++)i=o[t],r.push(this.document=this.document.removeAttributeAtRange(e,i));return r},t.prototype.applyBlockAttribute=function(){var t,n,i,o,r,s;for(i=0,r=this.findRangesOfPieces(),s=[],t=0,n=r.length;n>t;t++)o=r[t],o[1]-o[0]>1&&(o[0]+=i,o[1]+=i,\"\\n\"!==this.document.getCharacterAtPosition(o[1])&&(this.document=this.document.insertBlockBreakAtRange(o[1]),o[1]<this.selectedRange[1]&&this.moveSelectedRangeForward(),o[1]++,i++),0!==o[0]&&\"\\n\"!==this.document.getCharacterAtPosition(o[0]-1)&&(this.document=this.document.insertBlockBreakAtRange(o[0]),o[0]<this.selectedRange[0]&&this.moveSelectedRangeForward(),o[0]++,i++),s.push(this.document=this.document.applyBlockAttributeAtRange(e,!0,o)));return s},t.prototype.findRangesOfBlocks=function(){return this.document.findRangesForBlockAttribute(e)},t.prototype.findRangesOfPieces=function(){return this.document.findRangesForTextAttribute(n,{withValue:i})},t.prototype.moveSelectedRangeForward=function(){return this.selectedRange[0]+=1,this.selectedRange[1]+=1},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Editor=function(){function n(n,o,r){this.composition=n,this.selectionManager=o,this.element=r,this.insertFiles=t(this.insertFiles,this),this.undoManager=new e.UndoManager(this.composition),this.filters=i.slice(0)}var i;return i=[e.attachmentGalleryFilter],n.prototype.loadDocument=function(t){return this.loadSnapshot({document:t,selectedRange:[0,0]})},n.prototype.loadHTML=function(t){return null==t&&(t=\"\"),this.loadDocument(e.Document.fromHTML(t,{referenceElement:this.element}))},n.prototype.loadJSON=function(t){var n,i;return n=t.document,i=t.selectedRange,n=e.Document.fromJSON(n),this.loadSnapshot({document:n,selectedRange:i})},n.prototype.loadSnapshot=function(t){return this.undoManager=new e.UndoManager(this.composition),this.composition.loadSnapshot(t)},n.prototype.getDocument=function(){return this.composition.document},n.prototype.getSelectedDocument=function(){return this.composition.getSelectedDocument()},n.prototype.getSnapshot=function(){return this.composition.getSnapshot()},n.prototype.toJSON=function(){return this.getSnapshot()},n.prototype.deleteInDirection=function(t){return this.composition.deleteInDirection(t)},n.prototype.insertAttachment=function(t){return this.composition.insertAttachment(t)},n.prototype.insertAttachments=function(t){return this.composition.insertAttachments(t)},n.prototype.insertDocument=function(t){return this.composition.insertDocument(t)},n.prototype.insertFile=function(t){return this.composition.insertFile(t)},n.prototype.insertFiles=function(t){return this.composition.insertFiles(t)},n.prototype.insertHTML=function(t){return this.composition.insertHTML(t)},n.prototype.insertString=function(t){return this.composition.insertString(t)},n.prototype.insertText=function(t){return this.composition.insertText(t)},n.prototype.insertLineBreak=function(){return this.composition.insertLineBreak()},n.prototype.getSelectedRange=function(){return this.composition.getSelectedRange()},n.prototype.getPosition=function(){return this.composition.getPosition()},n.prototype.getClientRectAtPosition=function(t){var e;return e=this.getDocument().locationRangeFromRange([t,t+1]),this.selectionManager.getClientRectAtLocationRange(e)},n.prototype.expandSelectionInDirection=function(t){return this.composition.expandSelectionInDirection(t)},n.prototype.moveCursorInDirection=function(t){return this.composition.moveCursorInDirection(t)},n.prototype.setSelectedRange=function(t){return this.composition.setSelectedRange(t)},n.prototype.activateAttribute=function(t,e){return null==e&&(e=!0),this.composition.setCurrentAttribute(t,e)},n.prototype.attributeIsActive=function(t){return this.composition.hasCurrentAttribute(t)},n.prototype.canActivateAttribute=function(t){return this.composition.canSetCurrentAttribute(t)},n.prototype.deactivateAttribute=function(t){return this.composition.removeCurrentAttribute(t)},n.prototype.canDecreaseNestingLevel=function(){return this.composition.canDecreaseNestingLevel()},n.prototype.canIncreaseNestingLevel=function(){return this.composition.canIncreaseNestingLevel()},n.prototype.decreaseNestingLevel=function(){return this.canDecreaseNestingLevel()?this.composition.decreaseNestingLevel():void 0},n.prototype.increaseNestingLevel=function(){return this.canIncreaseNestingLevel()?this.composition.increaseNestingLevel():void 0},n.prototype.canRedo=function(){return this.undoManager.canRedo()},n.prototype.canUndo=function(){return this.undoManager.canUndo()},n.prototype.recordUndoEntry=function(t,e){var n,i,o;return o=null!=e?e:{},i=o.context,n=o.consolidatable,this.undoManager.recordUndoEntry(t,{context:i,consolidatable:n})},n.prototype.redo=function(){return this.canRedo()?this.undoManager.redo():void 0},n.prototype.undo=function(){return this.canUndo()?this.undoManager.undo():void 0},n}()}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.ManagedAttachment=function(e){function n(t,e){var n;this.attachmentManager=t,this.attachment=e,n=this.attachment,this.id=n.id,this.file=n.file}return t(n,e),n.prototype.remove=function(){return this.attachmentManager.requestRemovalOfAttachment(this.attachment)},n.proxyMethod(\"attachment.getAttribute\"),n.proxyMethod(\"attachment.hasAttribute\"),n.proxyMethod(\"attachment.setAttribute\"),n.proxyMethod(\"attachment.getAttributes\"),n.proxyMethod(\"attachment.setAttributes\"),n.proxyMethod(\"attachment.isPending\"),n.proxyMethod(\"attachment.isPreviewable\"),n.proxyMethod(\"attachment.getURL\"),n.proxyMethod(\"attachment.getHref\"),n.proxyMethod(\"attachment.getFilename\"),n.proxyMethod(\"attachment.getFilesize\"),n.proxyMethod(\"attachment.getFormattedFilesize\"),n.proxyMethod(\"attachment.getExtension\"),n.proxyMethod(\"attachment.getContentType\"),n.proxyMethod(\"attachment.getFile\"),n.proxyMethod(\"attachment.setFile\"),n.proxyMethod(\"attachment.releaseFile\"),n.proxyMethod(\"attachment.getUploadProgress\"),n.proxyMethod(\"attachment.setUploadProgress\"),n}(e.BasicObject)}.call(this),function(){var t=function(t,e){function i(){this.constructor=t}for(var o in e)n.call(e,o)&&(t[o]=e[o]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},n={}.hasOwnProperty;e.AttachmentManager=function(n){function i(t){var e,n,i;for(null==t&&(t=[]),this.managedAttachments={},n=0,i=t.length;i>n;n++)e=t[n],this.manageAttachment(e)}return t(i,n),i.prototype.getAttachments=function(){var t,e,n,i;n=this.managedAttachments,i=[];for(e in n)t=n[e],i.push(t);return i},i.prototype.manageAttachment=function(t){var n,i;return null!=(n=this.managedAttachments)[i=t.id]?n[i]:n[i]=new e.ManagedAttachment(this,t)},i.prototype.attachmentIsManaged=function(t){return t.id in this.managedAttachments},i.prototype.requestRemovalOfAttachment=function(t){var e;return this.attachmentIsManaged(t)&&null!=(e=this.delegate)&&\"function\"==typeof e.attachmentManagerDidRequestRemovalOfAttachment?e.attachmentManagerDidRequestRemovalOfAttachment(t):void 0},i.prototype.unmanageAttachment=function(t){var e;return e=this.managedAttachments[t.id],delete this.managedAttachments[t.id],e},i}(e.BasicObject)}.call(this),function(){var t,n,i,o,r,s,a,u,c,l,h;t=e.elementContainsNode,n=e.findChildIndexOfNode,r=e.nodeIsBlockStart,s=e.nodeIsBlockStartComment,o=e.nodeIsBlockContainer,a=e.nodeIsCursorTarget,u=e.nodeIsEmptyTextNode,c=e.nodeIsTextNode,i=e.nodeIsAttachmentElement,l=e.tagName,h=e.walkTree,e.LocationMapper=function(){function e(t){this.element=t\n}var p,d,f,g;return e.prototype.findLocationFromContainerAndOffset=function(e,i,o){var s,u,l,p,g,m,v;for(m=(null!=o?o:{strict:!0}).strict,u=0,l=!1,p={index:0,offset:0},(s=this.findAttachmentElementParentForNode(e))&&(e=s.parentNode,i=n(s)),v=h(this.element,{usingFilter:f});v.nextNode();){if(g=v.currentNode,g===e&&c(e)){a(g)||(p.offset+=i);break}if(g.parentNode===e){if(u++===i)break}else if(!t(e,g)&&u>0)break;r(g,{strict:m})?(l&&p.index++,p.offset=0,l=!0):p.offset+=d(g)}return p},e.prototype.findContainerAndOffsetFromLocation=function(t){var e,i,s,u,l;if(0===t.index&&0===t.offset){for(e=this.element,u=0;e.firstChild;)if(e=e.firstChild,o(e)){u=1;break}return[e,u]}if(l=this.findNodeAndOffsetFromLocation(t),i=l[0],s=l[1],i){if(c(i))0===d(i)?(e=i.parentNode.parentNode,u=n(i.parentNode),a(i,{name:\"right\"})&&u++):(e=i,u=t.offset-s);else{if(e=i.parentNode,!r(i.previousSibling)&&!o(e))for(;i===e.lastChild&&(i=e,e=e.parentNode,!o(e)););u=n(i),0!==t.offset&&u++}return[e,u]}},e.prototype.findNodeAndOffsetFromLocation=function(t){var e,n,i,o,r,s,u,l;for(u=0,l=this.getSignificantNodesForIndex(t.index),n=0,i=l.length;i>n;n++){if(e=l[n],o=d(e),t.offset<=u+o)if(c(e)){if(r=e,s=u,t.offset===s&&a(r))break}else r||(r=e,s=u);if(u+=o,u>t.offset)break}return[r,s]},e.prototype.findAttachmentElementParentForNode=function(t){for(;t&&t!==this.element;){if(i(t))return t;t=t.parentNode}},e.prototype.getSignificantNodesForIndex=function(t){var e,n,i,o,r;for(i=[],r=h(this.element,{usingFilter:p}),o=!1;r.nextNode();)if(n=r.currentNode,s(n)){if(\"undefined\"!=typeof e&&null!==e?e++:e=0,e===t)o=!0;else if(o)break}else o&&i.push(n);return i},d=function(t){var e;return t.nodeType===Node.TEXT_NODE?a(t)?0:(e=t.textContent,e.length):\"br\"===l(t)||i(t)?1:0},p=function(t){return g(t)===NodeFilter.FILTER_ACCEPT?f(t):NodeFilter.FILTER_REJECT},g=function(t){return u(t)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},f=function(t){return i(t.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},e}()}.call(this),function(){var t,n,i=[].slice;t=e.getDOMRange,n=e.setDOMRange,e.PointMapper=function(){function e(){}return e.prototype.createDOMRangeFromPoint=function(e){var i,o,r,s,a,u,c,l;if(c=e.x,l=e.y,document.caretPositionFromPoint)return a=document.caretPositionFromPoint(c,l),r=a.offsetNode,o=a.offset,i=document.createRange(),i.setStart(r,o),i;if(document.caretRangeFromPoint)return document.caretRangeFromPoint(c,l);if(document.body.createTextRange){s=t();try{u=document.body.createTextRange(),u.moveToPoint(c,l),u.select()}catch(h){}return i=t(),n(s),i}},e.prototype.getClientRectsForDOMRange=function(t){var e,n,o;return n=i.call(t.getClientRects()),o=n[0],e=n[n.length-1],[o,e]},e}()}.call(this),function(){var t,n=function(t,e){return function(){return t.apply(e,arguments)}},i=function(t,e){function n(){this.constructor=t}for(var i in e)o.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},o={}.hasOwnProperty,r=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1};t=e.getDOMRange,e.SelectionChangeObserver=function(e){function o(){this.run=n(this.run,this),this.update=n(this.update,this),this.selectionManagers=[]}var s;return i(o,e),o.prototype.start=function(){return this.started?void 0:(this.started=!0,\"onselectionchange\"in document?document.addEventListener(\"selectionchange\",this.update,!0):this.run())},o.prototype.stop=function(){return this.started?(this.started=!1,document.removeEventListener(\"selectionchange\",this.update,!0)):void 0},o.prototype.registerSelectionManager=function(t){return r.call(this.selectionManagers,t)<0?(this.selectionManagers.push(t),this.start()):void 0},o.prototype.unregisterSelectionManager=function(t){var e;return this.selectionManagers=function(){var n,i,o,r;for(o=this.selectionManagers,r=[],n=0,i=o.length;i>n;n++)e=o[n],e!==t&&r.push(e);return r}.call(this),0===this.selectionManagers.length?this.stop():void 0},o.prototype.notifySelectionManagersOfSelectionChange=function(){var t,e,n,i,o;for(n=this.selectionManagers,i=[],t=0,e=n.length;e>t;t++)o=n[t],i.push(o.selectionDidChange());return i},o.prototype.update=function(){var e;return e=t(),s(e,this.domRange)?void 0:(this.domRange=e,this.notifySelectionManagersOfSelectionChange())},o.prototype.reset=function(){return this.domRange=null,this.update()},o.prototype.run=function(){return this.started?(this.update(),requestAnimationFrame(this.run)):void 0},s=function(t,e){return(null!=t?t.startContainer:void 0)===(null!=e?e.startContainer:void 0)&&(null!=t?t.startOffset:void 0)===(null!=e?e.startOffset:void 0)&&(null!=t?t.endContainer:void 0)===(null!=e?e.endContainer:void 0)&&(null!=t?t.endOffset:void 0)===(null!=e?e.endOffset:void 0)},o}(e.BasicObject),null==e.selectionChangeObserver&&(e.selectionChangeObserver=new e.SelectionChangeObserver)}.call(this),function(){var t,n,i,o,r,s,a,u,c,l,h=function(t,e){return function(){return t.apply(e,arguments)}},p=function(t,e){function n(){this.constructor=t}for(var i in e)d.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},d={}.hasOwnProperty;i=e.getDOMSelection,n=e.getDOMRange,l=e.setDOMRange,t=e.elementContainsNode,s=e.nodeIsCursorTarget,r=e.innerElementIsActive,o=e.handleEvent,a=e.normalizeRange,u=e.rangeIsCollapsed,c=e.rangesAreEqual,e.SelectionManager=function(d){function f(t){this.element=t,this.selectionDidChange=h(this.selectionDidChange,this),this.didMouseDown=h(this.didMouseDown,this),this.locationMapper=new e.LocationMapper(this.element),this.pointMapper=new e.PointMapper,this.lockCount=0,o(\"mousedown\",{onElement:this.element,withCallback:this.didMouseDown})}return p(f,d),f.prototype.getLocationRange=function(t){var e,i;return null==t&&(t={}),e=t.strict===!1?this.createLocationRangeFromDOMRange(n(),{strict:!1}):t.ignoreLock?this.currentLocationRange:null!=(i=this.lockedLocationRange)?i:this.currentLocationRange},f.prototype.setLocationRange=function(t){var e;if(!this.lockedLocationRange)return t=a(t),(e=this.createDOMRangeFromLocationRange(t))?(l(e),this.updateCurrentLocationRange(t)):void 0},f.prototype.setLocationRangeFromPointRange=function(t){var e,n;return t=a(t),n=this.getLocationAtPoint(t[0]),e=this.getLocationAtPoint(t[1]),this.setLocationRange([n,e])},f.prototype.getClientRectAtLocationRange=function(t){var e;return(e=this.createDOMRangeFromLocationRange(t))?this.getClientRectsForDOMRange(e)[1]:void 0},f.prototype.locationIsCursorTarget=function(t){var e,n,i;return i=this.findNodeAndOffsetFromLocation(t),e=i[0],n=i[1],s(e)},f.prototype.lock=function(){return 0===this.lockCount++?(this.updateCurrentLocationRange(),this.lockedLocationRange=this.getLocationRange()):void 0},f.prototype.unlock=function(){var t;return 0===--this.lockCount&&(t=this.lockedLocationRange,this.lockedLocationRange=null,null!=t)?this.setLocationRange(t):void 0},f.prototype.clearSelection=function(){var t;return null!=(t=i())?t.removeAllRanges():void 0},f.prototype.selectionIsCollapsed=function(){var t;return(null!=(t=n())?t.collapsed:void 0)===!0},f.prototype.selectionIsExpanded=function(){return!this.selectionIsCollapsed()},f.prototype.createLocationRangeFromDOMRange=function(t,e){var n,i;if(null!=t&&this.domRangeWithinElement(t)&&(i=this.findLocationFromContainerAndOffset(t.startContainer,t.startOffset,e)))return t.collapsed||(n=this.findLocationFromContainerAndOffset(t.endContainer,t.endOffset,e)),a([i,n])},f.proxyMethod(\"locationMapper.findLocationFromContainerAndOffset\"),f.proxyMethod(\"locationMapper.findContainerAndOffsetFromLocation\"),f.proxyMethod(\"locationMapper.findNodeAndOffsetFromLocation\"),f.proxyMethod(\"pointMapper.createDOMRangeFromPoint\"),f.proxyMethod(\"pointMapper.getClientRectsForDOMRange\"),f.prototype.didMouseDown=function(){return this.pauseTemporarily()},f.prototype.pauseTemporarily=function(){var e,n,i,r;return this.paused=!0,n=function(e){return function(){var n,o,s;for(e.paused=!1,clearTimeout(r),o=0,s=i.length;s>o;o++)n=i[o],n.destroy();return t(document,e.element)?e.selectionDidChange():void 0}}(this),r=setTimeout(n,200),i=function(){var t,i,r,s;for(r=[\"mousemove\",\"keydown\"],s=[],t=0,i=r.length;i>t;t++)e=r[t],s.push(o(e,{onElement:document,withCallback:n}));return s}()},f.prototype.selectionDidChange=function(){return this.paused||r(this.element)?void 0:this.updateCurrentLocationRange()},f.prototype.updateCurrentLocationRange=function(t){var e;return(null!=t?t:t=this.createLocationRangeFromDOMRange(n()))&&!c(t,this.currentLocationRange)?(this.currentLocationRange=t,null!=(e=this.delegate)&&\"function\"==typeof e.locationRangeDidChange?e.locationRangeDidChange(this.currentLocationRange.slice(0)):void 0):void 0},f.prototype.createDOMRangeFromLocationRange=function(t){var e,n,i,o;return i=this.findContainerAndOffsetFromLocation(t[0]),n=u(t)?i:null!=(o=this.findContainerAndOffsetFromLocation(t[1]))?o:i,null!=i&&null!=n?(e=document.createRange(),e.setStart.apply(e,i),e.setEnd.apply(e,n),e):void 0},f.prototype.getLocationAtPoint=function(t){var e,n;return(e=this.createDOMRangeFromPoint(t))&&null!=(n=this.createLocationRangeFromDOMRange(e))?n[0]:void 0},f.prototype.domRangeWithinElement=function(e){return e.collapsed?t(this.element,e.startContainer):t(this.element,e.startContainer)&&t(this.element,e.endContainer)},f}(e.BasicObject)}.call(this),function(){var t,n,i,o,r=function(t,e){function n(){this.constructor=t}for(var i in e)s.call(e,i)&&(t[i]=e[i]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},s={}.hasOwnProperty,a=[].slice;i=e.rangeIsCollapsed,o=e.rangesAreEqual,n=e.objectsAreEqual,t=e.getBlockConfig,e.EditorController=function(s){function u(t){var n,i;this.editorElement=t.editorElement,n=t.document,i=t.html,this.selectionManager=new e.SelectionManager(this.editorElement),this.selectionManager.delegate=this,this.composition=new e.Composition,this.composition.delegate=this,this.attachmentManager=new e.AttachmentManager(this.composition.getAttachments()),this.attachmentManager.delegate=this,this.inputController=new(e[\"Level\"+e.config.input.getLevel()+\"InputController\"])(this.editorElement),this.inputController.delegate=this,this.inputController.responder=this.composition,this.compositionController=new e.CompositionController(this.editorElement,this.composition),this.compositionController.delegate=this,this.toolbarController=new e.ToolbarController(this.editorElement.toolbarElement),this.toolbarController.delegate=this,this.editor=new e.Editor(this.composition,this.selectionManager,this.editorElement),null!=n?this.editor.loadDocument(n):this.editor.loadHTML(i)}var c;return r(u,s),u.prototype.registerSelectionManager=function(){return e.selectionChangeObserver.registerSelectionManager(this.selectionManager)},u.prototype.unregisterSelectionManager=function(){return e.selectionChangeObserver.unregisterSelectionManager(this.selectionManager)},u.prototype.render=function(){return this.compositionController.render()},u.prototype.reparse=function(){return this.composition.replaceHTML(this.editorElement.innerHTML)},u.prototype.compositionDidChangeDocument=function(){return this.notifyEditorElement(\"document-change\"),this.handlingInput?void 0:this.render()},u.prototype.compositionDidChangeCurrentAttributes=function(t){return this.currentAttributes=t,this.toolbarController.updateAttributes(this.currentAttributes),this.updateCurrentActions(),this.notifyEditorElement(\"attributes-change\",{attributes:this.currentAttributes})},u.prototype.compositionDidPerformInsertionAtRange=function(t){return this.pasting?this.pastedRange=t:void 0},u.prototype.compositionShouldAcceptFile=function(t){return this.notifyEditorElement(\"file-accept\",{file:t})},u.prototype.compositionDidAddAttachment=function(t){var e;return e=this.attachmentManager.manageAttachment(t),this.notifyEditorElement(\"attachment-add\",{attachment:e})},u.prototype.compositionDidEditAttachment=function(t){var e;return this.compositionController.rerenderViewForObject(t),e=this.attachmentManager.manageAttachment(t),this.notifyEditorElement(\"attachment-edit\",{attachment:e}),this.notifyEditorElement(\"change\")},u.prototype.compositionDidChangeAttachmentPreviewURL=function(t){return this.compositionController.invalidateViewForObject(t),this.notifyEditorElement(\"change\")},u.prototype.compositionDidRemoveAttachment=function(t){var e;return e=this.attachmentManager.unmanageAttachment(t),this.notifyEditorElement(\"attachment-remove\",{attachment:e})},u.prototype.compositionDidStartEditingAttachment=function(t,e){return this.attachmentLocationRange=this.composition.document.getLocationRangeOfAttachment(t),this.compositionController.installAttachmentEditorForAttachment(t,e),this.selectionManager.setLocationRange(this.attachmentLocationRange)},u.prototype.compositionDidStopEditingAttachment=function(){return this.compositionController.uninstallAttachmentEditor(),this.attachmentLocationRange=null},u.prototype.compositionDidRequestChangingSelectionToLocationRange=function(t){return!this.loadingSnapshot||this.isFocused()?(this.requestedLocationRange=t,this.compositionRevisionWhenLocationRangeRequested=this.composition.revision,this.handlingInput?void 0:this.render()):void 0},u.prototype.compositionWillLoadSnapshot=function(){return this.loadingSnapshot=!0},u.prototype.compositionDidLoadSnapshot=function(){return this.compositionController.refreshViewCache(),this.render(),this.loadingSnapshot=!1},u.prototype.getSelectionManager=function(){return this.selectionManager},u.proxyMethod(\"getSelectionManager().setLocationRange\"),u.proxyMethod(\"getSelectionManager().getLocationRange\"),u.prototype.attachmentManagerDidRequestRemovalOfAttachment=function(t){return this.removeAttachment(t)},u.prototype.compositionControllerWillSyncDocumentView=function(){return this.inputController.editorWillSyncDocumentView(),this.selectionManager.lock(),this.selectionManager.clearSelection()},u.prototype.compositionControllerDidSyncDocumentView=function(){return this.inputController.editorDidSyncDocumentView(),this.selectionManager.unlock(),this.updateCurrentActions(),this.notifyEditorElement(\"sync\")},u.prototype.compositionControllerDidRender=function(){return null!=this.requestedLocationRange&&(this.compositionRevisionWhenLocationRangeRequested===this.composition.revision&&this.selectionManager.setLocationRange(this.requestedLocationRange),this.requestedLocationRange=null,this.compositionRevisionWhenLocationRangeRequested=null),this.renderedCompositionRevision!==this.composition.revision&&(this.runEditorFilters(),this.composition.updateCurrentAttributes(),this.notifyEditorElement(\"render\")),this.renderedCompositionRevision=this.composition.revision},u.prototype.compositionControllerDidFocus=function(){return this.isFocusedInvisibly()&&this.setLocationRange({index:0,offset:0}),this.toolbarController.hideDialog(),this.notifyEditorElement(\"focus\")},u.prototype.compositionControllerDidBlur=function(){return this.notifyEditorElement(\"blur\")},u.prototype.compositionControllerDidSelectAttachment=function(t,e){return this.toolbarController.hideDialog(),this.composition.editAttachment(t,e)},u.prototype.compositionControllerDidRequestDeselectingAttachment=function(t){var e,n;return e=null!=(n=this.attachmentLocationRange)?n:this.composition.document.getLocationRangeOfAttachment(t),this.selectionManager.setLocationRange(e[1])},u.prototype.compositionControllerWillUpdateAttachment=function(t){return this.editor.recordUndoEntry(\"Edit Attachment\",{context:t.id,consolidatable:!0})},u.prototype.compositionControllerDidRequestRemovalOfAttachment=function(t){return this.removeAttachment(t)},u.prototype.inputControllerWillHandleInput=function(){return this.handlingInput=!0,this.requestedRender=!1},u.prototype.inputControllerDidRequestRender=function(){return this.requestedRender=!0},u.prototype.inputControllerDidHandleInput=function(){return this.handlingInput=!1,this.requestedRender?(this.requestedRender=!1,this.render()):void 0},u.prototype.inputControllerDidAllowUnhandledInput=function(){return this.notifyEditorElement(\"change\")},u.prototype.inputControllerDidRequestReparse=function(){return this.reparse()},u.prototype.inputControllerWillPerformTyping=function(){return this.recordTypingUndoEntry()},u.prototype.inputControllerWillPerformFormatting=function(t){return this.recordFormattingUndoEntry(t)},u.prototype.inputControllerWillCutText=function(){return this.editor.recordUndoEntry(\"Cut\")},u.prototype.inputControllerWillPaste=function(t){return this.editor.recordUndoEntry(\"Paste\"),this.pasting=!0,this.notifyEditorElement(\"before-paste\",{paste:t})},u.prototype.inputControllerDidPaste=function(t){return t.range=this.pastedRange,this.pastedRange=null,this.pasting=null,this.notifyEditorElement(\"paste\",{paste:t})},u.prototype.inputControllerWillMoveText=function(){return this.editor.recordUndoEntry(\"Move\")},u.prototype.inputControllerWillAttachFiles=function(){return this.editor.recordUndoEntry(\"Drop Files\")},u.prototype.inputControllerWillPerformUndo=function(){return this.editor.undo()},u.prototype.inputControllerWillPerformRedo=function(){return this.editor.redo()},u.prototype.inputControllerDidReceiveKeyboardCommand=function(t){return this.toolbarController.applyKeyboardCommand(t)},u.prototype.inputControllerDidStartDrag=function(){return this.locationRangeBeforeDrag=this.selectionManager.getLocationRange()},u.prototype.inputControllerDidReceiveDragOverPoint=function(t){return this.selectionManager.setLocationRangeFromPointRange(t)},u.prototype.inputControllerDidCancelDrag=function(){return this.selectionManager.setLocationRange(this.locationRangeBeforeDrag),this.locationRangeBeforeDrag=null},u.prototype.locationRangeDidChange=function(t){return this.composition.updateCurrentAttributes(),this.updateCurrentActions(),this.attachmentLocationRange&&!o(this.attachmentLocationRange,t)&&this.composition.stopEditingAttachment(),this.notifyEditorElement(\"selection-change\")},u.prototype.toolbarDidClickButton=function(){return this.getLocationRange()?void 0:this.setLocationRange({index:0,offset:0})},u.prototype.toolbarDidInvokeAction=function(t){return this.invokeAction(t)},u.prototype.toolbarDidToggleAttribute=function(t){return this.recordFormattingUndoEntry(t),this.composition.toggleCurrentAttribute(t),this.render(),this.selectionFrozen?void 0:this.editorElement.focus()},u.prototype.toolbarDidUpdateAttribute=function(t,e){return this.recordFormattingUndoEntry(t),this.composition.setCurrentAttribute(t,e),this.render(),this.selectionFrozen?void 0:this.editorElement.focus()},u.prototype.toolbarDidRemoveAttribute=function(t){return this.recordFormattingUndoEntry(t),this.composition.removeCurrentAttribute(t),this.render(),this.selectionFrozen?void 0:this.editorElement.focus()},u.prototype.toolbarWillShowDialog=function(){return this.composition.expandSelectionForEditing(),this.freezeSelection()},u.prototype.toolbarDidShowDialog=function(t){return this.notifyEditorElement(\"toolbar-dialog-show\",{dialogName:t})},u.prototype.toolbarDidHideDialog=function(t){return this.thawSelection(),this.editorElement.focus(),this.notifyEditorElement(\"toolbar-dialog-hide\",{dialogName:t})},u.prototype.freezeSelection=function(){return this.selectionFrozen?void 0:(this.selectionManager.lock(),this.composition.freezeSelection(),this.selectionFrozen=!0,this.render())},u.prototype.thawSelection=function(){return this.selectionFrozen?(this.composition.thawSelection(),this.selectionManager.unlock(),this.selectionFrozen=!1,this.render()):void 0},u.prototype.actions={undo:{test:function(){return this.editor.canUndo()},perform:function(){return this.editor.undo()}},redo:{test:function(){return this.editor.canRedo()},perform:function(){return this.editor.redo()}},link:{test:function(){return this.editor.canActivateAttribute(\"href\")}},increaseNestingLevel:{test:function(){return this.editor.canIncreaseNestingLevel()},perform:function(){return this.editor.increaseNestingLevel()&&this.render()}},decreaseNestingLevel:{test:function(){return this.editor.canDecreaseNestingLevel()},perform:function(){return this.editor.decreaseNestingLevel()&&this.render()}},attachFiles:{test:function(){return!0},perform:function(){return e.config.input.pickFiles(this.editor.insertFiles)}}},u.prototype.canInvokeAction=function(t){var e,n;return this.actionIsExternal(t)?!0:!!(null!=(e=this.actions[t])&&null!=(n=e.test)?n.call(this):void 0)},u.prototype.invokeAction=function(t){var e,n;return this.actionIsExternal(t)?this.notifyEditorElement(\"action-invoke\",{actionName:t}):null!=(e=this.actions[t])&&null!=(n=e.perform)?n.call(this):void 0},u.prototype.actionIsExternal=function(t){return/^x-./.test(t)},u.prototype.getCurrentActions=function(){var t,e;e={};for(t in this.actions)e[t]=this.canInvokeAction(t);return e},u.prototype.updateCurrentActions=function(){var t;return t=this.getCurrentActions(),n(t,this.currentActions)?void 0:(this.currentActions=t,this.toolbarController.updateActions(this.currentActions),this.notifyEditorElement(\"actions-change\",{actions:this.currentActions}))},u.prototype.runEditorFilters=function(){var t,e,n,i,o,r,s,a;for(a=this.composition.getSnapshot(),o=this.editor.filters,n=0,i=o.length;i>n;n++)e=o[n],t=a.document,s=a.selectedRange,a=null!=(r=e.call(this.editor,a))?r:{},null==a.document&&(a.document=t),null==a.selectedRange&&(a.selectedRange=s);return c(a,this.composition.getSnapshot())?void 0:this.composition.loadSnapshot(a)},c=function(t,e){return o(t.selectedRange,e.selectedRange)&&t.document.isEqualTo(e.document)},u.prototype.updateInputElement=function(){var t,n;return t=this.compositionController.getSerializableElement(),n=e.serializeToContentType(t,\"text/html\"),this.editorElement.setInputElementValue(n)},u.prototype.notifyEditorElement=function(t,e){switch(t){case\"document-change\":this.documentChangedSinceLastRender=!0;break;case\"render\":this.documentChangedSinceLastRender&&(this.documentChangedSinceLastRender=!1,this.notifyEditorElement(\"change\"));break;case\"change\":case\"attachment-add\":case\"attachment-edit\":case\"attachment-remove\":this.updateInputElement()}return this.editorElement.notify(t,e)},u.prototype.removeAttachment=function(t){return this.editor.recordUndoEntry(\"Delete Attachment\"),this.composition.removeAttachment(t),this.render()},u.prototype.recordFormattingUndoEntry=function(e){var n,o;return n=t(e),o=this.selectionManager.getLocationRange(),n||!i(o)?this.editor.recordUndoEntry(\"Formatting\",{context:this.getUndoContext(),consolidatable:!0}):void 0},u.prototype.recordTypingUndoEntry=function(){return this.editor.recordUndoEntry(\"Typing\",{context:this.getUndoContext(this.currentAttributes),consolidatable:!0})},u.prototype.getUndoContext=function(){var t;return t=1<=arguments.length?a.call(arguments,0):[],[this.getLocationContext(),this.getTimeContext()].concat(a.call(t))},u.prototype.getLocationContext=function(){var t;return t=this.selectionManager.getLocationRange(),i(t)?t[0].index:t},u.prototype.getTimeContext=function(){return e.config.undoInterval>0?Math.floor((new Date).getTime()/e.config.undoInterval):0},u.prototype.isFocused=function(){var t;return this.editorElement===(null!=(t=this.editorElement.ownerDocument)?t.activeElement:void 0)},u.prototype.isFocusedInvisibly=function(){return this.isFocused()&&!this.getLocationRange()},u}(e.Controller)}.call(this),function(){var t,n,i,o,r,s,a,u=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1};n=e.browser,s=e.makeElement,a=e.triggerEvent,o=e.handleEvent,r=e.handleEventOnce,i=e.findClosestElementFromNode,t=e.AttachmentView.attachmentSelector,e.registerElement(\"trix-editor\",function(){var c,l,h,p,d,f,g,m,v;return g=0,l=function(t){return!document.querySelector(\":focus\")&&t.hasAttribute(\"autofocus\")&&document.querySelector(\"[autofocus]\")===t?t.focus():void 0},m=function(t){return t.hasAttribute(\"contenteditable\")?void 0:(t.setAttribute(\"contenteditable\",\"\"),r(\"focus\",{onElement:t,withCallback:function(){return h(t)}}))},h=function(t){return d(t),v(t)},d=function(t){return(\"function\"==typeof document.queryCommandSupported?document.queryCommandSupported(\"enableObjectResizing\"):void 0)?(document.execCommand(\"enableObjectResizing\",!1,!1),o(\"mscontrolselect\",{onElement:t,preventDefault:!0})):void 0},v=function(){var t;return(\"function\"==typeof document.queryCommandSupported?document.queryCommandSupported(\"DefaultParagraphSeparator\"):void 0)&&(t=e.config.blockAttributes[\"default\"].tagName,\"div\"===t||\"p\"===t)?document.execCommand(\"DefaultParagraphSeparator\",!1,t):void 0},c=function(t){return t.hasAttribute(\"role\")?void 0:t.setAttribute(\"role\",\"textbox\")},f=function(t){var e;if(!t.hasAttribute(\"aria-label\")&&!t.hasAttribute(\"aria-labelledby\"))return(e=function(){var e,n,i;return i=function(){var n,i,o,r;for(o=t.labels,r=[],n=0,i=o.length;i>n;n++)e=o[n],e.contains(t)||r.push(e.textContent);return r}(),(n=i.join(\" \"))?t.setAttribute(\"aria-label\",n):t.removeAttribute(\"aria-label\")})(),o(\"focus\",{onElement:t,withCallback:e})},p=function(){return n.forcesObjectResizing?{display:\"inline\",width:\"auto\"}:{display:\"inline-block\",width:\"1px\"}}(),{defaultCSS:\"%t {\\n  display: block;\\n}\\n\\n%t:empty:not(:focus)::before {\\n  content: attr(placeholder);\\n  color: graytext;\\n  cursor: text;\\n  pointer-events: none;\\n}\\n\\n%t a[contenteditable=false] {\\n  cursor: text;\\n}\\n\\n%t img {\\n  max-width: 100%;\\n  height: auto;\\n}\\n\\n%t \"+t+\" figcaption textarea {\\n  resize: none;\\n}\\n\\n%t \"+t+\" figcaption textarea.trix-autoresize-clone {\\n  position: absolute;\\n  left: -9999px;\\n  max-height: 0px;\\n}\\n\\n%t \"+t+\" figcaption[data-trix-placeholder]:empty::before {\\n  content: attr(data-trix-placeholder);\\n  color: graytext;\\n}\\n\\n%t [data-trix-cursor-target] {\\n  display: \"+p.display+\" !important;\\n  width: \"+p.width+\" !important;\\n  padding: 0 !important;\\n  margin: 0 !important;\\n  border: none !important;\\n}\\n\\n%t [data-trix-cursor-target=left] {\\n  vertical-align: top !important;\\n  margin-left: -1px !important;\\n}\\n\\n%t [data-trix-cursor-target=right] {\\n  vertical-align: bottom !important;\\n  margin-right: -1px !important;\\n}\",trixId:{get:function(){return this.hasAttribute(\"trix-id\")?this.getAttribute(\"trix-id\"):(this.setAttribute(\"trix-id\",++g),this.trixId)}},labels:{get:function(){var t,e,n;return e=[],this.id&&this.ownerDocument&&e.push.apply(e,this.ownerDocument.querySelectorAll(\"label[for='\"+this.id+\"']\")),(t=i(this,{matchingSelector:\"label\"}))&&((n=t.control)===this||null===n)&&e.push(t),e}},toolbarElement:{get:function(){var t,e,n;return this.hasAttribute(\"toolbar\")?null!=(e=this.ownerDocument)?e.getElementById(this.getAttribute(\"toolbar\")):void 0:this.parentNode?(n=\"trix-toolbar-\"+this.trixId,this.setAttribute(\"toolbar\",n),t=s(\"trix-toolbar\",{id:n}),this.parentNode.insertBefore(t,this),t):void 0}},inputElement:{get:function(){var t,e,n;return this.hasAttribute(\"input\")?null!=(n=this.ownerDocument)?n.getElementById(this.getAttribute(\"input\")):void 0:this.parentNode?(e=\"trix-input-\"+this.trixId,this.setAttribute(\"input\",e),t=s(\"input\",{type:\"hidden\",id:e}),this.parentNode.insertBefore(t,this.nextElementSibling),t):void 0}},editor:{get:function(){var t;return null!=(t=this.editorController)?t.editor:void 0}},name:{get:function(){var t;return null!=(t=this.inputElement)?t.name:void 0}},value:{get:function(){var t;return null!=(t=this.inputElement)?t.value:void 0},set:function(t){var e;return this.defaultValue=t,null!=(e=this.editor)?e.loadHTML(this.defaultValue):void 0}},notify:function(t,e){return this.editorController?a(\"trix-\"+t,{onElement:this,attributes:e}):void 0},setInputElementValue:function(t){var e;return null!=(e=this.inputElement)?e.value=t:void 0},initialize:function(){return this.hasAttribute(\"data-trix-internal\")?void 0:(m(this),c(this),f(this))},connect:function(){return this.hasAttribute(\"data-trix-internal\")?void 0:(this.editorController||(a(\"trix-before-initialize\",{onElement:this}),this.editorController=new e.EditorController({editorElement:this,html:this.defaultValue=this.value}),requestAnimationFrame(function(t){return function(){return a(\"trix-initialize\",{onElement:t})}}(this))),this.editorController.registerSelectionManager(),this.registerResetListener(),this.registerClickListener(),l(this))},disconnect:function(){var t;return null!=(t=this.editorController)&&t.unregisterSelectionManager(),this.unregisterResetListener(),this.unregisterClickListener()},registerResetListener:function(){return this.resetListener=this.resetBubbled.bind(this),window.addEventListener(\"reset\",this.resetListener,!1)},unregisterResetListener:function(){return window.removeEventListener(\"reset\",this.resetListener,!1)},registerClickListener:function(){return this.clickListener=this.clickBubbled.bind(this),window.addEventListener(\"click\",this.clickListener,!1)},unregisterClickListener:function(){return window.removeEventListener(\"click\",this.clickListener,!1)},resetBubbled:function(t){var e;if(!t.defaultPrevented&&t.target===(null!=(e=this.inputElement)?e.form:void 0))return this.reset()},clickBubbled:function(t){var e;if(!(t.defaultPrevented||this.contains(t.target)||!(e=i(t.target,{matchingSelector:\"label\"}))||u.call(this.labels,e)<0))return this.focus()},reset:function(){return this.value=this.defaultValue}}}())}.call(this),function(){}.call(this)}).call(this),\"object\"==typeof module&&module.exports?module.exports=e:\"function\"==typeof define&&define.amd&&define(e)}.call(this);", "(function(global, factory) {\n  typeof exports === \"object\" && typeof module !== \"undefined\" ? factory(exports) : typeof define === \"function\" && define.amd ? define([ \"exports\" ], factory) : factory(global.ActiveStorage = {});\n})(this, function(exports) {\n  \"use strict\";\n  function createCommonjsModule(fn, module) {\n    return module = {\n      exports: {}\n    }, fn(module, module.exports), module.exports;\n  }\n  var sparkMd5 = createCommonjsModule(function(module, exports) {\n    (function(factory) {\n      {\n        module.exports = factory();\n      }\n    })(function(undefined) {\n      var hex_chr = [ \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\" ];\n      function md5cycle(x, k) {\n        var a = x[0], b = x[1], c = x[2], d = x[3];\n        a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[10] - 42063 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b ^ c ^ d) + k[5] - 378558 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        x[0] = a + x[0] | 0;\n        x[1] = b + x[1] | 0;\n        x[2] = c + x[2] | 0;\n        x[3] = d + x[3] | 0;\n      }\n      function md5blk(s) {\n        var md5blks = [], i;\n        for (i = 0; i < 64; i += 4) {\n          md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n        }\n        return md5blks;\n      }\n      function md5blk_array(a) {\n        var md5blks = [], i;\n        for (i = 0; i < 64; i += 4) {\n          md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n        }\n        return md5blks;\n      }\n      function md51(s) {\n        var n = s.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n        for (i = 64; i <= n; i += 64) {\n          md5cycle(state, md5blk(s.substring(i - 64, i)));\n        }\n        s = s.substring(i - 64);\n        length = s.length;\n        tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n        for (i = 0; i < length; i += 1) {\n          tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3);\n        }\n        tail[i >> 2] |= 128 << (i % 4 << 3);\n        if (i > 55) {\n          md5cycle(state, tail);\n          for (i = 0; i < 16; i += 1) {\n            tail[i] = 0;\n          }\n        }\n        tmp = n * 8;\n        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n        lo = parseInt(tmp[2], 16);\n        hi = parseInt(tmp[1], 16) || 0;\n        tail[14] = lo;\n        tail[15] = hi;\n        md5cycle(state, tail);\n        return state;\n      }\n      function md51_array(a) {\n        var n = a.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n        for (i = 64; i <= n; i += 64) {\n          md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n        }\n        a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0);\n        length = a.length;\n        tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n        for (i = 0; i < length; i += 1) {\n          tail[i >> 2] |= a[i] << (i % 4 << 3);\n        }\n        tail[i >> 2] |= 128 << (i % 4 << 3);\n        if (i > 55) {\n          md5cycle(state, tail);\n          for (i = 0; i < 16; i += 1) {\n            tail[i] = 0;\n          }\n        }\n        tmp = n * 8;\n        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n        lo = parseInt(tmp[2], 16);\n        hi = parseInt(tmp[1], 16) || 0;\n        tail[14] = lo;\n        tail[15] = hi;\n        md5cycle(state, tail);\n        return state;\n      }\n      function rhex(n) {\n        var s = \"\", j;\n        for (j = 0; j < 4; j += 1) {\n          s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15];\n        }\n        return s;\n      }\n      function hex(x) {\n        var i;\n        for (i = 0; i < x.length; i += 1) {\n          x[i] = rhex(x[i]);\n        }\n        return x.join(\"\");\n      }\n      if (hex(md51(\"hello\")) !== \"5d41402abc4b2a76b9719d911017c592\") ;\n      if (typeof ArrayBuffer !== \"undefined\" && !ArrayBuffer.prototype.slice) {\n        (function() {\n          function clamp(val, length) {\n            val = val | 0 || 0;\n            if (val < 0) {\n              return Math.max(val + length, 0);\n            }\n            return Math.min(val, length);\n          }\n          ArrayBuffer.prototype.slice = function(from, to) {\n            var length = this.byteLength, begin = clamp(from, length), end = length, num, target, targetArray, sourceArray;\n            if (to !== undefined) {\n              end = clamp(to, length);\n            }\n            if (begin > end) {\n              return new ArrayBuffer(0);\n            }\n            num = end - begin;\n            target = new ArrayBuffer(num);\n            targetArray = new Uint8Array(target);\n            sourceArray = new Uint8Array(this, begin, num);\n            targetArray.set(sourceArray);\n            return target;\n          };\n        })();\n      }\n      function toUtf8(str) {\n        if (/[\\u0080-\\uFFFF]/.test(str)) {\n          str = unescape(encodeURIComponent(str));\n        }\n        return str;\n      }\n      function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n        var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i;\n        for (i = 0; i < length; i += 1) {\n          arr[i] = str.charCodeAt(i);\n        }\n        return returnUInt8Array ? arr : buff;\n      }\n      function arrayBuffer2Utf8Str(buff) {\n        return String.fromCharCode.apply(null, new Uint8Array(buff));\n      }\n      function concatenateArrayBuffers(first, second, returnUInt8Array) {\n        var result = new Uint8Array(first.byteLength + second.byteLength);\n        result.set(new Uint8Array(first));\n        result.set(new Uint8Array(second), first.byteLength);\n        return returnUInt8Array ? result : result.buffer;\n      }\n      function hexToBinaryString(hex) {\n        var bytes = [], length = hex.length, x;\n        for (x = 0; x < length - 1; x += 2) {\n          bytes.push(parseInt(hex.substr(x, 2), 16));\n        }\n        return String.fromCharCode.apply(String, bytes);\n      }\n      function SparkMD5() {\n        this.reset();\n      }\n      SparkMD5.prototype.append = function(str) {\n        this.appendBinary(toUtf8(str));\n        return this;\n      };\n      SparkMD5.prototype.appendBinary = function(contents) {\n        this._buff += contents;\n        this._length += contents.length;\n        var length = this._buff.length, i;\n        for (i = 64; i <= length; i += 64) {\n          md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n        }\n        this._buff = this._buff.substring(i - 64);\n        return this;\n      };\n      SparkMD5.prototype.end = function(raw) {\n        var buff = this._buff, length = buff.length, i, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ret;\n        for (i = 0; i < length; i += 1) {\n          tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3);\n        }\n        this._finish(tail, length);\n        ret = hex(this._hash);\n        if (raw) {\n          ret = hexToBinaryString(ret);\n        }\n        this.reset();\n        return ret;\n      };\n      SparkMD5.prototype.reset = function() {\n        this._buff = \"\";\n        this._length = 0;\n        this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n        return this;\n      };\n      SparkMD5.prototype.getState = function() {\n        return {\n          buff: this._buff,\n          length: this._length,\n          hash: this._hash\n        };\n      };\n      SparkMD5.prototype.setState = function(state) {\n        this._buff = state.buff;\n        this._length = state.length;\n        this._hash = state.hash;\n        return this;\n      };\n      SparkMD5.prototype.destroy = function() {\n        delete this._hash;\n        delete this._buff;\n        delete this._length;\n      };\n      SparkMD5.prototype._finish = function(tail, length) {\n        var i = length, tmp, lo, hi;\n        tail[i >> 2] |= 128 << (i % 4 << 3);\n        if (i > 55) {\n          md5cycle(this._hash, tail);\n          for (i = 0; i < 16; i += 1) {\n            tail[i] = 0;\n          }\n        }\n        tmp = this._length * 8;\n        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n        lo = parseInt(tmp[2], 16);\n        hi = parseInt(tmp[1], 16) || 0;\n        tail[14] = lo;\n        tail[15] = hi;\n        md5cycle(this._hash, tail);\n      };\n      SparkMD5.hash = function(str, raw) {\n        return SparkMD5.hashBinary(toUtf8(str), raw);\n      };\n      SparkMD5.hashBinary = function(content, raw) {\n        var hash = md51(content), ret = hex(hash);\n        return raw ? hexToBinaryString(ret) : ret;\n      };\n      SparkMD5.ArrayBuffer = function() {\n        this.reset();\n      };\n      SparkMD5.ArrayBuffer.prototype.append = function(arr) {\n        var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i;\n        this._length += arr.byteLength;\n        for (i = 64; i <= length; i += 64) {\n          md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n        }\n        this._buff = i - 64 < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n        return this;\n      };\n      SparkMD5.ArrayBuffer.prototype.end = function(raw) {\n        var buff = this._buff, length = buff.length, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], i, ret;\n        for (i = 0; i < length; i += 1) {\n          tail[i >> 2] |= buff[i] << (i % 4 << 3);\n        }\n        this._finish(tail, length);\n        ret = hex(this._hash);\n        if (raw) {\n          ret = hexToBinaryString(ret);\n        }\n        this.reset();\n        return ret;\n      };\n      SparkMD5.ArrayBuffer.prototype.reset = function() {\n        this._buff = new Uint8Array(0);\n        this._length = 0;\n        this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n        return this;\n      };\n      SparkMD5.ArrayBuffer.prototype.getState = function() {\n        var state = SparkMD5.prototype.getState.call(this);\n        state.buff = arrayBuffer2Utf8Str(state.buff);\n        return state;\n      };\n      SparkMD5.ArrayBuffer.prototype.setState = function(state) {\n        state.buff = utf8Str2ArrayBuffer(state.buff, true);\n        return SparkMD5.prototype.setState.call(this, state);\n      };\n      SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n      SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n      SparkMD5.ArrayBuffer.hash = function(arr, raw) {\n        var hash = md51_array(new Uint8Array(arr)), ret = hex(hash);\n        return raw ? hexToBinaryString(ret) : ret;\n      };\n      return SparkMD5;\n    });\n  });\n  var classCallCheck = function(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n  var createClass = function() {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function(Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  var fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;\n  var FileChecksum = function() {\n    createClass(FileChecksum, null, [ {\n      key: \"create\",\n      value: function create(file, callback) {\n        var instance = new FileChecksum(file);\n        instance.create(callback);\n      }\n    } ]);\n    function FileChecksum(file) {\n      classCallCheck(this, FileChecksum);\n      this.file = file;\n      this.chunkSize = 2097152;\n      this.chunkCount = Math.ceil(this.file.size / this.chunkSize);\n      this.chunkIndex = 0;\n    }\n    createClass(FileChecksum, [ {\n      key: \"create\",\n      value: function create(callback) {\n        var _this = this;\n        this.callback = callback;\n        this.md5Buffer = new sparkMd5.ArrayBuffer();\n        this.fileReader = new FileReader();\n        this.fileReader.addEventListener(\"load\", function(event) {\n          return _this.fileReaderDidLoad(event);\n        });\n        this.fileReader.addEventListener(\"error\", function(event) {\n          return _this.fileReaderDidError(event);\n        });\n        this.readNextChunk();\n      }\n    }, {\n      key: \"fileReaderDidLoad\",\n      value: function fileReaderDidLoad(event) {\n        this.md5Buffer.append(event.target.result);\n        if (!this.readNextChunk()) {\n          var binaryDigest = this.md5Buffer.end(true);\n          var base64digest = btoa(binaryDigest);\n          this.callback(null, base64digest);\n        }\n      }\n    }, {\n      key: \"fileReaderDidError\",\n      value: function fileReaderDidError(event) {\n        this.callback(\"Error reading \" + this.file.name);\n      }\n    }, {\n      key: \"readNextChunk\",\n      value: function readNextChunk() {\n        if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {\n          var start = this.chunkIndex * this.chunkSize;\n          var end = Math.min(start + this.chunkSize, this.file.size);\n          var bytes = fileSlice.call(this.file, start, end);\n          this.fileReader.readAsArrayBuffer(bytes);\n          this.chunkIndex++;\n          return true;\n        } else {\n          return false;\n        }\n      }\n    } ]);\n    return FileChecksum;\n  }();\n  function getMetaValue(name) {\n    var element = findElement(document.head, 'meta[name=\"' + name + '\"]');\n    if (element) {\n      return element.getAttribute(\"content\");\n    }\n  }\n  function findElements(root, selector) {\n    if (typeof root == \"string\") {\n      selector = root;\n      root = document;\n    }\n    var elements = root.querySelectorAll(selector);\n    return toArray$1(elements);\n  }\n  function findElement(root, selector) {\n    if (typeof root == \"string\") {\n      selector = root;\n      root = document;\n    }\n    return root.querySelector(selector);\n  }\n  function dispatchEvent(element, type) {\n    var eventInit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    var disabled = element.disabled;\n    var bubbles = eventInit.bubbles, cancelable = eventInit.cancelable, detail = eventInit.detail;\n    var event = document.createEvent(\"Event\");\n    event.initEvent(type, bubbles || true, cancelable || true);\n    event.detail = detail || {};\n    try {\n      element.disabled = false;\n      element.dispatchEvent(event);\n    } finally {\n      element.disabled = disabled;\n    }\n    return event;\n  }\n  function toArray$1(value) {\n    if (Array.isArray(value)) {\n      return value;\n    } else if (Array.from) {\n      return Array.from(value);\n    } else {\n      return [].slice.call(value);\n    }\n  }\n  var BlobRecord = function() {\n    function BlobRecord(file, checksum, url) {\n      var _this = this;\n      classCallCheck(this, BlobRecord);\n      this.file = file;\n      this.attributes = {\n        filename: file.name,\n        content_type: file.type || \"application/octet-stream\",\n        byte_size: file.size,\n        checksum: checksum\n      };\n      this.xhr = new XMLHttpRequest();\n      this.xhr.open(\"POST\", url, true);\n      this.xhr.responseType = \"json\";\n      this.xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n      this.xhr.setRequestHeader(\"Accept\", \"application/json\");\n      this.xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n      var csrfToken = getMetaValue(\"csrf-token\");\n      if (csrfToken != undefined) {\n        this.xhr.setRequestHeader(\"X-CSRF-Token\", csrfToken);\n      }\n      this.xhr.addEventListener(\"load\", function(event) {\n        return _this.requestDidLoad(event);\n      });\n      this.xhr.addEventListener(\"error\", function(event) {\n        return _this.requestDidError(event);\n      });\n    }\n    createClass(BlobRecord, [ {\n      key: \"create\",\n      value: function create(callback) {\n        this.callback = callback;\n        this.xhr.send(JSON.stringify({\n          blob: this.attributes\n        }));\n      }\n    }, {\n      key: \"requestDidLoad\",\n      value: function requestDidLoad(event) {\n        if (this.status >= 200 && this.status < 300) {\n          var response = this.response;\n          var direct_upload = response.direct_upload;\n          delete response.direct_upload;\n          this.attributes = response;\n          this.directUploadData = direct_upload;\n          this.callback(null, this.toJSON());\n        } else {\n          this.requestDidError(event);\n        }\n      }\n    }, {\n      key: \"requestDidError\",\n      value: function requestDidError(event) {\n        this.callback('Error creating Blob for \"' + this.file.name + '\". Status: ' + this.status);\n      }\n    }, {\n      key: \"toJSON\",\n      value: function toJSON() {\n        var result = {};\n        for (var key in this.attributes) {\n          result[key] = this.attributes[key];\n        }\n        return result;\n      }\n    }, {\n      key: \"status\",\n      get: function get$$1() {\n        return this.xhr.status;\n      }\n    }, {\n      key: \"response\",\n      get: function get$$1() {\n        var _xhr = this.xhr, responseType = _xhr.responseType, response = _xhr.response;\n        if (responseType == \"json\") {\n          return response;\n        } else {\n          return JSON.parse(response);\n        }\n      }\n    } ]);\n    return BlobRecord;\n  }();\n  var BlobUpload = function() {\n    function BlobUpload(blob) {\n      var _this = this;\n      classCallCheck(this, BlobUpload);\n      this.blob = blob;\n      this.file = blob.file;\n      var _blob$directUploadDat = blob.directUploadData, url = _blob$directUploadDat.url, headers = _blob$directUploadDat.headers;\n      this.xhr = new XMLHttpRequest();\n      this.xhr.open(\"PUT\", url, true);\n      this.xhr.responseType = \"text\";\n      for (var key in headers) {\n        this.xhr.setRequestHeader(key, headers[key]);\n      }\n      this.xhr.addEventListener(\"load\", function(event) {\n        return _this.requestDidLoad(event);\n      });\n      this.xhr.addEventListener(\"error\", function(event) {\n        return _this.requestDidError(event);\n      });\n    }\n    createClass(BlobUpload, [ {\n      key: \"create\",\n      value: function create(callback) {\n        this.callback = callback;\n        this.xhr.send(this.file.slice());\n      }\n    }, {\n      key: \"requestDidLoad\",\n      value: function requestDidLoad(event) {\n        var _xhr = this.xhr, status = _xhr.status, response = _xhr.response;\n        if (status >= 200 && status < 300) {\n          this.callback(null, response);\n        } else {\n          this.requestDidError(event);\n        }\n      }\n    }, {\n      key: \"requestDidError\",\n      value: function requestDidError(event) {\n        this.callback('Error storing \"' + this.file.name + '\". Status: ' + this.xhr.status);\n      }\n    } ]);\n    return BlobUpload;\n  }();\n  var id = 0;\n  var DirectUpload = function() {\n    function DirectUpload(file, url, delegate) {\n      classCallCheck(this, DirectUpload);\n      this.id = ++id;\n      this.file = file;\n      this.url = url;\n      this.delegate = delegate;\n    }\n    createClass(DirectUpload, [ {\n      key: \"create\",\n      value: function create(callback) {\n        var _this = this;\n        FileChecksum.create(this.file, function(error, checksum) {\n          if (error) {\n            callback(error);\n            return;\n          }\n          var blob = new BlobRecord(_this.file, checksum, _this.url);\n          notify(_this.delegate, \"directUploadWillCreateBlobWithXHR\", blob.xhr);\n          blob.create(function(error) {\n            if (error) {\n              callback(error);\n            } else {\n              var upload = new BlobUpload(blob);\n              notify(_this.delegate, \"directUploadWillStoreFileWithXHR\", upload.xhr);\n              upload.create(function(error) {\n                if (error) {\n                  callback(error);\n                } else {\n                  callback(null, blob.toJSON());\n                }\n              });\n            }\n          });\n        });\n      }\n    } ]);\n    return DirectUpload;\n  }();\n  function notify(object, methodName) {\n    if (object && typeof object[methodName] == \"function\") {\n      for (var _len = arguments.length, messages = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n        messages[_key - 2] = arguments[_key];\n      }\n      return object[methodName].apply(object, messages);\n    }\n  }\n  var DirectUploadController = function() {\n    function DirectUploadController(input, file) {\n      classCallCheck(this, DirectUploadController);\n      this.input = input;\n      this.file = file;\n      this.directUpload = new DirectUpload(this.file, this.url, this);\n      this.dispatch(\"initialize\");\n    }\n    createClass(DirectUploadController, [ {\n      key: \"start\",\n      value: function start(callback) {\n        var _this = this;\n        var hiddenInput = document.createElement(\"input\");\n        hiddenInput.type = \"hidden\";\n        hiddenInput.name = this.input.name;\n        this.input.insertAdjacentElement(\"beforebegin\", hiddenInput);\n        this.dispatch(\"start\");\n        this.directUpload.create(function(error, attributes) {\n          if (error) {\n            hiddenInput.parentNode.removeChild(hiddenInput);\n            _this.dispatchError(error);\n          } else {\n            hiddenInput.value = attributes.signed_id;\n          }\n          _this.dispatch(\"end\");\n          callback(error);\n        });\n      }\n    }, {\n      key: \"uploadRequestDidProgress\",\n      value: function uploadRequestDidProgress(event) {\n        var progress = event.loaded / event.total * 100;\n        if (progress) {\n          this.dispatch(\"progress\", {\n            progress: progress\n          });\n        }\n      }\n    }, {\n      key: \"dispatch\",\n      value: function dispatch(name) {\n        var detail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        detail.file = this.file;\n        detail.id = this.directUpload.id;\n        return dispatchEvent(this.input, \"direct-upload:\" + name, {\n          detail: detail\n        });\n      }\n    }, {\n      key: \"dispatchError\",\n      value: function dispatchError(error) {\n        var event = this.dispatch(\"error\", {\n          error: error\n        });\n        if (!event.defaultPrevented) {\n          alert(error);\n        }\n      }\n    }, {\n      key: \"directUploadWillCreateBlobWithXHR\",\n      value: function directUploadWillCreateBlobWithXHR(xhr) {\n        this.dispatch(\"before-blob-request\", {\n          xhr: xhr\n        });\n      }\n    }, {\n      key: \"directUploadWillStoreFileWithXHR\",\n      value: function directUploadWillStoreFileWithXHR(xhr) {\n        var _this2 = this;\n        this.dispatch(\"before-storage-request\", {\n          xhr: xhr\n        });\n        xhr.upload.addEventListener(\"progress\", function(event) {\n          return _this2.uploadRequestDidProgress(event);\n        });\n      }\n    }, {\n      key: \"url\",\n      get: function get$$1() {\n        return this.input.getAttribute(\"data-direct-upload-url\");\n      }\n    } ]);\n    return DirectUploadController;\n  }();\n  var inputSelector = \"input[type=file][data-direct-upload-url]:not([disabled])\";\n  var DirectUploadsController = function() {\n    function DirectUploadsController(form) {\n      classCallCheck(this, DirectUploadsController);\n      this.form = form;\n      this.inputs = findElements(form, inputSelector).filter(function(input) {\n        return input.files.length;\n      });\n    }\n    createClass(DirectUploadsController, [ {\n      key: \"start\",\n      value: function start(callback) {\n        var _this = this;\n        var controllers = this.createDirectUploadControllers();\n        var startNextController = function startNextController() {\n          var controller = controllers.shift();\n          if (controller) {\n            controller.start(function(error) {\n              if (error) {\n                callback(error);\n                _this.dispatch(\"end\");\n              } else {\n                startNextController();\n              }\n            });\n          } else {\n            callback();\n            _this.dispatch(\"end\");\n          }\n        };\n        this.dispatch(\"start\");\n        startNextController();\n      }\n    }, {\n      key: \"createDirectUploadControllers\",\n      value: function createDirectUploadControllers() {\n        var controllers = [];\n        this.inputs.forEach(function(input) {\n          toArray$1(input.files).forEach(function(file) {\n            var controller = new DirectUploadController(input, file);\n            controllers.push(controller);\n          });\n        });\n        return controllers;\n      }\n    }, {\n      key: \"dispatch\",\n      value: function dispatch(name) {\n        var detail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        return dispatchEvent(this.form, \"direct-uploads:\" + name, {\n          detail: detail\n        });\n      }\n    } ]);\n    return DirectUploadsController;\n  }();\n  var processingAttribute = \"data-direct-uploads-processing\";\n  var submitButtonsByForm = new WeakMap();\n  var started = false;\n  function start() {\n    if (!started) {\n      started = true;\n      document.addEventListener(\"click\", didClick, true);\n      document.addEventListener(\"submit\", didSubmitForm);\n      document.addEventListener(\"ajax:before\", didSubmitRemoteElement);\n    }\n  }\n  function didClick(event) {\n    var target = event.target;\n    if ((target.tagName == \"INPUT\" || target.tagName == \"BUTTON\") && target.type == \"submit\" && target.form) {\n      submitButtonsByForm.set(target.form, target);\n    }\n  }\n  function didSubmitForm(event) {\n    handleFormSubmissionEvent(event);\n  }\n  function didSubmitRemoteElement(event) {\n    if (event.target.tagName == \"FORM\") {\n      handleFormSubmissionEvent(event);\n    }\n  }\n  function handleFormSubmissionEvent(event) {\n    var form = event.target;\n    if (form.hasAttribute(processingAttribute)) {\n      event.preventDefault();\n      return;\n    }\n    var controller = new DirectUploadsController(form);\n    var inputs = controller.inputs;\n    if (inputs.length) {\n      event.preventDefault();\n      form.setAttribute(processingAttribute, \"\");\n      inputs.forEach(disable);\n      controller.start(function(error) {\n        form.removeAttribute(processingAttribute);\n        if (error) {\n          inputs.forEach(enable);\n        } else {\n          submitForm(form);\n        }\n      });\n    }\n  }\n  function submitForm(form) {\n    var button = submitButtonsByForm.get(form) || findElement(form, \"input[type=submit], button[type=submit]\");\n    if (button) {\n      var _button = button, disabled = _button.disabled;\n      button.disabled = false;\n      button.focus();\n      button.click();\n      button.disabled = disabled;\n    } else {\n      button = document.createElement(\"input\");\n      button.type = \"submit\";\n      button.style.display = \"none\";\n      form.appendChild(button);\n      button.click();\n      form.removeChild(button);\n    }\n    submitButtonsByForm.delete(form);\n  }\n  function disable(input) {\n    input.disabled = true;\n  }\n  function enable(input) {\n    input.disabled = false;\n  }\n  function autostart() {\n    if (window.ActiveStorage) {\n      start();\n    }\n  }\n  setTimeout(autostart, 1);\n  exports.start = start;\n  exports.DirectUpload = DirectUpload;\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n});\n", "/*\nTurbo 7.3.0\nCopyright \u00A9 2023 37signals LLC\n */\n(function () {\n    if (window.Reflect === undefined ||\n        window.customElements === undefined ||\n        window.customElements.polyfillWrapFlushCallback) {\n        return;\n    }\n    const BuiltInHTMLElement = HTMLElement;\n    const wrapperForTheName = {\n        HTMLElement: function HTMLElement() {\n            return Reflect.construct(BuiltInHTMLElement, [], this.constructor);\n        },\n    };\n    window.HTMLElement = wrapperForTheName[\"HTMLElement\"];\n    HTMLElement.prototype = BuiltInHTMLElement.prototype;\n    HTMLElement.prototype.constructor = HTMLElement;\n    Object.setPrototypeOf(HTMLElement, BuiltInHTMLElement);\n})();\n\n/**\n * The MIT License (MIT)\n * \n * Copyright (c) 2019 Javan Makhmali\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n(function(prototype) {\n  if (typeof prototype.requestSubmit == \"function\") return\n\n  prototype.requestSubmit = function(submitter) {\n    if (submitter) {\n      validateSubmitter(submitter, this);\n      submitter.click();\n    } else {\n      submitter = document.createElement(\"input\");\n      submitter.type = \"submit\";\n      submitter.hidden = true;\n      this.appendChild(submitter);\n      submitter.click();\n      this.removeChild(submitter);\n    }\n  };\n\n  function validateSubmitter(submitter, form) {\n    submitter instanceof HTMLElement || raise(TypeError, \"parameter 1 is not of type 'HTMLElement'\");\n    submitter.type == \"submit\" || raise(TypeError, \"The specified element is not a submit button\");\n    submitter.form == form || raise(DOMException, \"The specified element is not owned by this form element\", \"NotFoundError\");\n  }\n\n  function raise(errorConstructor, message, name) {\n    throw new errorConstructor(\"Failed to execute 'requestSubmit' on 'HTMLFormElement': \" + message + \".\", name)\n  }\n})(HTMLFormElement.prototype);\n\nconst submittersByForm = new WeakMap();\nfunction findSubmitterFromClickTarget(target) {\n    const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n    const candidate = element ? element.closest(\"input, button\") : null;\n    return (candidate === null || candidate === void 0 ? void 0 : candidate.type) == \"submit\" ? candidate : null;\n}\nfunction clickCaptured(event) {\n    const submitter = findSubmitterFromClickTarget(event.target);\n    if (submitter && submitter.form) {\n        submittersByForm.set(submitter.form, submitter);\n    }\n}\n(function () {\n    if (\"submitter\" in Event.prototype)\n        return;\n    let prototype = window.Event.prototype;\n    if (\"SubmitEvent\" in window && /Apple Computer/.test(navigator.vendor)) {\n        prototype = window.SubmitEvent.prototype;\n    }\n    else if (\"SubmitEvent\" in window) {\n        return;\n    }\n    addEventListener(\"click\", clickCaptured, true);\n    Object.defineProperty(prototype, \"submitter\", {\n        get() {\n            if (this.type == \"submit\" && this.target instanceof HTMLFormElement) {\n                return submittersByForm.get(this.target);\n            }\n        },\n    });\n})();\n\nvar FrameLoadingStyle;\n(function (FrameLoadingStyle) {\n    FrameLoadingStyle[\"eager\"] = \"eager\";\n    FrameLoadingStyle[\"lazy\"] = \"lazy\";\n})(FrameLoadingStyle || (FrameLoadingStyle = {}));\nclass FrameElement extends HTMLElement {\n    static get observedAttributes() {\n        return [\"disabled\", \"complete\", \"loading\", \"src\"];\n    }\n    constructor() {\n        super();\n        this.loaded = Promise.resolve();\n        this.delegate = new FrameElement.delegateConstructor(this);\n    }\n    connectedCallback() {\n        this.delegate.connect();\n    }\n    disconnectedCallback() {\n        this.delegate.disconnect();\n    }\n    reload() {\n        return this.delegate.sourceURLReloaded();\n    }\n    attributeChangedCallback(name) {\n        if (name == \"loading\") {\n            this.delegate.loadingStyleChanged();\n        }\n        else if (name == \"complete\") {\n            this.delegate.completeChanged();\n        }\n        else if (name == \"src\") {\n            this.delegate.sourceURLChanged();\n        }\n        else {\n            this.delegate.disabledChanged();\n        }\n    }\n    get src() {\n        return this.getAttribute(\"src\");\n    }\n    set src(value) {\n        if (value) {\n            this.setAttribute(\"src\", value);\n        }\n        else {\n            this.removeAttribute(\"src\");\n        }\n    }\n    get loading() {\n        return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\");\n    }\n    set loading(value) {\n        if (value) {\n            this.setAttribute(\"loading\", value);\n        }\n        else {\n            this.removeAttribute(\"loading\");\n        }\n    }\n    get disabled() {\n        return this.hasAttribute(\"disabled\");\n    }\n    set disabled(value) {\n        if (value) {\n            this.setAttribute(\"disabled\", \"\");\n        }\n        else {\n            this.removeAttribute(\"disabled\");\n        }\n    }\n    get autoscroll() {\n        return this.hasAttribute(\"autoscroll\");\n    }\n    set autoscroll(value) {\n        if (value) {\n            this.setAttribute(\"autoscroll\", \"\");\n        }\n        else {\n            this.removeAttribute(\"autoscroll\");\n        }\n    }\n    get complete() {\n        return !this.delegate.isLoading;\n    }\n    get isActive() {\n        return this.ownerDocument === document && !this.isPreview;\n    }\n    get isPreview() {\n        var _a, _b;\n        return (_b = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.hasAttribute(\"data-turbo-preview\");\n    }\n}\nfunction frameLoadingStyleFromString(style) {\n    switch (style.toLowerCase()) {\n        case \"lazy\":\n            return FrameLoadingStyle.lazy;\n        default:\n            return FrameLoadingStyle.eager;\n    }\n}\n\nfunction expandURL(locatable) {\n    return new URL(locatable.toString(), document.baseURI);\n}\nfunction getAnchor(url) {\n    let anchorMatch;\n    if (url.hash) {\n        return url.hash.slice(1);\n    }\n    else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n        return anchorMatch[1];\n    }\n}\nfunction getAction(form, submitter) {\n    const action = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formaction\")) || form.getAttribute(\"action\") || form.action;\n    return expandURL(action);\n}\nfunction getExtension(url) {\n    return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\";\n}\nfunction isHTML(url) {\n    return !!getExtension(url).match(/^(?:|\\.(?:htm|html|xhtml|php))$/);\n}\nfunction isPrefixedBy(baseURL, url) {\n    const prefix = getPrefix(url);\n    return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix);\n}\nfunction locationIsVisitable(location, rootLocation) {\n    return isPrefixedBy(location, rootLocation) && isHTML(location);\n}\nfunction getRequestURL(url) {\n    const anchor = getAnchor(url);\n    return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href;\n}\nfunction toCacheKey(url) {\n    return getRequestURL(url);\n}\nfunction urlsAreEqual(left, right) {\n    return expandURL(left).href == expandURL(right).href;\n}\nfunction getPathComponents(url) {\n    return url.pathname.split(\"/\").slice(1);\n}\nfunction getLastPathComponent(url) {\n    return getPathComponents(url).slice(-1)[0];\n}\nfunction getPrefix(url) {\n    return addTrailingSlash(url.origin + url.pathname);\n}\nfunction addTrailingSlash(value) {\n    return value.endsWith(\"/\") ? value : value + \"/\";\n}\n\nclass FetchResponse {\n    constructor(response) {\n        this.response = response;\n    }\n    get succeeded() {\n        return this.response.ok;\n    }\n    get failed() {\n        return !this.succeeded;\n    }\n    get clientError() {\n        return this.statusCode >= 400 && this.statusCode <= 499;\n    }\n    get serverError() {\n        return this.statusCode >= 500 && this.statusCode <= 599;\n    }\n    get redirected() {\n        return this.response.redirected;\n    }\n    get location() {\n        return expandURL(this.response.url);\n    }\n    get isHTML() {\n        return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/);\n    }\n    get statusCode() {\n        return this.response.status;\n    }\n    get contentType() {\n        return this.header(\"Content-Type\");\n    }\n    get responseText() {\n        return this.response.clone().text();\n    }\n    get responseHTML() {\n        if (this.isHTML) {\n            return this.response.clone().text();\n        }\n        else {\n            return Promise.resolve(undefined);\n        }\n    }\n    header(name) {\n        return this.response.headers.get(name);\n    }\n}\n\nfunction activateScriptElement(element) {\n    if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n        return element;\n    }\n    else {\n        const createdScriptElement = document.createElement(\"script\");\n        const cspNonce = getMetaContent(\"csp-nonce\");\n        if (cspNonce) {\n            createdScriptElement.nonce = cspNonce;\n        }\n        createdScriptElement.textContent = element.textContent;\n        createdScriptElement.async = false;\n        copyElementAttributes(createdScriptElement, element);\n        return createdScriptElement;\n    }\n}\nfunction copyElementAttributes(destinationElement, sourceElement) {\n    for (const { name, value } of sourceElement.attributes) {\n        destinationElement.setAttribute(name, value);\n    }\n}\nfunction createDocumentFragment(html) {\n    const template = document.createElement(\"template\");\n    template.innerHTML = html;\n    return template.content;\n}\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n    const event = new CustomEvent(eventName, {\n        cancelable,\n        bubbles: true,\n        composed: true,\n        detail,\n    });\n    if (target && target.isConnected) {\n        target.dispatchEvent(event);\n    }\n    else {\n        document.documentElement.dispatchEvent(event);\n    }\n    return event;\n}\nfunction nextAnimationFrame() {\n    return new Promise((resolve) => requestAnimationFrame(() => resolve()));\n}\nfunction nextEventLoopTick() {\n    return new Promise((resolve) => setTimeout(() => resolve(), 0));\n}\nfunction nextMicrotask() {\n    return Promise.resolve();\n}\nfunction parseHTMLDocument(html = \"\") {\n    return new DOMParser().parseFromString(html, \"text/html\");\n}\nfunction unindent(strings, ...values) {\n    const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n    const match = lines[0].match(/^\\s+/);\n    const indent = match ? match[0].length : 0;\n    return lines.map((line) => line.slice(indent)).join(\"\\n\");\n}\nfunction interpolate(strings, values) {\n    return strings.reduce((result, string, i) => {\n        const value = values[i] == undefined ? \"\" : values[i];\n        return result + string + value;\n    }, \"\");\n}\nfunction uuid() {\n    return Array.from({ length: 36 })\n        .map((_, i) => {\n        if (i == 8 || i == 13 || i == 18 || i == 23) {\n            return \"-\";\n        }\n        else if (i == 14) {\n            return \"4\";\n        }\n        else if (i == 19) {\n            return (Math.floor(Math.random() * 4) + 8).toString(16);\n        }\n        else {\n            return Math.floor(Math.random() * 15).toString(16);\n        }\n    })\n        .join(\"\");\n}\nfunction getAttribute(attributeName, ...elements) {\n    for (const value of elements.map((element) => element === null || element === void 0 ? void 0 : element.getAttribute(attributeName))) {\n        if (typeof value == \"string\")\n            return value;\n    }\n    return null;\n}\nfunction hasAttribute(attributeName, ...elements) {\n    return elements.some((element) => element && element.hasAttribute(attributeName));\n}\nfunction markAsBusy(...elements) {\n    for (const element of elements) {\n        if (element.localName == \"turbo-frame\") {\n            element.setAttribute(\"busy\", \"\");\n        }\n        element.setAttribute(\"aria-busy\", \"true\");\n    }\n}\nfunction clearBusyState(...elements) {\n    for (const element of elements) {\n        if (element.localName == \"turbo-frame\") {\n            element.removeAttribute(\"busy\");\n        }\n        element.removeAttribute(\"aria-busy\");\n    }\n}\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n    return new Promise((resolve) => {\n        const onComplete = () => {\n            element.removeEventListener(\"error\", onComplete);\n            element.removeEventListener(\"load\", onComplete);\n            resolve();\n        };\n        element.addEventListener(\"load\", onComplete, { once: true });\n        element.addEventListener(\"error\", onComplete, { once: true });\n        setTimeout(resolve, timeoutInMilliseconds);\n    });\n}\nfunction getHistoryMethodForAction(action) {\n    switch (action) {\n        case \"replace\":\n            return history.replaceState;\n        case \"advance\":\n        case \"restore\":\n            return history.pushState;\n    }\n}\nfunction isAction(action) {\n    return action == \"advance\" || action == \"replace\" || action == \"restore\";\n}\nfunction getVisitAction(...elements) {\n    const action = getAttribute(\"data-turbo-action\", ...elements);\n    return isAction(action) ? action : null;\n}\nfunction getMetaElement(name) {\n    return document.querySelector(`meta[name=\"${name}\"]`);\n}\nfunction getMetaContent(name) {\n    const element = getMetaElement(name);\n    return element && element.content;\n}\nfunction setMetaContent(name, content) {\n    let element = getMetaElement(name);\n    if (!element) {\n        element = document.createElement(\"meta\");\n        element.setAttribute(\"name\", name);\n        document.head.appendChild(element);\n    }\n    element.setAttribute(\"content\", content);\n    return element;\n}\nfunction findClosestRecursively(element, selector) {\n    var _a;\n    if (element instanceof Element) {\n        return (element.closest(selector) ||\n            findClosestRecursively(element.assignedSlot || ((_a = element.getRootNode()) === null || _a === void 0 ? void 0 : _a.host), selector));\n    }\n}\n\nvar FetchMethod;\n(function (FetchMethod) {\n    FetchMethod[FetchMethod[\"get\"] = 0] = \"get\";\n    FetchMethod[FetchMethod[\"post\"] = 1] = \"post\";\n    FetchMethod[FetchMethod[\"put\"] = 2] = \"put\";\n    FetchMethod[FetchMethod[\"patch\"] = 3] = \"patch\";\n    FetchMethod[FetchMethod[\"delete\"] = 4] = \"delete\";\n})(FetchMethod || (FetchMethod = {}));\nfunction fetchMethodFromString(method) {\n    switch (method.toLowerCase()) {\n        case \"get\":\n            return FetchMethod.get;\n        case \"post\":\n            return FetchMethod.post;\n        case \"put\":\n            return FetchMethod.put;\n        case \"patch\":\n            return FetchMethod.patch;\n        case \"delete\":\n            return FetchMethod.delete;\n    }\n}\nclass FetchRequest {\n    constructor(delegate, method, location, body = new URLSearchParams(), target = null) {\n        this.abortController = new AbortController();\n        this.resolveRequestPromise = (_value) => { };\n        this.delegate = delegate;\n        this.method = method;\n        this.headers = this.defaultHeaders;\n        this.body = body;\n        this.url = location;\n        this.target = target;\n    }\n    get location() {\n        return this.url;\n    }\n    get params() {\n        return this.url.searchParams;\n    }\n    get entries() {\n        return this.body ? Array.from(this.body.entries()) : [];\n    }\n    cancel() {\n        this.abortController.abort();\n    }\n    async perform() {\n        const { fetchOptions } = this;\n        this.delegate.prepareRequest(this);\n        await this.allowRequestToBeIntercepted(fetchOptions);\n        try {\n            this.delegate.requestStarted(this);\n            const response = await fetch(this.url.href, fetchOptions);\n            return await this.receive(response);\n        }\n        catch (error) {\n            if (error.name !== \"AbortError\") {\n                if (this.willDelegateErrorHandling(error)) {\n                    this.delegate.requestErrored(this, error);\n                }\n                throw error;\n            }\n        }\n        finally {\n            this.delegate.requestFinished(this);\n        }\n    }\n    async receive(response) {\n        const fetchResponse = new FetchResponse(response);\n        const event = dispatch(\"turbo:before-fetch-response\", {\n            cancelable: true,\n            detail: { fetchResponse },\n            target: this.target,\n        });\n        if (event.defaultPrevented) {\n            this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n        }\n        else if (fetchResponse.succeeded) {\n            this.delegate.requestSucceededWithResponse(this, fetchResponse);\n        }\n        else {\n            this.delegate.requestFailedWithResponse(this, fetchResponse);\n        }\n        return fetchResponse;\n    }\n    get fetchOptions() {\n        var _a;\n        return {\n            method: FetchMethod[this.method].toUpperCase(),\n            credentials: \"same-origin\",\n            headers: this.headers,\n            redirect: \"follow\",\n            body: this.isSafe ? null : this.body,\n            signal: this.abortSignal,\n            referrer: (_a = this.delegate.referrer) === null || _a === void 0 ? void 0 : _a.href,\n        };\n    }\n    get defaultHeaders() {\n        return {\n            Accept: \"text/html, application/xhtml+xml\",\n        };\n    }\n    get isSafe() {\n        return this.method === FetchMethod.get;\n    }\n    get abortSignal() {\n        return this.abortController.signal;\n    }\n    acceptResponseType(mimeType) {\n        this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n    }\n    async allowRequestToBeIntercepted(fetchOptions) {\n        const requestInterception = new Promise((resolve) => (this.resolveRequestPromise = resolve));\n        const event = dispatch(\"turbo:before-fetch-request\", {\n            cancelable: true,\n            detail: {\n                fetchOptions,\n                url: this.url,\n                resume: this.resolveRequestPromise,\n            },\n            target: this.target,\n        });\n        if (event.defaultPrevented)\n            await requestInterception;\n    }\n    willDelegateErrorHandling(error) {\n        const event = dispatch(\"turbo:fetch-request-error\", {\n            target: this.target,\n            cancelable: true,\n            detail: { request: this, error: error },\n        });\n        return !event.defaultPrevented;\n    }\n}\n\nclass AppearanceObserver {\n    constructor(delegate, element) {\n        this.started = false;\n        this.intersect = (entries) => {\n            const lastEntry = entries.slice(-1)[0];\n            if (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.isIntersecting) {\n                this.delegate.elementAppearedInViewport(this.element);\n            }\n        };\n        this.delegate = delegate;\n        this.element = element;\n        this.intersectionObserver = new IntersectionObserver(this.intersect);\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.intersectionObserver.observe(this.element);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.intersectionObserver.unobserve(this.element);\n        }\n    }\n}\n\nclass StreamMessage {\n    static wrap(message) {\n        if (typeof message == \"string\") {\n            return new this(createDocumentFragment(message));\n        }\n        else {\n            return message;\n        }\n    }\n    constructor(fragment) {\n        this.fragment = importStreamElements(fragment);\n    }\n}\nStreamMessage.contentType = \"text/vnd.turbo-stream.html\";\nfunction importStreamElements(fragment) {\n    for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n        const streamElement = document.importNode(element, true);\n        for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n            inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n        }\n        element.replaceWith(streamElement);\n    }\n    return fragment;\n}\n\nvar FormSubmissionState;\n(function (FormSubmissionState) {\n    FormSubmissionState[FormSubmissionState[\"initialized\"] = 0] = \"initialized\";\n    FormSubmissionState[FormSubmissionState[\"requesting\"] = 1] = \"requesting\";\n    FormSubmissionState[FormSubmissionState[\"waiting\"] = 2] = \"waiting\";\n    FormSubmissionState[FormSubmissionState[\"receiving\"] = 3] = \"receiving\";\n    FormSubmissionState[FormSubmissionState[\"stopping\"] = 4] = \"stopping\";\n    FormSubmissionState[FormSubmissionState[\"stopped\"] = 5] = \"stopped\";\n})(FormSubmissionState || (FormSubmissionState = {}));\nvar FormEnctype;\n(function (FormEnctype) {\n    FormEnctype[\"urlEncoded\"] = \"application/x-www-form-urlencoded\";\n    FormEnctype[\"multipart\"] = \"multipart/form-data\";\n    FormEnctype[\"plain\"] = \"text/plain\";\n})(FormEnctype || (FormEnctype = {}));\nfunction formEnctypeFromString(encoding) {\n    switch (encoding.toLowerCase()) {\n        case FormEnctype.multipart:\n            return FormEnctype.multipart;\n        case FormEnctype.plain:\n            return FormEnctype.plain;\n        default:\n            return FormEnctype.urlEncoded;\n    }\n}\nclass FormSubmission {\n    static confirmMethod(message, _element, _submitter) {\n        return Promise.resolve(confirm(message));\n    }\n    constructor(delegate, formElement, submitter, mustRedirect = false) {\n        this.state = FormSubmissionState.initialized;\n        this.delegate = delegate;\n        this.formElement = formElement;\n        this.submitter = submitter;\n        this.formData = buildFormData(formElement, submitter);\n        this.location = expandURL(this.action);\n        if (this.method == FetchMethod.get) {\n            mergeFormDataEntries(this.location, [...this.body.entries()]);\n        }\n        this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body, this.formElement);\n        this.mustRedirect = mustRedirect;\n    }\n    get method() {\n        var _a;\n        const method = ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formmethod\")) || this.formElement.getAttribute(\"method\") || \"\";\n        return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get;\n    }\n    get action() {\n        var _a;\n        const formElementAction = typeof this.formElement.action === \"string\" ? this.formElement.action : null;\n        if ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.hasAttribute(\"formaction\")) {\n            return this.submitter.getAttribute(\"formaction\") || \"\";\n        }\n        else {\n            return this.formElement.getAttribute(\"action\") || formElementAction || \"\";\n        }\n    }\n    get body() {\n        if (this.enctype == FormEnctype.urlEncoded || this.method == FetchMethod.get) {\n            return new URLSearchParams(this.stringFormData);\n        }\n        else {\n            return this.formData;\n        }\n    }\n    get enctype() {\n        var _a;\n        return formEnctypeFromString(((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formenctype\")) || this.formElement.enctype);\n    }\n    get isSafe() {\n        return this.fetchRequest.isSafe;\n    }\n    get stringFormData() {\n        return [...this.formData].reduce((entries, [name, value]) => {\n            return entries.concat(typeof value == \"string\" ? [[name, value]] : []);\n        }, []);\n    }\n    async start() {\n        const { initialized, requesting } = FormSubmissionState;\n        const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n        if (typeof confirmationMessage === \"string\") {\n            const answer = await FormSubmission.confirmMethod(confirmationMessage, this.formElement, this.submitter);\n            if (!answer) {\n                return;\n            }\n        }\n        if (this.state == initialized) {\n            this.state = requesting;\n            return this.fetchRequest.perform();\n        }\n    }\n    stop() {\n        const { stopping, stopped } = FormSubmissionState;\n        if (this.state != stopping && this.state != stopped) {\n            this.state = stopping;\n            this.fetchRequest.cancel();\n            return true;\n        }\n    }\n    prepareRequest(request) {\n        if (!request.isSafe) {\n            const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n            if (token) {\n                request.headers[\"X-CSRF-Token\"] = token;\n            }\n        }\n        if (this.requestAcceptsTurboStreamResponse(request)) {\n            request.acceptResponseType(StreamMessage.contentType);\n        }\n    }\n    requestStarted(_request) {\n        var _a;\n        this.state = FormSubmissionState.waiting;\n        (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.setAttribute(\"disabled\", \"\");\n        this.setSubmitsWith();\n        dispatch(\"turbo:submit-start\", {\n            target: this.formElement,\n            detail: { formSubmission: this },\n        });\n        this.delegate.formSubmissionStarted(this);\n    }\n    requestPreventedHandlingResponse(request, response) {\n        this.result = { success: response.succeeded, fetchResponse: response };\n    }\n    requestSucceededWithResponse(request, response) {\n        if (response.clientError || response.serverError) {\n            this.delegate.formSubmissionFailedWithResponse(this, response);\n        }\n        else if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n            const error = new Error(\"Form responses must redirect to another location\");\n            this.delegate.formSubmissionErrored(this, error);\n        }\n        else {\n            this.state = FormSubmissionState.receiving;\n            this.result = { success: true, fetchResponse: response };\n            this.delegate.formSubmissionSucceededWithResponse(this, response);\n        }\n    }\n    requestFailedWithResponse(request, response) {\n        this.result = { success: false, fetchResponse: response };\n        this.delegate.formSubmissionFailedWithResponse(this, response);\n    }\n    requestErrored(request, error) {\n        this.result = { success: false, error };\n        this.delegate.formSubmissionErrored(this, error);\n    }\n    requestFinished(_request) {\n        var _a;\n        this.state = FormSubmissionState.stopped;\n        (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.removeAttribute(\"disabled\");\n        this.resetSubmitterText();\n        dispatch(\"turbo:submit-end\", {\n            target: this.formElement,\n            detail: Object.assign({ formSubmission: this }, this.result),\n        });\n        this.delegate.formSubmissionFinished(this);\n    }\n    setSubmitsWith() {\n        if (!this.submitter || !this.submitsWith)\n            return;\n        if (this.submitter.matches(\"button\")) {\n            this.originalSubmitText = this.submitter.innerHTML;\n            this.submitter.innerHTML = this.submitsWith;\n        }\n        else if (this.submitter.matches(\"input\")) {\n            const input = this.submitter;\n            this.originalSubmitText = input.value;\n            input.value = this.submitsWith;\n        }\n    }\n    resetSubmitterText() {\n        if (!this.submitter || !this.originalSubmitText)\n            return;\n        if (this.submitter.matches(\"button\")) {\n            this.submitter.innerHTML = this.originalSubmitText;\n        }\n        else if (this.submitter.matches(\"input\")) {\n            const input = this.submitter;\n            input.value = this.originalSubmitText;\n        }\n    }\n    requestMustRedirect(request) {\n        return !request.isSafe && this.mustRedirect;\n    }\n    requestAcceptsTurboStreamResponse(request) {\n        return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement);\n    }\n    get submitsWith() {\n        var _a;\n        return (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"data-turbo-submits-with\");\n    }\n}\nfunction buildFormData(formElement, submitter) {\n    const formData = new FormData(formElement);\n    const name = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"name\");\n    const value = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"value\");\n    if (name) {\n        formData.append(name, value || \"\");\n    }\n    return formData;\n}\nfunction getCookieValue(cookieName) {\n    if (cookieName != null) {\n        const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n        const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n        if (cookie) {\n            const value = cookie.split(\"=\").slice(1).join(\"=\");\n            return value ? decodeURIComponent(value) : undefined;\n        }\n    }\n}\nfunction responseSucceededWithoutRedirect(response) {\n    return response.statusCode == 200 && !response.redirected;\n}\nfunction mergeFormDataEntries(url, entries) {\n    const searchParams = new URLSearchParams();\n    for (const [name, value] of entries) {\n        if (value instanceof File)\n            continue;\n        searchParams.append(name, value);\n    }\n    url.search = searchParams.toString();\n    return url;\n}\n\nclass Snapshot {\n    constructor(element) {\n        this.element = element;\n    }\n    get activeElement() {\n        return this.element.ownerDocument.activeElement;\n    }\n    get children() {\n        return [...this.element.children];\n    }\n    hasAnchor(anchor) {\n        return this.getElementForAnchor(anchor) != null;\n    }\n    getElementForAnchor(anchor) {\n        return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null;\n    }\n    get isConnected() {\n        return this.element.isConnected;\n    }\n    get firstAutofocusableElement() {\n        const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n        for (const element of this.element.querySelectorAll(\"[autofocus]\")) {\n            if (element.closest(inertDisabledOrHidden) == null)\n                return element;\n            else\n                continue;\n        }\n        return null;\n    }\n    get permanentElements() {\n        return queryPermanentElementsAll(this.element);\n    }\n    getPermanentElementById(id) {\n        return getPermanentElementById(this.element, id);\n    }\n    getPermanentElementMapForSnapshot(snapshot) {\n        const permanentElementMap = {};\n        for (const currentPermanentElement of this.permanentElements) {\n            const { id } = currentPermanentElement;\n            const newPermanentElement = snapshot.getPermanentElementById(id);\n            if (newPermanentElement) {\n                permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n            }\n        }\n        return permanentElementMap;\n    }\n}\nfunction getPermanentElementById(node, id) {\n    return node.querySelector(`#${id}[data-turbo-permanent]`);\n}\nfunction queryPermanentElementsAll(node) {\n    return node.querySelectorAll(\"[id][data-turbo-permanent]\");\n}\n\nclass FormSubmitObserver {\n    constructor(delegate, eventTarget) {\n        this.started = false;\n        this.submitCaptured = () => {\n            this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n            this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n        };\n        this.submitBubbled = ((event) => {\n            if (!event.defaultPrevented) {\n                const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n                const submitter = event.submitter || undefined;\n                if (form &&\n                    submissionDoesNotDismissDialog(form, submitter) &&\n                    submissionDoesNotTargetIFrame(form, submitter) &&\n                    this.delegate.willSubmitForm(form, submitter)) {\n                    event.preventDefault();\n                    event.stopImmediatePropagation();\n                    this.delegate.formSubmitted(form, submitter);\n                }\n            }\n        });\n        this.delegate = delegate;\n        this.eventTarget = eventTarget;\n    }\n    start() {\n        if (!this.started) {\n            this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n            this.started = false;\n        }\n    }\n}\nfunction submissionDoesNotDismissDialog(form, submitter) {\n    const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formmethod\")) || form.getAttribute(\"method\");\n    return method != \"dialog\";\n}\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n    if ((submitter === null || submitter === void 0 ? void 0 : submitter.hasAttribute(\"formtarget\")) || form.hasAttribute(\"target\")) {\n        const target = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formtarget\")) || form.target;\n        for (const element of document.getElementsByName(target)) {\n            if (element instanceof HTMLIFrameElement)\n                return false;\n        }\n        return true;\n    }\n    else {\n        return true;\n    }\n}\n\nclass View {\n    constructor(delegate, element) {\n        this.resolveRenderPromise = (_value) => { };\n        this.resolveInterceptionPromise = (_value) => { };\n        this.delegate = delegate;\n        this.element = element;\n    }\n    scrollToAnchor(anchor) {\n        const element = this.snapshot.getElementForAnchor(anchor);\n        if (element) {\n            this.scrollToElement(element);\n            this.focusElement(element);\n        }\n        else {\n            this.scrollToPosition({ x: 0, y: 0 });\n        }\n    }\n    scrollToAnchorFromLocation(location) {\n        this.scrollToAnchor(getAnchor(location));\n    }\n    scrollToElement(element) {\n        element.scrollIntoView();\n    }\n    focusElement(element) {\n        if (element instanceof HTMLElement) {\n            if (element.hasAttribute(\"tabindex\")) {\n                element.focus();\n            }\n            else {\n                element.setAttribute(\"tabindex\", \"-1\");\n                element.focus();\n                element.removeAttribute(\"tabindex\");\n            }\n        }\n    }\n    scrollToPosition({ x, y }) {\n        this.scrollRoot.scrollTo(x, y);\n    }\n    scrollToTop() {\n        this.scrollToPosition({ x: 0, y: 0 });\n    }\n    get scrollRoot() {\n        return window;\n    }\n    async render(renderer) {\n        const { isPreview, shouldRender, newSnapshot: snapshot } = renderer;\n        if (shouldRender) {\n            try {\n                this.renderPromise = new Promise((resolve) => (this.resolveRenderPromise = resolve));\n                this.renderer = renderer;\n                await this.prepareToRenderSnapshot(renderer);\n                const renderInterception = new Promise((resolve) => (this.resolveInterceptionPromise = resolve));\n                const options = { resume: this.resolveInterceptionPromise, render: this.renderer.renderElement };\n                const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n                if (!immediateRender)\n                    await renderInterception;\n                await this.renderSnapshot(renderer);\n                this.delegate.viewRenderedSnapshot(snapshot, isPreview);\n                this.delegate.preloadOnLoadLinksForView(this.element);\n                this.finishRenderingSnapshot(renderer);\n            }\n            finally {\n                delete this.renderer;\n                this.resolveRenderPromise(undefined);\n                delete this.renderPromise;\n            }\n        }\n        else {\n            this.invalidate(renderer.reloadReason);\n        }\n    }\n    invalidate(reason) {\n        this.delegate.viewInvalidated(reason);\n    }\n    async prepareToRenderSnapshot(renderer) {\n        this.markAsPreview(renderer.isPreview);\n        await renderer.prepareToRender();\n    }\n    markAsPreview(isPreview) {\n        if (isPreview) {\n            this.element.setAttribute(\"data-turbo-preview\", \"\");\n        }\n        else {\n            this.element.removeAttribute(\"data-turbo-preview\");\n        }\n    }\n    async renderSnapshot(renderer) {\n        await renderer.render();\n    }\n    finishRenderingSnapshot(renderer) {\n        renderer.finishRendering();\n    }\n}\n\nclass FrameView extends View {\n    missing() {\n        this.element.innerHTML = `<strong class=\"turbo-frame-error\">Content missing</strong>`;\n    }\n    get snapshot() {\n        return new Snapshot(this.element);\n    }\n}\n\nclass LinkInterceptor {\n    constructor(delegate, element) {\n        this.clickBubbled = (event) => {\n            if (this.respondsToEventTarget(event.target)) {\n                this.clickEvent = event;\n            }\n            else {\n                delete this.clickEvent;\n            }\n        };\n        this.linkClicked = ((event) => {\n            if (this.clickEvent && this.respondsToEventTarget(event.target) && event.target instanceof Element) {\n                if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n                    this.clickEvent.preventDefault();\n                    event.preventDefault();\n                    this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n                }\n            }\n            delete this.clickEvent;\n        });\n        this.willVisit = ((_event) => {\n            delete this.clickEvent;\n        });\n        this.delegate = delegate;\n        this.element = element;\n    }\n    start() {\n        this.element.addEventListener(\"click\", this.clickBubbled);\n        document.addEventListener(\"turbo:click\", this.linkClicked);\n        document.addEventListener(\"turbo:before-visit\", this.willVisit);\n    }\n    stop() {\n        this.element.removeEventListener(\"click\", this.clickBubbled);\n        document.removeEventListener(\"turbo:click\", this.linkClicked);\n        document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n    }\n    respondsToEventTarget(target) {\n        const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n        return element && element.closest(\"turbo-frame, html\") == this.element;\n    }\n}\n\nclass LinkClickObserver {\n    constructor(delegate, eventTarget) {\n        this.started = false;\n        this.clickCaptured = () => {\n            this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n            this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n        };\n        this.clickBubbled = (event) => {\n            if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n                const target = (event.composedPath && event.composedPath()[0]) || event.target;\n                const link = this.findLinkFromClickTarget(target);\n                if (link && doesNotTargetIFrame(link)) {\n                    const location = this.getLocationForLink(link);\n                    if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n                        event.preventDefault();\n                        this.delegate.followedLinkToLocation(link, location);\n                    }\n                }\n            }\n        };\n        this.delegate = delegate;\n        this.eventTarget = eventTarget;\n    }\n    start() {\n        if (!this.started) {\n            this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n            this.started = false;\n        }\n    }\n    clickEventIsSignificant(event) {\n        return !((event.target && event.target.isContentEditable) ||\n            event.defaultPrevented ||\n            event.which > 1 ||\n            event.altKey ||\n            event.ctrlKey ||\n            event.metaKey ||\n            event.shiftKey);\n    }\n    findLinkFromClickTarget(target) {\n        return findClosestRecursively(target, \"a[href]:not([target^=_]):not([download])\");\n    }\n    getLocationForLink(link) {\n        return expandURL(link.getAttribute(\"href\") || \"\");\n    }\n}\nfunction doesNotTargetIFrame(anchor) {\n    if (anchor.hasAttribute(\"target\")) {\n        for (const element of document.getElementsByName(anchor.target)) {\n            if (element instanceof HTMLIFrameElement)\n                return false;\n        }\n        return true;\n    }\n    else {\n        return true;\n    }\n}\n\nclass FormLinkClickObserver {\n    constructor(delegate, element) {\n        this.delegate = delegate;\n        this.linkInterceptor = new LinkClickObserver(this, element);\n    }\n    start() {\n        this.linkInterceptor.start();\n    }\n    stop() {\n        this.linkInterceptor.stop();\n    }\n    willFollowLinkToLocation(link, location, originalEvent) {\n        return (this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n            link.hasAttribute(\"data-turbo-method\"));\n    }\n    followedLinkToLocation(link, location) {\n        const form = document.createElement(\"form\");\n        const type = \"hidden\";\n        for (const [name, value] of location.searchParams) {\n            form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n        }\n        const action = Object.assign(location, { search: \"\" });\n        form.setAttribute(\"data-turbo\", \"true\");\n        form.setAttribute(\"action\", action.href);\n        form.setAttribute(\"hidden\", \"\");\n        const method = link.getAttribute(\"data-turbo-method\");\n        if (method)\n            form.setAttribute(\"method\", method);\n        const turboFrame = link.getAttribute(\"data-turbo-frame\");\n        if (turboFrame)\n            form.setAttribute(\"data-turbo-frame\", turboFrame);\n        const turboAction = getVisitAction(link);\n        if (turboAction)\n            form.setAttribute(\"data-turbo-action\", turboAction);\n        const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n        if (turboConfirm)\n            form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n        const turboStream = link.hasAttribute(\"data-turbo-stream\");\n        if (turboStream)\n            form.setAttribute(\"data-turbo-stream\", \"\");\n        this.delegate.submittedFormLinkToLocation(link, location, form);\n        document.body.appendChild(form);\n        form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n        requestAnimationFrame(() => form.requestSubmit());\n    }\n}\n\nclass Bardo {\n    static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n        const bardo = new this(delegate, permanentElementMap);\n        bardo.enter();\n        await callback();\n        bardo.leave();\n    }\n    constructor(delegate, permanentElementMap) {\n        this.delegate = delegate;\n        this.permanentElementMap = permanentElementMap;\n    }\n    enter() {\n        for (const id in this.permanentElementMap) {\n            const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n            this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n            this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n        }\n    }\n    leave() {\n        for (const id in this.permanentElementMap) {\n            const [currentPermanentElement] = this.permanentElementMap[id];\n            this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n            this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n            this.delegate.leavingBardo(currentPermanentElement);\n        }\n    }\n    replaceNewPermanentElementWithPlaceholder(permanentElement) {\n        const placeholder = createPlaceholderForPermanentElement(permanentElement);\n        permanentElement.replaceWith(placeholder);\n    }\n    replaceCurrentPermanentElementWithClone(permanentElement) {\n        const clone = permanentElement.cloneNode(true);\n        permanentElement.replaceWith(clone);\n    }\n    replacePlaceholderWithPermanentElement(permanentElement) {\n        const placeholder = this.getPlaceholderById(permanentElement.id);\n        placeholder === null || placeholder === void 0 ? void 0 : placeholder.replaceWith(permanentElement);\n    }\n    getPlaceholderById(id) {\n        return this.placeholders.find((element) => element.content == id);\n    }\n    get placeholders() {\n        return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")];\n    }\n}\nfunction createPlaceholderForPermanentElement(permanentElement) {\n    const element = document.createElement(\"meta\");\n    element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n    element.setAttribute(\"content\", permanentElement.id);\n    return element;\n}\n\nclass Renderer {\n    constructor(currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n        this.activeElement = null;\n        this.currentSnapshot = currentSnapshot;\n        this.newSnapshot = newSnapshot;\n        this.isPreview = isPreview;\n        this.willRender = willRender;\n        this.renderElement = renderElement;\n        this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n    }\n    get shouldRender() {\n        return true;\n    }\n    get reloadReason() {\n        return;\n    }\n    prepareToRender() {\n        return;\n    }\n    finishRendering() {\n        if (this.resolvingFunctions) {\n            this.resolvingFunctions.resolve();\n            delete this.resolvingFunctions;\n        }\n    }\n    async preservingPermanentElements(callback) {\n        await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n    }\n    focusFirstAutofocusableElement() {\n        const element = this.connectedSnapshot.firstAutofocusableElement;\n        if (elementIsFocusable(element)) {\n            element.focus();\n        }\n    }\n    enteringBardo(currentPermanentElement) {\n        if (this.activeElement)\n            return;\n        if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n            this.activeElement = this.currentSnapshot.activeElement;\n        }\n    }\n    leavingBardo(currentPermanentElement) {\n        if (currentPermanentElement.contains(this.activeElement) && this.activeElement instanceof HTMLElement) {\n            this.activeElement.focus();\n            this.activeElement = null;\n        }\n    }\n    get connectedSnapshot() {\n        return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot;\n    }\n    get currentElement() {\n        return this.currentSnapshot.element;\n    }\n    get newElement() {\n        return this.newSnapshot.element;\n    }\n    get permanentElementMap() {\n        return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot);\n    }\n}\nfunction elementIsFocusable(element) {\n    return element && typeof element.focus == \"function\";\n}\n\nclass FrameRenderer extends Renderer {\n    static renderElement(currentElement, newElement) {\n        var _a;\n        const destinationRange = document.createRange();\n        destinationRange.selectNodeContents(currentElement);\n        destinationRange.deleteContents();\n        const frameElement = newElement;\n        const sourceRange = (_a = frameElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.createRange();\n        if (sourceRange) {\n            sourceRange.selectNodeContents(frameElement);\n            currentElement.appendChild(sourceRange.extractContents());\n        }\n    }\n    constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n        super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n        this.delegate = delegate;\n    }\n    get shouldRender() {\n        return true;\n    }\n    async render() {\n        await nextAnimationFrame();\n        this.preservingPermanentElements(() => {\n            this.loadFrameElement();\n        });\n        this.scrollFrameIntoView();\n        await nextAnimationFrame();\n        this.focusFirstAutofocusableElement();\n        await nextAnimationFrame();\n        this.activateScriptElements();\n    }\n    loadFrameElement() {\n        this.delegate.willRenderFrame(this.currentElement, this.newElement);\n        this.renderElement(this.currentElement, this.newElement);\n    }\n    scrollFrameIntoView() {\n        if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n            const element = this.currentElement.firstElementChild;\n            const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n            const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n            if (element) {\n                element.scrollIntoView({ block, behavior });\n                return true;\n            }\n        }\n        return false;\n    }\n    activateScriptElements() {\n        for (const inertScriptElement of this.newScriptElements) {\n            const activatedScriptElement = activateScriptElement(inertScriptElement);\n            inertScriptElement.replaceWith(activatedScriptElement);\n        }\n    }\n    get newScriptElements() {\n        return this.currentElement.querySelectorAll(\"script\");\n    }\n}\nfunction readScrollLogicalPosition(value, defaultValue) {\n    if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n        return value;\n    }\n    else {\n        return defaultValue;\n    }\n}\nfunction readScrollBehavior(value, defaultValue) {\n    if (value == \"auto\" || value == \"smooth\") {\n        return value;\n    }\n    else {\n        return defaultValue;\n    }\n}\n\nclass ProgressBar {\n    static get defaultCSS() {\n        return unindent `\n      .turbo-progress-bar {\n        position: fixed;\n        display: block;\n        top: 0;\n        left: 0;\n        height: 3px;\n        background: #0076ff;\n        z-index: 2147483647;\n        transition:\n          width ${ProgressBar.animationDuration}ms ease-out,\n          opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n        transform: translate3d(0, 0, 0);\n      }\n    `;\n    }\n    constructor() {\n        this.hiding = false;\n        this.value = 0;\n        this.visible = false;\n        this.trickle = () => {\n            this.setValue(this.value + Math.random() / 100);\n        };\n        this.stylesheetElement = this.createStylesheetElement();\n        this.progressElement = this.createProgressElement();\n        this.installStylesheetElement();\n        this.setValue(0);\n    }\n    show() {\n        if (!this.visible) {\n            this.visible = true;\n            this.installProgressElement();\n            this.startTrickling();\n        }\n    }\n    hide() {\n        if (this.visible && !this.hiding) {\n            this.hiding = true;\n            this.fadeProgressElement(() => {\n                this.uninstallProgressElement();\n                this.stopTrickling();\n                this.visible = false;\n                this.hiding = false;\n            });\n        }\n    }\n    setValue(value) {\n        this.value = value;\n        this.refresh();\n    }\n    installStylesheetElement() {\n        document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n    }\n    installProgressElement() {\n        this.progressElement.style.width = \"0\";\n        this.progressElement.style.opacity = \"1\";\n        document.documentElement.insertBefore(this.progressElement, document.body);\n        this.refresh();\n    }\n    fadeProgressElement(callback) {\n        this.progressElement.style.opacity = \"0\";\n        setTimeout(callback, ProgressBar.animationDuration * 1.5);\n    }\n    uninstallProgressElement() {\n        if (this.progressElement.parentNode) {\n            document.documentElement.removeChild(this.progressElement);\n        }\n    }\n    startTrickling() {\n        if (!this.trickleInterval) {\n            this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n        }\n    }\n    stopTrickling() {\n        window.clearInterval(this.trickleInterval);\n        delete this.trickleInterval;\n    }\n    refresh() {\n        requestAnimationFrame(() => {\n            this.progressElement.style.width = `${10 + this.value * 90}%`;\n        });\n    }\n    createStylesheetElement() {\n        const element = document.createElement(\"style\");\n        element.type = \"text/css\";\n        element.textContent = ProgressBar.defaultCSS;\n        if (this.cspNonce) {\n            element.nonce = this.cspNonce;\n        }\n        return element;\n    }\n    createProgressElement() {\n        const element = document.createElement(\"div\");\n        element.className = \"turbo-progress-bar\";\n        return element;\n    }\n    get cspNonce() {\n        return getMetaContent(\"csp-nonce\");\n    }\n}\nProgressBar.animationDuration = 300;\n\nclass HeadSnapshot extends Snapshot {\n    constructor() {\n        super(...arguments);\n        this.detailsByOuterHTML = this.children\n            .filter((element) => !elementIsNoscript(element))\n            .map((element) => elementWithoutNonce(element))\n            .reduce((result, element) => {\n            const { outerHTML } = element;\n            const details = outerHTML in result\n                ? result[outerHTML]\n                : {\n                    type: elementType(element),\n                    tracked: elementIsTracked(element),\n                    elements: [],\n                };\n            return Object.assign(Object.assign({}, result), { [outerHTML]: Object.assign(Object.assign({}, details), { elements: [...details.elements, element] }) });\n        }, {});\n    }\n    get trackedElementSignature() {\n        return Object.keys(this.detailsByOuterHTML)\n            .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n            .join(\"\");\n    }\n    getScriptElementsNotInSnapshot(snapshot) {\n        return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot);\n    }\n    getStylesheetElementsNotInSnapshot(snapshot) {\n        return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot);\n    }\n    getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n        return Object.keys(this.detailsByOuterHTML)\n            .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n            .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n            .filter(({ type }) => type == matchedType)\n            .map(({ elements: [element] }) => element);\n    }\n    get provisionalElements() {\n        return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n            const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n            if (type == null && !tracked) {\n                return [...result, ...elements];\n            }\n            else if (elements.length > 1) {\n                return [...result, ...elements.slice(1)];\n            }\n            else {\n                return result;\n            }\n        }, []);\n    }\n    getMetaValue(name) {\n        const element = this.findMetaElementByName(name);\n        return element ? element.getAttribute(\"content\") : null;\n    }\n    findMetaElementByName(name) {\n        return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n            const { elements: [element], } = this.detailsByOuterHTML[outerHTML];\n            return elementIsMetaElementWithName(element, name) ? element : result;\n        }, undefined);\n    }\n}\nfunction elementType(element) {\n    if (elementIsScript(element)) {\n        return \"script\";\n    }\n    else if (elementIsStylesheet(element)) {\n        return \"stylesheet\";\n    }\n}\nfunction elementIsTracked(element) {\n    return element.getAttribute(\"data-turbo-track\") == \"reload\";\n}\nfunction elementIsScript(element) {\n    const tagName = element.localName;\n    return tagName == \"script\";\n}\nfunction elementIsNoscript(element) {\n    const tagName = element.localName;\n    return tagName == \"noscript\";\n}\nfunction elementIsStylesheet(element) {\n    const tagName = element.localName;\n    return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\");\n}\nfunction elementIsMetaElementWithName(element, name) {\n    const tagName = element.localName;\n    return tagName == \"meta\" && element.getAttribute(\"name\") == name;\n}\nfunction elementWithoutNonce(element) {\n    if (element.hasAttribute(\"nonce\")) {\n        element.setAttribute(\"nonce\", \"\");\n    }\n    return element;\n}\n\nclass PageSnapshot extends Snapshot {\n    static fromHTMLString(html = \"\") {\n        return this.fromDocument(parseHTMLDocument(html));\n    }\n    static fromElement(element) {\n        return this.fromDocument(element.ownerDocument);\n    }\n    static fromDocument({ head, body }) {\n        return new this(body, new HeadSnapshot(head));\n    }\n    constructor(element, headSnapshot) {\n        super(element);\n        this.headSnapshot = headSnapshot;\n    }\n    clone() {\n        const clonedElement = this.element.cloneNode(true);\n        const selectElements = this.element.querySelectorAll(\"select\");\n        const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n        for (const [index, source] of selectElements.entries()) {\n            const clone = clonedSelectElements[index];\n            for (const option of clone.selectedOptions)\n                option.selected = false;\n            for (const option of source.selectedOptions)\n                clone.options[option.index].selected = true;\n        }\n        for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n            clonedPasswordInput.value = \"\";\n        }\n        return new PageSnapshot(clonedElement, this.headSnapshot);\n    }\n    get headElement() {\n        return this.headSnapshot.element;\n    }\n    get rootLocation() {\n        var _a;\n        const root = (_a = this.getSetting(\"root\")) !== null && _a !== void 0 ? _a : \"/\";\n        return expandURL(root);\n    }\n    get cacheControlValue() {\n        return this.getSetting(\"cache-control\");\n    }\n    get isPreviewable() {\n        return this.cacheControlValue != \"no-preview\";\n    }\n    get isCacheable() {\n        return this.cacheControlValue != \"no-cache\";\n    }\n    get isVisitable() {\n        return this.getSetting(\"visit-control\") != \"reload\";\n    }\n    getSetting(name) {\n        return this.headSnapshot.getMetaValue(`turbo-${name}`);\n    }\n}\n\nvar TimingMetric;\n(function (TimingMetric) {\n    TimingMetric[\"visitStart\"] = \"visitStart\";\n    TimingMetric[\"requestStart\"] = \"requestStart\";\n    TimingMetric[\"requestEnd\"] = \"requestEnd\";\n    TimingMetric[\"visitEnd\"] = \"visitEnd\";\n})(TimingMetric || (TimingMetric = {}));\nvar VisitState;\n(function (VisitState) {\n    VisitState[\"initialized\"] = \"initialized\";\n    VisitState[\"started\"] = \"started\";\n    VisitState[\"canceled\"] = \"canceled\";\n    VisitState[\"failed\"] = \"failed\";\n    VisitState[\"completed\"] = \"completed\";\n})(VisitState || (VisitState = {}));\nconst defaultOptions = {\n    action: \"advance\",\n    historyChanged: false,\n    visitCachedSnapshot: () => { },\n    willRender: true,\n    updateHistory: true,\n    shouldCacheSnapshot: true,\n    acceptsStreamResponse: false,\n};\nvar SystemStatusCode;\n(function (SystemStatusCode) {\n    SystemStatusCode[SystemStatusCode[\"networkFailure\"] = 0] = \"networkFailure\";\n    SystemStatusCode[SystemStatusCode[\"timeoutFailure\"] = -1] = \"timeoutFailure\";\n    SystemStatusCode[SystemStatusCode[\"contentTypeMismatch\"] = -2] = \"contentTypeMismatch\";\n})(SystemStatusCode || (SystemStatusCode = {}));\nclass Visit {\n    constructor(delegate, location, restorationIdentifier, options = {}) {\n        this.identifier = uuid();\n        this.timingMetrics = {};\n        this.followedRedirect = false;\n        this.historyChanged = false;\n        this.scrolled = false;\n        this.shouldCacheSnapshot = true;\n        this.acceptsStreamResponse = false;\n        this.snapshotCached = false;\n        this.state = VisitState.initialized;\n        this.delegate = delegate;\n        this.location = location;\n        this.restorationIdentifier = restorationIdentifier || uuid();\n        const { action, historyChanged, referrer, snapshot, snapshotHTML, response, visitCachedSnapshot, willRender, updateHistory, shouldCacheSnapshot, acceptsStreamResponse, } = Object.assign(Object.assign({}, defaultOptions), options);\n        this.action = action;\n        this.historyChanged = historyChanged;\n        this.referrer = referrer;\n        this.snapshot = snapshot;\n        this.snapshotHTML = snapshotHTML;\n        this.response = response;\n        this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action);\n        this.visitCachedSnapshot = visitCachedSnapshot;\n        this.willRender = willRender;\n        this.updateHistory = updateHistory;\n        this.scrolled = !willRender;\n        this.shouldCacheSnapshot = shouldCacheSnapshot;\n        this.acceptsStreamResponse = acceptsStreamResponse;\n    }\n    get adapter() {\n        return this.delegate.adapter;\n    }\n    get view() {\n        return this.delegate.view;\n    }\n    get history() {\n        return this.delegate.history;\n    }\n    get restorationData() {\n        return this.history.getRestorationDataForIdentifier(this.restorationIdentifier);\n    }\n    get silent() {\n        return this.isSamePage;\n    }\n    start() {\n        if (this.state == VisitState.initialized) {\n            this.recordTimingMetric(TimingMetric.visitStart);\n            this.state = VisitState.started;\n            this.adapter.visitStarted(this);\n            this.delegate.visitStarted(this);\n        }\n    }\n    cancel() {\n        if (this.state == VisitState.started) {\n            if (this.request) {\n                this.request.cancel();\n            }\n            this.cancelRender();\n            this.state = VisitState.canceled;\n        }\n    }\n    complete() {\n        if (this.state == VisitState.started) {\n            this.recordTimingMetric(TimingMetric.visitEnd);\n            this.state = VisitState.completed;\n            this.followRedirect();\n            if (!this.followedRedirect) {\n                this.adapter.visitCompleted(this);\n                this.delegate.visitCompleted(this);\n            }\n        }\n    }\n    fail() {\n        if (this.state == VisitState.started) {\n            this.state = VisitState.failed;\n            this.adapter.visitFailed(this);\n        }\n    }\n    changeHistory() {\n        var _a;\n        if (!this.historyChanged && this.updateHistory) {\n            const actionForHistory = this.location.href === ((_a = this.referrer) === null || _a === void 0 ? void 0 : _a.href) ? \"replace\" : this.action;\n            const method = getHistoryMethodForAction(actionForHistory);\n            this.history.update(method, this.location, this.restorationIdentifier);\n            this.historyChanged = true;\n        }\n    }\n    issueRequest() {\n        if (this.hasPreloadedResponse()) {\n            this.simulateRequest();\n        }\n        else if (this.shouldIssueRequest() && !this.request) {\n            this.request = new FetchRequest(this, FetchMethod.get, this.location);\n            this.request.perform();\n        }\n    }\n    simulateRequest() {\n        if (this.response) {\n            this.startRequest();\n            this.recordResponse();\n            this.finishRequest();\n        }\n    }\n    startRequest() {\n        this.recordTimingMetric(TimingMetric.requestStart);\n        this.adapter.visitRequestStarted(this);\n    }\n    recordResponse(response = this.response) {\n        this.response = response;\n        if (response) {\n            const { statusCode } = response;\n            if (isSuccessful(statusCode)) {\n                this.adapter.visitRequestCompleted(this);\n            }\n            else {\n                this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n            }\n        }\n    }\n    finishRequest() {\n        this.recordTimingMetric(TimingMetric.requestEnd);\n        this.adapter.visitRequestFinished(this);\n    }\n    loadResponse() {\n        if (this.response) {\n            const { statusCode, responseHTML } = this.response;\n            this.render(async () => {\n                if (this.shouldCacheSnapshot)\n                    this.cacheSnapshot();\n                if (this.view.renderPromise)\n                    await this.view.renderPromise;\n                if (isSuccessful(statusCode) && responseHTML != null) {\n                    await this.view.renderPage(PageSnapshot.fromHTMLString(responseHTML), false, this.willRender, this);\n                    this.performScroll();\n                    this.adapter.visitRendered(this);\n                    this.complete();\n                }\n                else {\n                    await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n                    this.adapter.visitRendered(this);\n                    this.fail();\n                }\n            });\n        }\n    }\n    getCachedSnapshot() {\n        const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n        if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n            if (this.action == \"restore\" || snapshot.isPreviewable) {\n                return snapshot;\n            }\n        }\n    }\n    getPreloadedSnapshot() {\n        if (this.snapshotHTML) {\n            return PageSnapshot.fromHTMLString(this.snapshotHTML);\n        }\n    }\n    hasCachedSnapshot() {\n        return this.getCachedSnapshot() != null;\n    }\n    loadCachedSnapshot() {\n        const snapshot = this.getCachedSnapshot();\n        if (snapshot) {\n            const isPreview = this.shouldIssueRequest();\n            this.render(async () => {\n                this.cacheSnapshot();\n                if (this.isSamePage) {\n                    this.adapter.visitRendered(this);\n                }\n                else {\n                    if (this.view.renderPromise)\n                        await this.view.renderPromise;\n                    await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n                    this.performScroll();\n                    this.adapter.visitRendered(this);\n                    if (!isPreview) {\n                        this.complete();\n                    }\n                }\n            });\n        }\n    }\n    followRedirect() {\n        var _a;\n        if (this.redirectedToLocation && !this.followedRedirect && ((_a = this.response) === null || _a === void 0 ? void 0 : _a.redirected)) {\n            this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n                action: \"replace\",\n                response: this.response,\n                shouldCacheSnapshot: false,\n                willRender: false,\n            });\n            this.followedRedirect = true;\n        }\n    }\n    goToSamePageAnchor() {\n        if (this.isSamePage) {\n            this.render(async () => {\n                this.cacheSnapshot();\n                this.performScroll();\n                this.changeHistory();\n                this.adapter.visitRendered(this);\n            });\n        }\n    }\n    prepareRequest(request) {\n        if (this.acceptsStreamResponse) {\n            request.acceptResponseType(StreamMessage.contentType);\n        }\n    }\n    requestStarted() {\n        this.startRequest();\n    }\n    requestPreventedHandlingResponse(_request, _response) { }\n    async requestSucceededWithResponse(request, response) {\n        const responseHTML = await response.responseHTML;\n        const { redirected, statusCode } = response;\n        if (responseHTML == undefined) {\n            this.recordResponse({\n                statusCode: SystemStatusCode.contentTypeMismatch,\n                redirected,\n            });\n        }\n        else {\n            this.redirectedToLocation = response.redirected ? response.location : undefined;\n            this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n        }\n    }\n    async requestFailedWithResponse(request, response) {\n        const responseHTML = await response.responseHTML;\n        const { redirected, statusCode } = response;\n        if (responseHTML == undefined) {\n            this.recordResponse({\n                statusCode: SystemStatusCode.contentTypeMismatch,\n                redirected,\n            });\n        }\n        else {\n            this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n        }\n    }\n    requestErrored(_request, _error) {\n        this.recordResponse({\n            statusCode: SystemStatusCode.networkFailure,\n            redirected: false,\n        });\n    }\n    requestFinished() {\n        this.finishRequest();\n    }\n    performScroll() {\n        if (!this.scrolled && !this.view.forceReloaded) {\n            if (this.action == \"restore\") {\n                this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n            }\n            else {\n                this.scrollToAnchor() || this.view.scrollToTop();\n            }\n            if (this.isSamePage) {\n                this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location);\n            }\n            this.scrolled = true;\n        }\n    }\n    scrollToRestoredPosition() {\n        const { scrollPosition } = this.restorationData;\n        if (scrollPosition) {\n            this.view.scrollToPosition(scrollPosition);\n            return true;\n        }\n    }\n    scrollToAnchor() {\n        const anchor = getAnchor(this.location);\n        if (anchor != null) {\n            this.view.scrollToAnchor(anchor);\n            return true;\n        }\n    }\n    recordTimingMetric(metric) {\n        this.timingMetrics[metric] = new Date().getTime();\n    }\n    getTimingMetrics() {\n        return Object.assign({}, this.timingMetrics);\n    }\n    getHistoryMethodForAction(action) {\n        switch (action) {\n            case \"replace\":\n                return history.replaceState;\n            case \"advance\":\n            case \"restore\":\n                return history.pushState;\n        }\n    }\n    hasPreloadedResponse() {\n        return typeof this.response == \"object\";\n    }\n    shouldIssueRequest() {\n        if (this.isSamePage) {\n            return false;\n        }\n        else if (this.action == \"restore\") {\n            return !this.hasCachedSnapshot();\n        }\n        else {\n            return this.willRender;\n        }\n    }\n    cacheSnapshot() {\n        if (!this.snapshotCached) {\n            this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n            this.snapshotCached = true;\n        }\n    }\n    async render(callback) {\n        this.cancelRender();\n        await new Promise((resolve) => {\n            this.frame = requestAnimationFrame(() => resolve());\n        });\n        await callback();\n        delete this.frame;\n    }\n    cancelRender() {\n        if (this.frame) {\n            cancelAnimationFrame(this.frame);\n            delete this.frame;\n        }\n    }\n}\nfunction isSuccessful(statusCode) {\n    return statusCode >= 200 && statusCode < 300;\n}\n\nclass BrowserAdapter {\n    constructor(session) {\n        this.progressBar = new ProgressBar();\n        this.showProgressBar = () => {\n            this.progressBar.show();\n        };\n        this.session = session;\n    }\n    visitProposedToLocation(location, options) {\n        this.navigator.startVisit(location, (options === null || options === void 0 ? void 0 : options.restorationIdentifier) || uuid(), options);\n    }\n    visitStarted(visit) {\n        this.location = visit.location;\n        visit.loadCachedSnapshot();\n        visit.issueRequest();\n        visit.goToSamePageAnchor();\n    }\n    visitRequestStarted(visit) {\n        this.progressBar.setValue(0);\n        if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n            this.showVisitProgressBarAfterDelay();\n        }\n        else {\n            this.showProgressBar();\n        }\n    }\n    visitRequestCompleted(visit) {\n        visit.loadResponse();\n    }\n    visitRequestFailedWithStatusCode(visit, statusCode) {\n        switch (statusCode) {\n            case SystemStatusCode.networkFailure:\n            case SystemStatusCode.timeoutFailure:\n            case SystemStatusCode.contentTypeMismatch:\n                return this.reload({\n                    reason: \"request_failed\",\n                    context: {\n                        statusCode,\n                    },\n                });\n            default:\n                return visit.loadResponse();\n        }\n    }\n    visitRequestFinished(_visit) {\n        this.progressBar.setValue(1);\n        this.hideVisitProgressBar();\n    }\n    visitCompleted(_visit) { }\n    pageInvalidated(reason) {\n        this.reload(reason);\n    }\n    visitFailed(_visit) { }\n    visitRendered(_visit) { }\n    formSubmissionStarted(_formSubmission) {\n        this.progressBar.setValue(0);\n        this.showFormProgressBarAfterDelay();\n    }\n    formSubmissionFinished(_formSubmission) {\n        this.progressBar.setValue(1);\n        this.hideFormProgressBar();\n    }\n    showVisitProgressBarAfterDelay() {\n        this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n    hideVisitProgressBar() {\n        this.progressBar.hide();\n        if (this.visitProgressBarTimeout != null) {\n            window.clearTimeout(this.visitProgressBarTimeout);\n            delete this.visitProgressBarTimeout;\n        }\n    }\n    showFormProgressBarAfterDelay() {\n        if (this.formProgressBarTimeout == null) {\n            this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n        }\n    }\n    hideFormProgressBar() {\n        this.progressBar.hide();\n        if (this.formProgressBarTimeout != null) {\n            window.clearTimeout(this.formProgressBarTimeout);\n            delete this.formProgressBarTimeout;\n        }\n    }\n    reload(reason) {\n        var _a;\n        dispatch(\"turbo:reload\", { detail: reason });\n        window.location.href = ((_a = this.location) === null || _a === void 0 ? void 0 : _a.toString()) || window.location.href;\n    }\n    get navigator() {\n        return this.session.navigator;\n    }\n}\n\nclass CacheObserver {\n    constructor() {\n        this.selector = \"[data-turbo-temporary]\";\n        this.deprecatedSelector = \"[data-turbo-cache=false]\";\n        this.started = false;\n        this.removeTemporaryElements = ((_event) => {\n            for (const element of this.temporaryElements) {\n                element.remove();\n            }\n        });\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n        }\n    }\n    get temporaryElements() {\n        return [...document.querySelectorAll(this.selector), ...this.temporaryElementsWithDeprecation];\n    }\n    get temporaryElementsWithDeprecation() {\n        const elements = document.querySelectorAll(this.deprecatedSelector);\n        if (elements.length) {\n            console.warn(`The ${this.deprecatedSelector} selector is deprecated and will be removed in a future version. Use ${this.selector} instead.`);\n        }\n        return [...elements];\n    }\n}\n\nclass FrameRedirector {\n    constructor(session, element) {\n        this.session = session;\n        this.element = element;\n        this.linkInterceptor = new LinkInterceptor(this, element);\n        this.formSubmitObserver = new FormSubmitObserver(this, element);\n    }\n    start() {\n        this.linkInterceptor.start();\n        this.formSubmitObserver.start();\n    }\n    stop() {\n        this.linkInterceptor.stop();\n        this.formSubmitObserver.stop();\n    }\n    shouldInterceptLinkClick(element, _location, _event) {\n        return this.shouldRedirect(element);\n    }\n    linkClickIntercepted(element, url, event) {\n        const frame = this.findFrameElement(element);\n        if (frame) {\n            frame.delegate.linkClickIntercepted(element, url, event);\n        }\n    }\n    willSubmitForm(element, submitter) {\n        return (element.closest(\"turbo-frame\") == null &&\n            this.shouldSubmit(element, submitter) &&\n            this.shouldRedirect(element, submitter));\n    }\n    formSubmitted(element, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        if (frame) {\n            frame.delegate.formSubmitted(element, submitter);\n        }\n    }\n    shouldSubmit(form, submitter) {\n        var _a;\n        const action = getAction(form, submitter);\n        const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n        const rootLocation = expandURL((_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\");\n        return this.shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation);\n    }\n    shouldRedirect(element, submitter) {\n        const isNavigatable = element instanceof HTMLFormElement\n            ? this.session.submissionIsNavigatable(element, submitter)\n            : this.session.elementIsNavigatable(element);\n        if (isNavigatable) {\n            const frame = this.findFrameElement(element, submitter);\n            return frame ? frame != element.closest(\"turbo-frame\") : false;\n        }\n        else {\n            return false;\n        }\n    }\n    findFrameElement(element, submitter) {\n        const id = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"data-turbo-frame\")) || element.getAttribute(\"data-turbo-frame\");\n        if (id && id != \"_top\") {\n            const frame = this.element.querySelector(`#${id}:not([disabled])`);\n            if (frame instanceof FrameElement) {\n                return frame;\n            }\n        }\n    }\n}\n\nclass History {\n    constructor(delegate) {\n        this.restorationIdentifier = uuid();\n        this.restorationData = {};\n        this.started = false;\n        this.pageLoaded = false;\n        this.onPopState = (event) => {\n            if (this.shouldHandlePopState()) {\n                const { turbo } = event.state || {};\n                if (turbo) {\n                    this.location = new URL(window.location.href);\n                    const { restorationIdentifier } = turbo;\n                    this.restorationIdentifier = restorationIdentifier;\n                    this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location, restorationIdentifier);\n                }\n            }\n        };\n        this.onPageLoad = async (_event) => {\n            await nextMicrotask();\n            this.pageLoaded = true;\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"popstate\", this.onPopState, false);\n            addEventListener(\"load\", this.onPageLoad, false);\n            this.started = true;\n            this.replace(new URL(window.location.href));\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"popstate\", this.onPopState, false);\n            removeEventListener(\"load\", this.onPageLoad, false);\n            this.started = false;\n        }\n    }\n    push(location, restorationIdentifier) {\n        this.update(history.pushState, location, restorationIdentifier);\n    }\n    replace(location, restorationIdentifier) {\n        this.update(history.replaceState, location, restorationIdentifier);\n    }\n    update(method, location, restorationIdentifier = uuid()) {\n        const state = { turbo: { restorationIdentifier } };\n        method.call(history, state, \"\", location.href);\n        this.location = location;\n        this.restorationIdentifier = restorationIdentifier;\n    }\n    getRestorationDataForIdentifier(restorationIdentifier) {\n        return this.restorationData[restorationIdentifier] || {};\n    }\n    updateRestorationData(additionalData) {\n        const { restorationIdentifier } = this;\n        const restorationData = this.restorationData[restorationIdentifier];\n        this.restorationData[restorationIdentifier] = Object.assign(Object.assign({}, restorationData), additionalData);\n    }\n    assumeControlOfScrollRestoration() {\n        var _a;\n        if (!this.previousScrollRestoration) {\n            this.previousScrollRestoration = (_a = history.scrollRestoration) !== null && _a !== void 0 ? _a : \"auto\";\n            history.scrollRestoration = \"manual\";\n        }\n    }\n    relinquishControlOfScrollRestoration() {\n        if (this.previousScrollRestoration) {\n            history.scrollRestoration = this.previousScrollRestoration;\n            delete this.previousScrollRestoration;\n        }\n    }\n    shouldHandlePopState() {\n        return this.pageIsLoaded();\n    }\n    pageIsLoaded() {\n        return this.pageLoaded || document.readyState == \"complete\";\n    }\n}\n\nclass Navigator {\n    constructor(delegate) {\n        this.delegate = delegate;\n    }\n    proposeVisit(location, options = {}) {\n        if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n            if (locationIsVisitable(location, this.view.snapshot.rootLocation)) {\n                this.delegate.visitProposedToLocation(location, options);\n            }\n            else {\n                window.location.href = location.toString();\n            }\n        }\n    }\n    startVisit(locatable, restorationIdentifier, options = {}) {\n        this.stop();\n        this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, Object.assign({ referrer: this.location }, options));\n        this.currentVisit.start();\n    }\n    submitForm(form, submitter) {\n        this.stop();\n        this.formSubmission = new FormSubmission(this, form, submitter, true);\n        this.formSubmission.start();\n    }\n    stop() {\n        if (this.formSubmission) {\n            this.formSubmission.stop();\n            delete this.formSubmission;\n        }\n        if (this.currentVisit) {\n            this.currentVisit.cancel();\n            delete this.currentVisit;\n        }\n    }\n    get adapter() {\n        return this.delegate.adapter;\n    }\n    get view() {\n        return this.delegate.view;\n    }\n    get history() {\n        return this.delegate.history;\n    }\n    formSubmissionStarted(formSubmission) {\n        if (typeof this.adapter.formSubmissionStarted === \"function\") {\n            this.adapter.formSubmissionStarted(formSubmission);\n        }\n    }\n    async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n        if (formSubmission == this.formSubmission) {\n            const responseHTML = await fetchResponse.responseHTML;\n            if (responseHTML) {\n                const shouldCacheSnapshot = formSubmission.isSafe;\n                if (!shouldCacheSnapshot) {\n                    this.view.clearSnapshotCache();\n                }\n                const { statusCode, redirected } = fetchResponse;\n                const action = this.getActionForFormSubmission(formSubmission);\n                const visitOptions = {\n                    action,\n                    shouldCacheSnapshot,\n                    response: { statusCode, responseHTML, redirected },\n                };\n                this.proposeVisit(fetchResponse.location, visitOptions);\n            }\n        }\n    }\n    async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n        const responseHTML = await fetchResponse.responseHTML;\n        if (responseHTML) {\n            const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n            if (fetchResponse.serverError) {\n                await this.view.renderError(snapshot, this.currentVisit);\n            }\n            else {\n                await this.view.renderPage(snapshot, false, true, this.currentVisit);\n            }\n            this.view.scrollToTop();\n            this.view.clearSnapshotCache();\n        }\n    }\n    formSubmissionErrored(formSubmission, error) {\n        console.error(error);\n    }\n    formSubmissionFinished(formSubmission) {\n        if (typeof this.adapter.formSubmissionFinished === \"function\") {\n            this.adapter.formSubmissionFinished(formSubmission);\n        }\n    }\n    visitStarted(visit) {\n        this.delegate.visitStarted(visit);\n    }\n    visitCompleted(visit) {\n        this.delegate.visitCompleted(visit);\n    }\n    locationWithActionIsSamePage(location, action) {\n        const anchor = getAnchor(location);\n        const currentAnchor = getAnchor(this.view.lastRenderedLocation);\n        const isRestorationToTop = action === \"restore\" && typeof anchor === \"undefined\";\n        return (action !== \"replace\" &&\n            getRequestURL(location) === getRequestURL(this.view.lastRenderedLocation) &&\n            (isRestorationToTop || (anchor != null && anchor !== currentAnchor)));\n    }\n    visitScrolledToSamePageLocation(oldURL, newURL) {\n        this.delegate.visitScrolledToSamePageLocation(oldURL, newURL);\n    }\n    get location() {\n        return this.history.location;\n    }\n    get restorationIdentifier() {\n        return this.history.restorationIdentifier;\n    }\n    getActionForFormSubmission({ submitter, formElement }) {\n        return getVisitAction(submitter, formElement) || \"advance\";\n    }\n}\n\nvar PageStage;\n(function (PageStage) {\n    PageStage[PageStage[\"initial\"] = 0] = \"initial\";\n    PageStage[PageStage[\"loading\"] = 1] = \"loading\";\n    PageStage[PageStage[\"interactive\"] = 2] = \"interactive\";\n    PageStage[PageStage[\"complete\"] = 3] = \"complete\";\n})(PageStage || (PageStage = {}));\nclass PageObserver {\n    constructor(delegate) {\n        this.stage = PageStage.initial;\n        this.started = false;\n        this.interpretReadyState = () => {\n            const { readyState } = this;\n            if (readyState == \"interactive\") {\n                this.pageIsInteractive();\n            }\n            else if (readyState == \"complete\") {\n                this.pageIsComplete();\n            }\n        };\n        this.pageWillUnload = () => {\n            this.delegate.pageWillUnload();\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            if (this.stage == PageStage.initial) {\n                this.stage = PageStage.loading;\n            }\n            document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n            addEventListener(\"pagehide\", this.pageWillUnload, false);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n            removeEventListener(\"pagehide\", this.pageWillUnload, false);\n            this.started = false;\n        }\n    }\n    pageIsInteractive() {\n        if (this.stage == PageStage.loading) {\n            this.stage = PageStage.interactive;\n            this.delegate.pageBecameInteractive();\n        }\n    }\n    pageIsComplete() {\n        this.pageIsInteractive();\n        if (this.stage == PageStage.interactive) {\n            this.stage = PageStage.complete;\n            this.delegate.pageLoaded();\n        }\n    }\n    get readyState() {\n        return document.readyState;\n    }\n}\n\nclass ScrollObserver {\n    constructor(delegate) {\n        this.started = false;\n        this.onScroll = () => {\n            this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            addEventListener(\"scroll\", this.onScroll, false);\n            this.onScroll();\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            removeEventListener(\"scroll\", this.onScroll, false);\n            this.started = false;\n        }\n    }\n    updatePosition(position) {\n        this.delegate.scrollPositionChanged(position);\n    }\n}\n\nclass StreamMessageRenderer {\n    render({ fragment }) {\n        Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => document.documentElement.appendChild(fragment));\n    }\n    enteringBardo(currentPermanentElement, newPermanentElement) {\n        newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n    }\n    leavingBardo() { }\n}\nfunction getPermanentElementMapForFragment(fragment) {\n    const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n    const permanentElementMap = {};\n    for (const permanentElementInDocument of permanentElementsInDocument) {\n        const { id } = permanentElementInDocument;\n        for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n            const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n            if (elementInStream) {\n                permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n            }\n        }\n    }\n    return permanentElementMap;\n}\n\nclass StreamObserver {\n    constructor(delegate) {\n        this.sources = new Set();\n        this.started = false;\n        this.inspectFetchResponse = ((event) => {\n            const response = fetchResponseFromEvent(event);\n            if (response && fetchResponseIsStream(response)) {\n                event.preventDefault();\n                this.receiveMessageResponse(response);\n            }\n        });\n        this.receiveMessageEvent = (event) => {\n            if (this.started && typeof event.data == \"string\") {\n                this.receiveMessageHTML(event.data);\n            }\n        };\n        this.delegate = delegate;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n        }\n    }\n    connectStreamSource(source) {\n        if (!this.streamSourceIsConnected(source)) {\n            this.sources.add(source);\n            source.addEventListener(\"message\", this.receiveMessageEvent, false);\n        }\n    }\n    disconnectStreamSource(source) {\n        if (this.streamSourceIsConnected(source)) {\n            this.sources.delete(source);\n            source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n        }\n    }\n    streamSourceIsConnected(source) {\n        return this.sources.has(source);\n    }\n    async receiveMessageResponse(response) {\n        const html = await response.responseHTML;\n        if (html) {\n            this.receiveMessageHTML(html);\n        }\n    }\n    receiveMessageHTML(html) {\n        this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n    }\n}\nfunction fetchResponseFromEvent(event) {\n    var _a;\n    const fetchResponse = (_a = event.detail) === null || _a === void 0 ? void 0 : _a.fetchResponse;\n    if (fetchResponse instanceof FetchResponse) {\n        return fetchResponse;\n    }\n}\nfunction fetchResponseIsStream(response) {\n    var _a;\n    const contentType = (_a = response.contentType) !== null && _a !== void 0 ? _a : \"\";\n    return contentType.startsWith(StreamMessage.contentType);\n}\n\nclass ErrorRenderer extends Renderer {\n    static renderElement(currentElement, newElement) {\n        const { documentElement, body } = document;\n        documentElement.replaceChild(newElement, body);\n    }\n    async render() {\n        this.replaceHeadAndBody();\n        this.activateScriptElements();\n    }\n    replaceHeadAndBody() {\n        const { documentElement, head } = document;\n        documentElement.replaceChild(this.newHead, head);\n        this.renderElement(this.currentElement, this.newElement);\n    }\n    activateScriptElements() {\n        for (const replaceableElement of this.scriptElements) {\n            const parentNode = replaceableElement.parentNode;\n            if (parentNode) {\n                const element = activateScriptElement(replaceableElement);\n                parentNode.replaceChild(element, replaceableElement);\n            }\n        }\n    }\n    get newHead() {\n        return this.newSnapshot.headSnapshot.element;\n    }\n    get scriptElements() {\n        return document.documentElement.querySelectorAll(\"script\");\n    }\n}\n\nclass PageRenderer extends Renderer {\n    static renderElement(currentElement, newElement) {\n        if (document.body && newElement instanceof HTMLBodyElement) {\n            document.body.replaceWith(newElement);\n        }\n        else {\n            document.documentElement.appendChild(newElement);\n        }\n    }\n    get shouldRender() {\n        return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical;\n    }\n    get reloadReason() {\n        if (!this.newSnapshot.isVisitable) {\n            return {\n                reason: \"turbo_visit_control_is_reload\",\n            };\n        }\n        if (!this.trackedElementsAreIdentical) {\n            return {\n                reason: \"tracked_element_mismatch\",\n            };\n        }\n    }\n    async prepareToRender() {\n        await this.mergeHead();\n    }\n    async render() {\n        if (this.willRender) {\n            await this.replaceBody();\n        }\n    }\n    finishRendering() {\n        super.finishRendering();\n        if (!this.isPreview) {\n            this.focusFirstAutofocusableElement();\n        }\n    }\n    get currentHeadSnapshot() {\n        return this.currentSnapshot.headSnapshot;\n    }\n    get newHeadSnapshot() {\n        return this.newSnapshot.headSnapshot;\n    }\n    get newElement() {\n        return this.newSnapshot.element;\n    }\n    async mergeHead() {\n        const mergedHeadElements = this.mergeProvisionalElements();\n        const newStylesheetElements = this.copyNewHeadStylesheetElements();\n        this.copyNewHeadScriptElements();\n        await mergedHeadElements;\n        await newStylesheetElements;\n    }\n    async replaceBody() {\n        await this.preservingPermanentElements(async () => {\n            this.activateNewBody();\n            await this.assignNewBody();\n        });\n    }\n    get trackedElementsAreIdentical() {\n        return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature;\n    }\n    async copyNewHeadStylesheetElements() {\n        const loadingElements = [];\n        for (const element of this.newHeadStylesheetElements) {\n            loadingElements.push(waitForLoad(element));\n            document.head.appendChild(element);\n        }\n        await Promise.all(loadingElements);\n    }\n    copyNewHeadScriptElements() {\n        for (const element of this.newHeadScriptElements) {\n            document.head.appendChild(activateScriptElement(element));\n        }\n    }\n    async mergeProvisionalElements() {\n        const newHeadElements = [...this.newHeadProvisionalElements];\n        for (const element of this.currentHeadProvisionalElements) {\n            if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n                document.head.removeChild(element);\n            }\n        }\n        for (const element of newHeadElements) {\n            document.head.appendChild(element);\n        }\n    }\n    isCurrentElementInElementList(element, elementList) {\n        for (const [index, newElement] of elementList.entries()) {\n            if (element.tagName == \"TITLE\") {\n                if (newElement.tagName != \"TITLE\") {\n                    continue;\n                }\n                if (element.innerHTML == newElement.innerHTML) {\n                    elementList.splice(index, 1);\n                    return true;\n                }\n            }\n            if (newElement.isEqualNode(element)) {\n                elementList.splice(index, 1);\n                return true;\n            }\n        }\n        return false;\n    }\n    removeCurrentHeadProvisionalElements() {\n        for (const element of this.currentHeadProvisionalElements) {\n            document.head.removeChild(element);\n        }\n    }\n    copyNewHeadProvisionalElements() {\n        for (const element of this.newHeadProvisionalElements) {\n            document.head.appendChild(element);\n        }\n    }\n    activateNewBody() {\n        document.adoptNode(this.newElement);\n        this.activateNewBodyScriptElements();\n    }\n    activateNewBodyScriptElements() {\n        for (const inertScriptElement of this.newBodyScriptElements) {\n            const activatedScriptElement = activateScriptElement(inertScriptElement);\n            inertScriptElement.replaceWith(activatedScriptElement);\n        }\n    }\n    async assignNewBody() {\n        await this.renderElement(this.currentElement, this.newElement);\n    }\n    get newHeadStylesheetElements() {\n        return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot);\n    }\n    get newHeadScriptElements() {\n        return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot);\n    }\n    get currentHeadProvisionalElements() {\n        return this.currentHeadSnapshot.provisionalElements;\n    }\n    get newHeadProvisionalElements() {\n        return this.newHeadSnapshot.provisionalElements;\n    }\n    get newBodyScriptElements() {\n        return this.newElement.querySelectorAll(\"script\");\n    }\n}\n\nclass SnapshotCache {\n    constructor(size) {\n        this.keys = [];\n        this.snapshots = {};\n        this.size = size;\n    }\n    has(location) {\n        return toCacheKey(location) in this.snapshots;\n    }\n    get(location) {\n        if (this.has(location)) {\n            const snapshot = this.read(location);\n            this.touch(location);\n            return snapshot;\n        }\n    }\n    put(location, snapshot) {\n        this.write(location, snapshot);\n        this.touch(location);\n        return snapshot;\n    }\n    clear() {\n        this.snapshots = {};\n    }\n    read(location) {\n        return this.snapshots[toCacheKey(location)];\n    }\n    write(location, snapshot) {\n        this.snapshots[toCacheKey(location)] = snapshot;\n    }\n    touch(location) {\n        const key = toCacheKey(location);\n        const index = this.keys.indexOf(key);\n        if (index > -1)\n            this.keys.splice(index, 1);\n        this.keys.unshift(key);\n        this.trim();\n    }\n    trim() {\n        for (const key of this.keys.splice(this.size)) {\n            delete this.snapshots[key];\n        }\n    }\n}\n\nclass PageView extends View {\n    constructor() {\n        super(...arguments);\n        this.snapshotCache = new SnapshotCache(10);\n        this.lastRenderedLocation = new URL(location.href);\n        this.forceReloaded = false;\n    }\n    renderPage(snapshot, isPreview = false, willRender = true, visit) {\n        const renderer = new PageRenderer(this.snapshot, snapshot, PageRenderer.renderElement, isPreview, willRender);\n        if (!renderer.shouldRender) {\n            this.forceReloaded = true;\n        }\n        else {\n            visit === null || visit === void 0 ? void 0 : visit.changeHistory();\n        }\n        return this.render(renderer);\n    }\n    renderError(snapshot, visit) {\n        visit === null || visit === void 0 ? void 0 : visit.changeHistory();\n        const renderer = new ErrorRenderer(this.snapshot, snapshot, ErrorRenderer.renderElement, false);\n        return this.render(renderer);\n    }\n    clearSnapshotCache() {\n        this.snapshotCache.clear();\n    }\n    async cacheSnapshot(snapshot = this.snapshot) {\n        if (snapshot.isCacheable) {\n            this.delegate.viewWillCacheSnapshot();\n            const { lastRenderedLocation: location } = this;\n            await nextEventLoopTick();\n            const cachedSnapshot = snapshot.clone();\n            this.snapshotCache.put(location, cachedSnapshot);\n            return cachedSnapshot;\n        }\n    }\n    getCachedSnapshotForLocation(location) {\n        return this.snapshotCache.get(location);\n    }\n    get snapshot() {\n        return PageSnapshot.fromElement(this.element);\n    }\n}\n\nclass Preloader {\n    constructor(delegate) {\n        this.selector = \"a[data-turbo-preload]\";\n        this.delegate = delegate;\n    }\n    get snapshotCache() {\n        return this.delegate.navigator.view.snapshotCache;\n    }\n    start() {\n        if (document.readyState === \"loading\") {\n            return document.addEventListener(\"DOMContentLoaded\", () => {\n                this.preloadOnLoadLinksForView(document.body);\n            });\n        }\n        else {\n            this.preloadOnLoadLinksForView(document.body);\n        }\n    }\n    preloadOnLoadLinksForView(element) {\n        for (const link of element.querySelectorAll(this.selector)) {\n            this.preloadURL(link);\n        }\n    }\n    async preloadURL(link) {\n        const location = new URL(link.href);\n        if (this.snapshotCache.has(location)) {\n            return;\n        }\n        try {\n            const response = await fetch(location.toString(), { headers: { \"VND.PREFETCH\": \"true\", Accept: \"text/html\" } });\n            const responseText = await response.text();\n            const snapshot = PageSnapshot.fromHTMLString(responseText);\n            this.snapshotCache.put(location, snapshot);\n        }\n        catch (_) {\n        }\n    }\n}\n\nclass Session {\n    constructor() {\n        this.navigator = new Navigator(this);\n        this.history = new History(this);\n        this.preloader = new Preloader(this);\n        this.view = new PageView(this, document.documentElement);\n        this.adapter = new BrowserAdapter(this);\n        this.pageObserver = new PageObserver(this);\n        this.cacheObserver = new CacheObserver();\n        this.linkClickObserver = new LinkClickObserver(this, window);\n        this.formSubmitObserver = new FormSubmitObserver(this, document);\n        this.scrollObserver = new ScrollObserver(this);\n        this.streamObserver = new StreamObserver(this);\n        this.formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement);\n        this.frameRedirector = new FrameRedirector(this, document.documentElement);\n        this.streamMessageRenderer = new StreamMessageRenderer();\n        this.drive = true;\n        this.enabled = true;\n        this.progressBarDelay = 500;\n        this.started = false;\n        this.formMode = \"on\";\n    }\n    start() {\n        if (!this.started) {\n            this.pageObserver.start();\n            this.cacheObserver.start();\n            this.formLinkClickObserver.start();\n            this.linkClickObserver.start();\n            this.formSubmitObserver.start();\n            this.scrollObserver.start();\n            this.streamObserver.start();\n            this.frameRedirector.start();\n            this.history.start();\n            this.preloader.start();\n            this.started = true;\n            this.enabled = true;\n        }\n    }\n    disable() {\n        this.enabled = false;\n    }\n    stop() {\n        if (this.started) {\n            this.pageObserver.stop();\n            this.cacheObserver.stop();\n            this.formLinkClickObserver.stop();\n            this.linkClickObserver.stop();\n            this.formSubmitObserver.stop();\n            this.scrollObserver.stop();\n            this.streamObserver.stop();\n            this.frameRedirector.stop();\n            this.history.stop();\n            this.started = false;\n        }\n    }\n    registerAdapter(adapter) {\n        this.adapter = adapter;\n    }\n    visit(location, options = {}) {\n        const frameElement = options.frame ? document.getElementById(options.frame) : null;\n        if (frameElement instanceof FrameElement) {\n            frameElement.src = location.toString();\n            frameElement.loaded;\n        }\n        else {\n            this.navigator.proposeVisit(expandURL(location), options);\n        }\n    }\n    connectStreamSource(source) {\n        this.streamObserver.connectStreamSource(source);\n    }\n    disconnectStreamSource(source) {\n        this.streamObserver.disconnectStreamSource(source);\n    }\n    renderStreamMessage(message) {\n        this.streamMessageRenderer.render(StreamMessage.wrap(message));\n    }\n    clearCache() {\n        this.view.clearSnapshotCache();\n    }\n    setProgressBarDelay(delay) {\n        this.progressBarDelay = delay;\n    }\n    setFormMode(mode) {\n        this.formMode = mode;\n    }\n    get location() {\n        return this.history.location;\n    }\n    get restorationIdentifier() {\n        return this.history.restorationIdentifier;\n    }\n    historyPoppedToLocationWithRestorationIdentifier(location, restorationIdentifier) {\n        if (this.enabled) {\n            this.navigator.startVisit(location, restorationIdentifier, {\n                action: \"restore\",\n                historyChanged: true,\n            });\n        }\n        else {\n            this.adapter.pageInvalidated({\n                reason: \"turbo_disabled\",\n            });\n        }\n    }\n    scrollPositionChanged(position) {\n        this.history.updateRestorationData({ scrollPosition: position });\n    }\n    willSubmitFormLinkToLocation(link, location) {\n        return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation);\n    }\n    submittedFormLinkToLocation() { }\n    willFollowLinkToLocation(link, location, event) {\n        return (this.elementIsNavigatable(link) &&\n            locationIsVisitable(location, this.snapshot.rootLocation) &&\n            this.applicationAllowsFollowingLinkToLocation(link, location, event));\n    }\n    followedLinkToLocation(link, location) {\n        const action = this.getActionForLink(link);\n        const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n        this.visit(location.href, { action, acceptsStreamResponse });\n    }\n    allowsVisitingLocationWithAction(location, action) {\n        return this.locationWithActionIsSamePage(location, action) || this.applicationAllowsVisitingLocation(location);\n    }\n    visitProposedToLocation(location, options) {\n        extendURLWithDeprecatedProperties(location);\n        this.adapter.visitProposedToLocation(location, options);\n    }\n    visitStarted(visit) {\n        if (!visit.acceptsStreamResponse) {\n            markAsBusy(document.documentElement);\n        }\n        extendURLWithDeprecatedProperties(visit.location);\n        if (!visit.silent) {\n            this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n        }\n    }\n    visitCompleted(visit) {\n        clearBusyState(document.documentElement);\n        this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n    }\n    locationWithActionIsSamePage(location, action) {\n        return this.navigator.locationWithActionIsSamePage(location, action);\n    }\n    visitScrolledToSamePageLocation(oldURL, newURL) {\n        this.notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL);\n    }\n    willSubmitForm(form, submitter) {\n        const action = getAction(form, submitter);\n        return (this.submissionIsNavigatable(form, submitter) &&\n            locationIsVisitable(expandURL(action), this.snapshot.rootLocation));\n    }\n    formSubmitted(form, submitter) {\n        this.navigator.submitForm(form, submitter);\n    }\n    pageBecameInteractive() {\n        this.view.lastRenderedLocation = this.location;\n        this.notifyApplicationAfterPageLoad();\n    }\n    pageLoaded() {\n        this.history.assumeControlOfScrollRestoration();\n    }\n    pageWillUnload() {\n        this.history.relinquishControlOfScrollRestoration();\n    }\n    receivedMessageFromStream(message) {\n        this.renderStreamMessage(message);\n    }\n    viewWillCacheSnapshot() {\n        var _a;\n        if (!((_a = this.navigator.currentVisit) === null || _a === void 0 ? void 0 : _a.silent)) {\n            this.notifyApplicationBeforeCachingSnapshot();\n        }\n    }\n    allowsImmediateRender({ element }, options) {\n        const event = this.notifyApplicationBeforeRender(element, options);\n        const { defaultPrevented, detail: { render }, } = event;\n        if (this.view.renderer && render) {\n            this.view.renderer.renderElement = render;\n        }\n        return !defaultPrevented;\n    }\n    viewRenderedSnapshot(_snapshot, _isPreview) {\n        this.view.lastRenderedLocation = this.history.location;\n        this.notifyApplicationAfterRender();\n    }\n    preloadOnLoadLinksForView(element) {\n        this.preloader.preloadOnLoadLinksForView(element);\n    }\n    viewInvalidated(reason) {\n        this.adapter.pageInvalidated(reason);\n    }\n    frameLoaded(frame) {\n        this.notifyApplicationAfterFrameLoad(frame);\n    }\n    frameRendered(fetchResponse, frame) {\n        this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n    }\n    applicationAllowsFollowingLinkToLocation(link, location, ev) {\n        const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n        return !event.defaultPrevented;\n    }\n    applicationAllowsVisitingLocation(location) {\n        const event = this.notifyApplicationBeforeVisitingLocation(location);\n        return !event.defaultPrevented;\n    }\n    notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n        return dispatch(\"turbo:click\", {\n            target: link,\n            detail: { url: location.href, originalEvent: event },\n            cancelable: true,\n        });\n    }\n    notifyApplicationBeforeVisitingLocation(location) {\n        return dispatch(\"turbo:before-visit\", {\n            detail: { url: location.href },\n            cancelable: true,\n        });\n    }\n    notifyApplicationAfterVisitingLocation(location, action) {\n        return dispatch(\"turbo:visit\", { detail: { url: location.href, action } });\n    }\n    notifyApplicationBeforeCachingSnapshot() {\n        return dispatch(\"turbo:before-cache\");\n    }\n    notifyApplicationBeforeRender(newBody, options) {\n        return dispatch(\"turbo:before-render\", {\n            detail: Object.assign({ newBody }, options),\n            cancelable: true,\n        });\n    }\n    notifyApplicationAfterRender() {\n        return dispatch(\"turbo:render\");\n    }\n    notifyApplicationAfterPageLoad(timing = {}) {\n        return dispatch(\"turbo:load\", {\n            detail: { url: this.location.href, timing },\n        });\n    }\n    notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL) {\n        dispatchEvent(new HashChangeEvent(\"hashchange\", {\n            oldURL: oldURL.toString(),\n            newURL: newURL.toString(),\n        }));\n    }\n    notifyApplicationAfterFrameLoad(frame) {\n        return dispatch(\"turbo:frame-load\", { target: frame });\n    }\n    notifyApplicationAfterFrameRender(fetchResponse, frame) {\n        return dispatch(\"turbo:frame-render\", {\n            detail: { fetchResponse },\n            target: frame,\n            cancelable: true,\n        });\n    }\n    submissionIsNavigatable(form, submitter) {\n        if (this.formMode == \"off\") {\n            return false;\n        }\n        else {\n            const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n            if (this.formMode == \"optin\") {\n                return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null;\n            }\n            else {\n                return submitterIsNavigatable && this.elementIsNavigatable(form);\n            }\n        }\n    }\n    elementIsNavigatable(element) {\n        const container = findClosestRecursively(element, \"[data-turbo]\");\n        const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n        if (this.drive || withinFrame) {\n            if (container) {\n                return container.getAttribute(\"data-turbo\") != \"false\";\n            }\n            else {\n                return true;\n            }\n        }\n        else {\n            if (container) {\n                return container.getAttribute(\"data-turbo\") == \"true\";\n            }\n            else {\n                return false;\n            }\n        }\n    }\n    getActionForLink(link) {\n        return getVisitAction(link) || \"advance\";\n    }\n    get snapshot() {\n        return this.view.snapshot;\n    }\n}\nfunction extendURLWithDeprecatedProperties(url) {\n    Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\nconst deprecatedLocationPropertyDescriptors = {\n    absoluteURL: {\n        get() {\n            return this.toString();\n        },\n    },\n};\n\nclass Cache {\n    constructor(session) {\n        this.session = session;\n    }\n    clear() {\n        this.session.clearCache();\n    }\n    resetCacheControl() {\n        this.setCacheControl(\"\");\n    }\n    exemptPageFromCache() {\n        this.setCacheControl(\"no-cache\");\n    }\n    exemptPageFromPreview() {\n        this.setCacheControl(\"no-preview\");\n    }\n    setCacheControl(value) {\n        setMetaContent(\"turbo-cache-control\", value);\n    }\n}\n\nconst StreamActions = {\n    after() {\n        this.targetElements.forEach((e) => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e.nextSibling); });\n    },\n    append() {\n        this.removeDuplicateTargetChildren();\n        this.targetElements.forEach((e) => e.append(this.templateContent));\n    },\n    before() {\n        this.targetElements.forEach((e) => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e); });\n    },\n    prepend() {\n        this.removeDuplicateTargetChildren();\n        this.targetElements.forEach((e) => e.prepend(this.templateContent));\n    },\n    remove() {\n        this.targetElements.forEach((e) => e.remove());\n    },\n    replace() {\n        this.targetElements.forEach((e) => e.replaceWith(this.templateContent));\n    },\n    update() {\n        this.targetElements.forEach((targetElement) => {\n            targetElement.innerHTML = \"\";\n            targetElement.append(this.templateContent);\n        });\n    },\n};\n\nconst session = new Session();\nconst cache = new Cache(session);\nconst { navigator: navigator$1 } = session;\nfunction start() {\n    session.start();\n}\nfunction registerAdapter(adapter) {\n    session.registerAdapter(adapter);\n}\nfunction visit(location, options) {\n    session.visit(location, options);\n}\nfunction connectStreamSource(source) {\n    session.connectStreamSource(source);\n}\nfunction disconnectStreamSource(source) {\n    session.disconnectStreamSource(source);\n}\nfunction renderStreamMessage(message) {\n    session.renderStreamMessage(message);\n}\nfunction clearCache() {\n    console.warn(\"Please replace `Turbo.clearCache()` with `Turbo.cache.clear()`. The top-level function is deprecated and will be removed in a future version of Turbo.`\");\n    session.clearCache();\n}\nfunction setProgressBarDelay(delay) {\n    session.setProgressBarDelay(delay);\n}\nfunction setConfirmMethod(confirmMethod) {\n    FormSubmission.confirmMethod = confirmMethod;\n}\nfunction setFormMode(mode) {\n    session.setFormMode(mode);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    navigator: navigator$1,\n    session: session,\n    cache: cache,\n    PageRenderer: PageRenderer,\n    PageSnapshot: PageSnapshot,\n    FrameRenderer: FrameRenderer,\n    start: start,\n    registerAdapter: registerAdapter,\n    visit: visit,\n    connectStreamSource: connectStreamSource,\n    disconnectStreamSource: disconnectStreamSource,\n    renderStreamMessage: renderStreamMessage,\n    clearCache: clearCache,\n    setProgressBarDelay: setProgressBarDelay,\n    setConfirmMethod: setConfirmMethod,\n    setFormMode: setFormMode,\n    StreamActions: StreamActions\n});\n\nclass TurboFrameMissingError extends Error {\n}\n\nclass FrameController {\n    constructor(element) {\n        this.fetchResponseLoaded = (_fetchResponse) => { };\n        this.currentFetchRequest = null;\n        this.resolveVisitPromise = () => { };\n        this.connected = false;\n        this.hasBeenLoaded = false;\n        this.ignoredAttributes = new Set();\n        this.action = null;\n        this.visitCachedSnapshot = ({ element }) => {\n            const frame = element.querySelector(\"#\" + this.element.id);\n            if (frame && this.previousFrameElement) {\n                frame.replaceChildren(...this.previousFrameElement.children);\n            }\n            delete this.previousFrameElement;\n        };\n        this.element = element;\n        this.view = new FrameView(this, this.element);\n        this.appearanceObserver = new AppearanceObserver(this, this.element);\n        this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n        this.linkInterceptor = new LinkInterceptor(this, this.element);\n        this.restorationIdentifier = uuid();\n        this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n    }\n    connect() {\n        if (!this.connected) {\n            this.connected = true;\n            if (this.loadingStyle == FrameLoadingStyle.lazy) {\n                this.appearanceObserver.start();\n            }\n            else {\n                this.loadSourceURL();\n            }\n            this.formLinkClickObserver.start();\n            this.linkInterceptor.start();\n            this.formSubmitObserver.start();\n        }\n    }\n    disconnect() {\n        if (this.connected) {\n            this.connected = false;\n            this.appearanceObserver.stop();\n            this.formLinkClickObserver.stop();\n            this.linkInterceptor.stop();\n            this.formSubmitObserver.stop();\n        }\n    }\n    disabledChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.eager) {\n            this.loadSourceURL();\n        }\n    }\n    sourceURLChanged() {\n        if (this.isIgnoringChangesTo(\"src\"))\n            return;\n        if (this.element.isConnected) {\n            this.complete = false;\n        }\n        if (this.loadingStyle == FrameLoadingStyle.eager || this.hasBeenLoaded) {\n            this.loadSourceURL();\n        }\n    }\n    sourceURLReloaded() {\n        const { src } = this.element;\n        this.ignoringChangesToAttribute(\"complete\", () => {\n            this.element.removeAttribute(\"complete\");\n        });\n        this.element.src = null;\n        this.element.src = src;\n        return this.element.loaded;\n    }\n    completeChanged() {\n        if (this.isIgnoringChangesTo(\"complete\"))\n            return;\n        this.loadSourceURL();\n    }\n    loadingStyleChanged() {\n        if (this.loadingStyle == FrameLoadingStyle.lazy) {\n            this.appearanceObserver.start();\n        }\n        else {\n            this.appearanceObserver.stop();\n            this.loadSourceURL();\n        }\n    }\n    async loadSourceURL() {\n        if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n            this.element.loaded = this.visit(expandURL(this.sourceURL));\n            this.appearanceObserver.stop();\n            await this.element.loaded;\n            this.hasBeenLoaded = true;\n        }\n    }\n    async loadResponse(fetchResponse) {\n        if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n            this.sourceURL = fetchResponse.response.url;\n        }\n        try {\n            const html = await fetchResponse.responseHTML;\n            if (html) {\n                const document = parseHTMLDocument(html);\n                const pageSnapshot = PageSnapshot.fromDocument(document);\n                if (pageSnapshot.isVisitable) {\n                    await this.loadFrameResponse(fetchResponse, document);\n                }\n                else {\n                    await this.handleUnvisitableFrameResponse(fetchResponse);\n                }\n            }\n        }\n        finally {\n            this.fetchResponseLoaded = () => { };\n        }\n    }\n    elementAppearedInViewport(element) {\n        this.proposeVisitIfNavigatedWithAction(element, element);\n        this.loadSourceURL();\n    }\n    willSubmitFormLinkToLocation(link) {\n        return this.shouldInterceptNavigation(link);\n    }\n    submittedFormLinkToLocation(link, _location, form) {\n        const frame = this.findFrameElement(link);\n        if (frame)\n            form.setAttribute(\"data-turbo-frame\", frame.id);\n    }\n    shouldInterceptLinkClick(element, _location, _event) {\n        return this.shouldInterceptNavigation(element);\n    }\n    linkClickIntercepted(element, location) {\n        this.navigateFrame(element, location);\n    }\n    willSubmitForm(element, submitter) {\n        return element.closest(\"turbo-frame\") == this.element && this.shouldInterceptNavigation(element, submitter);\n    }\n    formSubmitted(element, submitter) {\n        if (this.formSubmission) {\n            this.formSubmission.stop();\n        }\n        this.formSubmission = new FormSubmission(this, element, submitter);\n        const { fetchRequest } = this.formSubmission;\n        this.prepareRequest(fetchRequest);\n        this.formSubmission.start();\n    }\n    prepareRequest(request) {\n        var _a;\n        request.headers[\"Turbo-Frame\"] = this.id;\n        if ((_a = this.currentNavigationElement) === null || _a === void 0 ? void 0 : _a.hasAttribute(\"data-turbo-stream\")) {\n            request.acceptResponseType(StreamMessage.contentType);\n        }\n    }\n    requestStarted(_request) {\n        markAsBusy(this.element);\n    }\n    requestPreventedHandlingResponse(_request, _response) {\n        this.resolveVisitPromise();\n    }\n    async requestSucceededWithResponse(request, response) {\n        await this.loadResponse(response);\n        this.resolveVisitPromise();\n    }\n    async requestFailedWithResponse(request, response) {\n        await this.loadResponse(response);\n        this.resolveVisitPromise();\n    }\n    requestErrored(request, error) {\n        console.error(error);\n        this.resolveVisitPromise();\n    }\n    requestFinished(_request) {\n        clearBusyState(this.element);\n    }\n    formSubmissionStarted({ formElement }) {\n        markAsBusy(formElement, this.findFrameElement(formElement));\n    }\n    formSubmissionSucceededWithResponse(formSubmission, response) {\n        const frame = this.findFrameElement(formSubmission.formElement, formSubmission.submitter);\n        frame.delegate.proposeVisitIfNavigatedWithAction(frame, formSubmission.formElement, formSubmission.submitter);\n        frame.delegate.loadResponse(response);\n        if (!formSubmission.isSafe) {\n            session.clearCache();\n        }\n    }\n    formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n        this.element.delegate.loadResponse(fetchResponse);\n        session.clearCache();\n    }\n    formSubmissionErrored(formSubmission, error) {\n        console.error(error);\n    }\n    formSubmissionFinished({ formElement }) {\n        clearBusyState(formElement, this.findFrameElement(formElement));\n    }\n    allowsImmediateRender({ element: newFrame }, options) {\n        const event = dispatch(\"turbo:before-frame-render\", {\n            target: this.element,\n            detail: Object.assign({ newFrame }, options),\n            cancelable: true,\n        });\n        const { defaultPrevented, detail: { render }, } = event;\n        if (this.view.renderer && render) {\n            this.view.renderer.renderElement = render;\n        }\n        return !defaultPrevented;\n    }\n    viewRenderedSnapshot(_snapshot, _isPreview) { }\n    preloadOnLoadLinksForView(element) {\n        session.preloadOnLoadLinksForView(element);\n    }\n    viewInvalidated() { }\n    willRenderFrame(currentElement, _newElement) {\n        this.previousFrameElement = currentElement.cloneNode(true);\n    }\n    async loadFrameResponse(fetchResponse, document) {\n        const newFrameElement = await this.extractForeignFrameElement(document.body);\n        if (newFrameElement) {\n            const snapshot = new Snapshot(newFrameElement);\n            const renderer = new FrameRenderer(this, this.view.snapshot, snapshot, FrameRenderer.renderElement, false, false);\n            if (this.view.renderPromise)\n                await this.view.renderPromise;\n            this.changeHistory();\n            await this.view.render(renderer);\n            this.complete = true;\n            session.frameRendered(fetchResponse, this.element);\n            session.frameLoaded(this.element);\n            this.fetchResponseLoaded(fetchResponse);\n        }\n        else if (this.willHandleFrameMissingFromResponse(fetchResponse)) {\n            this.handleFrameMissingFromResponse(fetchResponse);\n        }\n    }\n    async visit(url) {\n        var _a;\n        const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n        (_a = this.currentFetchRequest) === null || _a === void 0 ? void 0 : _a.cancel();\n        this.currentFetchRequest = request;\n        return new Promise((resolve) => {\n            this.resolveVisitPromise = () => {\n                this.resolveVisitPromise = () => { };\n                this.currentFetchRequest = null;\n                resolve();\n            };\n            request.perform();\n        });\n    }\n    navigateFrame(element, url, submitter) {\n        const frame = this.findFrameElement(element, submitter);\n        frame.delegate.proposeVisitIfNavigatedWithAction(frame, element, submitter);\n        this.withCurrentNavigationElement(element, () => {\n            frame.src = url;\n        });\n    }\n    proposeVisitIfNavigatedWithAction(frame, element, submitter) {\n        this.action = getVisitAction(submitter, element, frame);\n        if (this.action) {\n            const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n            const { visitCachedSnapshot } = frame.delegate;\n            frame.delegate.fetchResponseLoaded = (fetchResponse) => {\n                if (frame.src) {\n                    const { statusCode, redirected } = fetchResponse;\n                    const responseHTML = frame.ownerDocument.documentElement.outerHTML;\n                    const response = { statusCode, redirected, responseHTML };\n                    const options = {\n                        response,\n                        visitCachedSnapshot,\n                        willRender: false,\n                        updateHistory: false,\n                        restorationIdentifier: this.restorationIdentifier,\n                        snapshot: pageSnapshot,\n                    };\n                    if (this.action)\n                        options.action = this.action;\n                    session.visit(frame.src, options);\n                }\n            };\n        }\n    }\n    changeHistory() {\n        if (this.action) {\n            const method = getHistoryMethodForAction(this.action);\n            session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n        }\n    }\n    async handleUnvisitableFrameResponse(fetchResponse) {\n        console.warn(`The response (${fetchResponse.statusCode}) from <turbo-frame id=\"${this.element.id}\"> is performing a full page visit due to turbo-visit-control.`);\n        await this.visitResponse(fetchResponse.response);\n    }\n    willHandleFrameMissingFromResponse(fetchResponse) {\n        this.element.setAttribute(\"complete\", \"\");\n        const response = fetchResponse.response;\n        const visit = async (url, options = {}) => {\n            if (url instanceof Response) {\n                this.visitResponse(url);\n            }\n            else {\n                session.visit(url, options);\n            }\n        };\n        const event = dispatch(\"turbo:frame-missing\", {\n            target: this.element,\n            detail: { response, visit },\n            cancelable: true,\n        });\n        return !event.defaultPrevented;\n    }\n    handleFrameMissingFromResponse(fetchResponse) {\n        this.view.missing();\n        this.throwFrameMissingError(fetchResponse);\n    }\n    throwFrameMissingError(fetchResponse) {\n        const message = `The response (${fetchResponse.statusCode}) did not contain the expected <turbo-frame id=\"${this.element.id}\"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n        throw new TurboFrameMissingError(message);\n    }\n    async visitResponse(response) {\n        const wrapped = new FetchResponse(response);\n        const responseHTML = await wrapped.responseHTML;\n        const { location, redirected, statusCode } = wrapped;\n        return session.visit(location, { response: { redirected, statusCode, responseHTML } });\n    }\n    findFrameElement(element, submitter) {\n        var _a;\n        const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n        return (_a = getFrameElementById(id)) !== null && _a !== void 0 ? _a : this.element;\n    }\n    async extractForeignFrameElement(container) {\n        let element;\n        const id = CSS.escape(this.id);\n        try {\n            element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n            if (element) {\n                return element;\n            }\n            element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n            if (element) {\n                await element.loaded;\n                return await this.extractForeignFrameElement(element);\n            }\n        }\n        catch (error) {\n            console.error(error);\n            return new FrameElement();\n        }\n        return null;\n    }\n    formActionIsVisitable(form, submitter) {\n        const action = getAction(form, submitter);\n        return locationIsVisitable(expandURL(action), this.rootLocation);\n    }\n    shouldInterceptNavigation(element, submitter) {\n        const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n        if (element instanceof HTMLFormElement && !this.formActionIsVisitable(element, submitter)) {\n            return false;\n        }\n        if (!this.enabled || id == \"_top\") {\n            return false;\n        }\n        if (id) {\n            const frameElement = getFrameElementById(id);\n            if (frameElement) {\n                return !frameElement.disabled;\n            }\n        }\n        if (!session.elementIsNavigatable(element)) {\n            return false;\n        }\n        if (submitter && !session.elementIsNavigatable(submitter)) {\n            return false;\n        }\n        return true;\n    }\n    get id() {\n        return this.element.id;\n    }\n    get enabled() {\n        return !this.element.disabled;\n    }\n    get sourceURL() {\n        if (this.element.src) {\n            return this.element.src;\n        }\n    }\n    set sourceURL(sourceURL) {\n        this.ignoringChangesToAttribute(\"src\", () => {\n            this.element.src = sourceURL !== null && sourceURL !== void 0 ? sourceURL : null;\n        });\n    }\n    get loadingStyle() {\n        return this.element.loading;\n    }\n    get isLoading() {\n        return this.formSubmission !== undefined || this.resolveVisitPromise() !== undefined;\n    }\n    get complete() {\n        return this.element.hasAttribute(\"complete\");\n    }\n    set complete(value) {\n        this.ignoringChangesToAttribute(\"complete\", () => {\n            if (value) {\n                this.element.setAttribute(\"complete\", \"\");\n            }\n            else {\n                this.element.removeAttribute(\"complete\");\n            }\n        });\n    }\n    get isActive() {\n        return this.element.isActive && this.connected;\n    }\n    get rootLocation() {\n        var _a;\n        const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n        const root = (_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\";\n        return expandURL(root);\n    }\n    isIgnoringChangesTo(attributeName) {\n        return this.ignoredAttributes.has(attributeName);\n    }\n    ignoringChangesToAttribute(attributeName, callback) {\n        this.ignoredAttributes.add(attributeName);\n        callback();\n        this.ignoredAttributes.delete(attributeName);\n    }\n    withCurrentNavigationElement(element, callback) {\n        this.currentNavigationElement = element;\n        callback();\n        delete this.currentNavigationElement;\n    }\n}\nfunction getFrameElementById(id) {\n    if (id != null) {\n        const element = document.getElementById(id);\n        if (element instanceof FrameElement) {\n            return element;\n        }\n    }\n}\nfunction activateElement(element, currentURL) {\n    if (element) {\n        const src = element.getAttribute(\"src\");\n        if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n            throw new Error(`Matching <turbo-frame id=\"${element.id}\"> element has a source URL which references itself`);\n        }\n        if (element.ownerDocument !== document) {\n            element = document.importNode(element, true);\n        }\n        if (element instanceof FrameElement) {\n            element.connectedCallback();\n            element.disconnectedCallback();\n            return element;\n        }\n    }\n}\n\nclass StreamElement extends HTMLElement {\n    static async renderElement(newElement) {\n        await newElement.performAction();\n    }\n    async connectedCallback() {\n        try {\n            await this.render();\n        }\n        catch (error) {\n            console.error(error);\n        }\n        finally {\n            this.disconnect();\n        }\n    }\n    async render() {\n        var _a;\n        return ((_a = this.renderPromise) !== null && _a !== void 0 ? _a : (this.renderPromise = (async () => {\n            const event = this.beforeRenderEvent;\n            if (this.dispatchEvent(event)) {\n                await nextAnimationFrame();\n                await event.detail.render(this);\n            }\n        })()));\n    }\n    disconnect() {\n        try {\n            this.remove();\n        }\n        catch (_a) { }\n    }\n    removeDuplicateTargetChildren() {\n        this.duplicateChildren.forEach((c) => c.remove());\n    }\n    get duplicateChildren() {\n        var _a;\n        const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.id);\n        const newChildrenIds = [...(((_a = this.templateContent) === null || _a === void 0 ? void 0 : _a.children) || [])].filter((c) => !!c.id).map((c) => c.id);\n        return existingChildren.filter((c) => newChildrenIds.includes(c.id));\n    }\n    get performAction() {\n        if (this.action) {\n            const actionFunction = StreamActions[this.action];\n            if (actionFunction) {\n                return actionFunction;\n            }\n            this.raise(\"unknown action\");\n        }\n        this.raise(\"action attribute is missing\");\n    }\n    get targetElements() {\n        if (this.target) {\n            return this.targetElementsById;\n        }\n        else if (this.targets) {\n            return this.targetElementsByQuery;\n        }\n        else {\n            this.raise(\"target or targets attribute is missing\");\n        }\n    }\n    get templateContent() {\n        return this.templateElement.content.cloneNode(true);\n    }\n    get templateElement() {\n        if (this.firstElementChild === null) {\n            const template = this.ownerDocument.createElement(\"template\");\n            this.appendChild(template);\n            return template;\n        }\n        else if (this.firstElementChild instanceof HTMLTemplateElement) {\n            return this.firstElementChild;\n        }\n        this.raise(\"first child element must be a <template> element\");\n    }\n    get action() {\n        return this.getAttribute(\"action\");\n    }\n    get target() {\n        return this.getAttribute(\"target\");\n    }\n    get targets() {\n        return this.getAttribute(\"targets\");\n    }\n    raise(message) {\n        throw new Error(`${this.description}: ${message}`);\n    }\n    get description() {\n        var _a, _b;\n        return (_b = ((_a = this.outerHTML.match(/<[^>]+>/)) !== null && _a !== void 0 ? _a : [])[0]) !== null && _b !== void 0 ? _b : \"<turbo-stream>\";\n    }\n    get beforeRenderEvent() {\n        return new CustomEvent(\"turbo:before-stream-render\", {\n            bubbles: true,\n            cancelable: true,\n            detail: { newStream: this, render: StreamElement.renderElement },\n        });\n    }\n    get targetElementsById() {\n        var _a;\n        const element = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.getElementById(this.target);\n        if (element !== null) {\n            return [element];\n        }\n        else {\n            return [];\n        }\n    }\n    get targetElementsByQuery() {\n        var _a;\n        const elements = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.targets);\n        if (elements.length !== 0) {\n            return Array.prototype.slice.call(elements);\n        }\n        else {\n            return [];\n        }\n    }\n}\n\nclass StreamSourceElement extends HTMLElement {\n    constructor() {\n        super(...arguments);\n        this.streamSource = null;\n    }\n    connectedCallback() {\n        this.streamSource = this.src.match(/^ws{1,2}:/) ? new WebSocket(this.src) : new EventSource(this.src);\n        connectStreamSource(this.streamSource);\n    }\n    disconnectedCallback() {\n        if (this.streamSource) {\n            disconnectStreamSource(this.streamSource);\n        }\n    }\n    get src() {\n        return this.getAttribute(\"src\") || \"\";\n    }\n}\n\nFrameElement.delegateConstructor = FrameController;\nif (customElements.get(\"turbo-frame\") === undefined) {\n    customElements.define(\"turbo-frame\", FrameElement);\n}\nif (customElements.get(\"turbo-stream\") === undefined) {\n    customElements.define(\"turbo-stream\", StreamElement);\n}\nif (customElements.get(\"turbo-stream-source\") === undefined) {\n    customElements.define(\"turbo-stream-source\", StreamSourceElement);\n}\n\n(() => {\n    let element = document.currentScript;\n    if (!element)\n        return;\n    if (element.hasAttribute(\"data-turbo-suppress-warning\"))\n        return;\n    element = element.parentElement;\n    while (element) {\n        if (element == document.body) {\n            return console.warn(unindent `\n        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!\n\n        Load your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\n        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements\n\n        \u2014\u2014\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `, element.outerHTML);\n        }\n        element = element.parentElement;\n    }\n})();\n\nwindow.Turbo = Turbo;\nstart();\n\nexport { FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, clearCache, connectStreamSource, disconnectStreamSource, navigator$1 as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit };\n", "let consumer\n\nexport async function getConsumer() {\n  return consumer || setConsumer(createConsumer().then(setConsumer))\n}\n\nexport function setConsumer(newConsumer) {\n  return consumer = newConsumer\n}\n\nexport async function createConsumer() {\n  const { createConsumer } = await import(/* webpackChunkName: \"actioncable\" */ \"@rails/actioncable/src\")\n  return createConsumer()\n}\n\nexport async function subscribeTo(channel, mixin) {\n  const { subscriptions } = await getConsumer()\n  return subscriptions.create(channel, mixin)\n}\n", "// Based on https://github.com/nathan7/snakeize\n//\n// This software is released under the MIT license:\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\nexport default function walk (obj) {\n    if (!obj || typeof obj !== 'object') return obj;\n    if (obj instanceof Date || obj instanceof RegExp) return obj;\n    if (Array.isArray(obj)) return obj.map(walk);\n    return Object.keys(obj).reduce(function (acc, key) {\n        var camel = key[0].toLowerCase() + key.slice(1).replace(/([A-Z]+)/g, function (m, x) {\n            return '_' + x.toLowerCase();\n        });\n        acc[camel] = walk(obj[key]);\n        return acc;\n    }, {});\n};", "import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\nimport snakeize from \"./snakeize\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, {\n      received: this.dispatchMessageEvent.bind(this),\n      connected: this.subscriptionConnected.bind(this),\n      disconnected: this.subscriptionDisconnected.bind(this)\n    })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\n  }\n\n  subscriptionConnected() {\n    this.setAttribute(\"connected\", \"\")\n  }\n\n  subscriptionDisconnected() {\n    this.removeAttribute(\"connected\")\n  }\n\n  get channel() {\n    const channel = this.getAttribute(\"channel\")\n    const signed_stream_name = this.getAttribute(\"signed-stream-name\")\n    return { channel, signed_stream_name, ...snakeize({ ...this.dataset }) }\n  }\n}\n\n\nif (customElements.get(\"turbo-cable-stream-source\") === undefined) {\n  customElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n}\n", "export function encodeMethodIntoRequestBody(event) {\n  if (event.target instanceof HTMLFormElement) {\n    const { target: form, detail: { fetchOptions } } = event\n\n    form.addEventListener(\"turbo:submit-start\", ({ detail: { formSubmission: { submitter } } }) => {\n      const body = isBodyInit(fetchOptions.body) ? fetchOptions.body : new URLSearchParams()\n      const method = determineFetchMethod(submitter, body, form)\n\n      if (!/get/i.test(method)) {\n        if (/post/i.test(method)) {\n          body.delete(\"_method\")\n        } else {\n          body.set(\"_method\", method)\n        }\n\n        fetchOptions.method = \"post\"\n      }\n    }, { once: true })\n  }\n}\n\nfunction determineFetchMethod(submitter, body, form) {\n  const formMethod = determineFormMethod(submitter)\n  const overrideMethod = body.get(\"_method\")\n  const method = form.getAttribute(\"method\") || \"get\"\n\n  if (typeof formMethod == \"string\") {\n    return formMethod\n  } else if (typeof overrideMethod == \"string\") {\n    return overrideMethod\n  } else {\n    return method\n  }\n}\n\nfunction determineFormMethod(submitter) {\n  if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) {\n    if (submitter.hasAttribute(\"formmethod\")) {\n      return submitter.formMethod\n    } else {\n      return null\n    }\n  } else {\n    return null\n  }\n}\n\nfunction isBodyInit(body) {\n  return body instanceof FormData || body instanceof URLSearchParams\n}\n", "import \"./cable_stream_source_element\"\n\nimport * as Turbo from \"@hotwired/turbo\"\nexport { Turbo }\n\nimport * as cable from \"./cable\"\nexport { cable }\n\nimport { encodeMethodIntoRequestBody } from \"./fetch_requests\"\n\naddEventListener(\"turbo:before-fetch-request\", encodeMethodIntoRequestBody)\n", "/*\nStimulus 3.2.1\nCopyright \u00A9 2023 Basecamp, LLC\n */\nclass EventListener {\n    constructor(eventTarget, eventName, eventOptions) {\n        this.eventTarget = eventTarget;\n        this.eventName = eventName;\n        this.eventOptions = eventOptions;\n        this.unorderedBindings = new Set();\n    }\n    connect() {\n        this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n    }\n    disconnect() {\n        this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n    }\n    bindingConnected(binding) {\n        this.unorderedBindings.add(binding);\n    }\n    bindingDisconnected(binding) {\n        this.unorderedBindings.delete(binding);\n    }\n    handleEvent(event) {\n        const extendedEvent = extendEvent(event);\n        for (const binding of this.bindings) {\n            if (extendedEvent.immediatePropagationStopped) {\n                break;\n            }\n            else {\n                binding.handleEvent(extendedEvent);\n            }\n        }\n    }\n    hasBindings() {\n        return this.unorderedBindings.size > 0;\n    }\n    get bindings() {\n        return Array.from(this.unorderedBindings).sort((left, right) => {\n            const leftIndex = left.index, rightIndex = right.index;\n            return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n        });\n    }\n}\nfunction extendEvent(event) {\n    if (\"immediatePropagationStopped\" in event) {\n        return event;\n    }\n    else {\n        const { stopImmediatePropagation } = event;\n        return Object.assign(event, {\n            immediatePropagationStopped: false,\n            stopImmediatePropagation() {\n                this.immediatePropagationStopped = true;\n                stopImmediatePropagation.call(this);\n            },\n        });\n    }\n}\n\nclass Dispatcher {\n    constructor(application) {\n        this.application = application;\n        this.eventListenerMaps = new Map();\n        this.started = false;\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.eventListeners.forEach((eventListener) => eventListener.connect());\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.eventListeners.forEach((eventListener) => eventListener.disconnect());\n        }\n    }\n    get eventListeners() {\n        return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []);\n    }\n    bindingConnected(binding) {\n        this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n    }\n    bindingDisconnected(binding, clearEventListeners = false) {\n        this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n        if (clearEventListeners)\n            this.clearEventListenersForBinding(binding);\n    }\n    handleError(error, message, detail = {}) {\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    clearEventListenersForBinding(binding) {\n        const eventListener = this.fetchEventListenerForBinding(binding);\n        if (!eventListener.hasBindings()) {\n            eventListener.disconnect();\n            this.removeMappedEventListenerFor(binding);\n        }\n    }\n    removeMappedEventListenerFor(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        eventListenerMap.delete(cacheKey);\n        if (eventListenerMap.size == 0)\n            this.eventListenerMaps.delete(eventTarget);\n    }\n    fetchEventListenerForBinding(binding) {\n        const { eventTarget, eventName, eventOptions } = binding;\n        return this.fetchEventListener(eventTarget, eventName, eventOptions);\n    }\n    fetchEventListener(eventTarget, eventName, eventOptions) {\n        const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n        const cacheKey = this.cacheKey(eventName, eventOptions);\n        let eventListener = eventListenerMap.get(cacheKey);\n        if (!eventListener) {\n            eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n            eventListenerMap.set(cacheKey, eventListener);\n        }\n        return eventListener;\n    }\n    createEventListener(eventTarget, eventName, eventOptions) {\n        const eventListener = new EventListener(eventTarget, eventName, eventOptions);\n        if (this.started) {\n            eventListener.connect();\n        }\n        return eventListener;\n    }\n    fetchEventListenerMapForEventTarget(eventTarget) {\n        let eventListenerMap = this.eventListenerMaps.get(eventTarget);\n        if (!eventListenerMap) {\n            eventListenerMap = new Map();\n            this.eventListenerMaps.set(eventTarget, eventListenerMap);\n        }\n        return eventListenerMap;\n    }\n    cacheKey(eventName, eventOptions) {\n        const parts = [eventName];\n        Object.keys(eventOptions)\n            .sort()\n            .forEach((key) => {\n            parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`);\n        });\n        return parts.join(\":\");\n    }\n}\n\nconst defaultActionDescriptorFilters = {\n    stop({ event, value }) {\n        if (value)\n            event.stopPropagation();\n        return true;\n    },\n    prevent({ event, value }) {\n        if (value)\n            event.preventDefault();\n        return true;\n    },\n    self({ event, value, element }) {\n        if (value) {\n            return element === event.target;\n        }\n        else {\n            return true;\n        }\n    },\n};\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;\nfunction parseActionDescriptorString(descriptorString) {\n    const source = descriptorString.trim();\n    const matches = source.match(descriptorPattern) || [];\n    let eventName = matches[2];\n    let keyFilter = matches[3];\n    if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n        eventName += `.${keyFilter}`;\n        keyFilter = \"\";\n    }\n    return {\n        eventTarget: parseEventTarget(matches[4]),\n        eventName,\n        eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n        identifier: matches[5],\n        methodName: matches[6],\n        keyFilter: matches[1] || keyFilter,\n    };\n}\nfunction parseEventTarget(eventTargetName) {\n    if (eventTargetName == \"window\") {\n        return window;\n    }\n    else if (eventTargetName == \"document\") {\n        return document;\n    }\n}\nfunction parseEventOptions(eventOptions) {\n    return eventOptions\n        .split(\":\")\n        .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {});\n}\nfunction stringifyEventTarget(eventTarget) {\n    if (eventTarget == window) {\n        return \"window\";\n    }\n    else if (eventTarget == document) {\n        return \"document\";\n    }\n}\n\nfunction camelize(value) {\n    return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\nfunction namespaceCamelize(value) {\n    return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"));\n}\nfunction capitalize(value) {\n    return value.charAt(0).toUpperCase() + value.slice(1);\n}\nfunction dasherize(value) {\n    return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`);\n}\nfunction tokenize(value) {\n    return value.match(/[^\\s]+/g) || [];\n}\n\nfunction isSomething(object) {\n    return object !== null && object !== undefined;\n}\nfunction hasProperty(object, property) {\n    return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"];\nclass Action {\n    constructor(element, index, descriptor, schema) {\n        this.element = element;\n        this.index = index;\n        this.eventTarget = descriptor.eventTarget || element;\n        this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n        this.eventOptions = descriptor.eventOptions || {};\n        this.identifier = descriptor.identifier || error(\"missing identifier\");\n        this.methodName = descriptor.methodName || error(\"missing method name\");\n        this.keyFilter = descriptor.keyFilter || \"\";\n        this.schema = schema;\n    }\n    static forToken(token, schema) {\n        return new this(token.element, token.index, parseActionDescriptorString(token.content), schema);\n    }\n    toString() {\n        const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\";\n        const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\";\n        return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`;\n    }\n    shouldIgnoreKeyboardEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = this.keyFilter.split(\"+\");\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0];\n        if (!standardFilter) {\n            return false;\n        }\n        if (!hasProperty(this.keyMappings, standardFilter)) {\n            error(`contains unknown key filter: ${this.keyFilter}`);\n        }\n        return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase();\n    }\n    shouldIgnoreMouseEvent(event) {\n        if (!this.keyFilter) {\n            return false;\n        }\n        const filters = [this.keyFilter];\n        if (this.keyFilterDissatisfied(event, filters)) {\n            return true;\n        }\n        return false;\n    }\n    get params() {\n        const params = {};\n        const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\");\n        for (const { name, value } of Array.from(this.element.attributes)) {\n            const match = name.match(pattern);\n            const key = match && match[1];\n            if (key) {\n                params[camelize(key)] = typecast(value);\n            }\n        }\n        return params;\n    }\n    get eventTargetName() {\n        return stringifyEventTarget(this.eventTarget);\n    }\n    get keyMappings() {\n        return this.schema.keyMappings;\n    }\n    keyFilterDissatisfied(event, filters) {\n        const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier));\n        return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift;\n    }\n}\nconst defaultEventNames = {\n    a: () => \"click\",\n    button: () => \"click\",\n    form: () => \"submit\",\n    details: () => \"toggle\",\n    input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n    select: () => \"change\",\n    textarea: () => \"input\",\n};\nfunction getDefaultEventNameForElement(element) {\n    const tagName = element.tagName.toLowerCase();\n    if (tagName in defaultEventNames) {\n        return defaultEventNames[tagName](element);\n    }\n}\nfunction error(message) {\n    throw new Error(message);\n}\nfunction typecast(value) {\n    try {\n        return JSON.parse(value);\n    }\n    catch (o_O) {\n        return value;\n    }\n}\n\nclass Binding {\n    constructor(context, action) {\n        this.context = context;\n        this.action = action;\n    }\n    get index() {\n        return this.action.index;\n    }\n    get eventTarget() {\n        return this.action.eventTarget;\n    }\n    get eventOptions() {\n        return this.action.eventOptions;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    handleEvent(event) {\n        const actionEvent = this.prepareActionEvent(event);\n        if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n            this.invokeWithEvent(actionEvent);\n        }\n    }\n    get eventName() {\n        return this.action.eventName;\n    }\n    get method() {\n        const method = this.controller[this.methodName];\n        if (typeof method == \"function\") {\n            return method;\n        }\n        throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`);\n    }\n    applyEventModifiers(event) {\n        const { element } = this.action;\n        const { actionDescriptorFilters } = this.context.application;\n        const { controller } = this.context;\n        let passes = true;\n        for (const [name, value] of Object.entries(this.eventOptions)) {\n            if (name in actionDescriptorFilters) {\n                const filter = actionDescriptorFilters[name];\n                passes = passes && filter({ name, value, event, element, controller });\n            }\n            else {\n                continue;\n            }\n        }\n        return passes;\n    }\n    prepareActionEvent(event) {\n        return Object.assign(event, { params: this.action.params });\n    }\n    invokeWithEvent(event) {\n        const { target, currentTarget } = event;\n        try {\n            this.method.call(this.controller, event);\n            this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName });\n        }\n        catch (error) {\n            const { identifier, controller, element, index } = this;\n            const detail = { identifier, controller, element, index, event };\n            this.context.handleError(error, `invoking action \"${this.action}\"`, detail);\n        }\n    }\n    willBeInvokedByEvent(event) {\n        const eventTarget = event.target;\n        if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n            return false;\n        }\n        if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n            return false;\n        }\n        if (this.element === eventTarget) {\n            return true;\n        }\n        else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n            return this.scope.containsElement(eventTarget);\n        }\n        else {\n            return this.scope.containsElement(this.action.element);\n        }\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    get methodName() {\n        return this.action.methodName;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nclass ElementObserver {\n    constructor(element, delegate) {\n        this.mutationObserverInit = { attributes: true, childList: true, subtree: true };\n        this.element = element;\n        this.started = false;\n        this.delegate = delegate;\n        this.elements = new Set();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.refresh();\n        }\n    }\n    pause(callback) {\n        if (this.started) {\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n        callback();\n        if (!this.started) {\n            this.mutationObserver.observe(this.element, this.mutationObserverInit);\n            this.started = true;\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            const matches = new Set(this.matchElementsInTree());\n            for (const element of Array.from(this.elements)) {\n                if (!matches.has(element)) {\n                    this.removeElement(element);\n                }\n            }\n            for (const element of Array.from(matches)) {\n                this.addElement(element);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        if (mutation.type == \"attributes\") {\n            this.processAttributeChange(mutation.target, mutation.attributeName);\n        }\n        else if (mutation.type == \"childList\") {\n            this.processRemovedNodes(mutation.removedNodes);\n            this.processAddedNodes(mutation.addedNodes);\n        }\n    }\n    processAttributeChange(element, attributeName) {\n        if (this.elements.has(element)) {\n            if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n                this.delegate.elementAttributeChanged(element, attributeName);\n            }\n            else {\n                this.removeElement(element);\n            }\n        }\n        else if (this.matchElement(element)) {\n            this.addElement(element);\n        }\n    }\n    processRemovedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element) {\n                this.processTree(element, this.removeElement);\n            }\n        }\n    }\n    processAddedNodes(nodes) {\n        for (const node of Array.from(nodes)) {\n            const element = this.elementFromNode(node);\n            if (element && this.elementIsActive(element)) {\n                this.processTree(element, this.addElement);\n            }\n        }\n    }\n    matchElement(element) {\n        return this.delegate.matchElement(element);\n    }\n    matchElementsInTree(tree = this.element) {\n        return this.delegate.matchElementsInTree(tree);\n    }\n    processTree(tree, processor) {\n        for (const element of this.matchElementsInTree(tree)) {\n            processor.call(this, element);\n        }\n    }\n    elementFromNode(node) {\n        if (node.nodeType == Node.ELEMENT_NODE) {\n            return node;\n        }\n    }\n    elementIsActive(element) {\n        if (element.isConnected != this.element.isConnected) {\n            return false;\n        }\n        else {\n            return this.element.contains(element);\n        }\n    }\n    addElement(element) {\n        if (!this.elements.has(element)) {\n            if (this.elementIsActive(element)) {\n                this.elements.add(element);\n                if (this.delegate.elementMatched) {\n                    this.delegate.elementMatched(element);\n                }\n            }\n        }\n    }\n    removeElement(element) {\n        if (this.elements.has(element)) {\n            this.elements.delete(element);\n            if (this.delegate.elementUnmatched) {\n                this.delegate.elementUnmatched(element);\n            }\n        }\n    }\n}\n\nclass AttributeObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeName = attributeName;\n        this.delegate = delegate;\n        this.elementObserver = new ElementObserver(element, this);\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    get selector() {\n        return `[${this.attributeName}]`;\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    matchElement(element) {\n        return element.hasAttribute(this.attributeName);\n    }\n    matchElementsInTree(tree) {\n        const match = this.matchElement(tree) ? [tree] : [];\n        const matches = Array.from(tree.querySelectorAll(this.selector));\n        return match.concat(matches);\n    }\n    elementMatched(element) {\n        if (this.delegate.elementMatchedAttribute) {\n            this.delegate.elementMatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementUnmatched(element) {\n        if (this.delegate.elementUnmatchedAttribute) {\n            this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n        }\n    }\n    elementAttributeChanged(element, attributeName) {\n        if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n            this.delegate.elementAttributeValueChanged(element, attributeName);\n        }\n    }\n}\n\nfunction add(map, key, value) {\n    fetch(map, key).add(value);\n}\nfunction del(map, key, value) {\n    fetch(map, key).delete(value);\n    prune(map, key);\n}\nfunction fetch(map, key) {\n    let values = map.get(key);\n    if (!values) {\n        values = new Set();\n        map.set(key, values);\n    }\n    return values;\n}\nfunction prune(map, key) {\n    const values = map.get(key);\n    if (values != null && values.size == 0) {\n        map.delete(key);\n    }\n}\n\nclass Multimap {\n    constructor() {\n        this.valuesByKey = new Map();\n    }\n    get keys() {\n        return Array.from(this.valuesByKey.keys());\n    }\n    get values() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((values, set) => values.concat(Array.from(set)), []);\n    }\n    get size() {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.reduce((size, set) => size + set.size, 0);\n    }\n    add(key, value) {\n        add(this.valuesByKey, key, value);\n    }\n    delete(key, value) {\n        del(this.valuesByKey, key, value);\n    }\n    has(key, value) {\n        const values = this.valuesByKey.get(key);\n        return values != null && values.has(value);\n    }\n    hasKey(key) {\n        return this.valuesByKey.has(key);\n    }\n    hasValue(value) {\n        const sets = Array.from(this.valuesByKey.values());\n        return sets.some((set) => set.has(value));\n    }\n    getValuesForKey(key) {\n        const values = this.valuesByKey.get(key);\n        return values ? Array.from(values) : [];\n    }\n    getKeysForValue(value) {\n        return Array.from(this.valuesByKey)\n            .filter(([_key, values]) => values.has(value))\n            .map(([key, _values]) => key);\n    }\n}\n\nclass IndexedMultimap extends Multimap {\n    constructor() {\n        super();\n        this.keysByValue = new Map();\n    }\n    get values() {\n        return Array.from(this.keysByValue.keys());\n    }\n    add(key, value) {\n        super.add(key, value);\n        add(this.keysByValue, value, key);\n    }\n    delete(key, value) {\n        super.delete(key, value);\n        del(this.keysByValue, value, key);\n    }\n    hasValue(value) {\n        return this.keysByValue.has(value);\n    }\n    getKeysForValue(value) {\n        const set = this.keysByValue.get(value);\n        return set ? Array.from(set) : [];\n    }\n}\n\nclass SelectorObserver {\n    constructor(element, selector, delegate, details) {\n        this._selector = selector;\n        this.details = details;\n        this.elementObserver = new ElementObserver(element, this);\n        this.delegate = delegate;\n        this.matchesByElement = new Multimap();\n    }\n    get started() {\n        return this.elementObserver.started;\n    }\n    get selector() {\n        return this._selector;\n    }\n    set selector(selector) {\n        this._selector = selector;\n        this.refresh();\n    }\n    start() {\n        this.elementObserver.start();\n    }\n    pause(callback) {\n        this.elementObserver.pause(callback);\n    }\n    stop() {\n        this.elementObserver.stop();\n    }\n    refresh() {\n        this.elementObserver.refresh();\n    }\n    get element() {\n        return this.elementObserver.element;\n    }\n    matchElement(element) {\n        const { selector } = this;\n        if (selector) {\n            const matches = element.matches(selector);\n            if (this.delegate.selectorMatchElement) {\n                return matches && this.delegate.selectorMatchElement(element, this.details);\n            }\n            return matches;\n        }\n        else {\n            return false;\n        }\n    }\n    matchElementsInTree(tree) {\n        const { selector } = this;\n        if (selector) {\n            const match = this.matchElement(tree) ? [tree] : [];\n            const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match));\n            return match.concat(matches);\n        }\n        else {\n            return [];\n        }\n    }\n    elementMatched(element) {\n        const { selector } = this;\n        if (selector) {\n            this.selectorMatched(element, selector);\n        }\n    }\n    elementUnmatched(element) {\n        const selectors = this.matchesByElement.getKeysForValue(element);\n        for (const selector of selectors) {\n            this.selectorUnmatched(element, selector);\n        }\n    }\n    elementAttributeChanged(element, _attributeName) {\n        const { selector } = this;\n        if (selector) {\n            const matches = this.matchElement(element);\n            const matchedBefore = this.matchesByElement.has(selector, element);\n            if (matches && !matchedBefore) {\n                this.selectorMatched(element, selector);\n            }\n            else if (!matches && matchedBefore) {\n                this.selectorUnmatched(element, selector);\n            }\n        }\n    }\n    selectorMatched(element, selector) {\n        this.delegate.selectorMatched(element, selector, this.details);\n        this.matchesByElement.add(selector, element);\n    }\n    selectorUnmatched(element, selector) {\n        this.delegate.selectorUnmatched(element, selector, this.details);\n        this.matchesByElement.delete(selector, element);\n    }\n}\n\nclass StringMapObserver {\n    constructor(element, delegate) {\n        this.element = element;\n        this.delegate = delegate;\n        this.started = false;\n        this.stringMap = new Map();\n        this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations));\n    }\n    start() {\n        if (!this.started) {\n            this.started = true;\n            this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true });\n            this.refresh();\n        }\n    }\n    stop() {\n        if (this.started) {\n            this.mutationObserver.takeRecords();\n            this.mutationObserver.disconnect();\n            this.started = false;\n        }\n    }\n    refresh() {\n        if (this.started) {\n            for (const attributeName of this.knownAttributeNames) {\n                this.refreshAttribute(attributeName, null);\n            }\n        }\n    }\n    processMutations(mutations) {\n        if (this.started) {\n            for (const mutation of mutations) {\n                this.processMutation(mutation);\n            }\n        }\n    }\n    processMutation(mutation) {\n        const attributeName = mutation.attributeName;\n        if (attributeName) {\n            this.refreshAttribute(attributeName, mutation.oldValue);\n        }\n    }\n    refreshAttribute(attributeName, oldValue) {\n        const key = this.delegate.getStringMapKeyForAttribute(attributeName);\n        if (key != null) {\n            if (!this.stringMap.has(attributeName)) {\n                this.stringMapKeyAdded(key, attributeName);\n            }\n            const value = this.element.getAttribute(attributeName);\n            if (this.stringMap.get(attributeName) != value) {\n                this.stringMapValueChanged(value, key, oldValue);\n            }\n            if (value == null) {\n                const oldValue = this.stringMap.get(attributeName);\n                this.stringMap.delete(attributeName);\n                if (oldValue)\n                    this.stringMapKeyRemoved(key, attributeName, oldValue);\n            }\n            else {\n                this.stringMap.set(attributeName, value);\n            }\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        if (this.delegate.stringMapKeyAdded) {\n            this.delegate.stringMapKeyAdded(key, attributeName);\n        }\n    }\n    stringMapValueChanged(value, key, oldValue) {\n        if (this.delegate.stringMapValueChanged) {\n            this.delegate.stringMapValueChanged(value, key, oldValue);\n        }\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        if (this.delegate.stringMapKeyRemoved) {\n            this.delegate.stringMapKeyRemoved(key, attributeName, oldValue);\n        }\n    }\n    get knownAttributeNames() {\n        return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n    }\n    get currentAttributeNames() {\n        return Array.from(this.element.attributes).map((attribute) => attribute.name);\n    }\n    get recordedAttributeNames() {\n        return Array.from(this.stringMap.keys());\n    }\n}\n\nclass TokenListObserver {\n    constructor(element, attributeName, delegate) {\n        this.attributeObserver = new AttributeObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.tokensByElement = new Multimap();\n    }\n    get started() {\n        return this.attributeObserver.started;\n    }\n    start() {\n        this.attributeObserver.start();\n    }\n    pause(callback) {\n        this.attributeObserver.pause(callback);\n    }\n    stop() {\n        this.attributeObserver.stop();\n    }\n    refresh() {\n        this.attributeObserver.refresh();\n    }\n    get element() {\n        return this.attributeObserver.element;\n    }\n    get attributeName() {\n        return this.attributeObserver.attributeName;\n    }\n    elementMatchedAttribute(element) {\n        this.tokensMatched(this.readTokensForElement(element));\n    }\n    elementAttributeValueChanged(element) {\n        const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element);\n        this.tokensUnmatched(unmatchedTokens);\n        this.tokensMatched(matchedTokens);\n    }\n    elementUnmatchedAttribute(element) {\n        this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n    }\n    tokensMatched(tokens) {\n        tokens.forEach((token) => this.tokenMatched(token));\n    }\n    tokensUnmatched(tokens) {\n        tokens.forEach((token) => this.tokenUnmatched(token));\n    }\n    tokenMatched(token) {\n        this.delegate.tokenMatched(token);\n        this.tokensByElement.add(token.element, token);\n    }\n    tokenUnmatched(token) {\n        this.delegate.tokenUnmatched(token);\n        this.tokensByElement.delete(token.element, token);\n    }\n    refreshTokensForElement(element) {\n        const previousTokens = this.tokensByElement.getValuesForKey(element);\n        const currentTokens = this.readTokensForElement(element);\n        const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken));\n        if (firstDifferingIndex == -1) {\n            return [[], []];\n        }\n        else {\n            return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n        }\n    }\n    readTokensForElement(element) {\n        const attributeName = this.attributeName;\n        const tokenString = element.getAttribute(attributeName) || \"\";\n        return parseTokenString(tokenString, element, attributeName);\n    }\n}\nfunction parseTokenString(tokenString, element, attributeName) {\n    return tokenString\n        .trim()\n        .split(/\\s+/)\n        .filter((content) => content.length)\n        .map((content, index) => ({ element, attributeName, content, index }));\n}\nfunction zip(left, right) {\n    const length = Math.max(left.length, right.length);\n    return Array.from({ length }, (_, index) => [left[index], right[index]]);\n}\nfunction tokensAreEqual(left, right) {\n    return left && right && left.index == right.index && left.content == right.content;\n}\n\nclass ValueListObserver {\n    constructor(element, attributeName, delegate) {\n        this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n        this.delegate = delegate;\n        this.parseResultsByToken = new WeakMap();\n        this.valuesByTokenByElement = new WeakMap();\n    }\n    get started() {\n        return this.tokenListObserver.started;\n    }\n    start() {\n        this.tokenListObserver.start();\n    }\n    stop() {\n        this.tokenListObserver.stop();\n    }\n    refresh() {\n        this.tokenListObserver.refresh();\n    }\n    get element() {\n        return this.tokenListObserver.element;\n    }\n    get attributeName() {\n        return this.tokenListObserver.attributeName;\n    }\n    tokenMatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).set(token, value);\n            this.delegate.elementMatchedValue(element, value);\n        }\n    }\n    tokenUnmatched(token) {\n        const { element } = token;\n        const { value } = this.fetchParseResultForToken(token);\n        if (value) {\n            this.fetchValuesByTokenForElement(element).delete(token);\n            this.delegate.elementUnmatchedValue(element, value);\n        }\n    }\n    fetchParseResultForToken(token) {\n        let parseResult = this.parseResultsByToken.get(token);\n        if (!parseResult) {\n            parseResult = this.parseToken(token);\n            this.parseResultsByToken.set(token, parseResult);\n        }\n        return parseResult;\n    }\n    fetchValuesByTokenForElement(element) {\n        let valuesByToken = this.valuesByTokenByElement.get(element);\n        if (!valuesByToken) {\n            valuesByToken = new Map();\n            this.valuesByTokenByElement.set(element, valuesByToken);\n        }\n        return valuesByToken;\n    }\n    parseToken(token) {\n        try {\n            const value = this.delegate.parseValueForToken(token);\n            return { value };\n        }\n        catch (error) {\n            return { error };\n        }\n    }\n}\n\nclass BindingObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.bindingsByAction = new Map();\n    }\n    start() {\n        if (!this.valueListObserver) {\n            this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n            this.valueListObserver.start();\n        }\n    }\n    stop() {\n        if (this.valueListObserver) {\n            this.valueListObserver.stop();\n            delete this.valueListObserver;\n            this.disconnectAllActions();\n        }\n    }\n    get element() {\n        return this.context.element;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get actionAttribute() {\n        return this.schema.actionAttribute;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get bindings() {\n        return Array.from(this.bindingsByAction.values());\n    }\n    connectAction(action) {\n        const binding = new Binding(this.context, action);\n        this.bindingsByAction.set(action, binding);\n        this.delegate.bindingConnected(binding);\n    }\n    disconnectAction(action) {\n        const binding = this.bindingsByAction.get(action);\n        if (binding) {\n            this.bindingsByAction.delete(action);\n            this.delegate.bindingDisconnected(binding);\n        }\n    }\n    disconnectAllActions() {\n        this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true));\n        this.bindingsByAction.clear();\n    }\n    parseValueForToken(token) {\n        const action = Action.forToken(token, this.schema);\n        if (action.identifier == this.identifier) {\n            return action;\n        }\n    }\n    elementMatchedValue(element, action) {\n        this.connectAction(action);\n    }\n    elementUnmatchedValue(element, action) {\n        this.disconnectAction(action);\n    }\n}\n\nclass ValueObserver {\n    constructor(context, receiver) {\n        this.context = context;\n        this.receiver = receiver;\n        this.stringMapObserver = new StringMapObserver(this.element, this);\n        this.valueDescriptorMap = this.controller.valueDescriptorMap;\n    }\n    start() {\n        this.stringMapObserver.start();\n        this.invokeChangedCallbacksForDefaultValues();\n    }\n    stop() {\n        this.stringMapObserver.stop();\n    }\n    get element() {\n        return this.context.element;\n    }\n    get controller() {\n        return this.context.controller;\n    }\n    getStringMapKeyForAttribute(attributeName) {\n        if (attributeName in this.valueDescriptorMap) {\n            return this.valueDescriptorMap[attributeName].name;\n        }\n    }\n    stringMapKeyAdded(key, attributeName) {\n        const descriptor = this.valueDescriptorMap[attributeName];\n        if (!this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue));\n        }\n    }\n    stringMapValueChanged(value, name, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[name];\n        if (value === null)\n            return;\n        if (oldValue === null) {\n            oldValue = descriptor.writer(descriptor.defaultValue);\n        }\n        this.invokeChangedCallback(name, value, oldValue);\n    }\n    stringMapKeyRemoved(key, attributeName, oldValue) {\n        const descriptor = this.valueDescriptorNameMap[key];\n        if (this.hasValue(key)) {\n            this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue);\n        }\n        else {\n            this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue);\n        }\n    }\n    invokeChangedCallbacksForDefaultValues() {\n        for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n            if (defaultValue != undefined && !this.controller.data.has(key)) {\n                this.invokeChangedCallback(name, writer(defaultValue), undefined);\n            }\n        }\n    }\n    invokeChangedCallback(name, rawValue, rawOldValue) {\n        const changedMethodName = `${name}Changed`;\n        const changedMethod = this.receiver[changedMethodName];\n        if (typeof changedMethod == \"function\") {\n            const descriptor = this.valueDescriptorNameMap[name];\n            try {\n                const value = descriptor.reader(rawValue);\n                let oldValue = rawOldValue;\n                if (rawOldValue) {\n                    oldValue = descriptor.reader(rawOldValue);\n                }\n                changedMethod.call(this.receiver, value, oldValue);\n            }\n            catch (error) {\n                if (error instanceof TypeError) {\n                    error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`;\n                }\n                throw error;\n            }\n        }\n    }\n    get valueDescriptors() {\n        const { valueDescriptorMap } = this;\n        return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]);\n    }\n    get valueDescriptorNameMap() {\n        const descriptors = {};\n        Object.keys(this.valueDescriptorMap).forEach((key) => {\n            const descriptor = this.valueDescriptorMap[key];\n            descriptors[descriptor.name] = descriptor;\n        });\n        return descriptors;\n    }\n    hasValue(attributeName) {\n        const descriptor = this.valueDescriptorNameMap[attributeName];\n        const hasMethodName = `has${capitalize(descriptor.name)}`;\n        return this.receiver[hasMethodName];\n    }\n}\n\nclass TargetObserver {\n    constructor(context, delegate) {\n        this.context = context;\n        this.delegate = delegate;\n        this.targetsByName = new Multimap();\n    }\n    start() {\n        if (!this.tokenListObserver) {\n            this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this);\n            this.tokenListObserver.start();\n        }\n    }\n    stop() {\n        if (this.tokenListObserver) {\n            this.disconnectAllTargets();\n            this.tokenListObserver.stop();\n            delete this.tokenListObserver;\n        }\n    }\n    tokenMatched({ element, content: name }) {\n        if (this.scope.containsElement(element)) {\n            this.connectTarget(element, name);\n        }\n    }\n    tokenUnmatched({ element, content: name }) {\n        this.disconnectTarget(element, name);\n    }\n    connectTarget(element, name) {\n        var _a;\n        if (!this.targetsByName.has(name, element)) {\n            this.targetsByName.add(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name));\n        }\n    }\n    disconnectTarget(element, name) {\n        var _a;\n        if (this.targetsByName.has(name, element)) {\n            this.targetsByName.delete(name, element);\n            (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name));\n        }\n    }\n    disconnectAllTargets() {\n        for (const name of this.targetsByName.keys) {\n            for (const element of this.targetsByName.getValuesForKey(name)) {\n                this.disconnectTarget(element, name);\n            }\n        }\n    }\n    get attributeName() {\n        return `data-${this.context.identifier}-target`;\n    }\n    get element() {\n        return this.context.element;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n}\n\nfunction readInheritableStaticArrayValues(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return Array.from(ancestors.reduce((values, constructor) => {\n        getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name));\n        return values;\n    }, new Set()));\n}\nfunction readInheritableStaticObjectPairs(constructor, propertyName) {\n    const ancestors = getAncestorsForConstructor(constructor);\n    return ancestors.reduce((pairs, constructor) => {\n        pairs.push(...getOwnStaticObjectPairs(constructor, propertyName));\n        return pairs;\n    }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n    const ancestors = [];\n    while (constructor) {\n        ancestors.push(constructor);\n        constructor = Object.getPrototypeOf(constructor);\n    }\n    return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n    const definition = constructor[propertyName];\n    return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : [];\n}\n\nclass OutletObserver {\n    constructor(context, delegate) {\n        this.started = false;\n        this.context = context;\n        this.delegate = delegate;\n        this.outletsByName = new Multimap();\n        this.outletElementsByName = new Multimap();\n        this.selectorObserverMap = new Map();\n        this.attributeObserverMap = new Map();\n    }\n    start() {\n        if (!this.started) {\n            this.outletDefinitions.forEach((outletName) => {\n                this.setupSelectorObserverForOutlet(outletName);\n                this.setupAttributeObserverForOutlet(outletName);\n            });\n            this.started = true;\n            this.dependentContexts.forEach((context) => context.refresh());\n        }\n    }\n    refresh() {\n        this.selectorObserverMap.forEach((observer) => observer.refresh());\n        this.attributeObserverMap.forEach((observer) => observer.refresh());\n    }\n    stop() {\n        if (this.started) {\n            this.started = false;\n            this.disconnectAllOutlets();\n            this.stopSelectorObservers();\n            this.stopAttributeObservers();\n        }\n    }\n    stopSelectorObservers() {\n        if (this.selectorObserverMap.size > 0) {\n            this.selectorObserverMap.forEach((observer) => observer.stop());\n            this.selectorObserverMap.clear();\n        }\n    }\n    stopAttributeObservers() {\n        if (this.attributeObserverMap.size > 0) {\n            this.attributeObserverMap.forEach((observer) => observer.stop());\n            this.attributeObserverMap.clear();\n        }\n    }\n    selectorMatched(element, _selector, { outletName }) {\n        const outlet = this.getOutlet(element, outletName);\n        if (outlet) {\n            this.connectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorUnmatched(element, _selector, { outletName }) {\n        const outlet = this.getOutletFromMap(element, outletName);\n        if (outlet) {\n            this.disconnectOutlet(outlet, element, outletName);\n        }\n    }\n    selectorMatchElement(element, { outletName }) {\n        const selector = this.selector(outletName);\n        const hasOutlet = this.hasOutlet(element, outletName);\n        const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`);\n        if (selector) {\n            return hasOutlet && hasOutletController && element.matches(selector);\n        }\n        else {\n            return false;\n        }\n    }\n    elementMatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementAttributeValueChanged(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    elementUnmatchedAttribute(_element, attributeName) {\n        const outletName = this.getOutletNameFromOutletAttributeName(attributeName);\n        if (outletName) {\n            this.updateSelectorObserverForOutlet(outletName);\n        }\n    }\n    connectOutlet(outlet, element, outletName) {\n        var _a;\n        if (!this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.add(outletName, outlet);\n            this.outletElementsByName.add(outletName, element);\n            (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName));\n        }\n    }\n    disconnectOutlet(outlet, element, outletName) {\n        var _a;\n        if (this.outletElementsByName.has(outletName, element)) {\n            this.outletsByName.delete(outletName, outlet);\n            this.outletElementsByName.delete(outletName, element);\n            (_a = this.selectorObserverMap\n                .get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName));\n        }\n    }\n    disconnectAllOutlets() {\n        for (const outletName of this.outletElementsByName.keys) {\n            for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n                for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n                    this.disconnectOutlet(outlet, element, outletName);\n                }\n            }\n        }\n    }\n    updateSelectorObserverForOutlet(outletName) {\n        const observer = this.selectorObserverMap.get(outletName);\n        if (observer) {\n            observer.selector = this.selector(outletName);\n        }\n    }\n    setupSelectorObserverForOutlet(outletName) {\n        const selector = this.selector(outletName);\n        const selectorObserver = new SelectorObserver(document.body, selector, this, { outletName });\n        this.selectorObserverMap.set(outletName, selectorObserver);\n        selectorObserver.start();\n    }\n    setupAttributeObserverForOutlet(outletName) {\n        const attributeName = this.attributeNameForOutletName(outletName);\n        const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this);\n        this.attributeObserverMap.set(outletName, attributeObserver);\n        attributeObserver.start();\n    }\n    selector(outletName) {\n        return this.scope.outlets.getSelectorForOutletName(outletName);\n    }\n    attributeNameForOutletName(outletName) {\n        return this.scope.schema.outletAttributeForScope(this.identifier, outletName);\n    }\n    getOutletNameFromOutletAttributeName(attributeName) {\n        return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName);\n    }\n    get outletDependencies() {\n        const dependencies = new Multimap();\n        this.router.modules.forEach((module) => {\n            const constructor = module.definition.controllerConstructor;\n            const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n            outlets.forEach((outlet) => dependencies.add(outlet, module.identifier));\n        });\n        return dependencies;\n    }\n    get outletDefinitions() {\n        return this.outletDependencies.getKeysForValue(this.identifier);\n    }\n    get dependentControllerIdentifiers() {\n        return this.outletDependencies.getValuesForKey(this.identifier);\n    }\n    get dependentContexts() {\n        const identifiers = this.dependentControllerIdentifiers;\n        return this.router.contexts.filter((context) => identifiers.includes(context.identifier));\n    }\n    hasOutlet(element, outletName) {\n        return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName);\n    }\n    getOutlet(element, outletName) {\n        return this.application.getControllerForElementAndIdentifier(element, outletName);\n    }\n    getOutletFromMap(element, outletName) {\n        return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element);\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get schema() {\n        return this.context.schema;\n    }\n    get identifier() {\n        return this.context.identifier;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get router() {\n        return this.application.router;\n    }\n}\n\nclass Context {\n    constructor(module, scope) {\n        this.logDebugActivity = (functionName, detail = {}) => {\n            const { identifier, controller, element } = this;\n            detail = Object.assign({ identifier, controller, element }, detail);\n            this.application.logDebugActivity(this.identifier, functionName, detail);\n        };\n        this.module = module;\n        this.scope = scope;\n        this.controller = new module.controllerConstructor(this);\n        this.bindingObserver = new BindingObserver(this, this.dispatcher);\n        this.valueObserver = new ValueObserver(this, this.controller);\n        this.targetObserver = new TargetObserver(this, this);\n        this.outletObserver = new OutletObserver(this, this);\n        try {\n            this.controller.initialize();\n            this.logDebugActivity(\"initialize\");\n        }\n        catch (error) {\n            this.handleError(error, \"initializing controller\");\n        }\n    }\n    connect() {\n        this.bindingObserver.start();\n        this.valueObserver.start();\n        this.targetObserver.start();\n        this.outletObserver.start();\n        try {\n            this.controller.connect();\n            this.logDebugActivity(\"connect\");\n        }\n        catch (error) {\n            this.handleError(error, \"connecting controller\");\n        }\n    }\n    refresh() {\n        this.outletObserver.refresh();\n    }\n    disconnect() {\n        try {\n            this.controller.disconnect();\n            this.logDebugActivity(\"disconnect\");\n        }\n        catch (error) {\n            this.handleError(error, \"disconnecting controller\");\n        }\n        this.outletObserver.stop();\n        this.targetObserver.stop();\n        this.valueObserver.stop();\n        this.bindingObserver.stop();\n    }\n    get application() {\n        return this.module.application;\n    }\n    get identifier() {\n        return this.module.identifier;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get dispatcher() {\n        return this.application.dispatcher;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get parentElement() {\n        return this.element.parentElement;\n    }\n    handleError(error, message, detail = {}) {\n        const { identifier, controller, element } = this;\n        detail = Object.assign({ identifier, controller, element }, detail);\n        this.application.handleError(error, `Error ${message}`, detail);\n    }\n    targetConnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetConnected`, element);\n    }\n    targetDisconnected(element, name) {\n        this.invokeControllerMethod(`${name}TargetDisconnected`, element);\n    }\n    outletConnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element);\n    }\n    outletDisconnected(outlet, element, name) {\n        this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element);\n    }\n    invokeControllerMethod(methodName, ...args) {\n        const controller = this.controller;\n        if (typeof controller[methodName] == \"function\") {\n            controller[methodName](...args);\n        }\n    }\n}\n\nfunction bless(constructor) {\n    return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n    const shadowConstructor = extend(constructor);\n    const shadowProperties = getShadowProperties(constructor.prototype, properties);\n    Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n    return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n    const blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n    return blessings.reduce((blessedProperties, blessing) => {\n        const properties = blessing(constructor);\n        for (const key in properties) {\n            const descriptor = blessedProperties[key] || {};\n            blessedProperties[key] = Object.assign(descriptor, properties[key]);\n        }\n        return blessedProperties;\n    }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n    return getOwnKeys(properties).reduce((shadowProperties, key) => {\n        const descriptor = getShadowedDescriptor(prototype, properties, key);\n        if (descriptor) {\n            Object.assign(shadowProperties, { [key]: descriptor });\n        }\n        return shadowProperties;\n    }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n    const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n    const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n    if (!shadowedByValue) {\n        const descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n        if (shadowingDescriptor) {\n            descriptor.get = shadowingDescriptor.get || descriptor.get;\n            descriptor.set = shadowingDescriptor.set || descriptor.set;\n        }\n        return descriptor;\n    }\n}\nconst getOwnKeys = (() => {\n    if (typeof Object.getOwnPropertySymbols == \"function\") {\n        return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)];\n    }\n    else {\n        return Object.getOwnPropertyNames;\n    }\n})();\nconst extend = (() => {\n    function extendWithReflect(constructor) {\n        function extended() {\n            return Reflect.construct(constructor, arguments, new.target);\n        }\n        extended.prototype = Object.create(constructor.prototype, {\n            constructor: { value: extended },\n        });\n        Reflect.setPrototypeOf(extended, constructor);\n        return extended;\n    }\n    function testReflectExtension() {\n        const a = function () {\n            this.a.call(this);\n        };\n        const b = extendWithReflect(a);\n        b.prototype.a = function () { };\n        return new b();\n    }\n    try {\n        testReflectExtension();\n        return extendWithReflect;\n    }\n    catch (error) {\n        return (constructor) => class extended extends constructor {\n        };\n    }\n})();\n\nfunction blessDefinition(definition) {\n    return {\n        identifier: definition.identifier,\n        controllerConstructor: bless(definition.controllerConstructor),\n    };\n}\n\nclass Module {\n    constructor(application, definition) {\n        this.application = application;\n        this.definition = blessDefinition(definition);\n        this.contextsByScope = new WeakMap();\n        this.connectedContexts = new Set();\n    }\n    get identifier() {\n        return this.definition.identifier;\n    }\n    get controllerConstructor() {\n        return this.definition.controllerConstructor;\n    }\n    get contexts() {\n        return Array.from(this.connectedContexts);\n    }\n    connectContextForScope(scope) {\n        const context = this.fetchContextForScope(scope);\n        this.connectedContexts.add(context);\n        context.connect();\n    }\n    disconnectContextForScope(scope) {\n        const context = this.contextsByScope.get(scope);\n        if (context) {\n            this.connectedContexts.delete(context);\n            context.disconnect();\n        }\n    }\n    fetchContextForScope(scope) {\n        let context = this.contextsByScope.get(scope);\n        if (!context) {\n            context = new Context(this, scope);\n            this.contextsByScope.set(scope, context);\n        }\n        return context;\n    }\n}\n\nclass ClassMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    has(name) {\n        return this.data.has(this.getDataKey(name));\n    }\n    get(name) {\n        return this.getAll(name)[0];\n    }\n    getAll(name) {\n        const tokenString = this.data.get(this.getDataKey(name)) || \"\";\n        return tokenize(tokenString);\n    }\n    getAttributeName(name) {\n        return this.data.getAttributeNameForKey(this.getDataKey(name));\n    }\n    getDataKey(name) {\n        return `${name}-class`;\n    }\n    get data() {\n        return this.scope.data;\n    }\n}\n\nclass DataMap {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.getAttribute(name);\n    }\n    set(key, value) {\n        const name = this.getAttributeNameForKey(key);\n        this.element.setAttribute(name, value);\n        return this.get(key);\n    }\n    has(key) {\n        const name = this.getAttributeNameForKey(key);\n        return this.element.hasAttribute(name);\n    }\n    delete(key) {\n        if (this.has(key)) {\n            const name = this.getAttributeNameForKey(key);\n            this.element.removeAttribute(name);\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n    getAttributeNameForKey(key) {\n        return `data-${this.identifier}-${dasherize(key)}`;\n    }\n}\n\nclass Guide {\n    constructor(logger) {\n        this.warnedKeysByObject = new WeakMap();\n        this.logger = logger;\n    }\n    warn(object, key, message) {\n        let warnedKeys = this.warnedKeysByObject.get(object);\n        if (!warnedKeys) {\n            warnedKeys = new Set();\n            this.warnedKeysByObject.set(object, warnedKeys);\n        }\n        if (!warnedKeys.has(key)) {\n            warnedKeys.add(key);\n            this.logger.warn(message, object);\n        }\n    }\n}\n\nfunction attributeValueContainsToken(attributeName, token) {\n    return `[${attributeName}~=\"${token}\"]`;\n}\n\nclass TargetSet {\n    constructor(scope) {\n        this.scope = scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(targetName) {\n        return this.find(targetName) != null;\n    }\n    find(...targetNames) {\n        return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), undefined);\n    }\n    findAll(...targetNames) {\n        return targetNames.reduce((targets, targetName) => [\n            ...targets,\n            ...this.findAllTargets(targetName),\n            ...this.findAllLegacyTargets(targetName),\n        ], []);\n    }\n    findTarget(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findElement(selector);\n    }\n    findAllTargets(targetName) {\n        const selector = this.getSelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector);\n    }\n    getSelectorForTargetName(targetName) {\n        const attributeName = this.schema.targetAttributeForScope(this.identifier);\n        return attributeValueContainsToken(attributeName, targetName);\n    }\n    findLegacyTarget(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.deprecate(this.scope.findElement(selector), targetName);\n    }\n    findAllLegacyTargets(targetName) {\n        const selector = this.getLegacySelectorForTargetName(targetName);\n        return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName));\n    }\n    getLegacySelectorForTargetName(targetName) {\n        const targetDescriptor = `${this.identifier}.${targetName}`;\n        return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n    }\n    deprecate(element, targetName) {\n        if (element) {\n            const { identifier } = this;\n            const attributeName = this.schema.targetAttribute;\n            const revisedAttributeName = this.schema.targetAttributeForScope(identifier);\n            this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n                `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`);\n        }\n        return element;\n    }\n    get guide() {\n        return this.scope.guide;\n    }\n}\n\nclass OutletSet {\n    constructor(scope, controllerElement) {\n        this.scope = scope;\n        this.controllerElement = controllerElement;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get schema() {\n        return this.scope.schema;\n    }\n    has(outletName) {\n        return this.find(outletName) != null;\n    }\n    find(...outletNames) {\n        return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), undefined);\n    }\n    findAll(...outletNames) {\n        return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []);\n    }\n    getSelectorForOutletName(outletName) {\n        const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName);\n        return this.controllerElement.getAttribute(attributeName);\n    }\n    findOutlet(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        if (selector)\n            return this.findElement(selector, outletName);\n    }\n    findAllOutlets(outletName) {\n        const selector = this.getSelectorForOutletName(outletName);\n        return selector ? this.findAllElements(selector, outletName) : [];\n    }\n    findElement(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName))[0];\n    }\n    findAllElements(selector, outletName) {\n        const elements = this.scope.queryElements(selector);\n        return elements.filter((element) => this.matchesElement(element, selector, outletName));\n    }\n    matchesElement(element, selector, outletName) {\n        const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\";\n        return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName);\n    }\n}\n\nclass Scope {\n    constructor(schema, element, identifier, logger) {\n        this.targets = new TargetSet(this);\n        this.classes = new ClassMap(this);\n        this.data = new DataMap(this);\n        this.containsElement = (element) => {\n            return element.closest(this.controllerSelector) === this.element;\n        };\n        this.schema = schema;\n        this.element = element;\n        this.identifier = identifier;\n        this.guide = new Guide(logger);\n        this.outlets = new OutletSet(this.documentScope, element);\n    }\n    findElement(selector) {\n        return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement);\n    }\n    findAllElements(selector) {\n        return [\n            ...(this.element.matches(selector) ? [this.element] : []),\n            ...this.queryElements(selector).filter(this.containsElement),\n        ];\n    }\n    queryElements(selector) {\n        return Array.from(this.element.querySelectorAll(selector));\n    }\n    get controllerSelector() {\n        return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n    }\n    get isDocumentScope() {\n        return this.element === document.documentElement;\n    }\n    get documentScope() {\n        return this.isDocumentScope\n            ? this\n            : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger);\n    }\n}\n\nclass ScopeObserver {\n    constructor(element, schema, delegate) {\n        this.element = element;\n        this.schema = schema;\n        this.delegate = delegate;\n        this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n        this.scopesByIdentifierByElement = new WeakMap();\n        this.scopeReferenceCounts = new WeakMap();\n    }\n    start() {\n        this.valueListObserver.start();\n    }\n    stop() {\n        this.valueListObserver.stop();\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    parseValueForToken(token) {\n        const { element, content: identifier } = token;\n        return this.parseValueForElementAndIdentifier(element, identifier);\n    }\n    parseValueForElementAndIdentifier(element, identifier) {\n        const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n        let scope = scopesByIdentifier.get(identifier);\n        if (!scope) {\n            scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n            scopesByIdentifier.set(identifier, scope);\n        }\n        return scope;\n    }\n    elementMatchedValue(element, value) {\n        const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n        this.scopeReferenceCounts.set(value, referenceCount);\n        if (referenceCount == 1) {\n            this.delegate.scopeConnected(value);\n        }\n    }\n    elementUnmatchedValue(element, value) {\n        const referenceCount = this.scopeReferenceCounts.get(value);\n        if (referenceCount) {\n            this.scopeReferenceCounts.set(value, referenceCount - 1);\n            if (referenceCount == 1) {\n                this.delegate.scopeDisconnected(value);\n            }\n        }\n    }\n    fetchScopesByIdentifierForElement(element) {\n        let scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n        if (!scopesByIdentifier) {\n            scopesByIdentifier = new Map();\n            this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n        }\n        return scopesByIdentifier;\n    }\n}\n\nclass Router {\n    constructor(application) {\n        this.application = application;\n        this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n        this.scopesByIdentifier = new Multimap();\n        this.modulesByIdentifier = new Map();\n    }\n    get element() {\n        return this.application.element;\n    }\n    get schema() {\n        return this.application.schema;\n    }\n    get logger() {\n        return this.application.logger;\n    }\n    get controllerAttribute() {\n        return this.schema.controllerAttribute;\n    }\n    get modules() {\n        return Array.from(this.modulesByIdentifier.values());\n    }\n    get contexts() {\n        return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []);\n    }\n    start() {\n        this.scopeObserver.start();\n    }\n    stop() {\n        this.scopeObserver.stop();\n    }\n    loadDefinition(definition) {\n        this.unloadIdentifier(definition.identifier);\n        const module = new Module(this.application, definition);\n        this.connectModule(module);\n        const afterLoad = definition.controllerConstructor.afterLoad;\n        if (afterLoad) {\n            afterLoad.call(definition.controllerConstructor, definition.identifier, this.application);\n        }\n    }\n    unloadIdentifier(identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            this.disconnectModule(module);\n        }\n    }\n    getContextForElementAndIdentifier(element, identifier) {\n        const module = this.modulesByIdentifier.get(identifier);\n        if (module) {\n            return module.contexts.find((context) => context.element == element);\n        }\n    }\n    proposeToConnectScopeForElementAndIdentifier(element, identifier) {\n        const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier);\n        if (scope) {\n            this.scopeObserver.elementMatchedValue(scope.element, scope);\n        }\n        else {\n            console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element);\n        }\n    }\n    handleError(error, message, detail) {\n        this.application.handleError(error, message, detail);\n    }\n    createScopeForElementAndIdentifier(element, identifier) {\n        return new Scope(this.schema, element, identifier, this.logger);\n    }\n    scopeConnected(scope) {\n        this.scopesByIdentifier.add(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.connectContextForScope(scope);\n        }\n    }\n    scopeDisconnected(scope) {\n        this.scopesByIdentifier.delete(scope.identifier, scope);\n        const module = this.modulesByIdentifier.get(scope.identifier);\n        if (module) {\n            module.disconnectContextForScope(scope);\n        }\n    }\n    connectModule(module) {\n        this.modulesByIdentifier.set(module.identifier, module);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.connectContextForScope(scope));\n    }\n    disconnectModule(module) {\n        this.modulesByIdentifier.delete(module.identifier);\n        const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n        scopes.forEach((scope) => module.disconnectContextForScope(scope));\n    }\n}\n\nconst defaultSchema = {\n    controllerAttribute: \"data-controller\",\n    actionAttribute: \"data-action\",\n    targetAttribute: \"data-target\",\n    targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n    outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n    keyMappings: Object.assign(Object.assign({ enter: \"Enter\", tab: \"Tab\", esc: \"Escape\", space: \" \", up: \"ArrowUp\", down: \"ArrowDown\", left: \"ArrowLeft\", right: \"ArrowRight\", home: \"Home\", end: \"End\", page_up: \"PageUp\", page_down: \"PageDown\" }, objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c]))), objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n]))),\n};\nfunction objectFromEntries(array) {\n    return array.reduce((memo, [k, v]) => (Object.assign(Object.assign({}, memo), { [k]: v })), {});\n}\n\nclass Application {\n    constructor(element = document.documentElement, schema = defaultSchema) {\n        this.logger = console;\n        this.debug = false;\n        this.logDebugActivity = (identifier, functionName, detail = {}) => {\n            if (this.debug) {\n                this.logFormattedMessage(identifier, functionName, detail);\n            }\n        };\n        this.element = element;\n        this.schema = schema;\n        this.dispatcher = new Dispatcher(this);\n        this.router = new Router(this);\n        this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters);\n    }\n    static start(element, schema) {\n        const application = new this(element, schema);\n        application.start();\n        return application;\n    }\n    async start() {\n        await domReady();\n        this.logDebugActivity(\"application\", \"starting\");\n        this.dispatcher.start();\n        this.router.start();\n        this.logDebugActivity(\"application\", \"start\");\n    }\n    stop() {\n        this.logDebugActivity(\"application\", \"stopping\");\n        this.dispatcher.stop();\n        this.router.stop();\n        this.logDebugActivity(\"application\", \"stop\");\n    }\n    register(identifier, controllerConstructor) {\n        this.load({ identifier, controllerConstructor });\n    }\n    registerActionOption(name, filter) {\n        this.actionDescriptorFilters[name] = filter;\n    }\n    load(head, ...rest) {\n        const definitions = Array.isArray(head) ? head : [head, ...rest];\n        definitions.forEach((definition) => {\n            if (definition.controllerConstructor.shouldLoad) {\n                this.router.loadDefinition(definition);\n            }\n        });\n    }\n    unload(head, ...rest) {\n        const identifiers = Array.isArray(head) ? head : [head, ...rest];\n        identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier));\n    }\n    get controllers() {\n        return this.router.contexts.map((context) => context.controller);\n    }\n    getControllerForElementAndIdentifier(element, identifier) {\n        const context = this.router.getContextForElementAndIdentifier(element, identifier);\n        return context ? context.controller : null;\n    }\n    handleError(error, message, detail) {\n        var _a;\n        this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail);\n        (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, \"\", 0, 0, error);\n    }\n    logFormattedMessage(identifier, functionName, detail = {}) {\n        detail = Object.assign({ application: this }, detail);\n        this.logger.groupCollapsed(`${identifier} #${functionName}`);\n        this.logger.log(\"details:\", Object.assign({}, detail));\n        this.logger.groupEnd();\n    }\n}\nfunction domReady() {\n    return new Promise((resolve) => {\n        if (document.readyState == \"loading\") {\n            document.addEventListener(\"DOMContentLoaded\", () => resolve());\n        }\n        else {\n            resolve();\n        }\n    });\n}\n\nfunction ClassPropertiesBlessing(constructor) {\n    const classes = readInheritableStaticArrayValues(constructor, \"classes\");\n    return classes.reduce((properties, classDefinition) => {\n        return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n    }, {});\n}\nfunction propertiesForClassDefinition(key) {\n    return {\n        [`${key}Class`]: {\n            get() {\n                const { classes } = this;\n                if (classes.has(key)) {\n                    return classes.get(key);\n                }\n                else {\n                    const attribute = classes.getAttributeName(key);\n                    throw new Error(`Missing attribute \"${attribute}\"`);\n                }\n            },\n        },\n        [`${key}Classes`]: {\n            get() {\n                return this.classes.getAll(key);\n            },\n        },\n        [`has${capitalize(key)}Class`]: {\n            get() {\n                return this.classes.has(key);\n            },\n        },\n    };\n}\n\nfunction OutletPropertiesBlessing(constructor) {\n    const outlets = readInheritableStaticArrayValues(constructor, \"outlets\");\n    return outlets.reduce((properties, outletDefinition) => {\n        return Object.assign(properties, propertiesForOutletDefinition(outletDefinition));\n    }, {});\n}\nfunction getOutletController(controller, element, identifier) {\n    return controller.application.getControllerForElementAndIdentifier(element, identifier);\n}\nfunction getControllerAndEnsureConnectedScope(controller, element, outletName) {\n    let outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n    controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName);\n    outletController = getOutletController(controller, element, outletName);\n    if (outletController)\n        return outletController;\n}\nfunction propertiesForOutletDefinition(name) {\n    const camelizedName = namespaceCamelize(name);\n    return {\n        [`${camelizedName}Outlet`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                    if (outletController)\n                        return outletController;\n                    throw new Error(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`);\n                }\n                throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n            },\n        },\n        [`${camelizedName}Outlets`]: {\n            get() {\n                const outlets = this.outlets.findAll(name);\n                if (outlets.length > 0) {\n                    return outlets\n                        .map((outletElement) => {\n                        const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name);\n                        if (outletController)\n                            return outletController;\n                        console.warn(`The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`, outletElement);\n                    })\n                        .filter((controller) => controller);\n                }\n                return [];\n            },\n        },\n        [`${camelizedName}OutletElement`]: {\n            get() {\n                const outletElement = this.outlets.find(name);\n                const selector = this.outlets.getSelectorForOutletName(name);\n                if (outletElement) {\n                    return outletElement;\n                }\n                else {\n                    throw new Error(`Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`);\n                }\n            },\n        },\n        [`${camelizedName}OutletElements`]: {\n            get() {\n                return this.outlets.findAll(name);\n            },\n        },\n        [`has${capitalize(camelizedName)}Outlet`]: {\n            get() {\n                return this.outlets.has(name);\n            },\n        },\n    };\n}\n\nfunction TargetPropertiesBlessing(constructor) {\n    const targets = readInheritableStaticArrayValues(constructor, \"targets\");\n    return targets.reduce((properties, targetDefinition) => {\n        return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n    }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n    return {\n        [`${name}Target`]: {\n            get() {\n                const target = this.targets.find(name);\n                if (target) {\n                    return target;\n                }\n                else {\n                    throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`);\n                }\n            },\n        },\n        [`${name}Targets`]: {\n            get() {\n                return this.targets.findAll(name);\n            },\n        },\n        [`has${capitalize(name)}Target`]: {\n            get() {\n                return this.targets.has(name);\n            },\n        },\n    };\n}\n\nfunction ValuePropertiesBlessing(constructor) {\n    const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n    const propertyDescriptorMap = {\n        valueDescriptorMap: {\n            get() {\n                return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n                    const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier);\n                    const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key);\n                    return Object.assign(result, { [attributeName]: valueDescriptor });\n                }, {});\n            },\n        },\n    };\n    return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n        return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n    }, propertyDescriptorMap);\n}\nfunction propertiesForValueDefinitionPair(valueDefinitionPair, controller) {\n    const definition = parseValueDefinitionPair(valueDefinitionPair, controller);\n    const { key, name, reader: read, writer: write } = definition;\n    return {\n        [name]: {\n            get() {\n                const value = this.data.get(key);\n                if (value !== null) {\n                    return read(value);\n                }\n                else {\n                    return definition.defaultValue;\n                }\n            },\n            set(value) {\n                if (value === undefined) {\n                    this.data.delete(key);\n                }\n                else {\n                    this.data.set(key, write(value));\n                }\n            },\n        },\n        [`has${capitalize(name)}`]: {\n            get() {\n                return this.data.has(key) || definition.hasCustomDefaultValue;\n            },\n        },\n    };\n}\nfunction parseValueDefinitionPair([token, typeDefinition], controller) {\n    return valueDescriptorForTokenAndTypeDefinition({\n        controller,\n        token,\n        typeDefinition,\n    });\n}\nfunction parseValueTypeConstant(constant) {\n    switch (constant) {\n        case Array:\n            return \"array\";\n        case Boolean:\n            return \"boolean\";\n        case Number:\n            return \"number\";\n        case Object:\n            return \"object\";\n        case String:\n            return \"string\";\n    }\n}\nfunction parseValueTypeDefault(defaultValue) {\n    switch (typeof defaultValue) {\n        case \"boolean\":\n            return \"boolean\";\n        case \"number\":\n            return \"number\";\n        case \"string\":\n            return \"string\";\n    }\n    if (Array.isArray(defaultValue))\n        return \"array\";\n    if (Object.prototype.toString.call(defaultValue) === \"[object Object]\")\n        return \"object\";\n}\nfunction parseValueTypeObject(payload) {\n    const { controller, token, typeObject } = payload;\n    const hasType = isSomething(typeObject.type);\n    const hasDefault = isSomething(typeObject.default);\n    const fullObject = hasType && hasDefault;\n    const onlyType = hasType && !hasDefault;\n    const onlyDefault = !hasType && hasDefault;\n    const typeFromObject = parseValueTypeConstant(typeObject.type);\n    const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default);\n    if (onlyType)\n        return typeFromObject;\n    if (onlyDefault)\n        return typeFromDefaultValue;\n    if (typeFromObject !== typeFromDefaultValue) {\n        const propertyPath = controller ? `${controller}.${token}` : token;\n        throw new Error(`The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`);\n    }\n    if (fullObject)\n        return typeFromObject;\n}\nfunction parseValueTypeDefinition(payload) {\n    const { controller, token, typeDefinition } = payload;\n    const typeObject = { controller, token, typeObject: typeDefinition };\n    const typeFromObject = parseValueTypeObject(typeObject);\n    const typeFromDefaultValue = parseValueTypeDefault(typeDefinition);\n    const typeFromConstant = parseValueTypeConstant(typeDefinition);\n    const type = typeFromObject || typeFromDefaultValue || typeFromConstant;\n    if (type)\n        return type;\n    const propertyPath = controller ? `${controller}.${typeDefinition}` : token;\n    throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`);\n}\nfunction defaultValueForDefinition(typeDefinition) {\n    const constant = parseValueTypeConstant(typeDefinition);\n    if (constant)\n        return defaultValuesByType[constant];\n    const hasDefault = hasProperty(typeDefinition, \"default\");\n    const hasType = hasProperty(typeDefinition, \"type\");\n    const typeObject = typeDefinition;\n    if (hasDefault)\n        return typeObject.default;\n    if (hasType) {\n        const { type } = typeObject;\n        const constantFromType = parseValueTypeConstant(type);\n        if (constantFromType)\n            return defaultValuesByType[constantFromType];\n    }\n    return typeDefinition;\n}\nfunction valueDescriptorForTokenAndTypeDefinition(payload) {\n    const { token, typeDefinition } = payload;\n    const key = `${dasherize(token)}-value`;\n    const type = parseValueTypeDefinition(payload);\n    return {\n        type,\n        key,\n        name: camelize(key),\n        get defaultValue() {\n            return defaultValueForDefinition(typeDefinition);\n        },\n        get hasCustomDefaultValue() {\n            return parseValueTypeDefault(typeDefinition) !== undefined;\n        },\n        reader: readers[type],\n        writer: writers[type] || writers.default,\n    };\n}\nconst defaultValuesByType = {\n    get array() {\n        return [];\n    },\n    boolean: false,\n    number: 0,\n    get object() {\n        return {};\n    },\n    string: \"\",\n};\nconst readers = {\n    array(value) {\n        const array = JSON.parse(value);\n        if (!Array.isArray(array)) {\n            throw new TypeError(`expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`);\n        }\n        return array;\n    },\n    boolean(value) {\n        return !(value == \"0\" || String(value).toLowerCase() == \"false\");\n    },\n    number(value) {\n        return Number(value.replace(/_/g, \"\"));\n    },\n    object(value) {\n        const object = JSON.parse(value);\n        if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n            throw new TypeError(`expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`);\n        }\n        return object;\n    },\n    string(value) {\n        return value;\n    },\n};\nconst writers = {\n    default: writeString,\n    array: writeJSON,\n    object: writeJSON,\n};\nfunction writeJSON(value) {\n    return JSON.stringify(value);\n}\nfunction writeString(value) {\n    return `${value}`;\n}\n\nclass Controller {\n    constructor(context) {\n        this.context = context;\n    }\n    static get shouldLoad() {\n        return true;\n    }\n    static afterLoad(_identifier, _application) {\n        return;\n    }\n    get application() {\n        return this.context.application;\n    }\n    get scope() {\n        return this.context.scope;\n    }\n    get element() {\n        return this.scope.element;\n    }\n    get identifier() {\n        return this.scope.identifier;\n    }\n    get targets() {\n        return this.scope.targets;\n    }\n    get outlets() {\n        return this.scope.outlets;\n    }\n    get classes() {\n        return this.scope.classes;\n    }\n    get data() {\n        return this.scope.data;\n    }\n    initialize() {\n    }\n    connect() {\n    }\n    disconnect() {\n    }\n    dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true, } = {}) {\n        const type = prefix ? `${prefix}:${eventName}` : eventName;\n        const event = new CustomEvent(type, { detail, bubbles, cancelable });\n        target.dispatchEvent(event);\n        return event;\n    }\n}\nController.blessings = [\n    ClassPropertiesBlessing,\n    TargetPropertiesBlessing,\n    ValuePropertiesBlessing,\n    OutletPropertiesBlessing,\n];\nController.targets = [];\nController.outlets = [];\nController.values = {};\n\nexport { Application, AttributeObserver, Context, Controller, ElementObserver, IndexedMultimap, Multimap, SelectorObserver, StringMapObserver, TokenListObserver, ValueListObserver, add, defaultSchema, del, fetch, prune };\n", "import { Application } from \"@hotwired/stimulus\"\n\nconst application = Application.start()\n\n// Configure Stimulus development experience\napplication.warnings = true\napplication.debug    = false\nwindow.Stimulus      = application\n\nexport { application }\n", "export async function enter(element, transitionName = null) {\n    element.classList.remove('hidden')\n    await transition('enter', element, transitionName)\n}\n\nexport async function leave(element, transitionName = null) {\n    await transition('leave', element, transitionName)\n    element.classList.add('hidden')\n}\n\nexport async function toggle(element, transitionName = null) {\n    if (element.classList.contains('hidden')) {\n        await enter(element, transitionName)\n    } else {\n        await leave(element, transitionName)\n    }\n}\n\nasync function transition(direction, element, animation) {\n    const dataset = element.dataset\n    const animationClass = animation ? `${animation}-${direction}` : direction\n    let transition = `transition${direction.charAt(0).toUpperCase() + direction.slice(1)}`\n    const genesis = dataset[transition] ? dataset[transition].split(\" \") : [animationClass]\n    const start = dataset[`${transition}Start`] ? dataset[`${transition}Start`].split(\" \") : [`${animationClass}-start`]\n    const end = dataset[`${transition}End`] ? dataset[`${transition}End`].split(\" \") : [`${animationClass}-end`]\n\n    addClasses(element, genesis)\n    addClasses(element, start)\n    await nextFrame()\n    removeClasses(element, start)\n    addClasses(element, end);\n    await afterTransition(element)\n    removeClasses(element, end)\n    removeClasses(element, genesis)\n}\n\nfunction addClasses(element, classes) {\n    element.classList.add(...classes)\n}\n\nfunction removeClasses(element, classes) {\n    element.classList.remove(...classes)\n}\n\nfunction nextFrame() {\n    return new Promise(resolve => {\n        requestAnimationFrame(() => {\n            requestAnimationFrame(resolve)\n        });\n    });\n}\n\nfunction afterTransition(element) {\n    return new Promise(resolve => {\n        // safari return string with comma separate values\n        const computedDuration = getComputedStyle(element).transitionDuration.split(\",\")[0]\n        const duration = Number(computedDuration.replace('s', '')) * 1000;\n        setTimeout(() => {\n            resolve()\n        }, duration)\n    });\n}", "import { Controller } from \"@hotwired/stimulus\"\nimport { enter, leave } from \"el-transition\"\n\nexport default class AlertController extends Controller {\n  static targets = [\"alert\", \"toggle\"]\n  static actions = [\"hide\"]\n  static classes = [\"hide\"]\n  static values = { autohide: Boolean }\n\n  alertTarget: HTMLElement\n\n  connect() {\n    setTimeout(() => {\n      this.show();\n      setTimeout(() => {\n        this.hide();\n      }, 3000)\n    }, 500)\n  }\n\n  show() {\n    enter(this.alertTarget);\n  }\n\n  hide() {\n    leave(this.alertTarget);\n  }\n}", "/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n  return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n  return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n  return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n  return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n  return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n  return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n  var len = str.length;\n  var ret;\n  if (str[0] === '#') {\n    if (len === 4 || len === 5) {\n      ret = {\n        r: 255 & map$1[str[1]] * 17,\n        g: 255 & map$1[str[2]] * 17,\n        b: 255 & map$1[str[3]] * 17,\n        a: len === 5 ? map$1[str[4]] * 17 : 255\n      };\n    } else if (len === 7 || len === 9) {\n      ret = {\n        r: map$1[str[1]] << 4 | map$1[str[2]],\n        g: map$1[str[3]] << 4 | map$1[str[4]],\n        b: map$1[str[5]] << 4 | map$1[str[6]],\n        a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n      };\n    }\n  }\n  return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n  var f = isShort(v) ? h1 : h2;\n  return v\n    ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n    : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n  const a = s * Math.min(l, 1 - l);\n  const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n  return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n  const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n  return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n  const rgb = hsl2rgbn(h, 1, 0.5);\n  let i;\n  if (w + b > 1) {\n    i = 1 / (w + b);\n    w *= i;\n    b *= i;\n  }\n  for (i = 0; i < 3; i++) {\n    rgb[i] *= 1 - w - b;\n    rgb[i] += w;\n  }\n  return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n  if (r === max) {\n    return ((g - b) / d) + (g < b ? 6 : 0);\n  }\n  if (g === max) {\n    return (b - r) / d + 2;\n  }\n  return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n  const range = 255;\n  const r = v.r / range;\n  const g = v.g / range;\n  const b = v.b / range;\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n  let h, s, d;\n  if (max !== min) {\n    d = max - min;\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n    h = hueValue(r, g, b, d, max);\n    h = h * 60 + 0.5;\n  }\n  return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n  return (\n    Array.isArray(a)\n      ? f(a[0], a[1], a[2])\n      : f(a, b, c)\n  ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n  return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n  return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n  return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n  return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n  const m = HUE_RE.exec(str);\n  let a = 255;\n  let v;\n  if (!m) {\n    return;\n  }\n  if (m[5] !== v) {\n    a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n  }\n  const h = hue(+m[2]);\n  const p1 = +m[3] / 100;\n  const p2 = +m[4] / 100;\n  if (m[1] === 'hwb') {\n    v = hwb2rgb(h, p1, p2);\n  } else if (m[1] === 'hsv') {\n    v = hsv2rgb(h, p1, p2);\n  } else {\n    v = hsl2rgb(h, p1, p2);\n  }\n  return {\n    r: v[0],\n    g: v[1],\n    b: v[2],\n    a: a\n  };\n}\nfunction rotate(v, deg) {\n  var h = rgb2hsl(v);\n  h[0] = hue(h[0] + deg);\n  h = hsl2rgb(h);\n  v.r = h[0];\n  v.g = h[1];\n  v.b = h[2];\n}\nfunction hslString(v) {\n  if (!v) {\n    return;\n  }\n  const a = rgb2hsl(v);\n  const h = a[0];\n  const s = n2p(a[1]);\n  const l = n2p(a[2]);\n  return v.a < 255\n    ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n    : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n  const unpacked = {};\n  const keys = Object.keys(names$1);\n  const tkeys = Object.keys(map);\n  let i, j, k, ok, nk;\n  for (i = 0; i < keys.length; i++) {\n    ok = nk = keys[i];\n    for (j = 0; j < tkeys.length; j++) {\n      k = tkeys[j];\n      nk = nk.replace(k, map[k]);\n    }\n    k = parseInt(names$1[ok], 16);\n    unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n  }\n  return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n  if (!names) {\n    names = unpack();\n    names.transparent = [0, 0, 0, 0];\n  }\n  const a = names[str.toLowerCase()];\n  return a && {\n    r: a[0],\n    g: a[1],\n    b: a[2],\n    a: a.length === 4 ? a[3] : 255\n  };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n  const m = RGB_RE.exec(str);\n  let a = 255;\n  let r, g, b;\n  if (!m) {\n    return;\n  }\n  if (m[7] !== r) {\n    const v = +m[7];\n    a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n  }\n  r = +m[1];\n  g = +m[3];\n  b = +m[5];\n  r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n  g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n  b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n  return {\n    r: r,\n    g: g,\n    b: b,\n    a: a\n  };\n}\nfunction rgbString(v) {\n  return v && (\n    v.a < 255\n      ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n      : `rgb(${v.r}, ${v.g}, ${v.b})`\n  );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n  const r = from(b2n(rgb1.r));\n  const g = from(b2n(rgb1.g));\n  const b = from(b2n(rgb1.b));\n  return {\n    r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n    g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n    b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n    a: rgb1.a + t * (rgb2.a - rgb1.a)\n  };\n}\n\nfunction modHSL(v, i, ratio) {\n  if (v) {\n    let tmp = rgb2hsl(v);\n    tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n    tmp = hsl2rgb(tmp);\n    v.r = tmp[0];\n    v.g = tmp[1];\n    v.b = tmp[2];\n  }\n}\nfunction clone(v, proto) {\n  return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n  var v = {r: 0, g: 0, b: 0, a: 255};\n  if (Array.isArray(input)) {\n    if (input.length >= 3) {\n      v = {r: input[0], g: input[1], b: input[2], a: 255};\n      if (input.length > 3) {\n        v.a = n2b(input[3]);\n      }\n    }\n  } else {\n    v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n    v.a = n2b(v.a);\n  }\n  return v;\n}\nfunction functionParse(str) {\n  if (str.charAt(0) === 'r') {\n    return rgbParse(str);\n  }\n  return hueParse(str);\n}\nclass Color {\n  constructor(input) {\n    if (input instanceof Color) {\n      return input;\n    }\n    const type = typeof input;\n    let v;\n    if (type === 'object') {\n      v = fromObject(input);\n    } else if (type === 'string') {\n      v = hexParse(input) || nameParse(input) || functionParse(input);\n    }\n    this._rgb = v;\n    this._valid = !!v;\n  }\n  get valid() {\n    return this._valid;\n  }\n  get rgb() {\n    var v = clone(this._rgb);\n    if (v) {\n      v.a = b2n(v.a);\n    }\n    return v;\n  }\n  set rgb(obj) {\n    this._rgb = fromObject(obj);\n  }\n  rgbString() {\n    return this._valid ? rgbString(this._rgb) : undefined;\n  }\n  hexString() {\n    return this._valid ? hexString(this._rgb) : undefined;\n  }\n  hslString() {\n    return this._valid ? hslString(this._rgb) : undefined;\n  }\n  mix(color, weight) {\n    if (color) {\n      const c1 = this.rgb;\n      const c2 = color.rgb;\n      let w2;\n      const p = weight === w2 ? 0.5 : weight;\n      const w = 2 * p - 1;\n      const a = c1.a - c2.a;\n      const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n      w2 = 1 - w1;\n      c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n      c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n      c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n      c1.a = p * c1.a + (1 - p) * c2.a;\n      this.rgb = c1;\n    }\n    return this;\n  }\n  interpolate(color, t) {\n    if (color) {\n      this._rgb = interpolate(this._rgb, color._rgb, t);\n    }\n    return this;\n  }\n  clone() {\n    return new Color(this.rgb);\n  }\n  alpha(a) {\n    this._rgb.a = n2b(a);\n    return this;\n  }\n  clearer(ratio) {\n    const rgb = this._rgb;\n    rgb.a *= 1 - ratio;\n    return this;\n  }\n  greyscale() {\n    const rgb = this._rgb;\n    const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n    rgb.r = rgb.g = rgb.b = val;\n    return this;\n  }\n  opaquer(ratio) {\n    const rgb = this._rgb;\n    rgb.a *= 1 + ratio;\n    return this;\n  }\n  negate() {\n    const v = this._rgb;\n    v.r = 255 - v.r;\n    v.g = 255 - v.g;\n    v.b = 255 - v.b;\n    return this;\n  }\n  lighten(ratio) {\n    modHSL(this._rgb, 2, ratio);\n    return this;\n  }\n  darken(ratio) {\n    modHSL(this._rgb, 2, -ratio);\n    return this;\n  }\n  saturate(ratio) {\n    modHSL(this._rgb, 1, ratio);\n    return this;\n  }\n  desaturate(ratio) {\n    modHSL(this._rgb, 1, -ratio);\n    return this;\n  }\n  rotate(deg) {\n    rotate(this._rgb, deg);\n    return this;\n  }\n}\n\nfunction index_esm(input) {\n  return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n", "/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n  /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n  let id = 0;\n  return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n  return value === null || value === undefined;\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray<T = unknown>(value: unknown): value is T[] {\n  if (Array.isArray && Array.isArray(value)) {\n    return true;\n  }\n  const type = Object.prototype.toString.call(value);\n  if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n  return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value  - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n  return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n  isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n  return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault<T>(value: T | undefined, defaultValue: T) {\n  return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n  typeof value === 'string' && value.endsWith('%') ?\n    parseFloat(value) / 100\n    : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n  typeof value === 'string' && value.endsWith('%') ?\n    parseFloat(value) / 100 * dimension\n    : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback<T extends (this: TA, ...restArgs: unknown[]) => R, TA, R>(\n  fn: T | undefined,\n  args: unknown[],\n  thisArg?: TA\n): R | undefined {\n  if (fn && typeof fn.call === 'function') {\n    return fn.apply(thisArg, args);\n  }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each<T, TA>(\n  loopable: Record<string, T>,\n  fn: (this: TA, v: T, i: string) => void,\n  thisArg?: TA,\n  reverse?: boolean\n): void;\nexport function each<T, TA>(\n  loopable: T[],\n  fn: (this: TA, v: T, i: number) => void,\n  thisArg?: TA,\n  reverse?: boolean\n): void;\nexport function each<T, TA>(\n  loopable: T[] | Record<string, T>,\n  fn: (this: TA, v: T, i: any) => void,\n  thisArg?: TA,\n  reverse?: boolean\n) {\n  let i: number, len: number, keys: string[];\n  if (isArray(loopable)) {\n    len = loopable.length;\n    if (reverse) {\n      for (i = len - 1; i >= 0; i--) {\n        fn.call(thisArg, loopable[i], i);\n      }\n    } else {\n      for (i = 0; i < len; i++) {\n        fn.call(thisArg, loopable[i], i);\n      }\n    }\n  } else if (isObject(loopable)) {\n    keys = Object.keys(loopable);\n    len = keys.length;\n    for (i = 0; i < len; i++) {\n      fn.call(thisArg, loopable[keys[i]], keys[i]);\n    }\n  }\n}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n  let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n  if (!a0 || !a1 || a0.length !== a1.length) {\n    return false;\n  }\n\n  for (i = 0, ilen = a0.length; i < ilen; ++i) {\n    v0 = a0[i];\n    v1 = a1[i];\n\n    if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone<T>(source: T): T {\n  if (isArray(source)) {\n    return source.map(clone) as unknown as T;\n  }\n\n  if (isObject(source)) {\n    const target = Object.create(null);\n    const keys = Object.keys(source);\n    const klen = keys.length;\n    let k = 0;\n\n    for (; k < klen; ++k) {\n      target[keys[k]] = clone(source[keys[k]]);\n    }\n\n    return target;\n  }\n\n  return source;\n}\n\nfunction isValidKey(key: string) {\n  return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n  if (!isValidKey(key)) {\n    return;\n  }\n\n  const tval = target[key];\n  const sval = source[key];\n\n  if (isObject(tval) && isObject(sval)) {\n    // eslint-disable-next-line @typescript-eslint/no-use-before-define\n    merge(tval, sval, options);\n  } else {\n    target[key] = clone(sval);\n  }\n}\n\nexport interface MergeOptions {\n  merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge<T>(target: T, source: [], options?: MergeOptions): T;\nexport function merge<T, S1>(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge<T, S1>(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge<T, S1, S2>(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge<T, S1, S2, S3>(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge<T, S1, S2, S3, S4>(\n  target: T,\n  source: [S1, S2, S3, S4],\n  options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge<T>(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge<T>(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n  const sources = isArray(source) ? source : [source];\n  const ilen = sources.length;\n\n  if (!isObject(target)) {\n    return target as AnyObject;\n  }\n\n  options = options || {};\n  const merger = options.merger || _merger;\n  let current: AnyObject;\n\n  for (let i = 0; i < ilen; ++i) {\n    current = sources[i];\n    if (!isObject(current)) {\n      continue;\n    }\n\n    const keys = Object.keys(current);\n    for (let k = 0, klen = keys.length; k < klen; ++k) {\n      merger(keys[k], target, current, options as AnyObject);\n    }\n  }\n\n  return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf<T>(target: T, source: []): T;\nexport function mergeIf<T, S1>(target: T, source: S1): T & S1;\nexport function mergeIf<T, S1>(target: T, source: [S1]): T & S1;\nexport function mergeIf<T, S1, S2>(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf<T, S1, S2, S3>(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf<T, S1, S2, S3, S4>(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf<T>(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf<T>(target: T, source: AnyObject[]): AnyObject {\n  // eslint-disable-next-line @typescript-eslint/no-use-before-define\n  return merge<T>(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n  if (!isValidKey(key)) {\n    return;\n  }\n\n  const tval = target[key];\n  const sval = source[key];\n\n  if (isObject(tval) && isObject(sval)) {\n    mergeIf(tval, sval);\n  } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n    target[key] = clone(sval);\n  }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n  if (value !== undefined) {\n    console.warn(scope + ': \"' + previous +\n      '\" is deprecated. Please use \"' + current + '\" instead');\n  }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n  // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n  '': v => v,\n  // default resolvers\n  x: o => o.x,\n  y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n  const parts = key.split('.');\n  const keys: string[] = [];\n  let tmp = '';\n  for (const part of parts) {\n    tmp += part;\n    if (tmp.endsWith('\\\\')) {\n      tmp = tmp.slice(0, -1) + '.';\n    } else {\n      keys.push(tmp);\n      tmp = '';\n    }\n  }\n  return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n  const keys = _splitKey(key);\n  return obj => {\n    for (const k of keys) {\n      if (k === '') {\n        // For backward compatibility:\n        // Chart.helpers.core resolveObjectKey should break at empty key\n        break;\n      }\n      obj = obj && obj[k];\n    }\n    return obj;\n  };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n  const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n  return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = <T>(a: Set<T>, b: Set<T>) => {\n  if (a.size !== b.size) {\n    return false;\n  }\n\n  for (const item of a) {\n    if (!b.has(item)) {\n      return false;\n    }\n  }\n\n  return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n  return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n", "import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n  return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\n  const roundedRange = Math.round(range);\n  range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n  const niceRange = Math.pow(10, Math.floor(log10(range)));\n  const fraction = range / niceRange;\n  const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n  return niceFraction * niceRange;\n}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n  const result: number[] = [];\n  const sqrt = Math.sqrt(value);\n  let i: number;\n\n  for (i = 1; i < sqrt; i++) {\n    if (value % i === 0) {\n      result.push(i);\n      result.push(value / i);\n    }\n  }\n  if (sqrt === (sqrt | 0)) { // if value is a square number\n    result.push(sqrt);\n  }\n\n  result.sort((a, b) => a - b).pop();\n  return result;\n}\n\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */\nfunction isNonPrimitive(n: unknown) {\n  return typeof n === 'symbol' || (typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n));\n}\n\nexport function isNumber(n: unknown): n is number {\n  return !isNonPrimitive(n) && !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n  const rounded = Math.round(x);\n  return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n  array: Record<string, number>[],\n  target: { min: number, max: number },\n  property: string\n) {\n  let i: number, ilen: number, value: number;\n\n  for (i = 0, ilen = array.length; i < ilen; i++) {\n    value = array[i][property];\n    if (!isNaN(value)) {\n      target.min = Math.min(target.min, value);\n      target.max = Math.max(target.max, value);\n    }\n  }\n}\n\nexport function toRadians(degrees: number) {\n  return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n  return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n  if (!isFiniteNumber(x)) {\n    return;\n  }\n  let e = 1;\n  let p = 0;\n  while (Math.round(x * e) / e !== x) {\n    e *= 10;\n    p++;\n  }\n  return p;\n}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n  centrePoint: Point,\n  anglePoint: Point\n) {\n  const distanceFromXCenter = anglePoint.x - centrePoint.x;\n  const distanceFromYCenter = anglePoint.y - centrePoint.y;\n  const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n  let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n  if (angle < (-0.5 * PI)) {\n    angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n  }\n\n  return {\n    angle,\n    distance: radialDistanceFromCenter\n  };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n  return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n  return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n  return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\n  const a = _normalizeAngle(angle);\n  const s = _normalizeAngle(start);\n  const e = _normalizeAngle(end);\n  const angleToStart = _normalizeAngle(s - a);\n  const angleToEnd = _normalizeAngle(e - a);\n  const startToAngle = _normalizeAngle(a - s);\n  const endToAngle = _normalizeAngle(a - e);\n  return a === s || a === e || (sameAngleIsFullCircle && s === e)\n    || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n  return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n  return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n  return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n", "import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n  table: number[],\n  value: number,\n  cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup<T>(\n  table: T[],\n  value: number,\n  cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n  table: unknown[],\n  value: number,\n  cmp?: (value: number) => boolean\n) {\n  cmp = cmp || ((index) => table[index] < value);\n  let hi = table.length - 1;\n  let lo = 0;\n  let mid: number;\n\n  while (hi - lo > 1) {\n    mid = (lo + hi) >> 1;\n    if (cmp(mid)) {\n      lo = mid;\n    } else {\n      hi = mid;\n    }\n  }\n\n  return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n  table: Record<string, number>[],\n  key: string,\n  value: number,\n  last?: boolean\n) =>\n  _lookup(table, value, last\n    ? index => {\n      const ti = table[index][key];\n      return ti < value || ti === value && table[index + 1][key] === value;\n    }\n    : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n  table: Record<string, number>[],\n  key: string,\n  value: number\n) =>\n  _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n  let start = 0;\n  let end = values.length;\n\n  while (start < end && values[start] < min) {\n    start++;\n  }\n  while (end > start && values[end - 1] > max) {\n    end--;\n  }\n\n  return start > 0 || end < values.length\n    ? values.slice(start, end)\n    : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener<T> {\n  _onDataPush?(...item: T[]): void;\n  _onDataPop?(): void;\n  _onDataShift?(): void;\n  _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n  _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents<T>(array: T[], listener: ArrayListener<T>): void;\nexport function listenArrayEvents(array, listener) {\n  if (array._chartjs) {\n    array._chartjs.listeners.push(listener);\n    return;\n  }\n\n  Object.defineProperty(array, '_chartjs', {\n    configurable: true,\n    enumerable: false,\n    value: {\n      listeners: [listener]\n    }\n  });\n\n  arrayEvents.forEach((key) => {\n    const method = '_onData' + _capitalize(key);\n    const base = array[key];\n\n    Object.defineProperty(array, key, {\n      configurable: true,\n      enumerable: false,\n      value(...args) {\n        const res = base.apply(this, args);\n\n        array._chartjs.listeners.forEach((object) => {\n          if (typeof object[method] === 'function') {\n            object[method](...args);\n          }\n        });\n\n        return res;\n      }\n    });\n  });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents<T>(array: T[], listener: ArrayListener<T>): void;\nexport function unlistenArrayEvents(array, listener) {\n  const stub = array._chartjs;\n  if (!stub) {\n    return;\n  }\n\n  const listeners = stub.listeners;\n  const index = listeners.indexOf(listener);\n  if (index !== -1) {\n    listeners.splice(index, 1);\n  }\n\n  if (listeners.length > 0) {\n    return;\n  }\n\n  arrayEvents.forEach((key) => {\n    delete array[key];\n  });\n\n  delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique<T>(items: T[]) {\n  const set = new Set<T>(items);\n\n  if (set.size === items.length) {\n    return items;\n  }\n\n  return Array.from(set);\n}\n", "import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\nimport {isNullOrUndef} from './helpers.core.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n  return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n  if (typeof window === 'undefined') {\n    return function(callback) {\n      return callback();\n    };\n  }\n  return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled<TArgs extends Array<any>>(\n  fn: (...args: TArgs) => void,\n  thisArg: any,\n) {\n  let argsToUse = [] as TArgs;\n  let ticking = false;\n\n  return function(...args: TArgs) {\n    // Save the args for use later\n    argsToUse = args;\n    if (!ticking) {\n      ticking = true;\n      requestAnimFrame.call(window, () => {\n        ticking = false;\n        fn.apply(thisArg, argsToUse);\n      });\n    }\n  };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce<TArgs extends Array<any>>(fn: (...args: TArgs) => void, delay: number) {\n  let timeout;\n  return function(...args: TArgs) {\n    if (delay) {\n      clearTimeout(timeout);\n      timeout = setTimeout(fn, delay, args);\n    } else {\n      fn.apply(this, args);\n    }\n    return delay;\n  };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n  const check = rtl ? 'left' : 'right';\n  return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n  const pointCount = points.length;\n\n  let start = 0;\n  let count = pointCount;\n\n  if (meta._sorted) {\n    const {iScale, vScale, _parsed} = meta;\n    const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n    const axis = iScale.axis;\n    const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n    if (minDefined) {\n      start = Math.min(\n        // @ts-expect-error Need to type _parsed\n        _lookupByKey(_parsed, axis, min).lo,\n        // @ts-expect-error Need to fix types on _lookupByKey\n        animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n      if (spanGaps) {\n        const distanceToDefinedLo = (_parsed\n          .slice(0, start + 1)\n          .reverse()\n          .findIndex(\n            point => !isNullOrUndef(point[vScale.axis])));\n        start -= Math.max(0, distanceToDefinedLo);\n      }\n      start = _limitValue(start, 0, pointCount - 1);\n    }\n    if (maxDefined) {\n      let end = Math.max(\n        // @ts-expect-error Need to type _parsed\n        _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n        // @ts-expect-error Need to fix types on _lookupByKey\n        animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n      if (spanGaps) {\n        const distanceToDefinedHi = (_parsed\n          .slice(end - 1)\n          .findIndex(\n            point => !isNullOrUndef(point[vScale.axis])));\n        end += Math.max(0, distanceToDefinedHi);\n      }\n      count = _limitValue(end, start, pointCount) - start;\n    } else {\n      count = pointCount - start;\n    }\n  }\n\n  return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _scaleRangesChanged(meta) {\n  const {xScale, yScale, _scaleRanges} = meta;\n  const newRanges = {\n    xmin: xScale.min,\n    xmax: xScale.max,\n    ymin: yScale.min,\n    ymax: yScale.max\n  };\n  if (!_scaleRanges) {\n    meta._scaleRanges = newRanges;\n    return true;\n  }\n  const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n\n  Object.assign(_scaleRanges, newRanges);\n  return changed;\n}\n", "import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n  linear: (t: number) => t,\n\n  easeInQuad: (t: number) => t * t,\n\n  easeOutQuad: (t: number) => -t * (t - 2),\n\n  easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n    ? 0.5 * t * t\n    : -0.5 * ((--t) * (t - 2) - 1),\n\n  easeInCubic: (t: number) => t * t * t,\n\n  easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n  easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t\n    : 0.5 * ((t -= 2) * t * t + 2),\n\n  easeInQuart: (t: number) => t * t * t * t,\n\n  easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n  easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t * t\n    : -0.5 * ((t -= 2) * t * t * t - 2),\n\n  easeInQuint: (t: number) => t * t * t * t * t,\n\n  easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n  easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t * t * t\n    : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n  easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n  easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n  easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n  easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n  easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n  easeInOutExpo: (t: number) => atEdge(t) ? t : t < 0.5\n    ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n    : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n\n  easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n  easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n  easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n    ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n    : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n  easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n  easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n  easeInOutElastic(t: number) {\n    const s = 0.1125;\n    const p = 0.45;\n    return atEdge(t) ? t :\n      t < 0.5\n        ? 0.5 * elasticIn(t * 2, s, p)\n        : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n  },\n\n  easeInBack(t: number) {\n    const s = 1.70158;\n    return t * t * ((s + 1) * t - s);\n  },\n\n  easeOutBack(t: number) {\n    const s = 1.70158;\n    return (t -= 1) * t * ((s + 1) * t + s) + 1;\n  },\n\n  easeInOutBack(t: number) {\n    let s = 1.70158;\n    if ((t /= 0.5) < 1) {\n      return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n    }\n    return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n  },\n\n  easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n  easeOutBounce(t: number) {\n    const m = 7.5625;\n    const d = 2.75;\n    if (t < (1 / d)) {\n      return m * t * t;\n    }\n    if (t < (2 / d)) {\n      return m * (t -= (1.5 / d)) * t + 0.75;\n    }\n    if (t < (2.5 / d)) {\n      return m * (t -= (2.25 / d)) * t + 0.9375;\n    }\n    return m * (t -= (2.625 / d)) * t + 0.984375;\n  },\n\n  easeInOutBounce: (t: number) => (t < 0.5)\n    ? effects.easeInBounce(t * 2) * 0.5\n    : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n", "import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n  if (value && typeof value === 'object') {\n    const type = value.toString();\n    return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n  }\n\n  return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n  value:\n  | string\n  | { r: number; g: number; b: number; a: number }\n  | [number, number, number]\n  | [number, number, number, number]\n): Color;\nexport function color(value) {\n  return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n  return isPatternOrGradient(value)\n    ? value\n    : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n", "const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n  defaults.set('animation', {\n    delay: undefined,\n    duration: 1000,\n    easing: 'easeOutQuart',\n    fn: undefined,\n    from: undefined,\n    loop: undefined,\n    to: undefined,\n    type: undefined,\n  });\n\n  defaults.describe('animation', {\n    _fallback: false,\n    _indexable: false,\n    _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n  });\n\n  defaults.set('animations', {\n    colors: {\n      type: 'color',\n      properties: colors\n    },\n    numbers: {\n      type: 'number',\n      properties: numbers\n    },\n  });\n\n  defaults.describe('animations', {\n    _fallback: 'animation',\n  });\n\n  defaults.set('transitions', {\n    active: {\n      animation: {\n        duration: 400\n      }\n    },\n    resize: {\n      animation: {\n        duration: 0\n      }\n    },\n    show: {\n      animations: {\n        colors: {\n          from: 'transparent'\n        },\n        visible: {\n          type: 'boolean',\n          duration: 0 // show immediately\n        },\n      }\n    },\n    hide: {\n      animations: {\n        colors: {\n          to: 'transparent'\n        },\n        visible: {\n          type: 'boolean',\n          easing: 'linear',\n          fn: v => v | 0 // for keeping the dataset visible all the way through the animation\n        },\n      }\n    }\n  });\n}\n", "export function applyLayoutsDefaults(defaults) {\n  defaults.set('layout', {\n    autoPadding: true,\n    padding: {\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0\n    }\n  });\n}\n", "\nconst intlCache = new Map<string, Intl.NumberFormat>();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\n  options = options || {};\n  const cacheKey = locale + JSON.stringify(options);\n  let formatter = intlCache.get(cacheKey);\n  if (!formatter) {\n    formatter = new Intl.NumberFormat(locale, options);\n    intlCache.set(cacheKey, formatter);\n  }\n  return formatter;\n}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n  return getNumberFormat(locale, options).format(num);\n}\n", "import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n  /**\n   * Formatter for value labels\n   * @method Chart.Ticks.formatters.values\n   * @param value the value to display\n   * @return {string|string[]} the label to display\n   */\n  values(value) {\n    return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n  },\n\n  /**\n   * Formatter for numeric ticks\n   * @method Chart.Ticks.formatters.numeric\n   * @param tickValue {number} the value to be formatted\n   * @param index {number} the position of the tickValue parameter in the ticks array\n   * @param ticks {object[]} the list of ticks being converted\n   * @return {string} string representation of the tickValue parameter\n   */\n  numeric(tickValue, index, ticks) {\n    if (tickValue === 0) {\n      return '0'; // never show decimal places for 0\n    }\n\n    const locale = this.chart.options.locale;\n    let notation;\n    let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n    if (ticks.length > 1) {\n      // all ticks are small or there huge numbers; use scientific notation\n      const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n      if (maxTick < 1e-4 || maxTick > 1e+15) {\n        notation = 'scientific';\n      }\n\n      delta = calculateDelta(tickValue, ticks);\n    }\n\n    const logDelta = log10(Math.abs(delta));\n\n    // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n    // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n    // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n    //\n    // toFixed has a max of 20 decimal places\n    const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n    const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n    Object.assign(options, this.options.ticks.format);\n\n    return formatNumber(tickValue, locale, options);\n  },\n\n\n  /**\n   * Formatter for logarithmic ticks\n   * @method Chart.Ticks.formatters.logarithmic\n   * @param tickValue {number} the value to be formatted\n   * @param index {number} the position of the tickValue parameter in the ticks array\n   * @param ticks {object[]} the list of ticks being converted\n   * @return {string} string representation of the tickValue parameter\n   */\n  logarithmic(tickValue, index, ticks) {\n    if (tickValue === 0) {\n      return '0';\n    }\n    const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n    if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n      return formatters.numeric.call(this, tickValue, index, ticks);\n    }\n    return '';\n  }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n  // Figure out how many digits to show\n  // The space between the first two ticks might be smaller than normal spacing\n  let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n  // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n  if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n    // not an integer\n    delta = tickValue - Math.floor(tickValue);\n  }\n  return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n", "import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n  defaults.set('scale', {\n    display: true,\n    offset: false,\n    reverse: false,\n    beginAtZero: false,\n\n    /**\n     * Scale boundary strategy (bypassed by min/max time options)\n     * - `data`: make sure data are fully visible, ticks outside are removed\n     * - `ticks`: make sure ticks are fully visible, data outside are truncated\n     * @see https://github.com/chartjs/Chart.js/pull/4556\n     * @since 3.0.0\n     */\n    bounds: 'ticks',\n\n    clip: true,\n\n    /**\n     * Addition grace added to max and reduced from min data value.\n     * @since 3.0.0\n     */\n    grace: 0,\n\n    // grid line settings\n    grid: {\n      display: true,\n      lineWidth: 1,\n      drawOnChartArea: true,\n      drawTicks: true,\n      tickLength: 8,\n      tickWidth: (_ctx, options) => options.lineWidth,\n      tickColor: (_ctx, options) => options.color,\n      offset: false,\n    },\n\n    border: {\n      display: true,\n      dash: [],\n      dashOffset: 0.0,\n      width: 1\n    },\n\n    // scale title\n    title: {\n      // display property\n      display: false,\n\n      // actual label\n      text: '',\n\n      // top/bottom padding\n      padding: {\n        top: 4,\n        bottom: 4\n      }\n    },\n\n    // label settings\n    ticks: {\n      minRotation: 0,\n      maxRotation: 50,\n      mirror: false,\n      textStrokeWidth: 0,\n      textStrokeColor: '',\n      padding: 3,\n      display: true,\n      autoSkip: true,\n      autoSkipPadding: 3,\n      labelOffset: 0,\n      // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n      callback: Ticks.formatters.values,\n      minor: {},\n      major: {},\n      align: 'center',\n      crossAlign: 'near',\n\n      showLabelBackdrop: false,\n      backdropColor: 'rgba(255, 255, 255, 0.75)',\n      backdropPadding: 2,\n    }\n  });\n\n  defaults.route('scale.ticks', 'color', '', 'color');\n  defaults.route('scale.grid', 'color', '', 'borderColor');\n  defaults.route('scale.border', 'color', '', 'borderColor');\n  defaults.route('scale.title', 'color', '', 'color');\n\n  defaults.describe('scale', {\n    _fallback: false,\n    _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n    _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash',\n  });\n\n  defaults.describe('scales', {\n    _fallback: 'scale',\n  });\n\n  defaults.describe('scale.ticks', {\n    _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n    _indexable: (name) => name !== 'backdropPadding',\n  });\n}\n", "import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(node, key) {\n  if (!key) {\n    return node;\n  }\n  const keys = key.split('.');\n  for (let i = 0, n = keys.length; i < n; ++i) {\n    const k = keys[i];\n    node = node[k] || (node[k] = Object.create(null));\n  }\n  return node;\n}\n\nfunction set(root, scope, values) {\n  if (typeof scope === 'string') {\n    return merge(getScope(root, scope), values);\n  }\n  return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n  constructor(_descriptors, _appliers) {\n    this.animation = undefined;\n    this.backgroundColor = 'rgba(0,0,0,0.1)';\n    this.borderColor = 'rgba(0,0,0,0.1)';\n    this.color = '#666';\n    this.datasets = {};\n    this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n    this.elements = {};\n    this.events = [\n      'mousemove',\n      'mouseout',\n      'click',\n      'touchstart',\n      'touchmove'\n    ];\n    this.font = {\n      family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n      size: 12,\n      style: 'normal',\n      lineHeight: 1.2,\n      weight: null\n    };\n    this.hover = {};\n    this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n    this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n    this.hoverColor = (ctx, options) => getHoverColor(options.color);\n    this.indexAxis = 'x';\n    this.interaction = {\n      mode: 'nearest',\n      intersect: true,\n      includeInvisible: false\n    };\n    this.maintainAspectRatio = true;\n    this.onHover = null;\n    this.onClick = null;\n    this.parsing = true;\n    this.plugins = {};\n    this.responsive = true;\n    this.scale = undefined;\n    this.scales = {};\n    this.showLine = true;\n    this.drawActiveElementsOnTop = true;\n\n    this.describe(_descriptors);\n    this.apply(_appliers);\n  }\n\n  /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n  set(scope, values) {\n    return set(this, scope, values);\n  }\n\n  /**\n\t * @param {string} scope\n\t */\n  get(scope) {\n    return getScope(this, scope);\n  }\n\n  /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n  describe(scope, values) {\n    return set(descriptors, scope, values);\n  }\n\n  override(scope, values) {\n    return set(overrides, scope, values);\n  }\n\n  /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t *   - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n  route(scope, name, targetScope, targetName) {\n    const scopeObject = getScope(this, scope);\n    const targetScopeObject = getScope(this, targetScope);\n    const privateName = '_' + name;\n\n    Object.defineProperties(scopeObject, {\n      // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n      [privateName]: {\n        value: scopeObject[name],\n        writable: true\n      },\n      // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\n      [name]: {\n        enumerable: true,\n        get() {\n          const local = this[privateName];\n          const target = targetScopeObject[targetName];\n          if (isObject(local)) {\n            return Object.assign({}, target, local);\n          }\n          return valueOrDefault(local, target);\n        },\n        set(value) {\n          this[privateName] = value;\n        }\n      }\n    });\n  }\n\n  apply(appliers) {\n    appliers.forEach((apply) => apply(this));\n  }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Defaults({\n  _scriptable: (name) => !name.startsWith('on'),\n  _indexable: (name) => name !== 'events',\n  hover: {\n    _fallback: 'interaction'\n  },\n  interaction: {\n    _scriptable: false,\n    _indexable: false,\n  }\n}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n", "import type {\n  Chart,\n  Point,\n  FontSpec,\n  CanvasFontSpec,\n  PointStyle,\n  RenderTextOpts,\n  BackdropOptions\n} from '../types/index.js';\nimport type {\n  TRBL,\n  SplinePoint,\n  RoundedRect,\n  TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n  if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n    return null;\n  }\n\n  return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\n\n/**\n * @private\n */\nexport function _measureText(\n  ctx: CanvasRenderingContext2D,\n  data: Record<string, number>,\n  gc: string[],\n  longest: number,\n  string: string\n) {\n  let textWidth = data[string];\n  if (!textWidth) {\n    textWidth = data[string] = ctx.measureText(string).width;\n    gc.push(string);\n  }\n  if (textWidth > longest) {\n    longest = textWidth;\n  }\n  return longest;\n}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n  ctx: CanvasRenderingContext2D,\n  font: string,\n  arrayOfThings: Things,\n  cache?: {data?: Record<string, number>, garbageCollect?: string[], font?: string}\n) {\n  cache = cache || {};\n  let data = cache.data = cache.data || {};\n  let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n  if (cache.font !== font) {\n    data = cache.data = {};\n    gc = cache.garbageCollect = [];\n    cache.font = font;\n  }\n\n  ctx.save();\n\n  ctx.font = font;\n  let longest = 0;\n  const ilen = arrayOfThings.length;\n  let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n  for (i = 0; i < ilen; i++) {\n    thing = arrayOfThings[i];\n\n    // Undefined strings and arrays should not be measured\n    if (thing !== undefined && thing !== null && !isArray(thing)) {\n      longest = _measureText(ctx, data, gc, longest, thing);\n    } else if (isArray(thing)) {\n      // if it is an array lets measure each element\n      // to do maybe simplify this function a bit so we can do this more recursively?\n      for (j = 0, jlen = thing.length; j < jlen; j++) {\n        nestedThing = thing[j];\n        // Undefined strings and arrays should not be measured\n        if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n          longest = _measureText(ctx, data, gc, longest, nestedThing);\n        }\n      }\n    }\n  }\n\n  ctx.restore();\n\n  const gcLen = gc.length / 2;\n  if (gcLen > arrayOfThings.length) {\n    for (i = 0; i < gcLen; i++) {\n      delete data[gc[i]];\n    }\n    gc.splice(0, gcLen);\n  }\n  return longest;\n}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\n  const devicePixelRatio = chart.currentDevicePixelRatio;\n  const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n  return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas?: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n  if (!ctx && !canvas) {\n    return;\n  }\n\n  ctx = ctx || canvas.getContext('2d');\n\n  ctx.save();\n  // canvas.width and canvas.height do not consider the canvas transform,\n  // while clearRect does\n  ctx.resetTransform();\n  ctx.clearRect(0, 0, canvas.width, canvas.height);\n  ctx.restore();\n}\n\nexport interface DrawPointOptions {\n  pointStyle: PointStyle;\n  rotation?: number;\n  radius: number;\n  borderWidth: number;\n}\n\nexport function drawPoint(\n  ctx: CanvasRenderingContext2D,\n  options: DrawPointOptions,\n  x: number,\n  y: number\n) {\n  // eslint-disable-next-line @typescript-eslint/no-use-before-define\n  drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n  ctx: CanvasRenderingContext2D,\n  options: DrawPointOptions,\n  x: number,\n  y: number,\n  w: number\n) {\n  let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n  const style = options.pointStyle;\n  const rotation = options.rotation;\n  const radius = options.radius;\n  let rad = (rotation || 0) * RAD_PER_DEG;\n\n  if (style && typeof style === 'object') {\n    type = style.toString();\n    if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.rotate(rad);\n      ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n      ctx.restore();\n      return;\n    }\n  }\n\n  if (isNaN(radius) || radius <= 0) {\n    return;\n  }\n\n  ctx.beginPath();\n\n  switch (style) {\n  // Default includes circle\n    default:\n      if (w) {\n        ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n      } else {\n        ctx.arc(x, y, radius, 0, TAU);\n      }\n      ctx.closePath();\n      break;\n    case 'triangle':\n      width = w ? w / 2 : radius;\n      ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n      rad += TWO_THIRDS_PI;\n      ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n      rad += TWO_THIRDS_PI;\n      ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n      ctx.closePath();\n      break;\n    case 'rectRounded':\n    // NOTE: the rounded rect implementation changed to use `arc` instead of\n    // `quadraticCurveTo` since it generates better results when rect is\n    // almost a circle. 0.516 (instead of 0.5) produces results with visually\n    // closer proportion to the previous impl and it is inscribed in the\n    // circle with `radius`. For more details, see the following PRs:\n    // https://github.com/chartjs/Chart.js/issues/5597\n    // https://github.com/chartjs/Chart.js/issues/5858\n      cornerRadius = radius * 0.516;\n      size = radius - cornerRadius;\n      xOffset = Math.cos(rad + QUARTER_PI) * size;\n      xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n      yOffset = Math.sin(rad + QUARTER_PI) * size;\n      yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n      ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n      ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n      ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n      ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n      ctx.closePath();\n      break;\n    case 'rect':\n      if (!rotation) {\n        size = Math.SQRT1_2 * radius;\n        width = w ? w / 2 : size;\n        ctx.rect(x - width, y - size, 2 * width, 2 * size);\n        break;\n      }\n      rad += QUARTER_PI;\n    /* falls through */\n    case 'rectRot':\n      xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n      xOffset = Math.cos(rad) * radius;\n      yOffset = Math.sin(rad) * radius;\n      yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n      ctx.moveTo(x - xOffsetW, y - yOffset);\n      ctx.lineTo(x + yOffsetW, y - xOffset);\n      ctx.lineTo(x + xOffsetW, y + yOffset);\n      ctx.lineTo(x - yOffsetW, y + xOffset);\n      ctx.closePath();\n      break;\n    case 'crossRot':\n      rad += QUARTER_PI;\n    /* falls through */\n    case 'cross':\n      xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n      xOffset = Math.cos(rad) * radius;\n      yOffset = Math.sin(rad) * radius;\n      yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n      ctx.moveTo(x - xOffsetW, y - yOffset);\n      ctx.lineTo(x + xOffsetW, y + yOffset);\n      ctx.moveTo(x + yOffsetW, y - xOffset);\n      ctx.lineTo(x - yOffsetW, y + xOffset);\n      break;\n    case 'star':\n      xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n      xOffset = Math.cos(rad) * radius;\n      yOffset = Math.sin(rad) * radius;\n      yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n      ctx.moveTo(x - xOffsetW, y - yOffset);\n      ctx.lineTo(x + xOffsetW, y + yOffset);\n      ctx.moveTo(x + yOffsetW, y - xOffset);\n      ctx.lineTo(x - yOffsetW, y + xOffset);\n      rad += QUARTER_PI;\n      xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n      xOffset = Math.cos(rad) * radius;\n      yOffset = Math.sin(rad) * radius;\n      yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n      ctx.moveTo(x - xOffsetW, y - yOffset);\n      ctx.lineTo(x + xOffsetW, y + yOffset);\n      ctx.moveTo(x + yOffsetW, y - xOffset);\n      ctx.lineTo(x - yOffsetW, y + xOffset);\n      break;\n    case 'line':\n      xOffset = w ? w / 2 : Math.cos(rad) * radius;\n      yOffset = Math.sin(rad) * radius;\n      ctx.moveTo(x - xOffset, y - yOffset);\n      ctx.lineTo(x + xOffset, y + yOffset);\n      break;\n    case 'dash':\n      ctx.moveTo(x, y);\n      ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n      break;\n    case false:\n      ctx.closePath();\n      break;\n  }\n\n  ctx.fill();\n  if (options.borderWidth > 0) {\n    ctx.stroke();\n  }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n  point: Point,\n  area: TRBL,\n  margin?: number\n) {\n  margin = margin || 0.5; // margin - default is to match rounded decimals\n\n  return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\n  ctx.save();\n  ctx.beginPath();\n  ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n  ctx.clip();\n}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n  ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n  ctx: CanvasRenderingContext2D,\n  previous: Point,\n  target: Point,\n  flip?: boolean,\n  mode?: string\n) {\n  if (!previous) {\n    return ctx.lineTo(target.x, target.y);\n  }\n  if (mode === 'middle') {\n    const midpoint = (previous.x + target.x) / 2.0;\n    ctx.lineTo(midpoint, previous.y);\n    ctx.lineTo(midpoint, target.y);\n  } else if (mode === 'after' !== !!flip) {\n    ctx.lineTo(previous.x, target.y);\n  } else {\n    ctx.lineTo(target.x, previous.y);\n  }\n  ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n  ctx: CanvasRenderingContext2D,\n  previous: SplinePoint,\n  target: SplinePoint,\n  flip?: boolean\n) {\n  if (!previous) {\n    return ctx.lineTo(target.x, target.y);\n  }\n  ctx.bezierCurveTo(\n    flip ? previous.cp1x : previous.cp2x,\n    flip ? previous.cp1y : previous.cp2y,\n    flip ? target.cp2x : target.cp1x,\n    flip ? target.cp2y : target.cp1y,\n    target.x,\n    target.y);\n}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n  if (opts.translation) {\n    ctx.translate(opts.translation[0], opts.translation[1]);\n  }\n\n  if (!isNullOrUndef(opts.rotation)) {\n    ctx.rotate(opts.rotation);\n  }\n\n  if (opts.color) {\n    ctx.fillStyle = opts.color;\n  }\n\n  if (opts.textAlign) {\n    ctx.textAlign = opts.textAlign;\n  }\n\n  if (opts.textBaseline) {\n    ctx.textBaseline = opts.textBaseline;\n  }\n}\n\nfunction decorateText(\n  ctx: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  line: string,\n  opts: RenderTextOpts\n) {\n  if (opts.strikethrough || opts.underline) {\n    /**\n     * Now that IE11 support has been dropped, we can use more\n     * of the TextMetrics object. The actual bounding boxes\n     * are unflagged in Chrome, Firefox, Edge, and Safari so they\n     * can be safely used.\n     * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n     */\n    const metrics = ctx.measureText(line);\n    const left = x - metrics.actualBoundingBoxLeft;\n    const right = x + metrics.actualBoundingBoxRight;\n    const top = y - metrics.actualBoundingBoxAscent;\n    const bottom = y + metrics.actualBoundingBoxDescent;\n    const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n\n    ctx.strokeStyle = ctx.fillStyle;\n    ctx.beginPath();\n    ctx.lineWidth = opts.decorationWidth || 2;\n    ctx.moveTo(left, yDecoration);\n    ctx.lineTo(right, yDecoration);\n    ctx.stroke();\n  }\n}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n  const oldColor = ctx.fillStyle;\n\n  ctx.fillStyle = opts.color as string;\n  ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n  ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n  ctx: CanvasRenderingContext2D,\n  text: string | string[],\n  x: number,\n  y: number,\n  font: CanvasFontSpec,\n  opts: RenderTextOpts = {}\n) {\n  const lines = isArray(text) ? text : [text];\n  const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n  let i: number, line: string;\n\n  ctx.save();\n  ctx.font = font.string;\n  setRenderOpts(ctx, opts);\n\n  for (i = 0; i < lines.length; ++i) {\n    line = lines[i];\n\n    if (opts.backdrop) {\n      drawBackdrop(ctx, opts.backdrop);\n    }\n\n    if (stroke) {\n      if (opts.strokeColor) {\n        ctx.strokeStyle = opts.strokeColor;\n      }\n\n      if (!isNullOrUndef(opts.strokeWidth)) {\n        ctx.lineWidth = opts.strokeWidth;\n      }\n\n      ctx.strokeText(line, x, y, opts.maxWidth);\n    }\n\n    ctx.fillText(line, x, y, opts.maxWidth);\n    decorateText(ctx, x, y, line, opts);\n\n    y += Number(font.lineHeight);\n  }\n\n  ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n  ctx: CanvasRenderingContext2D,\n  rect: RoundedRect & { radius: TRBLCorners }\n) {\n  const {x, y, w, h, radius} = rect;\n\n  // top left arc\n  ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n  // line from top left to bottom left\n  ctx.lineTo(x, y + h - radius.bottomLeft);\n\n  // bottom left arc\n  ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n  // line from bottom left to bottom right\n  ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n  // bottom right arc\n  ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n  // line from bottom right to top right\n  ctx.lineTo(x + w, y + radius.topRight);\n\n  // top right arc\n  ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n  // line from top right to top left\n  ctx.lineTo(x + radius.topLeft, y);\n}\n", "import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n  const matches = ('' + value).match(LINE_HEIGHT);\n  if (!matches || matches[1] === 'normal') {\n    return size * 1.2;\n  }\n\n  value = +matches[2];\n\n  switch (matches[3]) {\n    case 'px':\n      return value;\n    case '%':\n      value /= 100;\n      break;\n    default:\n      break;\n  }\n\n  return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps<K extends string>(value: number | Record<K, number>, props: K[]): Record<K, number>;\nexport function _readValueToProps<K extends string, T extends string>(value: number | Record<K & T, number>, props: Record<T, K>): Record<T, number>;\nexport function _readValueToProps(value: number | Record<string, number>, props: string[] | Record<string, string>) {\n  const ret = {};\n  const objProps = isObject(props);\n  const keys = objProps ? Object.keys(props) : props;\n  const read = isObject(value)\n    ? objProps\n      ? prop => valueOrDefault(value[prop], value[props[prop]])\n      : prop => value[prop]\n    : () => value;\n\n  for (const prop of keys) {\n    ret[prop] = numberOrZero(read(prop));\n  }\n  return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n *  else, if an object, use defined properties and sets undefined ones to 0.\n *  x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n  return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n *  else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n  return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n *  else, if an object, use defined properties and sets undefined ones to 0.\n *  x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n  const obj = toTRBL(value) as ChartArea;\n\n  obj.width = obj.left + obj.right;\n  obj.height = obj.top + obj.bottom;\n\n  return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial<FontSpec>, fallback?: Partial<FontSpec>) {\n  options = options || {};\n  fallback = fallback || defaults.font as FontSpec;\n\n  let size = valueOrDefault(options.size, fallback.size);\n\n  if (typeof size === 'string') {\n    size = parseInt(size, 10);\n  }\n  let style = valueOrDefault(options.style, fallback.style);\n  if (style && !('' + style).match(FONT_STYLE)) {\n    console.warn('Invalid font style specified: \"' + style + '\"');\n    style = undefined;\n  }\n\n  const font = {\n    family: valueOrDefault(options.family, fallback.family),\n    lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n    size,\n    style,\n    weight: valueOrDefault(options.weight, fallback.weight),\n    string: ''\n  };\n\n  font.string = toFontString(font);\n  return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array<unknown>, context?: object, index?: number, info?: { cacheable: boolean }) {\n  let cacheable = true;\n  let i: number, ilen: number, value: unknown;\n\n  for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n    value = inputs[i];\n    if (value === undefined) {\n      continue;\n    }\n    if (context !== undefined && typeof value === 'function') {\n      value = value(context);\n      cacheable = false;\n    }\n    if (index !== undefined && isArray(value)) {\n      value = value[index % value.length];\n      cacheable = false;\n    }\n    if (value !== undefined) {\n      if (info && !cacheable) {\n        info.cacheable = false;\n      }\n      return value;\n    }\n  }\n}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n  const {min, max} = minmax;\n  const change = toDimension(grace, (max - min) / 2);\n  const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n  return {\n    min: keepZero(min, -Math.abs(change)),\n    max: keepZero(max, change)\n  };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext<T extends object>(parentContext: null, context: T): T;\nexport function createContext<T extends object, P extends T>(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n  return Object.assign(Object.create(parentContext), context);\n}\n", "/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n  ResolverObjectKey,\n  ResolverCache,\n  ResolverProxy,\n  DescriptorDefaults,\n  Descriptor,\n  ContextCache,\n  ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n  T extends AnyObject[] = AnyObject[],\n  R extends AnyObject[] = T\n>(\n  scopes: T,\n  prefixes = [''],\n  rootScopes?: R,\n  fallback?: ResolverObjectKey,\n  getTarget = () => scopes[0]\n) {\n  const finalRootScopes = rootScopes || scopes;\n  if (typeof fallback === 'undefined') {\n    fallback = _resolve('_fallback', scopes);\n  }\n  const cache: ResolverCache<T, R> = {\n    [Symbol.toStringTag]: 'Object',\n    _cacheable: true,\n    _scopes: scopes,\n    _rootScopes: finalRootScopes,\n    _fallback: fallback,\n    _getTarget: getTarget,\n    override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n  };\n  return new Proxy(cache, {\n    /**\n     * A trap for the delete operator.\n     */\n    deleteProperty(target, prop: string) {\n      delete target[prop]; // remove from cache\n      delete target._keys; // remove cached keys\n      delete scopes[0][prop]; // remove from top level scope\n      return true;\n    },\n\n    /**\n     * A trap for getting property values.\n     */\n    get(target, prop: string) {\n      return _cached(target, prop,\n        () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n    },\n\n    /**\n     * A trap for Object.getOwnPropertyDescriptor.\n     * Also used by Object.hasOwnProperty.\n     */\n    getOwnPropertyDescriptor(target, prop) {\n      return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n    },\n\n    /**\n     * A trap for Object.getPrototypeOf.\n     */\n    getPrototypeOf() {\n      return Reflect.getPrototypeOf(scopes[0]);\n    },\n\n    /**\n     * A trap for the in operator.\n     */\n    has(target, prop: string) {\n      return getKeysFromAllScopes(target).includes(prop);\n    },\n\n    /**\n     * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n     */\n    ownKeys(target) {\n      return getKeysFromAllScopes(target);\n    },\n\n    /**\n     * A trap for setting property values.\n     */\n    set(target, prop: string, value) {\n      const storage = target._storage || (target._storage = getTarget());\n      target[prop] = storage[prop] = value; // set to top level scope + cache\n      delete target._keys; // remove cached keys\n      return true;\n    }\n  }) as ResolverProxy<T, R>;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n  T extends AnyObject[] = AnyObject[],\n  R extends AnyObject[] = T\n>(\n  proxy: ResolverProxy<T, R>,\n  context: AnyObject,\n  subProxy?: ResolverProxy<T, R>,\n  descriptorDefaults?: DescriptorDefaults\n) {\n  const cache: ContextCache<T, R> = {\n    _cacheable: false,\n    _proxy: proxy,\n    _context: context,\n    _subProxy: subProxy,\n    _stack: new Set(),\n    _descriptors: _descriptors(proxy, descriptorDefaults),\n    setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n    override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n  };\n  return new Proxy(cache, {\n    /**\n     * A trap for the delete operator.\n     */\n    deleteProperty(target, prop) {\n      delete target[prop]; // remove from cache\n      delete proxy[prop]; // remove from proxy\n      return true;\n    },\n\n    /**\n     * A trap for getting property values.\n     */\n    get(target, prop: string, receiver) {\n      return _cached(target, prop,\n        () => _resolveWithContext(target, prop, receiver));\n    },\n\n    /**\n     * A trap for Object.getOwnPropertyDescriptor.\n     * Also used by Object.hasOwnProperty.\n     */\n    getOwnPropertyDescriptor(target, prop) {\n      return target._descriptors.allKeys\n        ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n        : Reflect.getOwnPropertyDescriptor(proxy, prop);\n    },\n\n    /**\n     * A trap for Object.getPrototypeOf.\n     */\n    getPrototypeOf() {\n      return Reflect.getPrototypeOf(proxy);\n    },\n\n    /**\n     * A trap for the in operator.\n     */\n    has(target, prop) {\n      return Reflect.has(proxy, prop);\n    },\n\n    /**\n     * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n     */\n    ownKeys() {\n      return Reflect.ownKeys(proxy);\n    },\n\n    /**\n     * A trap for setting property values.\n     */\n    set(target, prop, value) {\n      proxy[prop] = value; // set to proxy\n      delete target[prop]; // remove from cache\n      return true;\n    }\n  }) as ContextProxy<T, R>;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n  proxy: ResolverCache,\n  defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\n  const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n  return {\n    allKeys: _allKeys,\n    scriptable: _scriptable,\n    indexable: _indexable,\n    isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n    isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n  };\n}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n  (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n  target: AnyObject,\n  prop: string,\n  resolve: () => unknown\n) {\n  if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n    return target[prop];\n  }\n\n  const value = resolve();\n  // cache the resolved value\n  target[prop] = value;\n  return value;\n}\n\nfunction _resolveWithContext(\n  target: ContextCache,\n  prop: string,\n  receiver: AnyObject\n) {\n  const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n  let value = _proxy[prop]; // resolve from proxy\n\n  // resolve with context\n  if (isFunction(value) && descriptors.isScriptable(prop)) {\n    value = _resolveScriptable(prop, value, target, receiver);\n  }\n  if (isArray(value) && value.length) {\n    value = _resolveArray(prop, value, target, descriptors.isIndexable);\n  }\n  if (needsSubResolver(prop, value)) {\n    // if the resolved value is an object, create a sub resolver for it\n    value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n  }\n  return value;\n}\n\nfunction _resolveScriptable(\n  prop: string,\n  getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n  target: ContextCache,\n  receiver: AnyObject\n) {\n  const {_proxy, _context, _subProxy, _stack} = target;\n  if (_stack.has(prop)) {\n    throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n  }\n  _stack.add(prop);\n  let value = getValue(_context, _subProxy || receiver);\n  _stack.delete(prop);\n  if (needsSubResolver(prop, value)) {\n    // When scriptable option returns an object, create a resolver on that.\n    value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n  }\n  return value;\n}\n\nfunction _resolveArray(\n  prop: string,\n  value: unknown[],\n  target: ContextCache,\n  isIndexable: (key: string) => boolean\n) {\n  const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n  if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n    return value[_context.index % value.length];\n  } else if (isObject(value[0])) {\n    // Array of objects, return array or resolvers\n    const arr = value;\n    const scopes = _proxy._scopes.filter(s => s !== arr);\n    value = [];\n    for (const item of arr) {\n      const resolver = createSubResolver(scopes, _proxy, prop, item);\n      value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n    }\n  }\n  return value;\n}\n\nfunction resolveFallback(\n  fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n  prop: ResolverObjectKey,\n  value: unknown\n) {\n  return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n  : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n  set: Set<AnyObject>,\n  parentScopes: AnyObject[],\n  key: ResolverObjectKey,\n  parentFallback: ResolverObjectKey,\n  value: unknown\n) {\n  for (const parent of parentScopes) {\n    const scope = getScope(key, parent);\n    if (scope) {\n      set.add(scope);\n      const fallback = resolveFallback(scope._fallback, key, value);\n      if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n        // When we reach the descriptor that defines a new _fallback, return that.\n        // The fallback will resume to that new scope.\n        return fallback;\n      }\n    } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n      // Fallback to `false` results to `false`, when falling back to different key.\n      // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n      return null;\n    }\n  }\n  return false;\n}\n\nfunction createSubResolver(\n  parentScopes: AnyObject[],\n  resolver: ResolverCache,\n  prop: ResolverObjectKey,\n  value: unknown\n) {\n  const rootScopes = resolver._rootScopes;\n  const fallback = resolveFallback(resolver._fallback, prop, value);\n  const allScopes = [...parentScopes, ...rootScopes];\n  const set = new Set<AnyObject>();\n  set.add(value);\n  let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n  if (key === null) {\n    return false;\n  }\n  if (typeof fallback !== 'undefined' && fallback !== prop) {\n    key = addScopesFromKey(set, allScopes, fallback, key, value);\n    if (key === null) {\n      return false;\n    }\n  }\n  return _createResolver(Array.from(set), [''], rootScopes, fallback,\n    () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n  set: Set<AnyObject>,\n  allScopes: AnyObject[],\n  key: ResolverObjectKey,\n  fallback: ResolverObjectKey,\n  item: unknown\n) {\n  while (key) {\n    key = addScopes(set, allScopes, key, fallback, item);\n  }\n  return key;\n}\n\nfunction subGetTarget(\n  resolver: ResolverCache,\n  prop: string,\n  value: unknown\n) {\n  const parent = resolver._getTarget();\n  if (!(prop in parent)) {\n    parent[prop] = {};\n  }\n  const target = parent[prop];\n  if (isArray(target) && isObject(value)) {\n    // For array of objects, the object is used to store updated values\n    return value;\n  }\n  return target || {};\n}\n\nfunction _resolveWithPrefixes(\n  prop: string,\n  prefixes: string[],\n  scopes: AnyObject[],\n  proxy: ResolverProxy\n) {\n  let value: unknown;\n  for (const prefix of prefixes) {\n    value = _resolve(readKey(prefix, prop), scopes);\n    if (typeof value !== 'undefined') {\n      return needsSubResolver(prop, value)\n        ? createSubResolver(scopes, proxy, prop, value)\n        : value;\n    }\n  }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n  for (const scope of scopes) {\n    if (!scope) {\n      continue;\n    }\n    const value = scope[key];\n    if (typeof value !== 'undefined') {\n      return value;\n    }\n  }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n  let keys = target._keys;\n  if (!keys) {\n    keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n  }\n  return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\n  const set = new Set<string>();\n  for (const scope of scopes) {\n    for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n      set.add(key);\n    }\n  }\n  return Array.from(set);\n}\n\nexport function _parseObjectDataRadialScale(\n  meta: ChartMeta<'line' | 'scatter'>,\n  data: AnyObject[],\n  start: number,\n  count: number\n) {\n  const {iScale} = meta;\n  const {key = 'r'} = this._parsing;\n  const parsed = new Array<{r: unknown}>(count);\n  let i: number, ilen: number, index: number, item: AnyObject;\n\n  for (i = 0, ilen = count; i < ilen; ++i) {\n    index = i + start;\n    item = data[index];\n    parsed[i] = {\n      r: iScale.parse(resolveObjectKey(item, key), index)\n    };\n  }\n  return parsed;\n}\n", "import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n  firstPoint: SplinePoint,\n  middlePoint: SplinePoint,\n  afterPoint: SplinePoint,\n  t: number\n): {\n    previous: SplinePoint\n    next: SplinePoint\n  } {\n  // Props to Rob Spencer at scaled innovation for his post on splining between points\n  // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n  // This function must also respect \"skipped\" points\n\n  const previous = firstPoint.skip ? middlePoint : firstPoint;\n  const current = middlePoint;\n  const next = afterPoint.skip ? middlePoint : afterPoint;\n  const d01 = distanceBetweenPoints(current, previous);\n  const d12 = distanceBetweenPoints(next, current);\n\n  let s01 = d01 / (d01 + d12);\n  let s12 = d12 / (d01 + d12);\n\n  // If all points are the same, s01 & s02 will be inf\n  s01 = isNaN(s01) ? 0 : s01;\n  s12 = isNaN(s12) ? 0 : s12;\n\n  const fa = t * s01; // scaling factor for triangle Ta\n  const fb = t * s12;\n\n  return {\n    previous: {\n      x: current.x - fa * (next.x - previous.x),\n      y: current.y - fa * (next.y - previous.y)\n    },\n    next: {\n      x: current.x + fb * (next.x - previous.x),\n      y: current.y + fb * (next.y - previous.y)\n    }\n  };\n}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n  const pointsLen = points.length;\n\n  let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\n  let pointAfter = getPoint(points, 0);\n  for (let i = 0; i < pointsLen - 1; ++i) {\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent || !pointAfter) {\n      continue;\n    }\n\n    if (almostEquals(deltaK[i], 0, EPSILON)) {\n      mK[i] = mK[i + 1] = 0;\n      continue;\n    }\n\n    alphaK = mK[i] / deltaK[i];\n    betaK = mK[i + 1] / deltaK[i];\n    squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n    if (squaredMagnitude <= 9) {\n      continue;\n    }\n\n    tauK = 3 / Math.sqrt(squaredMagnitude);\n    mK[i] = alphaK * tauK * deltaK[i];\n    mK[i + 1] = betaK * tauK * deltaK[i];\n  }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n  const valueAxis = getValueAxis(indexAxis);\n  const pointsLen = points.length;\n  let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n  let pointAfter = getPoint(points, 0);\n\n  for (let i = 0; i < pointsLen; ++i) {\n    pointBefore = pointCurrent;\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent) {\n      continue;\n    }\n\n    const iPixel = pointCurrent[indexAxis];\n    const vPixel = pointCurrent[valueAxis];\n    if (pointBefore) {\n      delta = (iPixel - pointBefore[indexAxis]) / 3;\n      pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n      pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n    }\n    if (pointAfter) {\n      delta = (pointAfter[indexAxis] - iPixel) / 3;\n      pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n      pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n    }\n  }\n}\n\n/**\n * This function calculates B\u00E9zier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n  const valueAxis = getValueAxis(indexAxis);\n  const pointsLen = points.length;\n  const deltaK: number[] = Array(pointsLen).fill(0);\n  const mK: number[] = Array(pointsLen);\n\n  // Calculate slopes (deltaK) and initialize tangents (mK)\n  let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n  let pointAfter = getPoint(points, 0);\n\n  for (i = 0; i < pointsLen; ++i) {\n    pointBefore = pointCurrent;\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent) {\n      continue;\n    }\n\n    if (pointAfter) {\n      const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n      // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n      deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n    }\n    mK[i] = !pointBefore ? deltaK[i]\n      : !pointAfter ? deltaK[i - 1]\n        : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n          : (deltaK[i - 1] + deltaK[i]) / 2;\n  }\n\n  monotoneAdjust(points, deltaK, mK);\n\n  monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n  return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\n  let i, ilen, point, inArea, inAreaPrev;\n  let inAreaNext = _isPointInArea(points[0], area);\n  for (i = 0, ilen = points.length; i < ilen; ++i) {\n    inAreaPrev = inArea;\n    inArea = inAreaNext;\n    inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n    if (!inArea) {\n      continue;\n    }\n    point = points[i];\n    if (inAreaPrev) {\n      point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n      point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n    }\n    if (inAreaNext) {\n      point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n      point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n    }\n  }\n}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n  points: SplinePoint[],\n  options,\n  area: ChartArea,\n  loop: boolean,\n  indexAxis: 'x' | 'y'\n) {\n  let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType<typeof splineCurve>;\n\n  // Only consider points that are drawn in case the spanGaps option is used\n  if (options.spanGaps) {\n    points = points.filter((pt) => !pt.skip);\n  }\n\n  if (options.cubicInterpolationMode === 'monotone') {\n    splineCurveMonotone(points, indexAxis);\n  } else {\n    let prev = loop ? points[points.length - 1] : points[0];\n    for (i = 0, ilen = points.length; i < ilen; ++i) {\n      point = points[i];\n      controlPoints = splineCurve(\n        prev,\n        point,\n        points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n        options.tension\n      );\n      point.cp1x = controlPoints.previous.x;\n      point.cp1y = controlPoints.previous.y;\n      point.cp2x = controlPoints.next.x;\n      point.cp2y = controlPoints.next.y;\n      prev = point;\n    }\n  }\n\n  if (options.capBezierPoints) {\n    capBezierPoints(points, area);\n  }\n}\n", "import type {ChartArea, Scale} from '../types/index.js';\nimport type PrivateChart from '../core/core.controller.js';\nimport type {Chart, ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n  return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n  let parent = domNode.parentNode;\n  if (parent && parent.toString() === '[object ShadowRoot]') {\n    parent = (parent as ShadowRoot).host;\n  }\n  return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n  let valueInPixels: number;\n  if (typeof styleValue === 'string') {\n    valueInPixels = parseInt(styleValue, 10);\n\n    if (styleValue.indexOf('%') !== -1) {\n      // percentage * size in dimension\n      valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n    }\n  } else {\n    valueInPixels = styleValue;\n  }\n\n  return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n  element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n  return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n  const result = {} as ChartArea;\n  suffix = suffix ? '-' + suffix : '';\n  for (let i = 0; i < 4; i++) {\n    const pos = positions[i];\n    result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n  }\n  result.width = result.left + result.right;\n  result.height = result.top + result.bottom;\n  return result;\n}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n  (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n  e: Event | TouchEvent | MouseEvent,\n  canvas: HTMLCanvasElement\n): {\n    x: number;\n    y: number;\n    box: boolean;\n  } {\n  const touches = (e as TouchEvent).touches;\n  const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n  const {offsetX, offsetY} = source as MouseEvent;\n  let box = false;\n  let x, y;\n  if (useOffsetPos(offsetX, offsetY, e.target)) {\n    x = offsetX;\n    y = offsetY;\n  } else {\n    const rect = canvas.getBoundingClientRect();\n    x = source.clientX - rect.left;\n    y = source.clientY - rect.top;\n    box = true;\n  }\n  return {x, y, box};\n}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n  event: Event | ChartEvent | TouchEvent | MouseEvent,\n  chart: Chart | PrivateChart\n): { x: number; y: number } {\n  if ('native' in event) {\n    return event;\n  }\n\n  const {canvas, currentDevicePixelRatio} = chart;\n  const style = getComputedStyle(canvas);\n  const borderBox = style.boxSizing === 'border-box';\n  const paddings = getPositionedStyle(style, 'padding');\n  const borders = getPositionedStyle(style, 'border', 'width');\n  const {x, y, box} = getCanvasPosition(event, canvas);\n  const xOffset = paddings.left + (box && borders.left);\n  const yOffset = paddings.top + (box && borders.top);\n\n  let {width, height} = chart;\n  if (borderBox) {\n    width -= paddings.width + borders.width;\n    height -= paddings.height + borders.height;\n  }\n  return {\n    x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n    y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n  };\n}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial<Scale> {\n  let maxWidth: number, maxHeight: number;\n\n  if (width === undefined || height === undefined) {\n    const container = canvas && _getParentNode(canvas);\n    if (!container) {\n      width = canvas.clientWidth;\n      height = canvas.clientHeight;\n    } else {\n      const rect = container.getBoundingClientRect(); // this is the border box of the container\n      const containerStyle = getComputedStyle(container);\n      const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n      const containerPadding = getPositionedStyle(containerStyle, 'padding');\n      width = rect.width - containerPadding.width - containerBorder.width;\n      height = rect.height - containerPadding.height - containerBorder.height;\n      maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n      maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n    }\n  }\n  return {\n    width,\n    height,\n    maxWidth: maxWidth || INFINITY,\n    maxHeight: maxHeight || INFINITY\n  };\n}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n  canvas: HTMLCanvasElement,\n  bbWidth?: number,\n  bbHeight?: number,\n  aspectRatio?: number\n): { width: number; height: number } {\n  const style = getComputedStyle(canvas);\n  const margins = getPositionedStyle(style, 'margin');\n  const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n  const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n  const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n  let {width, height} = containerSize;\n\n  if (style.boxSizing === 'content-box') {\n    const borders = getPositionedStyle(style, 'border', 'width');\n    const paddings = getPositionedStyle(style, 'padding');\n    width -= paddings.width + borders.width;\n    height -= paddings.height + borders.height;\n  }\n  width = Math.max(0, width - margins.width);\n  height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n  width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n  height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n  if (width && !height) {\n    // https://github.com/chartjs/Chart.js/issues/4659\n    // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n    height = round1(width / 2);\n  }\n\n  const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n  if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n    height = containerSize.height;\n    width = round1(Math.floor(height * aspectRatio));\n  }\n\n  return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n  chart: Chart | PrivateChart,\n  forceRatio: number,\n  forceStyle?: boolean\n): boolean | void {\n  const pixelRatio = forceRatio || 1;\n  const deviceHeight = round1(chart.height * pixelRatio);\n  const deviceWidth = round1(chart.width * pixelRatio);\n\n  (chart as PrivateChart).height = round1(chart.height);\n  (chart as PrivateChart).width = round1(chart.width);\n\n  const canvas = chart.canvas;\n\n  // If no style has been set on the canvas, the render size is used as display size,\n  // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n  // See https://github.com/chartjs/Chart.js/issues/3575\n  if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n    canvas.style.height = `${chart.height}px`;\n    canvas.style.width = `${chart.width}px`;\n  }\n\n  if (chart.currentDevicePixelRatio !== pixelRatio\n      || canvas.height !== deviceHeight\n      || canvas.width !== deviceWidth) {\n    (chart as PrivateChart).currentDevicePixelRatio = pixelRatio;\n    canvas.height = deviceHeight;\n    canvas.width = deviceWidth;\n    chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n    return true;\n  }\n  return false;\n}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n  let passiveSupported = false;\n  try {\n    const options = {\n      get passive() { // This function will be called when the browser attempts to access the passive property.\n        passiveSupported = true;\n        return false;\n      }\n    } as EventListenerOptions;\n\n    if (_isDomSupported()) {\n      window.addEventListener('test', null, options);\n      window.removeEventListener('test', null, options);\n    }\n  } catch (e) {\n    // continue regardless of error\n  }\n  return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n  element: HTMLElement,\n  property: 'width' | 'height'\n): number | undefined {\n  const value = getStyle(element, property);\n  const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n  return matches ? +matches[1] : undefined;\n}\n", "import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n  return {\n    x: p1.x + t * (p2.x - p1.x),\n    y: p1.y + t * (p2.y - p1.y)\n  };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n  p1: Point,\n  p2: Point,\n  t: number, mode: 'middle' | 'after' | unknown\n) {\n  return {\n    x: p1.x + t * (p2.x - p1.x),\n    y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n      : mode === 'after' ? t < 1 ? p1.y : p2.y\n        : t > 0 ? p2.y : p1.y\n  };\n}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n  const cp1 = {x: p1.cp2x, y: p1.cp2y};\n  const cp2 = {x: p2.cp1x, y: p2.cp1y};\n  const a = _pointInLine(p1, cp1, t);\n  const b = _pointInLine(cp1, cp2, t);\n  const c = _pointInLine(cp2, p2, t);\n  const d = _pointInLine(a, b, t);\n  const e = _pointInLine(b, c, t);\n  return _pointInLine(d, e, t);\n}\n", "export interface RTLAdapter {\n  x(x: number): number;\n  setWidth(w: number): void;\n  textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n  xPlus(x: number, value: number): number;\n  leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\n  return {\n    x(x) {\n      return rectX + rectX + width - x;\n    },\n    setWidth(w) {\n      width = w;\n    },\n    textAlign(align) {\n      if (align === 'center') {\n        return align;\n      }\n      return align === 'right' ? 'left' : 'right';\n    },\n    xPlus(x, value) {\n      return x - value;\n    },\n    leftForLtr(x, itemWidth) {\n      return x - itemWidth;\n    },\n  };\n};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n  return {\n    x(x) {\n      return x;\n    },\n    setWidth(w) { // eslint-disable-line no-unused-vars\n    },\n    textAlign(align) {\n      return align;\n    },\n    xPlus(x, value) {\n      return x + value;\n    },\n    leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n      return x;\n    },\n  };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n  return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n  let style: CSSStyleDeclaration, original: [string, string];\n  if (direction === 'ltr' || direction === 'rtl') {\n    style = ctx.canvas.style;\n    original = [\n      style.getPropertyValue('direction'),\n      style.getPropertyPriority('direction'),\n    ];\n\n    style.setProperty('direction', direction, 'important');\n    (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n  }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n  if (original !== undefined) {\n    delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n    ctx.canvas.style.setProperty('direction', original[0], original[1]);\n  }\n}\n", "import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\n */\n\nfunction propertyFn(property) {\n  if (property === 'angle') {\n    return {\n      between: _angleBetween,\n      compare: _angleDiff,\n      normalize: _normalizeAngle,\n    };\n  }\n  return {\n    between: _isBetween,\n    compare: (a, b) => a - b,\n    normalize: x => x\n  };\n}\n\nfunction normalizeSegment({start, end, count, loop, style}) {\n  return {\n    start: start % count,\n    end: end % count,\n    loop: loop && (end - start + 1) % count === 0,\n    style\n  };\n}\n\nfunction getSegment(segment, points, bounds) {\n  const {property, start: startBound, end: endBound} = bounds;\n  const {between, normalize} = propertyFn(property);\n  const count = points.length;\n  // eslint-disable-next-line prefer-const\n  let {start, end, loop} = segment;\n  let i, ilen;\n\n  if (loop) {\n    start += count;\n    end += count;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n        break;\n      }\n      start--;\n      end--;\n    }\n    start %= count;\n    end %= count;\n  }\n\n  if (end < start) {\n    end += count;\n  }\n  return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n  if (!bounds) {\n    return [segment];\n  }\n\n  const {property, start: startBound, end: endBound} = bounds;\n  const count = points.length;\n  const {compare, between, normalize} = propertyFn(property);\n  const {start, end, loop, style} = getSegment(segment, points, bounds);\n\n  const result = [];\n  let inside = false;\n  let subStart = null;\n  let value, point, prevValue;\n\n  const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n  const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n  const shouldStart = () => inside || startIsBefore();\n  const shouldStop = () => !inside || endIsBefore();\n\n  for (let i = start, prev = start; i <= end; ++i) {\n    point = points[i % count];\n\n    if (point.skip) {\n      continue;\n    }\n\n    value = normalize(point[property]);\n\n    if (value === prevValue) {\n      continue;\n    }\n\n    inside = between(value, startBound, endBound);\n\n    if (subStart === null && shouldStart()) {\n      subStart = compare(value, startBound) === 0 ? i : prev;\n    }\n\n    if (subStart !== null && shouldStop()) {\n      result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n      subStart = null;\n    }\n    prev = i;\n    prevValue = value;\n  }\n\n  if (subStart !== null) {\n    result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n  }\n\n  return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n  const result = [];\n  const segments = line.segments;\n\n  for (let i = 0; i < segments.length; i++) {\n    const sub = _boundSegment(segments[i], line.points, bounds);\n    if (sub.length) {\n      result.push(...sub);\n    }\n  }\n  return result;\n}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n  let start = 0;\n  let end = count - 1;\n\n  if (loop && !spanGaps) {\n    // loop and not spanning gaps, first find a gap to start from\n    while (start < count && !points[start].skip) {\n      start++;\n    }\n  }\n\n  // find first non skipped point (after the first gap possibly)\n  while (start < count && points[start].skip) {\n    start++;\n  }\n\n  // if we looped to count, start needs to be 0\n  start %= count;\n\n  if (loop) {\n    // loop will go past count, if start > 0\n    end += start;\n  }\n\n  while (end > start && points[end % count].skip) {\n    end--;\n  }\n\n  // end could be more than count, normalize\n  end %= count;\n\n  return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\n */\nfunction solidSegments(points, start, max, loop) {\n  const count = points.length;\n  const result = [];\n  let last = start;\n  let prev = points[start];\n  let end;\n\n  for (end = start + 1; end <= max; ++end) {\n    const cur = points[end % count];\n    if (cur.skip || cur.stop) {\n      if (!prev.skip) {\n        loop = false;\n        result.push({start: start % count, end: (end - 1) % count, loop});\n        // @ts-ignore\n        start = last = cur.stop ? end : null;\n      }\n    } else {\n      last = end;\n      if (prev.skip) {\n        start = end;\n      }\n    }\n    prev = cur;\n  }\n\n  if (last !== null) {\n    result.push({start: start % count, end: last % count, loop});\n  }\n\n  return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n  const points = line.points;\n  const spanGaps = line.options.spanGaps;\n  const count = points.length;\n\n  if (!count) {\n    return [];\n  }\n\n  const loop = !!line._loop;\n  const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n  if (spanGaps === true) {\n    return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n  }\n\n  const max = end < start ? end + count : end;\n  const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n  return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction splitByStyles(line, segments, points, segmentOptions) {\n  if (!segmentOptions || !segmentOptions.setContext || !points) {\n    return segments;\n  }\n  return doSplitByStyles(line, segments, points, segmentOptions);\n}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n  const chartContext = line._chart.getContext();\n  const baseStyle = readStyle(line.options);\n  const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n  const count = points.length;\n  const result = [];\n  let prevStyle = baseStyle;\n  let start = segments[0].start;\n  let i = start;\n\n  function addStyle(s, e, l, st) {\n    const dir = spanGaps ? -1 : 1;\n    if (s === e) {\n      return;\n    }\n    // Style can not start/end on a skipped point, adjust indices accordingly\n    s += count;\n    while (points[s % count].skip) {\n      s -= dir;\n    }\n    while (points[e % count].skip) {\n      e += dir;\n    }\n    if (s % count !== e % count) {\n      result.push({start: s % count, end: e % count, loop: l, style: st});\n      prevStyle = st;\n      start = e % count;\n    }\n  }\n\n  for (const segment of segments) {\n    start = spanGaps ? start : segment.start;\n    let prev = points[start % count];\n    let style;\n    for (i = start + 1; i <= segment.end; i++) {\n      const pt = points[i % count];\n      style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n        type: 'segment',\n        p0: prev,\n        p1: pt,\n        p0DataIndex: (i - 1) % count,\n        p1DataIndex: i % count,\n        datasetIndex\n      })));\n      if (styleChanged(style, prevStyle)) {\n        addStyle(start, i - 1, segment.loop, prevStyle);\n      }\n      prev = pt;\n      prevStyle = style;\n    }\n    if (start < i - 1) {\n      addStyle(start, i - 1, segment.loop, prevStyle);\n    }\n  }\n\n  return result;\n}\n\nfunction readStyle(options) {\n  return {\n    backgroundColor: options.backgroundColor,\n    borderCapStyle: options.borderCapStyle,\n    borderDash: options.borderDash,\n    borderDashOffset: options.borderDashOffset,\n    borderJoinStyle: options.borderJoinStyle,\n    borderWidth: options.borderWidth,\n    borderColor: options.borderColor\n  };\n}\n\nfunction styleChanged(style, prevStyle) {\n  if (!prevStyle) {\n    return false;\n  }\n  const cache = [];\n  const replacer = function(key, value) {\n    if (!isPatternOrGradient(value)) {\n      return value;\n    }\n    if (!cache.includes(value)) {\n      cache.push(value);\n    }\n    return cache.indexOf(value);\n  };\n  return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n", "import type {Chart, ChartArea, ChartMeta, Scale, TRBL} from '../types/index.js';\n\nfunction getSizeForArea(scale: Scale, chartArea: ChartArea, field: keyof ChartArea) {\n  return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta: ChartMeta, chartArea: ChartArea): TRBL {\n  const {xScale, yScale} = meta;\n  if (xScale && yScale) {\n    return {\n      left: getSizeForArea(xScale, chartArea, 'left'),\n      right: getSizeForArea(xScale, chartArea, 'right'),\n      top: getSizeForArea(yScale, chartArea, 'top'),\n      bottom: getSizeForArea(yScale, chartArea, 'bottom')\n    };\n  }\n  return chartArea;\n}\n\nexport function getDatasetClipArea(chart: Chart, meta: ChartMeta): TRBL | false {\n  const clip = meta._clip;\n  if (clip.disabled) {\n    return false;\n  }\n  const area = getDatasetArea(meta, chart.chartArea);\n\n  return {\n    left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n    right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n    top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n    bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n  };\n}\n", "import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n  constructor() {\n    this._request = null;\n    this._charts = new Map();\n    this._running = false;\n    this._lastDate = undefined;\n  }\n\n  /**\n\t * @private\n\t */\n  _notify(chart, anims, date, type) {\n    const callbacks = anims.listeners[type];\n    const numSteps = anims.duration;\n\n    callbacks.forEach(fn => fn({\n      chart,\n      initial: anims.initial,\n      numSteps,\n      currentStep: Math.min(date - anims.start, numSteps)\n    }));\n  }\n\n  /**\n\t * @private\n\t */\n  _refresh() {\n    if (this._request) {\n      return;\n    }\n    this._running = true;\n\n    this._request = requestAnimFrame.call(window, () => {\n      this._update();\n      this._request = null;\n\n      if (this._running) {\n        this._refresh();\n      }\n    });\n  }\n\n  /**\n\t * @private\n\t */\n  _update(date = Date.now()) {\n    let remaining = 0;\n\n    this._charts.forEach((anims, chart) => {\n      if (!anims.running || !anims.items.length) {\n        return;\n      }\n      const items = anims.items;\n      let i = items.length - 1;\n      let draw = false;\n      let item;\n\n      for (; i >= 0; --i) {\n        item = items[i];\n\n        if (item._active) {\n          if (item._total > anims.duration) {\n            // if the animation has been updated and its duration prolonged,\n            // update to total duration of current animations run (for progress event)\n            anims.duration = item._total;\n          }\n          item.tick(date);\n          draw = true;\n        } else {\n          // Remove the item by replacing it with last item and removing the last\n          // A lot faster than splice.\n          items[i] = items[items.length - 1];\n          items.pop();\n        }\n      }\n\n      if (draw) {\n        chart.draw();\n        this._notify(chart, anims, date, 'progress');\n      }\n\n      if (!items.length) {\n        anims.running = false;\n        this._notify(chart, anims, date, 'complete');\n        anims.initial = false;\n      }\n\n      remaining += items.length;\n    });\n\n    this._lastDate = date;\n\n    if (remaining === 0) {\n      this._running = false;\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _getAnims(chart) {\n    const charts = this._charts;\n    let anims = charts.get(chart);\n    if (!anims) {\n      anims = {\n        running: false,\n        initial: true,\n        items: [],\n        listeners: {\n          complete: [],\n          progress: []\n        }\n      };\n      charts.set(chart, anims);\n    }\n    return anims;\n  }\n\n  /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n  listen(chart, event, cb) {\n    this._getAnims(chart).listeners[event].push(cb);\n  }\n\n  /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n  add(chart, items) {\n    if (!items || !items.length) {\n      return;\n    }\n    this._getAnims(chart).items.push(...items);\n  }\n\n  /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n  has(chart) {\n    return this._getAnims(chart).items.length > 0;\n  }\n\n  /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\n  start(chart) {\n    const anims = this._charts.get(chart);\n    if (!anims) {\n      return;\n    }\n    anims.running = true;\n    anims.start = Date.now();\n    anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n    this._refresh();\n  }\n\n  running(chart) {\n    if (!this._running) {\n      return false;\n    }\n    const anims = this._charts.get(chart);\n    if (!anims || !anims.running || !anims.items.length) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\n  stop(chart) {\n    const anims = this._charts.get(chart);\n    if (!anims || !anims.items.length) {\n      return;\n    }\n    const items = anims.items;\n    let i = items.length - 1;\n\n    for (; i >= 0; --i) {\n      items[i].cancel();\n    }\n    anims.items = [];\n    this._notify(chart, anims, Date.now(), 'complete');\n  }\n\n  /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n  remove(chart) {\n    return this._charts.delete(chart);\n  }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n", "import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n  boolean(from, to, factor) {\n    return factor > 0.5 ? to : from;\n  },\n  /**\n   * @param {string} from\n   * @param {string} to\n   * @param {number} factor\n   */\n  color(from, to, factor) {\n    const c0 = helpersColor(from || transparent);\n    const c1 = c0.valid && helpersColor(to || transparent);\n    return c1 && c1.valid\n      ? c1.mix(c0, factor).hexString()\n      : to;\n  },\n  number(from, to, factor) {\n    return from + (to - from) * factor;\n  }\n};\n\nexport default class Animation {\n  constructor(cfg, target, prop, to) {\n    const currentValue = target[prop];\n\n    to = resolve([cfg.to, to, currentValue, cfg.from]);\n    const from = resolve([cfg.from, currentValue, to]);\n\n    this._active = true;\n    this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n    this._easing = effects[cfg.easing] || effects.linear;\n    this._start = Math.floor(Date.now() + (cfg.delay || 0));\n    this._duration = this._total = Math.floor(cfg.duration);\n    this._loop = !!cfg.loop;\n    this._target = target;\n    this._prop = prop;\n    this._from = from;\n    this._to = to;\n    this._promises = undefined;\n  }\n\n  active() {\n    return this._active;\n  }\n\n  update(cfg, to, date) {\n    if (this._active) {\n      this._notify(false);\n\n      const currentValue = this._target[this._prop];\n      const elapsed = date - this._start;\n      const remain = this._duration - elapsed;\n      this._start = date;\n      this._duration = Math.floor(Math.max(remain, cfg.duration));\n      this._total += elapsed;\n      this._loop = !!cfg.loop;\n      this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n      this._from = resolve([cfg.from, currentValue, to]);\n    }\n  }\n\n  cancel() {\n    if (this._active) {\n      // update current evaluated value, for smoother animations\n      this.tick(Date.now());\n      this._active = false;\n      this._notify(false);\n    }\n  }\n\n  tick(date) {\n    const elapsed = date - this._start;\n    const duration = this._duration;\n    const prop = this._prop;\n    const from = this._from;\n    const loop = this._loop;\n    const to = this._to;\n    let factor;\n\n    this._active = from !== to && (loop || (elapsed < duration));\n\n    if (!this._active) {\n      this._target[prop] = to;\n      this._notify(true);\n      return;\n    }\n\n    if (elapsed < 0) {\n      this._target[prop] = from;\n      return;\n    }\n\n    factor = (elapsed / duration) % 2;\n    factor = loop && factor > 1 ? 2 - factor : factor;\n    factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n    this._target[prop] = this._fn(from, to, factor);\n  }\n\n  wait() {\n    const promises = this._promises || (this._promises = []);\n    return new Promise((res, rej) => {\n      promises.push({res, rej});\n    });\n  }\n\n  _notify(resolved) {\n    const method = resolved ? 'res' : 'rej';\n    const promises = this._promises || [];\n    for (let i = 0; i < promises.length; i++) {\n      promises[i][method]();\n    }\n  }\n}\n", "import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n  constructor(chart, config) {\n    this._chart = chart;\n    this._properties = new Map();\n    this.configure(config);\n  }\n\n  configure(config) {\n    if (!isObject(config)) {\n      return;\n    }\n\n    const animationOptions = Object.keys(defaults.animation);\n    const animatedProps = this._properties;\n\n    Object.getOwnPropertyNames(config).forEach(key => {\n      const cfg = config[key];\n      if (!isObject(cfg)) {\n        return;\n      }\n      const resolved = {};\n      for (const option of animationOptions) {\n        resolved[option] = cfg[option];\n      }\n\n      (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n        if (prop === key || !animatedProps.has(prop)) {\n          animatedProps.set(prop, resolved);\n        }\n      });\n    });\n  }\n\n  /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n  _animateOptions(target, values) {\n    const newOptions = values.options;\n    const options = resolveTargetOptions(target, newOptions);\n    if (!options) {\n      return [];\n    }\n\n    const animations = this._createAnimations(options, newOptions);\n    if (newOptions.$shared) {\n      // Going to shared options:\n      // After all animations are done, assign the shared options object to the element\n      // So any new updates to the shared options are observed\n      awaitAll(target.options.$animations, newOptions).then(() => {\n        target.options = newOptions;\n      }, () => {\n        // rejected, noop\n      });\n    }\n\n    return animations;\n  }\n\n  /**\n\t * @private\n\t */\n  _createAnimations(target, values) {\n    const animatedProps = this._properties;\n    const animations = [];\n    const running = target.$animations || (target.$animations = {});\n    const props = Object.keys(values);\n    const date = Date.now();\n    let i;\n\n    for (i = props.length - 1; i >= 0; --i) {\n      const prop = props[i];\n      if (prop.charAt(0) === '$') {\n        continue;\n      }\n\n      if (prop === 'options') {\n        animations.push(...this._animateOptions(target, values));\n        continue;\n      }\n      const value = values[prop];\n      let animation = running[prop];\n      const cfg = animatedProps.get(prop);\n\n      if (animation) {\n        if (cfg && animation.active()) {\n          // There is an existing active animation, let's update that\n          animation.update(cfg, value, date);\n          continue;\n        } else {\n          animation.cancel();\n        }\n      }\n      if (!cfg || !cfg.duration) {\n        // not animated, set directly to new value\n        target[prop] = value;\n        continue;\n      }\n\n      running[prop] = animation = new Animation(cfg, target, prop, value);\n      animations.push(animation);\n    }\n    return animations;\n  }\n\n\n  /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n  update(target, values) {\n    if (this._properties.size === 0) {\n      // Nothing is animated, just apply the new values.\n      Object.assign(target, values);\n      return;\n    }\n\n    const animations = this._createAnimations(target, values);\n\n    if (animations.length) {\n      animator.add(this._chart, animations);\n      return true;\n    }\n  }\n}\n\nfunction awaitAll(animations, properties) {\n  const running = [];\n  const keys = Object.keys(properties);\n  for (let i = 0; i < keys.length; i++) {\n    const anim = animations[keys[i]];\n    if (anim && anim.active()) {\n      running.push(anim.wait());\n    }\n  }\n  // @ts-ignore\n  return Promise.all(running);\n}\n\nfunction resolveTargetOptions(target, newOptions) {\n  if (!newOptions) {\n    return;\n  }\n  let options = target.options;\n  if (!options) {\n    target.options = newOptions;\n    return;\n  }\n  if (options.$shared) {\n    // Going from shared options to distinct one:\n    // Create new options object containing the old shared values and start updating that.\n    target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n  }\n  return options;\n}\n", "import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\n */\n\nfunction scaleClip(scale, allowedOverflow) {\n  const opts = scale && scale.options || {};\n  const reverse = opts.reverse;\n  const min = opts.min === undefined ? allowedOverflow : 0;\n  const max = opts.max === undefined ? allowedOverflow : 0;\n  return {\n    start: reverse ? max : min,\n    end: reverse ? min : max\n  };\n}\n\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n  if (allowedOverflow === false) {\n    return false;\n  }\n  const x = scaleClip(xScale, allowedOverflow);\n  const y = scaleClip(yScale, allowedOverflow);\n\n  return {\n    top: y.end,\n    right: x.end,\n    bottom: y.start,\n    left: x.start\n  };\n}\n\nfunction toClip(value) {\n  let t, r, b, l;\n\n  if (isObject(value)) {\n    t = value.top;\n    r = value.right;\n    b = value.bottom;\n    l = value.left;\n  } else {\n    t = r = b = l = value;\n  }\n\n  return {\n    top: t,\n    right: r,\n    bottom: b,\n    left: l,\n    disabled: value === false\n  };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n  const keys = [];\n  const metasets = chart._getSortedDatasetMetas(filterVisible);\n  let i, ilen;\n\n  for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n    keys.push(metasets[i].index);\n  }\n  return keys;\n}\n\nfunction applyStack(stack, value, dsIndex, options = {}) {\n  const keys = stack.keys;\n  const singleMode = options.mode === 'single';\n  let i, ilen, datasetIndex, otherValue;\n\n  if (value === null) {\n    return;\n  }\n\n  let found = false;\n  for (i = 0, ilen = keys.length; i < ilen; ++i) {\n    datasetIndex = +keys[i];\n    if (datasetIndex === dsIndex) {\n      found = true;\n      if (options.all) {\n        continue;\n      }\n      break;\n    }\n    otherValue = stack.values[datasetIndex];\n    if (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n      value += otherValue;\n    }\n  }\n\n  if (!found && !options.all) {\n    return 0;\n  }\n\n  return value;\n}\n\nfunction convertObjectDataToArray(data, meta) {\n  const {iScale, vScale} = meta;\n  const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n  const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n  const keys = Object.keys(data);\n  const adata = new Array(keys.length);\n  let i, ilen, key;\n  for (i = 0, ilen = keys.length; i < ilen; ++i) {\n    key = keys[i];\n    adata[i] = {\n      [iAxisKey]: key,\n      [vAxisKey]: data[key]\n    };\n  }\n  return adata;\n}\n\nfunction isStacked(scale, meta) {\n  const stacked = scale && scale.options.stacked;\n  return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n  return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\n\nfunction getUserBounds(scale) {\n  const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n  return {\n    min: minDefined ? min : Number.NEGATIVE_INFINITY,\n    max: maxDefined ? max : Number.POSITIVE_INFINITY\n  };\n}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n  const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n  return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n  for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n    const value = stack[meta.index];\n    if ((positive && value > 0) || (!positive && value < 0)) {\n      return meta.index;\n    }\n  }\n\n  return null;\n}\n\nfunction updateStacks(controller, parsed) {\n  const {chart, _cachedMeta: meta} = controller;\n  const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\n  const {iScale, vScale, index: datasetIndex} = meta;\n  const iAxis = iScale.axis;\n  const vAxis = vScale.axis;\n  const key = getStackKey(iScale, vScale, meta);\n  const ilen = parsed.length;\n  let stack;\n\n  for (let i = 0; i < ilen; ++i) {\n    const item = parsed[i];\n    const {[iAxis]: index, [vAxis]: value} = item;\n    const itemStacks = item._stacks || (item._stacks = {});\n    stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n    stack[datasetIndex] = value;\n\n    stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n    stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n    const visualValues = stack._visualValues || (stack._visualValues = {});\n    visualValues[datasetIndex] = value;\n  }\n}\n\nfunction getFirstScaleId(chart, axis) {\n  const scales = chart.scales;\n  return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n  return createContext(parent,\n    {\n      active: false,\n      dataset: undefined,\n      datasetIndex: index,\n      index,\n      mode: 'default',\n      type: 'dataset'\n    }\n  );\n}\n\nfunction createDataContext(parent, index, element) {\n  return createContext(parent, {\n    active: false,\n    dataIndex: index,\n    parsed: undefined,\n    raw: undefined,\n    element,\n    index,\n    mode: 'default',\n    type: 'data'\n  });\n}\n\nfunction clearStacks(meta, items) {\n  // Not using meta.index here, because it might be already updated if the dataset changed location\n  const datasetIndex = meta.controller.index;\n  const axis = meta.vScale && meta.vScale.axis;\n  if (!axis) {\n    return;\n  }\n\n  items = items || meta._parsed;\n  for (const parsed of items) {\n    const stacks = parsed._stacks;\n    if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n      return;\n    }\n    delete stacks[axis][datasetIndex];\n    if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n      delete stacks[axis]._visualValues[datasetIndex];\n    }\n  }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n  && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n  /**\n   * @type {any}\n   */\n  static defaults = {};\n\n  /**\n   * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n   */\n  static datasetElementType = null;\n\n  /**\n   * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n   */\n  static dataElementType = null;\n\n  /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\n  constructor(chart, datasetIndex) {\n    this.chart = chart;\n    this._ctx = chart.ctx;\n    this.index = datasetIndex;\n    this._cachedDataOpts = {};\n    this._cachedMeta = this.getMeta();\n    this._type = this._cachedMeta.type;\n    this.options = undefined;\n    /** @type {boolean | object} */\n    this._parsing = false;\n    this._data = undefined;\n    this._objectData = undefined;\n    this._sharedOptions = undefined;\n    this._drawStart = undefined;\n    this._drawCount = undefined;\n    this.enableOptionSharing = false;\n    this.supportsDecimation = false;\n    this.$context = undefined;\n    this._syncList = [];\n    this.datasetElementType = new.target.datasetElementType;\n    this.dataElementType = new.target.dataElementType;\n\n    this.initialize();\n  }\n\n  initialize() {\n    const meta = this._cachedMeta;\n    this.configure();\n    this.linkScales();\n    meta._stacked = isStacked(meta.vScale, meta);\n    this.addElements();\n\n    if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n      console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n    }\n  }\n\n  updateIndex(datasetIndex) {\n    if (this.index !== datasetIndex) {\n      clearStacks(this._cachedMeta);\n    }\n    this.index = datasetIndex;\n  }\n\n  linkScales() {\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const dataset = this.getDataset();\n\n    const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\n    const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n    const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n    const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n    const indexAxis = meta.indexAxis;\n    const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n    const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n    meta.xScale = this.getScaleForId(xid);\n    meta.yScale = this.getScaleForId(yid);\n    meta.rScale = this.getScaleForId(rid);\n    meta.iScale = this.getScaleForId(iid);\n    meta.vScale = this.getScaleForId(vid);\n  }\n\n  getDataset() {\n    return this.chart.data.datasets[this.index];\n  }\n\n  getMeta() {\n    return this.chart.getDatasetMeta(this.index);\n  }\n\n  /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n  getScaleForId(scaleID) {\n    return this.chart.scales[scaleID];\n  }\n\n  /**\n\t * @private\n\t */\n  _getOtherScale(scale) {\n    const meta = this._cachedMeta;\n    return scale === meta.iScale\n      ? meta.vScale\n      : meta.iScale;\n  }\n\n  reset() {\n    this._update('reset');\n  }\n\n  /**\n\t * @private\n\t */\n  _destroy() {\n    const meta = this._cachedMeta;\n    if (this._data) {\n      unlistenArrayEvents(this._data, this);\n    }\n    if (meta._stacked) {\n      clearStacks(meta);\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _dataCheck() {\n    const dataset = this.getDataset();\n    const data = dataset.data || (dataset.data = []);\n    const _data = this._data;\n\n    // In order to correctly handle data addition/deletion animation (and thus simulate\n    // real-time charts), we need to monitor these data modifications and synchronize\n    // the internal metadata accordingly.\n\n    if (isObject(data)) {\n      const meta = this._cachedMeta;\n      this._data = convertObjectDataToArray(data, meta);\n    } else if (_data !== data) {\n      if (_data) {\n        // This case happens when the user replaced the data array instance.\n        unlistenArrayEvents(_data, this);\n        // Discard old parsed data and stacks\n        const meta = this._cachedMeta;\n        clearStacks(meta);\n        meta._parsed = [];\n      }\n      if (data && Object.isExtensible(data)) {\n        listenArrayEvents(data, this);\n      }\n      this._syncList = [];\n      this._data = data;\n    }\n  }\n\n  addElements() {\n    const meta = this._cachedMeta;\n\n    this._dataCheck();\n\n    if (this.datasetElementType) {\n      meta.dataset = new this.datasetElementType();\n    }\n  }\n\n  buildOrUpdateElements(resetNewElements) {\n    const meta = this._cachedMeta;\n    const dataset = this.getDataset();\n    let stackChanged = false;\n\n    this._dataCheck();\n\n    // make sure cached _stacked status is current\n    const oldStacked = meta._stacked;\n    meta._stacked = isStacked(meta.vScale, meta);\n\n    // detect change in stack option\n    if (meta.stack !== dataset.stack) {\n      stackChanged = true;\n      // remove values from old stack\n      clearStacks(meta);\n      meta.stack = dataset.stack;\n    }\n\n    // Re-sync meta data in case the user replaced the data array or if we missed\n    // any updates and so make sure that we handle number of datapoints changing.\n    this._resyncElements(resetNewElements);\n\n    // if stack changed, update stack values for the whole dataset\n    if (stackChanged || oldStacked !== meta._stacked) {\n      updateStacks(this, meta._parsed);\n      meta._stacked = isStacked(meta.vScale, meta);\n    }\n  }\n\n  /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n  configure() {\n    const config = this.chart.config;\n    const scopeKeys = config.datasetScopeKeys(this._type);\n    const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n    this.options = config.createResolver(scopes, this.getContext());\n    this._parsing = this.options.parsing;\n    this._cachedDataOpts = {};\n  }\n\n  /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n  parse(start, count) {\n    const {_cachedMeta: meta, _data: data} = this;\n    const {iScale, _stacked} = meta;\n    const iAxis = iScale.axis;\n\n    let sorted = start === 0 && count === data.length ? true : meta._sorted;\n    let prev = start > 0 && meta._parsed[start - 1];\n    let i, cur, parsed;\n\n    if (this._parsing === false) {\n      meta._parsed = data;\n      meta._sorted = true;\n      parsed = data;\n    } else {\n      if (isArray(data[start])) {\n        parsed = this.parseArrayData(meta, data, start, count);\n      } else if (isObject(data[start])) {\n        parsed = this.parseObjectData(meta, data, start, count);\n      } else {\n        parsed = this.parsePrimitiveData(meta, data, start, count);\n      }\n\n      const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n      for (i = 0; i < count; ++i) {\n        meta._parsed[i + start] = cur = parsed[i];\n        if (sorted) {\n          if (isNotInOrderComparedToPrev()) {\n            sorted = false;\n          }\n          prev = cur;\n        }\n      }\n      meta._sorted = sorted;\n    }\n\n    if (_stacked) {\n      updateStacks(this, parsed);\n    }\n  }\n\n  /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\n  parsePrimitiveData(meta, data, start, count) {\n    const {iScale, vScale} = meta;\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const labels = iScale.getLabels();\n    const singleScale = iScale === vScale;\n    const parsed = new Array(count);\n    let i, ilen, index;\n\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      parsed[i] = {\n        [iAxis]: singleScale || iScale.parse(labels[index], index),\n        [vAxis]: vScale.parse(data[index], index)\n      };\n    }\n    return parsed;\n  }\n\n  /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n  parseArrayData(meta, data, start, count) {\n    const {xScale, yScale} = meta;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      item = data[index];\n      parsed[i] = {\n        x: xScale.parse(item[0], index),\n        y: yScale.parse(item[1], index)\n      };\n    }\n    return parsed;\n  }\n\n  /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\n  parseObjectData(meta, data, start, count) {\n    const {xScale, yScale} = meta;\n    const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      item = data[index];\n      parsed[i] = {\n        x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n        y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n      };\n    }\n    return parsed;\n  }\n\n  /**\n\t * @protected\n\t */\n  getParsed(index) {\n    return this._cachedMeta._parsed[index];\n  }\n\n  /**\n\t * @protected\n\t */\n  getDataElement(index) {\n    return this._cachedMeta.data[index];\n  }\n\n  /**\n\t * @protected\n\t */\n  applyStack(scale, parsed, mode) {\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const value = parsed[scale.axis];\n    const stack = {\n      keys: getSortedDatasetIndices(chart, true),\n      values: parsed._stacks[scale.axis]._visualValues\n    };\n    return applyStack(stack, value, meta.index, {mode});\n  }\n\n  /**\n\t * @protected\n\t */\n  updateRangeFromParsed(range, scale, parsed, stack) {\n    const parsedValue = parsed[scale.axis];\n    let value = parsedValue === null ? NaN : parsedValue;\n    const values = stack && parsed._stacks[scale.axis];\n    if (stack && values) {\n      stack.values = values;\n      value = applyStack(stack, parsedValue, this._cachedMeta.index);\n    }\n    range.min = Math.min(range.min, value);\n    range.max = Math.max(range.max, value);\n  }\n\n  /**\n\t * @protected\n\t */\n  getMinMax(scale, canStack) {\n    const meta = this._cachedMeta;\n    const _parsed = meta._parsed;\n    const sorted = meta._sorted && scale === meta.iScale;\n    const ilen = _parsed.length;\n    const otherScale = this._getOtherScale(scale);\n    const stack = createStack(canStack, meta, this.chart);\n    const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n    const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n    let i, parsed;\n\n    function _skip() {\n      parsed = _parsed[i];\n      const otherValue = parsed[otherScale.axis];\n      return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n    }\n\n    for (i = 0; i < ilen; ++i) {\n      if (_skip()) {\n        continue;\n      }\n      this.updateRangeFromParsed(range, scale, parsed, stack);\n      if (sorted) {\n        // if the data is sorted, we don't need to check further from this end of array\n        break;\n      }\n    }\n    if (sorted) {\n      // in the sorted case, find first non-skipped value from other end of array\n      for (i = ilen - 1; i >= 0; --i) {\n        if (_skip()) {\n          continue;\n        }\n        this.updateRangeFromParsed(range, scale, parsed, stack);\n        break;\n      }\n    }\n    return range;\n  }\n\n  getAllParsedValues(scale) {\n    const parsed = this._cachedMeta._parsed;\n    const values = [];\n    let i, ilen, value;\n\n    for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n      value = parsed[i][scale.axis];\n      if (isFinite(value)) {\n        values.push(value);\n      }\n    }\n    return values;\n  }\n\n  /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n  getMaxOverflow() {\n    return false;\n  }\n\n  /**\n\t * @protected\n\t */\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const vScale = meta.vScale;\n    const parsed = this.getParsed(index);\n    return {\n      label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n      value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n    };\n  }\n\n  /**\n\t * @private\n\t */\n  _update(mode) {\n    const meta = this._cachedMeta;\n    this.update(mode || 'default');\n    meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n  }\n\n  /**\n\t * @param {string} mode\n\t */\n  update(mode) {} // eslint-disable-line no-unused-vars\n\n  draw() {\n    const ctx = this._ctx;\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const elements = meta.data || [];\n    const area = chart.chartArea;\n    const active = [];\n    const start = this._drawStart || 0;\n    const count = this._drawCount || (elements.length - start);\n    const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n    let i;\n\n    if (meta.dataset) {\n      meta.dataset.draw(ctx, area, start, count);\n    }\n\n    for (i = start; i < start + count; ++i) {\n      const element = elements[i];\n      if (element.hidden) {\n        continue;\n      }\n      if (element.active && drawActiveElementsOnTop) {\n        active.push(element);\n      } else {\n        element.draw(ctx, area);\n      }\n    }\n\n    for (i = 0; i < active.length; ++i) {\n      active[i].draw(ctx, area);\n    }\n  }\n\n  /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\n  getStyle(index, active) {\n    const mode = active ? 'active' : 'default';\n    return index === undefined && this._cachedMeta.dataset\n      ? this.resolveDatasetElementOptions(mode)\n      : this.resolveDataElementOptions(index || 0, mode);\n  }\n\n  /**\n\t * @protected\n\t */\n  getContext(index, active, mode) {\n    const dataset = this.getDataset();\n    let context;\n    if (index >= 0 && index < this._cachedMeta.data.length) {\n      const element = this._cachedMeta.data[index];\n      context = element.$context ||\n        (element.$context = createDataContext(this.getContext(), index, element));\n      context.parsed = this.getParsed(index);\n      context.raw = dataset.data[index];\n      context.index = context.dataIndex = index;\n    } else {\n      context = this.$context ||\n        (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n      context.dataset = dataset;\n      context.index = context.datasetIndex = this.index;\n    }\n\n    context.active = !!active;\n    context.mode = mode;\n    return context;\n  }\n\n  /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n  resolveDatasetElementOptions(mode) {\n    return this._resolveElementOptions(this.datasetElementType.id, mode);\n  }\n\n  /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n  resolveDataElementOptions(index, mode) {\n    return this._resolveElementOptions(this.dataElementType.id, mode, index);\n  }\n\n  /**\n\t * @private\n\t */\n  _resolveElementOptions(elementType, mode = 'default', index) {\n    const active = mode === 'active';\n    const cache = this._cachedDataOpts;\n    const cacheKey = elementType + '-' + mode;\n    const cached = cache[cacheKey];\n    const sharing = this.enableOptionSharing && defined(index);\n    if (cached) {\n      return cloneIfNotShared(cached, sharing);\n    }\n    const config = this.chart.config;\n    const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n    const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n    const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n    const names = Object.keys(defaults.elements[elementType]);\n    // context is provided as a function, and is called only if needed,\n    // so we don't create a context for each element if not needed.\n    const context = () => this.getContext(index, active, mode);\n    const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n    if (values.$shared) {\n      // `$shared` indicates this set of options can be shared between multiple elements.\n      // Sharing is used to reduce number of properties to change during animation.\n      values.$shared = sharing;\n\n      // We cache options by `mode`, which can be 'active' for example. This enables us\n      // to have the 'active' element options and 'default' options to switch between\n      // when interacting.\n      cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n    }\n\n    return values;\n  }\n\n\n  /**\n\t * @private\n\t */\n  _resolveAnimations(index, transition, active) {\n    const chart = this.chart;\n    const cache = this._cachedDataOpts;\n    const cacheKey = `animation-${transition}`;\n    const cached = cache[cacheKey];\n    if (cached) {\n      return cached;\n    }\n    let options;\n    if (chart.options.animation !== false) {\n      const config = this.chart.config;\n      const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n      const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n      options = config.createResolver(scopes, this.getContext(index, active, transition));\n    }\n    const animations = new Animations(chart, options && options.animations);\n    if (options && options._cacheable) {\n      cache[cacheKey] = Object.freeze(animations);\n    }\n    return animations;\n  }\n\n  /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n  getSharedOptions(options) {\n    if (!options.$shared) {\n      return;\n    }\n    return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n  }\n\n  /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n  includeOptions(mode, sharedOptions) {\n    return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n  }\n\n  /**\n   * @todo v4, rename to getSharedOptions and remove excess functions\n   */\n  _getSharedOptions(start, mode) {\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const previouslySharedOptions = this._sharedOptions;\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n    return {sharedOptions, includeOptions};\n  }\n\n  /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\n  updateElement(element, index, properties, mode) {\n    if (isDirectUpdateMode(mode)) {\n      Object.assign(element, properties);\n    } else {\n      this._resolveAnimations(index, mode).update(element, properties);\n    }\n  }\n\n  /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n  updateSharedOptions(sharedOptions, mode, newOptions) {\n    if (sharedOptions && !isDirectUpdateMode(mode)) {\n      this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _setStyle(element, index, mode, active) {\n    element.active = active;\n    const options = this.getStyle(index, active);\n    this._resolveAnimations(index, mode, active).update(element, {\n      // When going from active to inactive, we need to update to the shared options.\n      // This way the once hovered element will end up with the same original shared options instance, after animation.\n      options: (!active && this.getSharedOptions(options)) || options\n    });\n  }\n\n  removeHoverStyle(element, datasetIndex, index) {\n    this._setStyle(element, index, 'active', false);\n  }\n\n  setHoverStyle(element, datasetIndex, index) {\n    this._setStyle(element, index, 'active', true);\n  }\n\n  /**\n\t * @private\n\t */\n  _removeDatasetHoverStyle() {\n    const element = this._cachedMeta.dataset;\n\n    if (element) {\n      this._setStyle(element, undefined, 'active', false);\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _setDatasetHoverStyle() {\n    const element = this._cachedMeta.dataset;\n\n    if (element) {\n      this._setStyle(element, undefined, 'active', true);\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _resyncElements(resetNewElements) {\n    const data = this._data;\n    const elements = this._cachedMeta.data;\n\n    // Apply changes detected through array listeners\n    for (const [method, arg1, arg2] of this._syncList) {\n      this[method](arg1, arg2);\n    }\n    this._syncList = [];\n\n    const numMeta = elements.length;\n    const numData = data.length;\n    const count = Math.min(numData, numMeta);\n\n    if (count) {\n      // TODO: It is not optimal to always parse the old data\n      // This is done because we are not detecting direct assignments:\n      // chart.data.datasets[0].data[5] = 10;\n      // chart.data.datasets[0].data[5].y = 10;\n      this.parse(0, count);\n    }\n\n    if (numData > numMeta) {\n      this._insertElements(numMeta, numData - numMeta, resetNewElements);\n    } else if (numData < numMeta) {\n      this._removeElements(numData, numMeta - numData);\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _insertElements(start, count, resetNewElements = true) {\n    const meta = this._cachedMeta;\n    const data = meta.data;\n    const end = start + count;\n    let i;\n\n    const move = (arr) => {\n      arr.length += count;\n      for (i = arr.length - 1; i >= end; i--) {\n        arr[i] = arr[i - count];\n      }\n    };\n    move(data);\n\n    for (i = start; i < end; ++i) {\n      data[i] = new this.dataElementType();\n    }\n\n    if (this._parsing) {\n      move(meta._parsed);\n    }\n    this.parse(start, count);\n\n    if (resetNewElements) {\n      this.updateElements(data, start, count, 'reset');\n    }\n  }\n\n  updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n  /**\n\t * @private\n\t */\n  _removeElements(start, count) {\n    const meta = this._cachedMeta;\n    if (this._parsing) {\n      const removed = meta._parsed.splice(start, count);\n      if (meta._stacked) {\n        clearStacks(meta, removed);\n      }\n    }\n    meta.data.splice(start, count);\n  }\n\n  /**\n\t * @private\n   */\n  _sync(args) {\n    if (this._parsing) {\n      this._syncList.push(args);\n    } else {\n      const [method, arg1, arg2] = args;\n      this[method](arg1, arg2);\n    }\n    this.chart._dataChanges.push([this.index, ...args]);\n  }\n\n  _onDataPush() {\n    const count = arguments.length;\n    this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n  }\n\n  _onDataPop() {\n    this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n  }\n\n  _onDataShift() {\n    this._sync(['_removeElements', 0, 1]);\n  }\n\n  _onDataSplice(start, count) {\n    if (count) {\n      this._sync(['_removeElements', start, count]);\n    }\n    const newCount = arguments.length - 2;\n    if (newCount) {\n      this._sync(['_insertElements', start, newCount]);\n    }\n  }\n\n  _onDataUnshift() {\n    this._sync(['_insertElements', 0, arguments.length]);\n  }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {\n  _arrayUnique, isArray, isNullOrUndef,\n  valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n  if (!scale._cache.$bar) {\n    const visibleMetas = scale.getMatchingVisibleMetas(type);\n    let values = [];\n\n    for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n      values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n    }\n    scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n  }\n  return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n  const scale = meta.iScale;\n  const values = getAllScaleValues(scale, meta.type);\n  let min = scale._length;\n  let i, ilen, curr, prev;\n  const updateMinAndPrev = () => {\n    if (curr === 32767 || curr === -32768) {\n      // Ignore truncated pixels\n      return;\n    }\n    if (defined(prev)) {\n      // curr - prev === 0 is ignored\n      min = Math.min(min, Math.abs(curr - prev) || min);\n    }\n    prev = curr;\n  };\n\n  for (i = 0, ilen = values.length; i < ilen; ++i) {\n    curr = scale.getPixelForValue(values[i]);\n    updateMinAndPrev();\n  }\n\n  prev = undefined;\n  for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n    curr = scale.getPixelForTick(i);\n    updateMinAndPrev();\n  }\n\n  return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n  const thickness = options.barThickness;\n  let size, ratio;\n\n  if (isNullOrUndef(thickness)) {\n    size = ruler.min * options.categoryPercentage;\n    ratio = options.barPercentage;\n  } else {\n    // When bar thickness is enforced, category and bar percentages are ignored.\n    // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n    // and deprecate barPercentage since this value is ignored when thickness is absolute.\n    size = thickness * stackCount;\n    ratio = 1;\n  }\n\n  return {\n    chunk: size / stackCount,\n    ratio,\n    start: ruler.pixels[index] - (size / 2)\n  };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n  const pixels = ruler.pixels;\n  const curr = pixels[index];\n  let prev = index > 0 ? pixels[index - 1] : null;\n  let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n  const percent = options.categoryPercentage;\n\n  if (prev === null) {\n    // first data: its size is double based on the next point or,\n    // if it's also the last data, we use the scale size.\n    prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n  }\n\n  if (next === null) {\n    // last data: its size is also double based on the previous point.\n    next = curr + curr - prev;\n  }\n\n  const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n  const size = Math.abs(next - prev) / 2 * percent;\n\n  return {\n    chunk: size / stackCount,\n    ratio: options.barPercentage,\n    start\n  };\n}\n\nfunction parseFloatBar(entry, item, vScale, i) {\n  const startValue = vScale.parse(entry[0], i);\n  const endValue = vScale.parse(entry[1], i);\n  const min = Math.min(startValue, endValue);\n  const max = Math.max(startValue, endValue);\n  let barStart = min;\n  let barEnd = max;\n\n  if (Math.abs(min) > Math.abs(max)) {\n    barStart = max;\n    barEnd = min;\n  }\n\n  // Store `barEnd` (furthest away from origin) as parsed value,\n  // to make stacking straight forward\n  item[vScale.axis] = barEnd;\n\n  item._custom = {\n    barStart,\n    barEnd,\n    start: startValue,\n    end: endValue,\n    min,\n    max\n  };\n}\n\nfunction parseValue(entry, item, vScale, i) {\n  if (isArray(entry)) {\n    parseFloatBar(entry, item, vScale, i);\n  } else {\n    item[vScale.axis] = vScale.parse(entry, i);\n  }\n  return item;\n}\n\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n  const iScale = meta.iScale;\n  const vScale = meta.vScale;\n  const labels = iScale.getLabels();\n  const singleScale = iScale === vScale;\n  const parsed = [];\n  let i, ilen, item, entry;\n\n  for (i = start, ilen = start + count; i < ilen; ++i) {\n    entry = data[i];\n    item = {};\n    item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n    parsed.push(parseValue(entry, item, vScale, i));\n  }\n  return parsed;\n}\n\nfunction isFloatBar(custom) {\n  return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\n\nfunction barSign(size, vScale, actualBase) {\n  if (size !== 0) {\n    return sign(size);\n  }\n  return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\n\nfunction borderProps(properties) {\n  let reverse, start, end, top, bottom;\n  if (properties.horizontal) {\n    reverse = properties.base > properties.x;\n    start = 'left';\n    end = 'right';\n  } else {\n    reverse = properties.base < properties.y;\n    start = 'bottom';\n    end = 'top';\n  }\n  if (reverse) {\n    top = 'end';\n    bottom = 'start';\n  } else {\n    top = 'start';\n    bottom = 'end';\n  }\n  return {start, end, reverse, top, bottom};\n}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n  let edge = options.borderSkipped;\n  const res = {};\n\n  if (!edge) {\n    properties.borderSkipped = res;\n    return;\n  }\n\n  if (edge === true) {\n    properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n    return;\n  }\n\n  const {start, end, reverse, top, bottom} = borderProps(properties);\n\n  if (edge === 'middle' && stack) {\n    properties.enableBorderRadius = true;\n    if ((stack._top || 0) === index) {\n      edge = top;\n    } else if ((stack._bottom || 0) === index) {\n      edge = bottom;\n    } else {\n      res[parseEdge(bottom, start, end, reverse)] = true;\n      edge = top;\n    }\n  }\n\n  res[parseEdge(edge, start, end, reverse)] = true;\n  properties.borderSkipped = res;\n}\n\nfunction parseEdge(edge, a, b, reverse) {\n  if (reverse) {\n    edge = swap(edge, a, b);\n    edge = startEnd(edge, b, a);\n  } else {\n    edge = startEnd(edge, a, b);\n  }\n  return edge;\n}\n\nfunction swap(orig, v1, v2) {\n  return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n  return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n  properties.inflateAmount = inflateAmount === 'auto'\n    ? ratio === 1 ? 0.33 : 0\n    : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n  static id = 'bar';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    datasetElementType: false,\n    dataElementType: 'bar',\n\n    categoryPercentage: 0.8,\n    barPercentage: 0.9,\n    grouped: true,\n\n    animations: {\n      numbers: {\n        type: 'number',\n        properties: ['x', 'y', 'base', 'width', 'height']\n      }\n    }\n  };\n\n  /**\n   * @type {any}\n   */\n  static overrides = {\n    scales: {\n      _index_: {\n        type: 'category',\n        offset: true,\n        grid: {\n          offset: true\n        }\n      },\n      _value_: {\n        type: 'linear',\n        beginAtZero: true,\n      }\n    }\n  };\n\n\n  /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n  parsePrimitiveData(meta, data, start, count) {\n    return parseArrayOrPrimitive(meta, data, start, count);\n  }\n\n  /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n  parseArrayData(meta, data, start, count) {\n    return parseArrayOrPrimitive(meta, data, start, count);\n  }\n\n  /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\n  parseObjectData(meta, data, start, count) {\n    const {iScale, vScale} = meta;\n    const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n    const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n    const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n    const parsed = [];\n    let i, ilen, item, obj;\n    for (i = start, ilen = start + count; i < ilen; ++i) {\n      obj = data[i];\n      item = {};\n      item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n      parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n    }\n    return parsed;\n  }\n\n  /**\n\t * @protected\n\t */\n  updateRangeFromParsed(range, scale, parsed, stack) {\n    super.updateRangeFromParsed(range, scale, parsed, stack);\n    const custom = parsed._custom;\n    if (custom && scale === this._cachedMeta.vScale) {\n      // float bar: only one end of the bar is considered by `super`\n      range.min = Math.min(range.min, custom.min);\n      range.max = Math.max(range.max, custom.max);\n    }\n  }\n\n  /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n  getMaxOverflow() {\n    return 0;\n  }\n\n  /**\n\t * @protected\n\t */\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const {iScale, vScale} = meta;\n    const parsed = this.getParsed(index);\n    const custom = parsed._custom;\n    const value = isFloatBar(custom)\n      ? '[' + custom.start + ', ' + custom.end + ']'\n      : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n    return {\n      label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n      value\n    };\n  }\n\n  initialize() {\n    this.enableOptionSharing = true;\n\n    super.initialize();\n\n    const meta = this._cachedMeta;\n    meta.stack = this.getDataset().stack;\n  }\n\n  update(mode) {\n    const meta = this._cachedMeta;\n    this.updateElements(meta.data, 0, meta.data.length, mode);\n  }\n\n  updateElements(bars, start, count, mode) {\n    const reset = mode === 'reset';\n    const {index, _cachedMeta: {vScale}} = this;\n    const base = vScale.getBasePixel();\n    const horizontal = vScale.isHorizontal();\n    const ruler = this._getRuler();\n    const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n    for (let i = start; i < start + count; i++) {\n      const parsed = this.getParsed(i);\n      const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n      const ipixels = this._calculateBarIndexPixels(i, ruler);\n      const stack = (parsed._stacks || {})[vScale.axis];\n\n      const properties = {\n        horizontal,\n        base: vpixels.base,\n        enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n        x: horizontal ? vpixels.head : ipixels.center,\n        y: horizontal ? ipixels.center : vpixels.head,\n        height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n        width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n      };\n\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n      }\n      const options = properties.options || bars[i].options;\n      setBorderSkipped(properties, options, stack, index);\n      setInflateAmount(properties, options, ruler.ratio);\n      this.updateElement(bars[i], i, properties, mode);\n    }\n  }\n\n  /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n  _getStacks(last, dataIndex) {\n    const {iScale} = this._cachedMeta;\n    const metasets = iScale.getMatchingVisibleMetas(this._type)\n      .filter(meta => meta.controller.options.grouped);\n    const stacked = iScale.options.stacked;\n    const stacks = [];\n    const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n    const iScaleValue = currentParsed && currentParsed[iScale.axis];\n\n    const skipNull = (meta) => {\n      const parsed = meta._parsed.find(item => item[iScale.axis] === iScaleValue);\n      const val = parsed && parsed[meta.vScale.axis];\n\n      if (isNullOrUndef(val) || isNaN(val)) {\n        return true;\n      }\n    };\n\n    for (const meta of metasets) {\n      if (dataIndex !== undefined && skipNull(meta)) {\n        continue;\n      }\n\n      // stacked   | meta.stack\n      //           | found | not found | undefined\n      // false     |   x   |     x     |     x\n      // true      |       |     x     |\n      // undefined |       |     x     |     x\n      if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n        stacks.push(meta.stack);\n      }\n      if (meta.index === last) {\n        break;\n      }\n    }\n\n    // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n    // stack where possible invisible bars will be located.\n    // https://github.com/chartjs/Chart.js/issues/6368\n    if (!stacks.length) {\n      stacks.push(undefined);\n    }\n\n    return stacks;\n  }\n\n  /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n  _getStackCount(index) {\n    return this._getStacks(undefined, index).length;\n  }\n\n  _getAxisCount() {\n    return this._getAxis().length;\n  }\n\n  getFirstScaleIdForIndexAxis() {\n    const scales = this.chart.scales;\n    const indexScaleId = this.chart.options.indexAxis;\n    return Object.keys(scales).filter(key => scales[key].axis === indexScaleId).shift();\n  }\n\n  _getAxis() {\n    const axis = {};\n    const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n    for (const dataset of this.chart.data.datasets) {\n      axis[valueOrDefault(\n        this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId\n      )] = true;\n    }\n    return Object.keys(axis);\n  }\n\n  /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n   * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n  _getStackIndex(datasetIndex, name, dataIndex) {\n    const stacks = this._getStacks(datasetIndex, dataIndex);\n    const index = (name !== undefined)\n      ? stacks.indexOf(name)\n      : -1; // indexOf returns -1 if element is not present\n\n    return (index === -1)\n      ? stacks.length - 1\n      : index;\n  }\n\n  /**\n\t * @private\n\t */\n  _getRuler() {\n    const opts = this.options;\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const pixels = [];\n    let i, ilen;\n\n    for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n      pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n    }\n\n    const barThickness = opts.barThickness;\n    const min = barThickness || computeMinSampleSize(meta);\n\n    return {\n      min,\n      pixels,\n      start: iScale._startPixel,\n      end: iScale._endPixel,\n      stackCount: this._getStackCount(),\n      scale: iScale,\n      grouped: opts.grouped,\n      // bar thickness ratio used for non-grouped bars\n      ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n    };\n  }\n\n  /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n  _calculateBarValuePixels(index) {\n    const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n    const actualBase = baseValue || 0;\n    const parsed = this.getParsed(index);\n    const custom = parsed._custom;\n    const floating = isFloatBar(custom);\n    let value = parsed[vScale.axis];\n    let start = 0;\n    let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n    let head, size;\n\n    if (length !== value) {\n      start = length - value;\n      length = value;\n    }\n\n    if (floating) {\n      value = custom.barStart;\n      length = custom.barEnd - custom.barStart;\n      // bars crossing origin are not stacked\n      if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n        start = 0;\n      }\n      start += value;\n    }\n\n    const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n    let base = vScale.getPixelForValue(startValue);\n\n    if (this.chart.getDataVisibility(index)) {\n      head = vScale.getPixelForValue(start + length);\n    } else {\n      // When not visible, no height\n      head = base;\n    }\n\n    size = head - base;\n\n    if (Math.abs(size) < minBarLength) {\n      size = barSign(size, vScale, actualBase) * minBarLength;\n      if (value === actualBase) {\n        base -= size / 2;\n      }\n      const startPixel = vScale.getPixelForDecimal(0);\n      const endPixel = vScale.getPixelForDecimal(1);\n      const min = Math.min(startPixel, endPixel);\n      const max = Math.max(startPixel, endPixel);\n      base = Math.max(Math.min(base, max), min);\n      head = base + size;\n\n      if (_stacked && !floating) {\n        // visual data coordinates after applying minBarLength\n        parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n      }\n    }\n\n    if (base === vScale.getPixelForValue(actualBase)) {\n      const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n      base += halfGrid;\n      size -= halfGrid;\n    }\n\n    return {\n      size,\n      base,\n      head,\n      center: head + size / 2\n    };\n  }\n\n  /**\n\t * @private\n\t */\n  _calculateBarIndexPixels(index, ruler) {\n    const scale = ruler.scale;\n    const options = this.options;\n    const skipNull = options.skipNull;\n    const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n    let center, size;\n    const axisCount = this._getAxisCount();\n    if (ruler.grouped) {\n      const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n      const range = options.barThickness === 'flex'\n        ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount)\n        : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n      const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n      const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n      const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n      center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n      size = Math.min(maxBarThickness, range.chunk * range.ratio);\n    } else {\n      // For non-grouped bar charts, exact pixel values are used\n      center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n      size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n    }\n\n\n    return {\n      base: center - size / 2,\n      head: center + size / 2,\n      center,\n      size\n    };\n  }\n\n  draw() {\n    const meta = this._cachedMeta;\n    const vScale = meta.vScale;\n    const rects = meta.data;\n    const ilen = rects.length;\n    let i = 0;\n\n    for (; i < ilen; ++i) {\n      if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n        rects[i].draw(this._ctx);\n      }\n    }\n  }\n\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n  static id = 'bubble';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    datasetElementType: false,\n    dataElementType: 'point',\n\n    animations: {\n      numbers: {\n        type: 'number',\n        properties: ['x', 'y', 'borderWidth', 'radius']\n      }\n    }\n  };\n\n  /**\n   * @type {any}\n   */\n  static overrides = {\n    scales: {\n      x: {\n        type: 'linear'\n      },\n      y: {\n        type: 'linear'\n      }\n    }\n  };\n\n  initialize() {\n    this.enableOptionSharing = true;\n    super.initialize();\n  }\n\n  /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n  parsePrimitiveData(meta, data, start, count) {\n    const parsed = super.parsePrimitiveData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n    }\n    return parsed;\n  }\n\n  /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n  parseArrayData(meta, data, start, count) {\n    const parsed = super.parseArrayData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      const item = data[start + i];\n      parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n    }\n    return parsed;\n  }\n\n  /**\n\t * Parse array of objects\n\t * @protected\n\t */\n  parseObjectData(meta, data, start, count) {\n    const parsed = super.parseObjectData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      const item = data[start + i];\n      parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n    }\n    return parsed;\n  }\n\n  /**\n\t * @protected\n\t */\n  getMaxOverflow() {\n    const data = this._cachedMeta.data;\n\n    let max = 0;\n    for (let i = data.length - 1; i >= 0; --i) {\n      max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n    }\n    return max > 0 && max;\n  }\n\n  /**\n\t * @protected\n\t */\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const labels = this.chart.data.labels || [];\n    const {xScale, yScale} = meta;\n    const parsed = this.getParsed(index);\n    const x = xScale.getLabelForValue(parsed.x);\n    const y = yScale.getLabelForValue(parsed.y);\n    const r = parsed._custom;\n\n    return {\n      label: labels[index] || '',\n      value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n    };\n  }\n\n  update(mode) {\n    const points = this._cachedMeta.data;\n\n    // Update Points\n    this.updateElements(points, 0, points.length, mode);\n  }\n\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale} = this._cachedMeta;\n    const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n\n    for (let i = start; i < start + count; i++) {\n      const point = points[i];\n      const parsed = !reset && this.getParsed(i);\n      const properties = {};\n      const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n      const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n\n      properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n        if (reset) {\n          properties.options.radius = 0;\n        }\n      }\n\n      this.updateElement(point, i, properties, mode);\n    }\n  }\n\n  /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n  resolveDataElementOptions(index, mode) {\n    const parsed = this.getParsed(index);\n    let values = super.resolveDataElementOptions(index, mode);\n\n    // In case values were cached (and thus frozen), we need to clone the values\n    if (values.$shared) {\n      values = Object.assign({}, values, {$shared: false});\n    }\n\n    // Custom radius resolution\n    const radius = values.radius;\n    if (mode !== 'active') {\n      values.radius = 0;\n    }\n    values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n    return values;\n  }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n  let ratioX = 1;\n  let ratioY = 1;\n  let offsetX = 0;\n  let offsetY = 0;\n  // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\n  if (circumference < TAU) {\n    const startAngle = rotation;\n    const endAngle = startAngle + circumference;\n    const startX = Math.cos(startAngle);\n    const startY = Math.sin(startAngle);\n    const endX = Math.cos(endAngle);\n    const endY = Math.sin(endAngle);\n    const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n    const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n    const maxX = calcMax(0, startX, endX);\n    const maxY = calcMax(HALF_PI, startY, endY);\n    const minX = calcMin(PI, startX, endX);\n    const minY = calcMin(PI + HALF_PI, startY, endY);\n    ratioX = (maxX - minX) / 2;\n    ratioY = (maxY - minY) / 2;\n    offsetX = -(maxX + minX) / 2;\n    offsetY = -(maxY + minY) / 2;\n  }\n  return {ratioX, ratioY, offsetX, offsetY};\n}\n\nexport default class DoughnutController extends DatasetController {\n\n  static id = 'doughnut';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    datasetElementType: false,\n    dataElementType: 'arc',\n    animation: {\n      // Boolean - Whether we animate the rotation of the Doughnut\n      animateRotate: true,\n      // Boolean - Whether we animate scaling the Doughnut from the centre\n      animateScale: false\n    },\n    animations: {\n      numbers: {\n        type: 'number',\n        properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n      },\n    },\n    // The percentage of the chart that we cut out of the middle.\n    cutout: '50%',\n\n    // The rotation of the chart, where the first data arc begins.\n    rotation: 0,\n\n    // The total circumference of the chart.\n    circumference: 360,\n\n    // The outer radius of the chart\n    radius: '100%',\n\n    // Spacing between arcs\n    spacing: 0,\n\n    indexAxis: 'r',\n  };\n\n  static descriptors = {\n    _scriptable: (name) => name !== 'spacing',\n    _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n  };\n\n  /**\n   * @type {any}\n   */\n  static overrides = {\n    aspectRatio: 1,\n\n    // Need to override these to give a nice default\n    plugins: {\n      legend: {\n        labels: {\n          generateLabels(chart) {\n            const data = chart.data;\n            const {labels: {pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n            if (data.labels.length && data.datasets.length) {\n              return data.labels.map((label, i) => {\n                const meta = chart.getDatasetMeta(0);\n                const style = meta.controller.getStyle(i);\n\n                return {\n                  text: label,\n                  fillStyle: style.backgroundColor,\n                  fontColor: color,\n                  hidden: !chart.getDataVisibility(i),\n                  lineDash: style.borderDash,\n                  lineDashOffset: style.borderDashOffset,\n                  lineJoin: style.borderJoinStyle,\n                  lineWidth: style.borderWidth,\n                  strokeStyle: style.borderColor,\n                  textAlign: textAlign,\n                  pointStyle: pointStyle,\n                  borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n                  // Extra data used for toggling the correct item\n                  index: i\n                };\n              });\n            }\n            return [];\n          }\n        },\n\n        onClick(e, legendItem, legend) {\n          legend.chart.toggleDataVisibility(legendItem.index);\n          legend.chart.update();\n        }\n      }\n    }\n  };\n\n  constructor(chart, datasetIndex) {\n    super(chart, datasetIndex);\n\n    this.enableOptionSharing = true;\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n    this.offsetX = undefined;\n    this.offsetY = undefined;\n  }\n\n  linkScales() {}\n\n  /**\n\t * Override data parsing, since we are not using scales\n\t */\n  parse(start, count) {\n    const data = this.getDataset().data;\n    const meta = this._cachedMeta;\n\n    if (this._parsing === false) {\n      meta._parsed = data;\n    } else {\n      let getter = (i) => +data[i];\n\n      if (isObject(data[start])) {\n        const {key = 'value'} = this._parsing;\n        getter = (i) => +resolveObjectKey(data[i], key);\n      }\n\n      let i, ilen;\n      for (i = start, ilen = start + count; i < ilen; ++i) {\n        meta._parsed[i] = getter(i);\n      }\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _getRotation() {\n    return toRadians(this.options.rotation - 90);\n  }\n\n  /**\n\t * @private\n\t */\n  _getCircumference() {\n    return toRadians(this.options.circumference);\n  }\n\n  /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n  _getRotationExtents() {\n    let min = TAU;\n    let max = -TAU;\n\n    for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n      if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n        const controller = this.chart.getDatasetMeta(i).controller;\n        const rotation = controller._getRotation();\n        const circumference = controller._getCircumference();\n\n        min = Math.min(min, rotation);\n        max = Math.max(max, rotation + circumference);\n      }\n    }\n\n    return {\n      rotation: min,\n      circumference: max - min,\n    };\n  }\n\n  /**\n\t * @param {string} mode\n\t */\n  update(mode) {\n    const chart = this.chart;\n    const {chartArea} = chart;\n    const meta = this._cachedMeta;\n    const arcs = meta.data;\n    const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n    const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n    const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n    const chartWeight = this._getRingWeight(this.index);\n\n    // Compute the maximal rotation & circumference limits.\n    // If we only consider our dataset, this can cause problems when two datasets\n    // are both less than a circle with different rotations (starting angles)\n    const {circumference, rotation} = this._getRotationExtents();\n    const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n    const maxWidth = (chartArea.width - spacing) / ratioX;\n    const maxHeight = (chartArea.height - spacing) / ratioY;\n    const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n    const outerRadius = toDimension(this.options.radius, maxRadius);\n    const innerRadius = Math.max(outerRadius * cutout, 0);\n    const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n    this.offsetX = offsetX * outerRadius;\n    this.offsetY = offsetY * outerRadius;\n\n    meta.total = this.calculateTotal();\n\n    this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n    this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n    this.updateElements(arcs, 0, arcs.length, mode);\n  }\n\n  /**\n   * @private\n   */\n  _circumference(i, reset) {\n    const opts = this.options;\n    const meta = this._cachedMeta;\n    const circumference = this._getCircumference();\n    if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n      return 0;\n    }\n    return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n  }\n\n  updateElements(arcs, start, count, mode) {\n    const reset = mode === 'reset';\n    const chart = this.chart;\n    const chartArea = chart.chartArea;\n    const opts = chart.options;\n    const animationOpts = opts.animation;\n    const centerX = (chartArea.left + chartArea.right) / 2;\n    const centerY = (chartArea.top + chartArea.bottom) / 2;\n    const animateScale = reset && animationOpts.animateScale;\n    const innerRadius = animateScale ? 0 : this.innerRadius;\n    const outerRadius = animateScale ? 0 : this.outerRadius;\n    const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n    let startAngle = this._getRotation();\n    let i;\n\n    for (i = 0; i < start; ++i) {\n      startAngle += this._circumference(i, reset);\n    }\n\n    for (i = start; i < start + count; ++i) {\n      const circumference = this._circumference(i, reset);\n      const arc = arcs[i];\n      const properties = {\n        x: centerX + this.offsetX,\n        y: centerY + this.offsetY,\n        startAngle,\n        endAngle: startAngle + circumference,\n        circumference,\n        outerRadius,\n        innerRadius\n      };\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n      }\n      startAngle += circumference;\n\n      this.updateElement(arc, i, properties, mode);\n    }\n  }\n\n  calculateTotal() {\n    const meta = this._cachedMeta;\n    const metaData = meta.data;\n    let total = 0;\n    let i;\n\n    for (i = 0; i < metaData.length; i++) {\n      const value = meta._parsed[i];\n      if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n        total += Math.abs(value);\n      }\n    }\n\n    return total;\n  }\n\n  calculateCircumference(value) {\n    const total = this._cachedMeta.total;\n    if (total > 0 && !isNaN(value)) {\n      return TAU * (Math.abs(value) / total);\n    }\n    return 0;\n  }\n\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const chart = this.chart;\n    const labels = chart.data.labels || [];\n    const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n    return {\n      label: labels[index] || '',\n      value,\n    };\n  }\n\n  getMaxBorderWidth(arcs) {\n    let max = 0;\n    const chart = this.chart;\n    let i, ilen, meta, controller, options;\n\n    if (!arcs) {\n      // Find the outmost visible dataset\n      for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n        if (chart.isDatasetVisible(i)) {\n          meta = chart.getDatasetMeta(i);\n          arcs = meta.data;\n          controller = meta.controller;\n          break;\n        }\n      }\n    }\n\n    if (!arcs) {\n      return 0;\n    }\n\n    for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n      options = controller.resolveDataElementOptions(i);\n      if (options.borderAlign !== 'inner') {\n        max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n      }\n    }\n    return max;\n  }\n\n  getMaxOffset(arcs) {\n    let max = 0;\n\n    for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n      const options = this.resolveDataElementOptions(i);\n      max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n    }\n    return max;\n  }\n\n  /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n  _getRingWeightOffset(datasetIndex) {\n    let ringWeightOffset = 0;\n\n    for (let i = 0; i < datasetIndex; ++i) {\n      if (this.chart.isDatasetVisible(i)) {\n        ringWeightOffset += this._getRingWeight(i);\n      }\n    }\n\n    return ringWeightOffset;\n  }\n\n  /**\n\t * @private\n\t */\n  _getRingWeight(datasetIndex) {\n    return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n  }\n\n  /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n  _getVisibleDatasetWeightTotal() {\n    return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n  }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n  static id = 'line';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    datasetElementType: 'line',\n    dataElementType: 'point',\n\n    showLine: true,\n    spanGaps: false,\n  };\n\n  /**\n   * @type {any}\n   */\n  static overrides = {\n    scales: {\n      _index_: {\n        type: 'category',\n      },\n      _value_: {\n        type: 'linear',\n      },\n    }\n  };\n\n  initialize() {\n    this.enableOptionSharing = true;\n    this.supportsDecimation = true;\n    super.initialize();\n  }\n\n  update(mode) {\n    const meta = this._cachedMeta;\n    const {dataset: line, data: points = [], _dataset} = meta;\n    // @ts-ignore\n    const animationsDisabled = this.chart._animationsDisabled;\n    let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n    this._drawStart = start;\n    this._drawCount = count;\n\n    if (_scaleRangesChanged(meta)) {\n      start = 0;\n      count = points.length;\n    }\n\n    // Update Line\n    line._chart = this.chart;\n    line._datasetIndex = this.index;\n    line._decimated = !!_dataset._decimated;\n    line.points = points;\n\n    const options = this.resolveDatasetElementOptions(mode);\n    if (!this.options.showLine) {\n      options.borderWidth = 0;\n    }\n    options.segment = this.options.segment;\n    this.updateElement(line, undefined, {\n      animated: !animationsDisabled,\n      options\n    }, mode);\n\n    // Update Points\n    this.updateElements(points, start, count, mode);\n  }\n\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n    const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const {spanGaps, segment} = this.options;\n    const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n    const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n    const end = start + count;\n    const pointsCount = points.length;\n    let prevParsed = start > 0 && this.getParsed(start - 1);\n\n    for (let i = 0; i < pointsCount; ++i) {\n      const point = points[i];\n      const properties = directUpdate ? point : {};\n\n      if (i < start || i >= end) {\n        properties.skip = true;\n        continue;\n      }\n\n      const parsed = this.getParsed(i);\n      const nullData = isNullOrUndef(parsed[vAxis]);\n      const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n      const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n      properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n      properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n      if (segment) {\n        properties.parsed = parsed;\n        properties.raw = _dataset.data[i];\n      }\n\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      }\n\n      if (!directUpdate) {\n        this.updateElement(point, i, properties, mode);\n      }\n\n      prevParsed = parsed;\n    }\n  }\n\n  /**\n\t * @protected\n\t */\n  getMaxOverflow() {\n    const meta = this._cachedMeta;\n    const dataset = meta.dataset;\n    const border = dataset.options && dataset.options.borderWidth || 0;\n    const data = meta.data || [];\n    if (!data.length) {\n      return border;\n    }\n    const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n    const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n    return Math.max(border, firstPoint, lastPoint) / 2;\n  }\n\n  draw() {\n    const meta = this._cachedMeta;\n    meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n    super.draw();\n  }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n  static id = 'polarArea';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    dataElementType: 'arc',\n    animation: {\n      animateRotate: true,\n      animateScale: true\n    },\n    animations: {\n      numbers: {\n        type: 'number',\n        properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n      },\n    },\n    indexAxis: 'r',\n    startAngle: 0,\n  };\n\n  /**\n   * @type {any}\n   */\n  static overrides = {\n    aspectRatio: 1,\n\n    plugins: {\n      legend: {\n        labels: {\n          generateLabels(chart) {\n            const data = chart.data;\n            if (data.labels.length && data.datasets.length) {\n              const {labels: {pointStyle, color}} = chart.legend.options;\n\n              return data.labels.map((label, i) => {\n                const meta = chart.getDatasetMeta(0);\n                const style = meta.controller.getStyle(i);\n\n                return {\n                  text: label,\n                  fillStyle: style.backgroundColor,\n                  strokeStyle: style.borderColor,\n                  fontColor: color,\n                  lineWidth: style.borderWidth,\n                  pointStyle: pointStyle,\n                  hidden: !chart.getDataVisibility(i),\n\n                  // Extra data used for toggling the correct item\n                  index: i\n                };\n              });\n            }\n            return [];\n          }\n        },\n\n        onClick(e, legendItem, legend) {\n          legend.chart.toggleDataVisibility(legendItem.index);\n          legend.chart.update();\n        }\n      }\n    },\n\n    scales: {\n      r: {\n        type: 'radialLinear',\n        angleLines: {\n          display: false\n        },\n        beginAtZero: true,\n        grid: {\n          circular: true\n        },\n        pointLabels: {\n          display: false\n        },\n        startAngle: 0\n      }\n    }\n  };\n\n  constructor(chart, datasetIndex) {\n    super(chart, datasetIndex);\n\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n  }\n\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const chart = this.chart;\n    const labels = chart.data.labels || [];\n    const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n    return {\n      label: labels[index] || '',\n      value,\n    };\n  }\n\n  parseObjectData(meta, data, start, count) {\n    return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n  }\n\n  update(mode) {\n    const arcs = this._cachedMeta.data;\n\n    this._updateRadius();\n    this.updateElements(arcs, 0, arcs.length, mode);\n  }\n\n  /**\n   * @protected\n   */\n  getMinMax() {\n    const meta = this._cachedMeta;\n    const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n    meta.data.forEach((element, index) => {\n      const parsed = this.getParsed(index).r;\n\n      if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n        if (parsed < range.min) {\n          range.min = parsed;\n        }\n\n        if (parsed > range.max) {\n          range.max = parsed;\n        }\n      }\n    });\n\n    return range;\n  }\n\n  /**\n\t * @private\n\t */\n  _updateRadius() {\n    const chart = this.chart;\n    const chartArea = chart.chartArea;\n    const opts = chart.options;\n    const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n    const outerRadius = Math.max(minSize / 2, 0);\n    const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n    const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n\n    this.outerRadius = outerRadius - (radiusLength * this.index);\n    this.innerRadius = this.outerRadius - radiusLength;\n  }\n\n  updateElements(arcs, start, count, mode) {\n    const reset = mode === 'reset';\n    const chart = this.chart;\n    const opts = chart.options;\n    const animationOpts = opts.animation;\n    const scale = this._cachedMeta.rScale;\n    const centerX = scale.xCenter;\n    const centerY = scale.yCenter;\n    const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n    let angle = datasetStartAngle;\n    let i;\n\n    const defaultAngle = 360 / this.countVisibleElements();\n\n    for (i = 0; i < start; ++i) {\n      angle += this._computeAngle(i, mode, defaultAngle);\n    }\n    for (i = start; i < start + count; i++) {\n      const arc = arcs[i];\n      let startAngle = angle;\n      let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n      let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n      angle = endAngle;\n\n      if (reset) {\n        if (animationOpts.animateScale) {\n          outerRadius = 0;\n        }\n        if (animationOpts.animateRotate) {\n          startAngle = endAngle = datasetStartAngle;\n        }\n      }\n\n      const properties = {\n        x: centerX,\n        y: centerY,\n        innerRadius: 0,\n        outerRadius,\n        startAngle,\n        endAngle,\n        options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n      };\n\n      this.updateElement(arc, i, properties, mode);\n    }\n  }\n\n  countVisibleElements() {\n    const meta = this._cachedMeta;\n    let count = 0;\n\n    meta.data.forEach((element, index) => {\n      if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n        count++;\n      }\n    });\n\n    return count;\n  }\n\n  /**\n\t * @private\n\t */\n  _computeAngle(index, mode, defaultAngle) {\n    return this.chart.getDataVisibility(index)\n      ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n      : 0;\n  }\n}\n", "import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n  static id = 'pie';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    // The percentage of the chart that we cut out of the middle.\n    cutout: 0,\n\n    // The rotation of the chart, where the first data arc begins.\n    rotation: 0,\n\n    // The total circumference of the chart.\n    circumference: 360,\n\n    // The outer radius of the chart\n    radius: '100%'\n  };\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n  static id = 'radar';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    datasetElementType: 'line',\n    dataElementType: 'point',\n    indexAxis: 'r',\n    showLine: true,\n    elements: {\n      line: {\n        fill: 'start'\n      }\n    },\n  };\n\n  /**\n   * @type {any}\n   */\n  static overrides = {\n    aspectRatio: 1,\n\n    scales: {\n      r: {\n        type: 'radialLinear',\n      }\n    }\n  };\n\n  /**\n\t * @protected\n\t */\n  getLabelAndValue(index) {\n    const vScale = this._cachedMeta.vScale;\n    const parsed = this.getParsed(index);\n\n    return {\n      label: vScale.getLabels()[index],\n      value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n    };\n  }\n\n  parseObjectData(meta, data, start, count) {\n    return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n  }\n\n  update(mode) {\n    const meta = this._cachedMeta;\n    const line = meta.dataset;\n    const points = meta.data || [];\n    const labels = meta.iScale.getLabels();\n\n    // Update Line\n    line.points = points;\n    // In resize mode only point locations change, so no need to set the points or options.\n    if (mode !== 'resize') {\n      const options = this.resolveDatasetElementOptions(mode);\n      if (!this.options.showLine) {\n        options.borderWidth = 0;\n      }\n\n      const properties = {\n        _loop: true,\n        _fullLoop: labels.length === points.length,\n        options\n      };\n\n      this.updateElement(line, undefined, properties, mode);\n    }\n\n    // Update Points\n    this.updateElements(points, 0, points.length, mode);\n  }\n\n  updateElements(points, start, count, mode) {\n    const scale = this._cachedMeta.rScale;\n    const reset = mode === 'reset';\n\n    for (let i = start; i < start + count; i++) {\n      const point = points[i];\n      const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n      const x = reset ? scale.xCenter : pointPosition.x;\n      const y = reset ? scale.yCenter : pointPosition.y;\n\n      const properties = {\n        x,\n        y,\n        angle: pointPosition.angle,\n        skip: isNaN(x) || isNaN(y),\n        options\n      };\n\n      this.updateElement(point, i, properties, mode);\n    }\n  }\n}\n", "import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n  static id = 'scatter';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    datasetElementType: false,\n    dataElementType: 'point',\n    showLine: false,\n    fill: false\n  };\n\n  /**\n   * @type {any}\n   */\n  static overrides = {\n\n    interaction: {\n      mode: 'point'\n    },\n\n    scales: {\n      x: {\n        type: 'linear'\n      },\n      y: {\n        type: 'linear'\n      }\n    }\n  };\n\n  /**\n\t * @protected\n\t */\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const labels = this.chart.data.labels || [];\n    const {xScale, yScale} = meta;\n    const parsed = this.getParsed(index);\n    const x = xScale.getLabelForValue(parsed.x);\n    const y = yScale.getLabelForValue(parsed.y);\n\n    return {\n      label: labels[index] || '',\n      value: '(' + x + ', ' + y + ')'\n    };\n  }\n\n  update(mode) {\n    const meta = this._cachedMeta;\n    const {data: points = []} = meta;\n    // @ts-ignore\n    const animationsDisabled = this.chart._animationsDisabled;\n    let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n    this._drawStart = start;\n    this._drawCount = count;\n\n    if (_scaleRangesChanged(meta)) {\n      start = 0;\n      count = points.length;\n    }\n\n    if (this.options.showLine) {\n\n      // https://github.com/chartjs/Chart.js/issues/11333\n      if (!this.datasetElementType) {\n        this.addElements();\n      }\n      const {dataset: line, _dataset} = meta;\n\n      // Update Line\n      line._chart = this.chart;\n      line._datasetIndex = this.index;\n      line._decimated = !!_dataset._decimated;\n      line.points = points;\n\n      const options = this.resolveDatasetElementOptions(mode);\n      options.segment = this.options.segment;\n      this.updateElement(line, undefined, {\n        animated: !animationsDisabled,\n        options\n      }, mode);\n    } else if (this.datasetElementType) {\n      // https://github.com/chartjs/Chart.js/issues/11333\n      delete meta.dataset;\n      this.datasetElementType = false;\n    }\n\n    // Update Points\n    this.updateElements(points, start, count, mode);\n  }\n\n  addElements() {\n    const {showLine} = this.options;\n\n    if (!this.datasetElementType && showLine) {\n      this.datasetElementType = this.chart.registry.getElement('line');\n    }\n\n    super.addElements();\n  }\n\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const {spanGaps, segment} = this.options;\n    const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n    const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n    let prevParsed = start > 0 && this.getParsed(start - 1);\n\n    for (let i = start; i < start + count; ++i) {\n      const point = points[i];\n      const parsed = this.getParsed(i);\n      const properties = directUpdate ? point : {};\n      const nullData = isNullOrUndef(parsed[vAxis]);\n      const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n      const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n      properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n      properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n      if (segment) {\n        properties.parsed = parsed;\n        properties.raw = _dataset.data[i];\n      }\n\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      }\n\n      if (!directUpdate) {\n        this.updateElement(point, i, properties, mode);\n      }\n\n      prevParsed = parsed;\n    }\n\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n  }\n\n  /**\n\t * @protected\n\t */\n  getMaxOverflow() {\n    const meta = this._cachedMeta;\n    const data = meta.data || [];\n\n    if (!this.options.showLine) {\n      let max = 0;\n      for (let i = data.length - 1; i >= 0; --i) {\n        max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n      }\n      return max > 0 && max;\n    }\n\n    const dataset = meta.dataset;\n    const border = dataset.options && dataset.options.borderWidth || 0;\n\n    if (!data.length) {\n      return border;\n    }\n\n    const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n    const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n    return Math.max(border, firstPoint, lastPoint) / 2;\n  }\n}\n", "/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter<T extends AnyObject = AnyObject> {\n  readonly options: T;\n  /**\n   * Will called with chart options after adapter creation.\n   */\n  init(this: DateAdapter<T>, chartOptions: ChartOptions): void;\n  /**\n   * Returns a map of time formats for the supported formatting units defined\n   * in Unit as well as 'datetime' representing a detailed date/time string.\n   */\n  formats(this: DateAdapter<T>): Record<TimeUnit | 'datetime', string>;\n  /**\n   * Parses the given `value` and return the associated timestamp.\n   * @param value - the value to parse (usually comes from the data)\n   * @param [format] - the expected data format\n   */\n  parse(this: DateAdapter<T>, value: unknown, format?: string): number | null;\n  /**\n   * Returns the formatted date in the specified `format` for a given `timestamp`.\n   * @param timestamp - the timestamp to format\n   * @param format - the date/time token\n   */\n  format(this: DateAdapter<T>, timestamp: number, format: string): string;\n  /**\n   * Adds the specified `amount` of `unit` to the given `timestamp`.\n   * @param timestamp - the input timestamp\n   * @param amount - the amount to add\n   * @param unit - the unit as string\n   */\n  add(this: DateAdapter<T>, timestamp: number, amount: number, unit: TimeUnit): number;\n  /**\n   * Returns the number of `unit` between the given timestamps.\n   * @param a - the input timestamp (reference)\n   * @param b - the timestamp to subtract\n   * @param unit - the unit as string\n   */\n  diff(this: DateAdapter<T>, a: number, b: number, unit: TimeUnit): number;\n  /**\n   * Returns start of `unit` for the given `timestamp`.\n   * @param timestamp - the input timestamp\n   * @param unit - the unit as string\n   * @param [weekday] - the ISO day of the week with 1 being Monday\n   * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n   */\n  startOf(this: DateAdapter<T>, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number | boolean): number;\n  /**\n   * Returns end of `unit` for the given `timestamp`.\n   * @param timestamp - the input timestamp\n   * @param unit - the unit as string\n   */\n  endOf(this: DateAdapter<T>, timestamp: number, unit: TimeUnit): number;\n}\n\nfunction abstract<T = void>(): T {\n  throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n  /**\n   * Override default date adapter methods.\n   * Accepts type parameter to define options type.\n   * @example\n   * Chart._adapters._date.override<{myAdapterOption: string}>({\n   *   init() {\n   *     console.log(this.options.myAdapterOption);\n   *   }\n   * })\n   */\n  static override<T extends AnyObject = AnyObject>(\n    members: Partial<Omit<DateAdapter<T>, 'options'>>\n  ) {\n    Object.assign(DateAdapterBase.prototype, members);\n  }\n\n  readonly options: AnyObject;\n\n  constructor(options?: AnyObject) {\n    this.options = options || {};\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  init() {}\n\n  formats(): Record<TimeUnit | 'datetime', string> {\n    return abstract();\n  }\n\n  parse(): number | null {\n    return abstract();\n  }\n\n  format(): string {\n    return abstract();\n  }\n\n  add(): number {\n    return abstract();\n  }\n\n  diff(): number {\n    return abstract();\n  }\n\n  startOf(): number {\n    return abstract();\n  }\n\n  endOf(): number {\n    return abstract();\n  }\n}\n\nexport default {\n  _date: DateAdapterBase as {\n    new (options?: AnyObject): DateAdapter;\n    override<T extends AnyObject = AnyObject>(\n      members: Partial<Omit<DateAdapter<T>, 'options'>>\n    ): void;\n  }\n};\n", "import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea, isNullOrUndef} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\n */\nfunction binarySearch(metaset, axis, value, intersect) {\n  const {controller, data, _sorted} = metaset;\n  const iScale = controller._cachedMeta.iScale;\n  const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n\n  if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n    const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n    if (!intersect) {\n      const result = lookupMethod(data, axis, value);\n      if (spanGaps) {\n        const {vScale} = controller._cachedMeta;\n        const {_parsed} = metaset;\n\n        const distanceToDefinedLo = (_parsed\n          .slice(0, result.lo + 1)\n          .reverse()\n          .findIndex(\n            point => !isNullOrUndef(point[vScale.axis])));\n        result.lo -= Math.max(0, distanceToDefinedLo);\n\n        const distanceToDefinedHi = (_parsed\n          .slice(result.hi)\n          .findIndex(\n            point => !isNullOrUndef(point[vScale.axis])));\n        result.hi += Math.max(0, distanceToDefinedHi);\n      }\n      return result;\n    } else if (controller._sharedOptions) {\n      // _sharedOptions indicates that each element has equal options -> equal proportions\n      // So we can do a ranged binary search based on the range of first element and\n      // be confident to get the full range of indices that can intersect with the value.\n      const el = data[0];\n      const range = typeof el.getRange === 'function' && el.getRange(axis);\n      if (range) {\n        const start = lookupMethod(data, axis, value - range);\n        const end = lookupMethod(data, axis, value + range);\n        return {lo: start.lo, hi: end.hi};\n      }\n    }\n  }\n  // Default to all elements, when binary search can not be used.\n  return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n  const metasets = chart.getSortedVisibleDatasetMetas();\n  const value = position[axis];\n  for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n    const {index, data} = metasets[i];\n    const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n    for (let j = lo; j <= hi; ++j) {\n      const element = data[j];\n      if (!element.skip) {\n        handler(element, index, j);\n      }\n    }\n  }\n}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n  const useX = axis.indexOf('x') !== -1;\n  const useY = axis.indexOf('y') !== -1;\n\n  return function(pt1, pt2) {\n    const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n    const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n    return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n  };\n}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n  const items = [];\n\n  if (!includeInvisible && !chart.isPointInArea(position)) {\n    return items;\n  }\n\n  const evaluationFunc = function(element, datasetIndex, index) {\n    if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n      return;\n    }\n    if (element.inRange(position.x, position.y, useFinalPosition)) {\n      items.push({element, datasetIndex, index});\n    }\n  };\n\n  evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n  return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n  let items = [];\n\n  function evaluationFunc(element, datasetIndex, index) {\n    const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n    const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n    if (_angleBetween(angle, startAngle, endAngle)) {\n      items.push({element, datasetIndex, index});\n    }\n  }\n\n  evaluateInteractionItems(chart, axis, position, evaluationFunc);\n  return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n  let items = [];\n  const distanceMetric = getDistanceMetricForAxis(axis);\n  let minDistance = Number.POSITIVE_INFINITY;\n\n  function evaluationFunc(element, datasetIndex, index) {\n    const inRange = element.inRange(position.x, position.y, useFinalPosition);\n    if (intersect && !inRange) {\n      return;\n    }\n\n    const center = element.getCenterPoint(useFinalPosition);\n    const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n    if (!pointInArea && !inRange) {\n      return;\n    }\n\n    const distance = distanceMetric(position, center);\n    if (distance < minDistance) {\n      items = [{element, datasetIndex, index}];\n      minDistance = distance;\n    } else if (distance === minDistance) {\n      // Can have multiple items at the same distance in which case we sort by size\n      items.push({element, datasetIndex, index});\n    }\n  }\n\n  evaluateInteractionItems(chart, axis, position, evaluationFunc);\n  return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n  if (!includeInvisible && !chart.isPointInArea(position)) {\n    return [];\n  }\n\n  return axis === 'r' && !intersect\n    ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n    : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n  const items = [];\n  const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n  let intersectsItem = false;\n\n  evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n    if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n      items.push({element, datasetIndex, index});\n      intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n    }\n  });\n\n  // If we want to trigger on an intersect and we don't have any items\n  // that intersect the position, return nothing\n  if (intersect && !intersectsItem) {\n    return [];\n  }\n  return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n  // Part of the public API to facilitate developers creating their own modes\n  evaluateInteractionItems,\n\n  // Helper function for different modes\n  modes: {\n    /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n    index(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      // Default axis for index mode is 'x' to match old behaviour\n      const axis = options.axis || 'x';\n      const includeInvisible = options.includeInvisible || false;\n      const items = options.intersect\n        ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n        : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n      const elements = [];\n\n      if (!items.length) {\n        return [];\n      }\n\n      chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n        const index = items[0].index;\n        const element = meta.data[index];\n\n        // don't count items that are skipped (null data)\n        if (element && !element.skip) {\n          elements.push({element, datasetIndex: meta.index, index});\n        }\n      });\n\n      return elements;\n    },\n\n    /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n    dataset(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      const includeInvisible = options.includeInvisible || false;\n      let items = options.intersect\n        ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n        getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\n      if (items.length > 0) {\n        const datasetIndex = items[0].datasetIndex;\n        const data = chart.getDatasetMeta(datasetIndex).data;\n        items = [];\n        for (let i = 0; i < data.length; ++i) {\n          items.push({element: data[i], datasetIndex, index: i});\n        }\n      }\n\n      return items;\n    },\n\n    /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n    point(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      const includeInvisible = options.includeInvisible || false;\n      return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n    },\n\n    /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n    nearest(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      const includeInvisible = options.includeInvisible || false;\n      return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n    },\n\n    /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n    x(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n    },\n\n    /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n    y(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n    }\n  }\n};\n", "import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n  return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n  return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\n\nfunction sortByWeight(array, reverse) {\n  return array.sort((a, b) => {\n    const v0 = reverse ? b : a;\n    const v1 = reverse ? a : b;\n    return v0.weight === v1.weight ?\n      v0.index - v1.index :\n      v0.weight - v1.weight;\n  });\n}\n\nfunction wrapBoxes(boxes) {\n  const layoutBoxes = [];\n  let i, ilen, box, pos, stack, stackWeight;\n\n  for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n    box = boxes[i];\n    ({position: pos, options: {stack, stackWeight = 1}} = box);\n    layoutBoxes.push({\n      index: i,\n      box,\n      pos,\n      horizontal: box.isHorizontal(),\n      weight: box.weight,\n      stack: stack && (pos + stack),\n      stackWeight\n    });\n  }\n  return layoutBoxes;\n}\n\nfunction buildStacks(layouts) {\n  const stacks = {};\n  for (const wrap of layouts) {\n    const {stack, pos, stackWeight} = wrap;\n    if (!stack || !STATIC_POSITIONS.includes(pos)) {\n      continue;\n    }\n    const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n    _stack.count++;\n    _stack.weight += stackWeight;\n  }\n  return stacks;\n}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\n **/\nfunction setLayoutDims(layouts, params) {\n  const stacks = buildStacks(layouts);\n  const {vBoxMaxWidth, hBoxMaxHeight} = params;\n  let i, ilen, layout;\n  for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n    layout = layouts[i];\n    const {fullSize} = layout.box;\n    const stack = stacks[layout.stack];\n    const factor = stack && layout.stackWeight / stack.weight;\n    if (layout.horizontal) {\n      layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n      layout.height = hBoxMaxHeight;\n    } else {\n      layout.width = vBoxMaxWidth;\n      layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n    }\n  }\n  return stacks;\n}\n\nfunction buildLayoutBoxes(boxes) {\n  const layoutBoxes = wrapBoxes(boxes);\n  const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n  const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n  const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n  const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n  const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n  const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n  const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n\n  return {\n    fullSize,\n    leftAndTop: left.concat(top),\n    rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n    chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n    vertical: left.concat(right).concat(centerVertical),\n    horizontal: top.concat(bottom).concat(centerHorizontal)\n  };\n}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n  return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\n\nfunction updateMaxPadding(maxPadding, boxPadding) {\n  maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n  maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n  maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n  maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n  const {pos, box} = layout;\n  const maxPadding = chartArea.maxPadding;\n\n  // dynamically placed boxes size is not considered\n  if (!isObject(pos)) {\n    if (layout.size) {\n      // this layout was already counted for, lets first reduce old size\n      chartArea[pos] -= layout.size;\n    }\n    const stack = stacks[layout.stack] || {size: 0, count: 1};\n    stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n    layout.size = stack.size / stack.count;\n    chartArea[pos] += layout.size;\n  }\n\n  if (box.getPadding) {\n    updateMaxPadding(maxPadding, box.getPadding());\n  }\n\n  const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n  const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n  const widthChanged = newWidth !== chartArea.w;\n  const heightChanged = newHeight !== chartArea.h;\n  chartArea.w = newWidth;\n  chartArea.h = newHeight;\n\n  // return booleans on the changes per direction\n  return layout.horizontal\n    ? {same: widthChanged, other: heightChanged}\n    : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n  const maxPadding = chartArea.maxPadding;\n\n  function updatePos(pos) {\n    const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n    chartArea[pos] += change;\n    return change;\n  }\n  chartArea.y += updatePos('top');\n  chartArea.x += updatePos('left');\n  updatePos('right');\n  updatePos('bottom');\n}\n\nfunction getMargins(horizontal, chartArea) {\n  const maxPadding = chartArea.maxPadding;\n\n  function marginForPositions(positions) {\n    const margin = {left: 0, top: 0, right: 0, bottom: 0};\n    positions.forEach((pos) => {\n      margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n    });\n    return margin;\n  }\n\n  return horizontal\n    ? marginForPositions(['left', 'right'])\n    : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n  const refitBoxes = [];\n  let i, ilen, layout, box, refit, changed;\n\n  for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n    layout = boxes[i];\n    box = layout.box;\n\n    box.update(\n      layout.width || chartArea.w,\n      layout.height || chartArea.h,\n      getMargins(layout.horizontal, chartArea)\n    );\n    const {same, other} = updateDims(chartArea, params, layout, stacks);\n\n    // Dimensions changed and there were non full width boxes before this\n    // -> we have to refit those\n    refit |= same && refitBoxes.length;\n\n    // Chart area changed in the opposite direction\n    changed = changed || other;\n\n    if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n      refitBoxes.push(layout);\n    }\n  }\n\n  return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\n\nfunction setBoxDims(box, left, top, width, height) {\n  box.top = top;\n  box.left = left;\n  box.right = left + width;\n  box.bottom = top + height;\n  box.width = width;\n  box.height = height;\n}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n  const userPadding = params.padding;\n  let {x, y} = chartArea;\n\n  for (const layout of boxes) {\n    const box = layout.box;\n    const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n    const weight = (layout.stackWeight / stack.weight) || 1;\n    if (layout.horizontal) {\n      const width = chartArea.w * weight;\n      const height = stack.size || box.height;\n      if (defined(stack.start)) {\n        y = stack.start;\n      }\n      if (box.fullSize) {\n        setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n      } else {\n        setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n      }\n      stack.start = y;\n      stack.placed += width;\n      y = box.bottom;\n    } else {\n      const height = chartArea.h * weight;\n      const width = stack.size || box.width;\n      if (defined(stack.start)) {\n        x = stack.start;\n      }\n      if (box.fullSize) {\n        setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n      } else {\n        setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n      }\n      stack.start = x;\n      stack.placed += height;\n      x = box.right;\n    }\n  }\n\n  chartArea.x = x;\n  chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] -  Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory.  It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n  /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n  addBox(chart, item) {\n    if (!chart.boxes) {\n      chart.boxes = [];\n    }\n\n    // initialize item with default values\n    item.fullSize = item.fullSize || false;\n    item.position = item.position || 'top';\n    item.weight = item.weight || 0;\n    // @ts-ignore\n    item._layers = item._layers || function() {\n      return [{\n        z: 0,\n        draw(chartArea) {\n          item.draw(chartArea);\n        }\n      }];\n    };\n\n    chart.boxes.push(item);\n  },\n\n  /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\n  removeBox(chart, layoutItem) {\n    const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n    if (index !== -1) {\n      chart.boxes.splice(index, 1);\n    }\n  },\n\n  /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n  configure(chart, item, options) {\n    item.fullSize = options.fullSize;\n    item.position = options.position;\n    item.weight = options.weight;\n  },\n\n  /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n   * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n  update(chart, width, height, minPadding) {\n    if (!chart) {\n      return;\n    }\n\n    const padding = toPadding(chart.options.layout.padding);\n    const availableWidth = Math.max(width - padding.width, 0);\n    const availableHeight = Math.max(height - padding.height, 0);\n    const boxes = buildLayoutBoxes(chart.boxes);\n    const verticalBoxes = boxes.vertical;\n    const horizontalBoxes = boxes.horizontal;\n\n    // Before any changes are made, notify boxes that an update is about to being\n    // This is used to clear any cached data (e.g. scale limits)\n    each(chart.boxes, box => {\n      if (typeof box.beforeLayout === 'function') {\n        box.beforeLayout();\n      }\n    });\n\n    // Essentially we now have any number of boxes on each of the 4 sides.\n    // Our canvas looks like the following.\n    // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n    // B1 is the bottom axis\n    // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n    // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n    // an error will be thrown.\n    //\n    // |----------------------------------------------------|\n    // |                  T1 (Full Width)                   |\n    // |----------------------------------------------------|\n    // |    |    |                 T2                  |    |\n    // |    |----|-------------------------------------|----|\n    // |    |    | C1 |                           | C2 |    |\n    // |    |    |----|                           |----|    |\n    // |    |    |                                     |    |\n    // | L1 | L2 |           ChartArea (C0)            | R1 |\n    // |    |    |                                     |    |\n    // |    |    |----|                           |----|    |\n    // |    |    | C3 |                           | C4 |    |\n    // |    |----|-------------------------------------|----|\n    // |    |    |                 B1                  |    |\n    // |----------------------------------------------------|\n    // |                  B2 (Full Width)                   |\n    // |----------------------------------------------------|\n    //\n\n    const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n      wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\n    const params = Object.freeze({\n      outerWidth: width,\n      outerHeight: height,\n      padding,\n      availableWidth,\n      availableHeight,\n      vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n      hBoxMaxHeight: availableHeight / 2\n    });\n    const maxPadding = Object.assign({}, padding);\n    updateMaxPadding(maxPadding, toPadding(minPadding));\n    const chartArea = Object.assign({\n      maxPadding,\n      w: availableWidth,\n      h: availableHeight,\n      x: padding.left,\n      y: padding.top\n    }, padding);\n\n    const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n    // First fit the fullSize boxes, to reduce probability of re-fitting.\n    fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n    // Then fit vertical boxes\n    fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n    // Then fit horizontal boxes\n    if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n      // if the area changed, re-fit vertical boxes\n      fitBoxes(verticalBoxes, chartArea, params, stacks);\n    }\n\n    handleMaxPadding(chartArea);\n\n    // Finally place the boxes to correct coordinates\n    placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n    // Move to opposite side of chart\n    chartArea.x += chartArea.w;\n    chartArea.y += chartArea.h;\n\n    placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\n    chart.chartArea = {\n      left: chartArea.left,\n      top: chartArea.top,\n      right: chartArea.left + chartArea.w,\n      bottom: chartArea.top + chartArea.h,\n      height: chartArea.h,\n      width: chartArea.w,\n    };\n\n    // Finally update boxes in chartArea (radial scale for example)\n    each(boxes.chartArea, (layout) => {\n      const box = layout.box;\n      Object.assign(box, chart.chartArea);\n      box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n    });\n  }\n};\n", "\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n  /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n  acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n  /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n  releaseContext(context) { // eslint-disable-line no-unused-vars\n    return false;\n  }\n\n  /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n  addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n  /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n  removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n  /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n  getDevicePixelRatio() {\n    return 1;\n  }\n\n  /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n  getMaximumSize(element, width, height, aspectRatio) {\n    width = Math.max(0, width || element.width);\n    height = height || element.height;\n    return {\n      width,\n      height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n    };\n  }\n\n  /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n  isAttached(canvas) { // eslint-disable-line no-unused-vars\n    return true;\n  }\n\n  /**\n   * Updates config with platform specific requirements\n   * @param {import('../core/core.config.js').default} config\n   */\n  updateConfig(config) { // eslint-disable-line no-unused-vars\n    // no-op\n  }\n}\n", "/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n  acquireContext(item) {\n    // To prevent canvas fingerprinting, some add-ons undefine the getContext\n    // method, for example: https://github.com/kkapsner/CanvasBlocker\n    // https://github.com/chartjs/Chart.js/issues/2807\n    return item && item.getContext && item.getContext('2d') || null;\n  }\n  updateConfig(config) {\n    config.options.animation = false;\n  }\n}\n", "/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\nconst EVENT_TYPES = {\n  touchstart: 'mousedown',\n  touchmove: 'mousemove',\n  touchend: 'mouseup',\n  pointerenter: 'mouseenter',\n  pointerdown: 'mousedown',\n  pointermove: 'mousemove',\n  pointerup: 'mouseup',\n  pointerleave: 'mouseout',\n  pointerout: 'mouseout'\n};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n  const style = canvas.style;\n\n  // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n  // returns null or '' if no explicit value has been set to the canvas attribute.\n  const renderHeight = canvas.getAttribute('height');\n  const renderWidth = canvas.getAttribute('width');\n\n  // Chart.js modifies some canvas values that we want to restore on destroy\n  canvas[EXPANDO_KEY] = {\n    initial: {\n      height: renderHeight,\n      width: renderWidth,\n      style: {\n        display: style.display,\n        height: style.height,\n        width: style.width\n      }\n    }\n  };\n\n  // Force canvas to display as block to avoid extra space caused by inline\n  // elements, which would interfere with the responsive resize process.\n  // https://github.com/chartjs/Chart.js/issues/2538\n  style.display = style.display || 'block';\n  // Include possible borders in the size\n  style.boxSizing = style.boxSizing || 'border-box';\n\n  if (isNullOrEmpty(renderWidth)) {\n    const displayWidth = readUsedSize(canvas, 'width');\n    if (displayWidth !== undefined) {\n      canvas.width = displayWidth;\n    }\n  }\n\n  if (isNullOrEmpty(renderHeight)) {\n    if (canvas.style.height === '') {\n      // If no explicit render height and style height, let's apply the aspect ratio,\n      // which one can be specified by the user but also by charts as default option\n      // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n      canvas.height = canvas.width / (aspectRatio || 2);\n    } else {\n      const displayHeight = readUsedSize(canvas, 'height');\n      if (displayHeight !== undefined) {\n        canvas.height = displayHeight;\n      }\n    }\n  }\n\n  return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n  if (node) {\n    node.addEventListener(type, listener, eventListenerOptions);\n  }\n}\n\nfunction removeListener(chart, type, listener) {\n  if (chart && chart.canvas) {\n    chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n  }\n}\n\nfunction fromNativeEvent(event, chart) {\n  const type = EVENT_TYPES[event.type] || event.type;\n  const {x, y} = getRelativePosition(event, chart);\n  return {\n    type,\n    chart,\n    native: event,\n    x: x !== undefined ? x : null,\n    y: y !== undefined ? y : null,\n  };\n}\n\nfunction nodeListContains(nodeList, canvas) {\n  for (const node of nodeList) {\n    if (node === canvas || node.contains(canvas)) {\n      return true;\n    }\n  }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const observer = new MutationObserver(entries => {\n    let trigger = false;\n    for (const entry of entries) {\n      trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n      trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n    }\n    if (trigger) {\n      listener();\n    }\n  });\n  observer.observe(document, {childList: true, subtree: true});\n  return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const observer = new MutationObserver(entries => {\n    let trigger = false;\n    for (const entry of entries) {\n      trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n      trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n    }\n    if (trigger) {\n      listener();\n    }\n  });\n  observer.observe(document, {childList: true, subtree: true});\n  return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\nfunction onWindowResize() {\n  const dpr = window.devicePixelRatio;\n  if (dpr === oldDevicePixelRatio) {\n    return;\n  }\n  oldDevicePixelRatio = dpr;\n  drpListeningCharts.forEach((resize, chart) => {\n    if (chart.currentDevicePixelRatio !== dpr) {\n      resize();\n    }\n  });\n}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n  if (!drpListeningCharts.size) {\n    window.addEventListener('resize', onWindowResize);\n  }\n  drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n  drpListeningCharts.delete(chart);\n  if (!drpListeningCharts.size) {\n    window.removeEventListener('resize', onWindowResize);\n  }\n}\n\nfunction createResizeObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const container = canvas && _getParentNode(canvas);\n  if (!container) {\n    return;\n  }\n  const resize = throttled((width, height) => {\n    const w = container.clientWidth;\n    listener(width, height);\n    if (w < container.clientWidth) {\n      // If the container size shrank during chart resize, let's assume\n      // scrollbar appeared. So we resize again with the scrollbar visible -\n      // effectively making chart smaller and the scrollbar hidden again.\n      // Because we are inside `throttled`, and currently `ticking`, scroll\n      // events are ignored during this whole 2 resize process.\n      // If we assumed wrong and something else happened, we are resizing\n      // twice in a frame (potential performance issue)\n      listener();\n    }\n  }, window);\n\n  // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n  const observer = new ResizeObserver(entries => {\n    const entry = entries[0];\n    const width = entry.contentRect.width;\n    const height = entry.contentRect.height;\n    // When its container's display is set to 'none' the callback will be called with a\n    // size of (0, 0), which will cause the chart to lose its original height, so skip\n    // resizing in such case.\n    if (width === 0 && height === 0) {\n      return;\n    }\n    resize(width, height);\n  });\n  observer.observe(container);\n  listenDevicePixelRatioChanges(chart, resize);\n\n  return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n  if (observer) {\n    observer.disconnect();\n  }\n  if (type === 'resize') {\n    unlistenDevicePixelRatioChanges(chart);\n  }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n  const canvas = chart.canvas;\n  const proxy = throttled((event) => {\n    // This case can occur if the chart is destroyed while waiting\n    // for the throttled function to occur. We prevent crashes by checking\n    // for a destroyed chart\n    if (chart.ctx !== null) {\n      listener(fromNativeEvent(event, chart));\n    }\n  }, chart);\n\n  addListener(canvas, type, proxy);\n\n  return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n  /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n  acquireContext(canvas, aspectRatio) {\n    // To prevent canvas fingerprinting, some add-ons undefine the getContext\n    // method, for example: https://github.com/kkapsner/CanvasBlocker\n    // https://github.com/chartjs/Chart.js/issues/2807\n    const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n    // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n    // inside an iframe or when running in a protected environment. We could guess the\n    // types from their toString() value but let's keep things flexible and assume it's\n    // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n    // https://github.com/chartjs/Chart.js/issues/3887\n    // https://github.com/chartjs/Chart.js/issues/4102\n    // https://github.com/chartjs/Chart.js/issues/4152\n    if (context && context.canvas === canvas) {\n      // Load platform resources on first chart creation, to make it possible to\n      // import the library before setting platform options.\n      initCanvas(canvas, aspectRatio);\n      return context;\n    }\n\n    return null;\n  }\n\n  /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n  releaseContext(context) {\n    const canvas = context.canvas;\n    if (!canvas[EXPANDO_KEY]) {\n      return false;\n    }\n\n    const initial = canvas[EXPANDO_KEY].initial;\n    ['height', 'width'].forEach((prop) => {\n      const value = initial[prop];\n      if (isNullOrUndef(value)) {\n        canvas.removeAttribute(prop);\n      } else {\n        canvas.setAttribute(prop, value);\n      }\n    });\n\n    const style = initial.style || {};\n    Object.keys(style).forEach((key) => {\n      canvas.style[key] = style[key];\n    });\n\n    // The canvas render size might have been changed (and thus the state stack discarded),\n    // we can't use save() and restore() to restore the initial state. So make sure that at\n    // least the canvas context is reset to the default state by setting the canvas width.\n    // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n    // eslint-disable-next-line no-self-assign\n    canvas.width = canvas.width;\n\n    delete canvas[EXPANDO_KEY];\n    return true;\n  }\n\n  /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n  addEventListener(chart, type, listener) {\n    // Can have only one listener per type, so make sure previous is removed\n    this.removeEventListener(chart, type);\n\n    const proxies = chart.$proxies || (chart.$proxies = {});\n    const handlers = {\n      attach: createAttachObserver,\n      detach: createDetachObserver,\n      resize: createResizeObserver\n    };\n    const handler = handlers[type] || createProxyAndListen;\n    proxies[type] = handler(chart, type, listener);\n  }\n\n\n  /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n  removeEventListener(chart, type) {\n    const proxies = chart.$proxies || (chart.$proxies = {});\n    const proxy = proxies[type];\n\n    if (!proxy) {\n      return;\n    }\n\n    const handlers = {\n      attach: releaseObserver,\n      detach: releaseObserver,\n      resize: releaseObserver\n    };\n    const handler = handlers[type] || removeListener;\n    handler(chart, type, proxy);\n    proxies[type] = undefined;\n  }\n\n  getDevicePixelRatio() {\n    return window.devicePixelRatio;\n  }\n\n  /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n  getMaximumSize(canvas, width, height, aspectRatio) {\n    return getMaximumSize(canvas, width, height, aspectRatio);\n  }\n\n  /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n  isAttached(canvas) {\n    const container = canvas && _getParentNode(canvas);\n    return !!(container && container.isConnected);\n  }\n}\n", "import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n  if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n    return BasicPlatform;\n  }\n  return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n", "import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element<T = AnyObject, O = AnyObject> {\n\n  static defaults = {};\n  static defaultRoutes = undefined;\n\n  x: number;\n  y: number;\n  active = false;\n  options: O;\n  $animations: Record<keyof T, Animation>;\n\n  tooltipPosition(useFinalPosition: boolean): Point {\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return {x, y} as Point;\n  }\n\n  hasValue() {\n    return isNumber(this.x) && isNumber(this.y);\n  }\n\n  /**\n   * Gets the current or final value of each prop. Can return extra properties (whole object).\n   * @param props - properties to get\n   * @param [final] - get the final value (animation target)\n   */\n  getProps<P extends (keyof T)[]>(props: P, final?: boolean): Pick<T, P[number]>;\n  getProps<P extends string>(props: P[], final?: boolean): Partial<Record<P, unknown>>;\n  getProps(props: string[], final?: boolean): Partial<Record<string, unknown>> {\n    const anims = this.$animations;\n    if (!final || !anims) {\n      // let's not create an object, if not needed\n      return this as Record<string, unknown>;\n    }\n    const ret: Record<string, unknown> = {};\n    props.forEach((prop) => {\n      ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n    });\n    return ret;\n  }\n}\n", "import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n  const tickOpts = scale.options.ticks;\n  const determinedMaxTicks = determineMaxTicks(scale);\n  const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n  const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n  const numMajorIndices = majorIndices.length;\n  const first = majorIndices[0];\n  const last = majorIndices[numMajorIndices - 1];\n  const newTicks = [];\n\n  // If there are too many major ticks to display them all\n  if (numMajorIndices > ticksLimit) {\n    skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n    return newTicks;\n  }\n\n  const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\n  if (numMajorIndices > 0) {\n    let i, ilen;\n    const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n    skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n    for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n      skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n    }\n    skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n    return newTicks;\n  }\n  skip(ticks, newTicks, spacing);\n  return newTicks;\n}\n\nfunction determineMaxTicks(scale) {\n  const offset = scale.options.offset;\n  const tickLength = scale._tickSize();\n  const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n  const maxChart = scale._maxLength / tickLength;\n  return Math.floor(Math.min(maxScale, maxChart));\n}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n  const evenMajorSpacing = getEvenSpacing(majorIndices);\n  const spacing = ticks.length / ticksLimit;\n\n  // If the major ticks are evenly spaced apart, place the minor ticks\n  // so that they divide the major ticks into even chunks\n  if (!evenMajorSpacing) {\n    return Math.max(spacing, 1);\n  }\n\n  const factors = _factorize(evenMajorSpacing);\n  for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n    const factor = factors[i];\n    if (factor > spacing) {\n      return factor;\n    }\n  }\n  return Math.max(spacing, 1);\n}\n\n/**\n * @param {Tick[]} ticks\n */\nfunction getMajorIndices(ticks) {\n  const result = [];\n  let i, ilen;\n  for (i = 0, ilen = ticks.length; i < ilen; i++) {\n    if (ticks[i].major) {\n      result.push(i);\n    }\n  }\n  return result;\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n  let count = 0;\n  let next = majorIndices[0];\n  let i;\n\n  spacing = Math.ceil(spacing);\n  for (i = 0; i < ticks.length; i++) {\n    if (i === next) {\n      newTicks.push(ticks[i]);\n      count++;\n      next = majorIndices[count * spacing];\n    }\n  }\n}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\n */\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n  const start = valueOrDefault(majorStart, 0);\n  const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n  let count = 0;\n  let length, i, next;\n\n  spacing = Math.ceil(spacing);\n  if (majorEnd) {\n    length = majorEnd - majorStart;\n    spacing = length / Math.floor(length / spacing);\n  }\n\n  next = start;\n\n  while (next < 0) {\n    count++;\n    next = Math.round(start + count * spacing);\n  }\n\n  for (i = Math.max(start, 0); i < end; i++) {\n    if (i === next) {\n      newTicks.push(ticks[i]);\n      count++;\n      next = Math.round(start + count * spacing);\n    }\n  }\n}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n  const len = arr.length;\n  let i, diff;\n\n  if (len < 2) {\n    return false;\n  }\n\n  for (diff = arr[0], i = 1; i < len; ++i) {\n    if (arr[i] - arr[i - 1] !== diff) {\n      return false;\n    }\n  }\n  return diff;\n}\n", "import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n  const result = [];\n  const increment = arr.length / numItems;\n  const len = arr.length;\n  let i = 0;\n\n  for (; i < len; i += increment) {\n    result.push(arr[Math.floor(i)]);\n  }\n  return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\n */\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n  const length = scale.ticks.length;\n  const validIndex = Math.min(index, length - 1);\n  const start = scale._startPixel;\n  const end = scale._endPixel;\n  const epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\n  let lineValue = scale.getPixelForTick(validIndex);\n  let offset;\n\n  if (offsetGridLines) {\n    if (length === 1) {\n      offset = Math.max(lineValue - start, end - lineValue);\n    } else if (index === 0) {\n      offset = (scale.getPixelForTick(1) - lineValue) / 2;\n    } else {\n      offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n    }\n    lineValue += validIndex < index ? offset : -offset;\n\n    // Return undefined if the pixel is out of the range\n    if (lineValue < start - epsilon || lineValue > end + epsilon) {\n      return;\n    }\n  }\n  return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\n */\nfunction garbageCollect(caches, length) {\n  each(caches, (cache) => {\n    const gc = cache.gc;\n    const gcLen = gc.length / 2;\n    let i;\n    if (gcLen > length) {\n      for (i = 0; i < gcLen; ++i) {\n        delete cache.data[gc[i]];\n      }\n      gc.splice(0, gcLen);\n    }\n  });\n}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n  return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n  if (!options.display) {\n    return 0;\n  }\n\n  const font = toFont(options.font, fallback);\n  const padding = toPadding(options.padding);\n  const lines = isArray(options.text) ? options.text.length : 1;\n\n  return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n  return createContext(parent, {\n    scale,\n    type: 'scale'\n  });\n}\n\nfunction createTickContext(parent, index, tick) {\n  return createContext(parent, {\n    tick,\n    index,\n    type: 'tick'\n  });\n}\n\nfunction titleAlign(align, position, reverse) {\n  /** @type {CanvasTextAlign} */\n  let ret = _toLeftRightCenter(align);\n  if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n    ret = reverseAlign(ret);\n  }\n  return ret;\n}\n\nfunction titleArgs(scale, offset, position, align) {\n  const {top, left, bottom, right, chart} = scale;\n  const {chartArea, scales} = chart;\n  let rotation = 0;\n  let maxWidth, titleX, titleY;\n  const height = bottom - top;\n  const width = right - left;\n\n  if (scale.isHorizontal()) {\n    titleX = _alignStartEnd(align, left, right);\n\n    if (isObject(position)) {\n      const positionAxisID = Object.keys(position)[0];\n      const value = position[positionAxisID];\n      titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n    } else if (position === 'center') {\n      titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n    } else {\n      titleY = offsetFromEdge(scale, position, offset);\n    }\n    maxWidth = right - left;\n  } else {\n    if (isObject(position)) {\n      const positionAxisID = Object.keys(position)[0];\n      const value = position[positionAxisID];\n      titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n    } else if (position === 'center') {\n      titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n    } else {\n      titleX = offsetFromEdge(scale, position, offset);\n    }\n    titleY = _alignStartEnd(align, bottom, top);\n    rotation = position === 'left' ? -HALF_PI : HALF_PI;\n  }\n  return {titleX, titleY, maxWidth, rotation};\n}\n\nexport default class Scale extends Element {\n\n  // eslint-disable-next-line max-statements\n  constructor(cfg) {\n    super();\n\n    /** @type {string} */\n    this.id = cfg.id;\n    /** @type {string} */\n    this.type = cfg.type;\n    /** @type {any} */\n    this.options = undefined;\n    /** @type {CanvasRenderingContext2D} */\n    this.ctx = cfg.ctx;\n    /** @type {Chart} */\n    this.chart = cfg.chart;\n\n    // implements box\n    /** @type {number} */\n    this.top = undefined;\n    /** @type {number} */\n    this.bottom = undefined;\n    /** @type {number} */\n    this.left = undefined;\n    /** @type {number} */\n    this.right = undefined;\n    /** @type {number} */\n    this.width = undefined;\n    /** @type {number} */\n    this.height = undefined;\n    this._margins = {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    };\n    /** @type {number} */\n    this.maxWidth = undefined;\n    /** @type {number} */\n    this.maxHeight = undefined;\n    /** @type {number} */\n    this.paddingTop = undefined;\n    /** @type {number} */\n    this.paddingBottom = undefined;\n    /** @type {number} */\n    this.paddingLeft = undefined;\n    /** @type {number} */\n    this.paddingRight = undefined;\n\n    // scale-specific properties\n    /** @type {string=} */\n    this.axis = undefined;\n    /** @type {number=} */\n    this.labelRotation = undefined;\n    this.min = undefined;\n    this.max = undefined;\n    this._range = undefined;\n    /** @type {Tick[]} */\n    this.ticks = [];\n    /** @type {object[]|null} */\n    this._gridLineItems = null;\n    /** @type {object[]|null} */\n    this._labelItems = null;\n    /** @type {object|null} */\n    this._labelSizes = null;\n    this._length = 0;\n    this._maxLength = 0;\n    this._longestTextCache = {};\n    /** @type {number} */\n    this._startPixel = undefined;\n    /** @type {number} */\n    this._endPixel = undefined;\n    this._reversePixels = false;\n    this._userMax = undefined;\n    this._userMin = undefined;\n    this._suggestedMax = undefined;\n    this._suggestedMin = undefined;\n    this._ticksLength = 0;\n    this._borderValue = 0;\n    this._cache = {};\n    this._dataLimitsCached = false;\n    this.$context = undefined;\n  }\n\n  /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n  init(options) {\n    this.options = options.setContext(this.getContext());\n\n    this.axis = options.axis;\n\n    // parse min/max value, so we can properly determine min/max for other scales\n    this._userMin = this.parse(options.min);\n    this._userMax = this.parse(options.max);\n    this._suggestedMin = this.parse(options.suggestedMin);\n    this._suggestedMax = this.parse(options.suggestedMax);\n  }\n\n  /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n  parse(raw, index) { // eslint-disable-line no-unused-vars\n    return raw;\n  }\n\n  /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\n  getUserBounds() {\n    let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n    _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n    _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n    _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n    _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n    return {\n      min: finiteOrDefault(_userMin, _suggestedMin),\n      max: finiteOrDefault(_userMax, _suggestedMax),\n      minDefined: isFinite(_userMin),\n      maxDefined: isFinite(_userMax)\n    };\n  }\n\n  /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n  getMinMax(canStack) {\n    let {min, max, minDefined, maxDefined} = this.getUserBounds();\n    let range;\n\n    if (minDefined && maxDefined) {\n      return {min, max};\n    }\n\n    const metas = this.getMatchingVisibleMetas();\n    for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n      range = metas[i].controller.getMinMax(this, canStack);\n      if (!minDefined) {\n        min = Math.min(min, range.min);\n      }\n      if (!maxDefined) {\n        max = Math.max(max, range.max);\n      }\n    }\n\n    // Make sure min <= max when only min or max is defined by user and the data is outside that range\n    min = maxDefined && min > max ? max : min;\n    max = minDefined && min > max ? min : max;\n\n    return {\n      min: finiteOrDefault(min, finiteOrDefault(max, min)),\n      max: finiteOrDefault(max, finiteOrDefault(min, max))\n    };\n  }\n\n  /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n  getPadding() {\n    return {\n      left: this.paddingLeft || 0,\n      top: this.paddingTop || 0,\n      right: this.paddingRight || 0,\n      bottom: this.paddingBottom || 0\n    };\n  }\n\n  /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n  getTicks() {\n    return this.ticks;\n  }\n\n  /**\n\t * @return {string[]}\n\t */\n  getLabels() {\n    const data = this.chart.data;\n    return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n  }\n\n  /**\n   * @return {import('../types.js').LabelItem[]}\n   */\n  getLabelItems(chartArea = this.chart.chartArea) {\n    const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n    return items;\n  }\n\n  // When a new layout is created, reset the data limits cache\n  beforeLayout() {\n    this._cache = {};\n    this._dataLimitsCached = false;\n  }\n\n  // These methods are ordered by lifecycle. Utilities then follow.\n  // Any function defined here is inherited by all scale types.\n  // Any function can be extended by the scale type\n\n  beforeUpdate() {\n    call(this.options.beforeUpdate, [this]);\n  }\n\n  /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t *   This space comes from two sources:\n\t *     - padding - space that's required to show the labels at the edges of the scale\n\t *     - thickness of scales or legends in another orientation\n\t */\n  update(maxWidth, maxHeight, margins) {\n    const {beginAtZero, grace, ticks: tickOpts} = this.options;\n    const sampleSize = tickOpts.sampleSize;\n\n    // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n    this.beforeUpdate();\n\n    // Absorb the master measurements\n    this.maxWidth = maxWidth;\n    this.maxHeight = maxHeight;\n    this._margins = margins = Object.assign({\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    }, margins);\n\n    this.ticks = null;\n    this._labelSizes = null;\n    this._gridLineItems = null;\n    this._labelItems = null;\n\n    // Dimensions\n    this.beforeSetDimensions();\n    this.setDimensions();\n    this.afterSetDimensions();\n\n    this._maxLength = this.isHorizontal()\n      ? this.width + margins.left + margins.right\n      : this.height + margins.top + margins.bottom;\n\n    // Data min/max\n    if (!this._dataLimitsCached) {\n      this.beforeDataLimits();\n      this.determineDataLimits();\n      this.afterDataLimits();\n      this._range = _addGrace(this, grace, beginAtZero);\n      this._dataLimitsCached = true;\n    }\n\n    this.beforeBuildTicks();\n\n    this.ticks = this.buildTicks() || [];\n\n    // Allow modification of ticks in callback.\n    this.afterBuildTicks();\n\n    // Compute tick rotation and fit using a sampled subset of labels\n    // We generally don't need to compute the size of every single label for determining scale size\n    const samplingEnabled = sampleSize < this.ticks.length;\n    this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n    // configure is called twice, once here, once from core.controller.updateLayout.\n    // Here we haven't been positioned yet, but dimensions are correct.\n    // Variables set in configure are needed for calculateLabelRotation, and\n    // it's ok that coordinates are not correct there, only dimensions matter.\n    this.configure();\n\n    // Tick Rotation\n    this.beforeCalculateLabelRotation();\n    this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n    this.afterCalculateLabelRotation();\n\n    // Auto-skip\n    if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n      this.ticks = autoSkip(this, this.ticks);\n      this._labelSizes = null;\n      this.afterAutoSkip();\n    }\n\n    if (samplingEnabled) {\n      // Generate labels using all non-skipped ticks\n      this._convertTicksToLabels(this.ticks);\n    }\n\n    this.beforeFit();\n    this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n    this.afterFit();\n\n    // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n    this.afterUpdate();\n  }\n\n  /**\n\t * @protected\n\t */\n  configure() {\n    let reversePixels = this.options.reverse;\n    let startPixel, endPixel;\n\n    if (this.isHorizontal()) {\n      startPixel = this.left;\n      endPixel = this.right;\n    } else {\n      startPixel = this.top;\n      endPixel = this.bottom;\n      // by default vertical scales are from bottom to top, so pixels are reversed\n      reversePixels = !reversePixels;\n    }\n    this._startPixel = startPixel;\n    this._endPixel = endPixel;\n    this._reversePixels = reversePixels;\n    this._length = endPixel - startPixel;\n    this._alignToPixels = this.options.alignToPixels;\n  }\n\n  afterUpdate() {\n    call(this.options.afterUpdate, [this]);\n  }\n\n  //\n\n  beforeSetDimensions() {\n    call(this.options.beforeSetDimensions, [this]);\n  }\n  setDimensions() {\n    // Set the unconstrained dimension before label rotation\n    if (this.isHorizontal()) {\n      // Reset position before calculating rotation\n      this.width = this.maxWidth;\n      this.left = 0;\n      this.right = this.width;\n    } else {\n      this.height = this.maxHeight;\n\n      // Reset position before calculating rotation\n      this.top = 0;\n      this.bottom = this.height;\n    }\n\n    // Reset padding\n    this.paddingLeft = 0;\n    this.paddingTop = 0;\n    this.paddingRight = 0;\n    this.paddingBottom = 0;\n  }\n  afterSetDimensions() {\n    call(this.options.afterSetDimensions, [this]);\n  }\n\n  _callHooks(name) {\n    this.chart.notifyPlugins(name, this.getContext());\n    call(this.options[name], [this]);\n  }\n\n  // Data limits\n  beforeDataLimits() {\n    this._callHooks('beforeDataLimits');\n  }\n  determineDataLimits() {}\n  afterDataLimits() {\n    this._callHooks('afterDataLimits');\n  }\n\n  //\n  beforeBuildTicks() {\n    this._callHooks('beforeBuildTicks');\n  }\n  /**\n\t * @return {object[]} the ticks\n\t */\n  buildTicks() {\n    return [];\n  }\n  afterBuildTicks() {\n    this._callHooks('afterBuildTicks');\n  }\n\n  beforeTickToLabelConversion() {\n    call(this.options.beforeTickToLabelConversion, [this]);\n  }\n  /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n  generateTickLabels(ticks) {\n    const tickOpts = this.options.ticks;\n    let i, ilen, tick;\n    for (i = 0, ilen = ticks.length; i < ilen; i++) {\n      tick = ticks[i];\n      tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n    }\n  }\n  afterTickToLabelConversion() {\n    call(this.options.afterTickToLabelConversion, [this]);\n  }\n\n  //\n\n  beforeCalculateLabelRotation() {\n    call(this.options.beforeCalculateLabelRotation, [this]);\n  }\n  calculateLabelRotation() {\n    const options = this.options;\n    const tickOpts = options.ticks;\n    const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n    const minRotation = tickOpts.minRotation || 0;\n    const maxRotation = tickOpts.maxRotation;\n    let labelRotation = minRotation;\n    let tickWidth, maxHeight, maxLabelDiagonal;\n\n    if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n      this.labelRotation = minRotation;\n      return;\n    }\n\n    const labelSizes = this._getLabelSizes();\n    const maxLabelWidth = labelSizes.widest.width;\n    const maxLabelHeight = labelSizes.highest.height;\n\n    // Estimate the width of each grid based on the canvas width, the maximum\n    // label width and the number of tick intervals\n    const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n    tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n    // Allow 3 pixels x2 padding either side for label readability\n    if (maxLabelWidth + 6 > tickWidth) {\n      tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n      maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n      maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n      labelRotation = toDegrees(Math.min(\n        Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n        Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n      ));\n      labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n    }\n\n    this.labelRotation = labelRotation;\n  }\n  afterCalculateLabelRotation() {\n    call(this.options.afterCalculateLabelRotation, [this]);\n  }\n  afterAutoSkip() {}\n\n  //\n\n  beforeFit() {\n    call(this.options.beforeFit, [this]);\n  }\n  fit() {\n    // Reset\n    const minSize = {\n      width: 0,\n      height: 0\n    };\n\n    const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n    const display = this._isVisible();\n    const isHorizontal = this.isHorizontal();\n\n    if (display) {\n      const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n      if (isHorizontal) {\n        minSize.width = this.maxWidth;\n        minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n      } else {\n        minSize.height = this.maxHeight; // fill all the height\n        minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n      }\n\n      // Don't bother fitting the ticks if we are not showing the labels\n      if (tickOpts.display && this.ticks.length) {\n        const {first, last, widest, highest} = this._getLabelSizes();\n        const tickPadding = tickOpts.padding * 2;\n        const angleRadians = toRadians(this.labelRotation);\n        const cos = Math.cos(angleRadians);\n        const sin = Math.sin(angleRadians);\n\n        if (isHorizontal) {\n        // A horizontal axis is more constrained by the height.\n          const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n          minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n        } else {\n        // A vertical axis is more constrained by the width. Labels are the\n        // dominant factor here, so get that length first and account for padding\n          const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n          minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n        }\n        this._calculatePadding(first, last, sin, cos);\n      }\n    }\n\n    this._handleMargins();\n\n    if (isHorizontal) {\n      this.width = this._length = chart.width - this._margins.left - this._margins.right;\n      this.height = minSize.height;\n    } else {\n      this.width = minSize.width;\n      this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n    }\n  }\n\n  _calculatePadding(first, last, sin, cos) {\n    const {ticks: {align, padding}, position} = this.options;\n    const isRotated = this.labelRotation !== 0;\n    const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n    if (this.isHorizontal()) {\n      const offsetLeft = this.getPixelForTick(0) - this.left;\n      const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n      let paddingLeft = 0;\n      let paddingRight = 0;\n\n      // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n      // which means that the right padding is dominated by the font height\n      if (isRotated) {\n        if (labelsBelowTicks) {\n          paddingLeft = cos * first.width;\n          paddingRight = sin * last.height;\n        } else {\n          paddingLeft = sin * first.height;\n          paddingRight = cos * last.width;\n        }\n      } else if (align === 'start') {\n        paddingRight = last.width;\n      } else if (align === 'end') {\n        paddingLeft = first.width;\n      } else if (align !== 'inner') {\n        paddingLeft = first.width / 2;\n        paddingRight = last.width / 2;\n      }\n\n      // Adjust padding taking into account changes in offsets\n      this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n      this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n    } else {\n      let paddingTop = last.height / 2;\n      let paddingBottom = first.height / 2;\n\n      if (align === 'start') {\n        paddingTop = 0;\n        paddingBottom = first.height;\n      } else if (align === 'end') {\n        paddingTop = last.height;\n        paddingBottom = 0;\n      }\n\n      this.paddingTop = paddingTop + padding;\n      this.paddingBottom = paddingBottom + padding;\n    }\n  }\n\n  /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n  _handleMargins() {\n    if (this._margins) {\n      this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n      this._margins.top = Math.max(this.paddingTop, this._margins.top);\n      this._margins.right = Math.max(this.paddingRight, this._margins.right);\n      this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n    }\n  }\n\n  afterFit() {\n    call(this.options.afterFit, [this]);\n  }\n\n  // Shared Methods\n  /**\n\t * @return {boolean}\n\t */\n  isHorizontal() {\n    const {axis, position} = this.options;\n    return position === 'top' || position === 'bottom' || axis === 'x';\n  }\n  /**\n\t * @return {boolean}\n\t */\n  isFullSize() {\n    return this.options.fullSize;\n  }\n\n  /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n  _convertTicksToLabels(ticks) {\n    this.beforeTickToLabelConversion();\n\n    this.generateTickLabels(ticks);\n\n    // Ticks should be skipped when callback returns null or undef, so lets remove those.\n    let i, ilen;\n    for (i = 0, ilen = ticks.length; i < ilen; i++) {\n      if (isNullOrUndef(ticks[i].label)) {\n        ticks.splice(i, 1);\n        ilen--;\n        i--;\n      }\n    }\n\n    this.afterTickToLabelConversion();\n  }\n\n  /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n  _getLabelSizes() {\n    let labelSizes = this._labelSizes;\n\n    if (!labelSizes) {\n      const sampleSize = this.options.ticks.sampleSize;\n      let ticks = this.ticks;\n      if (sampleSize < ticks.length) {\n        ticks = sample(ticks, sampleSize);\n      }\n\n      this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n    }\n\n    return labelSizes;\n  }\n\n  /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n  _computeLabelSizes(ticks, length, maxTicksLimit) {\n    const {ctx, _longestTextCache: caches} = this;\n    const widths = [];\n    const heights = [];\n    const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n    let widestLabelSize = 0;\n    let highestLabelSize = 0;\n    let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n    for (i = 0; i < length; i += increment) {\n      label = ticks[i].label;\n      tickFont = this._resolveTickFontOptions(i);\n      ctx.font = fontString = tickFont.string;\n      cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n      lineHeight = tickFont.lineHeight;\n      width = height = 0;\n      // Undefined labels and arrays should not be measured\n      if (!isNullOrUndef(label) && !isArray(label)) {\n        width = _measureText(ctx, cache.data, cache.gc, width, label);\n        height = lineHeight;\n      } else if (isArray(label)) {\n        // if it is an array let's measure each element\n        for (j = 0, jlen = label.length; j < jlen; ++j) {\n          nestedLabel = /** @type {string} */ (label[j]);\n          // Undefined labels and arrays should not be measured\n          if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n            width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n            height += lineHeight;\n          }\n        }\n      }\n      widths.push(width);\n      heights.push(height);\n      widestLabelSize = Math.max(width, widestLabelSize);\n      highestLabelSize = Math.max(height, highestLabelSize);\n    }\n    garbageCollect(caches, length);\n\n    const widest = widths.indexOf(widestLabelSize);\n    const highest = heights.indexOf(highestLabelSize);\n\n    const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\n    return {\n      first: valueAt(0),\n      last: valueAt(length - 1),\n      widest: valueAt(widest),\n      highest: valueAt(highest),\n      widths,\n      heights,\n    };\n  }\n\n  /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n  getLabelForValue(value) {\n    return value;\n  }\n\n  /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n  getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n    return NaN;\n  }\n\n  /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n  getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n  /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\n  getPixelForTick(index) {\n    const ticks = this.ticks;\n    if (index < 0 || index > ticks.length - 1) {\n      return null;\n    }\n    return this.getPixelForValue(ticks[index].value);\n  }\n\n  /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n  getPixelForDecimal(decimal) {\n    if (this._reversePixels) {\n      decimal = 1 - decimal;\n    }\n\n    const pixel = this._startPixel + decimal * this._length;\n    return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n  }\n\n  /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n  getDecimalForPixel(pixel) {\n    const decimal = (pixel - this._startPixel) / this._length;\n    return this._reversePixels ? 1 - decimal : decimal;\n  }\n\n  /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n  getBasePixel() {\n    return this.getPixelForValue(this.getBaseValue());\n  }\n\n  /**\n\t * @return {number}\n\t */\n  getBaseValue() {\n    const {min, max} = this;\n\n    return min < 0 && max < 0 ? max :\n      min > 0 && max > 0 ? min :\n      0;\n  }\n\n  /**\n\t * @protected\n\t */\n  getContext(index) {\n    const ticks = this.ticks || [];\n\n    if (index >= 0 && index < ticks.length) {\n      const tick = ticks[index];\n      return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n    }\n    return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n  }\n\n  /**\n\t * @return {number}\n\t * @private\n\t */\n  _tickSize() {\n    const optionTicks = this.options.ticks;\n\n    // Calculate space needed by label in axis direction.\n    const rot = toRadians(this.labelRotation);\n    const cos = Math.abs(Math.cos(rot));\n    const sin = Math.abs(Math.sin(rot));\n\n    const labelSizes = this._getLabelSizes();\n    const padding = optionTicks.autoSkipPadding || 0;\n    const w = labelSizes ? labelSizes.widest.width + padding : 0;\n    const h = labelSizes ? labelSizes.highest.height + padding : 0;\n\n    // Calculate space needed for 1 tick in axis direction.\n    return this.isHorizontal()\n      ? h * cos > w * sin ? w / cos : h / sin\n      : h * sin < w * cos ? h / cos : w / sin;\n  }\n\n  /**\n\t * @return {boolean}\n\t * @private\n\t */\n  _isVisible() {\n    const display = this.options.display;\n\n    if (display !== 'auto') {\n      return !!display;\n    }\n\n    return this.getMatchingVisibleMetas().length > 0;\n  }\n\n  /**\n\t * @private\n\t */\n  _computeGridLineItems(chartArea) {\n    const axis = this.axis;\n    const chart = this.chart;\n    const options = this.options;\n    const {grid, position, border} = options;\n    const offset = grid.offset;\n    const isHorizontal = this.isHorizontal();\n    const ticks = this.ticks;\n    const ticksLength = ticks.length + (offset ? 1 : 0);\n    const tl = getTickMarkLength(grid);\n    const items = [];\n\n    const borderOpts = border.setContext(this.getContext());\n    const axisWidth = borderOpts.display ? borderOpts.width : 0;\n    const axisHalfWidth = axisWidth / 2;\n    const alignBorderValue = function(pixel) {\n      return _alignPixel(chart, pixel, axisWidth);\n    };\n    let borderValue, i, lineValue, alignedLineValue;\n    let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n\n    if (position === 'top') {\n      borderValue = alignBorderValue(this.bottom);\n      ty1 = this.bottom - tl;\n      ty2 = borderValue - axisHalfWidth;\n      y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n      y2 = chartArea.bottom;\n    } else if (position === 'bottom') {\n      borderValue = alignBorderValue(this.top);\n      y1 = chartArea.top;\n      y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n      ty1 = borderValue + axisHalfWidth;\n      ty2 = this.top + tl;\n    } else if (position === 'left') {\n      borderValue = alignBorderValue(this.right);\n      tx1 = this.right - tl;\n      tx2 = borderValue - axisHalfWidth;\n      x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n      x2 = chartArea.right;\n    } else if (position === 'right') {\n      borderValue = alignBorderValue(this.left);\n      x1 = chartArea.left;\n      x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n      tx1 = borderValue + axisHalfWidth;\n      tx2 = this.left + tl;\n    } else if (axis === 'x') {\n      if (position === 'center') {\n        borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n      }\n\n      y1 = chartArea.top;\n      y2 = chartArea.bottom;\n      ty1 = borderValue + axisHalfWidth;\n      ty2 = ty1 + tl;\n    } else if (axis === 'y') {\n      if (position === 'center') {\n        borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n      }\n\n      tx1 = borderValue - axisHalfWidth;\n      tx2 = tx1 - tl;\n      x1 = chartArea.left;\n      x2 = chartArea.right;\n    }\n\n    const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n    const step = Math.max(1, Math.ceil(ticksLength / limit));\n    for (i = 0; i < ticksLength; i += step) {\n      const context = this.getContext(i);\n      const optsAtIndex = grid.setContext(context);\n      const optsAtIndexBorder = border.setContext(context);\n\n      const lineWidth = optsAtIndex.lineWidth;\n      const lineColor = optsAtIndex.color;\n      const borderDash = optsAtIndexBorder.dash || [];\n      const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n      const tickWidth = optsAtIndex.tickWidth;\n      const tickColor = optsAtIndex.tickColor;\n      const tickBorderDash = optsAtIndex.tickBorderDash || [];\n      const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n      lineValue = getPixelForGridLine(this, i, offset);\n\n      // Skip if the pixel is out of the range\n      if (lineValue === undefined) {\n        continue;\n      }\n\n      alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n      if (isHorizontal) {\n        tx1 = tx2 = x1 = x2 = alignedLineValue;\n      } else {\n        ty1 = ty2 = y1 = y2 = alignedLineValue;\n      }\n\n      items.push({\n        tx1,\n        ty1,\n        tx2,\n        ty2,\n        x1,\n        y1,\n        x2,\n        y2,\n        width: lineWidth,\n        color: lineColor,\n        borderDash,\n        borderDashOffset,\n        tickWidth,\n        tickColor,\n        tickBorderDash,\n        tickBorderDashOffset,\n      });\n    }\n\n    this._ticksLength = ticksLength;\n    this._borderValue = borderValue;\n\n    return items;\n  }\n\n  /**\n\t * @private\n\t */\n  _computeLabelItems(chartArea) {\n    const axis = this.axis;\n    const options = this.options;\n    const {position, ticks: optionTicks} = options;\n    const isHorizontal = this.isHorizontal();\n    const ticks = this.ticks;\n    const {align, crossAlign, padding, mirror} = optionTicks;\n    const tl = getTickMarkLength(options.grid);\n    const tickAndPadding = tl + padding;\n    const hTickAndPadding = mirror ? -padding : tickAndPadding;\n    const rotation = -toRadians(this.labelRotation);\n    const items = [];\n    let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n    let textBaseline = 'middle';\n\n    if (position === 'top') {\n      y = this.bottom - hTickAndPadding;\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (position === 'bottom') {\n      y = this.top + hTickAndPadding;\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (position === 'left') {\n      const ret = this._getYAxisLabelAlignment(tl);\n      textAlign = ret.textAlign;\n      x = ret.x;\n    } else if (position === 'right') {\n      const ret = this._getYAxisLabelAlignment(tl);\n      textAlign = ret.textAlign;\n      x = ret.x;\n    } else if (axis === 'x') {\n      if (position === 'center') {\n        y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n      }\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (axis === 'y') {\n      if (position === 'center') {\n        x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        x = this.chart.scales[positionAxisID].getPixelForValue(value);\n      }\n      textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n    }\n\n    if (axis === 'y') {\n      if (align === 'start') {\n        textBaseline = 'top';\n      } else if (align === 'end') {\n        textBaseline = 'bottom';\n      }\n    }\n\n    const labelSizes = this._getLabelSizes();\n    for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n      tick = ticks[i];\n      label = tick.label;\n\n      const optsAtIndex = optionTicks.setContext(this.getContext(i));\n      pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n      font = this._resolveTickFontOptions(i);\n      lineHeight = font.lineHeight;\n      lineCount = isArray(label) ? label.length : 1;\n      const halfCount = lineCount / 2;\n      const color = optsAtIndex.color;\n      const strokeColor = optsAtIndex.textStrokeColor;\n      const strokeWidth = optsAtIndex.textStrokeWidth;\n      let tickTextAlign = textAlign;\n\n      if (isHorizontal) {\n        x = pixel;\n\n        if (textAlign === 'inner') {\n          if (i === ilen - 1) {\n            tickTextAlign = !this.options.reverse ? 'right' : 'left';\n          } else if (i === 0) {\n            tickTextAlign = !this.options.reverse ? 'left' : 'right';\n          } else {\n            tickTextAlign = 'center';\n          }\n        }\n\n        if (position === 'top') {\n          if (crossAlign === 'near' || rotation !== 0) {\n            textOffset = -lineCount * lineHeight + lineHeight / 2;\n          } else if (crossAlign === 'center') {\n            textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n          } else {\n            textOffset = -labelSizes.highest.height + lineHeight / 2;\n          }\n        } else {\n          // eslint-disable-next-line no-lonely-if\n          if (crossAlign === 'near' || rotation !== 0) {\n            textOffset = lineHeight / 2;\n          } else if (crossAlign === 'center') {\n            textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n          } else {\n            textOffset = labelSizes.highest.height - lineCount * lineHeight;\n          }\n        }\n        if (mirror) {\n          textOffset *= -1;\n        }\n        if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n          x += (lineHeight / 2) * Math.sin(rotation);\n        }\n      } else {\n        y = pixel;\n        textOffset = (1 - lineCount) * lineHeight / 2;\n      }\n\n      let backdrop;\n\n      if (optsAtIndex.showLabelBackdrop) {\n        const labelPadding = toPadding(optsAtIndex.backdropPadding);\n        const height = labelSizes.heights[i];\n        const width = labelSizes.widths[i];\n\n        let top = textOffset - labelPadding.top;\n        let left = 0 - labelPadding.left;\n\n        switch (textBaseline) {\n        case 'middle':\n          top -= height / 2;\n          break;\n        case 'bottom':\n          top -= height;\n          break;\n        default:\n          break;\n        }\n\n        switch (textAlign) {\n        case 'center':\n          left -= width / 2;\n          break;\n        case 'right':\n          left -= width;\n          break;\n        case 'inner':\n          if (i === ilen - 1) {\n            left -= width;\n          } else if (i > 0) {\n            left -= width / 2;\n          }\n          break;\n        default:\n          break;\n        }\n\n        backdrop = {\n          left,\n          top,\n          width: width + labelPadding.width,\n          height: height + labelPadding.height,\n\n          color: optsAtIndex.backdropColor,\n        };\n      }\n\n      items.push({\n        label,\n        font,\n        textOffset,\n        options: {\n          rotation,\n          color,\n          strokeColor,\n          strokeWidth,\n          textAlign: tickTextAlign,\n          textBaseline,\n          translation: [x, y],\n          backdrop,\n        }\n      });\n    }\n\n    return items;\n  }\n\n  _getXAxisLabelAlignment() {\n    const {position, ticks} = this.options;\n    const rotation = -toRadians(this.labelRotation);\n\n    if (rotation) {\n      return position === 'top' ? 'left' : 'right';\n    }\n\n    let align = 'center';\n\n    if (ticks.align === 'start') {\n      align = 'left';\n    } else if (ticks.align === 'end') {\n      align = 'right';\n    } else if (ticks.align === 'inner') {\n      align = 'inner';\n    }\n\n    return align;\n  }\n\n  _getYAxisLabelAlignment(tl) {\n    const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n    const labelSizes = this._getLabelSizes();\n    const tickAndPadding = tl + padding;\n    const widest = labelSizes.widest.width;\n\n    let textAlign;\n    let x;\n\n    if (position === 'left') {\n      if (mirror) {\n        x = this.right + padding;\n\n        if (crossAlign === 'near') {\n          textAlign = 'left';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x += (widest / 2);\n        } else {\n          textAlign = 'right';\n          x += widest;\n        }\n      } else {\n        x = this.right - tickAndPadding;\n\n        if (crossAlign === 'near') {\n          textAlign = 'right';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x -= (widest / 2);\n        } else {\n          textAlign = 'left';\n          x = this.left;\n        }\n      }\n    } else if (position === 'right') {\n      if (mirror) {\n        x = this.left + padding;\n\n        if (crossAlign === 'near') {\n          textAlign = 'right';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x -= (widest / 2);\n        } else {\n          textAlign = 'left';\n          x -= widest;\n        }\n      } else {\n        x = this.left + tickAndPadding;\n\n        if (crossAlign === 'near') {\n          textAlign = 'left';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x += widest / 2;\n        } else {\n          textAlign = 'right';\n          x = this.right;\n        }\n      }\n    } else {\n      textAlign = 'right';\n    }\n\n    return {textAlign, x};\n  }\n\n  /**\n\t * @private\n\t */\n  _computeLabelArea() {\n    if (this.options.ticks.mirror) {\n      return;\n    }\n\n    const chart = this.chart;\n    const position = this.options.position;\n\n    if (position === 'left' || position === 'right') {\n      return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n    } if (position === 'top' || position === 'bottom') {\n      return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n    }\n  }\n\n  /**\n   * @protected\n   */\n  drawBackground() {\n    const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n    if (backgroundColor) {\n      ctx.save();\n      ctx.fillStyle = backgroundColor;\n      ctx.fillRect(left, top, width, height);\n      ctx.restore();\n    }\n  }\n\n  getLineWidthForValue(value) {\n    const grid = this.options.grid;\n    if (!this._isVisible() || !grid.display) {\n      return 0;\n    }\n    const ticks = this.ticks;\n    const index = ticks.findIndex(t => t.value === value);\n    if (index >= 0) {\n      const opts = grid.setContext(this.getContext(index));\n      return opts.lineWidth;\n    }\n    return 0;\n  }\n\n  /**\n\t * @protected\n\t */\n  drawGrid(chartArea) {\n    const grid = this.options.grid;\n    const ctx = this.ctx;\n    const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n    let i, ilen;\n\n    const drawLine = (p1, p2, style) => {\n      if (!style.width || !style.color) {\n        return;\n      }\n      ctx.save();\n      ctx.lineWidth = style.width;\n      ctx.strokeStyle = style.color;\n      ctx.setLineDash(style.borderDash || []);\n      ctx.lineDashOffset = style.borderDashOffset;\n\n      ctx.beginPath();\n      ctx.moveTo(p1.x, p1.y);\n      ctx.lineTo(p2.x, p2.y);\n      ctx.stroke();\n      ctx.restore();\n    };\n\n    if (grid.display) {\n      for (i = 0, ilen = items.length; i < ilen; ++i) {\n        const item = items[i];\n\n        if (grid.drawOnChartArea) {\n          drawLine(\n            {x: item.x1, y: item.y1},\n            {x: item.x2, y: item.y2},\n            item\n          );\n        }\n\n        if (grid.drawTicks) {\n          drawLine(\n            {x: item.tx1, y: item.ty1},\n            {x: item.tx2, y: item.ty2},\n            {\n              color: item.tickColor,\n              width: item.tickWidth,\n              borderDash: item.tickBorderDash,\n              borderDashOffset: item.tickBorderDashOffset\n            }\n          );\n        }\n      }\n    }\n  }\n\n  /**\n\t * @protected\n\t */\n  drawBorder() {\n    const {chart, ctx, options: {border, grid}} = this;\n    const borderOpts = border.setContext(this.getContext());\n    const axisWidth = border.display ? borderOpts.width : 0;\n    if (!axisWidth) {\n      return;\n    }\n    const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n    const borderValue = this._borderValue;\n    let x1, x2, y1, y2;\n\n    if (this.isHorizontal()) {\n      x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n      x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n      y1 = y2 = borderValue;\n    } else {\n      y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n      y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n      x1 = x2 = borderValue;\n    }\n    ctx.save();\n    ctx.lineWidth = borderOpts.width;\n    ctx.strokeStyle = borderOpts.color;\n\n    ctx.beginPath();\n    ctx.moveTo(x1, y1);\n    ctx.lineTo(x2, y2);\n    ctx.stroke();\n\n    ctx.restore();\n  }\n\n  /**\n\t * @protected\n\t */\n  drawLabels(chartArea) {\n    const optionTicks = this.options.ticks;\n\n    if (!optionTicks.display) {\n      return;\n    }\n\n    const ctx = this.ctx;\n\n    const area = this._computeLabelArea();\n    if (area) {\n      clipArea(ctx, area);\n    }\n\n    const items = this.getLabelItems(chartArea);\n    for (const item of items) {\n      const renderTextOptions = item.options;\n      const tickFont = item.font;\n      const label = item.label;\n      const y = item.textOffset;\n      renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n    }\n\n    if (area) {\n      unclipArea(ctx);\n    }\n  }\n\n  /**\n\t * @protected\n\t */\n  drawTitle() {\n    const {ctx, options: {position, title, reverse}} = this;\n\n    if (!title.display) {\n      return;\n    }\n\n    const font = toFont(title.font);\n    const padding = toPadding(title.padding);\n    const align = title.align;\n    let offset = font.lineHeight / 2;\n\n    if (position === 'bottom' || position === 'center' || isObject(position)) {\n      offset += padding.bottom;\n      if (isArray(title.text)) {\n        offset += font.lineHeight * (title.text.length - 1);\n      }\n    } else {\n      offset += padding.top;\n    }\n\n    const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\n    renderText(ctx, title.text, 0, 0, font, {\n      color: title.color,\n      maxWidth,\n      rotation,\n      textAlign: titleAlign(align, position, reverse),\n      textBaseline: 'middle',\n      translation: [titleX, titleY],\n    });\n  }\n\n  draw(chartArea) {\n    if (!this._isVisible()) {\n      return;\n    }\n\n    this.drawBackground();\n    this.drawGrid(chartArea);\n    this.drawBorder();\n    this.drawTitle();\n    this.drawLabels(chartArea);\n  }\n\n  /**\n\t * @return {object[]}\n\t * @private\n\t */\n  _layers() {\n    const opts = this.options;\n    const tz = opts.ticks && opts.ticks.z || 0;\n    const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n    const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n    if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n      // backward compatibility: draw has been overridden by custom scale\n      return [{\n        z: tz,\n        draw: (chartArea) => {\n          this.draw(chartArea);\n        }\n      }];\n    }\n\n    return [{\n      z: gz,\n      draw: (chartArea) => {\n        this.drawBackground();\n        this.drawGrid(chartArea);\n        this.drawTitle();\n      }\n    }, {\n      z: bz,\n      draw: () => {\n        this.drawBorder();\n      }\n    }, {\n      z: tz,\n      draw: (chartArea) => {\n        this.drawLabels(chartArea);\n      }\n    }];\n  }\n\n  /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n  getMatchingVisibleMetas(type) {\n    const metas = this.chart.getSortedVisibleDatasetMetas();\n    const axisID = this.axis + 'AxisID';\n    const result = [];\n    let i, ilen;\n\n    for (i = 0, ilen = metas.length; i < ilen; ++i) {\n      const meta = metas[i];\n      if (meta[axisID] === this.id && (!type || meta.type === type)) {\n        result.push(meta);\n      }\n    }\n    return result;\n  }\n\n  /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n  _resolveTickFontOptions(index) {\n    const opts = this.options.ticks.setContext(this.getContext(index));\n    return toFont(opts.font);\n  }\n\n  /**\n   * @protected\n   */\n  _maxDigits() {\n    const fontSize = this._resolveTickFontOptions(0).lineHeight;\n    return (this.isHorizontal() ? this.width : this.height) / fontSize;\n  }\n}\n", "import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class TypedRegistry {\n  constructor(type, scope, override) {\n    this.type = type;\n    this.scope = scope;\n    this.override = override;\n    this.items = Object.create(null);\n  }\n\n  isForType(type) {\n    return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n  }\n\n  /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n  register(item) {\n    const proto = Object.getPrototypeOf(item);\n    let parentScope;\n\n    if (isIChartComponent(proto)) {\n      // Make sure the parent is registered and note the scope where its defaults are.\n      parentScope = this.register(proto);\n    }\n\n    const items = this.items;\n    const id = item.id;\n    const scope = this.scope + '.' + id;\n\n    if (!id) {\n      throw new Error('class does not have id: ' + item);\n    }\n\n    if (id in items) {\n      // already registered\n      return scope;\n    }\n\n    items[id] = item;\n    registerDefaults(item, scope, parentScope);\n    if (this.override) {\n      defaults.override(item.id, item.overrides);\n    }\n\n    return scope;\n  }\n\n  /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n  get(id) {\n    return this.items[id];\n  }\n\n  /**\n\t * @param {IChartComponent} item\n\t */\n  unregister(item) {\n    const items = this.items;\n    const id = item.id;\n    const scope = this.scope;\n\n    if (id in items) {\n      delete items[id];\n    }\n\n    if (scope && id in defaults[scope]) {\n      delete defaults[scope][id];\n      if (this.override) {\n        delete overrides[id];\n      }\n    }\n  }\n}\n\nfunction registerDefaults(item, scope, parentScope) {\n  // Inherit the parent's defaults and keep existing defaults\n  const itemDefaults = merge(Object.create(null), [\n    parentScope ? defaults.get(parentScope) : {},\n    defaults.get(scope),\n    item.defaults\n  ]);\n\n  defaults.set(scope, itemDefaults);\n\n  if (item.defaultRoutes) {\n    routeDefaults(scope, item.defaultRoutes);\n  }\n\n  if (item.descriptors) {\n    defaults.describe(scope, item.descriptors);\n  }\n}\n\nfunction routeDefaults(scope, routes) {\n  Object.keys(routes).forEach(property => {\n    const propertyParts = property.split('.');\n    const sourceName = propertyParts.pop();\n    const sourceScope = [scope].concat(propertyParts).join('.');\n    const parts = routes[property].split('.');\n    const targetName = parts.pop();\n    const targetScope = parts.join('.');\n    defaults.route(sourceScope, sourceName, targetScope, targetName);\n  });\n}\n\nfunction isIChartComponent(proto) {\n  return 'id' in proto && 'defaults' in proto;\n}\n", "import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Registry {\n  constructor() {\n    this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n    this.elements = new TypedRegistry(Element, 'elements');\n    this.plugins = new TypedRegistry(Object, 'plugins');\n    this.scales = new TypedRegistry(Scale, 'scales');\n    // Order is important, Scale has Element in prototype chain,\n    // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n    this._typedRegistries = [this.controllers, this.scales, this.elements];\n  }\n\n  /**\n\t * @param  {...any} args\n\t */\n  add(...args) {\n    this._each('register', args);\n  }\n\n  remove(...args) {\n    this._each('unregister', args);\n  }\n\n  /**\n\t * @param  {...typeof DatasetController} args\n\t */\n  addControllers(...args) {\n    this._each('register', args, this.controllers);\n  }\n\n  /**\n\t * @param  {...typeof Element} args\n\t */\n  addElements(...args) {\n    this._each('register', args, this.elements);\n  }\n\n  /**\n\t * @param  {...any} args\n\t */\n  addPlugins(...args) {\n    this._each('register', args, this.plugins);\n  }\n\n  /**\n\t * @param  {...typeof Scale} args\n\t */\n  addScales(...args) {\n    this._each('register', args, this.scales);\n  }\n\n  /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n  getController(id) {\n    return this._get(id, this.controllers, 'controller');\n  }\n\n  /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n  getElement(id) {\n    return this._get(id, this.elements, 'element');\n  }\n\n  /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n  getPlugin(id) {\n    return this._get(id, this.plugins, 'plugin');\n  }\n\n  /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n  getScale(id) {\n    return this._get(id, this.scales, 'scale');\n  }\n\n  /**\n\t * @param  {...typeof DatasetController} args\n\t */\n  removeControllers(...args) {\n    this._each('unregister', args, this.controllers);\n  }\n\n  /**\n\t * @param  {...typeof Element} args\n\t */\n  removeElements(...args) {\n    this._each('unregister', args, this.elements);\n  }\n\n  /**\n\t * @param  {...any} args\n\t */\n  removePlugins(...args) {\n    this._each('unregister', args, this.plugins);\n  }\n\n  /**\n\t * @param  {...typeof Scale} args\n\t */\n  removeScales(...args) {\n    this._each('unregister', args, this.scales);\n  }\n\n  /**\n\t * @private\n\t */\n  _each(method, args, typedRegistry) {\n    [...args].forEach(arg => {\n      const reg = typedRegistry || this._getRegistryForType(arg);\n      if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n        this._exec(method, reg, arg);\n      } else {\n        // Handle loopable args\n        // Use case:\n        //  import * as plugins from './plugins.js';\n        //  Chart.register(plugins);\n        each(arg, item => {\n          // If there are mixed types in the loopable, make sure those are\n          // registered in correct registry\n          // Use case: (treemap exporting controller, elements etc)\n          //  import * as treemap from 'chartjs-chart-treemap.js';\n          //  Chart.register(treemap);\n\n          const itemReg = typedRegistry || this._getRegistryForType(item);\n          this._exec(method, itemReg, item);\n        });\n      }\n    });\n  }\n\n  /**\n\t * @private\n\t */\n  _exec(method, registry, component) {\n    const camelMethod = _capitalize(method);\n    call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n    registry[method](component);\n    call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n  }\n\n  /**\n\t * @private\n\t */\n  _getRegistryForType(type) {\n    for (let i = 0; i < this._typedRegistries.length; i++) {\n      const reg = this._typedRegistries[i];\n      if (reg.isForType(type)) {\n        return reg;\n      }\n    }\n    // plugins is the fallback registry\n    return this.plugins;\n  }\n\n  /**\n\t * @private\n\t */\n  _get(id, typedRegistry, type) {\n    const item = typedRegistry.get(id);\n    if (item === undefined) {\n      throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n    }\n    return item;\n  }\n\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n", "import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n  constructor() {\n    this._init = undefined;\n  }\n\n  /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n   * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n  notify(chart, hook, args, filter) {\n    if (hook === 'beforeInit') {\n      this._init = this._createDescriptors(chart, true);\n      this._notify(this._init, chart, 'install');\n    }\n\n    if (this._init === undefined) { // Do not trigger events before install\n      return;\n    }\n\n    const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n    const result = this._notify(descriptors, chart, hook, args);\n\n    if (hook === 'afterDestroy') {\n      this._notify(descriptors, chart, 'stop');\n      this._notify(this._init, chart, 'uninstall');\n      this._init = undefined; // Do not trigger events after uninstall\n    }\n    return result;\n  }\n\n  /**\n\t * @private\n\t */\n  _notify(descriptors, chart, hook, args) {\n    args = args || {};\n    for (const descriptor of descriptors) {\n      const plugin = descriptor.plugin;\n      const method = plugin[hook];\n      const params = [chart, args, descriptor.options];\n      if (callCallback(method, params, plugin) === false && args.cancelable) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  invalidate() {\n    // When plugins are registered, there is the possibility of a double\n    // invalidate situation. In this case, we only want to invalidate once.\n    // If we invalidate multiple times, the `_oldCache` is lost and all of the\n    // plugins are restarted without being correctly stopped.\n    // See https://github.com/chartjs/Chart.js/issues/8147\n    if (!isNullOrUndef(this._cache)) {\n      this._oldCache = this._cache;\n      this._cache = undefined;\n    }\n  }\n\n  /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n  _descriptors(chart) {\n    if (this._cache) {\n      return this._cache;\n    }\n\n    const descriptors = this._cache = this._createDescriptors(chart);\n\n    this._notifyStateChanges(chart);\n\n    return descriptors;\n  }\n\n  _createDescriptors(chart, all) {\n    const config = chart && chart.config;\n    const options = valueOrDefault(config.options && config.options.plugins, {});\n    const plugins = allPlugins(config);\n    // options === false => all plugins are disabled\n    return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n  }\n\n  /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n  _notifyStateChanges(chart) {\n    const previousDescriptors = this._oldCache || [];\n    const descriptors = this._cache;\n    const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n    this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n    this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n  }\n}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n  const localIds = {};\n  const plugins = [];\n  const keys = Object.keys(registry.plugins.items);\n  for (let i = 0; i < keys.length; i++) {\n    plugins.push(registry.getPlugin(keys[i]));\n  }\n\n  const local = config.plugins || [];\n  for (let i = 0; i < local.length; i++) {\n    const plugin = local[i];\n\n    if (plugins.indexOf(plugin) === -1) {\n      plugins.push(plugin);\n      localIds[plugin.id] = true;\n    }\n  }\n\n  return {plugins, localIds};\n}\n\nfunction getOpts(options, all) {\n  if (!all && options === false) {\n    return null;\n  }\n  if (options === true) {\n    return {};\n  }\n  return options;\n}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n  const result = [];\n  const context = chart.getContext();\n\n  for (const plugin of plugins) {\n    const id = plugin.id;\n    const opts = getOpts(options[id], all);\n    if (opts === null) {\n      continue;\n    }\n    result.push({\n      plugin,\n      options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n    });\n  }\n\n  return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n  const keys = config.pluginScopeKeys(plugin);\n  const scopes = config.getOptionScopes(opts, keys);\n  if (local && plugin.defaults) {\n    // make sure plugin defaults are in scopes for local (not registered) plugins\n    scopes.push(plugin.defaults);\n  }\n  return config.createResolver(scopes, context, [''], {\n    // These are just defaults that plugins can override\n    scriptable: false,\n    indexable: false,\n    allKeys: true\n  });\n}\n", "import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function getIndexAxis(type, options) {\n  const datasetDefaults = defaults.datasets[type] || {};\n  const datasetOptions = (options.datasets || {})[type] || {};\n  return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\n\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n  let axis = id;\n  if (id === '_index_') {\n    axis = indexAxis;\n  } else if (id === '_value_') {\n    axis = indexAxis === 'x' ? 'y' : 'x';\n  }\n  return axis;\n}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n  return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n  if (id === 'x' || id === 'y' || id === 'r') {\n    return id;\n  }\n}\n\nfunction axisFromPosition(position) {\n  if (position === 'top' || position === 'bottom') {\n    return 'x';\n  }\n  if (position === 'left' || position === 'right') {\n    return 'y';\n  }\n}\n\nexport function determineAxis(id, ...scaleOptions) {\n  if (idMatchesAxis(id)) {\n    return id;\n  }\n  for (const opts of scaleOptions) {\n    const axis = opts.axis\n      || axisFromPosition(opts.position)\n      || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n    if (axis) {\n      return axis;\n    }\n  }\n  throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n  if (dataset[axis + 'AxisID'] === id) {\n    return {axis};\n  }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n  if (config.data && config.data.datasets) {\n    const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n    if (boundDs.length) {\n      return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n    }\n  }\n  return {};\n}\n\nfunction mergeScaleConfig(config, options) {\n  const chartDefaults = overrides[config.type] || {scales: {}};\n  const configScales = options.scales || {};\n  const chartIndexAxis = getIndexAxis(config.type, options);\n  const scales = Object.create(null);\n\n  // First figure out first scale id's per axis.\n  Object.keys(configScales).forEach(id => {\n    const scaleConf = configScales[id];\n    if (!isObject(scaleConf)) {\n      return console.error(`Invalid scale configuration for scale: ${id}`);\n    }\n    if (scaleConf._proxy) {\n      return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n    }\n    const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n    const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n    const defaultScaleOptions = chartDefaults.scales || {};\n    scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n  });\n\n  // Then merge dataset defaults to scale configs\n  config.data.datasets.forEach(dataset => {\n    const type = dataset.type || config.type;\n    const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n    const datasetDefaults = overrides[type] || {};\n    const defaultScaleOptions = datasetDefaults.scales || {};\n    Object.keys(defaultScaleOptions).forEach(defaultID => {\n      const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n      const id = dataset[axis + 'AxisID'] || axis;\n      scales[id] = scales[id] || Object.create(null);\n      mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n    });\n  });\n\n  // apply scale defaults, if not overridden by dataset defaults\n  Object.keys(scales).forEach(key => {\n    const scale = scales[key];\n    mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n  });\n\n  return scales;\n}\n\nfunction initOptions(config) {\n  const options = config.options || (config.options = {});\n\n  options.plugins = valueOrDefault(options.plugins, {});\n  options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n  data = data || {};\n  data.datasets = data.datasets || [];\n  data.labels = data.labels || [];\n  return data;\n}\n\nfunction initConfig(config) {\n  config = config || {};\n  config.data = initData(config.data);\n\n  initOptions(config);\n\n  return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\nfunction cachedKeys(cacheKey, generate) {\n  let keys = keyCache.get(cacheKey);\n  if (!keys) {\n    keys = generate();\n    keyCache.set(cacheKey, keys);\n    keysCached.add(keys);\n  }\n  return keys;\n}\n\nconst addIfFound = (set, obj, key) => {\n  const opts = resolveObjectKey(obj, key);\n  if (opts !== undefined) {\n    set.add(opts);\n  }\n};\n\nexport default class Config {\n  constructor(config) {\n    this._config = initConfig(config);\n    this._scopeCache = new Map();\n    this._resolverCache = new Map();\n  }\n\n  get platform() {\n    return this._config.platform;\n  }\n\n  get type() {\n    return this._config.type;\n  }\n\n  set type(type) {\n    this._config.type = type;\n  }\n\n  get data() {\n    return this._config.data;\n  }\n\n  set data(data) {\n    this._config.data = initData(data);\n  }\n\n  get options() {\n    return this._config.options;\n  }\n\n  set options(options) {\n    this._config.options = options;\n  }\n\n  get plugins() {\n    return this._config.plugins;\n  }\n\n  update() {\n    const config = this._config;\n    this.clearCache();\n    initOptions(config);\n  }\n\n  clearCache() {\n    this._scopeCache.clear();\n    this._resolverCache.clear();\n  }\n\n  /**\n   * Returns the option scope keys for resolving dataset options.\n   * These keys do not include the dataset itself, because it is not under options.\n   * @param {string} datasetType\n   * @return {string[][]}\n   */\n  datasetScopeKeys(datasetType) {\n    return cachedKeys(datasetType,\n      () => [[\n        `datasets.${datasetType}`,\n        ''\n      ]]);\n  }\n\n  /**\n   * Returns the option scope keys for resolving dataset animation options.\n   * These keys do not include the dataset itself, because it is not under options.\n   * @param {string} datasetType\n   * @param {string} transition\n   * @return {string[][]}\n   */\n  datasetAnimationScopeKeys(datasetType, transition) {\n    return cachedKeys(`${datasetType}.transition.${transition}`,\n      () => [\n        [\n          `datasets.${datasetType}.transitions.${transition}`,\n          `transitions.${transition}`,\n        ],\n        // The following are used for looking up the `animations` and `animation` keys\n        [\n          `datasets.${datasetType}`,\n          ''\n        ]\n      ]);\n  }\n\n  /**\n   * Returns the options scope keys for resolving element options that belong\n   * to an dataset. These keys do not include the dataset itself, because it\n   * is not under options.\n   * @param {string} datasetType\n   * @param {string} elementType\n   * @return {string[][]}\n   */\n  datasetElementScopeKeys(datasetType, elementType) {\n    return cachedKeys(`${datasetType}-${elementType}`,\n      () => [[\n        `datasets.${datasetType}.elements.${elementType}`,\n        `datasets.${datasetType}`,\n        `elements.${elementType}`,\n        ''\n      ]]);\n  }\n\n  /**\n   * Returns the options scope keys for resolving plugin options.\n   * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n   * @return {string[][]}\n   */\n  pluginScopeKeys(plugin) {\n    const id = plugin.id;\n    const type = this.type;\n    return cachedKeys(`${type}-plugin-${id}`,\n      () => [[\n        `plugins.${id}`,\n        ...plugin.additionalOptionScopes || [],\n      ]]);\n  }\n\n  /**\n   * @private\n   */\n  _cachedScopes(mainScope, resetCache) {\n    const _scopeCache = this._scopeCache;\n    let cache = _scopeCache.get(mainScope);\n    if (!cache || resetCache) {\n      cache = new Map();\n      _scopeCache.set(mainScope, cache);\n    }\n    return cache;\n  }\n\n  /**\n   * Resolves the objects from options and defaults for option value resolution.\n   * @param {object} mainScope - The main scope object for options\n   * @param {string[][]} keyLists - The arrays of keys in resolution order\n   * @param {boolean} [resetCache] - reset the cache for this mainScope\n   */\n  getOptionScopes(mainScope, keyLists, resetCache) {\n    const {options, type} = this;\n    const cache = this._cachedScopes(mainScope, resetCache);\n    const cached = cache.get(keyLists);\n    if (cached) {\n      return cached;\n    }\n\n    const scopes = new Set();\n\n    keyLists.forEach(keys => {\n      if (mainScope) {\n        scopes.add(mainScope);\n        keys.forEach(key => addIfFound(scopes, mainScope, key));\n      }\n      keys.forEach(key => addIfFound(scopes, options, key));\n      keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n      keys.forEach(key => addIfFound(scopes, defaults, key));\n      keys.forEach(key => addIfFound(scopes, descriptors, key));\n    });\n\n    const array = Array.from(scopes);\n    if (array.length === 0) {\n      array.push(Object.create(null));\n    }\n    if (keysCached.has(keyLists)) {\n      cache.set(keyLists, array);\n    }\n    return array;\n  }\n\n  /**\n   * Returns the option scopes for resolving chart options\n   * @return {object[]}\n   */\n  chartOptionScopes() {\n    const {options, type} = this;\n\n    return [\n      options,\n      overrides[type] || {},\n      defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n      {type},\n      defaults,\n      descriptors\n    ];\n  }\n\n  /**\n   * @param {object[]} scopes\n   * @param {string[]} names\n   * @param {function|object} context\n   * @param {string[]} [prefixes]\n   * @return {object}\n   */\n  resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n    const result = {$shared: true};\n    const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n    let options = resolver;\n    if (needContext(resolver, names)) {\n      result.$shared = false;\n      context = isFunction(context) ? context() : context;\n      // subResolver is passed to scriptable options. It should not resolve to hover options.\n      const subResolver = this.createResolver(scopes, context, subPrefixes);\n      options = _attachContext(resolver, context, subResolver);\n    }\n\n    for (const prop of names) {\n      result[prop] = options[prop];\n    }\n    return result;\n  }\n\n  /**\n   * @param {object[]} scopes\n   * @param {object} [context]\n   * @param {string[]} [prefixes]\n   * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\n   */\n  createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n    const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n    return isObject(context)\n      ? _attachContext(resolver, context, undefined, descriptorDefaults)\n      : resolver;\n  }\n}\n\nfunction getResolver(resolverCache, scopes, prefixes) {\n  let cache = resolverCache.get(scopes);\n  if (!cache) {\n    cache = new Map();\n    resolverCache.set(scopes, cache);\n  }\n  const cacheKey = prefixes.join();\n  let cached = cache.get(cacheKey);\n  if (!cached) {\n    const resolver = _createResolver(scopes, prefixes);\n    cached = {\n      resolver,\n      subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n    };\n    cache.set(cacheKey, cached);\n  }\n  return cached;\n}\n\nconst hasFunction = value => isObject(value)\n  && Object.getOwnPropertyNames(value).some((key) => isFunction(value[key]));\n\nfunction needContext(proxy, names) {\n  const {isScriptable, isIndexable} = _descriptors(proxy);\n\n  for (const prop of names) {\n    const scriptable = isScriptable(prop);\n    const indexable = isIndexable(prop);\n    const value = (indexable || scriptable) && proxy[prop];\n    if ((scriptable && (isFunction(value) || hasFunction(value)))\n      || (indexable && isArray(value))) {\n      return true;\n    }\n  }\n  return false;\n}\n", "import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea, _isDomSupported, retinaScale, getDatasetClipArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n  return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\n\nfunction compare2Level(l1, l2) {\n  return function(a, b) {\n    return a[l1] === b[l1]\n      ? a[l2] - b[l2]\n      : a[l1] - b[l1];\n  };\n}\n\nfunction onAnimationsComplete(context) {\n  const chart = context.chart;\n  const animationOptions = chart.options.animation;\n\n  chart.notifyPlugins('afterRender');\n  callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n  const chart = context.chart;\n  const animationOptions = chart.options.animation;\n  callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n  if (_isDomSupported() && typeof item === 'string') {\n    item = document.getElementById(item);\n  } else if (item && item.length) {\n    // Support for array based queries (such as jQuery)\n    item = item[0];\n  }\n\n  if (item && item.canvas) {\n    // Support for any object associated to a canvas (including a context2d)\n    item = item.canvas;\n  }\n  return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n  const canvas = getCanvas(key);\n  return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n  const keys = Object.keys(obj);\n  for (const key of keys) {\n    const intKey = +key;\n    if (intKey >= start) {\n      const value = obj[key];\n      delete obj[key];\n      if (move > 0 || intKey > start) {\n        obj[intKey + move] = value;\n      }\n    }\n  }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n  if (!inChartArea || e.type === 'mouseout') {\n    return null;\n  }\n  if (isClick) {\n    return lastEvent;\n  }\n  return e;\n}\n\nclass Chart {\n\n  static defaults = defaults;\n  static instances = instances;\n  static overrides = overrides;\n  static registry = registry;\n  static version = version;\n  static getChart = getChart;\n\n  static register(...items) {\n    registry.add(...items);\n    invalidatePlugins();\n  }\n\n  static unregister(...items) {\n    registry.remove(...items);\n    invalidatePlugins();\n  }\n\n  // eslint-disable-next-line max-statements\n  constructor(item, userConfig) {\n    const config = this.config = new Config(userConfig);\n    const initialCanvas = getCanvas(item);\n    const existingChart = getChart(initialCanvas);\n    if (existingChart) {\n      throw new Error(\n        'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n      );\n    }\n\n    const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n    this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n    this.platform.updateConfig(config);\n\n    const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n    const canvas = context && context.canvas;\n    const height = canvas && canvas.height;\n    const width = canvas && canvas.width;\n\n    this.id = uid();\n    this.ctx = context;\n    this.canvas = canvas;\n    this.width = width;\n    this.height = height;\n    this._options = options;\n    // Store the previously used aspect ratio to determine if a resize\n    // is needed during updates. Do this after _options is set since\n    // aspectRatio uses a getter\n    this._aspectRatio = this.aspectRatio;\n    this._layers = [];\n    this._metasets = [];\n    this._stacks = undefined;\n    this.boxes = [];\n    this.currentDevicePixelRatio = undefined;\n    this.chartArea = undefined;\n    this._active = [];\n    this._lastEvent = undefined;\n    this._listeners = {};\n    /** @type {?{attach?: function, detach?: function, resize?: function}} */\n    this._responsiveListeners = undefined;\n    this._sortedMetasets = [];\n    this.scales = {};\n    this._plugins = new PluginService();\n    this.$proxies = {};\n    this._hiddenIndices = {};\n    this.attached = false;\n    this._animationsDisabled = undefined;\n    this.$context = undefined;\n    this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n    this._dataChanges = [];\n\n    // Add the chart instance to the global namespace\n    instances[this.id] = this;\n\n    if (!context || !canvas) {\n      // The given item is not a compatible context2d element, let's return before finalizing\n      // the chart initialization but after setting basic chart / controller properties that\n      // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n      // https://github.com/chartjs/Chart.js/issues/2807\n      console.error(\"Failed to create chart: can't acquire context from the given item\");\n      return;\n    }\n\n    animator.listen(this, 'complete', onAnimationsComplete);\n    animator.listen(this, 'progress', onAnimationProgress);\n\n    this._initialize();\n    if (this.attached) {\n      this.update();\n    }\n  }\n\n  get aspectRatio() {\n    const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n    if (!isNullOrUndef(aspectRatio)) {\n      // If aspectRatio is defined in options, use that.\n      return aspectRatio;\n    }\n\n    if (maintainAspectRatio && _aspectRatio) {\n      // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n      return _aspectRatio;\n    }\n\n    // Calculate\n    return height ? width / height : null;\n  }\n\n  get data() {\n    return this.config.data;\n  }\n\n  set data(data) {\n    this.config.data = data;\n  }\n\n  get options() {\n    return this._options;\n  }\n\n  set options(options) {\n    this.config.options = options;\n  }\n\n  get registry() {\n    return registry;\n  }\n\n  /**\n\t * @private\n\t */\n  _initialize() {\n    // Before init plugin notification\n    this.notifyPlugins('beforeInit');\n\n    if (this.options.responsive) {\n      this.resize();\n    } else {\n      retinaScale(this, this.options.devicePixelRatio);\n    }\n\n    this.bindEvents();\n\n    // After init plugin notification\n    this.notifyPlugins('afterInit');\n\n    return this;\n  }\n\n  clear() {\n    clearCanvas(this.canvas, this.ctx);\n    return this;\n  }\n\n  stop() {\n    animator.stop(this);\n    return this;\n  }\n\n  /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n  resize(width, height) {\n    if (!animator.running(this)) {\n      this._resize(width, height);\n    } else {\n      this._resizeBeforeDraw = {width, height};\n    }\n  }\n\n  _resize(width, height) {\n    const options = this.options;\n    const canvas = this.canvas;\n    const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n    const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n    const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n    const mode = this.width ? 'resize' : 'attach';\n\n    this.width = newSize.width;\n    this.height = newSize.height;\n    this._aspectRatio = this.aspectRatio;\n    if (!retinaScale(this, newRatio, true)) {\n      return;\n    }\n\n    this.notifyPlugins('resize', {size: newSize});\n\n    callCallback(options.onResize, [this, newSize], this);\n\n    if (this.attached) {\n      if (this._doResize(mode)) {\n        // The resize update is delayed, only draw without updating.\n        this.render();\n      }\n    }\n  }\n\n  ensureScalesHaveIDs() {\n    const options = this.options;\n    const scalesOptions = options.scales || {};\n\n    each(scalesOptions, (axisOptions, axisID) => {\n      axisOptions.id = axisID;\n    });\n  }\n\n  /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n  buildOrUpdateScales() {\n    const options = this.options;\n    const scaleOpts = options.scales;\n    const scales = this.scales;\n    const updated = Object.keys(scales).reduce((obj, id) => {\n      obj[id] = false;\n      return obj;\n    }, {});\n    let items = [];\n\n    if (scaleOpts) {\n      items = items.concat(\n        Object.keys(scaleOpts).map((id) => {\n          const scaleOptions = scaleOpts[id];\n          const axis = determineAxis(id, scaleOptions);\n          const isRadial = axis === 'r';\n          const isHorizontal = axis === 'x';\n          return {\n            options: scaleOptions,\n            dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n            dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n          };\n        })\n      );\n    }\n\n    each(items, (item) => {\n      const scaleOptions = item.options;\n      const id = scaleOptions.id;\n      const axis = determineAxis(id, scaleOptions);\n      const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n\n      if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n        scaleOptions.position = item.dposition;\n      }\n\n      updated[id] = true;\n      let scale = null;\n      if (id in scales && scales[id].type === scaleType) {\n        scale = scales[id];\n      } else {\n        const scaleClass = registry.getScale(scaleType);\n        scale = new scaleClass({\n          id,\n          type: scaleType,\n          ctx: this.ctx,\n          chart: this\n        });\n        scales[scale.id] = scale;\n      }\n\n      scale.init(scaleOptions, options);\n    });\n    // clear up discarded scales\n    each(updated, (hasUpdated, id) => {\n      if (!hasUpdated) {\n        delete scales[id];\n      }\n    });\n\n    each(scales, (scale) => {\n      layouts.configure(this, scale, scale.options);\n      layouts.addBox(this, scale);\n    });\n  }\n\n  /**\n\t * @private\n\t */\n  _updateMetasets() {\n    const metasets = this._metasets;\n    const numData = this.data.datasets.length;\n    const numMeta = metasets.length;\n\n    metasets.sort((a, b) => a.index - b.index);\n    if (numMeta > numData) {\n      for (let i = numData; i < numMeta; ++i) {\n        this._destroyDatasetMeta(i);\n      }\n      metasets.splice(numData, numMeta - numData);\n    }\n    this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n  }\n\n  /**\n\t * @private\n\t */\n  _removeUnreferencedMetasets() {\n    const {_metasets: metasets, data: {datasets}} = this;\n    if (metasets.length > datasets.length) {\n      delete this._stacks;\n    }\n    metasets.forEach((meta, index) => {\n      if (datasets.filter(x => x === meta._dataset).length === 0) {\n        this._destroyDatasetMeta(index);\n      }\n    });\n  }\n\n  buildOrUpdateControllers() {\n    const newControllers = [];\n    const datasets = this.data.datasets;\n    let i, ilen;\n\n    this._removeUnreferencedMetasets();\n\n    for (i = 0, ilen = datasets.length; i < ilen; i++) {\n      const dataset = datasets[i];\n      let meta = this.getDatasetMeta(i);\n      const type = dataset.type || this.config.type;\n\n      if (meta.type && meta.type !== type) {\n        this._destroyDatasetMeta(i);\n        meta = this.getDatasetMeta(i);\n      }\n      meta.type = type;\n      meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n      meta.order = dataset.order || 0;\n      meta.index = i;\n      meta.label = '' + dataset.label;\n      meta.visible = this.isDatasetVisible(i);\n\n      if (meta.controller) {\n        meta.controller.updateIndex(i);\n        meta.controller.linkScales();\n      } else {\n        const ControllerClass = registry.getController(type);\n        const {datasetElementType, dataElementType} = defaults.datasets[type];\n        Object.assign(ControllerClass, {\n          dataElementType: registry.getElement(dataElementType),\n          datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n        });\n        meta.controller = new ControllerClass(this, i);\n        newControllers.push(meta.controller);\n      }\n    }\n\n    this._updateMetasets();\n    return newControllers;\n  }\n\n  /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n  _resetElements() {\n    each(this.data.datasets, (dataset, datasetIndex) => {\n      this.getDatasetMeta(datasetIndex).controller.reset();\n    }, this);\n  }\n\n  /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n  reset() {\n    this._resetElements();\n    this.notifyPlugins('reset');\n  }\n\n  update(mode) {\n    const config = this.config;\n\n    config.update();\n    const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n    const animsDisabled = this._animationsDisabled = !options.animation;\n\n    this._updateScales();\n    this._checkEventBindings();\n    this._updateHiddenIndices();\n\n    // plugins options references might have change, let's invalidate the cache\n    // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n    this._plugins.invalidate();\n\n    if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n      return;\n    }\n\n    // Make sure dataset controllers are updated and new controllers are reset\n    const newControllers = this.buildOrUpdateControllers();\n\n    this.notifyPlugins('beforeElementsUpdate');\n\n    // Make sure all dataset controllers have correct meta data counts\n    let minPadding = 0;\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n      const {controller} = this.getDatasetMeta(i);\n      const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n      // New controllers will be reset after the layout pass, so we only want to modify\n      // elements added to new datasets\n      controller.buildOrUpdateElements(reset);\n      minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n    }\n    minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n    this._updateLayout(minPadding);\n\n    // Only reset the controllers if we have animations\n    if (!animsDisabled) {\n      // Can only reset the new controllers after the scales have been updated\n      // Reset is done to get the starting point for the initial animation\n      each(newControllers, (controller) => {\n        controller.reset();\n      });\n    }\n\n    this._updateDatasets(mode);\n\n    // Do this before render so that any plugins that need final scale updates can use it\n    this.notifyPlugins('afterUpdate', {mode});\n\n    this._layers.sort(compare2Level('z', '_idx'));\n\n    // Replay last event from before update, or set hover styles on active elements\n    const {_active, _lastEvent} = this;\n    if (_lastEvent) {\n      this._eventHandler(_lastEvent, true);\n    } else if (_active.length) {\n      this._updateHoverStyles(_active, _active, true);\n    }\n\n    this.render();\n  }\n\n  /**\n   * @private\n   */\n  _updateScales() {\n    each(this.scales, (scale) => {\n      layouts.removeBox(this, scale);\n    });\n\n    this.ensureScalesHaveIDs();\n    this.buildOrUpdateScales();\n  }\n\n  /**\n   * @private\n   */\n  _checkEventBindings() {\n    const options = this.options;\n    const existingEvents = new Set(Object.keys(this._listeners));\n    const newEvents = new Set(options.events);\n\n    if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n      // The configured events have changed. Rebind.\n      this.unbindEvents();\n      this.bindEvents();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _updateHiddenIndices() {\n    const {_hiddenIndices} = this;\n    const changes = this._getUniformDataChanges() || [];\n    for (const {method, start, count} of changes) {\n      const move = method === '_removeElements' ? -count : count;\n      moveNumericKeys(_hiddenIndices, start, move);\n    }\n  }\n\n  /**\n   * @private\n   */\n  _getUniformDataChanges() {\n    const _dataChanges = this._dataChanges;\n    if (!_dataChanges || !_dataChanges.length) {\n      return;\n    }\n\n    this._dataChanges = [];\n    const datasetCount = this.data.datasets.length;\n    const makeSet = (idx) => new Set(\n      _dataChanges\n        .filter(c => c[0] === idx)\n        .map((c, i) => i + ',' + c.splice(1).join(','))\n    );\n\n    const changeSet = makeSet(0);\n    for (let i = 1; i < datasetCount; i++) {\n      if (!setsEqual(changeSet, makeSet(i))) {\n        return;\n      }\n    }\n    return Array.from(changeSet)\n      .map(c => c.split(','))\n      .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n  }\n\n  /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n  _updateLayout(minPadding) {\n    if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n      return;\n    }\n\n    layouts.update(this, this.width, this.height, minPadding);\n\n    const area = this.chartArea;\n    const noArea = area.width <= 0 || area.height <= 0;\n\n    this._layers = [];\n    each(this.boxes, (box) => {\n      if (noArea && box.position === 'chartArea') {\n        // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n        return;\n      }\n\n      // configure is called twice, once in core.scale.update and once here.\n      // Here the boxes are fully updated and at their final positions.\n      if (box.configure) {\n        box.configure();\n      }\n      this._layers.push(...box._layers());\n    }, this);\n\n    this._layers.forEach((item, index) => {\n      item._idx = index;\n    });\n\n    this.notifyPlugins('afterLayout');\n  }\n\n  /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n  _updateDatasets(mode) {\n    if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n      return;\n    }\n\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this.getDatasetMeta(i).controller.configure();\n    }\n\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n    }\n\n    this.notifyPlugins('afterDatasetsUpdate', {mode});\n  }\n\n  /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n  _updateDataset(index, mode) {\n    const meta = this.getDatasetMeta(index);\n    const args = {meta, index, mode, cancelable: true};\n\n    if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n      return;\n    }\n\n    meta.controller._update(mode);\n\n    args.cancelable = false;\n    this.notifyPlugins('afterDatasetUpdate', args);\n  }\n\n  render() {\n    if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n      return;\n    }\n\n    if (animator.has(this)) {\n      if (this.attached && !animator.running(this)) {\n        animator.start(this);\n      }\n    } else {\n      this.draw();\n      onAnimationsComplete({chart: this});\n    }\n  }\n\n  draw() {\n    let i;\n    if (this._resizeBeforeDraw) {\n      const {width, height} = this._resizeBeforeDraw;\n      // Unset pending resize request now to avoid possible recursion within _resize\n      this._resizeBeforeDraw = null;\n      this._resize(width, height);\n    }\n    this.clear();\n\n    if (this.width <= 0 || this.height <= 0) {\n      return;\n    }\n\n    if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n      return;\n    }\n\n    // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n    // currently be part of layers. Instead, we draw\n    // layers <= 0 before(default, backward compat), and the rest after\n    const layers = this._layers;\n    for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n      layers[i].draw(this.chartArea);\n    }\n\n    this._drawDatasets();\n\n    // Rest of layers\n    for (; i < layers.length; ++i) {\n      layers[i].draw(this.chartArea);\n    }\n\n    this.notifyPlugins('afterDraw');\n  }\n\n  /**\n\t * @private\n\t */\n  _getSortedDatasetMetas(filterVisible) {\n    const metasets = this._sortedMetasets;\n    const result = [];\n    let i, ilen;\n\n    for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n      const meta = metasets[i];\n      if (!filterVisible || meta.visible) {\n        result.push(meta);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n  getSortedVisibleDatasetMetas() {\n    return this._getSortedDatasetMetas(true);\n  }\n\n  /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n  _drawDatasets() {\n    if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n      return;\n    }\n\n    const metasets = this.getSortedVisibleDatasetMetas();\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      this._drawDataset(metasets[i]);\n    }\n\n    this.notifyPlugins('afterDatasetsDraw');\n  }\n\n  /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n  _drawDataset(meta) {\n    const ctx = this.ctx;\n    const args = {\n      meta,\n      index: meta.index,\n      cancelable: true\n    };\n    // @ts-expect-error\n    const clip = getDatasetClipArea(this, meta);\n\n    if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n      return;\n    }\n\n    if (clip) {\n      clipArea(ctx, clip);\n    }\n\n    meta.controller.draw();\n\n    if (clip) {\n      unclipArea(ctx);\n    }\n\n    args.cancelable = false;\n    this.notifyPlugins('afterDatasetDraw', args);\n  }\n\n  /**\n   * Checks whether the given point is in the chart area.\n   * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n   * @returns {boolean}\n   */\n  isPointInArea(point) {\n    return _isPointInArea(point, this.chartArea, this._minPadding);\n  }\n\n  getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n    const method = Interaction.modes[mode];\n    if (typeof method === 'function') {\n      return method(this, e, options, useFinalPosition);\n    }\n\n    return [];\n  }\n\n  getDatasetMeta(datasetIndex) {\n    const dataset = this.data.datasets[datasetIndex];\n    const metasets = this._metasets;\n    let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n    if (!meta) {\n      meta = {\n        type: null,\n        data: [],\n        dataset: null,\n        controller: null,\n        hidden: null,\t\t\t// See isDatasetVisible() comment\n        xAxisID: null,\n        yAxisID: null,\n        order: dataset && dataset.order || 0,\n        index: datasetIndex,\n        _dataset: dataset,\n        _parsed: [],\n        _sorted: false\n      };\n      metasets.push(meta);\n    }\n\n    return meta;\n  }\n\n  getContext() {\n    return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n  }\n\n  getVisibleDatasetCount() {\n    return this.getSortedVisibleDatasetMetas().length;\n  }\n\n  isDatasetVisible(datasetIndex) {\n    const dataset = this.data.datasets[datasetIndex];\n    if (!dataset) {\n      return false;\n    }\n\n    const meta = this.getDatasetMeta(datasetIndex);\n\n    // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n    // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n    return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n  }\n\n  setDatasetVisibility(datasetIndex, visible) {\n    const meta = this.getDatasetMeta(datasetIndex);\n    meta.hidden = !visible;\n  }\n\n  toggleDataVisibility(index) {\n    this._hiddenIndices[index] = !this._hiddenIndices[index];\n  }\n\n  getDataVisibility(index) {\n    return !this._hiddenIndices[index];\n  }\n\n  /**\n\t * @private\n\t */\n  _updateVisibility(datasetIndex, dataIndex, visible) {\n    const mode = visible ? 'show' : 'hide';\n    const meta = this.getDatasetMeta(datasetIndex);\n    const anims = meta.controller._resolveAnimations(undefined, mode);\n\n    if (defined(dataIndex)) {\n      meta.data[dataIndex].hidden = !visible;\n      this.update();\n    } else {\n      this.setDatasetVisibility(datasetIndex, visible);\n      // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n      anims.update(meta, {visible});\n      this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n    }\n  }\n\n  hide(datasetIndex, dataIndex) {\n    this._updateVisibility(datasetIndex, dataIndex, false);\n  }\n\n  show(datasetIndex, dataIndex) {\n    this._updateVisibility(datasetIndex, dataIndex, true);\n  }\n\n  /**\n\t * @private\n\t */\n  _destroyDatasetMeta(datasetIndex) {\n    const meta = this._metasets[datasetIndex];\n    if (meta && meta.controller) {\n      meta.controller._destroy();\n    }\n    delete this._metasets[datasetIndex];\n  }\n\n  _stop() {\n    let i, ilen;\n    this.stop();\n    animator.remove(this);\n\n    for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this._destroyDatasetMeta(i);\n    }\n  }\n\n  destroy() {\n    this.notifyPlugins('beforeDestroy');\n    const {canvas, ctx} = this;\n\n    this._stop();\n    this.config.clearCache();\n\n    if (canvas) {\n      this.unbindEvents();\n      clearCanvas(canvas, ctx);\n      this.platform.releaseContext(ctx);\n      this.canvas = null;\n      this.ctx = null;\n    }\n\n    delete instances[this.id];\n\n    this.notifyPlugins('afterDestroy');\n  }\n\n  toBase64Image(...args) {\n    return this.canvas.toDataURL(...args);\n  }\n\n  /**\n\t * @private\n\t */\n  bindEvents() {\n    this.bindUserEvents();\n    if (this.options.responsive) {\n      this.bindResponsiveEvents();\n    } else {\n      this.attached = true;\n    }\n  }\n\n  /**\n   * @private\n   */\n  bindUserEvents() {\n    const listeners = this._listeners;\n    const platform = this.platform;\n\n    const _add = (type, listener) => {\n      platform.addEventListener(this, type, listener);\n      listeners[type] = listener;\n    };\n\n    const listener = (e, x, y) => {\n      e.offsetX = x;\n      e.offsetY = y;\n      this._eventHandler(e);\n    };\n\n    each(this.options.events, (type) => _add(type, listener));\n  }\n\n  /**\n   * @private\n   */\n  bindResponsiveEvents() {\n    if (!this._responsiveListeners) {\n      this._responsiveListeners = {};\n    }\n    const listeners = this._responsiveListeners;\n    const platform = this.platform;\n\n    const _add = (type, listener) => {\n      platform.addEventListener(this, type, listener);\n      listeners[type] = listener;\n    };\n    const _remove = (type, listener) => {\n      if (listeners[type]) {\n        platform.removeEventListener(this, type, listener);\n        delete listeners[type];\n      }\n    };\n\n    const listener = (width, height) => {\n      if (this.canvas) {\n        this.resize(width, height);\n      }\n    };\n\n    let detached; // eslint-disable-line prefer-const\n    const attached = () => {\n      _remove('attach', attached);\n\n      this.attached = true;\n      this.resize();\n\n      _add('resize', listener);\n      _add('detach', detached);\n    };\n\n    detached = () => {\n      this.attached = false;\n\n      _remove('resize', listener);\n\n      // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n      this._stop();\n      this._resize(0, 0);\n\n      _add('attach', attached);\n    };\n\n    if (platform.isAttached(this.canvas)) {\n      attached();\n    } else {\n      detached();\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  unbindEvents() {\n    each(this._listeners, (listener, type) => {\n      this.platform.removeEventListener(this, type, listener);\n    });\n    this._listeners = {};\n\n    each(this._responsiveListeners, (listener, type) => {\n      this.platform.removeEventListener(this, type, listener);\n    });\n    this._responsiveListeners = undefined;\n  }\n\n  updateHoverStyle(items, mode, enabled) {\n    const prefix = enabled ? 'set' : 'remove';\n    let meta, item, i, ilen;\n\n    if (mode === 'dataset') {\n      meta = this.getDatasetMeta(items[0].datasetIndex);\n      meta.controller['_' + prefix + 'DatasetHoverStyle']();\n    }\n\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      item = items[i];\n      const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n      if (controller) {\n        controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n      }\n    }\n  }\n\n  /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n  getActiveElements() {\n    return this._active || [];\n  }\n\n  /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n  setActiveElements(activeElements) {\n    const lastActive = this._active || [];\n    const active = activeElements.map(({datasetIndex, index}) => {\n      const meta = this.getDatasetMeta(datasetIndex);\n      if (!meta) {\n        throw new Error('No dataset found at index ' + datasetIndex);\n      }\n\n      return {\n        datasetIndex,\n        element: meta.data[index],\n        index,\n      };\n    });\n    const changed = !_elementsEqual(active, lastActive);\n\n    if (changed) {\n      this._active = active;\n      // Make sure we don't use the previous mouse event to override the active elements in update.\n      this._lastEvent = null;\n      this._updateHoverStyles(active, lastActive);\n    }\n  }\n\n  /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n   * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n  notifyPlugins(hook, args, filter) {\n    return this._plugins.notify(this, hook, args, filter);\n  }\n\n  /**\n   * Check if a plugin with the specific ID is registered and enabled\n   * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n   * @returns {boolean}\n   */\n  isPluginEnabled(pluginId) {\n    return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n  }\n\n  /**\n\t * @private\n\t */\n  _updateHoverStyles(active, lastActive, replay) {\n    const hoverOptions = this.options.hover;\n    const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n    const deactivated = diff(lastActive, active);\n    const activated = replay ? active : diff(active, lastActive);\n\n    if (deactivated.length) {\n      this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n    }\n\n    if (activated.length && hoverOptions.mode) {\n      this.updateHoverStyle(activated, hoverOptions.mode, true);\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _eventHandler(e, replay) {\n    const args = {\n      event: e,\n      replay,\n      cancelable: true,\n      inChartArea: this.isPointInArea(e)\n    };\n    const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n    if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n      return;\n    }\n\n    const changed = this._handleEvent(e, replay, args.inChartArea);\n\n    args.cancelable = false;\n    this.notifyPlugins('afterEvent', args, eventFilter);\n\n    if (changed || args.changed) {\n      this.render();\n    }\n\n    return this;\n  }\n\n  /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n   * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n  _handleEvent(e, replay, inChartArea) {\n    const {_active: lastActive = [], options} = this;\n\n    // If the event is replayed from `update`, we should evaluate with the final positions.\n    //\n    // The `replay`:\n    // It's the last event (excluding click) that has occurred before `update`.\n    // So mouse has not moved. It's also over the chart, because there is a `replay`.\n    //\n    // The why:\n    // If animations are active, the elements haven't moved yet compared to state before update.\n    // But if they will, we are activating the elements that would be active, if this check\n    // was done after the animations have completed. => \"final positions\".\n    // If there is no animations, the \"final\" and \"current\" positions are equal.\n    // This is done so we do not have to evaluate the active elements each animation frame\n    // - it would be expensive.\n    const useFinalPosition = replay;\n    const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n    const isClick = _isClickEvent(e);\n    const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n    if (inChartArea) {\n      // Set _lastEvent to null while we are processing the event handlers.\n      // This prevents recursion if the handler calls chart.update()\n      this._lastEvent = null;\n\n      // Invoke onHover hook\n      callCallback(options.onHover, [e, active, this], this);\n\n      if (isClick) {\n        callCallback(options.onClick, [e, active, this], this);\n      }\n    }\n\n    const changed = !_elementsEqual(active, lastActive);\n    if (changed || replay) {\n      this._active = active;\n      this._updateHoverStyles(active, lastActive, replay);\n    }\n\n    this._lastEvent = lastEvent;\n\n    return changed;\n  }\n\n  /**\n   * @param {ChartEvent} e - The event\n   * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n   * @param {boolean} inChartArea - Is the event inside chartArea\n   * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n   * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n   * @pravate\n   */\n  _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n    if (e.type === 'mouseout') {\n      return [];\n    }\n\n    if (!inChartArea) {\n      // Let user control the active elements outside chartArea. Eg. using Legend.\n      return lastActive;\n    }\n\n    const hoverOptions = this.options.hover;\n    return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n  }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n  return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n", "import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _angleDiff, _normalizeAngle, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\nfunction clipSelf(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n  const {startAngle, x, y, outerRadius, innerRadius, options} = element;\n  const {borderWidth, borderJoinStyle} = options;\n  const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n\n  if (innerRadius > 0) {\n    const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n    ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n  } else {\n    const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n\n    if (borderJoinStyle === 'round') {\n      ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n    } else if (borderJoinStyle === 'bevel') {\n      const r = 2 * clipWidth * clipWidth;\n      const endX = -r * Math.cos(endAngle + PI / 2) + x;\n      const endY = -r * Math.sin(endAngle + PI / 2) + y;\n      const startX = r * Math.cos(startAngle + PI / 2) + x;\n      const startY = r * Math.sin(startAngle + PI / 2) + y;\n      ctx.lineTo(endX, endY);\n      ctx.lineTo(startX, startY);\n    }\n  }\n  ctx.closePath();\n\n  ctx.moveTo(0, 0);\n  ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n\n  ctx.clip('evenodd');\n}\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n  const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n  let angleMargin = pixelMargin / outerRadius;\n\n  // Draw an inner border by clipping the arc and drawing a double-width border\n  // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n  if (innerRadius > pixelMargin) {\n    angleMargin = pixelMargin / innerRadius;\n    ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n  } else {\n    ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n  }\n  ctx.closePath();\n  ctx.clip();\n}\n\nfunction toRadiusCorners(value) {\n  return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n  const o = toRadiusCorners(arc.options.borderRadius);\n  const halfThickness = (outerRadius - innerRadius) / 2;\n  const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n  // Outer limits are complicated. We want to compute the available angular distance at\n  // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n  // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n  //\n  // If the borderRadius is large, that value can become negative.\n  // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n  // we know that the thickness term will dominate and compute the limits at that point\n  const computeOuterLimit = (val) => {\n    const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n    return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n  };\n\n  return {\n    outerStart: computeOuterLimit(o.outerStart),\n    outerEnd: computeOuterLimit(o.outerEnd),\n    innerStart: _limitValue(o.innerStart, 0, innerLimit),\n    innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n  };\n}\n\n/**\n * Convert (r, \uD835\uDF03) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n  return {\n    x: x + r * Math.cos(theta),\n    y: y + r * Math.sin(theta),\n  };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n *   Start      End\n *\n *    1--->a--->2    Outer\n *   /           \\\n *   8           3\n *   |           |\n *   |           |\n *   7           4\n *   \\           /\n *    6<---b<---5    Inner\n */\nfunction pathArc(\n  ctx: CanvasRenderingContext2D,\n  element: ArcElement,\n  offset: number,\n  spacing: number,\n  end: number,\n  circular: boolean,\n) {\n  const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n  const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n  const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n  let spacingOffset = 0;\n  const alpha = end - start;\n\n  if (spacing) {\n    // When spacing is present, it is the same for all items\n    // So we adjust the start and end angle of the arc such that\n    // the distance is the same as it would be without the spacing\n    const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n    const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n    const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n    const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n    spacingOffset = (alpha - adjustedAngle) / 2;\n  }\n\n  const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n  const angleOffset = (alpha - beta) / 2;\n  const startAngle = start + angleOffset + spacingOffset;\n  const endAngle = end - angleOffset - spacingOffset;\n  const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius(element, innerRadius, outerRadius, endAngle - startAngle);\n\n  const outerStartAdjustedRadius = outerRadius - outerStart;\n  const outerEndAdjustedRadius = outerRadius - outerEnd;\n  const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n  const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n  const innerStartAdjustedRadius = innerRadius + innerStart;\n  const innerEndAdjustedRadius = innerRadius + innerEnd;\n  const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n  const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n  ctx.beginPath();\n\n  if (circular) {\n    // The first arc segments from point 1 to point a to point 2\n    const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n    ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n    ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n    // The corner segment from point 2 to point 3\n    if (outerEnd > 0) {\n      const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n      ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n    }\n\n    // The line from point 3 to point 4\n    const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n    ctx.lineTo(p4.x, p4.y);\n\n    // The corner segment from point 4 to point 5\n    if (innerEnd > 0) {\n      const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n      ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n    }\n\n    // The inner arc from point 5 to point b to point 6\n    const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n    ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n    ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n    // The corner segment from point 6 to point 7\n    if (innerStart > 0) {\n      const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n      ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n    }\n\n    // The line from point 7 to point 8\n    const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n    ctx.lineTo(p8.x, p8.y);\n\n    // The corner segment from point 8 to point 1\n    if (outerStart > 0) {\n      const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n      ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n    }\n  } else {\n    ctx.moveTo(x, y);\n\n    const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n    const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n    ctx.lineTo(outerStartX, outerStartY);\n\n    const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n    const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n    ctx.lineTo(outerEndX, outerEndY);\n  }\n\n  ctx.closePath();\n}\n\nfunction drawArc(\n  ctx: CanvasRenderingContext2D,\n  element: ArcElement,\n  offset: number,\n  spacing: number,\n  circular: boolean,\n) {\n  const {fullCircles, startAngle, circumference} = element;\n  let endAngle = element.endAngle;\n  if (fullCircles) {\n    pathArc(ctx, element, offset, spacing, endAngle, circular);\n    for (let i = 0; i < fullCircles; ++i) {\n      ctx.fill();\n    }\n    if (!isNaN(circumference)) {\n      endAngle = startAngle + (circumference % TAU || TAU);\n    }\n  }\n  pathArc(ctx, element, offset, spacing, endAngle, circular);\n  ctx.fill();\n  return endAngle;\n}\n\nfunction drawBorder(\n  ctx: CanvasRenderingContext2D,\n  element: ArcElement,\n  offset: number,\n  spacing: number,\n  circular: boolean,\n) {\n  const {fullCircles, startAngle, circumference, options} = element;\n  const {borderWidth, borderJoinStyle, borderDash, borderDashOffset, borderRadius} = options;\n  const inner = options.borderAlign === 'inner';\n\n  if (!borderWidth) {\n    return;\n  }\n\n  ctx.setLineDash(borderDash || []);\n  ctx.lineDashOffset = borderDashOffset;\n\n  if (inner) {\n    ctx.lineWidth = borderWidth * 2;\n    ctx.lineJoin = borderJoinStyle || 'round';\n  } else {\n    ctx.lineWidth = borderWidth;\n    ctx.lineJoin = borderJoinStyle || 'bevel';\n  }\n\n  let endAngle = element.endAngle;\n  if (fullCircles) {\n    pathArc(ctx, element, offset, spacing, endAngle, circular);\n    for (let i = 0; i < fullCircles; ++i) {\n      ctx.stroke();\n    }\n    if (!isNaN(circumference)) {\n      endAngle = startAngle + (circumference % TAU || TAU);\n    }\n  }\n\n  if (inner) {\n    clipArc(ctx, element, endAngle);\n  }\n\n  if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n    clipSelf(ctx, element, endAngle);\n  }\n\n  if (!fullCircles) {\n    pathArc(ctx, element, offset, spacing, endAngle, circular);\n    ctx.stroke();\n  }\n}\n\nexport interface ArcProps extends Point {\n  startAngle: number;\n  endAngle: number;\n  innerRadius: number;\n  outerRadius: number;\n  circumference: number;\n}\n\nexport default class ArcElement extends Element<ArcProps, ArcOptions> {\n\n  static id = 'arc';\n\n  static defaults = {\n    borderAlign: 'center',\n    borderColor: '#fff',\n    borderDash: [],\n    borderDashOffset: 0,\n    borderJoinStyle: undefined,\n    borderRadius: 0,\n    borderWidth: 2,\n    offset: 0,\n    spacing: 0,\n    angle: undefined,\n    circular: true,\n    selfJoin: false,\n  };\n\n  static defaultRoutes = {\n    backgroundColor: 'backgroundColor'\n  };\n\n  static descriptors = {\n    _scriptable: true,\n    _indexable: (name) => name !== 'borderDash'\n  };\n\n  circumference: number;\n  endAngle: number;\n  fullCircles: number;\n  innerRadius: number;\n  outerRadius: number;\n  pixelMargin: number;\n  startAngle: number;\n\n  constructor(cfg) {\n    super();\n\n    this.options = undefined;\n    this.circumference = undefined;\n    this.startAngle = undefined;\n    this.endAngle = undefined;\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n    this.pixelMargin = 0;\n    this.fullCircles = 0;\n\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n\n  inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\n    const point = this.getProps(['x', 'y'], useFinalPosition);\n    const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n    const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n      'startAngle',\n      'endAngle',\n      'innerRadius',\n      'outerRadius',\n      'circumference'\n    ], useFinalPosition);\n    const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n    const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n    const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n    const betweenAngles = _circumference >= TAU || nonZeroBetween;\n    const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n    return (betweenAngles && withinRadius);\n  }\n\n  getCenterPoint(useFinalPosition: boolean) {\n    const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n      'x',\n      'y',\n      'startAngle',\n      'endAngle',\n      'innerRadius',\n      'outerRadius'\n    ], useFinalPosition);\n    const {offset, spacing} = this.options;\n    const halfAngle = (startAngle + endAngle) / 2;\n    const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n    return {\n      x: x + Math.cos(halfAngle) * halfRadius,\n      y: y + Math.sin(halfAngle) * halfRadius\n    };\n  }\n\n  tooltipPosition(useFinalPosition: boolean) {\n    return this.getCenterPoint(useFinalPosition);\n  }\n\n  draw(ctx: CanvasRenderingContext2D) {\n    const {options, circumference} = this;\n    const offset = (options.offset || 0) / 4;\n    const spacing = (options.spacing || 0) / 2;\n    const circular = options.circular;\n    this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n    this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n    if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n      return;\n    }\n\n    ctx.save();\n\n    const halfAngle = (this.startAngle + this.endAngle) / 2;\n    ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n    const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n    const radiusOffset = offset * fix;\n\n    ctx.fillStyle = options.backgroundColor;\n    ctx.strokeStyle = options.borderColor;\n\n    drawArc(ctx, this, radiusOffset, spacing, circular);\n    drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n    ctx.restore();\n  }\n}\n", "import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\n */\n\nfunction setStyle(ctx, options, style = options) {\n  ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n  ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n  ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n  ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n  ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n  ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\n\nfunction lineTo(ctx, previous, target) {\n  ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n  if (options.stepped) {\n    return _steppedLineTo;\n  }\n\n  if (options.tension || options.cubicInterpolationMode === 'monotone') {\n    return _bezierCurveTo;\n  }\n\n  return lineTo;\n}\n\nfunction pathVars(points, segment, params = {}) {\n  const count = points.length;\n  const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n  const {start: segmentStart, end: segmentEnd} = segment;\n  const start = Math.max(paramsStart, segmentStart);\n  const end = Math.min(paramsEnd, segmentEnd);\n  const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n\n  return {\n    count,\n    start,\n    loop: segment.loop,\n    ilen: end < start && !outside ? count + end - start : end - start\n  };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction pathSegment(ctx, line, segment, params) {\n  const {points, options} = line;\n  const {count, start, loop, ilen} = pathVars(points, segment, params);\n  const lineMethod = getLineMethod(options);\n  // eslint-disable-next-line prefer-const\n  let {move = true, reverse} = params || {};\n  let i, point, prev;\n\n  for (i = 0; i <= ilen; ++i) {\n    point = points[(start + (reverse ? ilen - i : i)) % count];\n\n    if (point.skip) {\n      // If there is a skipped point inside a segment, spanGaps must be true\n      continue;\n    } else if (move) {\n      ctx.moveTo(point.x, point.y);\n      move = false;\n    } else {\n      lineMethod(ctx, prev, point, reverse, options.stepped);\n    }\n\n    prev = point;\n  }\n\n  if (loop) {\n    point = points[(start + (reverse ? ilen : 0)) % count];\n    lineMethod(ctx, prev, point, reverse, options.stepped);\n  }\n\n  return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\n */\nfunction fastPathSegment(ctx, line, segment, params) {\n  const points = line.points;\n  const {count, start, ilen} = pathVars(points, segment, params);\n  const {move = true, reverse} = params || {};\n  let avgX = 0;\n  let countX = 0;\n  let i, point, prevX, minY, maxY, lastY;\n\n  const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n  const drawX = () => {\n    if (minY !== maxY) {\n      // Draw line to maxY and minY, using the average x-coordinate\n      ctx.lineTo(avgX, maxY);\n      ctx.lineTo(avgX, minY);\n      // Line to y-value of last point in group. So the line continues\n      // from correct position. Not using move, to have solid path.\n      ctx.lineTo(avgX, lastY);\n    }\n  };\n\n  if (move) {\n    point = points[pointIndex(0)];\n    ctx.moveTo(point.x, point.y);\n  }\n\n  for (i = 0; i <= ilen; ++i) {\n    point = points[pointIndex(i)];\n\n    if (point.skip) {\n      // If there is a skipped point inside a segment, spanGaps must be true\n      continue;\n    }\n\n    const x = point.x;\n    const y = point.y;\n    const truncX = x | 0; // truncated x-coordinate\n\n    if (truncX === prevX) {\n      // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n      if (y < minY) {\n        minY = y;\n      } else if (y > maxY) {\n        maxY = y;\n      }\n      // For first point in group, countX is `0`, so average will be `x` / 1.\n      avgX = (countX * avgX + x) / ++countX;\n    } else {\n      drawX();\n      // Draw line to next x-position, using the first (or only)\n      // y-value in that group\n      ctx.lineTo(x, y);\n\n      prevX = truncX;\n      countX = 0;\n      minY = maxY = y;\n    }\n    // Keep track of the last y-value in group\n    lastY = y;\n  }\n  drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\n */\nfunction _getSegmentMethod(line) {\n  const opts = line.options;\n  const borderDash = opts.borderDash && opts.borderDash.length;\n  const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n  return useFastPath ? fastPathSegment : pathSegment;\n}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n  if (options.stepped) {\n    return _steppedInterpolation;\n  }\n\n  if (options.tension || options.cubicInterpolationMode === 'monotone') {\n    return _bezierInterpolation;\n  }\n\n  return _pointInLine;\n}\n\nfunction strokePathWithCache(ctx, line, start, count) {\n  let path = line._path;\n  if (!path) {\n    path = line._path = new Path2D();\n    if (line.path(path, start, count)) {\n      path.closePath();\n    }\n  }\n  setStyle(ctx, line.options);\n  ctx.stroke(path);\n}\n\nfunction strokePathDirect(ctx, line, start, count) {\n  const {segments, options} = line;\n  const segmentMethod = _getSegmentMethod(line);\n\n  for (const segment of segments) {\n    setStyle(ctx, options, segment.style);\n    ctx.beginPath();\n    if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n      ctx.closePath();\n    }\n    ctx.stroke();\n  }\n}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n  if (usePath2D && !line.options.segment) {\n    strokePathWithCache(ctx, line, start, count);\n  } else {\n    strokePathDirect(ctx, line, start, count);\n  }\n}\n\nexport default class LineElement extends Element {\n\n  static id = 'line';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    borderCapStyle: 'butt',\n    borderDash: [],\n    borderDashOffset: 0,\n    borderJoinStyle: 'miter',\n    borderWidth: 3,\n    capBezierPoints: true,\n    cubicInterpolationMode: 'default',\n    fill: false,\n    spanGaps: false,\n    stepped: false,\n    tension: 0,\n  };\n\n  /**\n   * @type {any}\n   */\n  static defaultRoutes = {\n    backgroundColor: 'backgroundColor',\n    borderColor: 'borderColor'\n  };\n\n\n  static descriptors = {\n    _scriptable: true,\n    _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n  };\n\n\n  constructor(cfg) {\n    super();\n\n    this.animated = true;\n    this.options = undefined;\n    this._chart = undefined;\n    this._loop = undefined;\n    this._fullLoop = undefined;\n    this._path = undefined;\n    this._points = undefined;\n    this._segments = undefined;\n    this._decimated = false;\n    this._pointsUpdated = false;\n    this._datasetIndex = undefined;\n\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n\n  updateControlPoints(chartArea, indexAxis) {\n    const options = this.options;\n    if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n      const loop = options.spanGaps ? this._loop : this._fullLoop;\n      _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n      this._pointsUpdated = true;\n    }\n  }\n\n  set points(points) {\n    this._points = points;\n    delete this._segments;\n    delete this._path;\n    this._pointsUpdated = false;\n  }\n\n  get points() {\n    return this._points;\n  }\n\n  get segments() {\n    return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n  }\n\n  /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n  first() {\n    const segments = this.segments;\n    const points = this.points;\n    return segments.length && points[segments[0].start];\n  }\n\n  /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n  last() {\n    const segments = this.segments;\n    const points = this.points;\n    const count = segments.length;\n    return count && points[segments[count - 1].end];\n  }\n\n  /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n  interpolate(point, property) {\n    const options = this.options;\n    const value = point[property];\n    const points = this.points;\n    const segments = _boundSegments(this, {property, start: value, end: value});\n\n    if (!segments.length) {\n      return;\n    }\n\n    const result = [];\n    const _interpolate = _getInterpolationMethod(options);\n    let i, ilen;\n    for (i = 0, ilen = segments.length; i < ilen; ++i) {\n      const {start, end} = segments[i];\n      const p1 = points[start];\n      const p2 = points[end];\n      if (p1 === p2) {\n        result.push(p1);\n        continue;\n      }\n      const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n      const interpolated = _interpolate(p1, p2, t, options.stepped);\n      interpolated[property] = point[property];\n      result.push(interpolated);\n    }\n    return result.length === 1 ? result[0] : result;\n  }\n\n  /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n  pathSegment(ctx, segment, params) {\n    const segmentMethod = _getSegmentMethod(this);\n    return segmentMethod(ctx, this, segment, params);\n  }\n\n  /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n  path(ctx, start, count) {\n    const segments = this.segments;\n    const segmentMethod = _getSegmentMethod(this);\n    let loop = this._loop;\n\n    start = start || 0;\n    count = count || (this.points.length - start);\n\n    for (const segment of segments) {\n      loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n    }\n    return !!loop;\n  }\n\n  /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n  draw(ctx, chartArea, start, count) {\n    const options = this.options || {};\n    const points = this.points || [];\n\n    if (points.length && options.borderWidth) {\n      ctx.save();\n\n      draw(ctx, this, start, count);\n\n      ctx.restore();\n    }\n\n    if (this.animated) {\n      // When line is animated, the control points and path are not cached.\n      this._pointsUpdated = false;\n      this._path = undefined;\n    }\n  }\n}\n", "import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n  CartesianParsedData,\n  ChartArea,\n  Point,\n  PointHoverOptions,\n  PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n  const options = el.options;\n  const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n  return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element<PointProps, PointOptions & PointHoverOptions> {\n\n  static id = 'point';\n\n  parsed: CartesianParsedData;\n  skip?: boolean;\n  stop?: boolean;\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    borderWidth: 1,\n    hitRadius: 1,\n    hoverBorderWidth: 1,\n    hoverRadius: 4,\n    pointStyle: 'circle',\n    radius: 3,\n    rotation: 0\n  };\n\n  /**\n   * @type {any}\n   */\n  static defaultRoutes = {\n    backgroundColor: 'backgroundColor',\n    borderColor: 'borderColor'\n  };\n\n  constructor(cfg) {\n    super();\n\n    this.options = undefined;\n    this.parsed = undefined;\n    this.skip = undefined;\n    this.stop = undefined;\n\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n\n  inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\n    const options = this.options;\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n  }\n\n  inXRange(mouseX: number, useFinalPosition?: boolean) {\n    return inRange(this, mouseX, 'x', useFinalPosition);\n  }\n\n  inYRange(mouseY: number, useFinalPosition?: boolean) {\n    return inRange(this, mouseY, 'y', useFinalPosition);\n  }\n\n  getCenterPoint(useFinalPosition?: boolean) {\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return {x, y};\n  }\n\n  size(options?: Partial<PointOptions & PointHoverOptions>) {\n    options = options || this.options || {};\n    let radius = options.radius || 0;\n    radius = Math.max(radius, radius && options.hoverRadius || 0);\n    const borderWidth = radius && options.borderWidth || 0;\n    return (radius + borderWidth) * 2;\n  }\n\n  draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n    const options = this.options;\n\n    if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n      return;\n    }\n\n    ctx.strokeStyle = options.borderColor;\n    ctx.lineWidth = options.borderWidth;\n    ctx.fillStyle = options.backgroundColor;\n    drawPoint(ctx, options, this.x, this.y);\n  }\n\n  getRange() {\n    const options = this.options || {};\n    // @ts-expect-error Fallbacks should never be hit in practice\n    return options.radius + options.hitRadius;\n  }\n}\n", "import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n  const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n  let left, right, top, bottom, half;\n\n  if (bar.horizontal) {\n    half = height / 2;\n    left = Math.min(x, base);\n    right = Math.max(x, base);\n    top = y - half;\n    bottom = y + half;\n  } else {\n    half = width / 2;\n    left = x - half;\n    right = x + half;\n    top = Math.min(y, base);\n    bottom = Math.max(y, base);\n  }\n\n  return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n  return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n  const value = bar.options.borderWidth;\n  const skip = bar.borderSkipped;\n  const o = toTRBL(value);\n\n  return {\n    t: skipOrLimit(skip.top, o.top, 0, maxH),\n    r: skipOrLimit(skip.right, o.right, 0, maxW),\n    b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n    l: skipOrLimit(skip.left, o.left, 0, maxW)\n  };\n}\n\nfunction parseBorderRadius(bar, maxW, maxH) {\n  const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n  const value = bar.options.borderRadius;\n  const o = toTRBLCorners(value);\n  const maxR = Math.min(maxW, maxH);\n  const skip = bar.borderSkipped;\n\n  // If the value is an object, assume the user knows what they are doing\n  // and apply as directed.\n  const enableBorder = enableBorderRadius || isObject(value);\n\n  return {\n    topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n    topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n    bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n    bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n  };\n}\n\nfunction boundingRects(bar) {\n  const bounds = getBarBounds(bar);\n  const width = bounds.right - bounds.left;\n  const height = bounds.bottom - bounds.top;\n  const border = parseBorderWidth(bar, width / 2, height / 2);\n  const radius = parseBorderRadius(bar, width / 2, height / 2);\n\n  return {\n    outer: {\n      x: bounds.left,\n      y: bounds.top,\n      w: width,\n      h: height,\n      radius\n    },\n    inner: {\n      x: bounds.left + border.l,\n      y: bounds.top + border.t,\n      w: width - border.l - border.r,\n      h: height - border.t - border.b,\n      radius: {\n        topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n        topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n        bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n        bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n      }\n    }\n  };\n}\n\nfunction inRange(bar, x, y, useFinalPosition) {\n  const skipX = x === null;\n  const skipY = y === null;\n  const skipBoth = skipX && skipY;\n  const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n\n  return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n  return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n  ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\n\nfunction inflateRect(rect, amount, refRect = {}) {\n  const x = rect.x !== refRect.x ? -amount : 0;\n  const y = rect.y !== refRect.y ? -amount : 0;\n  const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n  const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n  return {\n    x: rect.x + x,\n    y: rect.y + y,\n    w: rect.w + w,\n    h: rect.h + h,\n    radius: rect.radius\n  };\n}\n\nexport default class BarElement extends Element {\n\n  static id = 'bar';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    borderSkipped: 'start',\n    borderWidth: 0,\n    borderRadius: 0,\n    inflateAmount: 'auto',\n    pointStyle: undefined\n  };\n\n  /**\n   * @type {any}\n   */\n  static defaultRoutes = {\n    backgroundColor: 'backgroundColor',\n    borderColor: 'borderColor'\n  };\n\n  constructor(cfg) {\n    super();\n\n    this.options = undefined;\n    this.horizontal = undefined;\n    this.base = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this.inflateAmount = undefined;\n\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n\n  draw(ctx) {\n    const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n    const {inner, outer} = boundingRects(this);\n    const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n    ctx.save();\n\n    if (outer.w !== inner.w || outer.h !== inner.h) {\n      ctx.beginPath();\n      addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n      ctx.clip();\n      addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n      ctx.fillStyle = borderColor;\n      ctx.fill('evenodd');\n    }\n\n    ctx.beginPath();\n    addRectPath(ctx, inflateRect(inner, inflateAmount));\n    ctx.fillStyle = backgroundColor;\n    ctx.fill();\n\n    ctx.restore();\n  }\n\n  inRange(mouseX, mouseY, useFinalPosition) {\n    return inRange(this, mouseX, mouseY, useFinalPosition);\n  }\n\n  inXRange(mouseX, useFinalPosition) {\n    return inRange(this, mouseX, null, useFinalPosition);\n  }\n\n  inYRange(mouseY, useFinalPosition) {\n    return inRange(this, null, mouseY, useFinalPosition);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    const {x, y, base, horizontal} = /** @type {BarProps} */ (this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition));\n    return {\n      x: horizontal ? (x + base) / 2 : x,\n      y: horizontal ? y : (y + base) / 2\n    };\n  }\n\n  getRange(axis) {\n    return axis === 'x' ? this.width / 2 : this.height / 2;\n  }\n}\n", "import {DoughnutController, PolarAreaController, defaults} from '../index.js';\nimport type {Chart, ChartDataset} from '../types.js';\n\nexport interface ColorsPluginOptions {\n  enabled?: boolean;\n  forceOverride?: boolean;\n}\n\ninterface ColorsDescriptor {\n  backgroundColor?: unknown;\n  borderColor?: unknown;\n}\n\nconst BORDER_COLORS = [\n  'rgb(54, 162, 235)', // blue\n  'rgb(255, 99, 132)', // red\n  'rgb(255, 159, 64)', // orange\n  'rgb(255, 205, 86)', // yellow\n  'rgb(75, 192, 192)', // green\n  'rgb(153, 102, 255)', // purple\n  'rgb(201, 203, 207)' // grey\n];\n\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map(color => color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\n\nfunction getBorderColor(i: number) {\n  return BORDER_COLORS[i % BORDER_COLORS.length];\n}\n\nfunction getBackgroundColor(i: number) {\n  return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\n\nfunction colorizeDefaultDataset(dataset: ChartDataset, i: number) {\n  dataset.borderColor = getBorderColor(i);\n  dataset.backgroundColor = getBackgroundColor(i);\n\n  return ++i;\n}\n\nfunction colorizeDoughnutDataset(dataset: ChartDataset, i: number) {\n  dataset.backgroundColor = dataset.data.map(() => getBorderColor(i++));\n\n  return i;\n}\n\nfunction colorizePolarAreaDataset(dataset: ChartDataset, i: number) {\n  dataset.backgroundColor = dataset.data.map(() => getBackgroundColor(i++));\n\n  return i;\n}\n\nfunction getColorizer(chart: Chart) {\n  let i = 0;\n\n  return (dataset: ChartDataset, datasetIndex: number) => {\n    const controller = chart.getDatasetMeta(datasetIndex).controller;\n\n    if (controller instanceof DoughnutController) {\n      i = colorizeDoughnutDataset(dataset, i);\n    } else if (controller instanceof PolarAreaController) {\n      i = colorizePolarAreaDataset(dataset, i);\n    } else if (controller) {\n      i = colorizeDefaultDataset(dataset, i);\n    }\n  };\n}\n\nfunction containsColorsDefinitions(\n  descriptors: ColorsDescriptor[] | Record<string, ColorsDescriptor>\n) {\n  let k: number | string;\n\n  for (k in descriptors) {\n    if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction containsColorsDefinition(\n  descriptor: ColorsDescriptor\n) {\n  return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\n\nfunction containsDefaultColorsDefenitions() {\n  return defaults.borderColor !== 'rgba(0,0,0,0.1)' || defaults.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\n\nexport default {\n  id: 'colors',\n\n  defaults: {\n    enabled: true,\n    forceOverride: false\n  } as ColorsPluginOptions,\n\n  beforeLayout(chart: Chart, _args, options: ColorsPluginOptions) {\n    if (!options.enabled) {\n      return;\n    }\n\n    const {\n      data: {datasets},\n      options: chartOptions\n    } = chart.config;\n    const {elements} = chartOptions;\n\n    const containsColorDefenition = (\n      containsColorsDefinitions(datasets) ||\n      containsColorsDefinition(chartOptions) ||\n      (elements && containsColorsDefinitions(elements)) ||\n      containsDefaultColorsDefenitions());\n\n    if (!options.forceOverride && containsColorDefenition) {\n      return;\n    }\n\n    const colorizer = getColorizer(chart);\n\n    datasets.forEach(colorizer);\n  }\n};\n", "import {_limitValue, _lookupByKey, isNullOrUndef, resolve} from '../helpers/index.js';\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n  /**\n   * Implementation of the Largest Triangle Three Buckets algorithm.\n   *\n   * This implementation is based on the original implementation by Sveinn Steinarsson\n   * in https://github.com/sveinn-steinarsson/flot-downsample/blob/master/jquery.flot.downsample.js\n   *\n   * The original implementation is MIT licensed.\n   */\n  const samples = options.samples || availableWidth;\n  // There are less points than the threshold, returning the whole array\n  if (samples >= count) {\n    return data.slice(start, start + count);\n  }\n\n  const decimated = [];\n\n  const bucketWidth = (count - 2) / (samples - 2);\n  let sampledIndex = 0;\n  const endIndex = start + count - 1;\n  // Starting from offset\n  let a = start;\n  let i, maxAreaPoint, maxArea, area, nextA;\n\n  decimated[sampledIndex++] = data[a];\n\n  for (i = 0; i < samples - 2; i++) {\n    let avgX = 0;\n    let avgY = 0;\n    let j;\n\n    // Adding offset\n    const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n    const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n    const avgRangeLength = avgRangeEnd - avgRangeStart;\n\n    for (j = avgRangeStart; j < avgRangeEnd; j++) {\n      avgX += data[j].x;\n      avgY += data[j].y;\n    }\n\n    avgX /= avgRangeLength;\n    avgY /= avgRangeLength;\n\n    // Adding offset\n    const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n    const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n    const {x: pointAx, y: pointAy} = data[a];\n\n    // Note that this is changed from the original algorithm which initializes these\n    // values to 1. The reason for this change is that if the area is small, nextA\n    // would never be set and thus a crash would occur in the next loop as `a` would become\n    // `undefined`. Since the area is always positive, but could be 0 in the case of a flat trace,\n    // initializing with a negative number is the correct solution.\n    maxArea = area = -1;\n\n    for (j = rangeOffs; j < rangeTo; j++) {\n      area = 0.5 * Math.abs(\n        (pointAx - avgX) * (data[j].y - pointAy) -\n        (pointAx - data[j].x) * (avgY - pointAy)\n      );\n\n      if (area > maxArea) {\n        maxArea = area;\n        maxAreaPoint = data[j];\n        nextA = j;\n      }\n    }\n\n    decimated[sampledIndex++] = maxAreaPoint;\n    a = nextA;\n  }\n\n  // Include the last point\n  decimated[sampledIndex++] = data[endIndex];\n\n  return decimated;\n}\n\nfunction minMaxDecimation(data, start, count, availableWidth) {\n  let avgX = 0;\n  let countX = 0;\n  let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n  const decimated = [];\n  const endIndex = start + count - 1;\n\n  const xMin = data[start].x;\n  const xMax = data[endIndex].x;\n  const dx = xMax - xMin;\n\n  for (i = start; i < start + count; ++i) {\n    point = data[i];\n    x = (point.x - xMin) / dx * availableWidth;\n    y = point.y;\n    const truncX = x | 0;\n\n    if (truncX === prevX) {\n      // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n      if (y < minY) {\n        minY = y;\n        minIndex = i;\n      } else if (y > maxY) {\n        maxY = y;\n        maxIndex = i;\n      }\n      // For first point in group, countX is `0`, so average will be `x` / 1.\n      // Use point.x here because we're computing the average data `x` value\n      avgX = (countX * avgX + point.x) / ++countX;\n    } else {\n      // Push up to 4 points, 3 for the last interval and the first point for this interval\n      const lastIndex = i - 1;\n\n      if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n        // The interval is defined by 4 points: start, min, max, end.\n        // The starting point is already considered at this point, so we need to determine which\n        // of the other points to add. We need to sort these points to ensure the decimated data\n        // is still sorted and then ensure there are no duplicates.\n        const intermediateIndex1 = Math.min(minIndex, maxIndex);\n        const intermediateIndex2 = Math.max(minIndex, maxIndex);\n\n        if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n          decimated.push({\n            ...data[intermediateIndex1],\n            x: avgX,\n          });\n        }\n        if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n          decimated.push({\n            ...data[intermediateIndex2],\n            x: avgX\n          });\n        }\n      }\n\n      // lastIndex === startIndex will occur when a range has only 1 point which could\n      // happen with very uneven data\n      if (i > 0 && lastIndex !== startIndex) {\n        // Last point in the previous interval\n        decimated.push(data[lastIndex]);\n      }\n\n      // Start of the new interval\n      decimated.push(point);\n      prevX = truncX;\n      countX = 0;\n      minY = maxY = y;\n      minIndex = maxIndex = startIndex = i;\n    }\n  }\n\n  return decimated;\n}\n\nfunction cleanDecimatedDataset(dataset) {\n  if (dataset._decimated) {\n    const data = dataset._data;\n    delete dataset._decimated;\n    delete dataset._data;\n    Object.defineProperty(dataset, 'data', {\n      configurable: true,\n      enumerable: true,\n      writable: true,\n      value: data,\n    });\n  }\n}\n\nfunction cleanDecimatedData(chart) {\n  chart.data.datasets.forEach((dataset) => {\n    cleanDecimatedDataset(dataset);\n  });\n}\n\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n  const pointCount = points.length;\n\n  let start = 0;\n  let count;\n\n  const {iScale} = meta;\n  const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n  if (minDefined) {\n    start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n  }\n  if (maxDefined) {\n    count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n  } else {\n    count = pointCount - start;\n  }\n\n  return {start, count};\n}\n\nexport default {\n  id: 'decimation',\n\n  defaults: {\n    algorithm: 'min-max',\n    enabled: false,\n  },\n\n  beforeElementsUpdate: (chart, args, options) => {\n    if (!options.enabled) {\n      // The decimation plugin may have been previously enabled. Need to remove old `dataset._data` handlers\n      cleanDecimatedData(chart);\n      return;\n    }\n\n    // Assume the entire chart is available to show a few more points than needed\n    const availableWidth = chart.width;\n\n    chart.data.datasets.forEach((dataset, datasetIndex) => {\n      const {_data, indexAxis} = dataset;\n      const meta = chart.getDatasetMeta(datasetIndex);\n      const data = _data || dataset.data;\n\n      if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n        // Decimation is only supported for lines that have an X indexAxis\n        return;\n      }\n\n      if (!meta.controller.supportsDecimation) {\n        // Only line datasets are supported\n        return;\n      }\n\n      const xAxis = chart.scales[meta.xAxisID];\n      if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n        // Only linear interpolation is supported\n        return;\n      }\n\n      if (chart.options.parsing) {\n        // Plugin only supports data that does not need parsing\n        return;\n      }\n\n      let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n      const threshold = options.threshold || 4 * availableWidth;\n      if (count <= threshold) {\n        // No decimation is required until we are above this threshold\n        cleanDecimatedDataset(dataset);\n        return;\n      }\n\n      if (isNullOrUndef(_data)) {\n        // First time we are seeing this dataset\n        // We override the 'data' property with a setter that stores the\n        // raw data in _data, but reads the decimated data from _decimated\n        dataset._data = data;\n        delete dataset.data;\n        Object.defineProperty(dataset, 'data', {\n          configurable: true,\n          enumerable: true,\n          get: function() {\n            return this._decimated;\n          },\n          set: function(d) {\n            this._data = d;\n          }\n        });\n      }\n\n      // Point the chart to the decimated data\n      let decimated;\n      switch (options.algorithm) {\n      case 'lttb':\n        decimated = lttbDecimation(data, start, count, availableWidth, options);\n        break;\n      case 'min-max':\n        decimated = minMaxDecimation(data, start, count, availableWidth);\n        break;\n      default:\n        throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n      }\n\n      dataset._decimated = decimated;\n    });\n  },\n\n  destroy(chart) {\n    cleanDecimatedData(chart);\n  }\n};\n", "import {_boundSegment, _boundSegments, _normalizeAngle} from '../../helpers/index.js';\n\nexport function _segments(line, target, property) {\n  const segments = line.segments;\n  const points = line.points;\n  const tpoints = target.points;\n  const parts = [];\n\n  for (const segment of segments) {\n    let {start, end} = segment;\n    end = _findSegmentEnd(start, end, points);\n\n    const bounds = _getBounds(property, points[start], points[end], segment.loop);\n\n    if (!target.segments) {\n      // Special case for boundary not supporting `segments` (simpleArc)\n      // Bounds are provided as `target` for partial circle, or undefined for full circle\n      parts.push({\n        source: segment,\n        target: bounds,\n        start: points[start],\n        end: points[end]\n      });\n      continue;\n    }\n\n    // Get all segments from `target` that intersect the bounds of current segment of `line`\n    const targetSegments = _boundSegments(target, bounds);\n\n    for (const tgt of targetSegments) {\n      const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n      const fillSources = _boundSegment(segment, points, subBounds);\n\n      for (const fillSource of fillSources) {\n        parts.push({\n          source: fillSource,\n          target: tgt,\n          start: {\n            [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n          },\n          end: {\n            [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n          }\n        });\n      }\n    }\n  }\n  return parts;\n}\n\nexport function _getBounds(property, first, last, loop) {\n  if (loop) {\n    return;\n  }\n  let start = first[property];\n  let end = last[property];\n\n  if (property === 'angle') {\n    start = _normalizeAngle(start);\n    end = _normalizeAngle(end);\n  }\n  return {property, start, end};\n}\n\nexport function _pointsFromSegments(boundary, line) {\n  const {x = null, y = null} = boundary || {};\n  const linePoints = line.points;\n  const points = [];\n  line.segments.forEach(({start, end}) => {\n    end = _findSegmentEnd(start, end, linePoints);\n    const first = linePoints[start];\n    const last = linePoints[end];\n    if (y !== null) {\n      points.push({x: first.x, y});\n      points.push({x: last.x, y});\n    } else if (x !== null) {\n      points.push({x, y: first.y});\n      points.push({x, y: last.y});\n    }\n  });\n  return points;\n}\n\nexport function _findSegmentEnd(start, end, points) {\n  for (;end > start; end--) {\n    const point = points[end];\n    if (!isNaN(point.x) && !isNaN(point.y)) {\n      break;\n    }\n  }\n  return end;\n}\n\nfunction _getEdge(a, b, prop, fn) {\n  if (a && b) {\n    return fn(a[prop], b[prop]);\n  }\n  return a ? a[prop] : b ? b[prop] : 0;\n}\n", "/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {isArray} from '../../helpers/index.js';\nimport {_pointsFromSegments} from './filler.segment.js';\n\n/**\n * @param {PointElement[] | { x: number; y: number; }} boundary\n * @param {LineElement} line\n * @return {LineElement?}\n */\nexport function _createBoundaryLine(boundary, line) {\n  let points = [];\n  let _loop = false;\n\n  if (isArray(boundary)) {\n    _loop = true;\n    // @ts-ignore\n    points = boundary;\n  } else {\n    points = _pointsFromSegments(boundary, line);\n  }\n\n  return points.length ? new LineElement({\n    points,\n    options: {tension: 0},\n    _loop,\n    _fullLoop: _loop\n  }) : null;\n}\n\nexport function _shouldApplyFill(source) {\n  return source && source.fill !== false;\n}\n", "import {isObject, isFinite, valueOrDefault} from '../../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.line.js').default } LineElement\n * @typedef { import('../../types/index.js').FillTarget } FillTarget\n * @typedef { import('../../types/index.js').ComplexFillTarget } ComplexFillTarget\n */\n\nexport function _resolveTarget(sources, index, propagate) {\n  const source = sources[index];\n  let fill = source.fill;\n  const visited = [index];\n  let target;\n\n  if (!propagate) {\n    return fill;\n  }\n\n  while (fill !== false && visited.indexOf(fill) === -1) {\n    if (!isFinite(fill)) {\n      return fill;\n    }\n\n    target = sources[fill];\n    if (!target) {\n      return false;\n    }\n\n    if (target.visible) {\n      return fill;\n    }\n\n    visited.push(fill);\n    fill = target.fill;\n  }\n\n  return false;\n}\n\n/**\n * @param {LineElement} line\n * @param {number} index\n * @param {number} count\n */\nexport function _decodeFill(line, index, count) {\n  /** @type {string | {value: number}} */\n  const fill = parseFillOption(line);\n\n  if (isObject(fill)) {\n    return isNaN(fill.value) ? false : fill;\n  }\n\n  let target = parseFloat(fill);\n\n  if (isFinite(target) && Math.floor(target) === target) {\n    return decodeTargetIndex(fill[0], index, target, count);\n  }\n\n  return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\n\nfunction decodeTargetIndex(firstCh, index, target, count) {\n  if (firstCh === '-' || firstCh === '+') {\n    target = index + target;\n  }\n\n  if (target === index || target < 0 || target >= count) {\n    return false;\n  }\n\n  return target;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @returns {number | null}\n */\nexport function _getTargetPixel(fill, scale) {\n  let pixel = null;\n  if (fill === 'start') {\n    pixel = scale.bottom;\n  } else if (fill === 'end') {\n    pixel = scale.top;\n  } else if (isObject(fill)) {\n    // @ts-ignore\n    pixel = scale.getPixelForValue(fill.value);\n  } else if (scale.getBasePixel) {\n    pixel = scale.getBasePixel();\n  }\n  return pixel;\n}\n\n/**\n * @param {FillTarget | ComplexFillTarget} fill\n * @param {Scale} scale\n * @param {number} startValue\n * @returns {number | undefined}\n */\nexport function _getTargetValue(fill, scale, startValue) {\n  let value;\n\n  if (fill === 'start') {\n    value = startValue;\n  } else if (fill === 'end') {\n    value = scale.options.reverse ? scale.min : scale.max;\n  } else if (isObject(fill)) {\n    // @ts-ignore\n    value = fill.value;\n  } else {\n    value = scale.getBaseValue();\n  }\n  return value;\n}\n\n/**\n * @param {LineElement} line\n */\nfunction parseFillOption(line) {\n  const options = line.options;\n  const fillOption = options.fill;\n  let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n\n  if (fill === undefined) {\n    fill = !!options.backgroundColor;\n  }\n\n  if (fill === false || fill === null) {\n    return false;\n  }\n\n  if (fill === true) {\n    return 'origin';\n  }\n  return fill;\n}\n", "/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nimport {LineElement} from '../../elements/index.js';\nimport {_isBetween} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\n\n/**\n * @param {{ chart: Chart; scale: Scale; index: number; line: LineElement; }} source\n * @return {LineElement}\n */\nexport function _buildStackLine(source) {\n  const {scale, index, line} = source;\n  const points = [];\n  const segments = line.segments;\n  const sourcePoints = line.points;\n  const linesBelow = getLinesBelow(scale, index);\n  linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    for (let j = segment.start; j <= segment.end; j++) {\n      addPointsBelow(points, sourcePoints[j], linesBelow);\n    }\n  }\n  return new LineElement({points, options: {}});\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @return {LineElement[]}\n */\nfunction getLinesBelow(scale, index) {\n  const below = [];\n  const metas = scale.getMatchingVisibleMetas('line');\n\n  for (let i = 0; i < metas.length; i++) {\n    const meta = metas[i];\n    if (meta.index === index) {\n      break;\n    }\n    if (!meta.hidden) {\n      below.unshift(meta.dataset);\n    }\n  }\n  return below;\n}\n\n/**\n * @param {PointElement[]} points\n * @param {PointElement} sourcePoint\n * @param {LineElement[]} linesBelow\n */\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n  const postponed = [];\n  for (let j = 0; j < linesBelow.length; j++) {\n    const line = linesBelow[j];\n    const {first, last, point} = findPoint(line, sourcePoint, 'x');\n\n    if (!point || (first && last)) {\n      continue;\n    }\n    if (first) {\n      // First point of a segment -> need to add another point before this,\n      postponed.unshift(point);\n    } else {\n      points.push(point);\n      if (!last) {\n        // In the middle of a segment, no need to add more points.\n        break;\n      }\n    }\n  }\n  points.push(...postponed);\n}\n\n/**\n * @param {LineElement} line\n * @param {PointElement} sourcePoint\n * @param {string} property\n * @returns {{point?: PointElement, first?: boolean, last?: boolean}}\n */\nfunction findPoint(line, sourcePoint, property) {\n  const point = line.interpolate(sourcePoint, property);\n  if (!point) {\n    return {};\n  }\n\n  const pointValue = point[property];\n  const segments = line.segments;\n  const linePoints = line.points;\n  let first = false;\n  let last = false;\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    const firstValue = linePoints[segment.start][property];\n    const lastValue = linePoints[segment.end][property];\n    if (_isBetween(pointValue, firstValue, lastValue)) {\n      first = pointValue === firstValue;\n      last = pointValue === lastValue;\n      break;\n    }\n  }\n  return {first, last, point};\n}\n", "import {TAU} from '../../helpers/index.js';\n\n// TODO: use elements.ArcElement instead\nexport class simpleArc {\n  constructor(opts) {\n    this.x = opts.x;\n    this.y = opts.y;\n    this.radius = opts.radius;\n  }\n\n  pathSegment(ctx, bounds, opts) {\n    const {x, y, radius} = this;\n    bounds = bounds || {start: 0, end: TAU};\n    ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n    return !opts.bounds;\n  }\n\n  interpolate(point) {\n    const {x, y, radius} = this;\n    const angle = point.angle;\n    return {\n      x: x + Math.cos(angle) * radius,\n      y: y + Math.sin(angle) * radius,\n      angle\n    };\n  }\n}\n", "import {isFinite} from '../../helpers/index.js';\nimport {_createBoundaryLine} from './filler.helper.js';\nimport {_getTargetPixel, _getTargetValue} from './filler.options.js';\nimport {_buildStackLine} from './filler.target.stack.js';\nimport {simpleArc} from './simpleArc.js';\n\n/**\n * @typedef { import('../../core/core.controller.js').default } Chart\n * @typedef { import('../../core/core.scale.js').default } Scale\n * @typedef { import('../../elements/element.point.js').default } PointElement\n */\n\nexport function _getTarget(source) {\n  const {chart, fill, line} = source;\n\n  if (isFinite(fill)) {\n    return getLineByIndex(chart, fill);\n  }\n\n  if (fill === 'stack') {\n    return _buildStackLine(source);\n  }\n\n  if (fill === 'shape') {\n    return true;\n  }\n\n  const boundary = computeBoundary(source);\n\n  if (boundary instanceof simpleArc) {\n    return boundary;\n  }\n\n  return _createBoundaryLine(boundary, line);\n}\n\n/**\n * @param {Chart} chart\n * @param {number} index\n */\nfunction getLineByIndex(chart, index) {\n  const meta = chart.getDatasetMeta(index);\n  const visible = meta && chart.isDatasetVisible(index);\n  return visible ? meta.dataset : null;\n}\n\nfunction computeBoundary(source) {\n  const scale = source.scale || {};\n\n  if (scale.getPointPositionForValue) {\n    return computeCircularBoundary(source);\n  }\n  return computeLinearBoundary(source);\n}\n\n\nfunction computeLinearBoundary(source) {\n  const {scale = {}, fill} = source;\n  const pixel = _getTargetPixel(fill, scale);\n\n  if (isFinite(pixel)) {\n    const horizontal = scale.isHorizontal();\n\n    return {\n      x: horizontal ? pixel : null,\n      y: horizontal ? null : pixel\n    };\n  }\n\n  return null;\n}\n\nfunction computeCircularBoundary(source) {\n  const {scale, fill} = source;\n  const options = scale.options;\n  const length = scale.getLabels().length;\n  const start = options.reverse ? scale.max : scale.min;\n  const value = _getTargetValue(fill, scale, start);\n  const target = [];\n\n  if (options.grid.circular) {\n    const center = scale.getPointPositionForValue(0, start);\n    return new simpleArc({\n      x: center.x,\n      y: center.y,\n      radius: scale.getDistanceFromCenterForValue(value)\n    });\n  }\n\n  for (let i = 0; i < length; ++i) {\n    target.push(scale.getPointPositionForValue(i, value));\n  }\n  return target;\n}\n\n", "import {clipArea, unclipArea, getDatasetClipArea} from '../../helpers/index.js';\nimport {_findSegmentEnd, _getBounds, _segments} from './filler.segment.js';\nimport {_getTarget} from './filler.target.js';\n\nexport function _drawfill(ctx, source, area) {\n  const target = _getTarget(source);\n  const {chart, index, line, scale, axis} = source;\n  const lineOpts = line.options;\n  const fillOption = lineOpts.fill;\n  const color = lineOpts.backgroundColor;\n  const {above = color, below = color} = fillOption || {};\n  const meta = chart.getDatasetMeta(index);\n  const clip = getDatasetClipArea(chart, meta);\n  if (target && line.points.length) {\n    clipArea(ctx, area);\n    doFill(ctx, {line, target, above, below, area, scale, axis, clip});\n    unclipArea(ctx);\n  }\n}\n\nfunction doFill(ctx, cfg) {\n  const {line, target, above, below, area, scale, clip} = cfg;\n  const property = line._loop ? 'angle' : cfg.axis;\n\n  ctx.save();\n\n  let fillColor = below;\n  if (below !== above) {\n    if (property === 'x') {\n      clipVertical(ctx, target, area.top);\n      fill(ctx, {line, target, color: above, scale, property, clip});\n      ctx.restore();\n      ctx.save();\n      clipVertical(ctx, target, area.bottom);\n    } else if (property === 'y') {\n      clipHorizontal(ctx, target, area.left);\n      fill(ctx, {line, target, color: below, scale, property, clip});\n      ctx.restore();\n      ctx.save();\n      clipHorizontal(ctx, target, area.right);\n      fillColor = above;\n    }\n  }\n  fill(ctx, {line, target, color: fillColor, scale, property, clip});\n\n  ctx.restore();\n}\n\nfunction clipVertical(ctx, target, clipY) {\n  const {segments, points} = target;\n  let first = true;\n  let lineLoop = false;\n\n  ctx.beginPath();\n  for (const segment of segments) {\n    const {start, end} = segment;\n    const firstPoint = points[start];\n    const lastPoint = points[_findSegmentEnd(start, end, points)];\n    if (first) {\n      ctx.moveTo(firstPoint.x, firstPoint.y);\n      first = false;\n    } else {\n      ctx.lineTo(firstPoint.x, clipY);\n      ctx.lineTo(firstPoint.x, firstPoint.y);\n    }\n    lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n    if (lineLoop) {\n      ctx.closePath();\n    } else {\n      ctx.lineTo(lastPoint.x, clipY);\n    }\n  }\n\n  ctx.lineTo(target.first().x, clipY);\n  ctx.closePath();\n  ctx.clip();\n}\n\nfunction clipHorizontal(ctx, target, clipX) {\n  const {segments, points} = target;\n  let first = true;\n  let lineLoop = false;\n\n  ctx.beginPath();\n  for (const segment of segments) {\n    const {start, end} = segment;\n    const firstPoint = points[start];\n    const lastPoint = points[_findSegmentEnd(start, end, points)];\n    if (first) {\n      ctx.moveTo(firstPoint.x, firstPoint.y);\n      first = false;\n    } else {\n      ctx.lineTo(clipX, firstPoint.y);\n      ctx.lineTo(firstPoint.x, firstPoint.y);\n    }\n    lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n    if (lineLoop) {\n      ctx.closePath();\n    } else {\n      ctx.lineTo(clipX, lastPoint.y);\n    }\n  }\n\n  ctx.lineTo(clipX, target.first().y);\n  ctx.closePath();\n  ctx.clip();\n}\n\nfunction fill(ctx, cfg) {\n  const {line, target, property, color, scale, clip} = cfg;\n  const segments = _segments(line, target, property);\n\n  for (const {source: src, target: tgt, start, end} of segments) {\n    const {style: {backgroundColor = color} = {}} = src;\n    const notShape = target !== true;\n\n    ctx.save();\n    ctx.fillStyle = backgroundColor;\n\n    clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n\n    ctx.beginPath();\n\n    const lineLoop = !!line.pathSegment(ctx, src);\n\n    let loop;\n    if (notShape) {\n      if (lineLoop) {\n        ctx.closePath();\n      } else {\n        interpolatedLineTo(ctx, target, end, property);\n      }\n\n      const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n      loop = lineLoop && targetLoop;\n      if (!loop) {\n        interpolatedLineTo(ctx, target, start, property);\n      }\n    }\n\n    ctx.closePath();\n    ctx.fill(loop ? 'evenodd' : 'nonzero');\n\n    ctx.restore();\n  }\n}\n\nfunction clipBounds(ctx, scale, clip, bounds) {\n  const chartArea = scale.chart.chartArea;\n  const {property, start, end} = bounds || {};\n\n  if (property === 'x' || property === 'y') {\n    let left, top, right, bottom;\n\n    if (property === 'x') {\n      left = start;\n      top = chartArea.top;\n      right = end;\n      bottom = chartArea.bottom;\n    } else {\n      left = chartArea.left;\n      top = start;\n      right = chartArea.right;\n      bottom = end;\n    }\n\n    ctx.beginPath();\n\n    if (clip) {\n      left = Math.max(left, clip.left);\n      right = Math.min(right, clip.right);\n      top = Math.max(top, clip.top);\n      bottom = Math.min(bottom, clip.bottom);\n    }\n\n    ctx.rect(left, top, right - left, bottom - top);\n    ctx.clip();\n  }\n}\n\nfunction interpolatedLineTo(ctx, target, point, property) {\n  const interpolatedPoint = target.interpolate(point, property);\n  if (interpolatedPoint) {\n    ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n  }\n}\n\n", "/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n  id: 'filler',\n\n  afterDatasetsUpdate(chart, _args, options) {\n    const count = (chart.data.datasets || []).length;\n    const sources = [];\n    let meta, i, line, source;\n\n    for (i = 0; i < count; ++i) {\n      meta = chart.getDatasetMeta(i);\n      line = meta.dataset;\n      source = null;\n\n      if (line && line.options && line instanceof LineElement) {\n        source = {\n          visible: chart.isDatasetVisible(i),\n          index: i,\n          fill: _decodeFill(line, i, count),\n          chart,\n          axis: meta.controller.options.indexAxis,\n          scale: meta.vScale,\n          line,\n        };\n      }\n\n      meta.$filler = source;\n      sources.push(source);\n    }\n\n    for (i = 0; i < count; ++i) {\n      source = sources[i];\n      if (!source || source.fill === false) {\n        continue;\n      }\n\n      source.fill = _resolveTarget(sources, i, options.propagate);\n    }\n  },\n\n  beforeDraw(chart, _args, options) {\n    const draw = options.drawTime === 'beforeDraw';\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    const area = chart.chartArea;\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      const source = metasets[i].$filler;\n      if (!source) {\n        continue;\n      }\n\n      source.line.updateControlPoints(area, source.axis);\n      if (draw && source.fill) {\n        _drawfill(chart.ctx, source, area);\n      }\n    }\n  },\n\n  beforeDatasetsDraw(chart, _args, options) {\n    if (options.drawTime !== 'beforeDatasetsDraw') {\n      return;\n    }\n\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      const source = metasets[i].$filler;\n\n      if (_shouldApplyFill(source)) {\n        _drawfill(chart.ctx, source, chart.chartArea);\n      }\n    }\n  },\n\n  beforeDatasetDraw(chart, args, options) {\n    const source = args.meta.$filler;\n\n    if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n      return;\n    }\n\n    _drawfill(chart.ctx, source, chart.chartArea);\n  },\n\n  defaults: {\n    propagate: true,\n    drawTime: 'beforeDatasetDraw'\n  }\n};\n", "import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n  _isBetween,\n  callback as call,\n  clipArea,\n  getRtlAdapter,\n  overrideTextDirection,\n  restoreTextDirection,\n  toFont,\n  toPadding,\n  unclipArea,\n  valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n  let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n  if (labelOpts.usePointStyle) {\n    boxHeight = Math.min(boxHeight, fontSize);\n    boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n  }\n\n  return {\n    boxWidth,\n    boxHeight,\n    itemHeight: Math.max(fontSize, boxHeight)\n  };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n  /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n  constructor(config) {\n    super();\n\n    this._added = false;\n\n    // Contains hit boxes for each dataset (in dataset order)\n    this.legendHitBoxes = [];\n\n    /**\n \t\t * @private\n \t\t */\n    this._hoveredItem = null;\n\n    // Are we in doughnut mode which has a different data type\n    this.doughnutMode = false;\n\n    this.chart = config.chart;\n    this.options = config.options;\n    this.ctx = config.ctx;\n    this.legendItems = undefined;\n    this.columnSizes = undefined;\n    this.lineWidths = undefined;\n    this.maxHeight = undefined;\n    this.maxWidth = undefined;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.height = undefined;\n    this.width = undefined;\n    this._margins = undefined;\n    this.position = undefined;\n    this.weight = undefined;\n    this.fullSize = undefined;\n  }\n\n  update(maxWidth, maxHeight, margins) {\n    this.maxWidth = maxWidth;\n    this.maxHeight = maxHeight;\n    this._margins = margins;\n\n    this.setDimensions();\n    this.buildLabels();\n    this.fit();\n  }\n\n  setDimensions() {\n    if (this.isHorizontal()) {\n      this.width = this.maxWidth;\n      this.left = this._margins.left;\n      this.right = this.width;\n    } else {\n      this.height = this.maxHeight;\n      this.top = this._margins.top;\n      this.bottom = this.height;\n    }\n  }\n\n  buildLabels() {\n    const labelOpts = this.options.labels || {};\n    let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n    if (labelOpts.filter) {\n      legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n    }\n\n    if (labelOpts.sort) {\n      legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n    }\n\n    if (this.options.reverse) {\n      legendItems.reverse();\n    }\n\n    this.legendItems = legendItems;\n  }\n\n  fit() {\n    const {options, ctx} = this;\n\n    // The legend may not be displayed for a variety of reasons including\n    // the fact that the defaults got set to `false`.\n    // When the legend is not displayed, there are no guarantees that the options\n    // are correctly formatted so we need to bail out as early as possible.\n    if (!options.display) {\n      this.width = this.height = 0;\n      return;\n    }\n\n    const labelOpts = options.labels;\n    const labelFont = toFont(labelOpts.font);\n    const fontSize = labelFont.size;\n    const titleHeight = this._computeTitleHeight();\n    const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n    let width, height;\n\n    ctx.font = labelFont.string;\n\n    if (this.isHorizontal()) {\n      width = this.maxWidth; // fill all the width\n      height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n    } else {\n      height = this.maxHeight; // fill all the height\n      width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n    }\n\n    this.width = Math.min(width, options.maxWidth || this.maxWidth);\n    this.height = Math.min(height, options.maxHeight || this.maxHeight);\n  }\n\n  /**\n\t * @private\n\t */\n  _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n    const {ctx, maxWidth, options: {labels: {padding}}} = this;\n    const hitboxes = this.legendHitBoxes = [];\n    // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n    const lineWidths = this.lineWidths = [0];\n    const lineHeight = itemHeight + padding;\n    let totalHeight = titleHeight;\n\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n\n    let row = -1;\n    let top = -lineHeight;\n    this.legendItems.forEach((legendItem, i) => {\n      const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n      if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n        totalHeight += lineHeight;\n        lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n        top += lineHeight;\n        row++;\n      }\n\n      hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n      lineWidths[lineWidths.length - 1] += itemWidth + padding;\n    });\n\n    return totalHeight;\n  }\n\n  _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n    const {ctx, maxHeight, options: {labels: {padding}}} = this;\n    const hitboxes = this.legendHitBoxes = [];\n    const columnSizes = this.columnSizes = [];\n    const heightLimit = maxHeight - titleHeight;\n\n    let totalWidth = padding;\n    let currentColWidth = 0;\n    let currentColHeight = 0;\n\n    let left = 0;\n    let col = 0;\n\n    this.legendItems.forEach((legendItem, i) => {\n      const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n      // If too tall, go to new column\n      if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n        totalWidth += currentColWidth + padding;\n        columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n        left += currentColWidth + padding;\n        col++;\n        currentColWidth = currentColHeight = 0;\n      }\n\n      // Store the hitbox width and height here. Final position will be updated in `draw`\n      hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n      // Get max width\n      currentColWidth = Math.max(currentColWidth, itemWidth);\n      currentColHeight += itemHeight + padding;\n    });\n\n    totalWidth += currentColWidth;\n    columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n    return totalWidth;\n  }\n\n  adjustHitBoxes() {\n    if (!this.options.display) {\n      return;\n    }\n    const titleHeight = this._computeTitleHeight();\n    const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n    const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n    if (this.isHorizontal()) {\n      let row = 0;\n      let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n      for (const hitbox of hitboxes) {\n        if (row !== hitbox.row) {\n          row = hitbox.row;\n          left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n        }\n        hitbox.top += this.top + titleHeight + padding;\n        hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n        left += hitbox.width + padding;\n      }\n    } else {\n      let col = 0;\n      let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n      for (const hitbox of hitboxes) {\n        if (hitbox.col !== col) {\n          col = hitbox.col;\n          top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n        }\n        hitbox.top = top;\n        hitbox.left += this.left + padding;\n        hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n        top += hitbox.height + padding;\n      }\n    }\n  }\n\n  isHorizontal() {\n    return this.options.position === 'top' || this.options.position === 'bottom';\n  }\n\n  draw() {\n    if (this.options.display) {\n      const ctx = this.ctx;\n      clipArea(ctx, this);\n\n      this._draw();\n\n      unclipArea(ctx);\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _draw() {\n    const {options: opts, columnSizes, lineWidths, ctx} = this;\n    const {align, labels: labelOpts} = opts;\n    const defaultColor = defaults.color;\n    const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n    const labelFont = toFont(labelOpts.font);\n    const {padding} = labelOpts;\n    const fontSize = labelFont.size;\n    const halfFontSize = fontSize / 2;\n    let cursor;\n\n    this.drawTitle();\n\n    // Canvas setup\n    ctx.textAlign = rtlHelper.textAlign('left');\n    ctx.textBaseline = 'middle';\n    ctx.lineWidth = 0.5;\n    ctx.font = labelFont.string;\n\n    const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n    // current position\n    const drawLegendBox = function(x, y, legendItem) {\n      if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n        return;\n      }\n\n      // Set the ctx for the box\n      ctx.save();\n\n      const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n      ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n      ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n      ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n      ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n      ctx.lineWidth = lineWidth;\n      ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n\n      ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n      if (labelOpts.usePointStyle) {\n        // Recalculate x and y for drawPoint() because its expecting\n        // x and y to be center of figure (instead of top left)\n        const drawOptions = {\n          radius: boxHeight * Math.SQRT2 / 2,\n          pointStyle: legendItem.pointStyle,\n          rotation: legendItem.rotation,\n          borderWidth: lineWidth\n        };\n        const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n        const centerY = y + halfFontSize;\n\n        // Draw pointStyle as legend symbol\n        drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n      } else {\n        // Draw box as legend symbol\n        // Adjust position when boxHeight < fontSize (want it centered)\n        const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n        const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n        const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n        ctx.beginPath();\n\n        if (Object.values(borderRadius).some(v => v !== 0)) {\n          addRoundedRectPath(ctx, {\n            x: xBoxLeft,\n            y: yBoxTop,\n            w: boxWidth,\n            h: boxHeight,\n            radius: borderRadius,\n          });\n        } else {\n          ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n        }\n\n        ctx.fill();\n        if (lineWidth !== 0) {\n          ctx.stroke();\n        }\n      }\n\n      ctx.restore();\n    };\n\n    const fillText = function(x, y, legendItem) {\n      renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n        strikethrough: legendItem.hidden,\n        textAlign: rtlHelper.textAlign(legendItem.textAlign)\n      });\n    };\n\n    // Horizontal\n    const isHorizontal = this.isHorizontal();\n    const titleHeight = this._computeTitleHeight();\n    if (isHorizontal) {\n      cursor = {\n        x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n        y: this.top + padding + titleHeight,\n        line: 0\n      };\n    } else {\n      cursor = {\n        x: this.left + padding,\n        y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n        line: 0\n      };\n    }\n\n    overrideTextDirection(this.ctx, opts.textDirection);\n\n    const lineHeight = itemHeight + padding;\n    this.legendItems.forEach((legendItem, i) => {\n      ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n      ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\n      const textWidth = ctx.measureText(legendItem.text).width;\n      const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n      const width = boxWidth + halfFontSize + textWidth;\n      let x = cursor.x;\n      let y = cursor.y;\n\n      rtlHelper.setWidth(this.width);\n\n      if (isHorizontal) {\n        if (i > 0 && x + width + padding > this.right) {\n          y = cursor.y += lineHeight;\n          cursor.line++;\n          x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n        }\n      } else if (i > 0 && y + lineHeight > this.bottom) {\n        x = cursor.x = x + columnSizes[cursor.line].width + padding;\n        cursor.line++;\n        y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n      }\n\n      const realX = rtlHelper.x(x);\n\n      drawLegendBox(realX, y, legendItem);\n\n      x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n      // Fill the actual label\n      fillText(rtlHelper.x(x), y, legendItem);\n\n      if (isHorizontal) {\n        cursor.x += width + padding;\n      } else if (typeof legendItem.text !== 'string') {\n        const fontLineHeight = labelFont.lineHeight;\n        cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n      } else {\n        cursor.y += lineHeight;\n      }\n    });\n\n    restoreTextDirection(this.ctx, opts.textDirection);\n  }\n\n  /**\n\t * @protected\n\t */\n  drawTitle() {\n    const opts = this.options;\n    const titleOpts = opts.title;\n    const titleFont = toFont(titleOpts.font);\n    const titlePadding = toPadding(titleOpts.padding);\n\n    if (!titleOpts.display) {\n      return;\n    }\n\n    const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n    const ctx = this.ctx;\n    const position = titleOpts.position;\n    const halfFontSize = titleFont.size / 2;\n    const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n    let y;\n\n    // These defaults are used when the legend is vertical.\n    // When horizontal, they are computed below.\n    let left = this.left;\n    let maxWidth = this.width;\n\n    if (this.isHorizontal()) {\n      // Move left / right so that the title is above the legend lines\n      maxWidth = Math.max(...this.lineWidths);\n      y = this.top + topPaddingPlusHalfFontSize;\n      left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n    } else {\n      // Move down so that the title is above the legend stack in every alignment\n      const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n      y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n    }\n\n    // Now that we know the left edge of the inner legend box, compute the correct\n    // X coordinate from the title alignment\n    const x = _alignStartEnd(position, left, left + maxWidth);\n\n    // Canvas setup\n    ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n    ctx.textBaseline = 'middle';\n    ctx.strokeStyle = titleOpts.color;\n    ctx.fillStyle = titleOpts.color;\n    ctx.font = titleFont.string;\n\n    renderText(ctx, titleOpts.text, x, y, titleFont);\n  }\n\n  /**\n\t * @private\n\t */\n  _computeTitleHeight() {\n    const titleOpts = this.options.title;\n    const titleFont = toFont(titleOpts.font);\n    const titlePadding = toPadding(titleOpts.padding);\n    return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n  }\n\n  /**\n\t * @private\n\t */\n  _getLegendItemAt(x, y) {\n    let i, hitBox, lh;\n\n    if (_isBetween(x, this.left, this.right)\n      && _isBetween(y, this.top, this.bottom)) {\n      // See if we are touching one of the dataset boxes\n      lh = this.legendHitBoxes;\n      for (i = 0; i < lh.length; ++i) {\n        hitBox = lh[i];\n\n        if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n          && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n          // Touching an element\n          return this.legendItems[i];\n        }\n      }\n    }\n\n    return null;\n  }\n\n  /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n  handleEvent(e) {\n    const opts = this.options;\n    if (!isListened(e.type, opts)) {\n      return;\n    }\n\n    // Chart event already has relative position in it\n    const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n    if (e.type === 'mousemove' || e.type === 'mouseout') {\n      const previous = this._hoveredItem;\n      const sameItem = itemsEqual(previous, hoveredItem);\n      if (previous && !sameItem) {\n        call(opts.onLeave, [e, previous, this], this);\n      }\n\n      this._hoveredItem = hoveredItem;\n\n      if (hoveredItem && !sameItem) {\n        call(opts.onHover, [e, hoveredItem, this], this);\n      }\n    } else if (hoveredItem) {\n      call(opts.onClick, [e, hoveredItem, this], this);\n    }\n  }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n  const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n  const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n  return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n  let legendItemText = legendItem.text;\n  if (legendItemText && typeof legendItemText !== 'string') {\n    legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n  }\n  return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n  let itemHeight = _itemHeight;\n  if (typeof legendItem.text !== 'string') {\n    itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n  }\n  return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n  const labelHeight = legendItem.text ? legendItem.text.length : 0;\n  return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n  if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n    return true;\n  }\n  if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n    return true;\n  }\n  return false;\n}\n\nexport default {\n  id: 'legend',\n\n  /**\n\t * For tests\n\t * @private\n\t */\n  _element: Legend,\n\n  start(chart, _args, options) {\n    const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n    layouts.configure(chart, legend, options);\n    layouts.addBox(chart, legend);\n  },\n\n  stop(chart) {\n    layouts.removeBox(chart, chart.legend);\n    delete chart.legend;\n  },\n\n  // During the beforeUpdate step, the layout configuration needs to run\n  // This ensures that if the legend position changes (via an option update)\n  // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n  beforeUpdate(chart, _args, options) {\n    const legend = chart.legend;\n    layouts.configure(chart, legend, options);\n    legend.options = options;\n  },\n\n  // The labels need to be built after datasets are updated to ensure that colors\n  // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n  afterUpdate(chart) {\n    const legend = chart.legend;\n    legend.buildLabels();\n    legend.adjustHitBoxes();\n  },\n\n\n  afterEvent(chart, args) {\n    if (!args.replay) {\n      chart.legend.handleEvent(args.event);\n    }\n  },\n\n  defaults: {\n    display: true,\n    position: 'top',\n    align: 'center',\n    fullSize: true,\n    reverse: false,\n    weight: 1000,\n\n    // a callback that will handle\n    onClick(e, legendItem, legend) {\n      const index = legendItem.datasetIndex;\n      const ci = legend.chart;\n      if (ci.isDatasetVisible(index)) {\n        ci.hide(index);\n        legendItem.hidden = true;\n      } else {\n        ci.show(index);\n        legendItem.hidden = false;\n      }\n    },\n\n    onHover: null,\n    onLeave: null,\n\n    labels: {\n      color: (ctx) => ctx.chart.options.color,\n      boxWidth: 40,\n      padding: 10,\n      // Generates labels shown in the legend\n      // Valid properties to return:\n      // text : text to display\n      // fillStyle : fill of coloured box\n      // strokeStyle: stroke of coloured box\n      // hidden : if this legend item refers to a hidden item\n      // lineCap : cap style for line\n      // lineDash\n      // lineDashOffset :\n      // lineJoin :\n      // lineWidth :\n      generateLabels(chart) {\n        const datasets = chart.data.datasets;\n        const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n        return chart._getSortedDatasetMetas().map((meta) => {\n          const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n          const borderWidth = toPadding(style.borderWidth);\n\n          return {\n            text: datasets[meta.index].label,\n            fillStyle: style.backgroundColor,\n            fontColor: color,\n            hidden: !meta.visible,\n            lineCap: style.borderCapStyle,\n            lineDash: style.borderDash,\n            lineDashOffset: style.borderDashOffset,\n            lineJoin: style.borderJoinStyle,\n            lineWidth: (borderWidth.width + borderWidth.height) / 4,\n            strokeStyle: style.borderColor,\n            pointStyle: pointStyle || style.pointStyle,\n            rotation: style.rotation,\n            textAlign: textAlign || style.textAlign,\n            borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n\n            // Below is extra data used for toggling the datasets\n            datasetIndex: meta.index\n          };\n        }, this);\n      }\n    },\n\n    title: {\n      color: (ctx) => ctx.chart.options.color,\n      display: false,\n      position: 'center',\n      text: '',\n    }\n  },\n\n  descriptors: {\n    _scriptable: (name) => !name.startsWith('on'),\n    labels: {\n      _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n    }\n  },\n};\n", "import Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {PI, isArray, toPadding, toFont} from '../helpers/index.js';\nimport {_toLeftRightCenter, _alignStartEnd} from '../helpers/helpers.extras.js';\nimport {renderText} from '../helpers/helpers.canvas.js';\n\nexport class Title extends Element {\n  /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n  constructor(config) {\n    super();\n\n    this.chart = config.chart;\n    this.options = config.options;\n    this.ctx = config.ctx;\n    this._padding = undefined;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this.position = undefined;\n    this.weight = undefined;\n    this.fullSize = undefined;\n  }\n\n  update(maxWidth, maxHeight) {\n    const opts = this.options;\n\n    this.left = 0;\n    this.top = 0;\n\n    if (!opts.display) {\n      this.width = this.height = this.right = this.bottom = 0;\n      return;\n    }\n\n    this.width = this.right = maxWidth;\n    this.height = this.bottom = maxHeight;\n\n    const lineCount = isArray(opts.text) ? opts.text.length : 1;\n    this._padding = toPadding(opts.padding);\n    const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n\n    if (this.isHorizontal()) {\n      this.height = textSize;\n    } else {\n      this.width = textSize;\n    }\n  }\n\n  isHorizontal() {\n    const pos = this.options.position;\n    return pos === 'top' || pos === 'bottom';\n  }\n\n  _drawArgs(offset) {\n    const {top, left, bottom, right, options} = this;\n    const align = options.align;\n    let rotation = 0;\n    let maxWidth, titleX, titleY;\n\n    if (this.isHorizontal()) {\n      titleX = _alignStartEnd(align, left, right);\n      titleY = top + offset;\n      maxWidth = right - left;\n    } else {\n      if (options.position === 'left') {\n        titleX = left + offset;\n        titleY = _alignStartEnd(align, bottom, top);\n        rotation = PI * -0.5;\n      } else {\n        titleX = right - offset;\n        titleY = _alignStartEnd(align, top, bottom);\n        rotation = PI * 0.5;\n      }\n      maxWidth = bottom - top;\n    }\n    return {titleX, titleY, maxWidth, rotation};\n  }\n\n  draw() {\n    const ctx = this.ctx;\n    const opts = this.options;\n\n    if (!opts.display) {\n      return;\n    }\n\n    const fontOpts = toFont(opts.font);\n    const lineHeight = fontOpts.lineHeight;\n    const offset = lineHeight / 2 + this._padding.top;\n    const {titleX, titleY, maxWidth, rotation} = this._drawArgs(offset);\n\n    renderText(ctx, opts.text, 0, 0, fontOpts, {\n      color: opts.color,\n      maxWidth,\n      rotation,\n      textAlign: _toLeftRightCenter(opts.align),\n      textBaseline: 'middle',\n      translation: [titleX, titleY],\n    });\n  }\n}\n\nfunction createTitle(chart, titleOpts) {\n  const title = new Title({\n    ctx: chart.ctx,\n    options: titleOpts,\n    chart\n  });\n\n  layouts.configure(chart, title, titleOpts);\n  layouts.addBox(chart, title);\n  chart.titleBlock = title;\n}\n\nexport default {\n  id: 'title',\n\n  /**\n\t * For tests\n\t * @private\n\t */\n  _element: Title,\n\n  start(chart, _args, options) {\n    createTitle(chart, options);\n  },\n\n  stop(chart) {\n    const titleBlock = chart.titleBlock;\n    layouts.removeBox(chart, titleBlock);\n    delete chart.titleBlock;\n  },\n\n  beforeUpdate(chart, _args, options) {\n    const title = chart.titleBlock;\n    layouts.configure(chart, title, options);\n    title.options = options;\n  },\n\n  defaults: {\n    align: 'center',\n    display: false,\n    font: {\n      weight: 'bold',\n    },\n    fullSize: true,\n    padding: 10,\n    position: 'top',\n    text: '',\n    weight: 2000         // by default greater than legend (1000) to be above\n  },\n\n  defaultRoutes: {\n    color: 'color'\n  },\n\n  descriptors: {\n    _scriptable: true,\n    _indexable: false,\n  },\n};\n", "import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n  id: 'subtitle',\n\n  start(chart, _args, options) {\n    const title = new Title({\n      ctx: chart.ctx,\n      options,\n      chart\n    });\n\n    layouts.configure(chart, title, options);\n    layouts.addBox(chart, title);\n    map.set(chart, title);\n  },\n\n  stop(chart) {\n    layouts.removeBox(chart, map.get(chart));\n    map.delete(chart);\n  },\n\n  beforeUpdate(chart, _args, options) {\n    const title = map.get(chart);\n    layouts.configure(chart, title, options);\n    title.options = options;\n  },\n\n  defaults: {\n    align: 'center',\n    display: false,\n    font: {\n      weight: 'normal',\n    },\n    fullSize: true,\n    padding: 0,\n    position: 'top',\n    text: '',\n    weight: 1500         // by default greater than legend (1000) and smaller than title (2000)\n  },\n\n  defaultRoutes: {\n    color: 'color'\n  },\n\n  descriptors: {\n    _scriptable: true,\n    _indexable: false,\n  },\n};\n", "import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n  /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n  average(items) {\n    if (!items.length) {\n      return false;\n    }\n\n    let i, len;\n    let xSet = new Set();\n    let y = 0;\n    let count = 0;\n\n    for (i = 0, len = items.length; i < len; ++i) {\n      const el = items[i].element;\n      if (el && el.hasValue()) {\n        const pos = el.tooltipPosition();\n        xSet.add(pos.x);\n        y += pos.y;\n        ++count;\n      }\n    }\n\n    // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN\n    if (count === 0 || xSet.size === 0) {\n      return false;\n    }\n\n    const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;\n\n    return {\n      x: xAverage,\n      y: y / count\n    };\n  },\n\n  /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n  nearest(items, eventPosition) {\n    if (!items.length) {\n      return false;\n    }\n\n    let x = eventPosition.x;\n    let y = eventPosition.y;\n    let minDistance = Number.POSITIVE_INFINITY;\n    let i, len, nearestElement;\n\n    for (i = 0, len = items.length; i < len; ++i) {\n      const el = items[i].element;\n      if (el && el.hasValue()) {\n        const center = el.getCenterPoint();\n        const d = distanceBetweenPoints(eventPosition, center);\n\n        if (d < minDistance) {\n          minDistance = d;\n          nearestElement = el;\n        }\n      }\n    }\n\n    if (nearestElement) {\n      const tp = nearestElement.tooltipPosition();\n      x = tp.x;\n      y = tp.y;\n    }\n\n    return {\n      x,\n      y\n    };\n  }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n  if (toPush) {\n    if (isArray(toPush)) {\n      // base = base.concat(toPush);\n      Array.prototype.push.apply(base, toPush);\n    } else {\n      base.push(toPush);\n    }\n  }\n\n  return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\n */\nfunction splitNewlines(str) {\n  if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n    return str.split('\\n');\n  }\n  return str;\n}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\n */\nfunction createTooltipItem(chart, item) {\n  const {element, datasetIndex, index} = item;\n  const controller = chart.getDatasetMeta(datasetIndex).controller;\n  const {label, value} = controller.getLabelAndValue(index);\n\n  return {\n    chart,\n    label,\n    parsed: controller.getParsed(index),\n    raw: chart.data.datasets[datasetIndex].data[index],\n    formattedValue: value,\n    dataset: controller.getDataset(),\n    dataIndex: index,\n    datasetIndex,\n    element\n  };\n}\n\n/**\n * Get the size of the tooltip\n */\nfunction getTooltipSize(tooltip, options) {\n  const ctx = tooltip.chart.ctx;\n  const {body, footer, title} = tooltip;\n  const {boxWidth, boxHeight} = options;\n  const bodyFont = toFont(options.bodyFont);\n  const titleFont = toFont(options.titleFont);\n  const footerFont = toFont(options.footerFont);\n  const titleLineCount = title.length;\n  const footerLineCount = footer.length;\n  const bodyLineItemCount = body.length;\n\n  const padding = toPadding(options.padding);\n  let height = padding.height;\n  let width = 0;\n\n  // Count of all lines in the body\n  let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n  combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n\n  if (titleLineCount) {\n    height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n  }\n  if (combinedBodyLength) {\n    // Body lines may include some extra height depending on boxHeight\n    const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n    height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n  }\n  if (footerLineCount) {\n    height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n  }\n\n  // Title width\n  let widthPadding = 0;\n  const maxLineWidth = function(line) {\n    width = Math.max(width, ctx.measureText(line).width + widthPadding);\n  };\n\n  ctx.save();\n\n  ctx.font = titleFont.string;\n  each(tooltip.title, maxLineWidth);\n\n  // Body width\n  ctx.font = bodyFont.string;\n  each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n  // Body lines may include some extra width due to the color box\n  widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n  each(body, (bodyItem) => {\n    each(bodyItem.before, maxLineWidth);\n    each(bodyItem.lines, maxLineWidth);\n    each(bodyItem.after, maxLineWidth);\n  });\n\n  // Reset back to 0\n  widthPadding = 0;\n\n  // Footer width\n  ctx.font = footerFont.string;\n  each(tooltip.footer, maxLineWidth);\n\n  ctx.restore();\n\n  // Add padding\n  width += padding.width;\n\n  return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n  const {y, height} = size;\n\n  if (y < height / 2) {\n    return 'top';\n  } else if (y > (chart.height - height / 2)) {\n    return 'bottom';\n  }\n  return 'center';\n}\n\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n  const {x, width} = size;\n  const caret = options.caretSize + options.caretPadding;\n  if (xAlign === 'left' && x + width + caret > chart.width) {\n    return true;\n  }\n\n  if (xAlign === 'right' && x - width - caret < 0) {\n    return true;\n  }\n}\n\nfunction determineXAlign(chart, options, size, yAlign) {\n  const {x, width} = size;\n  const {width: chartWidth, chartArea: {left, right}} = chart;\n  let xAlign = 'center';\n\n  if (yAlign === 'center') {\n    xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n  } else if (x <= width / 2) {\n    xAlign = 'left';\n  } else if (x >= chartWidth - width / 2) {\n    xAlign = 'right';\n  }\n\n  if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n    xAlign = 'center';\n  }\n\n  return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n  const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n  return {\n    xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n    yAlign\n  };\n}\n\nfunction alignX(size, xAlign) {\n  let {x, width} = size;\n  if (xAlign === 'right') {\n    x -= width;\n  } else if (xAlign === 'center') {\n    x -= (width / 2);\n  }\n  return x;\n}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n  // eslint-disable-next-line prefer-const\n  let {y, height} = size;\n  if (yAlign === 'top') {\n    y += paddingAndSize;\n  } else if (yAlign === 'bottom') {\n    y -= height + paddingAndSize;\n  } else {\n    y -= (height / 2);\n  }\n  return y;\n}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\nfunction getBackgroundPoint(options, size, alignment, chart) {\n  const {caretSize, caretPadding, cornerRadius} = options;\n  const {xAlign, yAlign} = alignment;\n  const paddingAndSize = caretSize + caretPadding;\n  const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n  let x = alignX(size, xAlign);\n  const y = alignY(size, yAlign, paddingAndSize);\n\n  if (yAlign === 'center') {\n    if (xAlign === 'left') {\n      x += paddingAndSize;\n    } else if (xAlign === 'right') {\n      x -= paddingAndSize;\n    }\n  } else if (xAlign === 'left') {\n    x -= Math.max(topLeft, bottomLeft) + caretSize;\n  } else if (xAlign === 'right') {\n    x += Math.max(topRight, bottomRight) + caretSize;\n  }\n\n  return {\n    x: _limitValue(x, 0, chart.width - size.width),\n    y: _limitValue(y, 0, chart.height - size.height)\n  };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n  const padding = toPadding(options.padding);\n\n  return align === 'center'\n    ? tooltip.x + tooltip.width / 2\n    : align === 'right'\n      ? tooltip.x + tooltip.width - padding.right\n      : tooltip.x + padding.left;\n}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n  return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n  return createContext(parent, {\n    tooltip,\n    tooltipItems,\n    type: 'tooltip'\n  });\n}\n\nfunction overrideCallbacks(callbacks, context) {\n  const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n  return override ? callbacks.override(override) : callbacks;\n}\n\nconst defaultCallbacks = {\n  // Args are: (tooltipItems, data)\n  beforeTitle: noop,\n  title(tooltipItems) {\n    if (tooltipItems.length > 0) {\n      const item = tooltipItems[0];\n      const labels = item.chart.data.labels;\n      const labelCount = labels ? labels.length : 0;\n\n      if (this && this.options && this.options.mode === 'dataset') {\n        return item.dataset.label || '';\n      } else if (item.label) {\n        return item.label;\n      } else if (labelCount > 0 && item.dataIndex < labelCount) {\n        return labels[item.dataIndex];\n      }\n    }\n\n    return '';\n  },\n  afterTitle: noop,\n\n  // Args are: (tooltipItems, data)\n  beforeBody: noop,\n\n  // Args are: (tooltipItem, data)\n  beforeLabel: noop,\n  label(tooltipItem) {\n    if (this && this.options && this.options.mode === 'dataset') {\n      return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n    }\n\n    let label = tooltipItem.dataset.label || '';\n\n    if (label) {\n      label += ': ';\n    }\n    const value = tooltipItem.formattedValue;\n    if (!isNullOrUndef(value)) {\n      label += value;\n    }\n    return label;\n  },\n  labelColor(tooltipItem) {\n    const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n    const options = meta.controller.getStyle(tooltipItem.dataIndex);\n    return {\n      borderColor: options.borderColor,\n      backgroundColor: options.backgroundColor,\n      borderWidth: options.borderWidth,\n      borderDash: options.borderDash,\n      borderDashOffset: options.borderDashOffset,\n      borderRadius: 0,\n    };\n  },\n  labelTextColor() {\n    return this.options.bodyColor;\n  },\n  labelPointStyle(tooltipItem) {\n    const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n    const options = meta.controller.getStyle(tooltipItem.dataIndex);\n    return {\n      pointStyle: options.pointStyle,\n      rotation: options.rotation,\n    };\n  },\n  afterLabel: noop,\n\n  // Args are: (tooltipItems, data)\n  afterBody: noop,\n\n  // Args are: (tooltipItems, data)\n  beforeFooter: noop,\n  footer: noop,\n  afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record<keyof typeof defaultCallbacks, Function>} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n  const result = callbacks[name].call(ctx, arg);\n\n  if (typeof result === 'undefined') {\n    return defaultCallbacks[name].call(ctx, arg);\n  }\n\n  return result;\n}\n\nexport class Tooltip extends Element {\n\n  /**\n   * @namespace Chart.Tooltip.positioners\n   */\n  static positioners = positioners;\n\n  constructor(config) {\n    super();\n\n    this.opacity = 0;\n    this._active = [];\n    this._eventPosition = undefined;\n    this._size = undefined;\n    this._cachedAnimations = undefined;\n    this._tooltipItems = [];\n    this.$animations = undefined;\n    this.$context = undefined;\n    this.chart = config.chart;\n    this.options = config.options;\n    this.dataPoints = undefined;\n    this.title = undefined;\n    this.beforeBody = undefined;\n    this.body = undefined;\n    this.afterBody = undefined;\n    this.footer = undefined;\n    this.xAlign = undefined;\n    this.yAlign = undefined;\n    this.x = undefined;\n    this.y = undefined;\n    this.height = undefined;\n    this.width = undefined;\n    this.caretX = undefined;\n    this.caretY = undefined;\n    // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n    // and `labelTextColors` to create a single variable\n    this.labelColors = undefined;\n    this.labelPointStyles = undefined;\n    this.labelTextColors = undefined;\n  }\n\n  initialize(options) {\n    this.options = options;\n    this._cachedAnimations = undefined;\n    this.$context = undefined;\n  }\n\n  /**\n\t * @private\n\t */\n  _resolveAnimations() {\n    const cached = this._cachedAnimations;\n\n    if (cached) {\n      return cached;\n    }\n\n    const chart = this.chart;\n    const options = this.options.setContext(this.getContext());\n    const opts = options.enabled && chart.options.animation && options.animations;\n    const animations = new Animations(this.chart, opts);\n    if (opts._cacheable) {\n      this._cachedAnimations = Object.freeze(animations);\n    }\n\n    return animations;\n  }\n\n  /**\n\t * @protected\n\t */\n  getContext() {\n    return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n  }\n\n  getTitle(context, options) {\n    const {callbacks} = options;\n\n    const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n    const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n    const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n    let lines = [];\n    lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n    lines = pushOrConcat(lines, splitNewlines(title));\n    lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n    return lines;\n  }\n\n  getBeforeBody(tooltipItems, options) {\n    return getBeforeAfterBodyLines(\n      invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n    );\n  }\n\n  getBody(tooltipItems, options) {\n    const {callbacks} = options;\n    const bodyItems = [];\n\n    each(tooltipItems, (context) => {\n      const bodyItem = {\n        before: [],\n        lines: [],\n        after: []\n      };\n      const scoped = overrideCallbacks(callbacks, context);\n      pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n      pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n      pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n      bodyItems.push(bodyItem);\n    });\n\n    return bodyItems;\n  }\n\n  getAfterBody(tooltipItems, options) {\n    return getBeforeAfterBodyLines(\n      invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n    );\n  }\n\n  // Get the footer and beforeFooter and afterFooter lines\n  getFooter(tooltipItems, options) {\n    const {callbacks} = options;\n\n    const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n    const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n    const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n    let lines = [];\n    lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n    lines = pushOrConcat(lines, splitNewlines(footer));\n    lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n    return lines;\n  }\n\n  /**\n\t * @private\n\t */\n  _createItems(options) {\n    const active = this._active;\n    const data = this.chart.data;\n    const labelColors = [];\n    const labelPointStyles = [];\n    const labelTextColors = [];\n    let tooltipItems = [];\n    let i, len;\n\n    for (i = 0, len = active.length; i < len; ++i) {\n      tooltipItems.push(createTooltipItem(this.chart, active[i]));\n    }\n\n    // If the user provided a filter function, use it to modify the tooltip items\n    if (options.filter) {\n      tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n    }\n\n    // If the user provided a sorting function, use it to modify the tooltip items\n    if (options.itemSort) {\n      tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n    }\n\n    // Determine colors for boxes\n    each(tooltipItems, (context) => {\n      const scoped = overrideCallbacks(options.callbacks, context);\n      labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n      labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n      labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n    });\n\n    this.labelColors = labelColors;\n    this.labelPointStyles = labelPointStyles;\n    this.labelTextColors = labelTextColors;\n    this.dataPoints = tooltipItems;\n    return tooltipItems;\n  }\n\n  update(changed, replay) {\n    const options = this.options.setContext(this.getContext());\n    const active = this._active;\n    let properties;\n    let tooltipItems = [];\n\n    if (!active.length) {\n      if (this.opacity !== 0) {\n        properties = {\n          opacity: 0\n        };\n      }\n    } else {\n      const position = positioners[options.position].call(this, active, this._eventPosition);\n      tooltipItems = this._createItems(options);\n\n      this.title = this.getTitle(tooltipItems, options);\n      this.beforeBody = this.getBeforeBody(tooltipItems, options);\n      this.body = this.getBody(tooltipItems, options);\n      this.afterBody = this.getAfterBody(tooltipItems, options);\n      this.footer = this.getFooter(tooltipItems, options);\n\n      const size = this._size = getTooltipSize(this, options);\n      const positionAndSize = Object.assign({}, position, size);\n      const alignment = determineAlignment(this.chart, options, positionAndSize);\n      const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n      this.xAlign = alignment.xAlign;\n      this.yAlign = alignment.yAlign;\n\n      properties = {\n        opacity: 1,\n        x: backgroundPoint.x,\n        y: backgroundPoint.y,\n        width: size.width,\n        height: size.height,\n        caretX: position.x,\n        caretY: position.y\n      };\n    }\n\n    this._tooltipItems = tooltipItems;\n    this.$context = undefined;\n\n    if (properties) {\n      this._resolveAnimations().update(this, properties);\n    }\n\n    if (changed && options.external) {\n      options.external.call(this, {chart: this.chart, tooltip: this, replay});\n    }\n  }\n\n  drawCaret(tooltipPoint, ctx, size, options) {\n    const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n    ctx.lineTo(caretPosition.x1, caretPosition.y1);\n    ctx.lineTo(caretPosition.x2, caretPosition.y2);\n    ctx.lineTo(caretPosition.x3, caretPosition.y3);\n  }\n\n  getCaretPosition(tooltipPoint, size, options) {\n    const {xAlign, yAlign} = this;\n    const {caretSize, cornerRadius} = options;\n    const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n    const {x: ptX, y: ptY} = tooltipPoint;\n    const {width, height} = size;\n    let x1, x2, x3, y1, y2, y3;\n\n    if (yAlign === 'center') {\n      y2 = ptY + (height / 2);\n\n      if (xAlign === 'left') {\n        x1 = ptX;\n        x2 = x1 - caretSize;\n\n        // Left draws bottom -> top, this y1 is on the bottom\n        y1 = y2 + caretSize;\n        y3 = y2 - caretSize;\n      } else {\n        x1 = ptX + width;\n        x2 = x1 + caretSize;\n\n        // Right draws top -> bottom, thus y1 is on the top\n        y1 = y2 - caretSize;\n        y3 = y2 + caretSize;\n      }\n\n      x3 = x1;\n    } else {\n      if (xAlign === 'left') {\n        x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n      } else if (xAlign === 'right') {\n        x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n      } else {\n        x2 = this.caretX;\n      }\n\n      if (yAlign === 'top') {\n        y1 = ptY;\n        y2 = y1 - caretSize;\n\n        // Top draws left -> right, thus x1 is on the left\n        x1 = x2 - caretSize;\n        x3 = x2 + caretSize;\n      } else {\n        y1 = ptY + height;\n        y2 = y1 + caretSize;\n\n        // Bottom draws right -> left, thus x1 is on the right\n        x1 = x2 + caretSize;\n        x3 = x2 - caretSize;\n      }\n      y3 = y1;\n    }\n    return {x1, x2, x3, y1, y2, y3};\n  }\n\n  drawTitle(pt, ctx, options) {\n    const title = this.title;\n    const length = title.length;\n    let titleFont, titleSpacing, i;\n\n    if (length) {\n      const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n      pt.x = getAlignedX(this, options.titleAlign, options);\n\n      ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n      ctx.textBaseline = 'middle';\n\n      titleFont = toFont(options.titleFont);\n      titleSpacing = options.titleSpacing;\n\n      ctx.fillStyle = options.titleColor;\n      ctx.font = titleFont.string;\n\n      for (i = 0; i < length; ++i) {\n        ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n        pt.y += titleFont.lineHeight + titleSpacing; // Line Height and spacing\n\n        if (i + 1 === length) {\n          pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n        }\n      }\n    }\n  }\n\n  /**\n\t * @private\n\t */\n  _drawColorBox(ctx, pt, i, rtlHelper, options) {\n    const labelColor = this.labelColors[i];\n    const labelPointStyle = this.labelPointStyles[i];\n    const {boxHeight, boxWidth} = options;\n    const bodyFont = toFont(options.bodyFont);\n    const colorX = getAlignedX(this, 'left', options);\n    const rtlColorX = rtlHelper.x(colorX);\n    const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n    const colorY = pt.y + yOffSet;\n\n    if (options.usePointStyle) {\n      const drawOptions = {\n        radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n        pointStyle: labelPointStyle.pointStyle,\n        rotation: labelPointStyle.rotation,\n        borderWidth: 1\n      };\n      // Recalculate x and y for drawPoint() because its expecting\n      // x and y to be center of figure (instead of top left)\n      const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n      const centerY = colorY + boxHeight / 2;\n\n      // Fill the point with white so that colours merge nicely if the opacity is < 1\n      ctx.strokeStyle = options.multiKeyBackground;\n      ctx.fillStyle = options.multiKeyBackground;\n      drawPoint(ctx, drawOptions, centerX, centerY);\n\n      // Draw the point\n      ctx.strokeStyle = labelColor.borderColor;\n      ctx.fillStyle = labelColor.backgroundColor;\n      drawPoint(ctx, drawOptions, centerX, centerY);\n    } else {\n      // Border\n      ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n      ctx.strokeStyle = labelColor.borderColor;\n      ctx.setLineDash(labelColor.borderDash || []);\n      ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n      // Fill a white rect so that colours merge nicely if the opacity is < 1\n      const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n      const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n      const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\n      if (Object.values(borderRadius).some(v => v !== 0)) {\n        ctx.beginPath();\n        ctx.fillStyle = options.multiKeyBackground;\n        addRoundedRectPath(ctx, {\n          x: outerX,\n          y: colorY,\n          w: boxWidth,\n          h: boxHeight,\n          radius: borderRadius,\n        });\n        ctx.fill();\n        ctx.stroke();\n\n        // Inner square\n        ctx.fillStyle = labelColor.backgroundColor;\n        ctx.beginPath();\n        addRoundedRectPath(ctx, {\n          x: innerX,\n          y: colorY + 1,\n          w: boxWidth - 2,\n          h: boxHeight - 2,\n          radius: borderRadius,\n        });\n        ctx.fill();\n      } else {\n        // Normal rect\n        ctx.fillStyle = options.multiKeyBackground;\n        ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n        ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n        // Inner square\n        ctx.fillStyle = labelColor.backgroundColor;\n        ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n      }\n    }\n\n    // restore fillStyle\n    ctx.fillStyle = this.labelTextColors[i];\n  }\n\n  drawBody(pt, ctx, options) {\n    const {body} = this;\n    const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n    const bodyFont = toFont(options.bodyFont);\n    let bodyLineHeight = bodyFont.lineHeight;\n    let xLinePadding = 0;\n\n    const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n    const fillLineOfText = function(line) {\n      ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n      pt.y += bodyLineHeight + bodySpacing;\n    };\n\n    const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n    let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n    ctx.textAlign = bodyAlign;\n    ctx.textBaseline = 'middle';\n    ctx.font = bodyFont.string;\n\n    pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n    // Before body lines\n    ctx.fillStyle = options.bodyColor;\n    each(this.beforeBody, fillLineOfText);\n\n    xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n      ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n      : 0;\n\n    // Draw body lines now\n    for (i = 0, ilen = body.length; i < ilen; ++i) {\n      bodyItem = body[i];\n      textColor = this.labelTextColors[i];\n\n      ctx.fillStyle = textColor;\n      each(bodyItem.before, fillLineOfText);\n\n      lines = bodyItem.lines;\n      // Draw Legend-like boxes if needed\n      if (displayColors && lines.length) {\n        this._drawColorBox(ctx, pt, i, rtlHelper, options);\n        bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n      }\n\n      for (j = 0, jlen = lines.length; j < jlen; ++j) {\n        fillLineOfText(lines[j]);\n        // Reset for any lines that don't include colorbox\n        bodyLineHeight = bodyFont.lineHeight;\n      }\n\n      each(bodyItem.after, fillLineOfText);\n    }\n\n    // Reset back to 0 for after body\n    xLinePadding = 0;\n    bodyLineHeight = bodyFont.lineHeight;\n\n    // After body lines\n    each(this.afterBody, fillLineOfText);\n    pt.y -= bodySpacing; // Remove last body spacing\n  }\n\n  drawFooter(pt, ctx, options) {\n    const footer = this.footer;\n    const length = footer.length;\n    let footerFont, i;\n\n    if (length) {\n      const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n      pt.x = getAlignedX(this, options.footerAlign, options);\n      pt.y += options.footerMarginTop;\n\n      ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n      ctx.textBaseline = 'middle';\n\n      footerFont = toFont(options.footerFont);\n\n      ctx.fillStyle = options.footerColor;\n      ctx.font = footerFont.string;\n\n      for (i = 0; i < length; ++i) {\n        ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n        pt.y += footerFont.lineHeight + options.footerSpacing;\n      }\n    }\n  }\n\n  drawBackground(pt, ctx, tooltipSize, options) {\n    const {xAlign, yAlign} = this;\n    const {x, y} = pt;\n    const {width, height} = tooltipSize;\n    const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n    ctx.fillStyle = options.backgroundColor;\n    ctx.strokeStyle = options.borderColor;\n    ctx.lineWidth = options.borderWidth;\n\n    ctx.beginPath();\n    ctx.moveTo(x + topLeft, y);\n    if (yAlign === 'top') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + width - topRight, y);\n    ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n    if (yAlign === 'center' && xAlign === 'right') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + width, y + height - bottomRight);\n    ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n    if (yAlign === 'bottom') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + bottomLeft, y + height);\n    ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n    if (yAlign === 'center' && xAlign === 'left') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x, y + topLeft);\n    ctx.quadraticCurveTo(x, y, x + topLeft, y);\n    ctx.closePath();\n\n    ctx.fill();\n\n    if (options.borderWidth > 0) {\n      ctx.stroke();\n    }\n  }\n\n  /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n  _updateAnimationTarget(options) {\n    const chart = this.chart;\n    const anims = this.$animations;\n    const animX = anims && anims.x;\n    const animY = anims && anims.y;\n    if (animX || animY) {\n      const position = positioners[options.position].call(this, this._active, this._eventPosition);\n      if (!position) {\n        return;\n      }\n      const size = this._size = getTooltipSize(this, options);\n      const positionAndSize = Object.assign({}, position, this._size);\n      const alignment = determineAlignment(chart, options, positionAndSize);\n      const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n      if (animX._to !== point.x || animY._to !== point.y) {\n        this.xAlign = alignment.xAlign;\n        this.yAlign = alignment.yAlign;\n        this.width = size.width;\n        this.height = size.height;\n        this.caretX = position.x;\n        this.caretY = position.y;\n        this._resolveAnimations().update(this, point);\n      }\n    }\n  }\n\n  /**\n   * Determine if the tooltip will draw anything\n   * @returns {boolean} True if the tooltip will render\n   */\n  _willRender() {\n    return !!this.opacity;\n  }\n\n  draw(ctx) {\n    const options = this.options.setContext(this.getContext());\n    let opacity = this.opacity;\n\n    if (!opacity) {\n      return;\n    }\n\n    this._updateAnimationTarget(options);\n\n    const tooltipSize = {\n      width: this.width,\n      height: this.height\n    };\n    const pt = {\n      x: this.x,\n      y: this.y\n    };\n\n    // IE11/Edge does not like very small opacities, so snap to 0\n    opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n    const padding = toPadding(options.padding);\n\n    // Truthy/falsey value for empty tooltip\n    const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n    if (options.enabled && hasTooltipContent) {\n      ctx.save();\n      ctx.globalAlpha = opacity;\n\n      // Draw Background\n      this.drawBackground(pt, ctx, tooltipSize, options);\n\n      overrideTextDirection(ctx, options.textDirection);\n\n      pt.y += padding.top;\n\n      // Titles\n      this.drawTitle(pt, ctx, options);\n\n      // Body\n      this.drawBody(pt, ctx, options);\n\n      // Footer\n      this.drawFooter(pt, ctx, options);\n\n      restoreTextDirection(ctx, options.textDirection);\n\n      ctx.restore();\n    }\n  }\n\n  /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n  getActiveElements() {\n    return this._active || [];\n  }\n\n  /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n  setActiveElements(activeElements, eventPosition) {\n    const lastActive = this._active;\n    const active = activeElements.map(({datasetIndex, index}) => {\n      const meta = this.chart.getDatasetMeta(datasetIndex);\n\n      if (!meta) {\n        throw new Error('Cannot find a dataset at index ' + datasetIndex);\n      }\n\n      return {\n        datasetIndex,\n        element: meta.data[index],\n        index,\n      };\n    });\n    const changed = !_elementsEqual(lastActive, active);\n    const positionChanged = this._positionChanged(active, eventPosition);\n\n    if (changed || positionChanged) {\n      this._active = active;\n      this._eventPosition = eventPosition;\n      this._ignoreReplayEvents = true;\n      this.update(true);\n    }\n  }\n\n  /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n  handleEvent(e, replay, inChartArea = true) {\n    if (replay && this._ignoreReplayEvents) {\n      return false;\n    }\n    this._ignoreReplayEvents = false;\n\n    const options = this.options;\n    const lastActive = this._active || [];\n    const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n    // When there are multiple items shown, but the tooltip position is nearest mode\n    // an update may need to be made because our position may have changed even though\n    // the items are the same as before.\n    const positionChanged = this._positionChanged(active, e);\n\n    // Remember Last Actives\n    const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n    // Only handle target event on tooltip change\n    if (changed) {\n      this._active = active;\n\n      if (options.enabled || options.external) {\n        this._eventPosition = {\n          x: e.x,\n          y: e.y\n        };\n\n        this.update(true, replay);\n      }\n    }\n\n    return changed;\n  }\n\n  /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n  _getActiveElements(e, lastActive, replay, inChartArea) {\n    const options = this.options;\n\n    if (e.type === 'mouseout') {\n      return [];\n    }\n\n    if (!inChartArea) {\n      // Let user control the active elements outside chartArea. Eg. using Legend.\n      // But make sure that active elements are still valid.\n      return lastActive.filter(i =>\n        this.chart.data.datasets[i.datasetIndex] &&\n        this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined\n      );\n    }\n\n    // Find Active Elements for tooltips\n    const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n    if (options.reverse) {\n      active.reverse();\n    }\n\n    return active;\n  }\n\n  /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\n  _positionChanged(active, e) {\n    const {caretX, caretY, options} = this;\n    const position = positioners[options.position].call(this, active, e);\n    return position !== false && (caretX !== position.x || caretY !== position.y);\n  }\n}\n\nexport default {\n  id: 'tooltip',\n  _element: Tooltip,\n  positioners,\n\n  afterInit(chart, _args, options) {\n    if (options) {\n      chart.tooltip = new Tooltip({chart, options});\n    }\n  },\n\n  beforeUpdate(chart, _args, options) {\n    if (chart.tooltip) {\n      chart.tooltip.initialize(options);\n    }\n  },\n\n  reset(chart, _args, options) {\n    if (chart.tooltip) {\n      chart.tooltip.initialize(options);\n    }\n  },\n\n  afterDraw(chart) {\n    const tooltip = chart.tooltip;\n\n    if (tooltip && tooltip._willRender()) {\n      const args = {\n        tooltip\n      };\n\n      if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n        return;\n      }\n\n      tooltip.draw(chart.ctx);\n\n      chart.notifyPlugins('afterTooltipDraw', args);\n    }\n  },\n\n  afterEvent(chart, args) {\n    if (chart.tooltip) {\n      // If the event is replayed from `update`, we should evaluate with the final positions.\n      const useFinalPosition = args.replay;\n      if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n        // notify chart about the change, so it will render\n        args.changed = true;\n      }\n    }\n  },\n\n  defaults: {\n    enabled: true,\n    external: null,\n    position: 'average',\n    backgroundColor: 'rgba(0,0,0,0.8)',\n    titleColor: '#fff',\n    titleFont: {\n      weight: 'bold',\n    },\n    titleSpacing: 2,\n    titleMarginBottom: 6,\n    titleAlign: 'left',\n    bodyColor: '#fff',\n    bodySpacing: 2,\n    bodyFont: {\n    },\n    bodyAlign: 'left',\n    footerColor: '#fff',\n    footerSpacing: 2,\n    footerMarginTop: 6,\n    footerFont: {\n      weight: 'bold',\n    },\n    footerAlign: 'left',\n    padding: 6,\n    caretPadding: 2,\n    caretSize: 5,\n    cornerRadius: 6,\n    boxHeight: (ctx, opts) => opts.bodyFont.size,\n    boxWidth: (ctx, opts) => opts.bodyFont.size,\n    multiKeyBackground: '#fff',\n    displayColors: true,\n    boxPadding: 0,\n    borderColor: 'rgba(0,0,0,0)',\n    borderWidth: 0,\n    animation: {\n      duration: 400,\n      easing: 'easeOutQuart',\n    },\n    animations: {\n      numbers: {\n        type: 'number',\n        properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n      },\n      opacity: {\n        easing: 'linear',\n        duration: 200\n      }\n    },\n    callbacks: defaultCallbacks\n  },\n\n  defaultRoutes: {\n    bodyFont: 'font',\n    footerFont: 'font',\n    titleFont: 'font'\n  },\n\n  descriptors: {\n    _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n    _indexable: false,\n    callbacks: {\n      _scriptable: false,\n      _indexable: false,\n    },\n    animation: {\n      _fallback: false\n    },\n    animations: {\n      _fallback: 'animation'\n    }\n  },\n\n  // Resolve additionally from `interaction` options and defaults.\n  additionalOptionScopes: ['interaction']\n};\n", "import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n  if (typeof raw === 'string') {\n    index = labels.push(raw) - 1;\n    addedLabels.unshift({index, label: raw});\n  } else if (isNaN(raw)) {\n    index = null;\n  }\n  return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n  const first = labels.indexOf(raw);\n  if (first === -1) {\n    return addIfString(labels, raw, index, addedLabels);\n  }\n  const last = labels.lastIndexOf(raw);\n  return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n  const labels = this.getLabels();\n\n  if (value >= 0 && value < labels.length) {\n    return labels[value];\n  }\n  return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n  static id = 'category';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    ticks: {\n      callback: _getLabelForValue\n    }\n  };\n\n  constructor(cfg) {\n    super(cfg);\n\n    /** @type {number} */\n    this._startValue = undefined;\n    this._valueRange = 0;\n    this._addedLabels = [];\n  }\n\n  init(scaleOptions) {\n    const added = this._addedLabels;\n    if (added.length) {\n      const labels = this.getLabels();\n      for (const {index, label} of added) {\n        if (labels[index] === label) {\n          labels.splice(index, 1);\n        }\n      }\n      this._addedLabels = [];\n    }\n    super.init(scaleOptions);\n  }\n\n  parse(raw, index) {\n    if (isNullOrUndef(raw)) {\n      return null;\n    }\n    const labels = this.getLabels();\n    index = isFinite(index) && labels[index] === raw ? index\n      : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n    return validIndex(index, labels.length - 1);\n  }\n\n  determineDataLimits() {\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let {min, max} = this.getMinMax(true);\n\n    if (this.options.bounds === 'ticks') {\n      if (!minDefined) {\n        min = 0;\n      }\n      if (!maxDefined) {\n        max = this.getLabels().length - 1;\n      }\n    }\n\n    this.min = min;\n    this.max = max;\n  }\n\n  buildTicks() {\n    const min = this.min;\n    const max = this.max;\n    const offset = this.options.offset;\n    const ticks = [];\n    let labels = this.getLabels();\n\n    // If we are viewing some subset of labels, slice the original array\n    labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n    this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n    this._startValue = this.min - (offset ? 0.5 : 0);\n\n    for (let value = min; value <= max; value++) {\n      ticks.push({value});\n    }\n    return ticks;\n  }\n\n  getLabelForValue(value) {\n    return _getLabelForValue.call(this, value);\n  }\n\n  /**\n\t * @protected\n\t */\n  configure() {\n    super.configure();\n\n    if (!this.isHorizontal()) {\n      // For backward compatibility, vertical category scale reverse is inverted.\n      this._reversePixels = !this._reversePixels;\n    }\n  }\n\n  // Used to get data value locations. Value can either be an index or a numerical value\n  getPixelForValue(value) {\n    if (typeof value !== 'number') {\n      value = this.parse(value);\n    }\n\n    return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n  }\n\n  // Must override base implementation because it calls getPixelForValue\n  // and category scale can have duplicate values\n  getPixelForTick(index) {\n    const ticks = this.ticks;\n    if (index < 0 || index > ticks.length - 1) {\n      return null;\n    }\n    return this.getPixelForValue(ticks[index].value);\n  }\n\n  getValueForPixel(pixel) {\n    return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n  }\n\n  getBasePixel() {\n    return this.bottom;\n  }\n}\n", "import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n *    if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n *    Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n *    spacing = (max - min) / count\n *    Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n *    spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n  const ticks = [];\n  // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n  // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n  // for details.\n\n  const MIN_SPACING = 1e-14;\n  const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n  const unit = step || 1;\n  const maxSpaces = maxTicks - 1;\n  const {min: rmin, max: rmax} = dataRange;\n  const minDefined = !isNullOrUndef(min);\n  const maxDefined = !isNullOrUndef(max);\n  const countDefined = !isNullOrUndef(count);\n  const minSpacing = (rmax - rmin) / (maxDigits + 1);\n  let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n  let factor, niceMin, niceMax, numSpaces;\n\n  // Beyond MIN_SPACING floating point numbers being to lose precision\n  // such that we can't do the math necessary to generate ticks\n  if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n    return [{value: rmin}, {value: rmax}];\n  }\n\n  numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n  if (numSpaces > maxSpaces) {\n    // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n    spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n  }\n\n  if (!isNullOrUndef(precision)) {\n    // If the user specified a precision, round to that number of decimal places\n    factor = Math.pow(10, precision);\n    spacing = Math.ceil(spacing * factor) / factor;\n  }\n\n  if (bounds === 'ticks') {\n    niceMin = Math.floor(rmin / spacing) * spacing;\n    niceMax = Math.ceil(rmax / spacing) * spacing;\n  } else {\n    niceMin = rmin;\n    niceMax = rmax;\n  }\n\n  if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n    // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n    // spacing = step;\n    // numSpaces = (max - min) / spacing;\n    // Note that we round here to handle the case where almostWhole translated an FP error\n    numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n    spacing = (max - min) / numSpaces;\n    niceMin = min;\n    niceMax = max;\n  } else if (countDefined) {\n    // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n    // Sometimes these are no-ops, but it makes the code a lot clearer\n    // and when a user defined range is specified, we want the correct ticks\n    niceMin = minDefined ? min : niceMin;\n    niceMax = maxDefined ? max : niceMax;\n    numSpaces = count - 1;\n    spacing = (niceMax - niceMin) / numSpaces;\n  } else {\n    // Case 4\n    numSpaces = (niceMax - niceMin) / spacing;\n\n    // If very close to our rounded value, use it.\n    if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n      numSpaces = Math.round(numSpaces);\n    } else {\n      numSpaces = Math.ceil(numSpaces);\n    }\n  }\n\n  // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n  // until this point\n  const decimalPlaces = Math.max(\n    _decimalPlaces(spacing),\n    _decimalPlaces(niceMin)\n  );\n  factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n  niceMin = Math.round(niceMin * factor) / factor;\n  niceMax = Math.round(niceMax * factor) / factor;\n\n  let j = 0;\n  if (minDefined) {\n    if (includeBounds && niceMin !== min) {\n      ticks.push({value: min});\n\n      if (niceMin < min) {\n        j++; // Skip niceMin\n      }\n      // If the next nice tick is close to min, skip it\n      if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n        j++;\n      }\n    } else if (niceMin < min) {\n      j++;\n    }\n  }\n\n  for (; j < numSpaces; ++j) {\n    const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n    if (maxDefined && tickValue > max) {\n      break;\n    }\n    ticks.push({value: tickValue});\n  }\n\n  if (maxDefined && includeBounds && niceMax !== max) {\n    // If the previous tick is too close to max, replace it with max, else add max\n    if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n      ticks[ticks.length - 1].value = max;\n    } else {\n      ticks.push({value: max});\n    }\n  } else if (!maxDefined || niceMax === max) {\n    ticks.push({value: niceMax});\n  }\n\n  return ticks;\n}\n\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n  const rad = toRadians(minRotation);\n  const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n  const length = 0.75 * minSpacing * ('' + value).length;\n  return Math.min(minSpacing / ratio, length);\n}\n\nexport default class LinearScaleBase extends Scale {\n\n  constructor(cfg) {\n    super(cfg);\n\n    /** @type {number} */\n    this.start = undefined;\n    /** @type {number} */\n    this.end = undefined;\n    /** @type {number} */\n    this._startValue = undefined;\n    /** @type {number} */\n    this._endValue = undefined;\n    this._valueRange = 0;\n  }\n\n  parse(raw, index) { // eslint-disable-line no-unused-vars\n    if (isNullOrUndef(raw)) {\n      return null;\n    }\n    if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n      return null;\n    }\n\n    return +raw;\n  }\n\n  handleTickRangeOptions() {\n    const {beginAtZero} = this.options;\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let {min, max} = this;\n\n    const setMin = v => (min = minDefined ? min : v);\n    const setMax = v => (max = maxDefined ? max : v);\n\n    if (beginAtZero) {\n      const minSign = sign(min);\n      const maxSign = sign(max);\n\n      if (minSign < 0 && maxSign < 0) {\n        setMax(0);\n      } else if (minSign > 0 && maxSign > 0) {\n        setMin(0);\n      }\n    }\n\n    if (min === max) {\n      let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n      setMax(max + offset);\n\n      if (!beginAtZero) {\n        setMin(min - offset);\n      }\n    }\n    this.min = min;\n    this.max = max;\n  }\n\n  getTickLimit() {\n    const tickOpts = this.options.ticks;\n    // eslint-disable-next-line prefer-const\n    let {maxTicksLimit, stepSize} = tickOpts;\n    let maxTicks;\n\n    if (stepSize) {\n      maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n      if (maxTicks > 1000) {\n        console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n        maxTicks = 1000;\n      }\n    } else {\n      maxTicks = this.computeTickLimit();\n      maxTicksLimit = maxTicksLimit || 11;\n    }\n\n    if (maxTicksLimit) {\n      maxTicks = Math.min(maxTicksLimit, maxTicks);\n    }\n\n    return maxTicks;\n  }\n\n  /**\n\t * @protected\n\t */\n  computeTickLimit() {\n    return Number.POSITIVE_INFINITY;\n  }\n\n  buildTicks() {\n    const opts = this.options;\n    const tickOpts = opts.ticks;\n\n    // Figure out what the max number of ticks we can support it is based on the size of\n    // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n    // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n    // the graph. Make sure we always have at least 2 ticks\n    let maxTicks = this.getTickLimit();\n    maxTicks = Math.max(2, maxTicks);\n\n    const numericGeneratorOptions = {\n      maxTicks,\n      bounds: opts.bounds,\n      min: opts.min,\n      max: opts.max,\n      precision: tickOpts.precision,\n      step: tickOpts.stepSize,\n      count: tickOpts.count,\n      maxDigits: this._maxDigits(),\n      horizontal: this.isHorizontal(),\n      minRotation: tickOpts.minRotation || 0,\n      includeBounds: tickOpts.includeBounds !== false\n    };\n    const dataRange = this._range || this;\n    const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n    // At this point, we need to update our max and min given the tick values,\n    // since we probably have expanded the range of the scale\n    if (opts.bounds === 'ticks') {\n      _setMinAndMaxByKey(ticks, this, 'value');\n    }\n\n    if (opts.reverse) {\n      ticks.reverse();\n\n      this.start = this.max;\n      this.end = this.min;\n    } else {\n      this.start = this.min;\n      this.end = this.max;\n    }\n\n    return ticks;\n  }\n\n  /**\n\t * @protected\n\t */\n  configure() {\n    const ticks = this.ticks;\n    let start = this.min;\n    let end = this.max;\n\n    super.configure();\n\n    if (this.options.offset && ticks.length) {\n      const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n      start -= offset;\n      end += offset;\n    }\n    this._startValue = start;\n    this._endValue = end;\n    this._valueRange = end - start;\n  }\n\n  getLabelForValue(value) {\n    return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n  }\n}\n", "import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n  static id = 'linear';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    ticks: {\n      callback: Ticks.formatters.numeric\n    }\n  };\n\n\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(true);\n\n    this.min = isFinite(min) ? min : 0;\n    this.max = isFinite(max) ? max : 1;\n\n    // Common base implementation to handle min, max, beginAtZero\n    this.handleTickRangeOptions();\n  }\n\n  /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n  computeTickLimit() {\n    const horizontal = this.isHorizontal();\n    const length = horizontal ? this.width : this.height;\n    const minRotation = toRadians(this.options.ticks.minRotation);\n    const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n    const tickFont = this._resolveTickFontOptions(0);\n    return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n  }\n\n  // Utils\n  getPixelForValue(value) {\n    return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n  }\n\n  getValueForPixel(pixel) {\n    return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n  }\n}\n", "import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n  const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n  return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n  const rangeStep = Math.pow(10, rangeExp);\n  const start = Math.floor(min / rangeStep);\n  const end = Math.ceil(max / rangeStep);\n  return end - start;\n}\n\nfunction startExp(min, max) {\n  const range = max - min;\n  let rangeExp = log10Floor(range);\n  while (steps(min, max, rangeExp) > 10) {\n    rangeExp++;\n  }\n  while (steps(min, max, rangeExp) < 10) {\n    rangeExp--;\n  }\n  return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n  min = finiteOrDefault(generationOptions.min, min);\n  const ticks = [];\n  const minExp = log10Floor(min);\n  let exp = startExp(min, max);\n  let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n  const stepSize = Math.pow(10, exp);\n  const base = minExp > exp ? Math.pow(10, minExp) : 0;\n  const start = Math.round((min - base) * precision) / precision;\n  const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n  let significand = Math.floor((start - offset) / Math.pow(10, exp));\n  let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n  while (value < max) {\n    ticks.push({value, major: isMajor(value), significand});\n    if (significand >= 10) {\n      significand = significand < 15 ? 15 : 20;\n    } else {\n      significand++;\n    }\n    if (significand >= 20) {\n      exp++;\n      significand = 2;\n      precision = exp >= 0 ? 1 : precision;\n    }\n    value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n  }\n  const lastTick = finiteOrDefault(generationOptions.max, value);\n  ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n  return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n  static id = 'logarithmic';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    ticks: {\n      callback: Ticks.formatters.logarithmic,\n      major: {\n        enabled: true\n      }\n    }\n  };\n\n\n  constructor(cfg) {\n    super(cfg);\n\n    /** @type {number} */\n    this.start = undefined;\n    /** @type {number} */\n    this.end = undefined;\n    /** @type {number} */\n    this._startValue = undefined;\n    this._valueRange = 0;\n  }\n\n  parse(raw, index) {\n    const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n    if (value === 0) {\n      this._zero = true;\n      return undefined;\n    }\n    return isFinite(value) && value > 0 ? value : null;\n  }\n\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(true);\n\n    this.min = isFinite(min) ? Math.max(0, min) : null;\n    this.max = isFinite(max) ? Math.max(0, max) : null;\n\n    if (this.options.beginAtZero) {\n      this._zero = true;\n    }\n\n    // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n    // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n    if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n      this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n    }\n\n    this.handleTickRangeOptions();\n  }\n\n  handleTickRangeOptions() {\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let min = this.min;\n    let max = this.max;\n\n    const setMin = v => (min = minDefined ? min : v);\n    const setMax = v => (max = maxDefined ? max : v);\n\n    if (min === max) {\n      if (min <= 0) { // includes null\n        setMin(1);\n        setMax(10);\n      } else {\n        setMin(changeExponent(min, -1));\n        setMax(changeExponent(max, +1));\n      }\n    }\n    if (min <= 0) {\n      setMin(changeExponent(max, -1));\n    }\n    if (max <= 0) {\n\n      setMax(changeExponent(min, +1));\n    }\n\n    this.min = min;\n    this.max = max;\n  }\n\n  buildTicks() {\n    const opts = this.options;\n\n    const generationOptions = {\n      min: this._userMin,\n      max: this._userMax\n    };\n    const ticks = generateTicks(generationOptions, this);\n\n    // At this point, we need to update our max and min given the tick values,\n    // since we probably have expanded the range of the scale\n    if (opts.bounds === 'ticks') {\n      _setMinAndMaxByKey(ticks, this, 'value');\n    }\n\n    if (opts.reverse) {\n      ticks.reverse();\n\n      this.start = this.max;\n      this.end = this.min;\n    } else {\n      this.start = this.min;\n      this.end = this.max;\n    }\n\n    return ticks;\n  }\n\n  /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n  getLabelForValue(value) {\n    return value === undefined\n      ? '0'\n      : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n  }\n\n  /**\n\t * @protected\n\t */\n  configure() {\n    const start = this.min;\n\n    super.configure();\n\n    this._startValue = log10(start);\n    this._valueRange = log10(this.max) - log10(start);\n  }\n\n  getPixelForValue(value) {\n    if (value === undefined || value === 0) {\n      value = this.min;\n    }\n    if (value === null || isNaN(value)) {\n      return NaN;\n    }\n    return this.getPixelForDecimal(value === this.min\n      ? 0\n      : (log10(value) - this._startValue) / this._valueRange);\n  }\n\n  getValueForPixel(pixel) {\n    const decimal = this.getDecimalForPixel(pixel);\n    return Math.pow(10, this._startValue + decimal * this._valueRange);\n  }\n}\n", "import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n  const tickOpts = opts.ticks;\n\n  if (tickOpts.display && opts.display) {\n    const padding = toPadding(tickOpts.backdropPadding);\n    return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n  }\n  return 0;\n}\n\nfunction measureLabelSize(ctx, font, label) {\n  label = isArray(label) ? label : [label];\n  return {\n    w: _longestText(ctx, font.string, label),\n    h: label.length * font.lineHeight\n  };\n}\n\nfunction determineLimits(angle, pos, size, min, max) {\n  if (angle === min || angle === max) {\n    return {\n      start: pos - (size / 2),\n      end: pos + (size / 2)\n    };\n  } else if (angle < min || angle > max) {\n    return {\n      start: pos - size,\n      end: pos\n    };\n  }\n\n  return {\n    start: pos,\n    end: pos + size\n  };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n  // Right, this is really confusing and there is a lot of maths going on here\n  // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n  //\n  // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n  //\n  // Solution:\n  //\n  // We assume the radius of the polygon is half the size of the canvas at first\n  // at each index we check if the text overlaps.\n  //\n  // Where it does, we store that angle and that index.\n  //\n  // After finding the largest index and angle we calculate how much we need to remove\n  // from the shape radius to move the point inwards by that x.\n  //\n  // We average the left and right distances to get the maximum shape radius that can fit in the box\n  // along with labels.\n  //\n  // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n  // on each side, removing that from the size, halving it and adding the left x protrusion width.\n  //\n  // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n  // and position it in the most space efficient manner\n  //\n  // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n  // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n  // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n  const orig = {\n    l: scale.left + scale._padding.left,\n    r: scale.right - scale._padding.right,\n    t: scale.top + scale._padding.top,\n    b: scale.bottom - scale._padding.bottom\n  };\n  const limits = Object.assign({}, orig);\n  const labelSizes = [];\n  const padding = [];\n  const valueCount = scale._pointLabels.length;\n  const pointLabelOpts = scale.options.pointLabels;\n  const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n  for (let i = 0; i < valueCount; i++) {\n    const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n    padding[i] = opts.padding;\n    const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n    const plFont = toFont(opts.font);\n    const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n    labelSizes[i] = textSize;\n\n    const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n    const angle = Math.round(toDegrees(angleRadians));\n    const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n    const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n    updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n  }\n\n  scale.setCenterPoint(\n    orig.l - limits.l,\n    limits.r - orig.r,\n    orig.t - limits.t,\n    limits.b - orig.b\n  );\n\n  // Now that text size is determined, compute the full positions\n  scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n  const sin = Math.abs(Math.sin(angle));\n  const cos = Math.abs(Math.cos(angle));\n  let x = 0;\n  let y = 0;\n  if (hLimits.start < orig.l) {\n    x = (orig.l - hLimits.start) / sin;\n    limits.l = Math.min(limits.l, orig.l - x);\n  } else if (hLimits.end > orig.r) {\n    x = (hLimits.end - orig.r) / sin;\n    limits.r = Math.max(limits.r, orig.r + x);\n  }\n  if (vLimits.start < orig.t) {\n    y = (orig.t - vLimits.start) / cos;\n    limits.t = Math.min(limits.t, orig.t - y);\n  } else if (vLimits.end > orig.b) {\n    y = (vLimits.end - orig.b) / cos;\n    limits.b = Math.max(limits.b, orig.b + y);\n  }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n  const outerDistance = scale.drawingArea;\n  const {extra, additionalAngle, padding, size} = itemOpts;\n  const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n  const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n  const y = yForAngle(pointLabelPosition.y, size.h, angle);\n  const textAlign = getTextAlignForAngle(angle);\n  const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n  return {\n    // if to draw or overlapped\n    visible: true,\n\n    // Text position\n    x: pointLabelPosition.x,\n    y,\n\n    // Text rendering data\n    textAlign,\n\n    // Bounding box\n    left,\n    top: y,\n    right: left + size.w,\n    bottom: y + size.h\n  };\n}\n\nfunction isNotOverlapped(item, area) {\n  if (!area) {\n    return true;\n  }\n  const {left, top, right, bottom} = item;\n  const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n    _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n  return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n  const items = [];\n  const valueCount = scale._pointLabels.length;\n  const opts = scale.options;\n  const {centerPointLabels, display} = opts.pointLabels;\n  const itemOpts = {\n    extra: getTickBackdropHeight(opts) / 2,\n    additionalAngle: centerPointLabels ? PI / valueCount : 0\n  };\n  let area;\n\n  for (let i = 0; i < valueCount; i++) {\n    itemOpts.padding = padding[i];\n    itemOpts.size = labelSizes[i];\n\n    const item = createPointLabelItem(scale, i, itemOpts);\n    items.push(item);\n    if (display === 'auto') {\n      item.visible = isNotOverlapped(item, area);\n      if (item.visible) {\n        area = item;\n      }\n    }\n  }\n  return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n  if (angle === 0 || angle === 180) {\n    return 'center';\n  } else if (angle < 180) {\n    return 'left';\n  }\n\n  return 'right';\n}\n\nfunction leftForTextAlign(x, w, align) {\n  if (align === 'right') {\n    x -= w;\n  } else if (align === 'center') {\n    x -= (w / 2);\n  }\n  return x;\n}\n\nfunction yForAngle(y, h, angle) {\n  if (angle === 90 || angle === 270) {\n    y -= (h / 2);\n  } else if (angle > 270 || angle < 90) {\n    y -= h;\n  }\n  return y;\n}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n  const {left, top, right, bottom} = item;\n  const {backdropColor} = opts;\n\n  if (!isNullOrUndef(backdropColor)) {\n    const borderRadius = toTRBLCorners(opts.borderRadius);\n    const padding = toPadding(opts.backdropPadding);\n    ctx.fillStyle = backdropColor;\n\n    const backdropLeft = left - padding.left;\n    const backdropTop = top - padding.top;\n    const backdropWidth = right - left + padding.width;\n    const backdropHeight = bottom - top + padding.height;\n\n    if (Object.values(borderRadius).some(v => v !== 0)) {\n      ctx.beginPath();\n      addRoundedRectPath(ctx, {\n        x: backdropLeft,\n        y: backdropTop,\n        w: backdropWidth,\n        h: backdropHeight,\n        radius: borderRadius,\n      });\n      ctx.fill();\n    } else {\n      ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n    }\n  }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n  const {ctx, options: {pointLabels}} = scale;\n\n  for (let i = labelCount - 1; i >= 0; i--) {\n    const item = scale._pointLabelItems[i];\n    if (!item.visible) {\n      // overlapping\n      continue;\n    }\n    const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n    drawPointLabelBox(ctx, optsAtIndex, item);\n    const plFont = toFont(optsAtIndex.font);\n    const {x, y, textAlign} = item;\n\n    renderText(\n      ctx,\n      scale._pointLabels[i],\n      x,\n      y + (plFont.lineHeight / 2),\n      plFont,\n      {\n        color: optsAtIndex.color,\n        textAlign: textAlign,\n        textBaseline: 'middle'\n      }\n    );\n  }\n}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n  const {ctx} = scale;\n  if (circular) {\n    // Draw circular arcs between the points\n    ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n  } else {\n    // Draw straight lines connecting each index\n    let pointPosition = scale.getPointPosition(0, radius);\n    ctx.moveTo(pointPosition.x, pointPosition.y);\n\n    for (let i = 1; i < labelCount; i++) {\n      pointPosition = scale.getPointPosition(i, radius);\n      ctx.lineTo(pointPosition.x, pointPosition.y);\n    }\n  }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n  const ctx = scale.ctx;\n  const circular = gridLineOpts.circular;\n\n  const {color, lineWidth} = gridLineOpts;\n\n  if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n    return;\n  }\n\n  ctx.save();\n  ctx.strokeStyle = color;\n  ctx.lineWidth = lineWidth;\n  ctx.setLineDash(borderOpts.dash || []);\n  ctx.lineDashOffset = borderOpts.dashOffset;\n\n  ctx.beginPath();\n  pathRadiusLine(scale, radius, circular, labelCount);\n  ctx.closePath();\n  ctx.stroke();\n  ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n  return createContext(parent, {\n    label,\n    index,\n    type: 'pointLabel'\n  });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n  static id = 'radialLinear';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    display: true,\n\n    // Boolean - Whether to animate scaling the chart from the centre\n    animate: true,\n    position: 'chartArea',\n\n    angleLines: {\n      display: true,\n      lineWidth: 1,\n      borderDash: [],\n      borderDashOffset: 0.0\n    },\n\n    grid: {\n      circular: false\n    },\n\n    startAngle: 0,\n\n    // label settings\n    ticks: {\n      // Boolean - Show a backdrop to the scale label\n      showLabelBackdrop: true,\n\n      callback: Ticks.formatters.numeric\n    },\n\n    pointLabels: {\n      backdropColor: undefined,\n\n      // Number - The backdrop padding above & below the label in pixels\n      backdropPadding: 2,\n\n      // Boolean - if true, show point labels\n      display: true,\n\n      // Number - Point label font size in pixels\n      font: {\n        size: 10\n      },\n\n      // Function - Used to convert point labels\n      callback(label) {\n        return label;\n      },\n\n      // Number - Additionl padding between scale and pointLabel\n      padding: 5,\n\n      // Boolean - if true, center point labels to slices in polar chart\n      centerPointLabels: false\n    }\n  };\n\n  static defaultRoutes = {\n    'angleLines.color': 'borderColor',\n    'pointLabels.color': 'color',\n    'ticks.color': 'color'\n  };\n\n  static descriptors = {\n    angleLines: {\n      _fallback: 'grid'\n    }\n  };\n\n  constructor(cfg) {\n    super(cfg);\n\n    /** @type {number} */\n    this.xCenter = undefined;\n    /** @type {number} */\n    this.yCenter = undefined;\n    /** @type {number} */\n    this.drawingArea = undefined;\n    /** @type {string[]} */\n    this._pointLabels = [];\n    this._pointLabelItems = [];\n  }\n\n  setDimensions() {\n    // Set the unconstrained dimension before label rotation\n    const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n    const w = this.width = this.maxWidth - padding.width;\n    const h = this.height = this.maxHeight - padding.height;\n    this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n    this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n    this.drawingArea = Math.floor(Math.min(w, h) / 2);\n  }\n\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(false);\n\n    this.min = isFinite(min) && !isNaN(min) ? min : 0;\n    this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n    // Common base implementation to handle min, max, beginAtZero\n    this.handleTickRangeOptions();\n  }\n\n  /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n  computeTickLimit() {\n    return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n  }\n\n  generateTickLabels(ticks) {\n    LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n    // Point labels\n    this._pointLabels = this.getLabels()\n      .map((value, index) => {\n        const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n        return label || label === 0 ? label : '';\n      })\n      .filter((v, i) => this.chart.getDataVisibility(i));\n  }\n\n  fit() {\n    const opts = this.options;\n\n    if (opts.display && opts.pointLabels.display) {\n      fitWithPointLabels(this);\n    } else {\n      this.setCenterPoint(0, 0, 0, 0);\n    }\n  }\n\n  setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n    this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n    this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n    this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n  }\n\n  getIndexAngle(index) {\n    const angleMultiplier = TAU / (this._pointLabels.length || 1);\n    const startAngle = this.options.startAngle || 0;\n\n    return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n  }\n\n  getDistanceFromCenterForValue(value) {\n    if (isNullOrUndef(value)) {\n      return NaN;\n    }\n\n    // Take into account half font size + the yPadding of the top value\n    const scalingFactor = this.drawingArea / (this.max - this.min);\n    if (this.options.reverse) {\n      return (this.max - value) * scalingFactor;\n    }\n    return (value - this.min) * scalingFactor;\n  }\n\n  getValueForDistanceFromCenter(distance) {\n    if (isNullOrUndef(distance)) {\n      return NaN;\n    }\n\n    const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n    return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n  }\n\n  getPointLabelContext(index) {\n    const pointLabels = this._pointLabels || [];\n\n    if (index >= 0 && index < pointLabels.length) {\n      const pointLabel = pointLabels[index];\n      return createPointLabelContext(this.getContext(), index, pointLabel);\n    }\n  }\n\n  getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n    const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n    return {\n      x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n      y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n      angle\n    };\n  }\n\n  getPointPositionForValue(index, value) {\n    return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n  }\n\n  getBasePosition(index) {\n    return this.getPointPositionForValue(index || 0, this.getBaseValue());\n  }\n\n  getPointLabelPosition(index) {\n    const {left, top, right, bottom} = this._pointLabelItems[index];\n    return {\n      left,\n      top,\n      right,\n      bottom,\n    };\n  }\n\n  /**\n\t * @protected\n\t */\n  drawBackground() {\n    const {backgroundColor, grid: {circular}} = this.options;\n    if (backgroundColor) {\n      const ctx = this.ctx;\n      ctx.save();\n      ctx.beginPath();\n      pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n      ctx.closePath();\n      ctx.fillStyle = backgroundColor;\n      ctx.fill();\n      ctx.restore();\n    }\n  }\n\n  /**\n\t * @protected\n\t */\n  drawGrid() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    const {angleLines, grid, border} = opts;\n    const labelCount = this._pointLabels.length;\n\n    let i, offset, position;\n\n    if (opts.pointLabels.display) {\n      drawPointLabels(this, labelCount);\n    }\n\n    if (grid.display) {\n      this.ticks.forEach((tick, index) => {\n        if (index !== 0 || (index === 0 && this.min < 0)) {\n          offset = this.getDistanceFromCenterForValue(tick.value);\n          const context = this.getContext(index);\n          const optsAtIndex = grid.setContext(context);\n          const optsAtIndexBorder = border.setContext(context);\n\n          drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n        }\n      });\n    }\n\n    if (angleLines.display) {\n      ctx.save();\n\n      for (i = labelCount - 1; i >= 0; i--) {\n        const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n        const {color, lineWidth} = optsAtIndex;\n\n        if (!lineWidth || !color) {\n          continue;\n        }\n\n        ctx.lineWidth = lineWidth;\n        ctx.strokeStyle = color;\n\n        ctx.setLineDash(optsAtIndex.borderDash);\n        ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n        offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n        position = this.getPointPosition(i, offset);\n        ctx.beginPath();\n        ctx.moveTo(this.xCenter, this.yCenter);\n        ctx.lineTo(position.x, position.y);\n        ctx.stroke();\n      }\n\n      ctx.restore();\n    }\n  }\n\n  /**\n\t * @protected\n\t */\n  drawBorder() {}\n\n  /**\n\t * @protected\n\t */\n  drawLabels() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    const tickOpts = opts.ticks;\n\n    if (!tickOpts.display) {\n      return;\n    }\n\n    const startAngle = this.getIndexAngle(0);\n    let offset, width;\n\n    ctx.save();\n    ctx.translate(this.xCenter, this.yCenter);\n    ctx.rotate(startAngle);\n    ctx.textAlign = 'center';\n    ctx.textBaseline = 'middle';\n\n    this.ticks.forEach((tick, index) => {\n      if ((index === 0 && this.min >= 0) && !opts.reverse) {\n        return;\n      }\n\n      const optsAtIndex = tickOpts.setContext(this.getContext(index));\n      const tickFont = toFont(optsAtIndex.font);\n      offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n      if (optsAtIndex.showLabelBackdrop) {\n        ctx.font = tickFont.string;\n        width = ctx.measureText(tick.label).width;\n        ctx.fillStyle = optsAtIndex.backdropColor;\n\n        const padding = toPadding(optsAtIndex.backdropPadding);\n        ctx.fillRect(\n          -width / 2 - padding.left,\n          -offset - tickFont.size / 2 - padding.top,\n          width + padding.width,\n          tickFont.size + padding.height\n        );\n      }\n\n      renderText(ctx, tick.label, 0, -offset, tickFont, {\n        color: optsAtIndex.color,\n        strokeColor: optsAtIndex.textStrokeColor,\n        strokeWidth: optsAtIndex.textStrokeWidth,\n      });\n    });\n\n    ctx.restore();\n  }\n\n  /**\n\t * @protected\n\t */\n  drawTitle() {}\n}\n", "import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object<Unit, Interval>}\n */\nconst INTERVALS = {\n  millisecond: {common: true, size: 1, steps: 1000},\n  second: {common: true, size: 1000, steps: 60},\n  minute: {common: true, size: 60000, steps: 60},\n  hour: {common: true, size: 3600000, steps: 24},\n  day: {common: true, size: 86400000, steps: 30},\n  week: {common: false, size: 604800000, steps: 4},\n  month: {common: true, size: 2.628e9, steps: 12},\n  quarter: {common: false, size: 7.884e9, steps: 4},\n  year: {common: true, size: 3.154e10}\n};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n  return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n  if (isNullOrUndef(input)) {\n    return null;\n  }\n\n  const adapter = scale._adapter;\n  const {parser, round, isoWeekday} = scale._parseOpts;\n  let value = input;\n\n  if (typeof parser === 'function') {\n    value = parser(value);\n  }\n\n  // Only parse if it's not a timestamp already\n  if (!isFinite(value)) {\n    value = typeof parser === 'string'\n      ? adapter.parse(value, parser)\n      : adapter.parse(value);\n  }\n\n  if (value === null) {\n    return null;\n  }\n\n  if (round) {\n    value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n      ? adapter.startOf(value, 'isoWeek', isoWeekday)\n      : adapter.startOf(value, round);\n  }\n\n  return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n  const ilen = UNITS.length;\n\n  for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n    const interval = INTERVALS[UNITS[i]];\n    const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n\n    if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n      return UNITS[i];\n    }\n  }\n\n  return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\n */\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n  for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n    const unit = UNITS[i];\n    if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n      return unit;\n    }\n  }\n\n  return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\n */\nfunction determineMajorUnit(unit) {\n  for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n    if (INTERVALS[UNITS[i]].common) {\n      return UNITS[i];\n    }\n  }\n}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\n */\nfunction addTick(ticks, time, timestamps) {\n  if (!timestamps) {\n    ticks[time] = true;\n  } else if (timestamps.length) {\n    const {lo, hi} = _lookup(timestamps, time);\n    const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n    ticks[timestamp] = true;\n  }\n}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\n */\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n  const adapter = scale._adapter;\n  const first = +adapter.startOf(ticks[0].value, majorUnit);\n  const last = ticks[ticks.length - 1].value;\n  let major, index;\n\n  for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n    index = map[major];\n    if (index >= 0) {\n      ticks[index].major = true;\n    }\n  }\n  return ticks;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n  const ticks = [];\n  /** @type {Object<number,object>} */\n  const map = {};\n  const ilen = values.length;\n  let i, value;\n\n  for (i = 0; i < ilen; ++i) {\n    value = values[i];\n    map[value] = i;\n\n    ticks.push({\n      value,\n      major: false\n    });\n  }\n\n  // We set the major ticks separately from the above loop because calling startOf for every tick\n  // is expensive when there is a large number of ticks\n  return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n  static id = 'time';\n\n  /**\n   * @type {any}\n   */\n  static defaults = {\n    /**\n     * Scale boundary strategy (bypassed by min/max time options)\n     * - `data`: make sure data are fully visible, ticks outside are removed\n     * - `ticks`: make sure ticks are fully visible, data outside are truncated\n     * @see https://github.com/chartjs/Chart.js/pull/4556\n     * @since 2.7.0\n     */\n    bounds: 'data',\n\n    adapters: {},\n    time: {\n      parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n      unit: false, // false == automatic or override with week, month, year, etc.\n      round: false, // none, or override with week, month, year, etc.\n      isoWeekday: false, // override week start day\n      minUnit: 'millisecond',\n      displayFormats: {}\n    },\n    ticks: {\n      /**\n       * Ticks generation input values:\n       * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n       * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n       * - 'labels': generates ticks from user given `data.labels` values ONLY.\n       * @see https://github.com/chartjs/Chart.js/pull/4507\n       * @since 2.7.0\n       */\n      source: 'auto',\n\n      callback: false,\n\n      major: {\n        enabled: false\n      }\n    }\n  };\n\n  /**\n\t * @param {object} props\n\t */\n  constructor(props) {\n    super(props);\n\n    /** @type {{data: number[], labels: number[], all: number[]}} */\n    this._cache = {\n      data: [],\n      labels: [],\n      all: []\n    };\n\n    /** @type {Unit} */\n    this._unit = 'day';\n    /** @type {Unit=} */\n    this._majorUnit = undefined;\n    this._offsets = {};\n    this._normalized = false;\n    this._parseOpts = undefined;\n  }\n\n  init(scaleOpts, opts = {}) {\n    const time = scaleOpts.time || (scaleOpts.time = {});\n    /** @type {DateAdapter} */\n    const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n    adapter.init(opts);\n\n    // Backward compatibility: before introducing adapter, `displayFormats` was\n    // supposed to contain *all* unit/string pairs but this can't be resolved\n    // when loading the scale (adapters are loaded afterward), so let's populate\n    // missing formats on update\n    mergeIf(time.displayFormats, adapter.formats());\n\n    this._parseOpts = {\n      parser: time.parser,\n      round: time.round,\n      isoWeekday: time.isoWeekday\n    };\n\n    super.init(scaleOpts);\n\n    this._normalized = opts.normalized;\n  }\n\n  /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n  parse(raw, index) { // eslint-disable-line no-unused-vars\n    if (raw === undefined) {\n      return null;\n    }\n    return parse(this, raw);\n  }\n\n  beforeLayout() {\n    super.beforeLayout();\n    this._cache = {\n      data: [],\n      labels: [],\n      all: []\n    };\n  }\n\n  determineDataLimits() {\n    const options = this.options;\n    const adapter = this._adapter;\n    const unit = options.time.unit || 'day';\n    // eslint-disable-next-line prefer-const\n    let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n    /**\n\t\t * @param {object} bounds\n\t\t */\n    function _applyBounds(bounds) {\n      if (!minDefined && !isNaN(bounds.min)) {\n        min = Math.min(min, bounds.min);\n      }\n      if (!maxDefined && !isNaN(bounds.max)) {\n        max = Math.max(max, bounds.max);\n      }\n    }\n\n    // If we have user provided `min` and `max` labels / data bounds can be ignored\n    if (!minDefined || !maxDefined) {\n      // Labels are always considered, when user did not force bounds\n      _applyBounds(this._getLabelBounds());\n\n      // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n      // data bounds are ignored (and don't need to be determined)\n      if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n        _applyBounds(this.getMinMax(false));\n      }\n    }\n\n    min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n    max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n    // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n    this.min = Math.min(min, max - 1);\n    this.max = Math.max(min + 1, max);\n  }\n\n  /**\n\t * @private\n\t */\n  _getLabelBounds() {\n    const arr = this.getLabelTimestamps();\n    let min = Number.POSITIVE_INFINITY;\n    let max = Number.NEGATIVE_INFINITY;\n\n    if (arr.length) {\n      min = arr[0];\n      max = arr[arr.length - 1];\n    }\n    return {min, max};\n  }\n\n  /**\n\t * @return {object[]}\n\t */\n  buildTicks() {\n    const options = this.options;\n    const timeOpts = options.time;\n    const tickOpts = options.ticks;\n    const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n    if (options.bounds === 'ticks' && timestamps.length) {\n      this.min = this._userMin || timestamps[0];\n      this.max = this._userMax || timestamps[timestamps.length - 1];\n    }\n\n    const min = this.min;\n    const max = this.max;\n\n    const ticks = _filterBetween(timestamps, min, max);\n\n    // PRIVATE\n    // determineUnitForFormatting relies on the number of ticks so we don't use it when\n    // autoSkip is enabled because we don't yet know what the final number of ticks will be\n    this._unit = timeOpts.unit || (tickOpts.autoSkip\n      ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n      : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n    this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n      : determineMajorUnit(this._unit);\n    this.initOffsets(timestamps);\n\n    if (options.reverse) {\n      ticks.reverse();\n    }\n\n    return ticksFromTimestamps(this, ticks, this._majorUnit);\n  }\n\n  afterAutoSkip() {\n    // Offsets for bar charts need to be handled with the auto skipped\n    // ticks. Once ticks have been skipped, we re-compute the offsets.\n    if (this.options.offsetAfterAutoskip) {\n      this.initOffsets(this.ticks.map(tick => +tick.value));\n    }\n  }\n\n  /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n  initOffsets(timestamps = []) {\n    let start = 0;\n    let end = 0;\n    let first, last;\n\n    if (this.options.offset && timestamps.length) {\n      first = this.getDecimalForValue(timestamps[0]);\n      if (timestamps.length === 1) {\n        start = 1 - first;\n      } else {\n        start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n      }\n      last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n      if (timestamps.length === 1) {\n        end = last;\n      } else {\n        end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n      }\n    }\n    const limit = timestamps.length < 3 ? 0.5 : 0.25;\n    start = _limitValue(start, 0, limit);\n    end = _limitValue(end, 0, limit);\n\n    this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n  }\n\n  /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n  _generate() {\n    const adapter = this._adapter;\n    const min = this.min;\n    const max = this.max;\n    const options = this.options;\n    const timeOpts = options.time;\n    // @ts-ignore\n    const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n    const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n    const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n    const hasWeekday = isNumber(weekday) || weekday === true;\n    const ticks = {};\n    let first = min;\n    let time, count;\n\n    // For 'week' unit, handle the first day of week option\n    if (hasWeekday) {\n      first = +adapter.startOf(first, 'isoWeek', weekday);\n    }\n\n    // Align first ticks on unit\n    first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n    // Prevent browser from freezing in case user options request millions of milliseconds\n    if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n      throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n    }\n\n    const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n    for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n      addTick(ticks, time, timestamps);\n    }\n\n    if (time === max || options.bounds === 'ticks' || count === 1) {\n      addTick(ticks, time, timestamps);\n    }\n\n    // @ts-ignore\n    return Object.keys(ticks).sort(sorter).map(x => +x);\n  }\n\n  /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n  getLabelForValue(value) {\n    const adapter = this._adapter;\n    const timeOpts = this.options.time;\n\n    if (timeOpts.tooltipFormat) {\n      return adapter.format(value, timeOpts.tooltipFormat);\n    }\n    return adapter.format(value, timeOpts.displayFormats.datetime);\n  }\n\n  /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n  format(value, format) {\n    const options = this.options;\n    const formats = options.time.displayFormats;\n    const unit = this._unit;\n    const fmt = format || formats[unit];\n    return this._adapter.format(value, fmt);\n  }\n\n  /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n  _tickFormatFunction(time, index, ticks, format) {\n    const options = this.options;\n    const formatter = options.ticks.callback;\n\n    if (formatter) {\n      return call(formatter, [time, index, ticks], this);\n    }\n\n    const formats = options.time.displayFormats;\n    const unit = this._unit;\n    const majorUnit = this._majorUnit;\n    const minorFormat = unit && formats[unit];\n    const majorFormat = majorUnit && formats[majorUnit];\n    const tick = ticks[index];\n    const major = majorUnit && majorFormat && tick && tick.major;\n\n    return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n  }\n\n  /**\n\t * @param {object[]} ticks\n\t */\n  generateTickLabels(ticks) {\n    let i, ilen, tick;\n\n    for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n      tick = ticks[i];\n      tick.label = this._tickFormatFunction(tick.value, i, ticks);\n    }\n  }\n\n  /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n  getDecimalForValue(value) {\n    return value === null ? NaN : (value - this.min) / (this.max - this.min);\n  }\n\n  /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n  getPixelForValue(value) {\n    const offsets = this._offsets;\n    const pos = this.getDecimalForValue(value);\n    return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n  }\n\n  /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n  getValueForPixel(pixel) {\n    const offsets = this._offsets;\n    const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n    return this.min + pos * (this.max - this.min);\n  }\n\n  /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n  _getLabelSize(label) {\n    const ticksOpts = this.options.ticks;\n    const tickLabelWidth = this.ctx.measureText(label).width;\n    const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n    const cosRotation = Math.cos(angle);\n    const sinRotation = Math.sin(angle);\n    const tickFontSize = this._resolveTickFontOptions(0).size;\n\n    return {\n      w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n      h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n    };\n  }\n\n  /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n  _getLabelCapacity(exampleTime) {\n    const timeOpts = this.options.time;\n    const displayFormats = timeOpts.displayFormats;\n\n    // pick the longest format (milliseconds) for guesstimation\n    const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n    const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n    const size = this._getLabelSize(exampleLabel);\n    // subtract 1 - if offset then there's one less label than tick\n    // if not offset then one half label padding is added to each end leaving room for one less label\n    const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n    return capacity > 0 ? capacity : 1;\n  }\n\n  /**\n\t * @protected\n\t */\n  getDataTimestamps() {\n    let timestamps = this._cache.data || [];\n    let i, ilen;\n\n    if (timestamps.length) {\n      return timestamps;\n    }\n\n    const metas = this.getMatchingVisibleMetas();\n\n    if (this._normalized && metas.length) {\n      return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n    }\n\n    for (i = 0, ilen = metas.length; i < ilen; ++i) {\n      timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n    }\n\n    return (this._cache.data = this.normalize(timestamps));\n  }\n\n  /**\n\t * @protected\n\t */\n  getLabelTimestamps() {\n    const timestamps = this._cache.labels || [];\n    let i, ilen;\n\n    if (timestamps.length) {\n      return timestamps;\n    }\n\n    const labels = this.getLabels();\n    for (i = 0, ilen = labels.length; i < ilen; ++i) {\n      timestamps.push(parse(this, labels[i]));\n    }\n\n    return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n  }\n\n  /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n  normalize(values) {\n    // It seems to be somewhat faster to do sorting first\n    return _arrayUnique(values.sort(sorter));\n  }\n}\n", "import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\n */\nfunction interpolate(table, val, reverse) {\n  let lo = 0;\n  let hi = table.length - 1;\n  let prevSource, nextSource, prevTarget, nextTarget;\n  if (reverse) {\n    if (val >= table[lo].pos && val <= table[hi].pos) {\n      ({lo, hi} = _lookupByKey(table, 'pos', val));\n    }\n    ({pos: prevSource, time: prevTarget} = table[lo]);\n    ({pos: nextSource, time: nextTarget} = table[hi]);\n  } else {\n    if (val >= table[lo].time && val <= table[hi].time) {\n      ({lo, hi} = _lookupByKey(table, 'time', val));\n    }\n    ({time: prevSource, pos: prevTarget} = table[lo]);\n    ({time: nextSource, pos: nextTarget} = table[hi]);\n  }\n\n  const span = nextSource - prevSource;\n  return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n  static id = 'timeseries';\n\n  /**\n   * @type {any}\n   */\n  static defaults = TimeScale.defaults;\n\n  /**\n\t * @param {object} props\n\t */\n  constructor(props) {\n    super(props);\n\n    /** @type {object[]} */\n    this._table = [];\n    /** @type {number} */\n    this._minPos = undefined;\n    /** @type {number} */\n    this._tableRange = undefined;\n  }\n\n  /**\n\t * @protected\n\t */\n  initOffsets() {\n    const timestamps = this._getTimestampsForTable();\n    const table = this._table = this.buildLookupTable(timestamps);\n    this._minPos = interpolate(table, this.min);\n    this._tableRange = interpolate(table, this.max) - this._minPos;\n    super.initOffsets(timestamps);\n  }\n\n  /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n  buildLookupTable(timestamps) {\n    const {min, max} = this;\n    const items = [];\n    const table = [];\n    let i, ilen, prev, curr, next;\n\n    for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n      curr = timestamps[i];\n      if (curr >= min && curr <= max) {\n        items.push(curr);\n      }\n    }\n\n    if (items.length < 2) {\n      // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n      return [\n        {time: min, pos: 0},\n        {time: max, pos: 1}\n      ];\n    }\n\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      next = items[i + 1];\n      prev = items[i - 1];\n      curr = items[i];\n\n      // only add points that breaks the scale linearity\n      if (Math.round((next + prev) / 2) !== curr) {\n        table.push({time: curr, pos: i / (ilen - 1)});\n      }\n    }\n    return table;\n  }\n\n  /**\n    * Generates all timestamps defined in the data.\n    * Important: this method can return ticks outside the min and max range, it's the\n    * responsibility of the calling code to clamp values if needed.\n    * @protected\n    */\n  _generate() {\n    const min = this.min;\n    const max = this.max;\n    let timestamps = super.getDataTimestamps();\n    if (!timestamps.includes(min) || !timestamps.length) {\n      timestamps.splice(0, 0, min);\n    }\n    if (!timestamps.includes(max) || timestamps.length === 1) {\n      timestamps.push(max);\n    }\n    return timestamps.sort((a, b) => a - b);\n  }\n\n  /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n  _getTimestampsForTable() {\n    let timestamps = this._cache.all || [];\n\n    if (timestamps.length) {\n      return timestamps;\n    }\n\n    const data = this.getDataTimestamps();\n    const label = this.getLabelTimestamps();\n    if (data.length && label.length) {\n      // If combining labels and data (data might not contain all labels),\n      // we need to recheck uniqueness and sort\n      timestamps = this.normalize(data.concat(label));\n    } else {\n      timestamps = data.length ? data : label;\n    }\n    timestamps = this._cache.all = timestamps;\n\n    return timestamps;\n  }\n\n  /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n  getDecimalForValue(value) {\n    return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n  }\n\n  /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n  getValueForPixel(pixel) {\n    const offsets = this._offsets;\n    const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n    return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n  }\n}\n\nexport default TimeSeriesScale;\n", "export * from './controllers/index.js';\nexport * from './core/index.js';\nexport * from './elements/index.js';\nexport * from './platform/index.js';\nexport * from './plugins/index.js';\nexport * from './scales/index.js';\n\nimport * as controllers from './controllers/index.js';\nimport * as elements from './elements/index.js';\nimport * as plugins from './plugins/index.js';\nimport * as scales from './scales/index.js';\n\nexport {\n  controllers,\n  elements,\n  plugins,\n  scales,\n};\n\nexport const registerables = [\n  controllers,\n  elements,\n  plugins,\n  scales,\n];\n", "import {Chart, registerables} from '../dist/chart.js';\n\nChart.register(...registerables);\n\nexport * from '../dist/chart.js';\nexport default Chart;\n", "/*!\n * Chart.js v4.5.1\n * https://www.chartjs.org\n * (c) 2025 Chart.js Contributors\n * Released under the MIT License\n */\nexport { H as HALF_PI, b3 as INFINITY, P as PI, b2 as PITAU, b5 as QUARTER_PI, b4 as RAD_PER_DEG, T as TAU, b6 as TWO_THIRDS_PI, R as _addGrace, X as _alignPixel, a2 as _alignStartEnd, p as _angleBetween, b7 as _angleDiff, _ as _arrayUnique, a8 as _attachContext, au as _bezierCurveTo, ar as _bezierInterpolation, az as _boundSegment, ap as _boundSegments, a5 as _capitalize, ao as _computeSegments, a9 as _createResolver, aL as _decimalPlaces, aW as _deprecated, aa as _descriptors, ai as _elementsEqual, N as _factorize, aP as _filterBetween, I as _getParentNode, q as _getStartAndCountOfVisiblePoints, W as _int16Range, ak as _isBetween, aj as _isClickEvent, M as _isDomSupported, C as _isPointInArea, S as _limitValue, aO as _longestText, aQ as _lookup, B as _lookupByKey, V as _measureText, aU as _merger, aV as _mergerIf, al as _normalizeAngle, y as _parseObjectDataRadialScale, as as _pointInLine, am as _readValueToProps, A as _rlookupByKey, w as _scaleRangesChanged, aH as _setMinAndMaxByKey, aX as _splitKey, aq as _steppedInterpolation, at as _steppedLineTo, aC as _textX, a1 as _toLeftRightCenter, an as _updateBezierControlPoints, aw as addRoundedRectPath, aK as almostEquals, aJ as almostWhole, Q as callback, af as clearCanvas, Y as clipArea, aT as clone, c as color, j as createContext, ad as debounce, h as defined, aF as distanceBetweenPoints, av as drawPoint, aE as drawPointLegend, F as each, e as easingEffects, O as finiteOrDefault, b0 as fontString, o as formatNumber, D as getAngleFromPoint, ah as getDatasetClipArea, aS as getHoverColor, G as getMaximumSize, z as getRelativePosition, aA as getRtlAdapter, a$ as getStyle, b as isArray, g as isFinite, a7 as isFunction, k as isNullOrUndef, x as isNumber, i as isObject, aR as isPatternOrGradient, l as listenArrayEvents, aN as log10, a4 as merge, ab as mergeIf, aI as niceNum, aG as noop, aB as overrideTextDirection, J as readUsedSize, Z as renderText, r as requestAnimFrame, a as resolve, f as resolveObjectKey, aD as restoreTextDirection, ae as retinaScale, ag as setsEqual, s as sign, aZ as splineCurve, a_ as splineCurveMonotone, K as supportsEventListenerOptions, L as throttled, U as toDegrees, n as toDimension, a0 as toFont, aY as toFontString, b1 as toLineHeight, E as toPadding, m as toPercentage, t as toRadians, ax as toTRBL, ay as toTRBLCorners, ac as uid, $ as unclipArea, u as unlistenArrayEvents, v as valueOrDefault } from './chunks/helpers.dataset.js';\nimport '@kurkle/color';\n//# sourceMappingURL=helpers.js.map\n", "/*!\n* chartjs-plugin-annotation v3.1.0\n* https://www.chartjs.org/chartjs-plugin-annotation/index\n * (c) 2024 chartjs-plugin-annotation Contributors\n * Released under the MIT License\n */\nimport { Element, DoughnutController, defaults, Animations, Chart } from 'chart.js';\nimport { distanceBetweenPoints, toRadians, isObject, valueOrDefault, defined, isFunction, callback, isArray, toFont, addRoundedRectPath, toTRBLCorners, QUARTER_PI, PI, HALF_PI, TWO_THIRDS_PI, TAU, isNumber, RAD_PER_DEG, toPadding, isFinite, getAngleFromPoint, toDegrees, clipArea, unclipArea } from 'chart.js/helpers';\n\n/**\n * @typedef { import(\"chart.js\").ChartEvent } ChartEvent\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst interaction = {\n  modes: {\n    /**\n     * Point mode returns all elements that hit test based on the event position\n     * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n     * @param {ChartEvent} event - the event we are find things at\n     * @return {AnnotationElement[]} - elements that are found\n     */\n    point(visibleElements, event) {\n      return filterElements(visibleElements, event, {intersect: true});\n    },\n\n    /**\n     * Nearest mode returns the element closest to the event position\n     * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n     * @param {ChartEvent} event - the event we are find things at\n     * @param {Object} options - interaction options to use\n     * @return {AnnotationElement[]} - elements that are found (only 1 element)\n     */\n    nearest(visibleElements, event, options) {\n      return getNearestItem(visibleElements, event, options);\n    },\n    /**\n     * x mode returns the elements that hit-test at the current x coordinate\n     * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n     * @param {ChartEvent} event - the event we are find things at\n     * @param {Object} options - interaction options to use\n     * @return {AnnotationElement[]} - elements that are found\n     */\n    x(visibleElements, event, options) {\n      return filterElements(visibleElements, event, {intersect: options.intersect, axis: 'x'});\n    },\n\n    /**\n     * y mode returns the elements that hit-test at the current y coordinate\n     * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n     * @param {ChartEvent} event - the event we are find things at\n     * @param {Object} options - interaction options to use\n     * @return {AnnotationElement[]} - elements that are found\n     */\n    y(visibleElements, event, options) {\n      return filterElements(visibleElements, event, {intersect: options.intersect, axis: 'y'});\n    }\n  }\n};\n\n/**\n * Returns all elements that hit test based on the event position\n * @param {AnnotationElement[]} visibleElements - annotation elements which are visible\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\nfunction getElements(visibleElements, event, options) {\n  const mode = interaction.modes[options.mode] || interaction.modes.nearest;\n  return mode(visibleElements, event, options);\n}\n\nfunction inRangeByAxis(element, event, axis) {\n  if (axis !== 'x' && axis !== 'y') {\n    return element.inRange(event.x, event.y, 'x', true) || element.inRange(event.x, event.y, 'y', true);\n  }\n  return element.inRange(event.x, event.y, axis, true);\n}\n\nfunction getPointByAxis(event, center, axis) {\n  if (axis === 'x') {\n    return {x: event.x, y: center.y};\n  } else if (axis === 'y') {\n    return {x: center.x, y: event.y};\n  }\n  return center;\n}\n\nfunction filterElements(visibleElements, event, options) {\n  return visibleElements.filter((element) => options.intersect ? element.inRange(event.x, event.y) : inRangeByAxis(element, event, options.axis));\n}\n\nfunction getNearestItem(visibleElements, event, options) {\n  let minDistance = Number.POSITIVE_INFINITY;\n\n  return filterElements(visibleElements, event, options)\n    .reduce((nearestItems, element) => {\n      const center = element.getCenterPoint();\n      const evenPoint = getPointByAxis(event, center, options.axis);\n      const distance = distanceBetweenPoints(event, evenPoint);\n      if (distance < minDistance) {\n        nearestItems = [element];\n        minDistance = distance;\n      } else if (distance === minDistance) {\n        // Can have multiple items at the same distance in which case we sort by size\n        nearestItems.push(element);\n      }\n\n      return nearestItems;\n    }, [])\n    .sort((a, b) => a._index - b._index)\n    .slice(0, 1); // return only the top item;\n}\n\n/**\n * @typedef {import('chart.js').Point} Point\n */\n\n/**\n * Rotate a `point` relative to `center` point by `angle`\n * @param {Point} point - the point to rotate\n * @param {Point} center - center point for rotation\n * @param {number} angle - angle for rotation, in radians\n * @returns {Point} rotated point\n */\nfunction rotated(point, center, angle) {\n  const cos = Math.cos(angle);\n  const sin = Math.sin(angle);\n  const cx = center.x;\n  const cy = center.y;\n\n  return {\n    x: cx + cos * (point.x - cx) - sin * (point.y - cy),\n    y: cy + sin * (point.x - cx) + cos * (point.y - cy)\n  };\n}\n\nconst isOlderPart = (act, req) => req > act || (act.length > req.length && act.slice(0, req.length) === req);\n\n/**\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('chart.js').InteractionAxis } InteractionAxis\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst EPSILON = 0.001;\nconst clamp = (x, from, to) => Math.min(to, Math.max(from, x));\n\n/**\n * @param {{value: number, start: number, end: number}} limit\n * @param {number} hitSize\n * @returns {boolean}\n */\nconst inLimit = (limit, hitSize) => limit.value >= limit.start - hitSize && limit.value <= limit.end + hitSize;\n\n/**\n * @param {Object} obj\n * @param {number} from\n * @param {number} to\n * @returns {Object}\n */\nfunction clampAll(obj, from, to) {\n  for (const key of Object.keys(obj)) {\n    obj[key] = clamp(obj[key], from, to);\n  }\n  return obj;\n}\n\n/**\n * @param {Point} point\n * @param {Point} center\n * @param {number} radius\n * @param {number} hitSize\n * @returns {boolean}\n */\nfunction inPointRange(point, center, radius, hitSize) {\n  if (!point || !center || radius <= 0) {\n    return false;\n  }\n  return (Math.pow(point.x - center.x, 2) + Math.pow(point.y - center.y, 2)) <= Math.pow(radius + hitSize, 2);\n}\n\n/**\n * @param {Point} point\n * @param {{x: number, y: number, x2: number, y2: number}} rect\n * @param {InteractionAxis} axis\n * @param {{borderWidth: number, hitTolerance: number}} hitsize\n * @returns {boolean}\n */\nfunction inBoxRange(point, {x, y, x2, y2}, axis, {borderWidth, hitTolerance}) {\n  const hitSize = (borderWidth + hitTolerance) / 2;\n  const inRangeX = point.x >= x - hitSize - EPSILON && point.x <= x2 + hitSize + EPSILON;\n  const inRangeY = point.y >= y - hitSize - EPSILON && point.y <= y2 + hitSize + EPSILON;\n  if (axis === 'x') {\n    return inRangeX;\n  } else if (axis === 'y') {\n    return inRangeY;\n  }\n  return inRangeX && inRangeY;\n}\n\n/**\n * @param {Point} point\n * @param {rect: {x: number, y: number, x2: number, y2: number}, center: {x: number, y: number}} element\n * @param {InteractionAxis} axis\n * @param {{rotation: number, borderWidth: number, hitTolerance: number}}\n * @returns {boolean}\n */\nfunction inLabelRange(point, {rect, center}, axis, {rotation, borderWidth, hitTolerance}) {\n  const rotPoint = rotated(point, center, toRadians(-rotation));\n  return inBoxRange(rotPoint, rect, axis, {borderWidth, hitTolerance});\n}\n\n/**\n * @param {AnnotationElement} element\n * @param {boolean} useFinalPosition\n * @returns {Point}\n */\nfunction getElementCenterPoint(element, useFinalPosition) {\n  const {centerX, centerY} = element.getProps(['centerX', 'centerY'], useFinalPosition);\n  return {x: centerX, y: centerY};\n}\n\n/**\n * @param {string} pkg\n * @param {string} min\n * @param {string} ver\n * @param {boolean} [strict=true]\n * @returns {boolean}\n */\nfunction requireVersion(pkg, min, ver, strict = true) {\n  const parts = ver.split('.');\n  let i = 0;\n  for (const req of min.split('.')) {\n    const act = parts[i++];\n    if (parseInt(req, 10) < parseInt(act, 10)) {\n      break;\n    }\n    if (isOlderPart(act, req)) {\n      if (strict) {\n        throw new Error(`${pkg} v${ver} is not supported. v${min} or newer is required.`);\n      } else {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nconst isPercentString = (s) => typeof s === 'string' && s.endsWith('%');\nconst toPercent = (s) => parseFloat(s) / 100;\nconst toPositivePercent = (s) => clamp(toPercent(s), 0, 1);\n\nconst boxAppering = (x, y) => ({x, y, x2: x, y2: y, width: 0, height: 0});\nconst defaultInitAnimation = {\n  box: (properties) => boxAppering(properties.centerX, properties.centerY),\n  doughnutLabel: (properties) => boxAppering(properties.centerX, properties.centerY),\n  ellipse: (properties) => ({centerX: properties.centerX, centerY: properties.centerX, radius: 0, width: 0, height: 0}),\n  label: (properties) => boxAppering(properties.centerX, properties.centerY),\n  line: (properties) => boxAppering(properties.x, properties.y),\n  point: (properties) => ({centerX: properties.centerX, centerY: properties.centerY, radius: 0, width: 0, height: 0}),\n  polygon: (properties) => boxAppering(properties.centerX, properties.centerY)\n};\n\n/**\n * @typedef { import('chart.js').FontSpec } FontSpec\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('chart.js').Padding } Padding\n * @typedef { import('../../types/element').AnnotationBoxModel } AnnotationBoxModel\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n * @typedef { import('../../types/options').AnnotationPointCoordinates } AnnotationPointCoordinates\n * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions\n * @typedef { import('../../types/label').LabelPositionObject } LabelPositionObject\n */\n\n/**\n * @param {number} size\n * @param {number|string} position\n * @returns {number}\n */\nfunction getRelativePosition(size, position) {\n  if (position === 'start') {\n    return 0;\n  }\n  if (position === 'end') {\n    return size;\n  }\n  if (isPercentString(position)) {\n    return toPositivePercent(position) * size;\n  }\n  return size / 2;\n}\n\n/**\n * @param {number} size\n * @param {number|string} value\n * @param {boolean} [positivePercent=true]\n * @returns {number}\n */\nfunction getSize(size, value, positivePercent = true) {\n  if (typeof value === 'number') {\n    return value;\n  } else if (isPercentString(value)) {\n    return (positivePercent ? toPositivePercent(value) : toPercent(value)) * size;\n  }\n  return size;\n}\n\n/**\n * @param {{x: number, width: number}} size\n * @param {CoreLabelOptions} options\n * @returns {number}\n */\nfunction calculateTextAlignment(size, options) {\n  const {x, width} = size;\n  const textAlign = options.textAlign;\n  if (textAlign === 'center') {\n    return x + width / 2;\n  } else if (textAlign === 'end' || textAlign === 'right') {\n    return x + width;\n  }\n  return x;\n}\n\n/**\n * @param {Point} point\n * @param {{height: number, width: number}} labelSize\n * @param {{borderWidth: number, position: {LabelPositionObject|string}, xAdjust: number, yAdjust: number}} options\n * @param {Padding|undefined} padding\n * @returns {{x: number, y: number, x2: number, y2: number, height: number, width: number, centerX: number, centerY: number}}\n */\nfunction measureLabelRectangle(point, labelSize, {borderWidth, position, xAdjust, yAdjust}, padding) {\n  const hasPadding = isObject(padding);\n  const width = labelSize.width + (hasPadding ? padding.width : 0) + borderWidth;\n  const height = labelSize.height + (hasPadding ? padding.height : 0) + borderWidth;\n  const positionObj = toPosition(position);\n  const x = calculateLabelPosition$1(point.x, width, xAdjust, positionObj.x);\n  const y = calculateLabelPosition$1(point.y, height, yAdjust, positionObj.y);\n\n  return {\n    x,\n    y,\n    x2: x + width,\n    y2: y + height,\n    width,\n    height,\n    centerX: x + width / 2,\n    centerY: y + height / 2\n  };\n}\n\n/**\n * @param {LabelPositionObject|string} value\n * @param {string|number} defaultValue\n * @returns {LabelPositionObject}\n */\nfunction toPosition(value, defaultValue = 'center') {\n  if (isObject(value)) {\n    return {\n      x: valueOrDefault(value.x, defaultValue),\n      y: valueOrDefault(value.y, defaultValue),\n    };\n  }\n  value = valueOrDefault(value, defaultValue);\n  return {\n    x: value,\n    y: value\n  };\n}\n\n/**\n * @param {CoreLabelOptions} options\n * @param {number} fitRatio\n * @returns {boolean}\n */\nconst shouldFit = (options, fitRatio) => options && options.autoFit && fitRatio < 1;\n\n/**\n * @param {CoreLabelOptions} options\n * @param {number} fitRatio\n * @returns {FontSpec[]}\n */\nfunction toFonts(options, fitRatio) {\n  const optFont = options.font;\n  const fonts = isArray(optFont) ? optFont : [optFont];\n  if (shouldFit(options, fitRatio)) {\n    return fonts.map(function(f) {\n      const font = toFont(f);\n      font.size = Math.floor(f.size * fitRatio);\n      font.lineHeight = f.lineHeight;\n      return toFont(font);\n    });\n  }\n  return fonts.map(f => toFont(f));\n}\n\n/**\n * @param {AnnotationPointCoordinates} options\n * @returns {boolean}\n */\nfunction isBoundToPoint(options) {\n  return options && (defined(options.xValue) || defined(options.yValue));\n}\n\nfunction calculateLabelPosition$1(start, size, adjust = 0, position) {\n  return start - getRelativePosition(size, position) + adjust;\n}\n\n/**\n * @param {Chart} chart\n * @param {AnnotationBoxModel} properties\n * @param {CoreAnnotationOptions} options\n * @returns {AnnotationElement}\n */\nfunction initAnimationProperties(chart, properties, options) {\n  const initAnim = options.init;\n  if (!initAnim) {\n    return;\n  } else if (initAnim === true) {\n    return applyDefault(properties, options);\n  }\n  return execCallback(chart, properties, options);\n}\n\n/**\n * @param {Object} options\n * @param {Array} hooks\n * @param {Object} hooksContainer\n * @returns {boolean}\n */\nfunction loadHooks(options, hooks, hooksContainer) {\n  let activated = false;\n  hooks.forEach(hook => {\n    if (isFunction(options[hook])) {\n      activated = true;\n      hooksContainer[hook] = options[hook];\n    } else if (defined(hooksContainer[hook])) {\n      delete hooksContainer[hook];\n    }\n  });\n  return activated;\n}\n\nfunction applyDefault(properties, options) {\n  const type = options.type || 'line';\n  return defaultInitAnimation[type](properties);\n}\n\nfunction execCallback(chart, properties, options) {\n  const result = callback(options.init, [{chart, properties, options}]);\n  if (result === true) {\n    return applyDefault(properties, options);\n  } else if (isObject(result)) {\n    return result;\n  }\n}\n\nconst widthCache = new Map();\nconst notRadius = (radius) => isNaN(radius) || radius <= 0;\nconst fontsKey = (fonts) => fonts.reduce(function(prev, item) {\n  prev += item.string;\n  return prev;\n}, '');\n\n/**\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n */\n\n/**\n * Determine if content is an image or a canvas.\n * @param {*} content\n * @returns boolean|undefined\n * @todo move this function to chart.js helpers\n */\nfunction isImageOrCanvas(content) {\n  if (content && typeof content === 'object') {\n    const type = content.toString();\n    return (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]');\n  }\n}\n\n/**\n * Set the translation on the canvas if the rotation must be applied.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Point} point - the point of translation\n * @param {number} rotation - rotation (in degrees) to apply\n */\nfunction translate(ctx, {x, y}, rotation) {\n  if (rotation) {\n    ctx.translate(x, y);\n    ctx.rotate(toRadians(rotation));\n    ctx.translate(-x, -y);\n  }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {Object} options\n * @returns {boolean|undefined}\n */\nfunction setBorderStyle(ctx, options) {\n  if (options && options.borderWidth) {\n    ctx.lineCap = options.borderCapStyle || 'butt';\n    ctx.setLineDash(options.borderDash);\n    ctx.lineDashOffset = options.borderDashOffset;\n    ctx.lineJoin = options.borderJoinStyle || 'miter';\n    ctx.lineWidth = options.borderWidth;\n    ctx.strokeStyle = options.borderColor;\n    return true;\n  }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {Object} options\n */\nfunction setShadowStyle(ctx, options) {\n  ctx.shadowColor = options.backgroundShadowColor;\n  ctx.shadowBlur = options.shadowBlur;\n  ctx.shadowOffsetX = options.shadowOffsetX;\n  ctx.shadowOffsetY = options.shadowOffsetY;\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {CoreLabelOptions} options\n * @returns {{width: number, height: number}}\n */\nfunction measureLabelSize(ctx, options) {\n  const content = options.content;\n  if (isImageOrCanvas(content)) {\n    const size = {\n      width: getSize(content.width, options.width),\n      height: getSize(content.height, options.height)\n    };\n    return size;\n  }\n  const fonts = toFonts(options);\n  const strokeWidth = options.textStrokeWidth;\n  const lines = isArray(content) ? content : [content];\n  const mapKey = lines.join() + fontsKey(fonts) + strokeWidth + (ctx._measureText ? '-spriting' : '');\n  if (!widthCache.has(mapKey)) {\n    widthCache.set(mapKey, calculateLabelSize(ctx, lines, fonts, strokeWidth));\n  }\n  return widthCache.get(mapKey);\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @param {Object} options\n */\nfunction drawBox(ctx, rect, options) {\n  const {x, y, width, height} = rect;\n  ctx.save();\n  setShadowStyle(ctx, options);\n  const stroke = setBorderStyle(ctx, options);\n  ctx.fillStyle = options.backgroundColor;\n  ctx.beginPath();\n  addRoundedRectPath(ctx, {\n    x, y, w: width, h: height,\n    radius: clampAll(toTRBLCorners(options.borderRadius), 0, Math.min(width, height) / 2)\n  });\n  ctx.closePath();\n  ctx.fill();\n  if (stroke) {\n    ctx.shadowColor = options.borderShadowColor;\n    ctx.stroke();\n  }\n  ctx.restore();\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @param {CoreLabelOptions} options\n * @param {number} fitRatio\n */\nfunction drawLabel(ctx, rect, options, fitRatio) {\n  const content = options.content;\n  if (isImageOrCanvas(content)) {\n    ctx.save();\n    ctx.globalAlpha = getOpacity(options.opacity, content.style.opacity);\n    ctx.drawImage(content, rect.x, rect.y, rect.width, rect.height);\n    ctx.restore();\n    return;\n  }\n  const labels = isArray(content) ? content : [content];\n  const fonts = toFonts(options, fitRatio);\n  const optColor = options.color;\n  const colors = isArray(optColor) ? optColor : [optColor];\n  const x = calculateTextAlignment(rect, options);\n  const y = rect.y + options.textStrokeWidth / 2;\n  ctx.save();\n  ctx.textBaseline = 'middle';\n  ctx.textAlign = options.textAlign;\n  if (setTextStrokeStyle(ctx, options)) {\n    applyLabelDecoration(ctx, {x, y}, labels, fonts);\n  }\n  applyLabelContent(ctx, {x, y}, labels, {fonts, colors});\n  ctx.restore();\n}\n\nfunction setTextStrokeStyle(ctx, options) {\n  if (options.textStrokeWidth > 0) {\n    // https://stackoverflow.com/questions/13627111/drawing-text-with-an-outer-stroke-with-html5s-canvas\n    ctx.lineJoin = 'round';\n    ctx.miterLimit = 2;\n    ctx.lineWidth = options.textStrokeWidth;\n    ctx.strokeStyle = options.textStrokeColor;\n    return true;\n  }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{radius: number, options: PointAnnotationOptions}} element\n * @param {number} x\n * @param {number} y\n */\nfunction drawPoint(ctx, element, x, y) {\n  const {radius, options} = element;\n  const style = options.pointStyle;\n  const rotation = options.rotation;\n  let rad = (rotation || 0) * RAD_PER_DEG;\n\n  if (isImageOrCanvas(style)) {\n    ctx.save();\n    ctx.translate(x, y);\n    ctx.rotate(rad);\n    ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n    ctx.restore();\n    return;\n  }\n  if (notRadius(radius)) {\n    return;\n  }\n  drawPointStyle(ctx, {x, y, radius, rotation, style, rad});\n}\n\nfunction drawPointStyle(ctx, {x, y, radius, rotation, style, rad}) {\n  let xOffset, yOffset, size, cornerRadius;\n  ctx.beginPath();\n\n  switch (style) {\n  // Default includes circle\n  default:\n    ctx.arc(x, y, radius, 0, TAU);\n    ctx.closePath();\n    break;\n  case 'triangle':\n    ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    rad += TWO_THIRDS_PI;\n    ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    rad += TWO_THIRDS_PI;\n    ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    ctx.closePath();\n    break;\n  case 'rectRounded':\n    // NOTE: the rounded rect implementation changed to use `arc` instead of\n    // `quadraticCurveTo` since it generates better results when rect is\n    // almost a circle. 0.516 (instead of 0.5) produces results with visually\n    // closer proportion to the previous impl and it is inscribed in the\n    // circle with `radius`. For more details, see the following PRs:\n    // https://github.com/chartjs/Chart.js/issues/5597\n    // https://github.com/chartjs/Chart.js/issues/5858\n    cornerRadius = radius * 0.516;\n    size = radius - cornerRadius;\n    xOffset = Math.cos(rad + QUARTER_PI) * size;\n    yOffset = Math.sin(rad + QUARTER_PI) * size;\n    ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n    ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n    ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n    ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n    ctx.closePath();\n    break;\n  case 'rect':\n    if (!rotation) {\n      size = Math.SQRT1_2 * radius;\n      ctx.rect(x - size, y - size, 2 * size, 2 * size);\n      break;\n    }\n    rad += QUARTER_PI;\n    /* falls through */\n  case 'rectRot':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    ctx.closePath();\n    break;\n  case 'crossRot':\n    rad += QUARTER_PI;\n    /* falls through */\n  case 'cross':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    break;\n  case 'star':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    rad += QUARTER_PI;\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    break;\n  case 'line':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    break;\n  case 'dash':\n    ctx.moveTo(x, y);\n    ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n    break;\n  }\n\n  ctx.fill();\n}\n\nfunction calculateLabelSize(ctx, lines, fonts, strokeWidth) {\n  ctx.save();\n  const count = lines.length;\n  let width = 0;\n  let height = strokeWidth;\n  for (let i = 0; i < count; i++) {\n    const font = fonts[Math.min(i, fonts.length - 1)];\n    ctx.font = font.string;\n    const text = lines[i];\n    width = Math.max(width, ctx.measureText(text).width + strokeWidth);\n    height += font.lineHeight;\n  }\n  ctx.restore();\n  return {width, height};\n}\n\nfunction applyLabelDecoration(ctx, {x, y}, labels, fonts) {\n  ctx.beginPath();\n  let lhs = 0;\n  labels.forEach(function(l, i) {\n    const f = fonts[Math.min(i, fonts.length - 1)];\n    const lh = f.lineHeight;\n    ctx.font = f.string;\n    ctx.strokeText(l, x, y + lh / 2 + lhs);\n    lhs += lh;\n  });\n  ctx.stroke();\n}\n\nfunction applyLabelContent(ctx, {x, y}, labels, {fonts, colors}) {\n  let lhs = 0;\n  labels.forEach(function(l, i) {\n    const c = colors[Math.min(i, colors.length - 1)];\n    const f = fonts[Math.min(i, fonts.length - 1)];\n    const lh = f.lineHeight;\n    ctx.beginPath();\n    ctx.font = f.string;\n    ctx.fillStyle = c;\n    ctx.fillText(l, x, y + lh / 2 + lhs);\n    lhs += lh;\n    ctx.fill();\n  });\n}\n\nfunction getOpacity(value, elementValue) {\n  const opacity = isNumber(value) ? value : elementValue;\n  return isNumber(opacity) ? clamp(opacity, 0, 1) : 1;\n}\n\nconst positions = ['left', 'bottom', 'top', 'right'];\n\n/**\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\n/**\n * Drawa the callout component for labels.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {AnnotationElement} element - the label element\n */\nfunction drawCallout(ctx, element) {\n  const {pointX, pointY, options} = element;\n  const callout = options.callout;\n  const calloutPosition = callout && callout.display && resolveCalloutPosition(element, callout);\n  if (!calloutPosition || isPointInRange(element, callout, calloutPosition)) {\n    return;\n  }\n\n  ctx.save();\n  ctx.beginPath();\n  const stroke = setBorderStyle(ctx, callout);\n  if (!stroke) {\n    return ctx.restore();\n  }\n  const {separatorStart, separatorEnd} = getCalloutSeparatorCoord(element, calloutPosition);\n  const {sideStart, sideEnd} = getCalloutSideCoord(element, calloutPosition, separatorStart);\n  if (callout.margin > 0 || options.borderWidth === 0) {\n    ctx.moveTo(separatorStart.x, separatorStart.y);\n    ctx.lineTo(separatorEnd.x, separatorEnd.y);\n  }\n  ctx.moveTo(sideStart.x, sideStart.y);\n  ctx.lineTo(sideEnd.x, sideEnd.y);\n  const rotatedPoint = rotated({x: pointX, y: pointY}, element.getCenterPoint(), toRadians(-element.rotation));\n  ctx.lineTo(rotatedPoint.x, rotatedPoint.y);\n  ctx.stroke();\n  ctx.restore();\n}\n\nfunction getCalloutSeparatorCoord(element, position) {\n  const {x, y, x2, y2} = element;\n  const adjust = getCalloutSeparatorAdjust(element, position);\n  let separatorStart, separatorEnd;\n  if (position === 'left' || position === 'right') {\n    separatorStart = {x: x + adjust, y};\n    separatorEnd = {x: separatorStart.x, y: y2};\n  } else {\n    //  position 'top' or 'bottom'\n    separatorStart = {x, y: y + adjust};\n    separatorEnd = {x: x2, y: separatorStart.y};\n  }\n  return {separatorStart, separatorEnd};\n}\n\nfunction getCalloutSeparatorAdjust(element, position) {\n  const {width, height, options} = element;\n  const adjust = options.callout.margin + options.borderWidth / 2;\n  if (position === 'right') {\n    return width + adjust;\n  } else if (position === 'bottom') {\n    return height + adjust;\n  }\n  return -adjust;\n}\n\nfunction getCalloutSideCoord(element, position, separatorStart) {\n  const {y, width, height, options} = element;\n  const start = options.callout.start;\n  const side = getCalloutSideAdjust(position, options.callout);\n  let sideStart, sideEnd;\n  if (position === 'left' || position === 'right') {\n    sideStart = {x: separatorStart.x, y: y + getSize(height, start)};\n    sideEnd = {x: sideStart.x + side, y: sideStart.y};\n  } else {\n    //  position 'top' or 'bottom'\n    sideStart = {x: separatorStart.x + getSize(width, start), y: separatorStart.y};\n    sideEnd = {x: sideStart.x, y: sideStart.y + side};\n  }\n  return {sideStart, sideEnd};\n}\n\nfunction getCalloutSideAdjust(position, options) {\n  const side = options.side;\n  if (position === 'left' || position === 'top') {\n    return -side;\n  }\n  return side;\n}\n\nfunction resolveCalloutPosition(element, options) {\n  const position = options.position;\n  if (positions.includes(position)) {\n    return position;\n  }\n  return resolveCalloutAutoPosition(element, options);\n}\n\nfunction resolveCalloutAutoPosition(element, options) {\n  const {x, y, x2, y2, width, height, pointX, pointY, centerX, centerY, rotation} = element;\n  const center = {x: centerX, y: centerY};\n  const start = options.start;\n  const xAdjust = getSize(width, start);\n  const yAdjust = getSize(height, start);\n  const xPoints = [x, x + xAdjust, x + xAdjust, x2];\n  const yPoints = [y + yAdjust, y2, y, y2];\n  const result = [];\n  for (let index = 0; index < 4; index++) {\n    const rotatedPoint = rotated({x: xPoints[index], y: yPoints[index]}, center, toRadians(rotation));\n    result.push({\n      position: positions[index],\n      distance: distanceBetweenPoints(rotatedPoint, {x: pointX, y: pointY})\n    });\n  }\n  return result.sort((a, b) => a.distance - b.distance)[0].position;\n}\n\nfunction isPointInRange(element, callout, position) {\n  const {pointX, pointY} = element;\n  const margin = callout.margin;\n  let x = pointX;\n  let y = pointY;\n  if (position === 'left') {\n    x += margin;\n  } else if (position === 'right') {\n    x -= margin;\n  } else if (position === 'top') {\n    y += margin;\n  } else if (position === 'bottom') {\n    y -= margin;\n  }\n  return element.inRange(x, y);\n}\n\nconst limitedLineScale = {\n  xScaleID: {min: 'xMin', max: 'xMax', start: 'left', end: 'right', startProp: 'x', endProp: 'x2'},\n  yScaleID: {min: 'yMin', max: 'yMax', start: 'bottom', end: 'top', startProp: 'y', endProp: 'y2'}\n};\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import(\"chart.js\").Point } Point\n * @typedef { import('../../types/element').AnnotationBoxModel } AnnotationBoxModel\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n * @typedef { import('../../types/options').LineAnnotationOptions } LineAnnotationOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n * @typedef { import('../../types/options').PolygonAnnotationOptions } PolygonAnnotationOptions\n */\n\n/**\n * @param {Scale} scale\n * @param {number|string} value\n * @param {number} fallback\n * @returns {number}\n */\nfunction scaleValue(scale, value, fallback) {\n  value = typeof value === 'number' ? value : scale.parse(value);\n  return isFinite(value) ? scale.getPixelForValue(value) : fallback;\n}\n\n/**\n * Search the scale defined in chartjs by the axis related to the annotation options key.\n * @param {{ [key: string]: Scale }} scales\n * @param {CoreAnnotationOptions} options\n * @param {string} key\n * @returns {string}\n */\nfunction retrieveScaleID(scales, options, key) {\n  const scaleID = options[key];\n  if (scaleID || key === 'scaleID') {\n    return scaleID;\n  }\n  const axis = key.charAt(0);\n  const axes = Object.values(scales).filter((scale) => scale.axis && scale.axis === axis);\n  if (axes.length) {\n    return axes[0].id;\n  }\n  return axis;\n}\n\n/**\n * @param {Scale} scale\n * @param {{min: number, max: number, start: number, end: number}} options\n * @returns {{start: number, end: number}|undefined}\n */\nfunction getDimensionByScale(scale, options) {\n  if (scale) {\n    const reverse = scale.options.reverse;\n    const start = scaleValue(scale, options.min, reverse ? options.end : options.start);\n    const end = scaleValue(scale, options.max, reverse ? options.start : options.end);\n    return {\n      start,\n      end\n    };\n  }\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {Point}\n */\nfunction getChartPoint(chart, options) {\n  const {chartArea, scales} = chart;\n  const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')];\n  const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')];\n  let x = chartArea.width / 2;\n  let y = chartArea.height / 2;\n\n  if (xScale) {\n    x = scaleValue(xScale, options.xValue, xScale.left + xScale.width / 2);\n  }\n\n  if (yScale) {\n    y = scaleValue(yScale, options.yValue, yScale.top + yScale.height / 2);\n  }\n  return {x, y};\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolveBoxProperties(chart, options) {\n  const scales = chart.scales;\n  const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')];\n  const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')];\n\n  if (!xScale && !yScale) {\n    return {};\n  }\n\n  let {left: x, right: x2} = xScale || chart.chartArea;\n  let {top: y, bottom: y2} = yScale || chart.chartArea;\n  const xDim = getChartDimensionByScale(xScale, {min: options.xMin, max: options.xMax, start: x, end: x2});\n  x = xDim.start;\n  x2 = xDim.end;\n  const yDim = getChartDimensionByScale(yScale, {min: options.yMin, max: options.yMax, start: y2, end: y});\n  y = yDim.start;\n  y2 = yDim.end;\n\n  return {\n    x,\n    y,\n    x2,\n    y2,\n    width: x2 - x,\n    height: y2 - y,\n    centerX: x + (x2 - x) / 2,\n    centerY: y + (y2 - y) / 2\n  };\n}\n\n/**\n * @param {Chart} chart\n * @param {PointAnnotationOptions|PolygonAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolvePointProperties(chart, options) {\n  if (!isBoundToPoint(options)) {\n    const box = resolveBoxProperties(chart, options);\n    let radius = options.radius;\n    if (!radius || isNaN(radius)) {\n      radius = Math.min(box.width, box.height) / 2;\n      options.radius = radius;\n    }\n    const size = radius * 2;\n    const adjustCenterX = box.centerX + options.xAdjust;\n    const adjustCenterY = box.centerY + options.yAdjust;\n    return {\n      x: adjustCenterX - radius,\n      y: adjustCenterY - radius,\n      x2: adjustCenterX + radius,\n      y2: adjustCenterY + radius,\n      centerX: adjustCenterX,\n      centerY: adjustCenterY,\n      width: size,\n      height: size,\n      radius\n    };\n  }\n  return getChartCircle(chart, options);\n}\n/**\n * @param {Chart} chart\n * @param {LineAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolveLineProperties(chart, options) {\n  const {scales, chartArea} = chart;\n  const scale = scales[options.scaleID];\n  const area = {x: chartArea.left, y: chartArea.top, x2: chartArea.right, y2: chartArea.bottom};\n\n  if (scale) {\n    resolveFullLineProperties(scale, area, options);\n  } else {\n    resolveLimitedLineProperties(scales, area, options);\n  }\n  return area;\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @param {boolean} [centerBased=false]\n * @returns {AnnotationBoxModel}\n */\nfunction resolveBoxAndLabelProperties(chart, options) {\n  const properties = resolveBoxProperties(chart, options);\n  properties.initProperties = initAnimationProperties(chart, properties, options);\n  properties.elements = [{\n    type: 'label',\n    optionScope: 'label',\n    properties: resolveLabelElementProperties$1(chart, properties, options),\n    initProperties: properties.initProperties\n  }];\n  return properties;\n}\n\nfunction getChartCircle(chart, options) {\n  const point = getChartPoint(chart, options);\n  const size = options.radius * 2;\n  return {\n    x: point.x - options.radius + options.xAdjust,\n    y: point.y - options.radius + options.yAdjust,\n    x2: point.x + options.radius + options.xAdjust,\n    y2: point.y + options.radius + options.yAdjust,\n    centerX: point.x + options.xAdjust,\n    centerY: point.y + options.yAdjust,\n    radius: options.radius,\n    width: size,\n    height: size\n  };\n}\n\nfunction getChartDimensionByScale(scale, options) {\n  const result = getDimensionByScale(scale, options) || options;\n  return {\n    start: Math.min(result.start, result.end),\n    end: Math.max(result.start, result.end)\n  };\n}\n\nfunction resolveFullLineProperties(scale, area, options) {\n  const min = scaleValue(scale, options.value, NaN);\n  const max = scaleValue(scale, options.endValue, min);\n  if (scale.isHorizontal()) {\n    area.x = min;\n    area.x2 = max;\n  } else {\n    area.y = min;\n    area.y2 = max;\n  }\n}\n\nfunction resolveLimitedLineProperties(scales, area, options) {\n  for (const scaleId of Object.keys(limitedLineScale)) {\n    const scale = scales[retrieveScaleID(scales, options, scaleId)];\n    if (scale) {\n      const {min, max, start, end, startProp, endProp} = limitedLineScale[scaleId];\n      const dim = getDimensionByScale(scale, {min: options[min], max: options[max], start: scale[start], end: scale[end]});\n      area[startProp] = dim.start;\n      area[endProp] = dim.end;\n    }\n  }\n}\n\nfunction calculateX({properties, options}, labelSize, position, padding) {\n  const {x: start, x2: end, width: size} = properties;\n  return calculatePosition({start, end, size, borderWidth: options.borderWidth}, {\n    position: position.x,\n    padding: {start: padding.left, end: padding.right},\n    adjust: options.label.xAdjust,\n    size: labelSize.width\n  });\n}\n\nfunction calculateY({properties, options}, labelSize, position, padding) {\n  const {y: start, y2: end, height: size} = properties;\n  return calculatePosition({start, end, size, borderWidth: options.borderWidth}, {\n    position: position.y,\n    padding: {start: padding.top, end: padding.bottom},\n    adjust: options.label.yAdjust,\n    size: labelSize.height\n  });\n}\n\nfunction calculatePosition(boxOpts, labelOpts) {\n  const {start, end, borderWidth} = boxOpts;\n  const {position, padding: {start: padStart, end: padEnd}, adjust} = labelOpts;\n  const availableSize = end - borderWidth - start - padStart - padEnd - labelOpts.size;\n  return start + borderWidth / 2 + adjust + getRelativePosition(availableSize, position);\n}\n\nfunction resolveLabelElementProperties$1(chart, properties, options) {\n  const label = options.label;\n  label.backgroundColor = 'transparent';\n  label.callout.display = false;\n  const position = toPosition(label.position);\n  const padding = toPadding(label.padding);\n  const labelSize = measureLabelSize(chart.ctx, label);\n  const x = calculateX({properties, options}, labelSize, position, padding);\n  const y = calculateY({properties, options}, labelSize, position, padding);\n  const width = labelSize.width + padding.width;\n  const height = labelSize.height + padding.height;\n  return {\n    x,\n    y,\n    x2: x + width,\n    y2: y + height,\n    width,\n    height,\n    centerX: x + width / 2,\n    centerY: y + height / 2,\n    rotation: label.rotation\n  };\n\n}\n\nconst moveHooks = ['enter', 'leave'];\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n */\n\nconst eventHooks = moveHooks.concat('click');\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n */\nfunction updateListeners(chart, state, options) {\n  state.listened = loadHooks(options, eventHooks, state.listeners);\n  state.moveListened = false;\n\n  moveHooks.forEach(hook => {\n    if (isFunction(options[hook])) {\n      state.moveListened = true;\n    }\n  });\n\n  if (!state.listened || !state.moveListened) {\n    state.annotations.forEach(scope => {\n      if (!state.listened && isFunction(scope.click)) {\n        state.listened = true;\n      }\n      if (!state.moveListened) {\n        moveHooks.forEach(hook => {\n          if (isFunction(scope[hook])) {\n            state.listened = true;\n            state.moveListened = true;\n          }\n        });\n      }\n    });\n  }\n}\n\n/**\n * @param {Object} state\n * @param {ChartEvent} event\n * @param {AnnotationPluginOptions} options\n * @return {boolean|undefined}\n */\nfunction handleEvent(state, event, options) {\n  if (state.listened) {\n    switch (event.type) {\n    case 'mousemove':\n    case 'mouseout':\n      return handleMoveEvents(state, event, options);\n    case 'click':\n      return handleClickEvents(state, event, options);\n    }\n  }\n}\n\nfunction handleMoveEvents(state, event, options) {\n  if (!state.moveListened) {\n    return;\n  }\n\n  let elements;\n\n  if (event.type === 'mousemove') {\n    elements = getElements(state.visibleElements, event, options.interaction);\n  } else {\n    elements = [];\n  }\n\n  const previous = state.hovered;\n  state.hovered = elements;\n\n  const context = {state, event};\n  let changed = dispatchMoveEvents(context, 'leave', previous, elements);\n  return dispatchMoveEvents(context, 'enter', elements, previous) || changed;\n}\n\nfunction dispatchMoveEvents({state, event}, hook, elements, checkElements) {\n  let changed;\n  for (const element of elements) {\n    if (checkElements.indexOf(element) < 0) {\n      changed = dispatchEvent(element.options[hook] || state.listeners[hook], element, event) || changed;\n    }\n  }\n  return changed;\n}\n\nfunction handleClickEvents(state, event, options) {\n  const listeners = state.listeners;\n  const elements = getElements(state.visibleElements, event, options.interaction);\n  let changed;\n  for (const element of elements) {\n    changed = dispatchEvent(element.options.click || listeners.click, element, event) || changed;\n  }\n  return changed;\n}\n\nfunction dispatchEvent(handler, element, event) {\n  return callback(handler, [element.$context, event]) === true;\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst elementHooks = ['afterDraw', 'beforeDraw'];\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n */\nfunction updateHooks(chart, state, options) {\n  const visibleElements = state.visibleElements;\n  state.hooked = loadHooks(options, elementHooks, state.hooks);\n\n  if (!state.hooked) {\n    visibleElements.forEach(scope => {\n      if (!state.hooked) {\n        elementHooks.forEach(hook => {\n          if (isFunction(scope.options[hook])) {\n            state.hooked = true;\n          }\n        });\n      }\n    });\n  }\n}\n\n/**\n * @param {Object} state\n * @param {AnnotationElement} element\n * @param {string} hook\n */\nfunction invokeHook(state, element, hook) {\n  if (state.hooked) {\n    const callbackHook = element.options[hook] || state.hooks[hook];\n    return callback(callbackHook, [element.$context]);\n  }\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n */\n\n/**\n * @param {Chart} chart\n * @param {Scale} scale\n * @param {CoreAnnotationOptions[]} annotations\n */\nfunction adjustScaleRange(chart, scale, annotations) {\n  const range = getScaleLimits(chart.scales, scale, annotations);\n  let changed = changeScaleLimit(scale, range, 'min', 'suggestedMin');\n  changed = changeScaleLimit(scale, range, 'max', 'suggestedMax') || changed;\n  if (changed && isFunction(scale.handleTickRangeOptions)) {\n    scale.handleTickRangeOptions();\n  }\n}\n\n/**\n * @param {CoreAnnotationOptions[]} annotations\n * @param {{ [key: string]: Scale }} scales\n */\nfunction verifyScaleOptions(annotations, scales) {\n  for (const annotation of annotations) {\n    verifyScaleIDs(annotation, scales);\n  }\n}\n\nfunction changeScaleLimit(scale, range, limit, suggestedLimit) {\n  if (isFinite(range[limit]) && !scaleLimitDefined(scale.options, limit, suggestedLimit)) {\n    const changed = scale[limit] !== range[limit];\n    scale[limit] = range[limit];\n    return changed;\n  }\n}\n\nfunction scaleLimitDefined(scaleOptions, limit, suggestedLimit) {\n  return defined(scaleOptions[limit]) || defined(scaleOptions[suggestedLimit]);\n}\n\nfunction verifyScaleIDs(annotation, scales) {\n  for (const key of ['scaleID', 'xScaleID', 'yScaleID']) {\n    const scaleID = retrieveScaleID(scales, annotation, key);\n    if (scaleID && !scales[scaleID] && verifyProperties(annotation, key)) {\n      console.warn(`No scale found with id '${scaleID}' for annotation '${annotation.id}'`);\n    }\n  }\n}\n\nfunction verifyProperties(annotation, key) {\n  if (key === 'scaleID') {\n    return true;\n  }\n  const axis = key.charAt(0);\n  for (const prop of ['Min', 'Max', 'Value']) {\n    if (defined(annotation[axis + prop])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction getScaleLimits(scales, scale, annotations) {\n  const axis = scale.axis;\n  const scaleID = scale.id;\n  const scaleIDOption = axis + 'ScaleID';\n  const limits = {\n    min: valueOrDefault(scale.min, Number.NEGATIVE_INFINITY),\n    max: valueOrDefault(scale.max, Number.POSITIVE_INFINITY)\n  };\n  for (const annotation of annotations) {\n    if (annotation.scaleID === scaleID) {\n      updateLimits(annotation, scale, ['value', 'endValue'], limits);\n    } else if (retrieveScaleID(scales, annotation, scaleIDOption) === scaleID) {\n      updateLimits(annotation, scale, [axis + 'Min', axis + 'Max', axis + 'Value'], limits);\n    }\n  }\n  return limits;\n}\n\nfunction updateLimits(annotation, scale, props, limits) {\n  for (const prop of props) {\n    const raw = annotation[prop];\n    if (defined(raw)) {\n      const value = scale.parse(raw);\n      limits.min = Math.min(limits.min, value);\n      limits.max = Math.max(limits.max, value);\n    }\n  }\n}\n\nclass BoxAnnotation extends Element {\n\n  inRange(mouseX, mouseY, axis, useFinalPosition) {\n    const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n    return inBoxRange({x, y}, this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis, this.options);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    ctx.save();\n    translate(ctx, this.getCenterPoint(), this.options.rotation);\n    drawBox(ctx, this, this.options);\n    ctx.restore();\n  }\n\n  get label() {\n    return this.elements && this.elements[0];\n  }\n\n  resolveElementProperties(chart, options) {\n    return resolveBoxAndLabelProperties(chart, options);\n  }\n}\n\nBoxAnnotation.id = 'boxAnnotation';\n\nBoxAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderRadius: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  init: undefined,\n  hitTolerance: 0,\n  label: {\n    backgroundColor: 'transparent',\n    borderWidth: 0,\n    callout: {\n      display: false\n    },\n    color: 'black',\n    content: null,\n    display: false,\n    drawTime: undefined,\n    font: {\n      family: undefined,\n      lineHeight: undefined,\n      size: undefined,\n      style: undefined,\n      weight: 'bold'\n    },\n    height: undefined,\n    hitTolerance: undefined,\n    opacity: undefined,\n    padding: 6,\n    position: 'center',\n    rotation: undefined,\n    textAlign: 'start',\n    textStrokeColor: undefined,\n    textStrokeWidth: 0,\n    width: undefined,\n    xAdjust: 0,\n    yAdjust: 0,\n    z: undefined\n  },\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: undefined,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: undefined,\n  z: 0\n};\n\nBoxAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nBoxAnnotation.descriptors = {\n  label: {\n    _fallback: true\n  }\n};\n\nclass DoughnutLabelAnnotation extends Element {\n\n  inRange(mouseX, mouseY, axis, useFinalPosition) {\n    return inLabelRange(\n      {x: mouseX, y: mouseY},\n      {rect: this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), center: this.getCenterPoint(useFinalPosition)},\n      axis,\n      {rotation: this.rotation, borderWidth: 0, hitTolerance: this.options.hitTolerance}\n    );\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const options = this.options;\n    if (!options.display || !options.content) {\n      return;\n    }\n    drawBackground(ctx, this);\n    ctx.save();\n    translate(ctx, this.getCenterPoint(), this.rotation);\n    drawLabel(ctx, this, options, this._fitRatio);\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    const meta = getDatasetMeta(chart, options);\n    if (!meta) {\n      return {};\n    }\n    const {controllerMeta, point, radius} = getControllerMeta(chart, options, meta);\n    let labelSize = measureLabelSize(chart.ctx, options);\n    const _fitRatio = getFitRatio(labelSize, radius);\n    if (shouldFit(options, _fitRatio)) {\n      labelSize = {width: labelSize.width * _fitRatio, height: labelSize.height * _fitRatio};\n    }\n    const {position, xAdjust, yAdjust} = options;\n    const boxSize = measureLabelRectangle(point, labelSize, {borderWidth: 0, position, xAdjust, yAdjust});\n    return {\n      initProperties: initAnimationProperties(chart, boxSize, options),\n      ...boxSize,\n      ...controllerMeta,\n      rotation: options.rotation,\n      _fitRatio\n    };\n  }\n}\n\nDoughnutLabelAnnotation.id = 'doughnutLabelAnnotation';\n\nDoughnutLabelAnnotation.defaults = {\n  autoFit: true,\n  autoHide: true,\n  backgroundColor: 'transparent',\n  backgroundShadowColor: 'transparent',\n  borderColor: 'transparent',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderShadowColor: 'transparent',\n  borderWidth: 0,\n  color: 'black',\n  content: null,\n  display: true,\n  font: {\n    family: undefined,\n    lineHeight: undefined,\n    size: undefined,\n    style: undefined,\n    weight: undefined\n  },\n  height: undefined,\n  hitTolerance: 0,\n  init: undefined,\n  opacity: undefined,\n  position: 'center',\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  spacing: 1,\n  textAlign: 'center',\n  textStrokeColor: undefined,\n  textStrokeWidth: 0,\n  width: undefined,\n  xAdjust: 0,\n  yAdjust: 0\n};\n\nDoughnutLabelAnnotation.defaultRoutes = {\n};\n\nfunction getDatasetMeta(chart, options) {\n  return chart.getSortedVisibleDatasetMetas().reduce(function(result, value) {\n    const controller = value.controller;\n    if (controller instanceof DoughnutController &&\n      isControllerVisible(chart, options, value.data) &&\n      (!result || controller.innerRadius < result.controller.innerRadius) &&\n      controller.options.circumference >= 90) {\n      return value;\n    }\n    return result;\n  }, undefined);\n}\n\nfunction isControllerVisible(chart, options, elements) {\n  if (!options.autoHide) {\n    return true;\n  }\n  for (let i = 0; i < elements.length; i++) {\n    if (!elements[i].hidden && chart.getDataVisibility(i)) {\n      return true;\n    }\n  }\n}\n\nfunction getControllerMeta({chartArea}, options, meta) {\n  const {left, top, right, bottom} = chartArea;\n  const {innerRadius, offsetX, offsetY} = meta.controller;\n  const x = (left + right) / 2 + offsetX;\n  const y = (top + bottom) / 2 + offsetY;\n  const square = {\n    left: Math.max(x - innerRadius, left),\n    right: Math.min(x + innerRadius, right),\n    top: Math.max(y - innerRadius, top),\n    bottom: Math.min(y + innerRadius, bottom)\n  };\n  const point = {\n    x: (square.left + square.right) / 2,\n    y: (square.top + square.bottom) / 2\n  };\n  const space = options.spacing + options.borderWidth / 2;\n  const _radius = innerRadius - space;\n  const _counterclockwise = point.y > y;\n  const side = _counterclockwise ? top + space : bottom - space;\n  const angles = getAngles(side, x, y, _radius);\n  const controllerMeta = {\n    _centerX: x,\n    _centerY: y,\n    _radius,\n    _counterclockwise,\n    ...angles\n  };\n  return {\n    controllerMeta,\n    point,\n    radius: Math.min(innerRadius, Math.min(square.right - square.left, square.bottom - square.top) / 2)\n  };\n}\n\nfunction getFitRatio({width, height}, radius) {\n  const hypo = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));\n  return (radius * 2) / hypo;\n}\n\nfunction getAngles(y, centerX, centerY, radius) {\n  const yk2 = Math.pow(centerY - y, 2);\n  const r2 = Math.pow(radius, 2);\n  const b = centerX * -2;\n  const c = Math.pow(centerX, 2) + yk2 - r2;\n  const delta = Math.pow(b, 2) - (4 * c);\n  if (delta <= 0) {\n    return {\n      _startAngle: 0,\n      _endAngle: TAU\n    };\n  }\n  const start = (-b - Math.sqrt(delta)) / 2;\n  const end = (-b + Math.sqrt(delta)) / 2;\n  return {\n    _startAngle: getAngleFromPoint({x: centerX, y: centerY}, {x: start, y}).angle,\n    _endAngle: getAngleFromPoint({x: centerX, y: centerY}, {x: end, y}).angle\n  };\n}\n\nfunction drawBackground(ctx, element) {\n  const {_centerX, _centerY, _radius, _startAngle, _endAngle, _counterclockwise, options} = element;\n  ctx.save();\n  const stroke = setBorderStyle(ctx, options);\n  ctx.fillStyle = options.backgroundColor;\n  ctx.beginPath();\n  ctx.arc(_centerX, _centerY, _radius, _startAngle, _endAngle, _counterclockwise);\n  ctx.closePath();\n  ctx.fill();\n  if (stroke) {\n    ctx.stroke();\n  }\n  ctx.restore();\n}\n\nclass LabelAnnotation extends Element {\n\n  inRange(mouseX, mouseY, axis, useFinalPosition) {\n    return inLabelRange(\n      {x: mouseX, y: mouseY},\n      {rect: this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), center: this.getCenterPoint(useFinalPosition)},\n      axis,\n      {rotation: this.rotation, borderWidth: this.options.borderWidth, hitTolerance: this.options.hitTolerance}\n    );\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const options = this.options;\n    const visible = !defined(this._visible) || this._visible;\n    if (!options.display || !options.content || !visible) {\n      return;\n    }\n    ctx.save();\n    translate(ctx, this.getCenterPoint(), this.rotation);\n    drawCallout(ctx, this);\n    drawBox(ctx, this, options);\n    drawLabel(ctx, getLabelSize(this), options);\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    let point;\n    if (!isBoundToPoint(options)) {\n      const {centerX, centerY} = resolveBoxProperties(chart, options);\n      point = {x: centerX, y: centerY};\n    } else {\n      point = getChartPoint(chart, options);\n    }\n    const padding = toPadding(options.padding);\n    const labelSize = measureLabelSize(chart.ctx, options);\n    const boxSize = measureLabelRectangle(point, labelSize, options, padding);\n    return {\n      initProperties: initAnimationProperties(chart, boxSize, options),\n      pointX: point.x,\n      pointY: point.y,\n      ...boxSize,\n      rotation: options.rotation\n    };\n  }\n}\n\nLabelAnnotation.id = 'labelAnnotation';\n\nLabelAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundColor: 'transparent',\n  backgroundShadowColor: 'transparent',\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderRadius: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 0,\n  callout: {\n    borderCapStyle: 'butt',\n    borderColor: undefined,\n    borderDash: [],\n    borderDashOffset: 0,\n    borderJoinStyle: 'miter',\n    borderWidth: 1,\n    display: false,\n    margin: 5,\n    position: 'auto',\n    side: 5,\n    start: '50%',\n  },\n  color: 'black',\n  content: null,\n  display: true,\n  font: {\n    family: undefined,\n    lineHeight: undefined,\n    size: undefined,\n    style: undefined,\n    weight: undefined\n  },\n  height: undefined,\n  hitTolerance: 0,\n  init: undefined,\n  opacity: undefined,\n  padding: 6,\n  position: 'center',\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  textAlign: 'center',\n  textStrokeColor: undefined,\n  textStrokeWidth: 0,\n  width: undefined,\n  xAdjust: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: undefined,\n  xValue: undefined,\n  yAdjust: 0,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: undefined,\n  yValue: undefined,\n  z: 0\n};\n\nLabelAnnotation.defaultRoutes = {\n  borderColor: 'color'\n};\n\nfunction getLabelSize({x, y, width, height, options}) {\n  const hBorderWidth = options.borderWidth / 2;\n  const padding = toPadding(options.padding);\n  return {\n    x: x + padding.left + hBorderWidth,\n    y: y + padding.top + hBorderWidth,\n    width: width - padding.left - padding.right - options.borderWidth,\n    height: height - padding.top - padding.bottom - options.borderWidth\n  };\n}\n\nconst pointInLine = (p1, p2, t) => ({x: p1.x + t * (p2.x - p1.x), y: p1.y + t * (p2.y - p1.y)});\nconst interpolateX = (y, p1, p2) => pointInLine(p1, p2, Math.abs((y - p1.y) / (p2.y - p1.y))).x;\nconst interpolateY = (x, p1, p2) => pointInLine(p1, p2, Math.abs((x - p1.x) / (p2.x - p1.x))).y;\nconst sqr = v => v * v;\nconst rangeLimit = (mouseX, mouseY, {x, y, x2, y2}, axis) => axis === 'y' ? {start: Math.min(y, y2), end: Math.max(y, y2), value: mouseY} : {start: Math.min(x, x2), end: Math.max(x, x2), value: mouseX};\n// http://www.independent-software.com/determining-coordinates-on-a-html-canvas-bezier-curve.html\nconst coordInCurve = (start, cp, end, t) => (1 - t) * (1 - t) * start + 2 * (1 - t) * t * cp + t * t * end;\nconst pointInCurve = (start, cp, end, t) => ({x: coordInCurve(start.x, cp.x, end.x, t), y: coordInCurve(start.y, cp.y, end.y, t)});\nconst coordAngleInCurve = (start, cp, end, t) => 2 * (1 - t) * (cp - start) + 2 * t * (end - cp);\nconst angleInCurve = (start, cp, end, t) => -Math.atan2(coordAngleInCurve(start.x, cp.x, end.x, t), coordAngleInCurve(start.y, cp.y, end.y, t)) + 0.5 * PI;\n\nclass LineAnnotation extends Element {\n\n  inRange(mouseX, mouseY, axis, useFinalPosition) {\n    const hitSize = (this.options.borderWidth + this.options.hitTolerance) / 2;\n    if (axis !== 'x' && axis !== 'y') {\n      const point = {mouseX, mouseY};\n      const {path, ctx} = this;\n      if (path) {\n        setBorderStyle(ctx, this.options);\n        ctx.lineWidth += this.options.hitTolerance;\n        const {chart} = this.$context;\n        const mx = mouseX * chart.currentDevicePixelRatio;\n        const my = mouseY * chart.currentDevicePixelRatio;\n        const result = ctx.isPointInStroke(path, mx, my) || isOnLabel(this, point, useFinalPosition);\n        ctx.restore();\n        return result;\n      }\n      const epsilon = sqr(hitSize);\n      return intersects(this, point, epsilon, useFinalPosition) || isOnLabel(this, point, useFinalPosition);\n    }\n    return inAxisRange(this, {mouseX, mouseY}, axis, {hitSize, useFinalPosition});\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const {x, y, x2, y2, cp, options} = this;\n\n    ctx.save();\n    if (!setBorderStyle(ctx, options)) {\n      // no border width, then line is not drawn\n      return ctx.restore();\n    }\n    setShadowStyle(ctx, options);\n\n    const length = Math.sqrt(Math.pow(x2 - x, 2) + Math.pow(y2 - y, 2));\n    if (options.curve && cp) {\n      drawCurve(ctx, this, cp, length);\n      return ctx.restore();\n    }\n    const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(this);\n    const angle = Math.atan2(y2 - y, x2 - x);\n    ctx.translate(x, y);\n    ctx.rotate(angle);\n    ctx.beginPath();\n    ctx.moveTo(0 + startAdjust, 0);\n    ctx.lineTo(length - endAdjust, 0);\n    ctx.shadowColor = options.borderShadowColor;\n    ctx.stroke();\n    drawArrowHead(ctx, 0, startAdjust, startOpts);\n    drawArrowHead(ctx, length, -endAdjust, endOpts);\n    ctx.restore();\n  }\n\n  get label() {\n    return this.elements && this.elements[0];\n  }\n\n  resolveElementProperties(chart, options) {\n    const area = resolveLineProperties(chart, options);\n    const {x, y, x2, y2} = area;\n    const inside = isLineInArea(area, chart.chartArea);\n    const properties = inside\n      ? limitLineToArea({x, y}, {x: x2, y: y2}, chart.chartArea)\n      : {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n    properties.centerX = (x2 + x) / 2;\n    properties.centerY = (y2 + y) / 2;\n    properties.initProperties = initAnimationProperties(chart, properties, options);\n    if (options.curve) {\n      const p1 = {x: properties.x, y: properties.y};\n      const p2 = {x: properties.x2, y: properties.y2};\n      properties.cp = getControlPoint(properties, options, distanceBetweenPoints(p1, p2));\n    }\n    const labelProperties = resolveLabelElementProperties(chart, properties, options.label);\n    // additonal prop to manage zoom/pan\n    labelProperties._visible = inside;\n\n    properties.elements = [{\n      type: 'label',\n      optionScope: 'label',\n      properties: labelProperties,\n      initProperties: properties.initProperties\n    }];\n    return properties;\n  }\n}\n\nLineAnnotation.id = 'lineAnnotation';\n\nconst arrowHeadsDefaults = {\n  backgroundColor: undefined,\n  backgroundShadowColor: undefined,\n  borderColor: undefined,\n  borderDash: undefined,\n  borderDashOffset: undefined,\n  borderShadowColor: undefined,\n  borderWidth: undefined,\n  display: undefined,\n  fill: undefined,\n  length: undefined,\n  shadowBlur: undefined,\n  shadowOffsetX: undefined,\n  shadowOffsetY: undefined,\n  width: undefined\n};\n\nLineAnnotation.defaults = {\n  adjustScaleRange: true,\n  arrowHeads: {\n    display: false,\n    end: Object.assign({}, arrowHeadsDefaults),\n    fill: false,\n    length: 12,\n    start: Object.assign({}, arrowHeadsDefaults),\n    width: 6\n  },\n  borderDash: [],\n  borderDashOffset: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 2,\n  curve: false,\n  controlPoint: {\n    y: '-50%'\n  },\n  display: true,\n  endValue: undefined,\n  init: undefined,\n  hitTolerance: 0,\n  label: {\n    backgroundColor: 'rgba(0,0,0,0.8)',\n    backgroundShadowColor: 'transparent',\n    borderCapStyle: 'butt',\n    borderColor: 'black',\n    borderDash: [],\n    borderDashOffset: 0,\n    borderJoinStyle: 'miter',\n    borderRadius: 6,\n    borderShadowColor: 'transparent',\n    borderWidth: 0,\n    callout: Object.assign({}, LabelAnnotation.defaults.callout),\n    color: '#fff',\n    content: null,\n    display: false,\n    drawTime: undefined,\n    font: {\n      family: undefined,\n      lineHeight: undefined,\n      size: undefined,\n      style: undefined,\n      weight: 'bold'\n    },\n    height: undefined,\n    hitTolerance: undefined,\n    opacity: undefined,\n    padding: 6,\n    position: 'center',\n    rotation: 0,\n    shadowBlur: 0,\n    shadowOffsetX: 0,\n    shadowOffsetY: 0,\n    textAlign: 'center',\n    textStrokeColor: undefined,\n    textStrokeWidth: 0,\n    width: undefined,\n    xAdjust: 0,\n    yAdjust: 0,\n    z: undefined\n  },\n  scaleID: undefined,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  value: undefined,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: undefined,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: undefined,\n  z: 0\n};\n\nLineAnnotation.descriptors = {\n  arrowHeads: {\n    start: {\n      _fallback: true\n    },\n    end: {\n      _fallback: true\n    },\n    _fallback: true\n  }\n};\n\nLineAnnotation.defaultRoutes = {\n  borderColor: 'color'\n};\n\nfunction inAxisRange(element, {mouseX, mouseY}, axis, {hitSize, useFinalPosition}) {\n  const limit = rangeLimit(mouseX, mouseY, element.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis);\n  return inLimit(limit, hitSize) || isOnLabel(element, {mouseX, mouseY}, useFinalPosition, axis);\n}\n\nfunction isLineInArea({x, y, x2, y2}, {top, right, bottom, left}) {\n  return !(\n    (x < left && x2 < left) ||\n    (x > right && x2 > right) ||\n    (y < top && y2 < top) ||\n    (y > bottom && y2 > bottom)\n  );\n}\n\nfunction limitPointToArea({x, y}, p2, {top, right, bottom, left}) {\n  if (x < left) {\n    y = interpolateY(left, {x, y}, p2);\n    x = left;\n  }\n  if (x > right) {\n    y = interpolateY(right, {x, y}, p2);\n    x = right;\n  }\n  if (y < top) {\n    x = interpolateX(top, {x, y}, p2);\n    y = top;\n  }\n  if (y > bottom) {\n    x = interpolateX(bottom, {x, y}, p2);\n    y = bottom;\n  }\n  return {x, y};\n}\n\nfunction limitLineToArea(p1, p2, area) {\n  const {x, y} = limitPointToArea(p1, p2, area);\n  const {x: x2, y: y2} = limitPointToArea(p2, p1, area);\n  return {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n}\n\nfunction intersects(element, {mouseX, mouseY}, epsilon = EPSILON, useFinalPosition) {\n  // Adapted from https://stackoverflow.com/a/6853926/25507\n  const {x: x1, y: y1, x2, y2} = element.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n  const dx = x2 - x1;\n  const dy = y2 - y1;\n  const lenSq = sqr(dx) + sqr(dy);\n  const t = lenSq === 0 ? -1 : ((mouseX - x1) * dx + (mouseY - y1) * dy) / lenSq;\n\n  let xx, yy;\n  if (t < 0) {\n    xx = x1;\n    yy = y1;\n  } else if (t > 1) {\n    xx = x2;\n    yy = y2;\n  } else {\n    xx = x1 + t * dx;\n    yy = y1 + t * dy;\n  }\n  return (sqr(mouseX - xx) + sqr(mouseY - yy)) <= epsilon;\n}\n\nfunction isOnLabel(element, {mouseX, mouseY}, useFinalPosition, axis) {\n  const label = element.label;\n  return label.options.display && label.inRange(mouseX, mouseY, axis, useFinalPosition);\n}\n\nfunction resolveLabelElementProperties(chart, properties, options) {\n  const borderWidth = options.borderWidth;\n  const padding = toPadding(options.padding);\n  const textSize = measureLabelSize(chart.ctx, options);\n  const width = textSize.width + padding.width + borderWidth;\n  const height = textSize.height + padding.height + borderWidth;\n  return calculateLabelPosition(properties, options, {width, height, padding}, chart.chartArea);\n}\n\nfunction calculateAutoRotation(properties) {\n  const {x, y, x2, y2} = properties;\n  const rotation = Math.atan2(y2 - y, x2 - x);\n  // Flip the rotation if it goes > PI/2 or < -PI/2, so label stays upright\n  return rotation > PI / 2 ? rotation - PI : rotation < PI / -2 ? rotation + PI : rotation;\n}\n\nfunction calculateLabelPosition(properties, label, sizes, chartArea) {\n  const {width, height, padding} = sizes;\n  const {xAdjust, yAdjust} = label;\n  const p1 = {x: properties.x, y: properties.y};\n  const p2 = {x: properties.x2, y: properties.y2};\n  const rotation = label.rotation === 'auto' ? calculateAutoRotation(properties) : toRadians(label.rotation);\n  const size = rotatedSize(width, height, rotation);\n  const t = calculateT(properties, label, {labelSize: size, padding}, chartArea);\n  const pt = properties.cp ? pointInCurve(p1, properties.cp, p2, t) : pointInLine(p1, p2, t);\n  const xCoordinateSizes = {size: size.w, min: chartArea.left, max: chartArea.right, padding: padding.left};\n  const yCoordinateSizes = {size: size.h, min: chartArea.top, max: chartArea.bottom, padding: padding.top};\n  const centerX = adjustLabelCoordinate(pt.x, xCoordinateSizes) + xAdjust;\n  const centerY = adjustLabelCoordinate(pt.y, yCoordinateSizes) + yAdjust;\n  return {\n    x: centerX - (width / 2),\n    y: centerY - (height / 2),\n    x2: centerX + (width / 2),\n    y2: centerY + (height / 2),\n    centerX,\n    centerY,\n    pointX: pt.x,\n    pointY: pt.y,\n    width,\n    height,\n    rotation: toDegrees(rotation)\n  };\n}\n\nfunction rotatedSize(width, height, rotation) {\n  const cos = Math.cos(rotation);\n  const sin = Math.sin(rotation);\n  return {\n    w: Math.abs(width * cos) + Math.abs(height * sin),\n    h: Math.abs(width * sin) + Math.abs(height * cos)\n  };\n}\n\nfunction calculateT(properties, label, sizes, chartArea) {\n  let t;\n  const space = spaceAround(properties, chartArea);\n  if (label.position === 'start') {\n    t = calculateTAdjust({w: properties.x2 - properties.x, h: properties.y2 - properties.y}, sizes, label, space);\n  } else if (label.position === 'end') {\n    t = 1 - calculateTAdjust({w: properties.x - properties.x2, h: properties.y - properties.y2}, sizes, label, space);\n  } else {\n    t = getRelativePosition(1, label.position);\n  }\n  return t;\n}\n\nfunction calculateTAdjust(lineSize, sizes, label, space) {\n  const {labelSize, padding} = sizes;\n  const lineW = lineSize.w * space.dx;\n  const lineH = lineSize.h * space.dy;\n  const x = (lineW > 0) && ((labelSize.w / 2 + padding.left - space.x) / lineW);\n  const y = (lineH > 0) && ((labelSize.h / 2 + padding.top - space.y) / lineH);\n  return clamp(Math.max(x, y), 0, 0.25);\n}\n\nfunction spaceAround(properties, chartArea) {\n  const {x, x2, y, y2} = properties;\n  const t = Math.min(y, y2) - chartArea.top;\n  const l = Math.min(x, x2) - chartArea.left;\n  const b = chartArea.bottom - Math.max(y, y2);\n  const r = chartArea.right - Math.max(x, x2);\n  return {\n    x: Math.min(l, r),\n    y: Math.min(t, b),\n    dx: l <= r ? 1 : -1,\n    dy: t <= b ? 1 : -1\n  };\n}\n\nfunction adjustLabelCoordinate(coordinate, labelSizes) {\n  const {size, min, max, padding} = labelSizes;\n  const halfSize = size / 2;\n  if (size > max - min) {\n    // if it does not fit, display as much as possible\n    return (max + min) / 2;\n  }\n  if (min >= (coordinate - padding - halfSize)) {\n    coordinate = min + padding + halfSize;\n  }\n  if (max <= (coordinate + padding + halfSize)) {\n    coordinate = max - padding - halfSize;\n  }\n  return coordinate;\n}\n\nfunction getArrowHeads(line) {\n  const options = line.options;\n  const arrowStartOpts = options.arrowHeads && options.arrowHeads.start;\n  const arrowEndOpts = options.arrowHeads && options.arrowHeads.end;\n  return {\n    startOpts: arrowStartOpts,\n    endOpts: arrowEndOpts,\n    startAdjust: getLineAdjust(line, arrowStartOpts),\n    endAdjust: getLineAdjust(line, arrowEndOpts)\n  };\n}\n\nfunction getLineAdjust(line, arrowOpts) {\n  if (!arrowOpts || !arrowOpts.display) {\n    return 0;\n  }\n  const {length, width} = arrowOpts;\n  const adjust = line.options.borderWidth / 2;\n  const p1 = {x: length, y: width + adjust};\n  const p2 = {x: 0, y: adjust};\n  return Math.abs(interpolateX(0, p1, p2));\n}\n\nfunction drawArrowHead(ctx, offset, adjust, arrowOpts) {\n  if (!arrowOpts || !arrowOpts.display) {\n    return;\n  }\n  const {length, width, fill, backgroundColor, borderColor} = arrowOpts;\n  const arrowOffsetX = Math.abs(offset - length) + adjust;\n  ctx.beginPath();\n  setShadowStyle(ctx, arrowOpts);\n  setBorderStyle(ctx, arrowOpts);\n  ctx.moveTo(arrowOffsetX, -width);\n  ctx.lineTo(offset + adjust, 0);\n  ctx.lineTo(arrowOffsetX, width);\n  if (fill === true) {\n    ctx.fillStyle = backgroundColor || borderColor;\n    ctx.closePath();\n    ctx.fill();\n    ctx.shadowColor = 'transparent';\n  } else {\n    ctx.shadowColor = arrowOpts.borderShadowColor;\n  }\n  ctx.stroke();\n}\n\nfunction getControlPoint(properties, options, distance) {\n  const {x, y, x2, y2, centerX, centerY} = properties;\n  const angle = Math.atan2(y2 - y, x2 - x);\n  const cp = toPosition(options.controlPoint, 0);\n  const point = {\n    x: centerX + getSize(distance, cp.x, false),\n    y: centerY + getSize(distance, cp.y, false)\n  };\n  return rotated(point, {x: centerX, y: centerY}, angle);\n}\n\nfunction drawArrowHeadOnCurve(ctx, {x, y}, {angle, adjust}, arrowOpts) {\n  if (!arrowOpts || !arrowOpts.display) {\n    return;\n  }\n  ctx.save();\n  ctx.translate(x, y);\n  ctx.rotate(angle);\n  drawArrowHead(ctx, 0, -adjust, arrowOpts);\n  ctx.restore();\n}\n\nfunction drawCurve(ctx, element, cp, length) {\n  const {x, y, x2, y2, options} = element;\n  const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(element);\n  const p1 = {x, y};\n  const p2 = {x: x2, y: y2};\n  const startAngle = angleInCurve(p1, cp, p2, 0);\n  const endAngle = angleInCurve(p1, cp, p2, 1) - PI;\n  const ps = pointInCurve(p1, cp, p2, startAdjust / length);\n  const pe = pointInCurve(p1, cp, p2, 1 - endAdjust / length);\n\n  const path = new Path2D();\n  ctx.beginPath();\n  path.moveTo(ps.x, ps.y);\n  path.quadraticCurveTo(cp.x, cp.y, pe.x, pe.y);\n  ctx.shadowColor = options.borderShadowColor;\n  ctx.stroke(path);\n  element.path = path;\n  element.ctx = ctx;\n  drawArrowHeadOnCurve(ctx, ps, {angle: startAngle, adjust: startAdjust}, startOpts);\n  drawArrowHeadOnCurve(ctx, pe, {angle: endAngle, adjust: endAdjust}, endOpts);\n}\n\nclass EllipseAnnotation extends Element {\n\n  inRange(mouseX, mouseY, axis, useFinalPosition) {\n    const rotation = this.options.rotation;\n    const hitSize = (this.options.borderWidth + this.options.hitTolerance) / 2;\n    if (axis !== 'x' && axis !== 'y') {\n      return pointInEllipse({x: mouseX, y: mouseY}, this.getProps(['width', 'height', 'centerX', 'centerY'], useFinalPosition), rotation, hitSize);\n    }\n    const {x, y, x2, y2} = this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n    const limit = axis === 'y' ? {start: y, end: y2} : {start: x, end: x2};\n    const rotatedPoint = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-rotation));\n    return rotatedPoint[axis] >= limit.start - hitSize - EPSILON && rotatedPoint[axis] <= limit.end + hitSize + EPSILON;\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const {width, height, centerX, centerY, options} = this;\n    ctx.save();\n    translate(ctx, this.getCenterPoint(), options.rotation);\n    setShadowStyle(ctx, this.options);\n    ctx.beginPath();\n    ctx.fillStyle = options.backgroundColor;\n    const stroke = setBorderStyle(ctx, options);\n    ctx.ellipse(centerX, centerY, height / 2, width / 2, PI / 2, 0, 2 * PI);\n    ctx.fill();\n    if (stroke) {\n      ctx.shadowColor = options.borderShadowColor;\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  get label() {\n    return this.elements && this.elements[0];\n  }\n\n  resolveElementProperties(chart, options) {\n    return resolveBoxAndLabelProperties(chart, options);\n  }\n\n}\n\nEllipseAnnotation.id = 'ellipseAnnotation';\n\nEllipseAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  hitTolerance: 0,\n  init: undefined,\n  label: Object.assign({}, BoxAnnotation.defaults.label),\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: undefined,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: undefined,\n  z: 0\n};\n\nEllipseAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nEllipseAnnotation.descriptors = {\n  label: {\n    _fallback: true\n  }\n};\n\nfunction pointInEllipse(p, ellipse, rotation, hitSize) {\n  const {width, height, centerX, centerY} = ellipse;\n  const xRadius = width / 2;\n  const yRadius = height / 2;\n\n  if (xRadius <= 0 || yRadius <= 0) {\n    return false;\n  }\n  // https://stackoverflow.com/questions/7946187/point-and-ellipse-rotated-position-test-algorithm\n  const angle = toRadians(rotation || 0);\n  const cosAngle = Math.cos(angle);\n  const sinAngle = Math.sin(angle);\n  const a = Math.pow(cosAngle * (p.x - centerX) + sinAngle * (p.y - centerY), 2);\n  const b = Math.pow(sinAngle * (p.x - centerX) - cosAngle * (p.y - centerY), 2);\n  return (a / Math.pow(xRadius + hitSize, 2)) + (b / Math.pow(yRadius + hitSize, 2)) <= 1.0001;\n}\n\nclass PointAnnotation extends Element {\n\n  inRange(mouseX, mouseY, axis, useFinalPosition) {\n    const {x, y, x2, y2, width} = this.getProps(['x', 'y', 'x2', 'y2', 'width'], useFinalPosition);\n    const hitSize = (this.options.borderWidth + this.options.hitTolerance) / 2;\n    if (axis !== 'x' && axis !== 'y') {\n      return inPointRange({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), width / 2, hitSize);\n    }\n    const limit = axis === 'y' ? {start: y, end: y2, value: mouseY} : {start: x, end: x2, value: mouseX};\n    return inLimit(limit, hitSize);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const options = this.options;\n    const borderWidth = options.borderWidth;\n    if (options.radius < 0.1) {\n      return;\n    }\n    ctx.save();\n    ctx.fillStyle = options.backgroundColor;\n    setShadowStyle(ctx, options);\n    const stroke = setBorderStyle(ctx, options);\n    drawPoint(ctx, this, this.centerX, this.centerY);\n    if (stroke && !isImageOrCanvas(options.pointStyle)) {\n      ctx.shadowColor = options.borderShadowColor;\n      ctx.stroke();\n    }\n    ctx.restore();\n    options.borderWidth = borderWidth;\n  }\n\n  resolveElementProperties(chart, options) {\n    const properties = resolvePointProperties(chart, options);\n    properties.initProperties = initAnimationProperties(chart, properties, options);\n    return properties;\n  }\n}\n\nPointAnnotation.id = 'pointAnnotation';\n\nPointAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  hitTolerance: 0,\n  init: undefined,\n  pointStyle: 'circle',\n  radius: 10,\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  xAdjust: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: undefined,\n  xValue: undefined,\n  yAdjust: 0,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: undefined,\n  yValue: undefined,\n  z: 0\n};\n\nPointAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nclass PolygonAnnotation extends Element {\n\n  inRange(mouseX, mouseY, axis, useFinalPosition) {\n    if (axis !== 'x' && axis !== 'y') {\n      return this.options.radius >= 0.1 && this.elements.length > 1 && pointIsInPolygon(this.elements, mouseX, mouseY, useFinalPosition);\n    }\n    const rotatedPoint = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n    const axisPoints = this.elements.map((point) => axis === 'y' ? point.bY : point.bX);\n    const start = Math.min(...axisPoints);\n    const end = Math.max(...axisPoints);\n    return rotatedPoint[axis] >= start && rotatedPoint[axis] <= end;\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const {elements, options} = this;\n    ctx.save();\n    ctx.beginPath();\n    ctx.fillStyle = options.backgroundColor;\n    setShadowStyle(ctx, options);\n    const stroke = setBorderStyle(ctx, options);\n    let first = true;\n    for (const el of elements) {\n      if (first) {\n        ctx.moveTo(el.x, el.y);\n        first = false;\n      } else {\n        ctx.lineTo(el.x, el.y);\n      }\n    }\n    ctx.closePath();\n    ctx.fill();\n    // If no border, don't draw it\n    if (stroke) {\n      ctx.shadowColor = options.borderShadowColor;\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    const properties = resolvePointProperties(chart, options);\n    const {sides, rotation} = options;\n    const elements = [];\n    const angle = (2 * PI) / sides;\n    let rad = rotation * RAD_PER_DEG;\n    for (let i = 0; i < sides; i++, rad += angle) {\n      const elProps = buildPointElement(properties, options, rad);\n      elProps.initProperties = initAnimationProperties(chart, properties, options);\n      elements.push(elProps);\n    }\n    properties.elements = elements;\n    return properties;\n  }\n}\n\nPolygonAnnotation.id = 'polygonAnnotation';\n\nPolygonAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  hitTolerance: 0,\n  init: undefined,\n  point: {\n    radius: 0\n  },\n  radius: 10,\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  sides: 3,\n  xAdjust: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: undefined,\n  xValue: undefined,\n  yAdjust: 0,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: undefined,\n  yValue: undefined,\n  z: 0\n};\n\nPolygonAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nfunction buildPointElement({centerX, centerY}, {radius, borderWidth, hitTolerance}, rad) {\n  const hitSize = (borderWidth + hitTolerance) / 2;\n  const sin = Math.sin(rad);\n  const cos = Math.cos(rad);\n  const point = {x: centerX + sin * radius, y: centerY - cos * radius};\n  return {\n    type: 'point',\n    optionScope: 'point',\n    properties: {\n      x: point.x,\n      y: point.y,\n      centerX: point.x,\n      centerY: point.y,\n      bX: centerX + sin * (radius + hitSize),\n      bY: centerY - cos * (radius + hitSize)\n    }\n  };\n}\n\nfunction pointIsInPolygon(points, x, y, useFinalPosition) {\n  let isInside = false;\n  let A = points[points.length - 1].getProps(['bX', 'bY'], useFinalPosition);\n  for (const point of points) {\n    const B = point.getProps(['bX', 'bY'], useFinalPosition);\n    if ((B.bY > y) !== (A.bY > y) && x < (A.bX - B.bX) * (y - B.bY) / (A.bY - B.bY) + B.bX) {\n      isInside = !isInside;\n    }\n    A = B;\n  }\n  return isInside;\n}\n\nconst annotationTypes = {\n  box: BoxAnnotation,\n  doughnutLabel: DoughnutLabelAnnotation,\n  ellipse: EllipseAnnotation,\n  label: LabelAnnotation,\n  line: LineAnnotation,\n  point: PointAnnotation,\n  polygon: PolygonAnnotation\n};\n\n/**\n * Register fallback for annotation elements\n * For example lineAnnotation options would be looked through:\n * - the annotation object (options.plugins.annotation.annotations[id])\n * - element options (options.elements.lineAnnotation)\n * - element defaults (defaults.elements.lineAnnotation)\n * - annotation plugin defaults (defaults.plugins.annotation, this is what we are registering here)\n */\nObject.keys(annotationTypes).forEach(key => {\n  defaults.describe(`elements.${annotationTypes[key].id}`, {\n    _fallback: 'plugins.annotation.common'\n  });\n});\n\nconst directUpdater = {\n  update: Object.assign\n};\n\nconst hooks$1 = eventHooks.concat(elementHooks);\nconst resolve = (value, optDefs) => isObject(optDefs) ? resolveObj(value, optDefs) : value;\n\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").UpdateMode } UpdateMode\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n */\n\n/**\n * @param {string} prop\n * @returns {boolean}\n */\nconst isIndexable = (prop) => prop === 'color' || prop === 'font';\n\n/**\n * Resolve the annotation type, checking if is supported.\n * @param {string} [type=line] - annotation type\n * @returns {string} resolved annotation type\n */\nfunction resolveType(type = 'line') {\n  if (annotationTypes[type]) {\n    return type;\n  }\n  console.warn(`Unknown annotation type: '${type}', defaulting to 'line'`);\n  return 'line';\n}\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n * @param {UpdateMode} mode\n */\nfunction updateElements(chart, state, options, mode) {\n  const animations = resolveAnimations(chart, options.animations, mode);\n\n  const annotations = state.annotations;\n  const elements = resyncElements(state.elements, annotations);\n\n  for (let i = 0; i < annotations.length; i++) {\n    const annotationOptions = annotations[i];\n    const element = getOrCreateElement(elements, i, annotationOptions.type);\n    const resolver = annotationOptions.setContext(getContext(chart, element, elements, annotationOptions));\n    const properties = element.resolveElementProperties(chart, resolver);\n\n    properties.skip = toSkip(properties);\n\n    if ('elements' in properties) {\n      updateSubElements(element, properties.elements, resolver, animations);\n      // Remove the sub-element definitions from properties, so the actual elements\n      // are not overwritten by their definitions\n      delete properties.elements;\n    }\n\n    if (!defined(element.x)) {\n      // If the element is newly created, assing the properties directly - to\n      // make them readily awailable to any scriptable options. If we do not do this,\n      // the properties retruned by `resolveElementProperties` are available only\n      // after options resolution.\n      Object.assign(element, properties);\n    }\n\n    Object.assign(element, properties.initProperties);\n    properties.options = resolveAnnotationOptions(resolver);\n\n    animations.update(element, properties);\n  }\n}\n\nfunction toSkip(properties) {\n  return isNaN(properties.x) || isNaN(properties.y);\n}\n\nfunction resolveAnimations(chart, animOpts, mode) {\n  if (mode === 'reset' || mode === 'none' || mode === 'resize') {\n    return directUpdater;\n  }\n  return new Animations(chart, animOpts);\n}\n\nfunction updateSubElements(mainElement, elements, resolver, animations) {\n  const subElements = mainElement.elements || (mainElement.elements = []);\n  subElements.length = elements.length;\n  for (let i = 0; i < elements.length; i++) {\n    const definition = elements[i];\n    const properties = definition.properties;\n    const subElement = getOrCreateElement(subElements, i, definition.type, definition.initProperties);\n    const subResolver = resolver[definition.optionScope].override(definition);\n    properties.options = resolveAnnotationOptions(subResolver);\n    animations.update(subElement, properties);\n  }\n}\n\nfunction getOrCreateElement(elements, index, type, initProperties) {\n  const elementClass = annotationTypes[resolveType(type)];\n  let element = elements[index];\n  if (!element || !(element instanceof elementClass)) {\n    element = elements[index] = new elementClass();\n    Object.assign(element, initProperties);\n  }\n  return element;\n}\n\nfunction resolveAnnotationOptions(resolver) {\n  const elementClass = annotationTypes[resolveType(resolver.type)];\n  const result = {};\n  result.id = resolver.id;\n  result.type = resolver.type;\n  result.drawTime = resolver.drawTime;\n  Object.assign(result,\n    resolveObj(resolver, elementClass.defaults),\n    resolveObj(resolver, elementClass.defaultRoutes));\n  for (const hook of hooks$1) {\n    result[hook] = resolver[hook];\n  }\n  return result;\n}\n\nfunction resolveObj(resolver, defs) {\n  const result = {};\n  for (const prop of Object.keys(defs)) {\n    const optDefs = defs[prop];\n    const value = resolver[prop];\n    if (isIndexable(prop) && isArray(value)) {\n      result[prop] = value.map((item) => resolve(item, optDefs));\n    } else {\n      result[prop] = resolve(value, optDefs);\n    }\n  }\n  return result;\n}\n\nfunction getContext(chart, element, elements, annotation) {\n  return element.$context || (element.$context = Object.assign(Object.create(chart.getContext()), {\n    element,\n    get elements() {\n      return elements.filter((el) => el && el.options);\n    },\n    id: annotation.id,\n    type: 'annotation'\n  }));\n}\n\nfunction resyncElements(elements, annotations) {\n  const count = annotations.length;\n  const start = elements.length;\n\n  if (start < count) {\n    const add = count - start;\n    elements.splice(start, 0, ...new Array(add));\n  } else if (start > count) {\n    elements.splice(count, start - count);\n  }\n  return elements;\n}\n\nvar version = \"3.1.0\";\n\nconst chartStates = new Map();\nconst isNotDoughnutLabel = annotation => annotation.type !== 'doughnutLabel';\nconst hooks = eventHooks.concat(elementHooks);\n\nvar annotation = {\n  id: 'annotation',\n\n  version,\n\n  beforeRegister() {\n    requireVersion('chart.js', '4.0', Chart.version);\n  },\n\n  afterRegister() {\n    Chart.register(annotationTypes);\n  },\n\n  afterUnregister() {\n    Chart.unregister(annotationTypes);\n  },\n\n  beforeInit(chart) {\n    chartStates.set(chart, {\n      annotations: [],\n      elements: [],\n      visibleElements: [],\n      listeners: {},\n      listened: false,\n      moveListened: false,\n      hooks: {},\n      hooked: false,\n      hovered: []\n    });\n  },\n\n  beforeUpdate(chart, args, options) {\n    const state = chartStates.get(chart);\n    const annotations = state.annotations = [];\n\n    let annotationOptions = options.annotations;\n    if (isObject(annotationOptions)) {\n      Object.keys(annotationOptions).forEach(key => {\n        const value = annotationOptions[key];\n        if (isObject(value)) {\n          value.id = key;\n          annotations.push(value);\n        }\n      });\n    } else if (isArray(annotationOptions)) {\n      annotations.push(...annotationOptions);\n    }\n    verifyScaleOptions(annotations.filter(isNotDoughnutLabel), chart.scales);\n  },\n\n  afterDataLimits(chart, args) {\n    const state = chartStates.get(chart);\n    adjustScaleRange(chart, args.scale, state.annotations.filter(isNotDoughnutLabel).filter(a => a.display && a.adjustScaleRange));\n  },\n\n  afterUpdate(chart, args, options) {\n    const state = chartStates.get(chart);\n    updateListeners(chart, state, options);\n    updateElements(chart, state, options, args.mode);\n    state.visibleElements = state.elements.filter(el => !el.skip && el.options.display);\n    updateHooks(chart, state, options);\n  },\n\n  beforeDatasetsDraw(chart, _args, options) {\n    draw(chart, 'beforeDatasetsDraw', options.clip);\n  },\n\n  afterDatasetsDraw(chart, _args, options) {\n    draw(chart, 'afterDatasetsDraw', options.clip);\n  },\n\n  beforeDatasetDraw(chart, _args, options) {\n    draw(chart, _args.index, options.clip);\n  },\n\n  beforeDraw(chart, _args, options) {\n    draw(chart, 'beforeDraw', options.clip);\n  },\n\n  afterDraw(chart, _args, options) {\n    draw(chart, 'afterDraw', options.clip);\n  },\n\n  beforeEvent(chart, args, options) {\n    const state = chartStates.get(chart);\n    if (handleEvent(state, args.event, options)) {\n      args.changed = true;\n    }\n  },\n\n  afterDestroy(chart) {\n    chartStates.delete(chart);\n  },\n\n  getAnnotations(chart) {\n    const state = chartStates.get(chart);\n    return state ? state.elements : [];\n  },\n\n  // only for testing\n  _getAnnotationElementsAtEventForMode(visibleElements, event, options) {\n    return getElements(visibleElements, event, options);\n  },\n\n  defaults: {\n    animations: {\n      numbers: {\n        properties: ['x', 'y', 'x2', 'y2', 'width', 'height', 'centerX', 'centerY', 'pointX', 'pointY', 'radius'],\n        type: 'number'\n      },\n      colors: {\n        properties: ['backgroundColor', 'borderColor'],\n        type: 'color'\n      }\n    },\n    clip: true,\n    interaction: {\n      mode: undefined,\n      axis: undefined,\n      intersect: undefined\n    },\n    common: {\n      drawTime: 'afterDatasetsDraw',\n      init: false,\n      label: {\n      }\n    }\n  },\n\n  descriptors: {\n    _indexable: false,\n    _scriptable: (prop) => !hooks.includes(prop) && prop !== 'init',\n    annotations: {\n      _allKeys: false,\n      _fallback: (prop, opts) => `elements.${annotationTypes[resolveType(opts.type)].id}`\n    },\n    interaction: {\n      _fallback: true\n    },\n    common: {\n      label: {\n        _indexable: isIndexable,\n        _fallback: true\n      },\n      _indexable: isIndexable\n    }\n  },\n\n  additionalOptionScopes: ['']\n};\n\nfunction draw(chart, caller, clip) {\n  const {ctx, chartArea} = chart;\n  const state = chartStates.get(chart);\n\n  if (clip) {\n    clipArea(ctx, chartArea);\n  }\n\n  const drawableElements = getDrawableElements(state.visibleElements, caller).sort((a, b) => a.element.options.z - b.element.options.z);\n  for (const item of drawableElements) {\n    drawElement(ctx, chartArea, state, item);\n  }\n\n  if (clip) {\n    unclipArea(ctx);\n  }\n}\n\nfunction getDrawableElements(elements, caller) {\n  const drawableElements = [];\n  for (const el of elements) {\n    if (el.options.drawTime === caller) {\n      drawableElements.push({element: el, main: true});\n    }\n    if (el.elements && el.elements.length) {\n      for (const sub of el.elements) {\n        if (sub.options.display && sub.options.drawTime === caller) {\n          drawableElements.push({element: sub});\n        }\n      }\n    }\n  }\n  return drawableElements;\n}\n\nfunction drawElement(ctx, chartArea, state, item) {\n  const el = item.element;\n  if (item.main) {\n    invokeHook(state, el, 'beforeDraw');\n    el.draw(ctx, chartArea);\n    invokeHook(state, el, 'afterDraw');\n  } else {\n    el.draw(ctx, chartArea);\n  }\n}\n\nexport { annotation as default };\n", "import { Controller } from \"@hotwired/stimulus\"\nimport Chart from 'chart.js/auto'\nimport annotationPlugin from 'chartjs-plugin-annotation'\n\nChart.register(annotationPlugin)\n\nexport default class extends Controller {\n  static values = {\n    config: String\n  }\n\n  connect() {\n    this.renderChart()\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n    }\n  }\n\n  renderChart() {\n    const canvas = this.element.querySelector('canvas')\n    if (!canvas) return\n\n    const config = JSON.parse(this.configValue)\n\n    // Set up tick callback based on format type\n    const formatType = config.options.scales.x.ticks.formatType\n    config.options.scales.x.ticks.callback = function(value) {\n      if (formatType === 'percentage') {\n        // Percentage format (.ddd)\n        return '.' + String(Math.round(value)).padStart(3, '0')\n      } else if (formatType === 'decimal') {\n        // Decimal format (2 decimal places)\n        return value.toFixed(2)\n      } else if (formatType === 'decimal_3') {\n        // Decimal format (3 decimal places)\n        return value.toFixed(3)\n      } else {\n        return value.toString()\n      }\n    }\n\n    this.chart = new Chart(canvas, config)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Controller for game log table rows\n * Handles navigation to game analysis pages when rows are clicked\n */\nexport default class extends Controller {\n  static values = {\n    url: String\n  }\n\n  navigate(event) {\n    // Don't navigate if clicking on a link or button inside the row\n    if (event.target.closest('a, button')) {\n      return\n    }\n\n    if (this.urlValue) {\n      Turbo.visit(this.urlValue)\n    }\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\nimport Chart from \"chart.js/auto\"\nimport annotationPlugin from \"chartjs-plugin-annotation\"\n\n// Register the annotation plugin\nChart.register(annotationPlugin)\n\n/**\n * Stimulus controller for Analytics::GradePerformanceChart\n *\n * Renders a dual-metric chart showing:\n * - GSAX/60 (bars on left axis)\n * - Shots/60 (line on right axis)\n * Broken down by shot grade (X, A, B, C) with peer comparisons\n */\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    chartData: Object,\n    chartOptions: Object\n  }\n\n  /**\n   * Initialize the chart when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    this.renderChart()\n  }\n\n  /**\n   * Clean up chart when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  /**\n   * Render the Chart.js chart\n   * @returns {void}\n   */\n  renderChart() {\n    const canvas = this.element.querySelector('canvas')\n    if (!canvas) {\n      console.error('Canvas element not found')\n      return\n    }\n\n    const ctx = canvas.getContext('2d')\n\n    // Add tooltip callback to include annotation values\n    const options = this.addTooltipCallback(this.chartOptionsValue)\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',  // Base type, datasets can override\n      data: this.chartDataValue,\n      options: options\n    })\n  }\n\n  /**\n   * Re-render chart when data changes\n   * @returns {void}\n   */\n  chartDataValueChanged() {\n    if (this.chart) {\n      this.chart.data = this.chartDataValue\n      this.chart.update()\n    }\n  }\n\n  /**\n   * Re-render chart when options change\n   * @returns {void}\n   */\n  chartOptionsValueChanged() {\n    if (this.chart) {\n      // Preserve tooltip callback when updating options\n      const options = this.addTooltipCallback(this.chartOptionsValue)\n      this.chart.options = options\n      this.chart.update()\n    }\n  }\n\n  /**\n   * Add tooltip callback to show annotation values\n   * @param {Object} options - Chart options\n   * @returns {Object} Options with tooltip callback added\n   */\n  addTooltipCallback(options) {\n    const opts = { ...options }\n    if (!opts.plugins) {\n      opts.plugins = {}\n    }\n    if (!opts.plugins.tooltip) {\n      opts.plugins.tooltip = {}\n    }\n    if (!opts.plugins.tooltip.callbacks) {\n      opts.plugins.tooltip.callbacks = {}\n    }\n\n    // Add callback to show point estimate and peer GSAx values in tooltip\n    opts.plugins.tooltip.callbacks.afterBody = (tooltipItems) => {\n      if (!tooltipItems || tooltipItems.length === 0) {\n        return []\n      }\n\n      const lines = []\n      const firstItem = tooltipItems[0]\n      const chart = firstItem.chart\n      const gradeIndex = firstItem.dataIndex\n      const grade = chart.data.labels[gradeIndex]\n\n      // Get point estimate value from annotations\n      const pointEstimateKey = `point_estimate_${grade}`\n      const pointEstimate = chart.options.plugins.annotation?.annotations?.[pointEstimateKey]\n      if (pointEstimate) {\n        lines.push(`GSAx/60 (Actual): ${pointEstimate.yMin.toFixed(2)}`)\n      }\n\n      // Get peer average value from annotations\n      const peerAvgKey = `peer_avg_${grade}`\n      const peerAvg = chart.options.plugins.annotation?.annotations?.[peerAvgKey]\n      if (peerAvg) {\n        lines.push(`Peer Avg GSAx/60: ${peerAvg.yMin.toFixed(2)}`)\n      }\n\n      return lines\n    }\n\n    return opts\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Analytics::GradePerformanceTabs\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Analytics::GradePerformanceTabs controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Analytics::GradePerformanceTabs controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport Chart from \"chart.js/auto\"\nimport annotationPlugin from \"chartjs-plugin-annotation\"\n\n// Register the annotation plugin\nChart.register(annotationPlugin)\n\n/**\n * Stimulus controller for Analytics::PerformanceChart\n *\n * Generic chart component that renders dual-metric charts showing:\n * - Primary metric (bars on left axis with CI)\n * - Secondary metric (scatter on right axis)\n * Broken down by any facet type (shot grade, classification, etc.) with peer comparisons\n */\nexport default class extends Controller {\n  static targets = [\"canvas\"]\n  static values = {\n    chartData: Object,\n    chartOptions: Object\n  }\n\n  /**\n   * Initialize the chart when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    this.renderChart()\n  }\n\n  /**\n   * Clean up chart when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  /**\n   * Render the Chart.js chart\n   * @returns {void}\n   */\n  renderChart() {\n    const canvas = this.element.querySelector('canvas')\n    if (!canvas) {\n      console.error('Canvas element not found')\n      return\n    }\n\n    const ctx = canvas.getContext('2d')\n\n    // Add tooltip callback to include annotation values\n    const options = this.addTooltipCallback(this.chartOptionsValue)\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',  // Base type, datasets can override\n      data: this.chartDataValue,\n      options: options\n    })\n  }\n\n  /**\n   * Re-render chart when data changes\n   * @returns {void}\n   */\n  chartDataValueChanged() {\n    if (this.chart) {\n      this.chart.data = this.chartDataValue\n      this.chart.update()\n    }\n  }\n\n  /**\n   * Re-render chart when options change\n   * @returns {void}\n   */\n  chartOptionsValueChanged() {\n    if (this.chart) {\n      // Preserve tooltip callback when updating options\n      const options = this.addTooltipCallback(this.chartOptionsValue)\n      this.chart.options = options\n      this.chart.update()\n    }\n  }\n\n  /**\n   * Add tooltip callback to show annotation values\n   * @param {Object} options - Chart options\n   * @returns {Object} Options with tooltip callback added\n   */\n  addTooltipCallback(options) {\n    const opts = { ...options }\n    if (!opts.plugins) {\n      opts.plugins = {}\n    }\n    if (!opts.plugins.tooltip) {\n      opts.plugins.tooltip = {}\n    }\n    if (!opts.plugins.tooltip.callbacks) {\n      opts.plugins.tooltip.callbacks = {}\n    }\n\n    // Get the primary metric label from y-axis title\n    const primaryMetricLabel = opts.scales?.y?.title?.text || 'Primary Metric'\n\n    // Add callback to show point estimate and peer values in tooltip\n    opts.plugins.tooltip.callbacks.afterBody = (tooltipItems) => {\n      if (!tooltipItems || tooltipItems.length === 0) {\n        return []\n      }\n\n      const lines = []\n      const firstItem = tooltipItems[0]\n      const chart = firstItem.chart\n      const facetIndex = firstItem.dataIndex\n      const facetValue = chart.data.labels[facetIndex]\n\n      // Get point estimate value from annotations\n      const pointEstimateKey = `point_estimate_${facetValue}`\n      const pointEstimate = chart.options.plugins.annotation?.annotations?.[pointEstimateKey]\n      if (pointEstimate) {\n        lines.push(`${primaryMetricLabel} (Actual): ${pointEstimate.yMin.toFixed(2)}`)\n      }\n\n      // Get peer average value from annotations\n      const peerAvgKey = `peer_avg_${facetValue}`\n      const peerAvg = chart.options.plugins.annotation?.annotations?.[peerAvgKey]\n      if (peerAvg) {\n        lines.push(`Peer Avg ${primaryMetricLabel}: ${peerAvg.yMin.toFixed(2)}`)\n      }\n\n      return lines\n    }\n\n    return opts\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { Chart, registerables } from \"chart.js\"\n\n// Register Chart.js components\nChart.register(...registerables)\n\n// Base controller for all chart types\nexport default class extends Controller {\n  static values = {\n    config: Object\n  }\n\n  connect() {\n    this.chart = new Chart(this.element, this.configValue)\n  }\n\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n    }\n  }\n\n  // Update chart data dynamically\n  updateData(newData) {\n    if (this.chart) {\n      this.chart.data = newData\n      this.chart.update()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    text: String\n  }\n\n  copy(event) {\n    event.preventDefault()\n\n    // Capture button reference before async operation\n    const button = event.currentTarget\n    const originalContent = button.innerHTML\n\n    navigator.clipboard.writeText(this.textValue).then(() => {\n      // Show success feedback\n      button.innerHTML = '<svg class=\"h-5 w-5 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"></path></svg>'\n\n      setTimeout(() => {\n        button.innerHTML = originalContent\n      }, 2000)\n    }).catch(err => {\n      console.error('Failed to copy text: ', err)\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = { message: String };\n\n  messageValue: string\n\n  confirm(event) {\n    if (!(window.confirm(this.messageValue))) {\n      event.preventDefault()\n      event.stopImmediatePropagation()\n    };\n  };\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"menu\"]\n  static values = {\n    url: String\n  }\n\n  connect() {\n    this.boundHideMenu = this.hideMenu.bind(this)\n    document.addEventListener('click', this.boundHideMenu)\n  }\n\n  disconnect() {\n    document.removeEventListener('click', this.boundHideMenu)\n  }\n\n  showMenu(event) {\n    event.preventDefault()\n    event.stopPropagation()\n\n    // Position the menu at the cursor\n    this.menuTarget.style.left = `${event.clientX}px`\n    this.menuTarget.style.top = `${event.clientY}px`\n\n    // Show the menu\n    this.menuTarget.classList.remove('hidden')\n  }\n\n  hideMenu(event) {\n    // Don't hide if clicking inside the menu\n    if (event && this.menuTarget.contains(event.target)) {\n      return\n    }\n\n    this.menuTarget.classList.add('hidden')\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n// Generic controller for inputs that depend on the state of another input\n// Supports checkboxes, radio buttons, and other input types\nexport default class extends Controller {\n  static targets = [\"parent\", \"dependent\"]\n\n  connect() {\n    this.updateDependentStates()\n  }\n\n  updateDependentStates() {\n    const isEnabled = this.isParentEnabled()\n\n    this.dependentTargets.forEach(dependent => {\n      dependent.disabled = !isEnabled\n\n      // Update styling based on disabled state\n      const wrapper = dependent.closest('.input')\n      if (wrapper) {\n        if (isEnabled) {\n          wrapper.classList.remove('opacity-50')\n        } else {\n          wrapper.classList.add('opacity-50')\n        }\n      }\n    })\n  }\n\n  isParentEnabled() {\n    const parent = this.parentTarget\n\n    // For checkboxes and radio buttons, check if checked\n    if (parent.type === 'checkbox' || parent.type === 'radio') {\n      return parent.checked\n    }\n\n    // For select elements, check if a value is selected\n    if (parent.tagName === 'SELECT') {\n      return parent.value !== ''\n    }\n\n    // For other inputs, check if they have a non-empty value\n    return parent.value && parent.value.trim() !== ''\n  }\n}\n", "// dropdown_controller.js\nimport { Controller } from \"@hotwired/stimulus\"\nimport {enter, leave} from 'el-transition';\n\nexport default class extends Controller {\n    static targets = [\"menu\", \"button\"]\n    declare menuTarget: HTMLElement\n\n    toggleMenu(event: Event) {\n      event.preventDefault()\n      // Stop this click from bubbling to the window-level hideMenu listener below -\n      // without this, the very click that opens the menu can also close it again.\n      event.stopPropagation()\n      if (this.menuTarget.classList.contains('hidden')) {\n        enter(this.menuTarget)\n      } else {\n        leave(this.menuTarget)\n      }\n    }\n\n    hideMenu(event: Event) {\n      if (this.element.contains(<Node>event.target) === false && !this.menuTarget.classList.contains('hidden')) {\n        leave(this.menuTarget)\n      }\n    }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    cameraId: String\n  }\n  static outlets = [\"game--analysis--location-component\"]\n\n  connect() {\n    this.isCameraComplete = false\n    this.locationStates = new Map() // Track completion state of each location\n\n    // Listen for location completion events\n    this.element.addEventListener('location:complete', this.handleLocationComplete.bind(this))\n    this.element.addEventListener('location:incomplete', this.handleLocationIncomplete.bind(this))\n\n    // Listen for form submission events\n    this.setupFormSubmissionListener()\n\n    // Check initial camera completion status after a longer delay to ensure all location outlets are ready\n    setTimeout(() => {\n      this.checkInitialLocationStates()\n      this.checkCameraCompletion()\n    }, 250)\n  }\n\n  disconnect() {\n    // Clean up event listeners\n    this.element.removeEventListener('location:complete', this.handleLocationComplete.bind(this))\n    this.element.removeEventListener('location:incomplete', this.handleLocationIncomplete.bind(this))\n\n    // Clean up form submission listener\n    this.cleanupFormSubmissionListener()\n  }\n\n  setupFormSubmissionListener() {\n    // Find the delete form within this camera component\n    this.deleteForm = this.element.querySelector('form[method=\"post\"]')\n    if (this.deleteForm) {\n      this.formSubmitHandler = this.handleFormSubmit.bind(this)\n      this.deleteForm.addEventListener('submit', this.formSubmitHandler)\n    }\n  }\n\n  cleanupFormSubmissionListener() {\n    if (this.deleteForm && this.formSubmitHandler) {\n      this.deleteForm.removeEventListener('submit', this.formSubmitHandler)\n    }\n  }\n\n  handleFormSubmit(event) {\n    // This will be called when the delete form is submitted\n    console.log(`Camera ${this.cameraIdValue} delete form submitted`)\n\n    // Emit a camera deletion event that bubbles up to the cameras component\n    this.element.dispatchEvent(new CustomEvent('camera:delete-requested', {\n      bubbles: true,\n      detail: { cameraId: this.cameraIdValue }\n    }))\n  }\n\n  handleLocationComplete(event) {\n    const { locationId } = event.detail\n    console.log(`Location ${locationId} completed for camera ${this.cameraIdValue}`)\n    this.locationStates.set(locationId, true)\n    this.checkCameraCompletion()\n  }\n\n  handleLocationIncomplete(event) {\n    const { locationId } = event.detail\n    console.log(`Location ${locationId} became incomplete for camera ${this.cameraIdValue}`)\n    this.locationStates.set(locationId, false)\n    this.checkCameraCompletion()\n  }\n\n  checkInitialLocationStates() {\n    // Check the initial state of all location outlets\n    const locationOutlets = this.gameAnalysisLocationComponentOutlets\n    console.log(`Checking initial states for ${locationOutlets.length} locations in camera ${this.cameraIdValue}`)\n\n    if (locationOutlets.length === 0) {\n      console.warn(`No location outlets found for camera ${this.cameraIdValue}. This might be a timing issue.`)\n      // Try to find location elements manually as a fallback\n      const locationElements = this.element.querySelectorAll('.location-item')\n      console.log(`Found ${locationElements.length} location elements manually`)\n    }\n\n    locationOutlets.forEach(locationOutlet => {\n      const locationId = locationOutlet.locationIdValue\n      // Check if this location is already complete by looking at its video file upload components\n      const videoFileOutlets = locationOutlet.gameAnalysisVideoFileUploadComponentOutlets\n      const isComplete = videoFileOutlets.length > 0 && videoFileOutlets.every(outlet => \n        outlet.statusValue === 'uploaded' || outlet.statusValue === 'processed' || outlet.statusValue === 'completed'\n      )\n\n      console.log(`Location ${locationId} initial state: ${isComplete ? 'complete' : 'incomplete'} (${videoFileOutlets.length} video files)`)\n      this.locationStates.set(locationId, isComplete)\n    })\n  }\n\n  checkCameraCompletion() {\n    const wasComplete = this.isCameraComplete\n    const locationOutlets = this.gameAnalysisLocationComponentOutlets\n\n    // Check if we have any locations and if all locations are complete\n    this.isCameraComplete = locationOutlets.length > 0 && locationOutlets.every(locationOutlet => {\n      // Get the location ID from the outlet\n      const locationId = locationOutlet.locationIdValue\n      return this.locationStates.get(locationId) === true\n    })\n\n    // Only dispatch events if the completion status changed\n    if (this.isCameraComplete !== wasComplete) {\n      if (this.isCameraComplete) {\n        console.log(`Camera ${this.cameraIdValue} is now complete`)\n        this.element.dispatchEvent(new CustomEvent('camera:complete', {\n          bubbles: true,\n          detail: { cameraId: this.cameraIdValue }\n        }))\n      } else {\n        console.log(`Camera ${this.cameraIdValue} is no longer complete`)\n        this.element.dispatchEvent(new CustomEvent('camera:incomplete', {\n          bubbles: true,\n          detail: { cameraId: this.cameraIdValue }\n        }))\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"fileInput\"]\n  static values = {\n    gameAnalysisId: String,\n    gameId: String\n  }\n  static outlets = [\"game--analysis--camera-component\", \"game--analysis--video-file-upload-component\"]\n\n  pendingFiles = new Map() // Map of clientId or locationId -> array of files\n\n  connect() {\n    this.cameraStates = new Map() // Track completion state of each camera\n\n    // Listen for file requests from camera components\n    this.element.addEventListener('video-file:request-file', this.handleFileRequest.bind(this))\n\n    // Listen for camera completion events\n    this.element.addEventListener('camera:complete', this.handleCameraComplete.bind(this))\n    this.element.addEventListener('camera:incomplete', this.handleCameraIncomplete.bind(this))\n\n    // Listen for camera deletion requests\n    this.element.addEventListener('camera:delete-requested', this.handleCameraDeleteRequested.bind(this))\n\n    // Check initial camera states after a longer delay to ensure all camera outlets are ready\n    setTimeout(() => {\n      this.checkInitialCameraStates()\n    }, 350)\n  }\n\n  disconnect() {\n    // Clean up event listener\n    this.element.removeEventListener('video-file:request-file', this.handleFileRequest.bind(this))\n    this.element.removeEventListener('camera:complete', this.handleCameraComplete.bind(this))\n    this.element.removeEventListener('camera:incomplete', this.handleCameraIncomplete.bind(this))\n    this.element.removeEventListener('camera:delete-requested', this.handleCameraDeleteRequested.bind(this))\n  }\n\n  openFileDialog() {\n    console.log(\"openFileDialog\")\n    this.fileInputTarget.click()\n  }\n\n  analysisMethod() {\n    if (this.gameAnalysisIdValue) {\n      return 'PATCH'\n    }\n    return 'POST'\n  }\n\n  async handleFiles(event) {\n    const files = Array.from(event.target.files)\n    if (files.length === 0) return\n\n    try {\n      // Generate camera params and get the clientId -> files mapping\n      const { cameraParams, pendingFilesMap } = this.newCameraParams(files)\n\n      // Store pending files by clientId\n      pendingFilesMap.forEach((files, clientId) => {\n        this.pendingFiles.set(clientId, files)\n      })\n\n      const response = await fetch(`/game_analyses/${this.gameAnalysisIdValue}/cameras`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Accept': 'text/vnd.turbo-stream.html',\n          'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]').content\n        },\n        body: JSON.stringify({game_camera: cameraParams})\n      })\n\n      if (!response.ok) {\n        throw new Error('Failed to create camera')\n      }\n\n      const html = await response.text()\n      Turbo.renderStreamMessage(html)\n\n      // Clear the file input\n      this.fileInputTarget.value = ''\n\n      // Check for new cameras after a short delay to ensure DOM is updated\n      setTimeout(() => {\n        this.checkForNewCameras()\n      }, 100)\n    } catch (error) {\n      console.error('Error creating camera:', error)\n      // TODO: Show error message to user\n    }\n  }\n\n  checkForNewCameras() {\n    // Get current camera elements\n    const currentCameraElements = this.element.querySelectorAll('[data-controller*=\"game--analysis--camera-component\"]')\n    const currentCameraIds = Array.from(currentCameraElements).map(el => \n      el.dataset.gameAnalysisCameraComponentCameraIdValue\n    ).filter(Boolean)\n\n    // Find new cameras (in DOM but not in our state)\n    const newCameraIds = currentCameraIds.filter(id => \n      !this.cameraStates.has(id)\n    )\n\n    // Handle additions\n    newCameraIds.forEach(cameraId => {\n      console.log(`New camera ${cameraId} was added via file upload`)\n      this.handleCameraAdded(cameraId)\n    })\n  }\n\n  handleCameraAdded(cameraId) {\n    // Add the new camera to our state tracking (initially incomplete)\n    this.cameraStates.set(cameraId, false)\n    console.log(`Camera ${cameraId} added to state tracking (initially incomplete)`)\n\n    // Update cameras status and notify setup component\n    this.checkCamerasStatus()\n  }\n\n  handleFileRequest(event) {\n    console.log('handleFileRequest', event)\n    const { fileName, locationId, clientId, callback } = event.detail\n\n    // Determine which identifier to use for lookup\n    // For new uploads, use clientId; for reattachment, use locationId\n    const lookupKey = clientId || locationId\n\n    if (!lookupKey) {\n      console.warn('No locationId or clientId provided in file request')\n      return\n    }\n\n    // Get the files for this location\n    const locationFiles = this.pendingFiles.get(lookupKey)\n    if (!locationFiles) {\n      console.log(`No pending files found for ${clientId ? 'clientId' : 'locationId'}: ${lookupKey}`)\n      return\n    }\n\n    // Find the specific file by name within this location's files\n    const fileIndex = locationFiles.findIndex(file => file.name === fileName)\n    if (fileIndex === -1) {\n      console.log(`File ${fileName} not found in pending files for ${clientId ? 'clientId' : 'locationId'}: ${lookupKey}`)\n      return\n    }\n\n    const file = locationFiles[fileIndex]\n\n    // Call the callback to pass the file back to LocationComponent\n    if (callback) {\n      console.log(`Passing file ${fileName} to LocationComponent via callback`)\n      callback(file)\n\n      // Remove the file from pending files\n      locationFiles.splice(fileIndex, 1)\n\n      // If no more files for this location, remove the entry\n      if (locationFiles.length === 0) {\n        this.pendingFiles.delete(lookupKey)\n      }\n    }\n  }\n\n  handleCameraComplete(event) {\n    const { cameraId } = event.detail\n    console.log(`Camera ${cameraId} completed`)\n    this.cameraStates.set(cameraId, true)\n    this.checkCamerasStatus()\n  }\n\n  handleCameraIncomplete(event) {\n    const { cameraId } = event.detail\n    console.log(`Camera ${cameraId} became incomplete`)\n    this.cameraStates.set(cameraId, false)\n    this.checkCamerasStatus()\n  }\n\n  checkCamerasStatus() {\n    const hasCompleteCamera = this.cameraStates.size > 0 &&\n      Array.from(this.cameraStates.values()).some(isComplete => isComplete)\n\n    const allCamerasComplete = this.cameraStates.size > 0 &&\n      Array.from(this.cameraStates.values()).every(isComplete => isComplete)\n\n    console.log('Cameras status check:', {\n      cameraStates: Object.fromEntries(this.cameraStates),\n      hasCompleteCamera,\n      allCamerasComplete\n    })\n\n    // Dispatch event to setup component\n    this.element.dispatchEvent(new CustomEvent('cameras:status-updated', {\n      bubbles: true,\n      detail: {\n        hasCompleteCamera,\n        allCamerasComplete\n      }\n    }))\n  }\n\n  newCameraParams(files) {\n    // read files names and group them together. GoPro sets its file\n    // names by G[A-Z](\\d{2})(\\d{4}).mp4. where the first group is the chapter\n    // and the second group is the file number. We'll use this to group them\n    // such that the chapters of the same file are grouped together under one location.\n\n    const cameraParams = {\n      locations_attributes: []\n    }\n\n    const fileNamesRegex = /G[A-Z](\\d{2})(\\d{4}).mp4/i\n    let locations = {}\n    // group the files by file number\n    files.forEach(file => {\n      const match = file.name.match(fileNamesRegex)\n      if (locations[match[2]] === undefined) {\n        locations[match[2]] = []\n      }\n      locations[match[2]].push(\n        {\n          name: file.name,\n          size: file.size,\n          type: file.type,\n          created_at: file.lastModified,\n          number: match[2],\n          chapter: match[1],\n          file: file\n        }\n      )\n    })\n    // locations are now an object with keys of the file number and values of an array of objects\n    // each object has the file name, size, type, created_at, number, chapter, and file\n    // Sort each array of values by their creation date\n    Object.entries(locations).forEach(loc => {\n      loc[1].sort((a, b) => {\n        return a.created_at - b.created_at\n      })\n    })\n\n    // sort the locations object by keys\n    locations = Object.fromEntries(\n      Object.entries(locations).sort((a, b) => {\n        return Number.parseInt(a[0]) - Number.parseInt(b[0])\n      })\n    )\n\n    // create a cameraParams object that will work with the rails controller\n    // locations_attributes should match what the rails controller expects for\n    // nested attributes\n    // Also create a map of clientId -> file handles for matching later\n    const pendingFilesMap = new Map()\n\n    Object.entries(locations).forEach((loc) => {\n      const files = loc[1]\n      const clientId = crypto.randomUUID()\n\n      cameraParams.locations_attributes.push({\n        file_name: loc[0] + '.mp4',\n        location: 'behind_net',\n        client_identifier: clientId,\n        video_files_attributes: files.map((file, fileIndex) => ({\n          file_name: file.name,\n          chapter: file.chapter,\n          size: file.size,\n          order: fileIndex,\n          metadata: {\n            original_name: file.name,\n            content_type: file.type,\n            created_at: file.created_at\n          }\n        }))\n      })\n\n      // Store the actual file handles by clientId\n      pendingFilesMap.set(clientId, files.map(f => f.file))\n    })\n\n    return { cameraParams, pendingFilesMap }\n  }\n\n  checkInitialCameraStates() {\n    // Check the initial state of all camera outlets\n    const cameraOutlets = this.gameAnalysisCameraComponentOutlets\n    console.log(`Checking initial states for ${cameraOutlets.length} cameras`)\n\n    cameraOutlets.forEach(cameraOutlet => {\n      const cameraId = cameraOutlet.cameraIdValue\n      // Check if this camera is already complete by looking at its location components\n      const locationOutlets = cameraOutlet.gameAnalysisLocationComponentOutlets\n      const isComplete = locationOutlets.length > 0 && locationOutlets.every(locationOutlet => {\n        const videoFileOutlets = locationOutlet.gameAnalysisVideoFileUploadComponentOutlets\n        return videoFileOutlets.length > 0 && videoFileOutlets.every(outlet => \n          outlet.statusValue === 'uploaded' || outlet.statusValue === 'processed' || outlet.statusValue === 'completed'\n        )\n      })\n\n      console.log(`Camera ${cameraId} initial state: ${isComplete ? 'complete' : 'incomplete'}`)\n      this.cameraStates.set(cameraId, isComplete)\n    })\n\n    // Trigger initial status check\n    this.checkCamerasStatus()\n  }\n\n  handleCameraDeleteRequested(event) {\n    const { cameraId } = event.detail\n    console.log(`Camera ${cameraId} deletion requested`)\n\n    // Remove the camera from our state tracking immediately\n    this.cameraStates.delete(cameraId)\n    console.log(`Camera ${cameraId} removed from state tracking`)\n\n    // Update cameras status and notify setup component\n    this.checkCamerasStatus()\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\nimport Chart from \"chart.js/auto\"\n\n/**\n * Stimulus controller for Game::Analysis::Charts::ReboundResultBreakdownChart\n *\n * Renders a stacked bar chart showing rebound results breakdown:\n * - Freezes (sky)\n * - Clean Retained (green)\n * - Contested Retained (amber)\n * - Contested Lost (red)\n * - Turnovers (pink)\n */\nexport default class extends Controller {\n  static values = {\n    chartData: Object,\n    chartOptions: Object\n  }\n\n  /**\n   * Initialize the chart when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    this.renderChart()\n  }\n\n  /**\n   * Clean up chart when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  /**\n   * Render the Chart.js chart\n   * @returns {void}\n   */\n  renderChart() {\n    const canvas = this.element.querySelector('canvas')\n    if (!canvas) {\n      console.error('Canvas element not found')\n      return\n    }\n\n    const ctx = canvas.getContext('2d')\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',\n      data: this.chartDataValue,\n      options: this.chartOptionsValue\n    })\n  }\n\n  /**\n   * Re-render chart when data changes\n   * @returns {void}\n   */\n  chartDataValueChanged() {\n    if (this.chart) {\n      this.chart.data = this.chartDataValue\n      this.chart.update()\n    }\n  }\n\n  /**\n   * Re-render chart when options change\n   * @returns {void}\n   */\n  chartOptionsValueChanged() {\n    if (this.chart) {\n      this.chart.options = this.chartOptionsValue\n      this.chart.update()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport Chart from \"chart.js/auto\"\n\n/**\n * Stimulus controller for Game::Analysis::Charts::SafeAreaReboundRateChart\n *\n * Renders a stacked bar chart showing safe area vs unsafe area rebounds by grade:\n * - Safe Area (green)\n * - Unsafe Area (red)\n */\nexport default class extends Controller {\n  static values = {\n    chartData: Object,\n    chartOptions: Object\n  }\n\n  /**\n   * Initialize the chart when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    this.renderChart()\n  }\n\n  /**\n   * Clean up chart when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  /**\n   * Render the Chart.js chart\n   * @returns {void}\n   */\n  renderChart() {\n    const canvas = this.element.querySelector('canvas')\n    if (!canvas) {\n      console.error('Canvas element not found')\n      return\n    }\n\n    const ctx = canvas.getContext('2d')\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',\n      data: this.chartDataValue,\n      options: this.chartOptionsValue\n    })\n  }\n\n  /**\n   * Re-render chart when data changes\n   * @returns {void}\n   */\n  chartDataValueChanged() {\n    if (this.chart) {\n      this.chart.data = this.chartDataValue\n      this.chart.update()\n    }\n  }\n\n  /**\n   * Re-render chart when options change\n   * @returns {void}\n   */\n  chartOptionsValueChanged() {\n    if (this.chart) {\n      this.chart.options = this.chartOptionsValue\n      this.chart.update()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport Chart from \"chart.js/auto\"\n\n/**\n * Stimulus controller for Game::Analysis::Charts::ShotBreakdownChart\n *\n * Renders a stacked bar chart showing shot results breakdown by grade:\n * - Goals (red)\n * - Rebounds (amber)\n * - Freezes (blue)\n */\nexport default class extends Controller {\n  static values = {\n    chartData: Object,\n    chartOptions: Object\n  }\n\n  /**\n   * Initialize the chart when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    this.renderChart()\n  }\n\n  /**\n   * Clean up chart when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  /**\n   * Render the Chart.js chart\n   * @returns {void}\n   */\n  renderChart() {\n    const canvas = this.element.querySelector('canvas')\n    if (!canvas) {\n      console.error('Canvas element not found')\n      return\n    }\n\n    const ctx = canvas.getContext('2d')\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',\n      data: this.chartDataValue,\n      options: this.chartOptionsValue\n    })\n  }\n\n  /**\n   * Re-render chart when data changes\n   * @returns {void}\n   */\n  chartDataValueChanged() {\n    if (this.chart) {\n      this.chart.data = this.chartDataValue\n      this.chart.update()\n    }\n  }\n\n  /**\n   * Re-render chart when options change\n   * @returns {void}\n   */\n  chartOptionsValueChanged() {\n    if (this.chart) {\n      this.chart.options = this.chartOptionsValue\n      this.chart.update()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport Chart from \"chart.js/auto\"\n\n/**\n * Stimulus controller for Game::Analysis::Charts::XgBreakdownChart\n *\n * Renders an overlapping bar chart showing xG vs Goals by grade:\n * - xG (blue, semi-transparent background bar)\n * - Goals (red, overlay bar)\n */\nexport default class extends Controller {\n  static values = {\n    chartData: Object,\n    chartOptions: Object\n  }\n\n  /**\n   * Initialize the chart when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    this.renderChart()\n  }\n\n  /**\n   * Clean up chart when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    if (this.chart) {\n      this.chart.destroy()\n      this.chart = null\n    }\n  }\n\n  /**\n   * Render the Chart.js chart\n   * @returns {void}\n   */\n  renderChart() {\n    const canvas = this.element.querySelector('canvas')\n    if (!canvas) {\n      console.error('Canvas element not found')\n      return\n    }\n\n    const ctx = canvas.getContext('2d')\n\n    // Parse tooltip callback from options if it's a string\n    const options = this.parseTooltipCallback(this.chartOptionsValue)\n\n    this.chart = new Chart(ctx, {\n      type: 'bar',\n      data: this.chartDataValue,\n      options: options\n    })\n  }\n\n  /**\n   * Parse tooltip callback if it's provided as a string\n   * @param {Object} options - Chart options\n   * @returns {Object} Options with parsed callback\n   */\n  parseTooltipCallback(options) {\n    const opts = JSON.parse(JSON.stringify(options))\n\n    // If tooltip callback is a string (function source), evaluate it\n    if (opts.plugins?.tooltip?.callbacks?.afterLabel &&\n        typeof opts.plugins.tooltip.callbacks.afterLabel === 'string') {\n      try {\n        // Use Function constructor to create the callback function\n        opts.plugins.tooltip.callbacks.afterLabel = new Function(\n          'context',\n          opts.plugins.tooltip.callbacks.afterLabel.replace(/^function\\s*\\([^)]*\\)\\s*{/, '').replace(/}$/, '')\n        )\n      } catch (e) {\n        console.error('Failed to parse tooltip callback:', e)\n        delete opts.plugins.tooltip.callbacks.afterLabel\n      }\n    }\n\n    return opts\n  }\n\n  /**\n   * Re-render chart when data changes\n   * @returns {void}\n   */\n  chartDataValueChanged() {\n    if (this.chart) {\n      this.chart.data = this.chartDataValue\n      this.chart.update()\n    }\n  }\n\n  /**\n   * Re-render chart when options change\n   * @returns {void}\n   */\n  chartOptionsValueChanged() {\n    if (this.chart) {\n      const options = this.parseTooltipCallback(this.chartOptionsValue)\n      this.chart.options = options\n      this.chart.update()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n\nexport default class extends Controller {\n  static targets = [\"homeTeamContainer\", \"awayTeamContainer\", \"goaltenderItem\", \"addButton\"]\n  static values = {\n    gameAnalysisId: String,\n    goaltenders: Array\n  }\n\n  connect() {\n    console.log('Goaltender assignment controller connected')\n    \n    // Emit event when assignments are loaded\n    setTimeout(() => {\n      this.element.dispatchEvent(new CustomEvent('goaltender:assignments-loaded', {\n        bubbles: true\n      }))\n    }, 50)\n  }\n\n  disconnect() {\n    // Cleanup if needed\n  }\n\n  showGoaltenderSelector(event) {\n    const teamType = event.currentTarget.dataset.teamType\n    const container = event.currentTarget.closest('[data-team-container]')\n    // Create and show the goaltender selector modal\n    console.log('showGoaltenderSelector', teamType, container)\n    this.createGoaltenderSelector(teamType, container)\n  }\n\n  createGoaltenderSelector(teamType, container, order = null) {\n    // Store the order for use when a goaltender is selected\n    this._currentOrder = order\n\n    // Remove any existing modal\n    document.querySelectorAll('.goaltender-selector-modal').forEach(el => el.remove());\n\n    // Overlay\n    const overlay = document.createElement('div');\n    overlay.className = 'goaltender-selector-modal fixed z-10 inset-0 overflow-y-auto';\n    overlay.setAttribute('role', 'dialog');\n    overlay.setAttribute('aria-modal', 'true');\n\n    // Modal wrapper (background)\n    const wrapper = document.createElement('div');\n    wrapper.className = 'fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity';\n    wrapper.setAttribute('aria-hidden', 'true');\n    wrapper.addEventListener('click', () => this.closeSelector());\n\n    // Modal content\n    const modalContent = document.createElement('div');\n    modalContent.className = 'flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0';\n    modalContent.innerHTML = `\n      <span class=\"hidden sm:inline-block sm:align-middle sm:h-screen\" aria-hidden=\"true\">&#8203;</span>\n      <div class=\"inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle w-full max-w-md\">\n        <div class=\"flex justify-between items-center px-4 py-3 bg-white border-b border-gray-100\">\n          <h2 class=\"text-2xl font-medium text-gray-700\">Add Goaltender</h2>\n          <button type=\"button\" class=\"text-gray-400 hover:text-gray-500\" aria-label=\"Close\" id=\"goaltender-selector-close\">\n            <span class=\"sr-only\">Close</span>\n            ${this.renderCloseSvg()}\n          </button>\n        </div>\n        <div class=\"px-4 py-6 bg-white\">\n          <form data-goaltender-form>\n            <div class=\"space-y-4\">\n              <div>\n                <label class=\"block text-sm font-medium text-gray-700 mb-1\">\n                  Goaltender <span class=\"text-red-500\">*</span>\n                </label>\n                <select\n                  required\n                  data-goaltender-select\n                  class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-brand-500 focus:border-brand-500\"\n                >\n                  <option value=\"\">Select a goaltender...</option>\n                </select>\n              </div>\n              <div>\n                <label class=\"block text-sm font-medium text-gray-700 mb-1\">\n                  Time on ice (minutes) <span class=\"text-red-500\">*</span>\n                </label>\n                <input\n                  type=\"number\"\n                  required\n                  min=\"0\"\n                  step=\"1\"\n                  placeholder=\"Enter minutes\"\n                  data-time-on-ice-input\n                  class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:ring-brand-500 focus:border-brand-500\"\n                />\n              </div>\n            </div>\n            <div class=\"mt-6 flex justify-end space-x-3\">\n              <button\n                type=\"button\"\n                data-cancel-button\n                class=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50\"\n              >\n                Cancel\n              </button>\n              <button\n                type=\"submit\"\n                class=\"px-4 py-2 text-sm font-medium text-white bg-brand-600 rounded-md hover:bg-brand-700\"\n              >\n                Add Goaltender\n              </button>\n            </div>\n          </form>\n        </div>\n      </div>\n    `;\n\n    // Append\n    overlay.appendChild(wrapper);\n    overlay.appendChild(modalContent);\n    document.body.appendChild(overlay);\n\n    // Close on Escape\n    const escHandler = (e) => {\n      if (e.key === 'Escape') this.closeSelector();\n    };\n    document.addEventListener('keydown', escHandler);\n\n    // Close on button\n    modalContent.querySelector('#goaltender-selector-close').onclick = () => this.closeSelector();\n    modalContent.querySelector('[data-cancel-button]').onclick = () => this.closeSelector();\n\n    // Save for cleanup\n    this._goaltenderSelectorOverlay = overlay;\n    this._goaltenderSelectorEscHandler = escHandler;\n\n    // Load goaltenders into select\n    this.loadGoaltenders(teamType, container, modalContent.querySelector('[data-goaltender-select]'));\n\n    // Handle form submission\n    const form = modalContent.querySelector('[data-goaltender-form]');\n    form.addEventListener('submit', (e) => {\n      e.preventDefault();\n      this.handleFormSubmit(e, teamType);\n    });\n\n    // Pre-populate time on ice when goaltender is selected\n    const selectElement = modalContent.querySelector('[data-goaltender-select]');\n    const timeInput = modalContent.querySelector('[data-time-on-ice-input]');\n    selectElement.addEventListener('change', (e) => {\n      const selectedOption = e.target.options[e.target.selectedIndex];\n      const defaultTimeOnIce = selectedOption.dataset.defaultTimeOnIce;\n      if (defaultTimeOnIce) {\n        timeInput.value = defaultTimeOnIce;\n      }\n    });\n  }\n\n  loadGoaltenders(teamType, container, selectElement) {\n    if (this.goaltendersValue.length === 0) {\n      selectElement.innerHTML = '<option value=\"\">No goaltenders available</option>'\n      selectElement.disabled = true\n      return\n    }\n\n    // Keep the default \"Select a goaltender...\" option\n    this.goaltendersValue.forEach(goaltender => {\n      const option = document.createElement('option')\n      option.value = goaltender.id\n      option.dataset.goaltenderName = goaltender.name\n      option.dataset.defaultTimeOnIce = goaltender.default_time_on_ice || 60\n      option.textContent = goaltender.name\n      selectElement.appendChild(option)\n    })\n  }\n\n  handleFormSubmit(event, teamType) {\n    const form = event.target\n    const selectElement = form.querySelector('[data-goaltender-select]')\n    const timeInput = form.querySelector('[data-time-on-ice-input]')\n\n    const goaltenderId = selectElement.value\n    const selectedOption = selectElement.options[selectElement.selectedIndex]\n    const goaltenderName = selectedOption.dataset.goaltenderName || selectedOption.textContent\n    const timeOnIce = timeInput.value ? parseInt(timeInput.value) : null\n\n    // Validate\n    if (!goaltenderId) {\n      this.showError('Please select a goaltender')\n      return\n    }\n\n    if (!timeOnIce || timeOnIce <= 0) {\n      this.showError('Please enter a valid time on ice (minutes)')\n      return\n    }\n\n    const order = this._currentOrder !== undefined ? this._currentOrder : null\n\n    // Close the selector\n    this.closeSelector()\n\n    // Add the goaltender to the team\n    this.addGoaltenderToTeam(goaltenderId, goaltenderName, teamType, order, timeOnIce)\n  }\n\n  async addGoaltenderToTeam(goaltenderId, goaltenderName, teamType, order = null, timeOnIce = null) {\n    try {\n      // Create a hidden form for the request\n      const form = document.createElement('form')\n      form.method = 'POST'\n      form.action = `/game_analyses/${this.gameAnalysisIdValue}/goaltender_appearances`\n      form.style.display = 'none'\n\n      // Add CSRF token\n      const csrfInput = document.createElement('input')\n      csrfInput.type = 'hidden'\n      csrfInput.name = 'authenticity_token'\n      csrfInput.value = document.querySelector('meta[name=\"csrf-token\"]').content\n      form.appendChild(csrfInput)\n\n      // Add goaltender_id\n      const goaltenderInput = document.createElement('input')\n      goaltenderInput.type = 'hidden'\n      goaltenderInput.name = 'goaltender_appearance[goaltender_id]'\n      goaltenderInput.value = goaltenderId\n      form.appendChild(goaltenderInput)\n\n      // Add team_season_id\n      const teamInput = document.createElement('input')\n      teamInput.type = 'hidden'\n      teamInput.name = 'goaltender_appearance[team_season_id]'\n      teamInput.value = teamType === 'home' ? this.homeTeamId : this.awayTeamId\n      form.appendChild(teamInput)\n\n      // Add order if provided\n      if (order !== null) {\n        const orderInput = document.createElement('input')\n        orderInput.type = 'hidden'\n        orderInput.name = 'goaltender_appearance[order]'\n        orderInput.value = order\n        form.appendChild(orderInput)\n      }\n\n      // Add time_on_ice if provided\n      if (timeOnIce !== null) {\n        const timeOnIceInput = document.createElement('input')\n        timeOnIceInput.type = 'hidden'\n        timeOnIceInput.name = 'goaltender_appearance[time_on_ice]'\n        timeOnIceInput.value = timeOnIce\n        form.appendChild(timeOnIceInput)\n      }\n      \n      // Submit the form and handle the response\n      const response = await this.submitForm(form)\n      \n      if (response.ok) {\n        console.log(`Goaltender ${goaltenderId} (${goaltenderName}) successfully added`)\n        // The component will be reloaded via Turbo Stream, triggering connect() again\n      } else {\n        console.error('Failed to add goaltender appearance')\n      }\n      \n    } catch (error) {\n      console.error('Error adding goaltender:', error)\n      this.showError('Failed to add goaltender. Please try again.')\n    }\n  }\n\n  addGoaltenderAtOrder(event) {\n    const order = parseInt(event.currentTarget.dataset.order)\n    const teamType = event.currentTarget.dataset.teamType\n    const container = event.currentTarget.closest('[data-team-container]')\n    \n    this.createGoaltenderSelector(teamType, container, order)\n  }\n\n  async removeGoaltender(event) {\n    const goaltenderItem = event.currentTarget.closest('[data-goaltender-item]')\n    const goaltenderId = goaltenderItem.dataset.goaltenderId\n    \n    if (!confirm('Are you sure you want to remove this goaltender?')) {\n      return\n    }\n\n    try {\n      // Create a hidden form for the DELETE request\n      const form = document.createElement('form')\n      form.method = 'POST'\n      form.action = `/game_analyses/${this.gameAnalysisIdValue}/goaltender_appearances/${goaltenderId}`\n      form.style.display = 'none'\n\n      // Add CSRF token\n      const csrfInput = document.createElement('input')\n      csrfInput.type = 'hidden'\n      csrfInput.name = 'authenticity_token'\n      csrfInput.value = document.querySelector('meta[name=\"csrf-token\"]').content\n      form.appendChild(csrfInput)\n\n      // Add _method for DELETE\n      const methodInput = document.createElement('input')\n      methodInput.type = 'hidden'\n      methodInput.name = '_method'\n      methodInput.value = 'DELETE'\n      form.appendChild(methodInput)\n\n      // Submit the form and handle the response\n      const response = await this.submitForm(form)\n      \n      if (response.ok) {\n        console.log(`Goaltender ${goaltenderId} successfully removed`)\n        // The component will be reloaded via Turbo Stream, triggering connect() again\n      } else {\n        console.error('Failed to remove goaltender appearance')\n      }\n\n    } catch (error) {\n      console.error('Error removing goaltender:', error)\n      this.showError('Failed to remove goaltender. Please try again.')\n    }\n  }\n\n  async submitForm(form) {\n    // Convert form data to fetch request\n    const formData = new FormData(form)\n    const url = form.action\n    const method = formData.get('_method') || form.method\n    \n    // Remove _method from formData if it exists\n    if (formData.has('_method')) {\n      formData.delete('_method')\n    }\n    \n    // Make the fetch request\n    const response = await fetch(url, {\n      method: method,\n      body: formData,\n      headers: {\n        'Accept': 'text/vnd.turbo-stream.html',\n        'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]').content\n      }\n    })\n    \n    // Handle Turbo Stream response\n    if (response.ok) {\n      const html = await response.text()\n      Turbo.renderStreamMessage(html)\n    }\n    \n    return response\n  }\n\n  closeSelector() {\n    if (this._goaltenderSelectorOverlay) {\n      this._goaltenderSelectorOverlay.classList.add('opacity-0')\n      setTimeout(() => {\n        this._goaltenderSelectorOverlay.remove()\n        this._goaltenderSelectorOverlay = null\n      }, 200) // match your transition duration\n    }\n    if (this._goaltenderSelectorEscHandler) {\n      document.removeEventListener('keydown', this._goaltenderSelectorEscHandler)\n      this._goaltenderSelectorEscHandler = null\n    }\n  }\n\n  stopPropagation(event) {\n    event.stopPropagation()\n  }\n\n  showError(message) {\n    // Create a temporary error message\n    const errorDiv = document.createElement('div')\n    errorDiv.className = 'fixed top-4 right-4 bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded z-50'\n    errorDiv.textContent = message\n    \n    document.body.appendChild(errorDiv)\n    \n    setTimeout(() => {\n      errorDiv.remove()\n    }, 3000)\n  }\n\n  get homeTeamId() {\n    return this.element.dataset.homeTeamId\n  }\n\n  get awayTeamId() {\n    return this.element.dataset.awayTeamId\n  }\n\n  renderCloseSvg() {\n    return `<svg class=\"h-6 w-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n    </svg>`\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { enter, leave } from \"el-transition\"\n\nexport default class extends Controller {\n  static values = {\n    locationId: String,\n    maxConcurrentUploads: { type: Number, default: 2 }\n  }\n  static outlets = [\n    \"game--analysis--camera-component\",\n    \"game--analysis--video-file-upload-component\"\n  ]\n  static targets = [\"progressBar\", \"progressText\", \"completeContainer\", \"progressBarContainer\", \"overlay\", \"fileInput\", \"videoFilesList\"]\n\n  connect() {\n    this.uploadProgress = 0\n    this.totalBytes = 0\n    this.uploadedBytes = 0\n    this.fileSizes = new Map()\n    this.fileUploadedBytes = new Map()\n    this.isLocationComplete = false\n    this.uploadQueue = []\n    this.activeUploads = new Set()\n\n    // Listen for video file events\n    this.element.addEventListener('video-file:progress', this.handleVideoFileProgress.bind(this))\n    this.element.addEventListener('video-file:complete', this.handleVideoFileComplete.bind(this))\n    this.element.addEventListener('video-file:reattach', this.handleVideoFileReattach.bind(this))\n\n    // Check if we need to show the warning overlay\n    this.checkForPendingUploads()\n    this.updateOverallProgress()\n\n    // Check initial completion status after a short delay to ensure all outlets are ready\n    setTimeout(() => {\n      this.checkLocationCompletion()\n      this.initializeUploadQueue()\n    }, 100)\n  }\n\n  disconnect() {\n    // Clean up event listeners\n    this.element.removeEventListener('video-file:progress', this.handleVideoFileProgress.bind(this))\n    this.element.removeEventListener('video-file:complete', this.handleVideoFileComplete.bind(this))\n    this.element.removeEventListener('video-file:reattach', this.handleVideoFileReattach.bind(this))\n  }\n\n  checkForPendingUploads() {\n    const hasDetachedFiles = this.gameAnalysisVideoFileUploadComponentOutlets.some(outlet => {\n      // Only show overlay if the file is in uploading/pending state AND has no file handle\n      return (outlet.statusValue === 'uploading' || outlet.statusValue === 'pending') && !outlet.fileHandle\n    })\n\n    if (hasDetachedFiles) {\n      this.showOverlay()\n    }\n  }\n\n  showOverlay() {\n    enter(this.overlayTarget)\n  }\n\n  hideOverlay() {\n    leave(this.overlayTarget)\n  }\n\n  openFileDialog() {\n    this.fileInputTarget.click()\n  }\n\n  handleFiles(event) {\n    const files = Array.from(event.target.files)\n    if (files.length === 0) return\n\n    // Dispatch an event for each file to be handled by the video file upload components\n    files.forEach(file => {\n      this.element.dispatchEvent(new CustomEvent('video-file:reattach', {\n        bubbles: true,\n        detail: {\n          fileName: file.name,\n          file: file,\n          locationId: this.locationIdValue\n        }\n      }))\n    })\n\n    // Hide the overlay after files are selected\n    this.hideOverlay()\n  }\n\n  handleVideoFileProgress(event) {\n    const { videoFileId, totalSize, uploadedBytes } = event.detail\n    const fileKey = videoFileId\n\n    // Update total bytes if this is the first progress event for this file\n    if (!this.fileSizes.has(fileKey)) {\n      this.fileSizes.set(fileKey, totalSize)\n      this.totalBytes += totalSize\n    }\n\n    // Update uploaded bytes\n    const previousUploaded = this.fileUploadedBytes.get(fileKey) || 0\n    this.fileUploadedBytes.set(fileKey, uploadedBytes)\n\n    // Calculate the difference in uploaded bytes\n    const bytesDiff = uploadedBytes - previousUploaded\n    this.uploadedBytes += bytesDiff\n\n    this.updateOverallProgress()\n  }\n\n  handleVideoFileComplete(event) {\n    const { videoFileId } = event.detail\n    const fileKey = videoFileId\n    const totalSize = this.fileSizes.get(fileKey)\n    const currentUploaded = this.fileUploadedBytes.get(fileKey) || 0\n\n    // Add any remaining bytes to uploaded bytes\n    const remainingBytes = totalSize - currentUploaded\n    if (remainingBytes > 0) {\n      this.uploadedBytes += remainingBytes\n      this.fileUploadedBytes.set(fileKey, totalSize)\n    }\n\n    // Remove from active uploads\n    this.activeUploads.delete(videoFileId)\n\n    this.updateOverallProgress()\n    this.checkLocationCompletion()\n\n    // Start next upload in queue\n    this.processUploadQueue()\n  }\n\n  handleVideoFileReattach(event) {\n    const { fileName, file, locationId } = event.detail\n\n    if (locationId !== this.locationIdValue) {\n      return\n    }\n\n    // Find the video file upload component that matches this file name\n    const matchingOutlet = this.gameAnalysisVideoFileUploadComponentOutlets.find(outlet => {\n      return outlet.fileNameValue === fileName\n    })\n\n    if (matchingOutlet) {\n      // Dispatch the file to the matching component\n      matchingOutlet.element.dispatchEvent(new CustomEvent('video-file:set-file', {\n        bubbles: true,\n        detail: { file }\n      }))\n    }\n\n    // After reattaching files, restart the upload queue to pick up any waiting files\n    setTimeout(() => {\n      this.initializeUploadQueue()\n    }, 100)\n  }\n\n  initializeUploadQueue() {\n    // Get all video file upload components that are ready to upload\n    const readyOutlets = this.gameAnalysisVideoFileUploadComponentOutlets.filter(outlet => {\n      return outlet.fileHandle && outlet.statusValue === 'waiting'\n    })\n\n    // Add them to the queue\n    this.uploadQueue = readyOutlets.map(outlet => outlet.videoFileIdValue)\n    \n    // Start processing the queue\n    this.processUploadQueue()\n  }\n\n  processUploadQueue() {\n    // Start uploads up to the max concurrent limit\n    while (this.activeUploads.size < this.maxConcurrentUploadsValue && this.uploadQueue.length > 0) {\n      const videoFileId = this.uploadQueue.shift()\n      const outlet = this.gameAnalysisVideoFileUploadComponentOutlets.find(o => o.videoFileIdValue === videoFileId)\n      \n      if (outlet && outlet.fileHandle && outlet.statusValue === 'waiting') {\n        this.activeUploads.add(videoFileId)\n        \n        // Dispatch start upload event\n        outlet.element.dispatchEvent(new CustomEvent('video-file:start-upload', {\n          bubbles: true,\n          detail: { videoFileId }\n        }))\n      }\n    }\n  }\n\n  updateOverallProgress() {\n    if (this.gameAnalysisVideoFileUploadComponentOutlets.length === 0 ||\n        this.gameAnalysisVideoFileUploadComponentOutlets.every(outlet => outlet.statusValue === 'uploaded')) {\n      this.uploadProgress = 100\n      this.completeContainerTarget.classList.remove('hidden')\n      this.progressBarContainerTarget.classList.add('hidden')\n      this.videoFilesListTarget.classList.add('h-0')\n    } else {\n      // Calculate progress based on bytes uploaded vs total bytes\n      const progress = this.totalBytes > 0 ? this.uploadedBytes / this.totalBytes : 0\n      this.uploadProgress = Math.round(progress * 100)\n      this.completeContainerTarget.classList.add('hidden')\n      this.progressBarContainerTarget.classList.remove('hidden')\n      this.videoFilesListTarget.classList.remove('h-0')\n    }\n\n    // Update the progress bar and text\n    this.progressBarTarget.querySelector('div').style.width = `${this.uploadProgress}%`\n    this.progressTextTarget.textContent = `${this.uploadProgress}%`\n\n    // Dispatch an event with the updated progress\n    this.element.dispatchEvent(new CustomEvent('location:upload-progress', {\n      bubbles: true,\n      detail: { progress: this.uploadProgress }\n    }))\n  }\n\n  checkLocationCompletion() {\n    const wasComplete = this.isLocationComplete\n    const outlets = this.gameAnalysisVideoFileUploadComponentOutlets\n    \n    // Check if all video files are uploaded\n    this.isLocationComplete = outlets.length > 0 && outlets.every(outlet => \n      outlet.statusValue === 'uploaded' || outlet.statusValue === 'processed' || outlet.statusValue === 'completed'\n    )\n\n    // Only dispatch events if the completion status changed\n    if (this.isLocationComplete !== wasComplete) {\n      if (this.isLocationComplete) {\n        console.log(`Location ${this.locationIdValue} is now complete`)\n        this.element.dispatchEvent(new CustomEvent('location:complete', {\n          bubbles: true,\n          detail: { locationId: this.locationIdValue }\n        }))\n      } else {\n        console.log(`Location ${this.locationIdValue} is no longer complete`)\n        this.element.dispatchEvent(new CustomEvent('location:incomplete', {\n          bubbles: true,\n          detail: { locationId: this.locationIdValue }\n        }))\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Game::Analysis::PlayViewer\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Game::Analysis::PlayViewer controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Game::Analysis::PlayViewer controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    gameAnalysisId: String,\n    submitButtonId: String\n  }\n  static outlets = [\n    \"game--analysis--cameras-component\",\n    \"game--analysis--goaltender-assignment\"\n  ]\n\n  connect() {\n    console.log('Setup component controller connected')\n    \n    // Track state\n    this.hasCompleteCamera = false\n    this.allCamerasComplete = false\n    this.hasGoaltenderAssignment = false\n    \n    // Listen for events from child controllers\n    this.element.addEventListener('video-file:complete', this.handleVideoFileComplete.bind(this))\n    this.element.addEventListener('video-file:progress', this.handleVideoFileProgress.bind(this))\n    this.element.addEventListener('goaltender:assignments-loaded', this.handleGoaltenderAssignmentsLoaded.bind(this))\n    this.element.addEventListener('cameras:status-updated', this.handleCamerasStatusUpdated.bind(this))\n    \n    // Listen for Turbo Frame load events\n    this.element.addEventListener('turbo:frame-load', this.handleTurboFrameLoad.bind(this))\n    \n    // Set up MutationObserver to watch for DOM changes in goaltender assignment area\n    this.setupMutationObserver()\n    \n    // Check initial status after a longer delay to ensure all child components are ready\n    setTimeout(() => {\n      this.checkInitialState()\n    }, 450)\n  }\n\n  disconnect() {\n    // Cleanup event listeners if needed\n    if (this.mutationObserver) {\n      this.mutationObserver.disconnect()\n    }\n  }\n\n  setupMutationObserver() {\n    // Watch for changes in the goaltender assignment area\n    const goaltenderFrame = this.element.querySelector('turbo-frame[id*=\"goaltender_appearances\"]')\n    if (goaltenderFrame) {\n      this.mutationObserver = new MutationObserver((mutations) => {\n        let shouldCheck = false\n        mutations.forEach((mutation) => {\n          if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {\n            shouldCheck = true\n          }\n        })\n        \n        if (shouldCheck) {\n          setTimeout(() => {\n            this.checkSubmissionStatus()\n          }, 50)\n        }\n      })\n      \n      this.mutationObserver.observe(goaltenderFrame, {\n        childList: true,\n        subtree: true\n      })\n    }\n  }\n\n  handleVideoFileComplete(event) {\n    console.log('Video file completed:', event.detail)\n    // This will trigger the location -> camera -> cameras -> setup chain\n  }\n\n  handleVideoFileProgress(event) {\n    // We could use this for real-time progress updates if needed\n    console.log('Video file progress:', event.detail)\n  }\n\n  handleGoaltenderAssignmentsLoaded(event) {\n    console.log('Goaltender assignments loaded')\n    \n    // Check the current goaltender assignment status\n    this.hasGoaltenderAssignment = this.checkGoaltenderAssignment()\n    this.checkSubmissionStatus()\n  }\n\n  handleCamerasStatusUpdated(event) {\n    const { hasCompleteCamera, allCamerasComplete } = event.detail\n    console.log('Cameras status updated:', { hasCompleteCamera, allCamerasComplete })\n    this.hasCompleteCamera = hasCompleteCamera\n    this.allCamerasComplete = allCamerasComplete\n    this.checkSubmissionStatus()\n  }\n\n  handleTurboFrameLoad(event) {\n    console.log('Turbo frame loaded:', event.target.id)\n    // Check submission status when goaltender assignment frame loads\n    if (event.target.id && event.target.id.includes('goaltender_appearances')) {\n      setTimeout(() => {\n        this.checkForNewGoaltenderAppearances()\n        this.checkSubmissionStatus()\n      }, 100)\n    }\n  }\n\n  checkForNewGoaltenderAppearances() {\n    // Check if there are any goaltender items in the goaltender assignment components\n    const goaltenderAssignmentComponents = this.gameAnalysisGoaltenderAssignmentOutlets\n    if (goaltenderAssignmentComponents.length === 0) return\n    \n    for (const component of goaltenderAssignmentComponents) {\n      const goaltenderItems = component.element.querySelectorAll('[data-goaltender-item]')\n      if (goaltenderItems.length > 0) {\n        console.log(`Found ${goaltenderItems.length} goaltender appearances after frame load`)\n        this.hasGoaltenderAssignment = true\n        return\n      }\n    }\n    \n    // If we get here, there are no goaltender items\n    this.hasGoaltenderAssignment = false\n  }\n\n  checkInitialState() {\n    console.log('Checking initial state for setup component')\n    \n    // Check initial goaltender assignment state\n    this.hasGoaltenderAssignment = this.checkGoaltenderAssignment()\n    \n    // Check initial camera states if not already set by events\n    if (!this.hasCompleteCamera && !this.allCamerasComplete) {\n      this.checkInitialCameraStates()\n    }\n    \n    // Perform final submission status check\n    this.checkSubmissionStatus()\n  }\n\n  checkInitialCameraStates() {\n    // Fallback method to check camera states if events haven't fired yet\n    const cameraComponents = this.gameAnalysisCamerasComponentOutlets\n    if (cameraComponents.length === 0) return\n    \n    const cameraComponent = cameraComponents[0] // Should only be one cameras component\n    const cameraOutlets = cameraComponent.gameAnalysisCameraComponentOutlets\n    \n    if (cameraOutlets.length === 0) return\n    \n    const cameraStates = new Map()\n    \n    cameraOutlets.forEach(cameraOutlet => {\n      const cameraId = cameraOutlet.cameraIdValue\n      const locationOutlets = cameraOutlet.gameAnalysisLocationComponentOutlets\n      const isComplete = locationOutlets.length > 0 && locationOutlets.every(locationOutlet => {\n        const videoFileOutlets = locationOutlet.gameAnalysisVideoFileUploadComponentOutlets\n        return videoFileOutlets.length > 0 && videoFileOutlets.every(outlet => \n          outlet.statusValue === 'uploaded' || outlet.statusValue === 'processed' || outlet.statusValue === 'completed'\n        )\n      })\n      \n      cameraStates.set(cameraId, isComplete)\n    })\n    \n    this.hasCompleteCamera = cameraStates.size > 0 && \n      Array.from(cameraStates.values()).some(isComplete => isComplete)\n    this.allCamerasComplete = cameraStates.size > 0 && \n      Array.from(cameraStates.values()).every(isComplete => isComplete)\n    \n    console.log('Initial camera states checked:', {\n      cameraStates: Object.fromEntries(cameraStates),\n      hasCompleteCamera: this.hasCompleteCamera,\n      allCamerasComplete: this.allCamerasComplete\n    })\n  }\n\n  checkSubmissionStatus() {\n    // Update goaltender assignment state if not already set\n    if (this.hasGoaltenderAssignment === false) {\n      this.hasGoaltenderAssignment = this.checkGoaltenderAssignment()\n    }\n    \n    console.log('Submission status check:', {\n      hasCompleteCamera: this.hasCompleteCamera,\n      allCamerasComplete: this.allCamerasComplete,\n      hasGoaltenderAssignment: this.hasGoaltenderAssignment,\n      canSubmit: this.allCamerasComplete && this.hasGoaltenderAssignment\n    })\n\n    this.updateSubmitButton(this.allCamerasComplete && this.hasGoaltenderAssignment)\n  }\n\n  hasUploadedCamera() {\n    // This method is now deprecated in favor of the event-driven approach\n    // Keep for backward compatibility but prefer the allCamerasComplete state\n    return this.allCamerasComplete\n  }\n\n  checkGoaltenderAssignment() {\n    // Check if there's at least one goaltender assigned\n    const goaltenderAssignmentComponents = this.gameAnalysisGoaltenderAssignmentOutlets\n    console.log('Goaltender assignment components found:', goaltenderAssignmentComponents.length)\n    \n    if (goaltenderAssignmentComponents.length === 0) return false\n\n    // Look for any goaltender items\n    for (const component of goaltenderAssignmentComponents) {\n      const goaltenderItems = component.element.querySelectorAll('[data-goaltender-item]')\n      console.log('Goaltender items found:', goaltenderItems.length)\n      if (goaltenderItems.length > 0) {\n        return true\n      }\n    }\n    \n    return false\n  }\n\n  updateSubmitButton(canSubmit) {\n    // Find the submit button by ID\n    const submitButton = document.getElementById(this.submitButtonIdValue)\n    \n    if (!submitButton) {\n      console.warn(`Submit button with ID '${this.submitButtonIdValue}' not found`)\n      return\n    }\n\n    if (canSubmit) {\n      submitButton.disabled = false\n      submitButton.classList.remove('opacity-50', 'cursor-not-allowed')\n      submitButton.classList.add('hover:bg-cta-700', 'focus:ring-cta-500')\n    } else {\n      submitButton.disabled = true\n      submitButton.classList.add('opacity-50', 'cursor-not-allowed')\n      submitButton.classList.remove('hover:bg-cta-700', 'focus:ring-cta-500')\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Game::Analysis::ShotList\n *\n * Manages shot selection and coordinates with shot map and video player:\n * - Highlights selected shot in list\n * - Dispatches events for shot map and video player\n */\nexport default class extends Controller {\n  static targets = [\"shotItem\"]\n  static outlets = [\"game--analysis--shot-map-component\"]\n  static values = {\n    gameAnalysisId: String\n  }\n\n  connect() {\n    console.log(\"Shot list component controller connected\")\n    console.log(\"Shot list: element ID:\", this.element.id)\n    console.log(\"Shot list: shotItem targets count:\", this.shotItemTargets.length)\n  }\n\n  gameAnalysisShotMapComponentOutletConnected(outlet) {\n    console.log(\"Shot list: shot map outlet connected!\", outlet)\n  }\n\n  gameAnalysisShotMapComponentOutletDisconnected(outlet) {\n    console.log(\"Shot list: shot map outlet disconnected!\", outlet)\n  }\n\n  /**\n   * Handle shot selection from the list\n   * @param {Event} event - Click event on shot item\n   */\n  selectShot(event) {\n    const shotItem = event.currentTarget\n    const sequenceId = shotItem.dataset.sequenceId\n    console.log(\"Shot list: selectShot called with sequenceId:\", sequenceId)\n\n    this.updateSelectedState(sequenceId)\n\n    // Call shot map outlet to highlight the shot\n    console.log(\"Shot list: hasGameAnalysisShotMapComponentOutlet:\", this.hasGameAnalysisShotMapComponentOutlet)\n    if (this.hasGameAnalysisShotMapComponentOutlet) {\n      console.log(\"Shot list: calling shot map outlet updateSelectedState\")\n      this.gameAnalysisShotMapComponentOutlet.updateSelectedState(sequenceId)\n    }\n\n    // Load video in turbo frame\n    console.log(\"Shot list: loading video\")\n    this.loadVideo(sequenceId)\n  }\n\n  /**\n   * Select a shot from external trigger (e.g., shot map click)\n   * @param {string} sequenceId - ID of sequence to select\n   */\n  selectShotFromMap(sequenceId) {\n    console.log(\"Shot list: selectShotFromMap called with sequenceId:\", sequenceId)\n    this.updateSelectedState(sequenceId)\n    this.loadVideo(sequenceId)\n\n    // Scroll the item into view\n    const shotItem = this.shotItemTargets.find(\n      item => item.dataset.sequenceId === sequenceId\n    )\n\n    console.log(\"Shot list: found shotItem:\", shotItem)\n    if (shotItem) {\n      shotItem.scrollIntoView({\n        behavior: 'smooth',\n        block: 'nearest'\n      })\n    }\n  }\n\n  /**\n   * Update visual selection state in list\n   * @param {string} sequenceId - ID of selected sequence\n   */\n  updateSelectedState(sequenceId) {\n    console.log(\"Shot list: updateSelectedState called with sequenceId:\", sequenceId)\n    this.shotItemTargets.forEach(item => {\n      if (item.dataset.sequenceId === sequenceId) {\n        console.log(\"Shot list: highlighting item for sequence:\", sequenceId)\n        item.classList.add('bg-sky-900', 'border-2', 'border-sky-500')\n        item.classList.remove('bg-gray-900')\n      } else {\n        item.classList.remove('bg-sky-900', 'border-2', 'border-sky-500')\n        item.classList.add('bg-gray-900')\n      }\n    })\n  }\n\n  /**\n   * Load video for selected shot\n   * @param {string} sequenceId - ID of sequence to load video for\n   */\n  loadVideo(sequenceId) {\n    const frame = document.getElementById('selected_shot_video')\n    if (frame) {\n      // Get game_analysis_id from the URL\n      // URL format: /game_analyses/:game_analysis_id/goaltenders/:id\n      const pathParts = window.location.pathname.split('/')\n      const gameAnalysisId = pathParts[pathParts.indexOf('game_analyses') + 1]\n\n      // Construct URL to load the event sequence video\n      const url = `/game_analyses/${gameAnalysisId}/plays/${sequenceId}/video`\n      frame.src = url\n    }\n  }\n\n  /**\n   * Clear selection\n   */\n  clearSelection() {\n    this.shotItemTargets.forEach(item => {\n      item.classList.remove('bg-sky-900', 'border-2', 'border-sky-500')\n      item.classList.add('bg-gray-900')\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"dotsOverlay\", \"shotDot\", \"sequenceOverlay\", \"rink\"]\n  static outlets = [\"game--analysis--shot-list\"]\n\n  connect() {\n    console.log(\"Shot map component controller connected\")\n    console.log(\"Shot map: element ID:\", this.element.id)\n    console.log(\"Shot map: shotDot targets count:\", this.shotDotTargets.length)\n  }\n\n  gameAnalysisShotListOutletConnected(outlet) {\n    console.log(\"Shot map: shot list outlet connected!\", outlet)\n  }\n\n  gameAnalysisShotListOutletDisconnected(outlet) {\n    console.log(\"Shot map: shot list outlet disconnected!\", outlet)\n  }\n\n  disconnect() {\n    if (this._onResize) window.removeEventListener('resize', this._onResize)\n  }\n\n  /**\n   * Show sequence overlay on hover\n   */\n  showSequence(event) {\n    // Don't show hover if there's a selected shot\n    if (this.selectedSequenceId) return\n\n    const sequenceId = event.currentTarget.dataset.sequenceId\n\n    // Dim all other shots\n    this.shotDotTargets.forEach(circle => {\n      if (circle.dataset.sequenceId !== sequenceId) {\n        circle.style.opacity = '0.1'\n      }\n    })\n\n    // Show the sequence overlay\n    this.sequenceOverlayTargets.forEach(overlay => {\n      if (overlay.dataset.sequenceId === sequenceId) {\n        console.log(\"Showing sequence overlay\", overlay.dataset.sequenceId)\n        overlay.classList.remove('hidden')\n      }\n    })\n  }\n\n  /**\n   * Hide sequence overlay on mouse leave (only if not selected)\n   */\n  hideSequence(event) {\n    // Don't hide if there's a selected shot\n    if (this.selectedSequenceId) return\n\n    // Show all shots again\n    this.shotDotTargets.forEach(circle => {\n      circle.style.opacity = '0.8'\n    })\n\n    // Hide all sequence overlays\n    this.sequenceOverlayTargets.forEach(overlay => {\n      overlay.classList.add('hidden')\n    })\n  }\n\n  /**\n   * Handle click on a shot dot to select it\n   */\n  selectShot(event) {\n    event.stopPropagation()\n    const sequenceId = event.currentTarget.dataset.sequenceId\n    console.log(\"Shot map: selectShot called with sequenceId:\", sequenceId)\n\n    // Update visual state first to lock in the selection\n    // This prevents hover effects from interfering\n    console.log(\"Shot map: calling updateSelectedState\")\n    this.updateSelectedState(sequenceId)\n\n    // Call shot list outlet to update and load video\n    console.log(\"Shot map: hasGameAnalysisShotListOutlet:\", this.hasGameAnalysisShotListOutlet)\n    if (this.hasGameAnalysisShotListOutlet) {\n      console.log(\"Shot map: calling shot list outlet selectShotFromMap\")\n      this.gameAnalysisShotListOutlet.selectShotFromMap(sequenceId)\n    } else {\n      console.warn(\"Shot map: shot list outlet not available\")\n    }\n  }\n\n  /**\n   * Update visual state for selected shot\n   */\n  updateSelectedState(sequenceId) {\n    console.log(\"Shot map: updateSelectedState called with sequenceId:\", sequenceId)\n    this.selectedSequenceId = sequenceId\n\n    // Dim all other shots\n    this.shotDotTargets.forEach(dot => {\n      if (dot.dataset.sequenceId !== sequenceId) {\n        dot.style.opacity = '0.2'\n      } else {\n        dot.style.opacity = '1.0'\n      }\n    })\n\n    // Show only the selected sequence overlay\n    this.sequenceOverlayTargets.forEach(overlay => {\n      if (overlay.dataset.sequenceId === sequenceId) {\n        console.log(\"Shot map: showing overlay for sequence:\", sequenceId)\n        overlay.classList.remove('hidden')\n      } else {\n        overlay.classList.add('hidden')\n      }\n    })\n  }\n\n  /**\n   * Clear selection when clicking on map background\n   */\n  clearSelection(event) {\n    // If we have a selection, clear it\n    // (Shots call stopPropagation, so this only fires when clicking background)\n    if (!this.selectedSequenceId) return\n\n    this.selectedSequenceId = null\n\n    // Reset all shots to normal opacity\n    this.shotDotTargets.forEach(dot => {\n      dot.style.opacity = '0.8'\n    })\n\n    // Hide all overlays\n    this.sequenceOverlayTargets.forEach(overlay => {\n      overlay.classList.add('hidden')\n    })\n\n    // Call shot list outlet to clear selection\n    if (this.hasGameAnalysisShotListOutlet) {\n      this.gameAnalysisShotListOutlet.clearSelection()\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"progressBarContainer\", \"progressBar\", \"completeContainer\", \"waitingContainer\", \"uploadingContainer\"]\n  static values = {\n    videoFileId: String,\n    fileName: String,\n    status: String,\n    gameAnalysisId: String,\n    initialProgress: Number,\n    totalSize: Number,\n    locationId: String,\n    clientId: String\n  }\n\n  CHUNK_SIZE = 56 * 1024 * 1024 // 56MB chunks\n  currentChunk = 0\n  totalChunks = 0\n  fileHandle = null\n  abortController = null\n  lastProgressAt = null\n  isUploading = false\n  uploadedBytes = 0\n  stallCheckInterval = null\n\n  connect() {\n    // Dispatch an event to the parent controller to request the file handle\n    this.element.dispatchEvent(new CustomEvent('video-file:request-file', {\n      bubbles: true,\n      detail: {\n        fileName: this.fileNameValue,\n        locationId: this.locationIdValue,\n        clientId: this.clientIdValue,\n        callback: (file) => this.setFile(file)\n      }\n    }))\n\n    // If we're in an uploading state, dispatch the initial progress\n    if (this.statusValue === 'uploading') {\n      this.uploadedBytes = (this.initialProgressValue / 100) * this.totalSizeValue\n      this.element.dispatchEvent(new CustomEvent('video-file:progress', {\n        bubbles: true,\n        detail: {\n          videoFileId: this.videoFileIdValue,\n          totalSize: this.totalSizeValue,\n          uploadedBytes: this.uploadedBytes\n        }\n      }))\n    }\n\n    // Listen for file reattachment events\n    this.element.addEventListener('video-file:set-file', this.handleFileSet.bind(this))\n\n    // Listen for start upload events from location controller\n    this.element.addEventListener('video-file:start-upload', this.handleStartUpload.bind(this))\n  }\n\n  disconnect() {\n    this.cancelUpload()\n    this.stopStallDetection()\n    this.element.removeEventListener('video-file:set-file', this.handleFileSet.bind(this))\n    this.element.removeEventListener('video-file:start-upload', this.handleStartUpload.bind(this))\n  }\n\n  handleFileSet(event) {\n    const { file } = event.detail\n    this.setFile(file)\n  }\n\n  handleStartUpload() {\n    if (this.fileHandle && this.statusValue !== 'uploaded') {\n      this.startUpload()\n    }\n  }\n\n  startStallDetection() {\n    // Check for stalled upload every 10 seconds\n    this.stallCheckInterval = setInterval(() => {\n      this.checkForStall()\n    }, 10000)\n  }\n\n  stopStallDetection() {\n    if (this.stallCheckInterval) {\n      clearInterval(this.stallCheckInterval)\n      this.stallCheckInterval = null\n    }\n  }\n\n  checkForStall() {\n    if (this.isUploading && this.isStalled(60000)) {\n      console.log(`Upload for ${this.fileNameValue} is stalled, restarting...`)\n      this.restartUpload()\n    }\n  }\n\n  setFile(file) {\n    console.log('setFile', file)\n    // if this file is already uploaded, don't do anything\n    if (this.statusValue === 'uploaded') {\n      return\n    }\n\n    this.fileHandle = file\n    this.totalChunks = Math.ceil(file.size / this.CHUNK_SIZE)\n\n    // If we have initial progress, calculate the current chunk\n    if (this.statusValue === 'uploading' && this.initialProgressValue > 0) {\n      this.currentChunk = Math.floor((this.initialProgressValue / 100) * this.totalChunks)\n    }\n\n    // Dispatch start event with file size\n    this.element.dispatchEvent(new CustomEvent('video-file:start', {\n      bubbles: true,\n      detail: {\n        videoFileId: this.videoFileIdValue,\n        size: file.size\n      }\n    }))\n\n    // Don't start upload automatically - wait for location controller to signal\n    this.statusValue = 'waiting'\n  }\n\n  async startUpload() {\n    if (!this.fileHandle) {\n      console.error('No file handle available')\n      return\n    }\n\n    this.abortController = new AbortController()\n    this.statusValue = 'uploading'\n    this.isUploading = true\n    this.lastProgressAt = Date.now()\n\n    // Start stall detection\n    this.startStallDetection()\n\n    try {\n      const file = this.fileHandle // file is already a File object\n      const totalSize = file.size\n\n      while (this.currentChunk < this.totalChunks) {\n        if (this.abortController.signal.aborted) break\n\n        const start = this.currentChunk * this.CHUNK_SIZE\n        const end = Math.min(start + this.CHUNK_SIZE, file.size)\n        let chunk = file.slice(start, end)\n\n        // Get presigned URL for this chunk\n        const response = await fetch(`/game_analyses/${this.gameAnalysisIdValue}/video_files/${this.videoFileIdValue}?chunk_number=${this.currentChunk}&total_chunks=${this.totalChunks}`, {\n          method: 'GET',\n          headers: {\n            'Accept': 'application/json',\n            'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]').content\n          }\n        })\n\n        if (!response.ok) {\n          const errorText = await response.text()\n          console.error('Failed to get presigned URL:', errorText)\n          throw new Error(`Failed to get presigned URL: ${errorText}`)\n        }\n\n        const { url, fields } = await response.json()\n        console.log('Presigned URL:', url)\n        console.log('Presigned fields:', fields)\n\n        // Upload chunk to S3\n        let formData = new FormData()\n        Object.entries(fields).forEach(([key, value]) => {\n          formData.append(key, value)\n        })\n        formData.append('file', chunk)\n\n        const uploadResponse = await fetch(url, {\n          method: 'POST',\n          body: formData,\n          signal: this.abortController.signal,\n          mode: 'cors',\n          credentials: 'omit'\n        })\n\n        if (!uploadResponse.ok) {\n          const errorText = await uploadResponse.text()\n          console.error('Upload failed:', errorText)\n          throw new Error(`Failed to upload chunk: ${errorText}`)\n        }\n\n        // Clean up memory after successful chunk upload\n        chunk = null\n        formData = null\n\n        // Force garbage collection every 10 chunks to prevent memory buildup\n        if (this.currentChunk % 10 === 0) {\n          if (window.gc) window.gc();\n        }\n\n        this.currentChunk++\n        this.uploadedBytes = this.currentChunk * this.CHUNK_SIZE\n        if (this.uploadedBytes > totalSize) {\n          this.uploadedBytes = totalSize\n        }\n\n        // Update progress timestamp\n        this.lastProgressAt = Date.now()\n\n        this.updateProgress()\n\n        // Update the video file's progress\n        await this.updateVideoFileState()\n\n        // Dispatch progress event\n        this.dispatchProgress()\n      }\n\n      if (!this.abortController.signal.aborted) {\n        // Mark the upload as complete\n        await this.updateVideoFileState(true)\n        this.statusValue = 'uploaded'\n        this.isUploading = false\n        this.stopStallDetection()\n\n        // Dispatch completion event\n        this.element.dispatchEvent(new CustomEvent('video-file:complete', {\n          bubbles: true,\n          detail: {\n            videoFileId: this.videoFileIdValue\n          }\n        }))\n      }\n    } catch (error) {\n      // Don't treat abort errors as actual errors - they're expected during restart\n      if (error.name === 'AbortError') {\n        console.log('Upload aborted (expected during restart)')\n        return\n      }\n\n      console.error('Upload error:', error)\n      this.statusValue = 'error'\n      this.isUploading = false\n      this.stopStallDetection()\n    }\n  }\n\n  async updateVideoFileState(isComplete = false) {\n    const progress = (this.currentChunk / this.totalChunks) * 100\n    const response = await fetch(`/game_analyses/${this.gameAnalysisIdValue}/video_files/${this.videoFileIdValue}`, {\n      method: 'PATCH',\n      headers: {\n        'Content-Type': 'application/json',\n        'Accept': 'application/json',\n        'X-CSRF-Token': document.querySelector('meta[name=\"csrf-token\"]').content\n      },\n      body: JSON.stringify({\n        video_file: {\n          state: isComplete ? 'uploaded' : 'uploading',\n          upload_progress: progress\n        }\n      })\n    })\n\n    if (!response.ok) {\n      throw new Error('Failed to update video file state')\n    }\n  }\n\n  cancelUpload() {\n    // Perform cleanup first, before aborting\n    this.isUploading = false\n    this.statusValue = 'waiting'\n    this.stopStallDetection()\n\n    if (this.abortController) {\n      this.abortController.abort()\n      this.abortController = null\n    }\n  }\n\n  restartUpload() {\n    console.log(`Restarting upload for ${this.fileNameValue}`)\n    this.cancelUpload()\n    // Small delay to ensure abort is processed before restarting\n    setTimeout(() => {\n      if (this.fileHandle && this.statusValue !== 'uploaded') {\n        this.startUpload()\n      }\n    }, 100)\n  }\n\n  isStalled(timeoutMs = 30000) {\n    if (!this.isUploading || !this.lastProgressAt) {\n      return false\n    }\n    return (Date.now() - this.lastProgressAt) > timeoutMs\n  }\n\n  updateProgress() {\n    const progress = (this.currentChunk / this.totalChunks) * 100\n    this.progressBarTarget.style.width = `${progress}%`\n\n    // set the uploading container to visible and set the value to the total mb's uploaded\n    this.uploadingContainerTarget.classList.remove('hidden')\n    this.uploadingContainerTarget.textContent = `${Math.round(this.uploadedBytes / 1024 / 1024)} MB`\n  }\n\n  statusValueChanged() {\n    this.progressBarContainerTarget.classList.toggle('hidden', this.statusValue === 'uploaded' || this.statusValue === 'waiting')\n    this.completeContainerTarget.classList.toggle('hidden', this.statusValue !== 'uploaded')\n    this.waitingContainerTarget.classList.toggle('hidden', this.statusValue !== 'waiting')\n    this.uploadingContainerTarget.classList.toggle('hidden', this.statusValue !== 'uploading')\n  }\n\n  dispatchProgress() {\n    if (!this.fileHandle) return\n\n    const totalSize = this.fileHandle.size\n\n    this.element.dispatchEvent(new CustomEvent('video-file:progress', {\n      bubbles: true,\n      detail: {\n        videoFileId: this.videoFileIdValue,\n        totalSize: totalSize,\n        uploadedBytes: Math.min(this.uploadedBytes, totalSize)\n      }\n    }))\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Game::Analysis::VideoPlayer\n *\n * Manages video clip display for selected shots\n */\nexport default class extends Controller {\n  connect() {\n    console.log(\"Video player component controller connected\")\n  }\n\n  /**\n   * Handle shot selection to load video\n   * @param {CustomEvent} event - Event with sequenceId in detail\n   */\n  loadVideo(event) {\n    const sequenceId = event.detail.sequenceId\n    console.log(\"Loading video for sequence:\", sequenceId)\n\n    // The turbo frame will handle loading the video\n    // This method is here for potential future enhancements\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\n    // Steps\n    \"step\", \"stepCircle\", \"connector\",\n    // Step 1\n    \"seasonSelect\", \"mhrYearInput\", \"gameTypeSelect\",\n    \"tournamentSection\", \"existingTournamentFields\", \"newTournamentFields\",\n    \"existingTournamentTab\", \"newTournamentTab\", \"tournamentEventIdField\",\n    // Step 2\n    \"yourTeamIsHome\", \"homeBtn\", \"awayBtn\", \"yourTeamWrapper\",\n    // Step 3\n    \"opponentWrapper\", \"yourTeamNameDisplay\", \"opponentTeamNameDisplay\",\n    \"yourSideLabel\", \"opponentSideLabel\"\n  ]\n\n  static values = {\n    currentStep: { type: Number, default: 1 },\n    totalSteps: { type: Number, default: 3 }\n  }\n\n  connect() {\n    const form = this.element.closest('form')\n    this.footerSubmitBtn = form?.querySelector('[type=\"submit\"]')\n    if (this.footerSubmitBtn) {\n      this.finalSubmitText = this.footerSubmitBtn.textContent.trim()\n    }\n\n    if (form) {\n      this.boundHandleSubmit = this.handleFormSubmit.bind(this)\n      form.addEventListener('submit', this.boundHandleSubmit)\n    }\n\n    this.goToStep(1)\n\n    if (this.hasGameTypeSelectTarget) {\n      this.updateGameType()\n    }\n\n    // \"Existing tournament\" is the default tab \u2014 disable the hidden field on load\n    if (this.hasTournamentEventIdFieldTarget) {\n      this.tournamentEventIdFieldTarget.disabled = true\n    }\n  }\n\n  disconnect() {\n    const form = this.element.closest('form')\n    if (form && this.boundHandleSubmit) {\n      form.removeEventListener('submit', this.boundHandleSubmit)\n    }\n  }\n\n  // \u2500\u2500 Step navigation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  handleFormSubmit(event) {\n    if (this.currentStepValue < this.totalStepsValue) {\n      event.preventDefault()\n      event.stopImmediatePropagation()\n      this.nextStep()\n    }\n  }\n\n  nextStep() {\n    if (this.currentStepValue >= this.totalStepsValue) return\n    if (!this.validateStep(this.currentStepValue)) return\n    this.goToStep(this.currentStepValue + 1)\n  }\n\n  prevStep() {\n    if (this.currentStepValue <= 1) return\n    this.goToStep(this.currentStepValue - 1)\n  }\n\n  goToStep(n) {\n    this.currentStepValue = n\n\n    this.stepTargets.forEach(step => {\n      step.classList.toggle('hidden', parseInt(step.dataset.step) !== n)\n    })\n\n    this.stepCircleTargets.forEach(circle => {\n      const stepNum = parseInt(circle.dataset.step)\n      const done = stepNum < n\n      const active = stepNum === n\n      circle.classList.toggle('bg-brand-600', active || done)\n      circle.classList.toggle('text-white', active || done)\n      circle.classList.toggle('border-brand-600', active || done)\n      circle.classList.toggle('border-gray-300', !active && !done)\n      circle.classList.toggle('text-gray-400', !active && !done)\n      circle.textContent = done ? '\u2713' : stepNum\n    })\n\n    this.connectorTargets.forEach(connector => {\n      const afterStep = parseInt(connector.dataset.afterStep)\n      connector.classList.toggle('bg-brand-600', afterStep < n)\n      connector.classList.toggle('bg-gray-300', afterStep >= n)\n    })\n\n    if (this.footerSubmitBtn) {\n      this.footerSubmitBtn.textContent = n < this.totalStepsValue\n        ? 'Next \u2192'\n        : (this.finalSubmitText || 'Create Game')\n    }\n\n    this.updateBackButton(n)\n  }\n\n  updateBackButton(n) {\n    if (!this.footerSubmitBtn) return\n    const footer = this.footerSubmitBtn.closest('.w-full.flex')\n    if (!footer) return\n\n    let backBtn = footer.querySelector('[data-game-form-back]')\n\n    if (n > 1) {\n      if (!backBtn) {\n        backBtn = document.createElement('button')\n        backBtn.type = 'button'\n        backBtn.dataset.gameFormBack = 'true'\n        backBtn.className = 'mr-3 px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-brand-500'\n        backBtn.addEventListener('click', () => this.prevStep())\n        footer.insertBefore(backBtn, this.footerSubmitBtn)\n      }\n      backBtn.textContent = '\u2190 Back'\n      backBtn.classList.remove('hidden')\n    } else if (backBtn) {\n      backBtn.classList.add('hidden')\n    }\n  }\n\n  // \u2500\u2500 Validation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  validateStep(n) {\n    const stepEl = this.stepTargets.find(s => parseInt(s.dataset.step) === n)\n    if (!stepEl) return true\n\n    const required = stepEl.querySelectorAll('input[required], select[required]')\n    for (const input of required) {\n      if (!input.checkValidity()) {\n        input.reportValidity()\n        return false\n      }\n    }\n\n    if (n === 2) {\n      const teamId = stepEl.querySelector('[name=\"hockey_game[your_team_id]\"]')?.value\n      if (!teamId) {\n        const display = stepEl.querySelector('[data-team-season-typeahead-target=\"input\"]')\n        if (display) {\n          display.setCustomValidity('Select a team from the search results.')\n          display.reportValidity()\n          display.setCustomValidity('')\n        }\n        return false\n      }\n    }\n\n    if (n === 3) {\n      const opponentId = stepEl.querySelector('[name=\"hockey_game[opponent_team_id]\"]')?.value\n      if (!opponentId) {\n        const display = stepEl.querySelector('[data-team-season-typeahead-target=\"input\"]')\n        if (display) {\n          display.setCustomValidity('Select an opponent team from the search results.')\n          display.reportValidity()\n          display.setCustomValidity('')\n        }\n        return false\n      }\n    }\n\n    return true\n  }\n\n  // \u2500\u2500 Step 1: Game details \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  updateSeason(event) {\n    const seasonStr = event.target.value\n    const year = parseInt(seasonStr.split('-')[0])\n    const label = event.target.selectedOptions[0]?.text || seasonStr\n\n    if (this.hasMhrYearInputTarget) {\n      this.mhrYearInputTarget.value = year\n    }\n    if (this.hasYourTeamWrapperTarget) {\n      this.setTypeaheadSeason(this.yourTeamWrapperTarget, seasonStr, label)\n    }\n    if (this.hasOpponentWrapperTarget) {\n      this.setTypeaheadSeason(this.opponentWrapperTarget, seasonStr, label)\n    }\n  }\n\n  setTypeaheadSeason(wrapper, season, label) {\n    const el = wrapper.querySelector('[data-controller~=\"team-season-typeahead\"]')\n    if (!el) return\n    el.dataset.teamSeasonTypeaheadYearValue = season\n    const labelEl = el.querySelector('[data-team-season-typeahead-target=\"seasonLabel\"]')\n    if (labelEl) labelEl.textContent = label\n  }\n\n  updateGameType() {\n    if (!this.hasGameTypeSelectTarget) return\n    const gameType = this.gameTypeSelectTarget.value\n    if (this.hasTournamentSectionTarget) {\n      this.tournamentSectionTarget.classList.toggle('hidden', gameType !== 'tournament')\n    }\n  }\n\n  selectExistingTournament() {\n    this.existingTournamentFieldsTarget.classList.remove('hidden')\n    this.newTournamentFieldsTarget.classList.add('hidden')\n    this.existingTournamentTabTarget.classList.add('bg-brand-600', 'text-white')\n    this.existingTournamentTabTarget.classList.remove('text-brand-700', 'hover:bg-brand-100')\n    this.newTournamentTabTarget.classList.remove('bg-brand-600', 'text-white')\n    this.newTournamentTabTarget.classList.add('text-brand-700', 'hover:bg-brand-100')\n    // Disable hidden field so it doesn't override the select on submit\n    if (this.hasTournamentEventIdFieldTarget) {\n      this.tournamentEventIdFieldTarget.disabled = true\n    }\n    const select = this.existingTournamentFieldsTarget.querySelector('select')\n    if (select) select.disabled = false\n  }\n\n  selectNewTournament() {\n    this.newTournamentFieldsTarget.classList.remove('hidden')\n    this.existingTournamentFieldsTarget.classList.add('hidden')\n    this.newTournamentTabTarget.classList.add('bg-brand-600', 'text-white')\n    this.newTournamentTabTarget.classList.remove('text-brand-700', 'hover:bg-brand-100')\n    this.existingTournamentTabTarget.classList.remove('bg-brand-600', 'text-white')\n    this.existingTournamentTabTarget.classList.add('text-brand-700', 'hover:bg-brand-100')\n    // Disable the existing select so it doesn't submit; enable the hidden field\n    const select = this.existingTournamentFieldsTarget.querySelector('select')\n    if (select) select.disabled = true\n    if (this.hasTournamentEventIdFieldTarget) {\n      this.tournamentEventIdFieldTarget.disabled = false\n      this.tournamentEventIdFieldTarget.value = ''\n    }\n  }\n\n  // \u2500\u2500 Step 2: Home/Away \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  setHome() {\n    if (this.hasYourTeamIsHomeTarget) this.yourTeamIsHomeTarget.value = 'true'\n    if (this.hasHomeBtnTarget) {\n      this.homeBtnTarget.classList.add('bg-brand-600', 'text-white')\n      this.homeBtnTarget.classList.remove('text-gray-700', 'bg-white', 'hover:bg-gray-50')\n    }\n    if (this.hasAwayBtnTarget) {\n      this.awayBtnTarget.classList.remove('bg-brand-600', 'text-white')\n      this.awayBtnTarget.classList.add('text-gray-700', 'bg-white', 'hover:bg-gray-50')\n    }\n    this.updateSideLabels(true)\n  }\n\n  setAway() {\n    if (this.hasYourTeamIsHomeTarget) this.yourTeamIsHomeTarget.value = 'false'\n    if (this.hasAwayBtnTarget) {\n      this.awayBtnTarget.classList.add('bg-brand-600', 'text-white')\n      this.awayBtnTarget.classList.remove('text-gray-700', 'bg-white', 'hover:bg-gray-50')\n    }\n    if (this.hasHomeBtnTarget) {\n      this.homeBtnTarget.classList.remove('bg-brand-600', 'text-white')\n      this.homeBtnTarget.classList.add('text-gray-700', 'bg-white', 'hover:bg-gray-50')\n    }\n    this.updateSideLabels(false)\n  }\n\n  updateSideLabels(yourTeamIsHome) {\n    if (this.hasYourSideLabelTarget) {\n      this.yourSideLabelTarget.textContent = yourTeamIsHome ? 'HOME' : 'AWAY'\n      this.yourSideLabelTarget.classList.toggle('text-brand-700', yourTeamIsHome)\n      this.yourSideLabelTarget.classList.toggle('text-red-600', !yourTeamIsHome)\n    }\n    if (this.hasOpponentSideLabelTarget) {\n      this.opponentSideLabelTarget.textContent = yourTeamIsHome ? 'AWAY' : 'HOME'\n      this.opponentSideLabelTarget.classList.toggle('text-red-600', yourTeamIsHome)\n      this.opponentSideLabelTarget.classList.toggle('text-brand-700', !yourTeamIsHome)\n    }\n  }\n\n  // \u2500\u2500 Team selection callbacks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  yourTeamSelected(event) {\n    const name = event.detail?.text\n    if (name && this.hasYourTeamNameDisplayTarget) {\n      this.yourTeamNameDisplayTarget.textContent = name\n    }\n  }\n\n  opponentTeamSelected(event) {\n    const name = event.detail?.text\n    if (name && this.hasOpponentTeamNameDisplayTarget) {\n      this.opponentTeamNameDisplayTarget.textContent = name\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"statsSection\", \"placeholderRow\", \"showAllRow\", \"toggleIcon\"]\n  static values = { open: { type: Boolean, default: false } }\n\n  toggle() {\n    this.openValue = !this.openValue\n  }\n\n  openValueChanged() {\n    if (this.hasStatsSectionTarget) {\n      this.statsSectionTarget.classList.toggle(\"hidden\", !this.openValue)\n    }\n    this.toggleIconTargets.forEach(icon => {\n      icon.classList.toggle(\"-rotate-90\", this.openValue)\n      icon.classList.toggle(\"rotate-90\", !this.openValue)\n    })\n  }\n\n  showAll() {\n    this.placeholderRowTargets.forEach(row => row.classList.remove(\"hidden\"))\n    this.showAllRowTargets.forEach(row => row.classList.add(\"hidden\"))\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"timestampField\", \"periodField\"]\n\n  connect() {\n    // Set the hidden fields with the current values from URL parameters\n    const urlParams = new URLSearchParams(window.location.search)\n    const masterTimestamp = urlParams.get('master_timestamp')\n    const periodNumber = urlParams.get('period_number')\n\n    // If values are already set in the hidden fields (from server), don't override them\n    if (masterTimestamp && this.hasTimestampFieldTarget && !this.timestampFieldTarget.value) {\n      this.timestampFieldTarget.value = masterTimestamp\n    }\n\n    if (periodNumber && this.hasPeriodFieldTarget && !this.periodFieldTarget.value) {\n      this.periodFieldTarget.value = periodNumber\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  updateDurations(event) {\n    const duration = parseFloat(event.target.value)\n    const form = event.target.closest('form')\n\n    const durationBeforeInput = form.querySelector('input[name=\"review_manual_clip_point[duration_before]\"]')\n    const durationAfterInput = form.querySelector('input[name=\"review_manual_clip_point[duration_after]\"]')\n\n    if (durationBeforeInput) durationBeforeInput.value = duration\n    if (durationAfterInput) durationAfterInput.value = duration\n\n    // Update label styling\n    const labels = event.target.closest('.flex').querySelectorAll('label')\n    labels.forEach(label => {\n      label.classList.remove('bg-blue-600', 'text-white', 'border-blue-600')\n    })\n\n    const selectedLabel = form.querySelector(`label[for=\"${event.target.id}\"]`)\n    if (selectedLabel) {\n      selectedLabel.classList.add('bg-blue-600', 'text-white', 'border-blue-600')\n    }\n  }\n}\n", "// mobile_menu_controller.js\nimport {Controller} from \"@hotwired/stimulus\"\nimport {enter, leave} from 'el-transition';\n\nexport default class extends Controller {\n    static targets = [\"menu\", \"button\", \"overlay\"]\n    declare menuTarget: HTMLElement\n    declare overlayTarget: HTMLElement\n\n    toggleMenu() {\n        if (this.menuTarget.classList.contains('hidden')) {\n          enter(this.menuTarget)\n        } else {\n          leave(this.menuTarget)\n        }\n        this.overlayTarget.classList.toggle('hidden')\n    }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { enter, leave } from \"el-transition\"\n\nexport default class extends Controller {\n  static targets = [\"wrapper\", \"body\"]\n\n  connect() {\n    enter(this.wrapperTarget)\n    enter(this.bodyTarget)\n\n    console.log(\"trying to disable keybindings\")\n    document.addEventListener('turbo:submit-end', this.handleSubmit)\n    window.dispatchEvent(new CustomEvent(\"keybindings:disable\"))\n  }\n\n  disconnect() {\n    document.removeEventListener('turbo:submit-end', this.handleSubmit)\n    window.dispatchEvent(new CustomEvent(\"keybindings:enable\"))\n  }\n\n  close() {\n    leave(this.wrapperTarget)\n    leave(this.bodyTarget).then(() => {\n      // Remove the modal element after the fade out so it doesn't blanket the screen\n      this.element.remove()\n    })\n\n    // Remove src reference from parent frame element\n    // Without this, turbo won't re-open the modal on subsequent clicks\n    this.element.closest(\"turbo-frame\").src = undefined\n    window.dispatchEvent(new CustomEvent(\"keybindings:enable\"));\n  }\n\n  handleKeyup(e) {\n    if (e.code == \"Escape\") {\n      this.close()\n    }\n  }\n\n  handleSubmit = (e) => {\n    if (e.detail.success) {\n      this.close()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { Turbo } from \"@hotwired/turbo-rails\"\n\n// Navigates to the value of the changed element (e.g. a <select> whose <option>\n// values are destination URLs) via Turbo, so it behaves like a normal link click.\nexport default class extends Controller {\n  go(event) {\n    Turbo.visit(event.target.value)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\";\nimport autosize from \"autosize\";\n\nexport default class NestedFieldsController extends Controller {\n  // orderField is optional and just meant to be a convenience for orderable nested fields\n  static targets = [\"template\", \"inserter\", \"orderField\"];\n\n  declare templateTarget: HTMLElement;\n  declare inserterTargets: Array<HTMLElement>;\n  declare orderFieldTargets: Array<HTMLInputElement>;\n\n  addFields(event) {\n    event.preventDefault();\n    var inserter = (event.target as HTMLElement).closest(\n      '[data-nested-fields-target=\"inserter\"]'\n    );\n    var content = this.templateTarget.innerHTML.replace(\n      /NEW_RECORD/g,\n      new Date().getTime().toString()\n    );\n    inserter.insertAdjacentHTML(\n      inserter.getAttribute(\"data-nested-fields-insert\") as InsertPosition,\n      content\n    );\n    this.assignOrders();\n\n    // Notify the DOM to run the form prep methods\n    const prep_event = new CustomEvent(\"prep-forms\");\n    document.dispatchEvent(prep_event);\n  }\n\n  removeFields(event: Event) {\n    event.preventDefault();\n    let wrapper: HTMLElement = (event.target as HTMLElement).closest(\n      \".nested-field\"\n    );\n\n    // New records are simply removed from the page\n    if (wrapper.dataset.newRecord == \"true\") {\n      wrapper.remove();\n\n      // Existing records are hidden and flagged for deletion\n    } else {\n      (\n        wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement\n      ).value = \"1\";\n      wrapper.style.display = \"none\";\n    }\n  }\n\n  assignOrders() {\n    this.orderFieldTargets.forEach((orderField, index) => {\n      orderField.value = index.toString();\n    });\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Public::BiographicalInfo\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Public::BiographicalInfo controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Public::BiographicalInfo controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Public::GameCard\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Public::GameCard controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Public::GameCard controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Public::HighlightReel\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Public::HighlightReel controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Public::HighlightReel controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Public::RecentGamesGrid\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Public::RecentGamesGrid controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Public::RecentGamesGrid controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Public::TeamInfo\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Public::TeamInfo controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Public::TeamInfo controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Public::TrustIndicator\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Public::TrustIndicator controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Public::TrustIndicator controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    clipPointTimestamp: Number\n  }\n  static outlets = [\"review--player-component\", \"review--annotation--studio-component\"]\n\n  connect() {\n    this.setupEventListeners()\n    this.boundHandleKeydown = this.handleKeydown.bind(this)\n    document.addEventListener('keydown', this.boundHandleKeydown)\n  }\n\n  disconnect() {\n    document.removeEventListener('keydown', this.boundHandleKeydown)\n  }\n\n  setupEventListeners() {\n    document.addEventListener('player:initialized', (event) => {\n      console.log(\"Player initialized:\", event)\n      this.element.classList.remove('hidden')\n    })\n  }\n\n  handleKeydown(event) {\n    // Only handle spacebar if overlay is visible\n    if (this.element.classList.contains('hidden')) return\n\n    if (event.key === ' ' || event.key === 'Spacebar') {\n      event.preventDefault()\n      this.beginReview()\n    }\n  }\n\n  beginReview() {\n    console.log(\"Beginning review sequence\")\n\n    // Hide the overlay\n    this.element.classList.add('hidden')\n\n    // Call the annotation studio controller's playShotSequence method\n    this.reviewAnnotationStudioComponentOutlet.playShotSequence(this.clipPointTimestampValue)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"cell\"]\n  static values = {\n    xRegion: String,\n    yRegion: String,\n    inputNameX: String,\n    inputNameY: String,\n    fieldNames: Array\n  }\n  static outlets = ['review--annotation--event-form-component', 'review--annotation--ice-map-component']\n\n  connect() {\n    console.log(\"Grid component controller connected:\", this.inputNameXValue, this.inputNameYValue)\n    this.isActive = false\n    this.setupKeyboardListener()\n    this.registerWithForm()\n  }\n\n  disconnect() {\n    this.removeKeyboardListener()\n    this.unregisterFromForm()\n  }\n\n  registerWithForm() {\n    if (this.hasReviewAnnotationEventFormComponentOutlet) {\n      this.reviewAnnotationEventFormComponentOutlet.registerGridComponent(this)\n    }\n  }\n\n  unregisterFromForm() {\n    if (this.hasReviewAnnotationEventFormComponentOutlet) {\n      this.reviewAnnotationEventFormComponentOutlet.unregisterGridComponent(this)\n    }\n  }\n\n  setupKeyboardListener() {\n    this.boundHandleKeydown = this.handleKeydown.bind(this)\n    document.addEventListener('keydown', this.boundHandleKeydown)\n  }\n\n  removeKeyboardListener() {\n    if (this.boundHandleKeydown) {\n      document.removeEventListener('keydown', this.boundHandleKeydown)\n    }\n  }\n\n  handleKeydown(event) {\n    // Only handle if this grid is active\n    if (!this.isActive) return\n\n    // Only handle digit keys 1-9 for grid selection\n    const key = event.key\n    if (!/^[1-9]$/.test(key)) return\n\n    // Map numpad to grid positions\n    const gridMapping = {\n      '7': { x: 'left', y: 'top' },\n      '8': { x: 'middle', y: 'top' },\n      '9': { x: 'right', y: 'top' },\n      '4': { x: 'left', y: 'middle' },\n      '5': { x: 'middle', y: 'middle' },\n      '6': { x: 'right', y: 'middle' },\n      '1': { x: 'left', y: 'bottom' },\n      '2': { x: 'middle', y: 'bottom' },\n      '3': { x: 'right', y: 'bottom' }\n    }\n\n    const position = gridMapping[key]\n    if (!position) return\n\n    // Find the cell matching this position\n    const targetCell = this.element.querySelector(`[data-x-region=\"${position.x}\"][data-y-region=\"${position.y}\"]`)\n    if (!targetCell) return\n\n    // Prevent default behavior\n    event.preventDefault()\n\n    // Select the cell\n    this.selectCellByElement(targetCell)\n  }\n\n  selectCell(event) {\n    const cell = event.currentTarget\n    this.selectCellByElement(cell)\n  }\n\n  selectCellByElement(cell) {\n    const domXRegion = cell.dataset.xRegion\n    const yRegion = cell.dataset.yRegion\n    const xRegion = this.shouldMirrorXRegion() ? this.mirrorXRegion(domXRegion) : domXRegion\n\n    console.log(\"Grid cell selected:\", xRegion, yRegion)\n\n    // Update visual state\n    this.updateCellStyles(cell)\n\n    // Update values\n    this.xRegionValue = xRegion\n    this.yRegionValue = yRegion\n\n    // Dispatch custom event for parent controller\n    this.dispatchGridSelection()\n  }\n\n  updateCellStyles(selectedCell) {\n    // Reset all cells\n    this.cellTargets.forEach(cell => {\n      cell.classList.remove('bg-blue-200')\n      cell.classList.add('bg-gray-50')\n    })\n\n    // Highlight selected cell\n    selectedCell.classList.remove('bg-gray-50')\n    selectedCell.classList.add('bg-blue-200')\n  }\n\n  dispatchGridSelection() {\n    // Create event data with field names and values\n    const eventData = {}\n\n    this.fieldNamesValue.forEach(fieldName => {\n      if (fieldName.includes('x_region') || fieldName.includes('intended_x_region')) {\n        eventData[fieldName] = this.xRegionValue\n      } else if (fieldName.includes('y_region') || fieldName.includes('intended_y_region')) {\n        eventData[fieldName] = this.yRegionValue\n      }\n    })\n\n    // Dispatch event to parent form controller\n    const gridSelectionEvent = new CustomEvent('grid-component:selection-changed', {\n      detail: {\n        fieldNames: this.fieldNamesValue,\n        values: eventData,\n        xRegion: this.xRegionValue,\n        yRegion: this.yRegionValue,\n        isComplete: this.isComplete()\n      },\n      bubbles: true\n    })\n\n    this.element.dispatchEvent(gridSelectionEvent)\n\n    // Notify form controller if grid is now complete\n    if (this.isComplete() && this.hasReviewAnnotationEventFormComponentOutlet) {\n      // Use a small delay to allow the form controller to update\n      setTimeout(() => {\n        this.reviewAnnotationEventFormComponentOutlet.handleFieldCompletion(this)\n      }, 100)\n    }\n  }\n\n  // Public method to set values programmatically\n  setValues(xRegion, yRegion) {\n    this.xRegionValue = xRegion\n    this.yRegionValue = yRegion\n\n    // Find and select the corresponding cell. The DOM's data-x-region is always fixed to\n    // physical left/right position, so when the grid is mirrored we need to invert the\n    // (already-canonical) xRegion back to find which physical cell represents it.\n    const domXRegion = this.shouldMirrorXRegion() ? this.mirrorXRegion(xRegion) : xRegion\n    const targetCell = this.element.querySelector(`[data-x-region=\"${domXRegion}\"][data-y-region=\"${yRegion}\"]`)\n    if (targetCell) {\n      this.updateCellStyles(targetCell)\n    }\n  }\n\n  // The net-location grid cells are always drawn in a fixed, shooter's-perspective\n  // left/middle/right layout. When the ice map is in its default (\"down\" / normal)\n  // orientation, cameras sit behind the net looking up-ice, so the reviewer's own\n  // left/right is mirrored relative to the shooter's perspective -- without this, the\n  // reviewer has to mentally flip left/right while clicking. When the ice map is rotated\n  // left or right (camera filming a side goal), the viewer's left/right already matches\n  // the net's left/right, so no mirroring is needed.\n  shouldMirrorXRegion() {\n    if (!this.hasReviewAnnotationIceMapComponentOutlet) return false\n\n    const rotation = this.reviewAnnotationIceMapComponentOutlet.rotationValue\n    return rotation !== 'left' && rotation !== 'right'\n  }\n\n  mirrorXRegion(xRegion) {\n    if (xRegion === 'left') return 'right'\n    if (xRegion === 'right') return 'left'\n    return xRegion\n  }\n\n  // Public method to get current values\n  getValues() {\n    return {\n      xRegion: this.xRegionValue,\n      yRegion: this.yRegionValue\n    }\n  }\n\n  // Public method to check if the grid selection is complete\n  isComplete() {\n    return !!(this.xRegionValue && this.yRegionValue)\n  }\n\n  // Public method to reset the grid to initial state\n  reset() {\n    // Clear values\n    this.xRegionValue = ''\n    this.yRegionValue = ''\n\n    // Reset all cell styles\n    this.cellTargets.forEach(cell => {\n      cell.classList.remove('bg-blue-200')\n      cell.classList.add('bg-gray-50')\n    })\n  }\n\n  // Public API for form controller integration\n\n  isVisible() {\n    // Check if this grid is visible\n    // A grid is hidden if it or any parent has 'hidden' class\n    let element = this.element\n    while (element) {\n      if (element.classList && element.classList.contains('hidden')) {\n        return false\n      }\n      element = element.parentElement\n    }\n    return true\n  }\n\n  hasValue() {\n    return this.isComplete()\n  }\n\n  activate() {\n    this.isActive = true\n    // Visual indication that this grid is active\n    const fieldGroup = this.element.closest('.field-group')\n    if (!fieldGroup) return\n\n    const label = fieldGroup.querySelector('label')\n    if (!label) return\n\n    label.classList.add('text-blue-600', 'font-semibold')\n    label.classList.remove('text-gray-700')\n    fieldGroup.classList.add('ring-2', 'ring-blue-500', 'ring-offset-2', 'rounded-lg', 'p-2', '-m-2')\n  }\n\n  deactivate() {\n    this.isActive = false\n    // Remove visual indication\n    const fieldGroup = this.element.closest('.field-group')\n    if (!fieldGroup) return\n\n    const label = fieldGroup.querySelector('label')\n    if (!label) return\n\n    label.classList.remove('text-blue-600', 'font-semibold')\n    label.classList.add('text-gray-700')\n    fieldGroup.classList.remove('ring-2', 'ring-blue-500', 'ring-offset-2', 'rounded-lg', 'p-2', '-m-2')\n  }\n\n  // Helper method to get field name for logging/debugging\n  getFieldName() {\n    return this.fieldNamesValue.join('/')\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"playSituation\", \"rushFields\", \"inZoneFields\"]\n  static values = {\n    numRushAttackers: String,\n    numRushDefenders: String,\n    numAttackersOnIce: String,\n    numDefendersOnIce: String\n  }\n\n  connect() {\n    this.setupEventListeners()\n  }\n\n  setupEventListeners() {\n    this.element.addEventListener('radio-group:change', (event) => {\n      this.handleChange(event)\n    })\n  }\n\n  handleChange(event) {\n    console.log(\"Play situation field component controller handleChange\", event)\n    switch (event.detail.fieldName) {\n      case 'play_situation':\n        this.handlePlaySituationChange(event)\n        break\n      case 'num_rush_attackers':\n        this.numRushAttackersValue = event.detail.value\n        break\n      case 'num_rush_defenders':\n        this.numRushDefendersValue = event.detail.value\n        break\n      case 'num_attackers_on_ice':\n        this.numAttackersOnIceValue = event.detail.value\n        break\n      case 'num_defenders_on_ice':\n        this.numDefendersOnIceValue = event.detail.value\n        break\n    }\n\n    // Dispatch custom event to communicate with event form component\n    this.dispatchPlaySituationChange()\n  }\n\n  handlePlaySituationChange(event) {\n    const playSituation = event.detail.value\n    if (playSituation === 'rush') {\n      this.rushFieldsTarget.classList.remove('hidden')\n      this.enableContainedFields(this.rushFieldsTarget)\n      this.inZoneFieldsTarget.classList.add('hidden')\n      this.disableContainedFields(this.inZoneFieldsTarget)\n    } else if (playSituation === 'in_zone') {\n      this.rushFieldsTarget.classList.add('hidden')\n      this.disableContainedFields(this.rushFieldsTarget)\n      this.inZoneFieldsTarget.classList.remove('hidden')\n      this.enableContainedFields(this.inZoneFieldsTarget)\n    }\n  }\n\n  disableContainedFields(target) {\n    target.querySelectorAll('input').forEach(input => {\n      input.disabled = true\n    })\n  }\n\n  enableContainedFields(target) {\n    target.querySelectorAll('input').forEach(input => {\n      input.disabled = false\n    })\n  }\n\n  getRadioGroupValue(element) {\n    const controller = this.application.getControllerForElementAndIdentifier(element, 'review--annotation--custom-fields--radio-group-component')\n    return controller ? controller.selectedValue : null\n  }\n\n  // Public method to check if the play situation field is complete\n  isComplete() {\n    // Check if a play situation is selected\n    const playSituation = this.getRadioGroupValue(this.playSituationTarget)\n\n    if (!playSituation) {\n      return false\n    }\n    return this.checkFieldsComplete(playSituation)\n  }\n\n  checkFieldsComplete(playSituation) {\n    console.log(\"Checking fields complete for play situation:\", playSituation)\n    if (playSituation === 'rush') {\n      const attackersValid = this.numRushAttackersValue && this.numRushAttackersValue !== 'null' && this.numRushAttackersValue !== ''\n      const defendersValid = this.numRushDefendersValue && this.numRushDefendersValue !== 'null' && this.numRushDefendersValue !== ''\n      return !!(attackersValid && defendersValid)\n    } else if (playSituation === 'in_zone') {\n      const attackersValid = this.numAttackersOnIceValue && this.numAttackersOnIceValue !== 'null' && this.numAttackersOnIceValue !== ''\n      const defendersValid = this.numDefendersOnIceValue && this.numDefendersOnIceValue !== 'null' && this.numDefendersOnIceValue !== ''\n      return !!(attackersValid && defendersValid)\n    }\n    return false\n  }\n\n  dispatchPlaySituationChange() {\n    // Collect all current values\n    const values = {}\n\n    // Get play situation value\n    const playSituation = this.getRadioGroupValue(this.playSituationTarget)\n    if (playSituation) {\n      values.play_situation = playSituation\n    }\n\n    // Helper to check if value is valid (not empty, not \"null\" string)\n    const isValidValue = (value) => value && value !== '' && value !== 'null'\n\n    // Get rush field values if visible\n    if (!this.rushFieldsTarget.classList.contains('hidden')) {\n      if (isValidValue(this.numRushAttackersValue)) {\n        values.num_rush_attackers = this.numRushAttackersValue\n      }\n      if (isValidValue(this.numRushDefendersValue)) {\n        values.num_rush_defenders = this.numRushDefendersValue\n      }\n    }\n\n    // Get in-zone field values if visible\n    if (!this.inZoneFieldsTarget.classList.contains('hidden')) {\n      if (isValidValue(this.numAttackersOnIceValue)) {\n        values.num_attackers_on_ice = this.numAttackersOnIceValue\n      }\n      if (isValidValue(this.numDefendersOnIceValue)) {\n        values.num_defenders_on_ice = this.numDefendersOnIceValue\n      }\n    }\n\n    // Dispatch generic custom field event\n    console.log(\"Dispatching custom field event with values:\", values)\n    const customFieldEvent = new CustomEvent('custom-field:values-changed', {\n      detail: {\n        values: values\n      },\n      bubbles: true\n    })\n\n    this.element.dispatchEvent(customFieldEvent)\n  }\n\n  // Public method to reset the component state\n  reset() {\n    // Clear all value properties (use empty string, not null, to avoid \"null\" string serialization)\n    this.numRushAttackersValue = ''\n    this.numRushDefendersValue = ''\n    this.numAttackersOnIceValue = ''\n    this.numDefendersOnIceValue = ''\n\n    // Uncheck all radio buttons\n    this.element.querySelectorAll('input[type=\"radio\"]').forEach(input => {\n      input.checked = false\n    })\n\n    // Hide both rush and in-zone fields\n    this.rushFieldsTarget.classList.add('hidden')\n    this.inZoneFieldsTarget.classList.add('hidden')\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    fieldName: String,\n    default: String,\n    selected: String,\n  }\n\n  static targets = ['radioOption']\n  static outlets = ['review--annotation--event-form-component']\n\n  connect() {\n    // Set default value if not already set\n    // Check if we have a default value and selectedValue is not set\n    const hasDefault = this.hasDefaultValue && this.defaultValue !== ''\n    const needsDefaultValue = !this.selectedValue || this.selectedValue === ''\n\n    if (hasDefault && needsDefaultValue) {\n      this.selectedValue = this.defaultValue\n    }\n\n    this.updateRadioInputs()\n    this.updateRadioButtonStyles()\n\n    // Register with parent form controller AFTER setting defaults\n    // This way the parent form can immediately query our value\n    this.registerWithForm()\n\n    // If we have a value (either from default or already set), notify parent form immediately\n    // The radio group is now fully initialized, so we can dispatch synchronously\n    if (this.selectedValue && this.selectedValue !== '') {\n      // Dispatch the event in the next microtask to ensure all controllers are connected\n      Promise.resolve().then(() => {\n        const customEvent = new CustomEvent('radio-group:change', {\n          detail: {\n            fieldName: this.fieldNameValue,\n            value: this.selectedValue,\n            element: this.element\n          },\n          bubbles: true\n        })\n        this.element.dispatchEvent(customEvent)\n      })\n    }\n  }\n\n  disconnect() {\n    // Unregister from parent form controller\n    this.unregisterFromForm()\n  }\n\n  registerWithForm() {\n    if (this.hasReviewAnnotationEventFormComponentOutlet) {\n      this.reviewAnnotationEventFormComponentOutlet.registerRadioGroup(this)\n    }\n  }\n\n  unregisterFromForm() {\n    if (this.hasReviewAnnotationEventFormComponentOutlet) {\n      this.reviewAnnotationEventFormComponentOutlet.unregisterRadioGroup(this)\n    }\n  }\n\n  selectedValueChanged() {\n    this.updateRadioInputs()\n    this.updateRadioButtonStyles()\n\n    // Dispatch a custom event that bubbles up to parent components\n    const customEvent = new CustomEvent('radio-group:change', {\n      detail: {\n        fieldName: this.fieldNameValue,\n        value: this.selectedValue,\n        element: this.element\n      },\n      bubbles: true\n    })\n\n    this.element.dispatchEvent(customEvent)\n  }\n\n  handleChange(event) {\n    this.selectedValue = event.currentTarget.value\n  }\n\n  handleClick(event) {\n    // If the clicked radio button is already selected, the change event won't fire\n    // In this case, we need to manually trigger the advancement logic\n    const clickedValue = event.currentTarget.value\n    if (clickedValue === this.selectedValue) {\n      console.log(`Radio button ${clickedValue} clicked but already selected, manually triggering advancement`)\n\n      // Dispatch the same custom event that selectedValueChanged() dispatches\n      const customEvent = new CustomEvent('radio-group:change', {\n        detail: {\n          fieldName: this.fieldNameValue,\n          value: this.selectedValue,\n          element: this.element\n        },\n        bubbles: true\n      })\n\n      this.element.dispatchEvent(customEvent)\n    }\n  }\n\n  getRadioTargetForValue(value) {\n    return this.radioOptionTargets.find(target => target.value === value)\n  }\n\n  updateRadioInputs() {\n    this.radioOptionTargets.forEach(target => {\n      target.checked = target.value === this.selectedValue\n    })\n  }\n\n  updateRadioButtonStyles(){\n    this.radioOptionTargets.forEach(target => {\n      const label = target.closest('label')\n      const circle = label.querySelector('.w-4.h-4')\n      const dot = circle?.querySelector('.w-2.h-2')\n\n      if (target.value === this.selectedValue) {\n        // Selected state\n        label.classList.add('border-blue-500', 'bg-blue-50')\n        label.classList.remove('border-gray-200')\n        circle?.classList.add('border-blue-500')\n        circle?.classList.remove('border-gray-300')\n        dot?.classList.remove('opacity-0', 'scale-0')\n        dot?.classList.add('opacity-100', 'scale-100')\n      } else {\n        // Unselected state\n        label.classList.remove('border-blue-500', 'bg-blue-50')\n        label.classList.add('border-gray-200')\n        circle?.classList.remove('border-blue-500')\n        circle?.classList.add('border-gray-300')\n        dot?.classList.add('opacity-0', 'scale-0')\n        dot?.classList.remove('opacity-100', 'scale-100')\n      }\n    })\n  }\n\n  // Public API for parent form controller\n\n  isVisible() {\n    // Check if this radio group is visible\n    // A group is hidden if it or any parent has 'hidden' class\n    let element = this.element\n    while (element) {\n      if (element.classList && element.classList.contains('hidden')) {\n        return false\n      }\n      element = element.parentElement\n    }\n    return true\n  }\n\n  hasValue() {\n    return !!(this.selectedValue && this.selectedValue !== '')\n  }\n\n  selectOption(value) {\n    // Programmatically select an option by value\n    const radio = this.radioOptionTargets.find(target => target.value === value)\n    if (radio) {\n      const wasAlreadySelected = (this.selectedValue === value)\n      this.selectedValue = value\n\n      // If the value was already selected, Stimulus won't fire selectedValueChanged()\n      // So we need to manually dispatch the event to trigger advancement\n      if (wasAlreadySelected) {\n        console.log(`selectOption(${value}) called but value was already selected, manually dispatching event`)\n\n        const customEvent = new CustomEvent('radio-group:change', {\n          detail: {\n            fieldName: this.fieldNameValue,\n            value: this.selectedValue,\n            element: this.element\n          },\n          bubbles: true\n        })\n\n        this.element.dispatchEvent(customEvent)\n      }\n\n      return true\n    }\n    return false\n  }\n\n  getOptions() {\n    // Return array of available option values\n    return this.radioOptionTargets.map(target => target.value)\n  }\n\n  // Look up an option's value by its displayed keyboard shortcut digit (data-shortcut),\n  // not by DOM position -- the numpad layout (see RadioGroupComponent#numpad_layout)\n  // reorders options in the DOM (1-3 on the bottom row, 4-6 above, etc.), so DOM\n  // position and the displayed shortcut number are not the same thing.\n  getOptionForShortcut(key) {\n    const target = this.radioOptionTargets.find(target => target.dataset.shortcut === key)\n    return target ? target.value : null\n  }\n\n  activate() {\n    // Visual indication that this group is active\n    const fieldGroup = this.element.closest('.field-group')\n    if (!fieldGroup) return\n\n    const label = fieldGroup.querySelector('label')\n    if (!label) return\n\n    label.classList.add('text-blue-600', 'font-semibold')\n    label.classList.remove('text-gray-700')\n    fieldGroup.classList.add('ring-2', 'ring-blue-500', 'ring-offset-2', 'rounded-lg', 'p-2', '-m-2')\n  }\n\n  deactivate() {\n    // Remove visual indication\n    const fieldGroup = this.element.closest('.field-group')\n    if (!fieldGroup) return\n\n    const label = fieldGroup.querySelector('label')\n    if (!label) return\n\n    label.classList.remove('text-blue-600', 'font-semibold')\n    label.classList.add('text-gray-700')\n    fieldGroup.classList.remove('ring-2', 'ring-blue-500', 'ring-offset-2', 'rounded-lg', 'p-2', '-m-2')\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\n    \"eventTypeSelector\", \"eventTypeButton\", \"multiStepForm\", \"stepContent\", \"progressStep\",\n    \"radioGroup\", \"customField\", \"backButton\", \"nextButton\", \"nextButtonText\",\n    \"xCoordinate\", \"yCoordinate\", \"eventTimestamp\", \"attributeForm\"\n  ]\n  static values = {\n    coordinates: Object,\n    currentEventType: String,\n    currentStep: { type: Number, default: 1 },\n    totalSteps: Number,\n    stepData: { type: Object, default: {} },\n    previousEventType: String,\n    editMode: { type: Boolean, default: false },\n    editEventId: String\n  }\n  static outlets = [\"review--annotation--ice-map-component\", \"review--player-component\", \"review--annotation--event-sequence-component\"]\n\n  // Define event type transitions (matching the Ruby component logic)\n  static eventTypeTransitions = {\n    initial: ['carry', 'battle', 'shot', 'pass', 'dump_in', 'loose_puck', 'faceoff', 'puck_play'],\n    carry: ['pass', 'dump_in', 'shot', 'carry', 'battle', 'loose_puck', 'puck_play'],\n    battle: ['carry', 'shot', 'loose_puck', 'pass', 'puck_play'],\n    pass: ['carry', 'shot', 'pass', 'dump_in', 'rebound', 'catch', 'freeze', 'tip', 'deflection', 'battle', 'goal', 'loose_puck', 'puck_play'],\n    dump_in: ['carry', 'shot', 'pass', 'dump_in', 'catch', 'freeze', 'tip', 'deflection', 'battle', 'goal', 'loose_puck', 'puck_play'],\n    // puck_play covers e.g. a wide shot the goalie still plays (pad redirect creating a\n    // rebound, or a freeze) -- Review::EventSequence#extract_shots_on_goal already handles\n    // this case server-side by checking the shot's on_net? trajectory when the outcome is a\n    // puck_play, same as it does for dump_in.\n    shot: ['tip', 'deflection', 'goal', 'rebound', 'catch', 'freeze', 'puck_play'],\n    tip: ['goal', 'rebound', 'catch', 'freeze', 'tip', 'deflection', 'battle', 'pass', 'dump_in', 'loose_puck', 'puck_play'],\n    deflection: ['goal', 'rebound', 'catch', 'freeze', 'tip', 'deflection', 'battle', 'pass', 'dump_in', 'loose_puck', 'shot', 'carry', 'puck_play'],\n    rebound: ['shot','tip', 'deflection', 'battle', 'pass', 'dump_in', 'carry', 'out_of_play', 'loose_puck', 'puck_play'],\n    loose_puck: ['pass', 'dump_in', 'carry', 'battle', 'shot', 'freeze', 'puck_play'],\n    catch: [],\n    freeze: [],\n    goal: [],\n    out_of_play: [],\n    play_stoppage: [],\n    faceoff: ['carry', 'battle', 'shot', 'pass', 'dump_in', 'loose_puck', 'tip', 'deflection'],\n    puck_play: ['shot', 'tip', 'deflection', 'battle', 'pass', 'dump_in', 'carry', 'out_of_play', 'loose_puck'],\n  }\n\n  get isOpen() {\n    return !this.element.classList.contains('hidden')\n  }\n\n  connect() {\n    console.log(\"Event sequence form controller connected\")\n\n    // Initialize field component registries\n    this.radioGroups = []\n    this.gridComponents = []\n    this.activeFieldIndex = 0\n\n    // Debounce flag to prevent duplicate nextStep/saveEvent calls\n    this.isAdvancing = false\n\n    this.setupEventListeners()\n  }\n\n  // Radio Group Registry Methods\n  registerRadioGroup(radioGroupController) {\n    if (!this.radioGroups.includes(radioGroupController)) {\n      this.radioGroups.push(radioGroupController)\n      console.log(`Registered radio group: ${radioGroupController.fieldNameValue}, total: ${this.radioGroups.length}`)\n\n      // Note: Do not auto-activate here. Activation should only happen:\n      // 1. When selecting an event type (handled in selectEventType)\n      // 2. When user presses arrow keys (handled in handleKeydown)\n      // 3. When a field completes and advances (handled in handleFieldCompletion)\n    }\n  }\n\n  unregisterRadioGroup(radioGroupController) {\n    const index = this.radioGroups.indexOf(radioGroupController)\n    if (index > -1) {\n      this.radioGroups.splice(index, 1)\n      console.log(`Unregistered radio group, total: ${this.radioGroups.length}`)\n\n      // Adjust active index if needed\n      if (this.activeFieldIndex >= this.getAllVisibleFields().length) {\n        this.activeFieldIndex = Math.max(0, this.getAllVisibleFields().length - 1)\n      }\n    }\n  }\n\n  // Grid Component Registry Methods\n  registerGridComponent(gridComponentController) {\n    if (!this.gridComponents.includes(gridComponentController)) {\n      this.gridComponents.push(gridComponentController)\n      console.log(`Registered grid component: ${gridComponentController.getFieldName()}, total: ${this.gridComponents.length}`)\n\n      // Note: Do not auto-activate here. Activation should only happen:\n      // 1. When selecting an event type (handled in selectEventType)\n      // 2. When user presses arrow keys (handled in handleKeydown)\n      // 3. When a field completes and advances (handled in handleFieldCompletion)\n    }\n  }\n\n  unregisterGridComponent(gridComponentController) {\n    const index = this.gridComponents.indexOf(gridComponentController)\n    if (index > -1) {\n      this.gridComponents.splice(index, 1)\n      console.log(`Unregistered grid component, total: ${this.gridComponents.length}`)\n\n      // Adjust active index if needed\n      if (this.activeFieldIndex >= this.getAllVisibleFields().length) {\n        this.activeFieldIndex = Math.max(0, this.getAllVisibleFields().length - 1)\n      }\n    }\n  }\n\n  getVisibleRadioGroups() {\n    if (!this.radioGroups) {\n      console.warn('radioGroups not initialized')\n      return []\n    }\n    return this.radioGroups.filter(group => group.isVisible())\n  }\n\n  getVisibleGridComponents() {\n    if (!this.gridComponents) {\n      console.warn('gridComponents not initialized')\n      return []\n    }\n    return this.gridComponents.filter(grid => grid.isVisible())\n  }\n\n  // Get all visible field components (radio groups + grids) in order\n  getAllVisibleFields() {\n    const visibleRadioGroups = this.getVisibleRadioGroups()\n    const visibleGrids = this.getVisibleGridComponents()\n\n    // Combine and sort by DOM order\n    const allFields = [...visibleRadioGroups, ...visibleGrids]\n    allFields.sort((a, b) => {\n      const aPos = a.element.compareDocumentPosition(b.element)\n      return aPos & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n    })\n\n    return allFields\n  }\n\n  getActiveField() {\n    const visibleFields = this.getAllVisibleFields()\n    return visibleFields[this.activeFieldIndex]\n  }\n\n  activateField(index) {\n    const visibleFields = this.getAllVisibleFields()\n\n    // Deactivate all fields\n    visibleFields.forEach(field => field.deactivate())\n\n    // Activate the specified field\n    if (index >= 0 && index < visibleFields.length) {\n      this.activeFieldIndex = index\n      visibleFields[index].activate()\n      const fieldName = visibleFields[index].fieldNameValue || visibleFields[index].getFieldName()\n      console.log(`Activated field ${index}: ${fieldName}`)\n    }\n  }\n\n  advanceToNextVisibleField() {\n    const visibleFields = this.getAllVisibleFields()\n    if (this.activeFieldIndex < visibleFields.length - 1) {\n      this.activateField(this.activeFieldIndex + 1)\n      return true\n    }\n    return false\n  }\n\n  // Legacy method names for backward compatibility\n  getActiveRadioGroup() {\n    return this.getActiveField()\n  }\n\n  activateRadioGroup(index) {\n    this.activateField(index)\n  }\n\n  advanceToNextVisibleGroup() {\n    return this.advanceToNextVisibleField()\n  }\n\n  disconnect() {\n    // Cleanup if needed\n  }\n\n  setupEventListeners() {\n    // Listen for timestamp updates from video player\n    this.element.addEventListener('player:timeupdate', (event) => {\n      this.handleTimestampUpdate(event.detail)\n    })\n\n    this.element.addEventListener('radio-group:change', (event) => {\n      this.handleRadioGroupChange(event)\n    })\n\n    // Listen for grid component selection changes\n    this.element.addEventListener('grid-component:selection-changed', (event) => {\n      this.handleGridComponentSelection(event.detail)\n    })\n\n    // Listen for custom field value changes\n    this.element.addEventListener('custom-field:values-changed', (event) => {\n      this.handleCustomFieldValuesChanged(event.detail)\n    })\n\n    // Prevent form submission unless we're intentionally saving\n    this.element.addEventListener('submit', (event) => {\n      event.preventDefault()\n      return false\n    })\n\n    // Prevent Enter key from submitting any forms within this element\n    this.element.addEventListener('keypress', (event) => {\n      if (event.key === 'Enter' && this.isOpen) {\n        event.preventDefault()\n        return false\n      }\n    })\n  }\n\n  handleKeydown(event) {\n    // Only handle if form is open\n    if (!this.isOpen) return\n\n    const key = event.key\n\n    // Handle Page Up or '/' - go to previous step\n    if (key === 'PageUp' || key === '/') {\n      event.preventDefault()\n      this.previousStep()\n      return\n    }\n\n    // Handle '*' - go to next step (if current step is complete)\n    if (key === '*') {\n      event.preventDefault()\n      if (this.isCurrentStepComplete()) {\n        this.nextStep()\n      }\n      return\n    }\n\n    // Handle Enter - advance to next step or submit\n    if (key === 'Enter') {\n      event.preventDefault()\n      this.handleEnterKey()\n      return\n    }\n\n    // Handle arrow key navigation between radio groups\n    if (key === 'ArrowDown' || key === 'ArrowUp') {\n      event.preventDefault()\n      this.handleArrowKeyNavigation(key)\n      return\n    }\n\n    // Handle digit keys 0-9\n    if (!/^[0-9]$/.test(key)) return\n\n    event.preventDefault()\n\n    // If no event type selected yet, handle event type selection\n    console.log(`Digit key pressed: ${key}, currentEventTypeValue: \"${this.currentEventTypeValue}\"`)\n    if (!this.currentEventTypeValue || this.currentEventTypeValue === '') {\n      console.log('Handling event type selection...')\n      this.handleEventTypeKeypress(key)\n      return\n    }\n\n    // Otherwise, handle option selection in active radio group\n    const activeGroup = this.getActiveRadioGroup()\n    if (!activeGroup) return\n\n    // Try to select the option\n    const options = activeGroup.getOptions()\n    const isNumericOptions = options.every(opt => /^\\d+$/.test(opt))\n\n    let selectedValue = null\n\n    if (isNumericOptions) {\n      // For numeric options, match key to value\n      if (options.includes(key)) {\n        selectedValue = key\n      }\n    } else {\n      // For non-numeric options, match key to the option's displayed shortcut digit\n      // (data-shortcut) -- NOT DOM position. The numpad layout puts options 1-3 on\n      // the bottom row and 4+ above it, so DOM order != shortcut order.\n      if (key === '0') return\n      selectedValue = activeGroup.getOptionForShortcut(key)\n    }\n\n    if (!selectedValue) return\n\n    // Select the option\n    if (activeGroup.selectOption(selectedValue)) {\n      console.log(`Selected option ${selectedValue} in ${activeGroup.fieldNameValue}`)\n\n      // Note: Do NOT auto-advance here. The radio-group:change event will be fired,\n      // which triggers handleRadioGroupChange() which will handle advancement.\n      // If we advance here too, we'll skip fields (double advancement).\n    }\n  }\n\n  handleEventTypeKeypress(key) {\n    // Find event type button with matching shortcut key\n    const eventTypeButtons = this.element.querySelectorAll('[data-action*=\"review--annotation--event-form-component#handleSelectEventType\"]')\n\n    for (const button of eventTypeButtons) {\n      // Check if button is disabled\n      if (button.disabled) continue\n\n      // Get the shortcut from the button text (usually in a span with class containing the number)\n      const shortcutElement = button.querySelector('.absolute')\n      if (shortcutElement && shortcutElement.textContent.trim() === key) {\n        console.log(`Clicking event type button for shortcut ${key}`)\n        button.click()\n        return\n      }\n    }\n\n    console.log(`No event type button found for shortcut ${key}`)\n  }\n\n  handleEnterKey() {\n    // Check if we're on the last step and it's complete\n    if (this.currentStepValue === this.totalStepsValue && this.isCurrentStepComplete()) {\n      // Last step and complete - submit the form\n      this.saveEvent()\n    } else if (this.currentStepValue < this.totalStepsValue && this.isCurrentStepComplete()) {\n      // Not last step but current step is complete - advance to next step\n      this.nextStep()\n    }\n    // If current step is not complete, do nothing (don't advance or submit)\n  }\n\n  handleArrowKeyNavigation(key) {\n    console.log(`Arrow key pressed: ${key}, activeFieldIndex: ${this.activeFieldIndex}`)\n    const visibleFields = this.getAllVisibleFields()\n    console.log(`Visible fields count: ${visibleFields.length}`)\n    if (visibleFields.length === 0) return\n\n    if (key === 'ArrowDown') {\n      // Move to next field\n      if (this.activeFieldIndex < visibleFields.length - 1) {\n        console.log(`Moving down from ${this.activeFieldIndex} to ${this.activeFieldIndex + 1}`)\n        this.activateField(this.activeFieldIndex + 1)\n      } else {\n        console.log(`Already at last field (${this.activeFieldIndex})`)\n      }\n    } else if (key === 'ArrowUp') {\n      // Move to previous field\n      if (this.activeFieldIndex > 0) {\n        console.log(`Moving up from ${this.activeFieldIndex} to ${this.activeFieldIndex - 1}`)\n        this.activateField(this.activeFieldIndex - 1)\n      } else {\n        console.log(`Already at first field (${this.activeFieldIndex})`)\n      }\n    }\n  }\n\n  // Called by grid components when they complete a selection\n  handleFieldCompletion(fieldController) {\n    console.log(`Field completed: ${fieldController.getFieldName ? fieldController.getFieldName() : fieldController.fieldNameValue}`)\n\n    // Try to advance to next field\n    const advanced = this.advanceToNextVisibleField()\n    console.log(`Advanced to next field: ${advanced}`)\n\n    // If we couldn't advance (last field), check if step is complete\n    if (!advanced) {\n      const stepComplete = this.isCurrentStepComplete()\n      console.log(`Could not advance. Step complete: ${stepComplete}, Current step: ${this.currentStepValue}, Total steps: ${this.totalStepsValue}`)\n\n      if (stepComplete) {\n        console.log('Last field of step complete, calling nextStep()')\n        this.nextStep()\n      }\n    }\n  }\n\n  getCurrentStepRadioGroups() {\n    const currentForm = this.getCurrentMultiStepForm()\n    if (!currentForm) {\n      console.log('getCurrentStepRadioGroups: no current form found')\n      return []\n    }\n\n    const currentStepElement = currentForm.querySelector(`[data-step=\"${this.currentStepValue}\"][data-review--annotation--event-form-component-target=\"stepContent\"]:not(.hidden)`)\n    if (!currentStepElement) {\n      console.log(`getCurrentStepRadioGroups: no step element found for step ${this.currentStepValue}`)\n      return []\n    }\n\n    // Get all radio groups, but filter out:\n    // 1. Hidden ones\n    // 2. Ones that are inside custom field components (those are managed by the custom field's isComplete method)\n    const allGroups = Array.from(currentStepElement.querySelectorAll('[data-review--annotation--event-form-component-target=\"radioGroup\"]'))\n    console.log(`getCurrentStepRadioGroups: found ${allGroups.length} total radio groups in step ${this.currentStepValue}`)\n\n    const filteredGroups = allGroups.filter(group => {\n      // Check if this radio group is inside a custom field component\n      // Custom fields should be checked via their controller's isComplete() method\n      const customFieldParent = group.closest('[data-review--annotation--event-form-component-target=\"customField\"]')\n      if (customFieldParent) {\n        console.log('  - Filtering out radio group inside custom field')\n        return false\n      }\n\n      // Check if the group or any of its parents are hidden\n      let element = group\n      while (element && element !== currentStepElement) {\n        if (element.classList.contains('hidden')) {\n          console.log('  - Filtering out hidden radio group')\n          return false\n        }\n        element = element.parentElement\n      }\n      return true\n    })\n\n    console.log(`getCurrentStepRadioGroups: ${filteredGroups.length} radio groups after filtering`)\n    return filteredGroups\n  }\n\n  advanceAfterKeyboardSelection() {\n    // Re-query radio groups after selection (fields may have shown/hidden)\n    const radioGroups = this.getCurrentStepRadioGroups()\n\n    // Move to next visible radio group in current step\n    if (this.activeRadioGroupIndex < radioGroups.length - 1) {\n      this.activeRadioGroupIndex++\n      this.updateActiveRadioGroupHighlighting()\n    } else {\n      // Last radio group in step, check if step is complete\n      if (this.isCurrentStepComplete()) {\n        // Auto-advance to next step after a short delay\n        setTimeout(() => {\n          this.nextStep()\n          // Reset to first radio group in new step\n          this.activeRadioGroupIndex = 0\n          this.updateActiveRadioGroupHighlighting()\n        }, 300)\n      }\n    }\n  }\n\n  updateActiveRadioGroupHighlighting() {\n    const radioGroups = this.getCurrentStepRadioGroups()\n    console.log(`Updating highlighting for step ${this.currentStepValue}: found ${radioGroups.length} radio groups`)\n\n    // Ensure active index is within bounds (fields may have shown/hidden)\n    if (this.activeRadioGroupIndex >= radioGroups.length) {\n      this.activeRadioGroupIndex = Math.max(0, radioGroups.length - 1)\n    }\n\n    radioGroups.forEach((group, index) => {\n      const fieldGroup = group.closest('.field-group')\n      if (!fieldGroup) {\n        console.log(`Radio group at index ${index} has no field-group parent`)\n        return\n      }\n\n      const label = fieldGroup.querySelector('label')\n      if (!label) {\n        console.log(`Field group at index ${index} has no label`)\n        return\n      }\n\n      if (index === this.activeRadioGroupIndex) {\n        // Active state - add highlighting\n        console.log(`Highlighting radio group at index ${index}`)\n        label.classList.add('text-blue-600', 'font-semibold')\n        label.classList.remove('text-gray-700')\n        fieldGroup.classList.add('ring-2', 'ring-blue-500', 'ring-offset-2', 'rounded-lg', 'p-2', '-m-2')\n      } else {\n        // Inactive state - remove highlighting\n        label.classList.remove('text-blue-600', 'font-semibold')\n        label.classList.add('text-gray-700')\n        fieldGroup.classList.remove('ring-2', 'ring-blue-500', 'ring-offset-2', 'rounded-lg', 'p-2', '-m-2')\n      }\n    })\n  }\n\n  // Watch for changes to previousEventType value\n  previousEventTypeValueChanged() {\n    this.updateAvailableEventTypes()\n  }\n\n  hasEvents() {\n    // Guard: check if outlet exists (may not be available in preview mode)\n    if (!this.hasReviewAnnotationEventSequenceComponentOutlet) {\n      return false\n    }\n    return this.reviewAnnotationEventSequenceComponentOutlet.eventsValue.length > 0\n  }\n\n  availableEventTypes() {\n    if (this.constructor.eventTypeTransitions === undefined) {\n      return ['shot', 'puck_play']\n    }\n\n    // If we have an explicit previous event type value, use that\n    if (this.hasPreviousEventTypeValue) {\n      let types = this.constructor.eventTypeTransitions[this.previousEventTypeValue]\n      if (types) {\n        return types\n      }\n    }\n\n    // If no events exist and no explicit previous event type, only shot and puck_play are available\n    if (!this.hasEvents()) {\n      return ['shot', 'puck_play']\n    }\n\n    // Use the event type transitions based on previous event (from existing events)\n    let types = this.constructor.eventTypeTransitions[this.previousEventTypeValue]\n    if (!types) {\n      return this.constructor.eventTypeTransitions.initial\n    }\n\n    // If the current shot relative time is positive and eventTypes is not empty,\n    // then add 'stoppage' to the available types\n    // Guard: check if outlet exists before accessing it\n    if (this.hasReviewAnnotationEventSequenceComponentOutlet &&\n        this.reviewAnnotationEventSequenceComponentOutlet.currentShotRelativeTime() > 0 &&\n        types.length > 0) {\n      types.push('play_stoppage')\n    }\n\n    return types\n  }\n\n  updateAvailableEventTypes() {\n    let availableTypes = this.availableEventTypes()\n\n    // Enable/disable event type buttons (keep all visible)\n    this.eventTypeButtonTargets.forEach(button => {\n      const eventType = button.dataset.eventType\n      if (availableTypes.includes(eventType)) {\n        // Enable button\n        button.disabled = false\n        button.classList.remove('cursor-not-allowed', 'bg-gray-100', 'text-gray-400', 'border-gray-300')\n        button.classList.add('cursor-pointer', 'hover:border-blue-300', 'hover:bg-blue-50')\n\n        // Update text color based on section\n        if (button.classList.contains('text-gray-600')) {\n          button.classList.remove('text-gray-400')\n          button.classList.add('text-gray-600')\n        } else {\n          button.classList.remove('text-gray-400')\n          button.classList.add('text-gray-700')\n        }\n\n        // Update shortcut number color\n        const shortcut = button.querySelector('.font-mono')\n        if (shortcut) {\n          shortcut.classList.remove('text-gray-300')\n          shortcut.classList.add('text-gray-400')\n        }\n      } else {\n        // Disable button but keep visible\n        button.disabled = true\n        button.classList.remove('cursor-pointer', 'hover:border-blue-300', 'hover:bg-blue-50', 'text-gray-700', 'text-gray-600')\n        button.classList.add('cursor-not-allowed', 'bg-gray-100', 'text-gray-400', 'border-gray-300')\n\n        // Update shortcut number color\n        const shortcut = button.querySelector('.font-mono')\n        if (shortcut) {\n          shortcut.classList.remove('text-gray-400')\n          shortcut.classList.add('text-gray-300')\n        }\n      }\n    })\n  }\n\n  handleCoordinateSelected(event, timestamp) {\n    if (this.isOpen) {\n      return\n    }\n    const coordinates = event.detail\n\n    console.debug(\"Coordinate selected for event form:\", coordinates, timestamp)\n\n    // Store coordinates and timestamp\n    // Use ?? not || : coordinates.x/y are net-relative feet and 0 is a valid value\n    // (e.g. dead center on the x-axis) -- || treats 0 as falsy and would wrongly fall\n    // back to the raw pixel/SVG click offset (clickX/clickY), putting the point way\n    // off the map.\n    this.xCoordinateTarget.value = coordinates.x ?? coordinates.clickX\n    this.yCoordinateTarget.value = coordinates.y ?? coordinates.clickY\n    this.eventTimestampTarget.value = timestamp || 0\n\n    // Show form first so we can get accurate dimensions\n    this.showForm()\n\n    // Wait for form to render before positioning\n    requestAnimationFrame(() => {\n      this.positionForm(coordinates.clickX, coordinates.clickY)\n    })\n\n    // Reset to event type selector\n    this.backToEventTypeSelector()\n\n    // Determine the correct previous event type based on the timestamp\n    // Find the most recent event that occurred before or at the timestamp\n    if (this.reviewAnnotationEventSequenceComponentOutlet && this.reviewAnnotationEventSequenceComponentOutlet.eventsValue) {\n      const events = this.reviewAnnotationEventSequenceComponentOutlet.eventsValue\n      let previousEvent = null\n\n      for (let i = events.length - 1; i >= 0; i--) {\n        const evt = events[i]\n        if (parseFloat(evt.start_timestamp) <= timestamp) {\n          previousEvent = evt\n          break\n        }\n      }\n\n      if (previousEvent) {\n        console.debug(\"Setting previous event type based on timestamp:\", previousEvent.event_type)\n        this.previousEventTypeValue = previousEvent.event_type\n        this.updateAvailableEventTypes()\n      }\n    }\n\n    // If there's only one event type available, select it automatically\n    if (this.availableEventTypes().length === 1) {\n      console.debug(\"Only one event type available, selecting it:\", this.availableEventTypes()[0])\n      this.selectEventType(this.availableEventTypes()[0])\n    }\n  }\n\n  positionForm(clickX, clickY) {\n    // Pin form to right edge of ice map, expanding left as it grows\n    const formRect = this.element.getBoundingClientRect()\n    const iceMapRect = this.reviewAnnotationIceMapComponentOutletElement.getBoundingClientRect()\n\n    // Get actual form dimensions\n    const formHeight = formRect.height\n\n    if (formHeight === 0) return\n\n    // Pin to right edge with 20px margin\n    const right = 20\n\n    // Calculate vertical position\n    let top = clickY - 10\n\n    // Ensure form doesn't go off the bottom edge\n    const maxTop = iceMapRect.height - formHeight - 20 // 20px margin\n    if (top > maxTop) {\n      top = clickY - formHeight - 10\n      // If still off screen, clamp to max top position\n      if (top > maxTop) {\n        top = maxTop\n      }\n    }\n\n    // If it's off the top edge, clamp to top edge\n    if (top < 10) {\n      top = 10\n    }\n\n    // Set final position - use 'right' instead of 'left' to pin to right edge\n    this.element.style.left = 'auto'  // Clear any previous left positioning\n    this.element.style.right = `${right}px`\n    this.element.style.top = `${top}px`\n  }\n\n  showForm() {\n    this.element.classList.remove('hidden')\n    // Initialize available event types when form is shown\n    this.updateAvailableEventTypes()\n    // Focus the form element to receive keyboard events immediately\n    this.element.focus()\n  }\n\n  hideForm() {\n    this.element.classList.add('hidden')\n  }\n\n  handleSelectEventType(event) {\n    this.selectEventType(event.currentTarget.dataset.eventType)\n  }\n\n  selectEventType(eventType) {\n    console.debug(\"Selecting event type:\", eventType)\n    this.currentEventTypeValue = eventType\n    this.currentStepValue = 1\n\n    // Initialize step data for this event type\n    if (!this.stepDataValue[eventType]) {\n      this.stepDataValue = { ...this.stepDataValue, [eventType]: {} }\n    }\n\n    // Check if there's a multi-step form for this event type\n    const hasMultiStepForm = this.multiStepFormTargets.some(form => \n      form.dataset.eventType === eventType\n    )\n\n    if (!hasMultiStepForm) {\n      // No additional fields required, submit immediately\n      console.log(\"No multi-step form found for event type:\", eventType, \"- submitting immediately\")\n      this.submitEventWithoutAdditionalFields(eventType)\n      return\n    }\n\n    // Hide event type selector\n    this.eventTypeSelectorTarget.classList.add('hidden')\n\n    // Show the multi-step form for this event type\n    this.showMultiStepForm(eventType)\n\n    // Show first step\n    this.showStep(1)\n  }\n\n  submitEventWithoutAdditionalFields(eventType) {\n    const eventData = {\n      event_type: eventType,\n      attributes: {},\n      x_coordinate: this.xCoordinateTarget.value,\n      y_coordinate: this.yCoordinateTarget.value,\n      timestamp: this.eventTimestampTarget.value,\n      clip_timestamp: parseFloat(this.reviewPlayerComponentOutlet.currentLocalTime)\n    }\n\n    console.log(\"Submitting event without additional fields:\", eventData)\n\n    // Validate required data\n    if (!this.validateEventData(eventData)) {\n      console.error(\"Event data validation failed\")\n      return\n    }\n\n    // Get clip point ID\n    const clipPointId = this.getClipPointId()\n    if (!clipPointId) {\n      console.error(\"Could not determine clip point ID\")\n      return\n    }\n\n    // Create a form for Turbo Stream submission\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = `/review/clip_points/${clipPointId}/annotate`\n    form.style.display = 'none'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content')\n    const csrfInput = document.createElement('input')\n    csrfInput.type = 'hidden'\n    csrfInput.name = 'authenticity_token'\n    csrfInput.value = csrfToken\n    form.appendChild(csrfInput)\n\n    // Add form data\n    const formData = {\n      'event[event_type]': eventData.event_type,\n      'event[x_coordinate]': parseFloat(eventData.x_coordinate),\n      'event[y_coordinate]': parseFloat(eventData.y_coordinate),\n      'event[start_timestamp]': parseFloat(eventData.timestamp),\n      'event[end_timestamp]': parseFloat(eventData.timestamp),\n      'event[clip_timestamp]': parseFloat(eventData.clip_timestamp),\n      'event[metadata]': JSON.stringify(eventData.attributes)\n    }\n\n    Object.entries(formData).forEach(([name, value]) => {\n      const input = document.createElement('input')\n      input.type = 'hidden'\n      input.name = name\n      input.value = value\n      form.appendChild(input)\n    })\n\n    // Submit the form\n    document.body.appendChild(form)\n    form.requestSubmit()\n\n    // Clean up\n    setTimeout(() => {\n      document.body.removeChild(form)\n    }, 100)\n  }\n\n  showMultiStepForm(eventType) {\n    // Hide all multi-step forms\n    this.multiStepFormTargets.forEach(form => form.classList.add('hidden'))\n\n    // Show the form for this event type\n    const targetForm = this.multiStepFormTargets.find(form => \n      form.dataset.eventType === eventType\n    )\n    if (targetForm) {\n      targetForm.classList.remove('hidden')\n      this.totalStepsValue = targetForm.querySelectorAll('[data-review--annotation--event-form-component-target=\"stepContent\"]').length\n    }\n  }\n\n  showStep(stepNumber) {\n    const currentForm = this.getCurrentMultiStepForm()\n    if (!currentForm) return\n\n    // Hide all step contents\n    const stepContents = currentForm.querySelectorAll('[data-review--annotation--event-form-component-target=\"stepContent\"]')\n    stepContents.forEach(step => step.classList.add('hidden'))\n\n    // Show current step\n    const currentStepElement = currentForm.querySelector(`[data-step=\"${stepNumber}\"][data-review--annotation--event-form-component-target=\"stepContent\"]`)\n    if (currentStepElement) {\n      currentStepElement.classList.remove('hidden')\n    }\n\n    // Initialize step data with default values if not already set\n    this.initializeStepDataWithDefaults(stepNumber)\n\n    // Update progress indicator\n    this.updateProgressIndicator(stepNumber)\n\n    // Update navigation buttons after radio groups initialize\n    // Radio groups dispatch change events via Promise.resolve(), so we use a minimal delay\n    setTimeout(() => {\n      this.updateNavigationButtons()\n    }, 50)\n\n    // Activate first visible field after DOM renders\n    setTimeout(() => {\n      this.activateField(0)\n      // Restore focus to the form element so keyboard events work\n      this.element.focus()\n    }, 100)\n  }\n\n  getCurrentMultiStepForm() {\n    return this.multiStepFormTargets.find(form => \n      form.dataset.eventType === this.currentEventTypeValue && \n      !form.classList.contains('hidden')\n    )\n  }\n\n  initializeStepDataWithDefaults(stepNumber) {\n    const currentForm = this.getCurrentMultiStepForm()\n    if (!currentForm) return\n\n    const stepElement = currentForm.querySelector(`[data-step=\"${stepNumber}\"][data-review--annotation--event-form-component-target=\"stepContent\"]`)\n    if (!stepElement) return\n\n    // Initialize step data if not already set\n    if (!this.stepDataValue[this.currentEventTypeValue]) {\n      this.stepDataValue = { ...this.stepDataValue, [this.currentEventTypeValue]: {} }\n    }\n\n    const stepData = { ...this.stepDataValue[this.currentEventTypeValue] }\n    let hasChanges = false\n\n    // Check each radio group in the step\n    const radioGroups = stepElement.querySelectorAll('[data-review--annotation--event-form-component-target=\"radioGroup\"]')\n    radioGroups.forEach(group => {\n      const fieldName = group.dataset.fieldName\n\n      // If this field doesn't have a value yet, set it to the default (checked radio)\n      if (!stepData[fieldName]) {\n        const checkedRadio = group.querySelector('input[type=\"radio\"]:checked')\n        if (checkedRadio) {\n          stepData[fieldName] = checkedRadio.value\n          hasChanges = true\n          console.log(`Initialized ${fieldName} with default value: ${checkedRadio.value}`)\n        }\n      }\n    })\n\n    // Note: We do NOT auto-initialize grid components with defaults\n    // Grid components require explicit user selection\n\n    // Update step data if we made changes\n    if (hasChanges) {\n      this.stepDataValue = { ...this.stepDataValue, [this.currentEventTypeValue]: stepData }\n    }\n  }\n\n  updateProgressIndicator(stepNumber) {\n    const currentForm = this.getCurrentMultiStepForm()\n    if (!currentForm) return\n\n    const progressSteps = currentForm.querySelectorAll('[data-review--annotation--event-form-component-target=\"progressStep\"]')\n\n    progressSteps.forEach((step, index) => {\n      const stepNum = index + 1\n      step.classList.remove('border-blue-500', 'bg-blue-500', 'text-white', 'border-green-500', 'bg-green-500', 'bg-white')\n\n      if (stepNum < stepNumber) {\n        // Completed step\n        step.classList.add('border-green-500', 'bg-green-500', 'text-white')\n      } else if (stepNum === stepNumber) {\n        // Current step\n        step.classList.add('border-blue-500', 'bg-blue-500', 'text-white')\n      } else {\n        // Future step\n        step.classList.add('border-gray-300', 'bg-white', 'text-gray-500')\n      }\n    })\n  }\n\n  updateNavigationButtons() {\n    const backButton = this.getCurrentMultiStepForm()?.querySelector('[data-review--annotation--event-form-component-target=\"backButton\"]')\n    const nextButton = this.getCurrentMultiStepForm()?.querySelector('[data-review--annotation--event-form-component-target=\"nextButton\"]')\n    const nextButtonText = this.getCurrentMultiStepForm()?.querySelector('[data-review--annotation--event-form-component-target=\"nextButtonText\"]')\n\n    if (backButton) {\n      if (this.currentStepValue === 1) {\n        backButton.textContent = '\u2190 Back to Types'\n      } else {\n        backButton.textContent = '\u2190 Previous'\n      }\n    }\n\n    if (nextButton && nextButtonText) {\n      if (this.currentStepValue === this.totalStepsValue) {\n        nextButtonText.textContent = 'Save Event'\n      } else {\n        nextButtonText.textContent = 'Next \u2192'\n      }\n\n      // Enable/disable next button based on step completion\n      if (this.isCurrentStepComplete()) {\n        nextButton.classList.remove('opacity-50', 'cursor-not-allowed')\n        nextButton.disabled = false\n      } else {\n        nextButton.classList.add('opacity-50', 'cursor-not-allowed')\n        nextButton.disabled = true\n      }\n    }\n  }\n\n  handleRadioGroupChange(event) {\n    const fieldName = event.detail.fieldName\n    const value = event.detail.value\n\n    // Store the value\n    const currentStepData = { ...this.stepDataValue }\n    if (!currentStepData[this.currentEventTypeValue]) {\n      currentStepData[this.currentEventTypeValue] = {}\n    }\n    currentStepData[this.currentEventTypeValue][fieldName] = value\n    this.stepDataValue = currentStepData\n\n    // Update navigation buttons\n    this.updateNavigationButtons()\n\n    // After a radio group value changes, fields may show/hide\n    // Wait for DOM to update, then activate next visible group\n    setTimeout(() => {\n      // Try to advance to next group\n      const advanced = this.advanceToNextVisibleGroup()\n\n      // If we couldn't advance and step is complete, move to next step\n      if (!advanced && this.isCurrentStepComplete()) {\n        console.log('Step complete, advancing to next step')\n        this.nextStep()\n      } else if (!advanced) {\n        console.log('Could not advance: step not complete')\n      }\n    }, 150)\n  }\n\n  advanceAfterSelection() {\n    // Check if all fields in current step are complete\n    if (this.isCurrentStepComplete()) {\n      // Auto-advance to next step\n      // Note: nextStep() -> showStep() will handle highlighting the first radio group\n      this.nextStep()\n    }\n  }\n\n  handleGridComponentSelection(detail) {\n    console.log(\"Grid component selection changed:\", detail)\n\n    // Store the values from the grid component\n    const currentStepData = { ...this.stepDataValue }\n    if (!currentStepData[this.currentEventTypeValue]) {\n      currentStepData[this.currentEventTypeValue] = {}\n    }\n\n    // Update step data with the values from the grid component\n    Object.entries(detail.values).forEach(([fieldName, value]) => {\n      currentStepData[this.currentEventTypeValue][fieldName] = value\n      console.log(`Updated ${fieldName} with value: ${value}`)\n    })\n\n    this.stepDataValue = currentStepData\n\n    console.log(\"Current step data after grid component selection:\", this.stepDataValue[this.currentEventTypeValue])\n\n    // Update navigation buttons\n    this.updateNavigationButtons()\n\n    // Check if step is complete\n    const stepComplete = this.isCurrentStepComplete()\n    console.log(\"Step complete after grid component selection:\", stepComplete)\n\n    // Auto-advance to next step if current step is now complete\n    if (stepComplete) {\n      console.log(\"Auto-advancing to next step after grid component selection...\")\n      setTimeout(() => {\n        this.nextStep()\n      }, 300) // Small delay for visual feedback\n    }\n  }\n\n  handleCustomFieldValuesChanged(detail) {\n    console.log(\"Custom field values changed:\", detail)\n\n    // Store the values from the custom field component\n    const currentStepData = { ...this.stepDataValue }\n    if (!currentStepData[this.currentEventTypeValue]) {\n      currentStepData[this.currentEventTypeValue] = {}\n    }\n\n    // Update step data with the values from the custom field component\n    Object.entries(detail.values).forEach(([fieldName, value]) => {\n      currentStepData[this.currentEventTypeValue][fieldName] = value\n      console.log(`Updated ${fieldName} with value: ${value}`)\n    })\n\n    this.stepDataValue = currentStepData\n\n    console.log(\"Current step data after custom field values changed:\", this.stepDataValue[this.currentEventTypeValue])\n\n    // Update navigation buttons\n    this.updateNavigationButtons()\n\n    // Note: Do not auto-advance here. Advancement should only happen when:\n    // 1. User presses arrow keys (handled in handleKeydown)\n    // 2. User completes a field and triggers explicit advancement\n  }\n\n  handleGridSelection(event) {\n    const xRegion = event.currentTarget.dataset.xRegion\n    const yRegion = event.currentTarget.dataset.yRegion\n    const inputNameX = event.currentTarget.dataset.inputNameX\n    const inputNameY = event.currentTarget.dataset.inputNameY\n\n    console.log(\"Grid selection:\", xRegion, yRegion)\n    console.log(\"Input names:\", inputNameX, inputNameY)\n\n    // Update visual state of grid cells\n    this.updateGridSelectionStyles(event.currentTarget)\n\n    // Store the values\n    const currentStepData = { ...this.stepDataValue }\n    if (!currentStepData[this.currentEventTypeValue]) {\n      currentStepData[this.currentEventTypeValue] = {}\n    }\n\n    // Extract field names from input names\n    const fieldNameX = inputNameX.split('_').pop()\n    const fieldNameY = inputNameY.split('_').pop()\n\n    currentStepData[this.currentEventTypeValue][fieldNameX] = xRegion\n    currentStepData[this.currentEventTypeValue][fieldNameY] = yRegion\n    this.stepDataValue = currentStepData\n\n    console.log(\"Current step data after grid selection:\", this.stepDataValue[this.currentEventTypeValue])\n\n    // Update navigation buttons\n    this.updateNavigationButtons()\n\n    // Check if step is complete\n    const stepComplete = this.isCurrentStepComplete()\n    console.log(\"Step complete after grid selection:\", stepComplete)\n\n    // Auto-advance to next step if current step is now complete\n    if (stepComplete) {\n      console.log(\"Auto-advancing to next step after grid selection...\")\n      setTimeout(() => {\n        this.nextStep()\n      }, 300) // Small delay for visual feedback\n    }\n  }\n\n  updateGridSelectionStyles(selectedCell) {\n    const gridContainer = selectedCell.closest('.shot-target-grid, .goal-location-grid, .save-location-grid')\n    if (!gridContainer) return\n\n    // Reset all cells in this grid\n    const allCells = gridContainer.querySelectorAll('[data-x-region][data-y-region]')\n    allCells.forEach(cell => {\n      cell.classList.remove('bg-blue-200')\n      cell.classList.add('bg-white')\n    })\n\n    // Highlight selected cell\n    selectedCell.classList.remove('bg-white')\n    selectedCell.classList.add('bg-blue-200')\n  }\n\n  isCurrentStepComplete() {\n    // Check all visible fields (radio groups + grids) have values\n    const visibleFields = this.getAllVisibleFields()\n    const allFieldsComplete = visibleFields.every(field => field.hasValue())\n\n    if (!allFieldsComplete) {\n      console.log(`Step incomplete: ${visibleFields.length} fields, some missing values`)\n      return false\n    }\n\n    // Check remaining custom fields that aren't in our registry (like PlaySituationFieldComponent)\n    const currentForm = this.getCurrentMultiStepForm()\n    if (!currentForm) return false\n\n    const currentStepElement = currentForm.querySelector(`[data-step=\"${this.currentStepValue}\"][data-review--annotation--event-form-component-target=\"stepContent\"]:not(.hidden)`)\n    if (!currentStepElement) return false\n\n    const customFields = currentStepElement.querySelectorAll('[data-review--annotation--event-form-component-target=\"customField\"]')\n    const customFieldsComplete = Array.from(customFields).every(field => {\n      const controller = this.application.getControllerForElementAndIdentifier(field, field.dataset.controller)\n      return controller && controller.isComplete && controller.isComplete()\n    })\n\n    const isComplete = allFieldsComplete && customFieldsComplete\n    console.log(`Step ${this.currentStepValue} complete: ${isComplete}`)\n    return isComplete\n  }\n\n  nextStep() {\n    // Prevent duplicate calls\n    if (this.isAdvancing) {\n      console.log('nextStep() called but already advancing, skipping')\n      return\n    }\n\n    this.isAdvancing = true\n\n    if (this.currentStepValue < this.totalStepsValue) {\n      this.currentStepValue++\n      this.showStep(this.currentStepValue)\n      // Reset flag after a short delay to allow step transition to complete\n      setTimeout(() => { this.isAdvancing = false }, 200)\n    } else {\n      // All steps complete, save the event\n      this.saveEvent()\n      // Reset flag after submission completes\n      setTimeout(() => { this.isAdvancing = false }, 300)\n    }\n  }\n\n  previousStep() {\n    if (this.currentStepValue > 1) {\n      this.currentStepValue--\n      this.showStep(this.currentStepValue)\n    } else {\n      // Go back to event type selector\n      this.backToEventTypeSelector()\n    }\n  }\n\n  backToEventTypeSelector() {\n    // Hide all multi-step forms\n    this.multiStepFormTargets.forEach(form => form.classList.add('hidden'))\n\n    // Show event type selector\n    this.eventTypeSelectorTarget.classList.remove('hidden')\n\n    // Reset state\n    this.currentEventTypeValue = ''\n    this.currentStepValue = 1\n    this.stepDataValue = {}\n\n    // Reset all custom field components\n    this.resetAllCustomFields()\n\n    // Set previous event type to 'initial' so shot and puck_play are both available\n    // This allows users to select puck_play after backing out from shot\n    this.previousEventTypeValue = 'initial'\n\n    // Update available event types to show both shot and puck_play buttons\n    this.updateAvailableEventTypes()\n  }\n\n  resetAllCustomFields() {\n    // Reset all custom field components to their initial state\n    const customFields = this.element.querySelectorAll('[data-review--annotation--event-form-component-target=\"customField\"]')\n\n    customFields.forEach(field => {\n      // Get all controllers attached to this field\n      const controllerName = field.dataset.controller\n      if (controllerName) {\n        const controller = this.application.getControllerForElementAndIdentifier(field, controllerName)\n\n        // Call reset method if it exists\n        if (controller && typeof controller.reset === 'function') {\n          controller.reset()\n        }\n      }\n\n      // Also uncheck all radio buttons in the custom field\n      field.querySelectorAll('input[type=\"radio\"]').forEach(input => {\n        input.checked = false\n      })\n    })\n\n    // Also reset standalone radio groups (not inside custom fields)\n    this.radioGroupTargets.forEach(group => {\n      // Skip if inside a custom field (those are handled above)\n      if (!group.closest('[data-review--annotation--event-form-component-target=\"customField\"]')) {\n        group.querySelectorAll('input[type=\"radio\"]').forEach(input => {\n          input.checked = false\n        })\n      }\n    })\n  }\n\n  backToEventType() {\n    // Clear current event type\n    this.eventData.event_type = null\n    this.currentEventTypeValue = null\n\n    // Show event type selector and hide attribute form\n    this.eventTypeSelectorTarget.classList.remove('hidden')\n    this.attributeFormTarget.classList.add('hidden')\n  }\n\n  saveEvent() {\n    // Note: Debouncing is handled by nextStep(), so we don't check isAdvancing here\n    // This method is only called from nextStep() which already manages the flag\n\n    const eventData = {\n      event_type: this.currentEventTypeValue,\n      attributes: this.stepDataValue[this.currentEventTypeValue] || {},\n      x_coordinate: this.xCoordinateTarget.value,\n      y_coordinate: this.yCoordinateTarget.value,\n      timestamp: this.eventTimestampTarget.value,\n      clip_timestamp: parseFloat(this.reviewPlayerComponentOutlet.currentLocalTime)\n    }\n\n    console.log(\"Saving event:\", eventData)\n\n    // Validate required attributes\n    if (!this.validateEventData(eventData)) {\n      console.error(\"Event data validation failed\")\n      return\n    }\n\n    // Get clip point ID\n    const clipPointId = this.getClipPointId()\n    if (!clipPointId) {\n      console.error(\"Could not determine clip point ID\")\n      return\n    }\n\n    // Determine if we're creating or updating\n    const isEditMode = this.editModeValue && this.editEventIdValue\n\n    // Create a form for Turbo Stream submission\n    const form = document.createElement('form')\n    form.method = 'POST'\n\n    if (isEditMode) {\n      form.action = `/review/clip_points/${clipPointId}/annotate/events/${this.editEventIdValue}`\n    } else {\n      form.action = `/review/clip_points/${clipPointId}/annotate`\n    }\n\n    form.style.display = 'none'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content')\n    const csrfInput = document.createElement('input')\n    csrfInput.type = 'hidden'\n    csrfInput.name = 'authenticity_token'\n    csrfInput.value = csrfToken\n    form.appendChild(csrfInput)\n\n    // Add _method for PATCH if editing\n    if (isEditMode) {\n      const methodInput = document.createElement('input')\n      methodInput.type = 'hidden'\n      methodInput.name = '_method'\n      methodInput.value = 'PATCH'\n      form.appendChild(methodInput)\n    }\n\n    // Add form data\n    if (isEditMode) {\n      // In edit mode, only send metadata\n      Object.entries(eventData.attributes).forEach(([key, value]) => {\n        const input = document.createElement('input')\n        input.type = 'hidden'\n        input.name = `event[metadata][${key}]`\n        input.value = value\n        form.appendChild(input)\n      })\n    } else {\n      // Create mode: send all fields\n      const formData = {\n        'event[event_type]': eventData.event_type,\n        'event[x_coordinate]': parseFloat(eventData.x_coordinate),\n        'event[y_coordinate]': parseFloat(eventData.y_coordinate),\n        'event[start_timestamp]': parseFloat(eventData.timestamp),\n        'event[end_timestamp]': parseFloat(eventData.timestamp),\n        'event[clip_timestamp]': parseFloat(eventData.clip_timestamp)\n      }\n\n      Object.entries(formData).forEach(([name, value]) => {\n        const input = document.createElement('input')\n        input.type = 'hidden'\n        input.name = name\n        input.value = value\n        form.appendChild(input)\n      })\n\n      // Add metadata as nested form fields\n      Object.entries(eventData.attributes).forEach(([key, value]) => {\n        const input = document.createElement('input')\n        input.type = 'hidden'\n        input.name = `event[metadata][${key}]`\n        input.value = value\n        form.appendChild(input)\n      })\n    }\n\n    // Submit the form\n    document.body.appendChild(form)\n    form.requestSubmit()\n\n    // Clean up\n    setTimeout(() => {\n      document.body.removeChild(form)\n      // Note: isAdvancing flag is managed by nextStep(), not here\n    }, 300)\n  }\n\n  // Open form in edit mode with existing event data\n  openEditMode(eventData) {\n    console.log(\"Opening form in edit mode:\", eventData)\n\n    // Set edit mode flags\n    this.editModeValue = true\n    this.editEventIdValue = eventData.eventId\n\n    // Store coordinates and timestamp\n    this.xCoordinateTarget.value = eventData.x\n    this.yCoordinateTarget.value = eventData.y\n    this.eventTimestampTarget.value = eventData.timestamp\n\n    // Show form\n    this.showForm()\n\n    // Position form (center it or use a default position)\n    this.element.style.left = '50%'\n    this.element.style.top = '50%'\n    this.element.style.transform = 'translate(-50%, -50%)'\n\n    // Hide event type selector since we already have the type\n    this.eventTypeSelectorTarget.classList.add('hidden')\n\n    // Select the event type and pre-fill with metadata\n    this.currentEventTypeValue = eventData.eventType\n    this.currentStepValue = 1\n\n    // Initialize step data with existing metadata\n    this.stepDataValue = { [eventData.eventType]: { ...eventData.metadata } }\n\n    // Show the multi-step form for this event type\n    const hasMultiStepForm = this.multiStepFormTargets.some(form =>\n      form.dataset.eventType === eventData.eventType\n    )\n\n    if (hasMultiStepForm) {\n      this.showMultiStepForm(eventData.eventType)\n\n      // Pre-select all the form fields based on metadata\n      this.preselectFormFields(eventData.eventType, eventData.metadata)\n\n      // Show first step\n      this.showStep(1)\n    }\n  }\n\n  // Pre-select form fields based on existing metadata\n  preselectFormFields(eventType, metadata) {\n    const currentForm = this.multiStepFormTargets.find(form =>\n      form.dataset.eventType === eventType\n    )\n\n    if (!currentForm) return\n\n    // Pre-select radio buttons\n    Object.entries(metadata).forEach(([fieldName, value]) => {\n      const radioInput = currentForm.querySelector(`input[type=\"radio\"][name=\"${fieldName}\"][value=\"${value}\"]`)\n      if (radioInput) {\n        radioInput.checked = true\n      }\n    })\n\n    // Trigger grid component updates if needed\n    const customFields = currentForm.querySelectorAll('[data-review--annotation--event-form-component-target=\"customField\"]')\n    customFields.forEach(field => {\n      const controller = this.application.getControllerForElementAndIdentifier(field, field.dataset.controller)\n      if (controller && controller.preselectFromMetadata) {\n        controller.preselectFromMetadata(metadata)\n      }\n    })\n  }\n\n  validateEventData(eventData) {\n    // Basic validation\n    if (!eventData.event_type) {\n      console.error(\"Event type is required\")\n      return false\n    }\n\n    if (!eventData.x_coordinate || !eventData.y_coordinate) {\n      console.error(\"Coordinates are required\")\n      return false\n    }\n\n    // For multi-step forms, we assume all required attributes are collected\n    // through the step completion validation\n    return true\n  }\n\n  getRequiredAttributes(eventType) {\n    // Define required attributes for each event type\n    const requiredAttributes = {\n      shot: ['shot_type', 'handedness'],\n      redirect: ['height_region'],\n      goal: ['x_region', 'y_region'],\n      save: ['x_region', 'y_region'],\n      pass: ['handedness']\n    }\n\n    return requiredAttributes[eventType] || []\n  }\n\n  resetForm() {\n    this.eventData = {\n      event_type: null,\n      x_coordinate: 0,\n      y_coordinate: 0,\n      timestamp: 0,\n      attributes: {}\n    }\n\n    this.currentEventTypeValue = null\n\n    // Reset form inputs\n    this.attributeInputTargets.forEach(input => {\n      if (input.type === 'checkbox') {\n        input.checked = false\n      } else {\n        input.value = ''\n      }\n    })\n\n    // Show event type selector\n    this.resetToEventTypeSelector()\n  }\n\n  resetToEventTypeSelector() {\n    this.eventTypeSelectorTarget.classList.remove('hidden')\n    this.attributeFormTarget.classList.add('hidden')\n  }\n\n  closeForm() {\n    this.hideForm()\n    this.backToEventTypeSelector()\n    // Reset edit mode\n    this.editModeValue = false\n    this.editEventIdValue = null\n    this.element.style.transform = ''\n  }\n\n  // Public methods for external control\n  setCoordinates(x, y) {\n    this.eventData.x_coordinate = x\n    this.eventData.y_coordinate = y\n    this.xCoordinateTarget.value = x\n    this.yCoordinateTarget.value = y\n  }\n\n  setPreviousEventType(eventType) {\n    this.previousEventTypeValue = eventType\n    console.log(\"Previous event type set to:\", eventType)\n  }\n\n  enable() {\n    console.log(\"Event sequence form enabled\")\n  }\n\n  disable() {\n    console.log(\"Event sequence form disabled\")\n    this.hideForm()\n  }\n\n  clearForm() {\n    this.resetForm()\n  }\n\n  getClipPointId() {\n    // Get clip point ID from the studio component\n    const studioComponent = this.application.getControllerForElementAndIdentifier(\n      this.element.closest('[data-controller*=\"review--annotation--studio-component\"]'),\n      'review--annotation--studio-component'\n    )\n\n    if (studioComponent) {\n      return studioComponent.clipPointIdValue\n    }\n\n    // Fallback: try to get from URL\n    const urlParts = window.location.pathname.split('/')\n    const clipPointIndex = urlParts.indexOf('clip_points')\n    if (clipPointIndex !== -1 && urlParts[clipPointIndex + 1]) {\n      return urlParts[clipPointIndex + 1]\n    }\n\n    return null\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"videoPlayer\", \"eventForm\", \"timeline\", \"phaseIndicator\", \"eventSequenceForm\", \"actionButtons\", \"noSogButton\", \"recordPreShotButton\", \"completeSequenceButton\"]\n  static values = {\n    shotTimestamp: Number,\n    forwardDuration: { type: Number, default: 2.0 },\n    backwardDuration: { type: Number, default: 3.0 },\n    currentPhase: { type: String, default: \"forward\" }, // \"forward\" or \"backward\"\n    events: { type: Array, default: [] },\n    currentPlayerTime: Number,\n    clipPointId: String,\n  }\n  static outlets = [\"review--annotation--event-form-component\", \"review--player-component\", \"review--annotation--ice-map-component\"]\n\n  connect() {\n    console.log(\"Event sequence controller connected\")\n    this.currentEventIndex = 0\n    this.setupEventListeners()\n\n    // Send current events to ice map component for visualization\n    this.updateIceMapVisualization()\n\n    // Add keydown listener for keyboard shortcuts\n    this.boundHandleKeydown = this.handleKeydown.bind(this)\n    document.addEventListener('keydown', this.boundHandleKeydown)\n  }\n\n  disconnect() {\n    document.removeEventListener('keydown', this.boundHandleKeydown)\n  }\n\n  // Called automatically when eventsValue changes (e.g., from Turbo Stream update)\n  eventsValueChanged() {\n    console.log(\"Events value changed, updating active event based on current player time\")\n\n    // Get current player time and update the active event\n    // This will set the correct previous event type based on the current video position\n    if (this.currentPlayerTimeValue) {\n      const shotRelativeTime = this.relativeTimestamp(this.currentPlayerTimeValue)\n      this.updateActiveEvent(shotRelativeTime)\n    } else {\n      // No player time yet, set to initial or last event\n      if (this.eventsValue && this.eventsValue.length > 0) {\n        const lastEvent = this.eventsValue[this.eventsValue.length - 1]\n        if (this.reviewAnnotationEventFormComponentOutlet) {\n          this.reviewAnnotationEventFormComponentOutlet.setPreviousEventType(lastEvent.event_type)\n        }\n      } else {\n        if (this.reviewAnnotationEventFormComponentOutlet) {\n          this.reviewAnnotationEventFormComponentOutlet.setPreviousEventType('initial')\n        }\n      }\n    }\n\n    // Update visualization\n    this.updateIceMapVisualization()\n\n    // Update button states after events change\n    this.checkAndShowActionButtons()\n  }\n\n  setupEventListeners() {\n    // Listen for time updates from video player\n    document.addEventListener('player:timeupdate', (event) => {\n      this.handleTimeUpdate(event.detail)\n    })\n  }\n\n  handleKeydown(event) {\n    // Home key - Record Pre Shot (if button is visible)\n    if (event.key === 'Home') {\n      if (this.hasRecordPreShotButtonTarget && !this.recordPreShotButtonTarget.classList.contains('hidden')) {\n        event.preventDefault()\n        this.handleRecordPreShot()\n      }\n      return\n    }\n\n    // End key - Complete Sequence (if button is visible)\n    if (event.key === 'End') {\n      if (this.hasCompleteSequenceButtonTarget && !this.completeSequenceButtonTarget.classList.contains('hidden')) {\n        event.preventDefault()\n        this.handleCompleteSequence()\n      }\n      return\n    }\n\n    // Delete key - No SOG (if button is visible)\n    if (event.key === 'Delete') {\n      if (this.hasNoSogButtonTarget && !this.noSogButtonTarget.classList.contains('hidden')) {\n        event.preventDefault()\n        this.handleNoSog()\n      }\n      return\n    }\n  }\n\n  // Seek to the earliest event's timing\n  seekToEarliestEvent() {\n    if (!this.eventsValue || this.eventsValue.length === 0) {\n      return\n    }\n\n    const seekToTime = this.clipTimestampFor(this.eventsValue[0])\n\n    if (this.reviewPlayerComponentOutlet) {\n      if (this.reviewPlayerComponentOutlet.initialized) {\n        this.reviewPlayerComponentOutlet.seekToLocalTime(seekToTime)\n      } else {\n        document.addEventListener('player:initialized', () => {\n          this.reviewPlayerComponentOutlet.seekToLocalTime(seekToTime)\n        })\n      }\n    }\n  }\n\n  clipTimestampFor(event) {\n    return parseFloat(event.start_timestamp) + this.shotTimestampValue\n  }\n\n  relativeTimestamp(clipTimestamp) {\n    if (!this.shotTimestampValue) {\n      return 0\n    }\n    return clipTimestamp - this.shotTimestampValue\n  }\n\n  currentShotRelativeTime() {\n    return this.relativeTimestamp(this.currentPlayerTimeValue)\n  }\n\n  handleCoordinateSelected(event, timestamp) {\n    this.reviewAnnotationEventFormComponentOutlet.handleCoordinateSelected(event, this.relativeTimestamp(timestamp))\n  }\n\n  handleEventSaved(eventData) {\n    console.log(\"Event saved:\", eventData)\n\n    // Add to events array with proper structure\n    const event = {\n      event_type: eventData.event_type,\n      x_coordinate: eventData.x_coordinate,\n      y_coordinate: eventData.y_coordinate,\n      timestamp: eventData.timestamp,\n      attributes: eventData.attributes || {},\n      phase: this.currentPhaseValue,\n      sequenceIndex: this.currentEventIndex++\n    }\n\n    this.eventsValue.push(event)\n\n    // Update timeline\n    this.updateTimeline()\n\n    // Update ice map visualization\n    this.updateIceMapVisualization()\n\n    // Clear form for next event\n    this.clearEventForm()\n\n    // Update previous event type for next event\n    if (this.reviewAnnotationEventFormComponentOutlet) {\n      this.reviewAnnotationEventFormComponentOutlet.setPreviousEventType(eventData.event_type)\n    }\n  }\n\n  handleTimeUpdate(detail) {\n    console.log(\"event_sequence_component_controller: handleTimeUpdate\", detail)\n    // Check if we've reached the end of current phase\n    const shotRelativeTime = this.relativeTimestamp(detail.localTime)\n\n    // Update current player time\n    this.currentPlayerTimeValue = detail.localTime\n\n    // Determine active event and update UI\n    this.updateActiveEvent(shotRelativeTime)\n\n    // Check if action buttons should be shown\n    this.checkAndShowActionButtons()\n  }\n\n  // Check if action buttons should be shown and update accordingly\n  checkAndShowActionButtons() {\n    if (!this.hasActionButtonsTarget) return\n\n    // Show/hide individual buttons based on criteria\n    this.updateNoSogButton()\n    this.updateRecordPreShotButton()\n    this.updateCompleteSequenceButton()\n  }\n\n  // Update No SOG button visibility (hidden if save/goal events exist or if sequence is puck_play)\n  updateNoSogButton() {\n    if (!this.hasNoSogButtonTarget) return\n\n    // Hide button if there's a save/goal event or if this is a puck_play sequence\n    if (this.hasSaveOrGoalEvent() || this.hasPuckPlayEvent()) {\n      this.noSogButtonTarget.classList.add('hidden')\n    } else {\n      this.noSogButtonTarget.classList.remove('hidden')\n    }\n  }\n\n  // Update Record Pre Shot button visibility (available if outcome after initiating event and player time after event)\n  updateRecordPreShotButton() {\n    if (!this.hasRecordPreShotButtonTarget) return\n\n    const hasInitiatingEvent = this.hasShotEvent()\n    const isPlayerTimeAfterEvent = this.isPlayerTimeAfterShot()\n\n    // Check for appropriate outcome based on initiating event type\n    const initialEvent = this.initialShotEvent()\n    const isPuckPlay = initialEvent && initialEvent.event_type === 'puck_play'\n    const isShotLike = initialEvent && this.isEventShotLike(initialEvent)\n    const hasOutcome = isPuckPlay ? this.hasPossessionAfterPuckPlay() : (isShotLike ? this.hasSaveAfterShot() : false)\n\n    console.log(\"Record Pre Shot button check:\", {\n      hasInitiatingEvent,\n      isPlayerTimeAfterEvent,\n      initialEvent,\n      isPuckPlay,\n      isShotLike,\n      hasOutcome\n    })\n\n    const shouldShowButton = hasInitiatingEvent && hasOutcome && isPlayerTimeAfterEvent\n\n    if (shouldShowButton) {\n      this.recordPreShotButtonTarget.classList.remove('hidden')\n    } else {\n      this.recordPreShotButtonTarget.classList.add('hidden')\n    }\n  }\n\n  // Update Complete Event Sequence button visibility\n  // Requires: initial event (shot/dump_in/puck_play) + pre-events + possession or terminal event after\n  updateCompleteSequenceButton() {\n    if (!this.hasCompleteSequenceButtonTarget) return\n\n    const initialEvent = this.initialShotEvent()\n    if (!initialEvent) {\n      this.completeSequenceButtonTarget.classList.add('hidden')\n      return\n    }\n\n    // Must have events before the initial event (pre-shot/pre-dump_in/pre-puck_play)\n    if (!this.hasPreShotEvents()) {\n      this.completeSequenceButtonTarget.classList.add('hidden')\n      return\n    }\n\n    // Must have possession or terminal event after the initial event\n    const hasPossessionOrTerminalAfter = this.hasPossessionOrTerminalEventAfter(initialEvent)\n\n    if (hasPossessionOrTerminalAfter) {\n      this.completeSequenceButtonTarget.classList.remove('hidden')\n    } else {\n      this.completeSequenceButtonTarget.classList.add('hidden')\n    }\n  }\n\n  // Check if there's an initiating event (shot, dump_in, or puck_play)\n  hasShotEvent() {\n    return this.shotTimestampValue !== null\n  }\n\n  // Check if there's a save event or puck_play after the shot or dump_in\n  hasSaveAfterShot() {\n    let initialShotEvent = this.initialShotEvent()\n    if (!initialShotEvent) {\n      console.log(\"No initial shot event found\")\n      return false\n    }\n\n    const shotTimestamp = parseFloat(initialShotEvent.start_timestamp)\n    console.log(\"Initial shot event timestamp:\", shotTimestamp)\n    console.log(\"All events:\", this.eventsValue)\n\n    const hasOutcome = this.eventsValue.some(event => {\n      console.log(\"Checking event:\", event.event_type, \"at\", parseFloat(event.start_timestamp))\n      // Accept save/goal events OR puck_play events (goalie plays the puck)\n      const isOutcome = this.isEventSaveOrGoal(event) || event.event_type === 'puck_play'\n      if (!isOutcome) {\n        console.log(\"  Not a save/goal/puck_play event\")\n        return false\n      }\n      const isAfterShot = parseFloat(event.start_timestamp) > shotTimestamp\n      console.log(\"  Is outcome event, after shot?\", isAfterShot)\n      return isAfterShot\n    })\n\n    console.log(\"Has outcome after shot?\", hasOutcome)\n    return hasOutcome\n  }\n\n  // Check if there's a possession event after the puck_play\n  hasPossessionAfterPuckPlay() {\n    let initialPuckPlay = this.initialShotEvent()\n    if (!initialPuckPlay || initialPuckPlay.event_type !== 'puck_play') return false\n\n    const puckPlayTimestamp = parseFloat(initialPuckPlay.start_timestamp)\n    return this.eventsValue.some(event => {\n      if (!this.isEventPossession(event)) return false\n      return parseFloat(event.start_timestamp) > puckPlayTimestamp\n    })\n  }\n\n  // Get the initial/initiating event (shot, puck_play, or dump_in with type='on_net')\n  initialShotEvent() {\n    return this.eventsValue.find(event => {\n      if (event.event_type === 'shot') return true\n      if (event.event_type === 'tip') return true\n      if (event.event_type === 'deflection') return true\n      if (event.event_type === 'puck_play') return true\n      if (event.event_type === 'dump_in' && event.metadata && event.metadata.dump_in_type === 'on_net') return true\n      return false\n    })\n  }\n\n  // Check if current player time is after the initiating event (shot, dump_in, or puck_play)\n  isPlayerTimeAfterShot() {\n    if (!this.hasShotEvent()) return false\n    return this.relativeTimestamp(this.currentPlayerTimeValue) > 0\n  }\n\n  // Check if there are save events (freeze, catch, rebound) or goal events\n  hasSaveOrGoalEvent() {\n    return this.eventsValue.some(event => {\n      return this.isEventSaveOrGoal(event)\n    })\n  }\n\n  // Check if there are available event types\n  hasAvailableEventTypes() {\n    // Check if the event form component has available event types\n    if (this.reviewAnnotationEventFormComponentOutlet) {\n      const visibleButtons = this.reviewAnnotationEventFormComponentOutlet.eventTypeButtonTargets.filter(button => \n        !button.classList.contains('hidden') && !button.disabled\n      )\n      return visibleButtons.length > 0\n    }\n    return false\n  }\n\n  // Check if there are pre-event events (before shot, dump_in, or puck_play)\n  hasPreShotEvents() {\n    const initialEvent = this.initialShotEvent()\n    if (!initialEvent) return false\n\n    const initialTimestamp = parseFloat(initialEvent.start_timestamp)\n\n    // Check if there are events before the initiating event timestamp\n    return this.eventsValue.some(event => {\n      return parseFloat(event.start_timestamp) < initialTimestamp\n    })\n  }\n\n  // Check if there are post-save events (rebound, catch, freeze + subsequent event)\n  hasPostSaveEventsOrGoal() {\n    if (this.hasGoalEvent()) return true\n\n    // Check if there's a save event followed by other events\n    const saveEvents = this.eventsValue.filter(this.isEventSaveOrGoal)\n    if (saveEvents.length === 0) return false\n\n    // Check if there are events after the last save event\n    const lastSaveEvent = saveEvents[saveEvents.length - 1]\n\n    if (lastSaveEvent.event_type == 'freeze' || lastSaveEvent.event_type == 'catch') {\n      return true\n    }\n\n    const lastSaveTime = parseFloat(lastSaveEvent.start_timestamp)\n\n    const hasPostSaveEvents = this.eventsValue.some(event => {\n      return parseFloat(event.start_timestamp) > lastSaveTime\n    })\n\n    return hasPostSaveEvents\n  }\n\n  hasGoalEvent() {\n    return this.eventsValue.some(event => {\n      return event.event_type === 'goal'\n    })\n  }\n\n  hasPuckPlayEvent() {\n    return this.eventsValue.some(event => {\n      return event.event_type === 'puck_play'\n    })\n  }\n\n  // Check if there are post-possession events (after puck_play)\n  hasPostPossessionEvents() {\n    const initialPuckPlay = this.initialShotEvent()\n    if (!initialPuckPlay || initialPuckPlay.event_type !== 'puck_play') return false\n\n    const puckPlayTimestamp = parseFloat(initialPuckPlay.start_timestamp)\n\n    // Check if there are possession events after the puck_play\n    return this.eventsValue.some(event => {\n      return parseFloat(event.start_timestamp) > puckPlayTimestamp && this.isEventPossession(event)\n    })\n  }\n\n  isEventSaveOrGoal(event) {\n    return event.event_type === 'save' || event.event_type === 'rebound' || event.event_type === 'catch' || event.event_type === 'freeze' || event.event_type === 'goal'\n  }\n\n  isEventPossession(event) {\n    return event.event_type === 'pass' || event.event_type === 'carry' || event.event_type === 'loose_puck' || event.event_type === 'battle'\n  }\n\n  isEventShotLike(event) {\n    // A shot or dump_in with type='on_net' is considered shot-like\n    if (event.event_type === 'shot') return true\n    if (event.event_type === 'dump_in') {\n      console.log(\"Checking dump_in event:\", event)\n      console.log(\"Metadata:\", event.metadata)\n      console.log(\"dump_in_type:\", event.metadata?.dump_in_type)\n      if (event.metadata && event.metadata.dump_in_type === 'on_net') return true\n    }\n    return false\n  }\n\n  isEventPossessionOrTerminal(event) {\n    // Possession events: shot, shot-like dump_in, pass, carry\n    // Terminal events: catch, freeze, goal, out_of_play, play_stoppage\n    // Also puck_play with terminal play types (freeze, catch)\n\n    // Check if it's a puck_play with terminal metadata\n    if (event.event_type === 'puck_play' && event.metadata && event.metadata.play) {\n      const terminalPlays = ['freeze', 'catch']\n      if (terminalPlays.includes(event.metadata.play)) {\n        return true\n      }\n    }\n\n    return this.isEventShotLike(event) ||\n           event.event_type === 'pass' ||\n           event.event_type === 'carry' ||\n           event.event_type === 'catch' ||\n           event.event_type === 'freeze' ||\n           event.event_type === 'goal' ||\n           event.event_type === 'out_of_play' ||\n           event.event_type === 'play_stoppage'\n  }\n\n  hasPossessionOrTerminalEventAfter(initialEvent) {\n    // Check if the initial event itself has a terminal outcome in its metadata\n    if (this.isInitialEventTerminal(initialEvent)) {\n      return true\n    }\n\n    // Otherwise, look for a separate terminal/possession event after the initial event\n    const initialTimestamp = parseFloat(initialEvent.start_timestamp)\n    return this.eventsValue.some(event => {\n      return parseFloat(event.start_timestamp) > initialTimestamp && this.isEventPossessionOrTerminal(event)\n    })\n  }\n\n  isInitialEventTerminal(event) {\n    // Only puck_play events can be both initiating and terminal in a single event\n    // For puck_play, check if the play metadata indicates a terminal outcome\n    if (event.event_type === 'puck_play' && event.metadata && event.metadata.play) {\n      const terminalPlays = ['freeze', 'catch', 'shot']\n      return terminalPlays.includes(event.metadata.play)\n    }\n\n    return false\n  }\n\n  // Build the annotate action URL, preserving the game_id/goaltender_id filter from the\n  // current page (mutually exclusive, but both are forwarded if somehow both are present --\n  // the server applies the same game_id-wins precedence either way)\n  annotationActionUrl(action) {\n    const base = `/review/clip_points/${this.clipPointIdValue}/annotate/${action}`\n    const currentParams = new URLSearchParams(window.location.search)\n    const forwardedParams = new URLSearchParams()\n\n    for (const key of ['game_id', 'goaltender_id']) {\n      const value = currentParams.get(key)\n      if (value) forwardedParams.set(key, value)\n    }\n\n    const query = forwardedParams.toString()\n    return query ? `${base}?${query}` : base\n  }\n\n  // Handle No SOG button click\n  handleNoSog() {\n    console.log('Marking as No Shot on Goal')\n\n    // Create a form for POST request to no_shot action\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = this.annotationActionUrl('no_shot')\n    form.style.display = 'none'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content')\n    const csrfInput = document.createElement('input')\n    csrfInput.type = 'hidden'\n    csrfInput.name = 'authenticity_token'\n    csrfInput.value = csrfToken\n    form.appendChild(csrfInput)\n\n    // Submit the form\n    document.body.appendChild(form)\n    form.requestSubmit()\n\n    // Clean up\n    setTimeout(() => {\n      document.body.removeChild(form)\n    }, 100)\n  }\n\n  // Handle Record Pre Shot button click\n  handleRecordPreShot() {\n    const preShotTime = this.shotTimestampValue - 5 // 5 seconds before shot\n\n    console.log(`Seeking to pre-shot time: ${preShotTime}s`)\n\n    // Use player outlet to seek directly\n    if (this.reviewPlayerComponentOutlet) {\n      this.reviewPlayerComponentOutlet.seekToLocalTime(preShotTime)\n    }\n  }\n\n  // Handle Complete Event Sequence button click\n  handleCompleteSequence() {\n    console.log('Completing event sequence')\n\n    // Create a form for POST request to complete action\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = this.annotationActionUrl('complete')\n    form.style.display = 'none'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content')\n    const csrfInput = document.createElement('input')\n    csrfInput.type = 'hidden'\n    csrfInput.name = 'authenticity_token'\n    csrfInput.value = csrfToken\n    form.appendChild(csrfInput)\n\n    // Submit the form\n    document.body.appendChild(form)\n    form.requestSubmit()\n\n    // Clean up\n    setTimeout(() => {\n      document.body.removeChild(form)\n    }, 100)\n  }\n\n  // Stop event propagation when clicking on buttons\n  stopPropagation(event) {\n    event.stopPropagation()\n  }\n\n  // Seek to event's timestamp when clicked\n  seekToEvent(event) {\n    const clipTimestamp = parseFloat(event.currentTarget.dataset.eventClipTimestamp)\n    console.log('Seeking to event timestamp:', clipTimestamp)\n\n    if (this.reviewPlayerComponentOutlet) {\n      this.reviewPlayerComponentOutlet.seekToLocalTime(clipTimestamp)\n    }\n  }\n\n  // Handle event editing\n  editEvent(event) {\n    const eventId = event.currentTarget.dataset.eventId\n    const eventType = event.currentTarget.dataset.eventType\n    const x = parseFloat(event.currentTarget.dataset.eventX)\n    const y = parseFloat(event.currentTarget.dataset.eventY)\n    const timestamp = parseFloat(event.currentTarget.dataset.eventTimestamp)\n    const clipTimestamp = parseFloat(event.currentTarget.dataset.eventClipTimestamp)\n    const metadata = JSON.parse(event.currentTarget.dataset.eventMetadata)\n\n    console.log('Editing event:', { eventId, eventType, x, y, timestamp, clipTimestamp, metadata })\n\n    // Open the event form in edit mode\n    if (this.reviewAnnotationEventFormComponentOutlet) {\n      this.reviewAnnotationEventFormComponentOutlet.openEditMode({\n        eventId,\n        eventType,\n        x,\n        y,\n        timestamp,\n        clipTimestamp,\n        metadata\n      })\n    }\n  }\n\n  // Handle event deletion\n  deleteEvent(event) {\n    const eventId = event.currentTarget.dataset.eventId\n    console.log('Deleting event:', eventId)\n\n    if (!confirm('Are you sure you want to delete this event?')) {\n      return\n    }\n\n    // Create a form for DELETE request\n    const form = document.createElement('form')\n    form.method = 'POST'\n    form.action = `/review/clip_points/${this.clipPointIdValue}/annotate/events/${eventId}`\n    form.style.display = 'none'\n\n    // Add CSRF token\n    const csrfToken = document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content')\n    const csrfInput = document.createElement('input')\n    csrfInput.type = 'hidden'\n    csrfInput.name = 'authenticity_token'\n    csrfInput.value = csrfToken\n    form.appendChild(csrfInput)\n\n    // Add _method for DELETE\n    const methodInput = document.createElement('input')\n    methodInput.type = 'hidden'\n    methodInput.name = '_method'\n    methodInput.value = 'DELETE'\n    form.appendChild(methodInput)\n\n    // Submit the form\n    document.body.appendChild(form)\n    form.requestSubmit()\n\n    // Clean up\n    setTimeout(() => {\n      document.body.removeChild(form)\n    }, 100)\n  }\n\n  updateActiveEvent(shotRelativeTime) {\n    if (!this.eventsValue || this.eventsValue.length === 0) {\n      console.log(\"No events, clearing previous event type and highlighting active event\")\n      // No events, clear previous event type to show initial event types\n      if (this.reviewAnnotationEventFormComponentOutlet) {\n        this.reviewAnnotationEventFormComponentOutlet.setPreviousEventType('initial')\n      }\n      // Clear active event highlighting on ice map\n      if (this.reviewAnnotationIceMapComponentOutlet) {\n        this.reviewAnnotationIceMapComponentOutlet.highlightActiveEvent(-1)\n        this.reviewAnnotationIceMapComponentOutlet.updatePuckPosition(shotRelativeTime)\n      }\n      return\n    }\n\n    // Find the most recent event that occurred before or at the current time\n    let activeEvent = null\n    let activeEventIndex = -1\n\n    for (let i = this.eventsValue.length - 1; i >= 0; i--) {\n      const event = this.eventsValue[i]\n      if (parseFloat(event.start_timestamp) <= shotRelativeTime) {\n        console.log(\"Active event:\", event)\n        activeEvent = event\n        activeEventIndex = i\n        break\n      } else {\n        console.log(\"event.timestamp\", event, \"shotRelativeTime\", shotRelativeTime)\n      }\n    }\n\n    // Update ice map to highlight active event and update puck position\n    if (this.reviewAnnotationIceMapComponentOutlet) {\n      this.reviewAnnotationIceMapComponentOutlet.highlightActiveEvent(activeEventIndex)\n      this.reviewAnnotationIceMapComponentOutlet.updatePuckPosition(shotRelativeTime)\n    }\n\n    // Update event form with the most recent event type for available event types\n    if (this.reviewAnnotationEventFormComponentOutlet && activeEvent) {\n      this.reviewAnnotationEventFormComponentOutlet.setPreviousEventType(activeEvent.event_type)\n    } else if (this.reviewAnnotationEventFormComponentOutlet) {\n      // No active event, clear previous event type to show initial event types\n      this.reviewAnnotationEventFormComponentOutlet.setPreviousEventType('initial')\n    }\n  }\n\n  seekToTimestamp(timestamp) {\n    this.reviewPlayerComponentOutlet.seekToLocalTime(timestamp)\n  }\n\n  goToFirstEvent() {\n    // If there are pre-event events, go to the first event\n    if (this.hasPreShotEvents()) {\n      const localTime = this.eventsValue[0].clip_timestamp\n      this.seekToTimestamp(localTime)\n      return\n    }\n\n    // If there's an initiating event (shot/dump_in/puck_play) but no pre-events, go to 5 seconds before\n    if (this.hasShotEvent()) {\n      const preEventTime = this.shotTimestampValue - 5\n      this.seekToTimestamp(preEventTime)\n      return\n    }\n\n    // No initiating event, go to the clip point timestamp\n    this.seekToTimestamp(this.shotTimestampValue)\n  }\n\n  goToLastEvent() {\n    // if there are no events, go to the clip point timestamp\n    if (this.eventsValue.length > 0) {\n      const localTime = this.eventsValue[this.eventsValue.length - 1].clip_timestamp\n      this.seekToTimestamp(localTime)\n    }\n  }\n\n  getCurrentTimestamp() {\n    return this.reviewPlayerComponentOutlet.currentLocalTime || 0\n  }\n\n  enableEventForm() {\n    if (this.reviewAnnotationEventFormComponentOutlet) {\n      this.reviewAnnotationEventFormComponentOutlet.enable()\n    }\n  }\n\n  clearEventForm() {\n    if (this.reviewAnnotationEventFormComponentOutlet) {\n      this.reviewAnnotationEventFormComponentOutlet.clearForm()\n    }\n  }\n\n  updateTimeline() {\n    // Update timeline component with current events\n    const timelineController = this.getTimelineController()\n    if (timelineController) {\n      timelineController.updateEvents(this.eventsValue)\n    }\n  }\n\n  updateIceMapVisualization() {\n    // Send events to ice map component for visualization\n    if (this.reviewAnnotationIceMapComponentOutlet) {\n      console.log(\"Updating ice map visualization\")\n      console.log(\"Events:\", this.eventsValue)\n      this.reviewAnnotationIceMapComponentOutlet.renderEventSequence(this.eventsValue)\n\n      // Update puck position after rendering\n      const currentTime = this.getCurrentTimestamp()\n      const shotRelativeTime = this.relativeTimestamp(currentTime)\n      this.reviewAnnotationIceMapComponentOutlet.updatePuckPosition(shotRelativeTime)\n    }\n\n    // Check if action buttons should be shown after updating events\n    this.checkAndShowActionButtons()\n  }\n\n  saveSequence() {\n    // Save the complete event sequence\n    const sequenceData = {\n      shot_timestamp: this.shotTimestampValue,\n      events: this.eventsValue,\n      forward_duration: this.forwardDurationValue,\n      backward_duration: this.backwardDurationValue\n    }\n\n    console.log(\"Saving event sequence:\", sequenceData)\n\n    // Dispatch save event\n    const saveEvent = new CustomEvent('event-sequence:sequence-saved', {\n      detail: sequenceData,\n      bubbles: true\n    })\n    this.element.dispatchEvent(saveEvent)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Review::Annotation::EventTypeSelector\n * Handles keyboard shortcuts for event type selection\n */\nexport default class extends Controller {\n  connect() {\n    this.setupKeyboardListener()\n  }\n\n  disconnect() {\n    this.removeKeyboardListener()\n  }\n\n  setupKeyboardListener() {\n    this.boundHandleKeydown = this.handleKeydown.bind(this)\n    document.addEventListener('keydown', this.boundHandleKeydown)\n  }\n\n  removeKeyboardListener() {\n    if (this.boundHandleKeydown) {\n      document.removeEventListener('keydown', this.boundHandleKeydown)\n    }\n  }\n\n  handleKeydown(event) {\n    // Only handle if the event type selector is visible\n    const eventTypeSelector = this.element.closest('[data-review--annotation--event-form-component-target=\"eventTypeSelector\"]')\n    if (!eventTypeSelector || eventTypeSelector.classList.contains('hidden')) {\n      return\n    }\n\n    // Only handle digit keys 0-9\n    const key = event.key\n    if (!/^[0-9]$/.test(key)) return\n\n    // Find button with this shortcut\n    const allButtons = this.element.querySelectorAll('button[data-event-type]')\n    const targetButton = Array.from(allButtons).find(button => {\n      const shortcutSpan = button.querySelector('.text-xs.font-mono')\n      return shortcutSpan && shortcutSpan.textContent.trim() === key\n    })\n\n    if (!targetButton) return\n\n    // Don't trigger if button is disabled\n    if (targetButton.disabled) return\n\n    // Prevent default behavior\n    event.preventDefault()\n\n    // Click the button (which will trigger the event form controller's handleSelectEventType)\n    targetButton.click()\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"rink\", \"markerOverlay\", \"coordinates\", \"coordinateDisplay\", \"eventSequenceOverlay\", \"rotatable\", \"container\"]\n  static values = {\n    rinkDimensions: Object,\n    rotation: { type: String, default: \"down\" }\n  }\n\n  // Global variable key for temporary rotation persistence (cleared on navigation)\n  get globalRotationKey() {\n    return '_iceMapRotation'\n  }\n\n  get rotationButtons() {\n    // Find rotation buttons in parent element (buttons are outside controller scope for outlet compatibility)\n    const parentElement = this.element.parentElement\n    if (!parentElement) return []\n\n    const buttonGroup = parentElement.querySelector('[data-ice-map-rotation-buttons=\"true\"]')\n    if (!buttonGroup) return []\n\n    return Array.from(buttonGroup.querySelectorAll('button'))\n  }\n\n  currentEvents = []\n  puckElement = null\n  markers = []\n  eventSequenceElements = []\n\n  connect() {\n    console.log(\"Ice map controller connected\")\n    console.log(\"Controller element:\", this.element)\n    console.log(\"Has rink target:\", this.hasRinkTarget)\n    console.log(\"Has marker overlay target:\", this.hasMarkerOverlayTarget)\n    console.log(\"Rink dimensions:\", this.rinkDimensionsValue)\n\n    // Restore rotation from global variable (persists through Turbo Stream replacements only)\n    const savedRotation = window[this.globalRotationKey]\n    if (savedRotation && ['down', 'left', 'right'].includes(savedRotation)) {\n      this.rotationValue = savedRotation\n    }\n\n    // Clear rotation on navigation (but not on Turbo Stream replacements)\n    this.navigationHandler = () => {\n      delete window[this.globalRotationKey]\n    }\n    document.addEventListener('turbo:before-visit', this.navigationHandler)\n\n    // Listen for window resize events to redraw event sequence\n    this.resizeObserver = new ResizeObserver(() => {\n      console.log(\"Resize observer called\")\n      this.redrawEventSequence()\n    })\n\n    if (this.hasRinkTarget) {\n      this.resizeObserver.observe(this.rinkTarget)\n    }\n\n    // Listen for timestamp updates from video player\n    this.element.addEventListener('player:timeupdate', (event) => {\n      this.handleTimestampUpdate(event.detail)\n    })\n\n    // Listen for rotation keyboard shortcuts (from document level)\n    this.rotationHandler = (event) => {\n      this.setRotation(event.detail.rotation)\n    }\n    document.addEventListener('ice-map:rotate', this.rotationHandler)\n\n    // Apply initial rotation, aspect ratio, and button states\n    this.updateContainerAspectRatio()\n    this.applyRotation()\n    this.updateButtonStates()\n  }\n\n  disconnect() {\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect()\n    }\n    if (this.rotationHandler) {\n      document.removeEventListener('ice-map:rotate', this.rotationHandler)\n    }\n    if (this.navigationHandler) {\n      document.removeEventListener('turbo:before-visit', this.navigationHandler)\n    }\n  }\n\n  // Rotation management methods\n  setRotation(rotation) {\n    this.rotationValue = rotation\n    // Persist to global variable (survives Turbo Stream replacements but not navigation)\n    window[this.globalRotationKey] = rotation\n  }\n\n  rotationValueChanged() {\n    this.applyRotation()\n    this.updateButtonStates()\n    this.redrawEventSequence()\n  }\n\n  applyRotation() {\n    if (!this.hasRotatableTarget || !this.hasRinkTarget) return\n\n    const rotations = {\n      'down': '0deg',\n      'left': '90deg',\n      'right': '-90deg'\n    }\n\n    const rotation = rotations[this.rotationValue] || '0deg'\n    this.rotatableTarget.style.transform = `rotate(${rotation})`\n\n    // Set viewBox to always show the defensive zone (bottom half of full rink)\n    // The CSS rotation will rotate this view\n    this.rinkTarget.setAttribute('viewBox', '0 626 617 626')\n    this.rinkTarget.style.width = '100%'\n    this.rinkTarget.style.height = '100%'\n\n    // Update container aspect ratio based on rotation\n    this.updateContainerAspectRatio()\n  }\n\n  updateContainerAspectRatio() {\n    if (!this.hasContainerTarget || !this.rinkDimensionsValue) return\n\n    // Calculate aspect ratio based on the viewBox dimensions we're actually showing\n    // Normal (down): viewBox=\"0 626 617 626\" \u2192 aspect = 617/626 \u2248 0.986\n    // Left (90\u00B0 CW): viewBox=\"626 0 626 617\" \u2192 aspect = 626/617 \u2248 1.015\n    // Right (90\u00B0 CCW): viewBox=\"0 0 626 617\" \u2192 aspect = 626/617 \u2248 1.015\n    const isRotated = this.rotationValue === 'left' || this.rotationValue === 'right'\n    const aspectRatio = isRotated\n      ? this.rinkDimensionsValue.svg_height / this.rinkDimensionsValue.svg_width\n      : this.rinkDimensionsValue.svg_width / this.rinkDimensionsValue.svg_height\n\n    this.containerTarget.style.aspectRatio = aspectRatio.toFixed(3)\n    this.containerTarget.style.transition = 'aspect-ratio 0.3s ease'\n  }\n\n  updateButtonStates() {\n    const activeClasses = ['bg-gray-100', 'text-gray-900']\n    const inactiveClasses = ['bg-white', 'text-gray-700']\n\n    this.rotationButtons.forEach(button => {\n      const buttonValue = button.getAttribute('data-rotation-value')\n\n      if (this.rotationValue === buttonValue) {\n        // Active/pressed state: depressed button with inner shadow\n        button.classList.remove(...inactiveClasses)\n        button.classList.add(...activeClasses)\n        button.style.boxShadow = 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.1)'\n      } else {\n        // Inactive state: normal button\n        button.classList.remove(...activeClasses)\n        button.classList.add(...inactiveClasses)\n        button.style.boxShadow = ''\n      }\n    })\n  }\n\n  rotateLeft() {\n    this.setRotation('left')\n  }\n\n  rotateDown() {\n    this.setRotation('down')\n  }\n\n  rotateRight() {\n    this.setRotation('right')\n  }\n\n  // Transform click coordinates based on rotation\n  // When rotated via CSS, the bounding rect rotates too, so we need to \"unrotate\"\n  // the click position back to the normal orientation before converting to ice coords\n  transformClickCoordinates(x, y, width, height) {\n    if (this.rotationValue === 'left') {\n      // 90\u00B0 CW rotation: to unrotate, apply 90\u00B0 CCW\n      // In rotated view: top = left side of ice, bottom = right side\n      // Transform: (x_rot, y_rot) \u2192 (y_rot, width - x_rot)\n      return { x: y, y: width - x }\n    } else if (this.rotationValue === 'right') {\n      // 90\u00B0 CCW rotation: to unrotate, apply 90\u00B0 CW\n      // In rotated view: top = right side of ice, bottom = left side\n      // Transform: (x_rot, y_rot) \u2192 (height - y_rot, x_rot)\n      return { x: height - y, y: x }\n    }\n    // No rotation\n    return { x, y }\n  }\n\n  handleClick(event) {\n    console.log(\"handleClick called\", event)\n    console.log(\"Event target:\", event.target)\n    console.log(\"Event currentTarget:\", event.currentTarget)\n    event.preventDefault()\n\n    if (!this.hasRinkTarget) {\n      console.log(\"No rink target found\")\n      return\n    }\n\n    // Get click coordinates relative to SVG\n    const rect = this.rinkTarget.getBoundingClientRect()\n    let clickX = event.clientX - rect.left\n    let clickY = event.clientY - rect.top\n\n    // When rotated, the bounding rect dimensions swap\n    // We need the original (non-rotated) dimensions for viewBox conversion\n    const isRotated = this.rotationValue === 'left' || this.rotationValue === 'right'\n    const originalWidth = isRotated ? rect.height : rect.width\n    const originalHeight = isRotated ? rect.width : rect.height\n\n    // Transform coordinates based on rotation (unrotate click back to normal orientation)\n    const transformed = this.transformClickCoordinates(clickX, clickY, rect.width, rect.height)\n    const x = transformed.x\n    const y = transformed.y\n\n    // ViewBox is always '0 626 617 626' (showing defensive zone)\n    // This means: x from 0-617, y from 626-1252 in the full SVG coordinate system\n    // The transformClickCoordinates already handled rotation, so we use constant mappings\n    const svgWidth = this.rinkDimensionsValue.svg_width  // 617\n    const svgHeight = this.rinkDimensionsValue.svg_height  // 626 (full viewBox height)\n    const iceWidth = this.rinkDimensionsValue.width  // 98.42 ft\n    const iceHeight = this.rinkDimensionsValue.height / 2  // 100.065 ft\n\n    // Convert viewport click to viewBox coordinates using original dimensions\n    // Top of viewport (y=0) \u2192 viewBox y=626 (top of defensive zone)\n    // Bottom of viewport (y=originalHeight) \u2192 viewBox y=1252 (goal line)\n    const viewBoxX = (x / originalWidth) * svgWidth  // 0 to 617\n    const viewBoxY = 626 + (y / originalHeight) * svgHeight  // 626 to 1252\n\n    // Convert viewBox coordinates to ice coordinates (feet)\n    // Ice x: 0 to 98.42 ft (left to right)\n    // Ice y: 0 to 100.065 ft (goal line to blue line)\n    const iceX = (viewBoxX / svgWidth) * iceWidth\n    // ViewBox y=1252 (bottom) \u2192 ice y=0 (goal line)\n    // ViewBox y=626 (top) \u2192 ice y=100.065 (blue line)\n    const iceY = ((svgHeight * 2 - viewBoxY) / svgHeight) * iceHeight\n\n    // Convert to net-relative coordinates\n    const netX = iceX - this.rinkDimensionsValue.net_center_x\n    const netY = iceY - this.rinkDimensionsValue.goal_line_distance\n\n    console.log(`Click at ViewBox: (${viewBoxX.toFixed(2)}, ${viewBoxY.toFixed(2)}) -> Ice: (${iceX.toFixed(2)}ft, ${iceY.toFixed(2)}ft) -> Net: (${netX.toFixed(2)}ft, ${netY.toFixed(2)}ft)`)\n\n\n    // Add visual marker using transformed coordinates (unrotated back to normal orientation)\n    this.addMarker(x, y)\n\n    // Show coordinates (net-relative)\n    this.showCoordinates(netX, netY)\n\n    // Dispatch event with net-relative coordinates\n    const coordinateEvent = new CustomEvent('ice-map:coordinate-selected', {\n      detail: {\n        x: netX,\n        y: netY,\n        iceX: iceX,\n        iceY: iceY,\n        svgX: viewBoxX,\n        svgY: viewBoxY,\n        clickX: x,\n        clickY: y\n      },\n      bubbles: true\n    })\n\n    this.element.dispatchEvent(coordinateEvent)\n  }\n\n  addMarker(x, y) {\n    if (!this.hasMarkerOverlayTarget) return\n\n    // Remove previous marker\n    this.clearMarkers()\n\n    // Create new marker\n    const marker = document.createElement('div')\n    marker.className = 'absolute w-3 h-3 bg-red-500 border-2 border-white rounded-full transform -translate-x-1/2 -translate-y-1/2 pointer-events-none z-10'\n\n    // Set the marker position by percentage so that screen size changes don't affect the position\n    // The overlay is also rotated, so we need to use the original (non-rotated) dimensions\n    const overlayRect = this.markerOverlayTarget.getBoundingClientRect()\n    const isRotated = this.rotationValue === 'left' || this.rotationValue === 'right'\n    const originalOverlayWidth = isRotated ? overlayRect.height : overlayRect.width\n    const originalOverlayHeight = isRotated ? overlayRect.width : overlayRect.height\n\n    const markerX = x / originalOverlayWidth * 100\n    const markerY = y / originalOverlayHeight * 100\n    marker.style.left = `${markerX}%`\n    marker.style.top = `${markerY}%`\n\n    this.markerOverlayTarget.appendChild(marker)\n    this.markers.push(marker)\n\n    // Add pulse animation\n    marker.classList.add('animate-pulse')\n    setTimeout(() => {\n      if (marker.parentNode) {\n        marker.classList.remove('animate-pulse')\n      }\n    }, 2000)\n  }\n\n  clearMarkers() {\n    this.markers.forEach(marker => {\n      if (marker.parentNode) {\n        marker.parentNode.removeChild(marker)\n      }\n    })\n    this.markers = []\n  }\n\n  showCoordinates(x, y) {\n    if (this.hasCoordinatesTarget && this.hasCoordinateDisplayTarget) {\n      this.coordinatesTarget.classList.remove('hidden')\n      this.coordinateDisplayTarget.textContent = `(${x.toFixed(2)}ft, ${y.toFixed(2)}ft)`\n    }\n  }\n\n  hideCoordinates() {\n    if (this.hasCoordinatesTarget) {\n      this.coordinatesTarget.classList.add('hidden')\n    }\n  }\n\n  // Method to add event markers for visualization\n  addEventMarker(x, y, eventType, eventId) {\n    if (!this.hasMarkerOverlayTarget) return\n\n    const colors = {\n      'shot': 'bg-red-500',\n      'shot_attempt': 'bg-orange-500',\n      'block': 'bg-gray-500',\n      'frozen_save': 'bg-sky-500',\n      'rebounded_save': 'bg-cyan-500',\n      'rebounded_out_of_play': 'bg-purple-500',\n      'pass': 'bg-blue-500',\n      'carry': 'bg-green-500',\n      'battle': 'bg-purple-500',\n      'redirect': 'bg-amber-500',\n      'goal': 'bg-red-600',\n      'save': 'bg-sky-500',\n      'rebound': 'bg-cyan-500',\n      'loose_puck': 'bg-yellow-400',\n      'out_of_play': 'bg-gray-400',\n      'play_stoppage': 'bg-gray-500',\n      'zone_entry': 'bg-lime-500',\n      'zone_exit': 'bg-green-500',\n      'catch': 'bg-pink-500',\n      'freeze': 'bg-indigo-500'\n    }\n\n    const marker = document.createElement('div')\n    marker.className = `absolute w-2 h-2 ${colors[eventType] || 'bg-gray-500'} border border-white rounded-full transform -translate-x-1/2 -translate-y-1/2 pointer-events-none opacity-75`\n    marker.style.left = `${x}px`\n    marker.style.top = `${y}px`\n    marker.dataset.eventId = eventId\n    marker.dataset.eventType = eventType\n\n    this.markerOverlayTarget.appendChild(marker)\n  }\n\n  // Render event sequence on the ice map\n  renderEventSequence(events) {\n    this.currentEvents = events\n    this.redrawEventSequence()\n  }\n\n  // Redraw event sequence (called on resize or when events change)\n  redrawEventSequence() {\n    console.log(\"Redrawing event sequence\")\n    if (!this.currentEvents || !this.hasEventSequenceOverlayTarget) {\n      console.log(\"currentEvents\", this.currentEvents)\n      console.log(\"No current events or event sequence overlay target found\")\n      return\n    }\n\n    // Clear existing event sequence elements\n    this.clearEventSequenceElements()\n\n    // Clear puck when redrawing\n    this.hidePuck()\n\n    if (this.currentEvents.length === 0) {\n      return\n    }\n\n    // Create SVG overlay for lines\n    const svgOverlay = this.createSVGOverlay()\n    this.eventSequenceOverlayTarget.appendChild(svgOverlay)\n    this.eventSequenceElements.push(svgOverlay)\n\n    // Draw events and connecting lines\n    this.drawEventSequence(svgOverlay)\n  }\n\n  // Create SVG overlay for drawing lines\n  createSVGOverlay() {\n    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n    svg.style.position = 'absolute'\n    svg.style.top = '0'\n    svg.style.left = '0'\n    svg.style.width = '100%'\n    svg.style.height = '100%'\n    svg.style.pointerEvents = 'none'\n    svg.style.zIndex = '5'\n    return svg\n  }\n\n  // Draw the event sequence with dots and connecting lines\n  drawEventSequence(svgOverlay) {\n    const colors = {\n      'shot': '#ef4444',\n      'shot_attempt': '#f97316',\n      'block': '#6b7280',\n      'frozen_save': '#0ea5e9',\n      'rebounded_save': '#06b6d4',\n      'rebounded_out_of_play': '#8b5cf6',\n      'pass': '#3b82f6',\n      'carry': '#10b981',\n      'battle': '#8b5cf6',\n      'redirect': '#f59e0b',\n      'goal': '#dc2626',\n      'save': '#0ea5e9',\n      'rebound': '#06b6d4',\n      'loose_puck': '#fbbf24',\n      'out_of_play': '#9ca3af',\n      'play_stoppage': '#6b7280',\n      'zone_entry': '#84cc16',\n      'zone_exit': '#22c55e',\n      'catch': '#ec4899',\n      'freeze': '#6366f1'\n    }\n\n    // Events are already ordered by timestamp from the database\n    this.currentEvents.forEach((event, index) => {\n      // Convert net-relative coordinates to SVG coordinates\n      const svgCoords = this.netCoordinatesToSVG(event.x_coordinate, event.y_coordinate)\n      \n      // Draw event dot\n      const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n      circle.setAttribute('cx', svgCoords.x)\n      circle.setAttribute('cy', svgCoords.y)\n      circle.setAttribute('r', '4')\n      circle.setAttribute('fill', colors[event.event_type] || '#6b7280')\n      circle.setAttribute('stroke', 'white')\n      circle.setAttribute('stroke-width', '2')\n      circle.setAttribute('data-event-index', index.toString())\n      circle.setAttribute('data-event-type', event.event_type)\n      \n      svgOverlay.appendChild(circle)\n      this.eventSequenceElements.push(circle)\n\n      // Draw connecting line to next event\n      if (index < this.currentEvents.length - 1) {\n        const nextEvent = this.currentEvents[index + 1]\n        const nextSvgCoords = this.netCoordinatesToSVG(nextEvent.x_coordinate, nextEvent.y_coordinate)\n        \n        const line = document.createElementNS('http://www.w3.org/2000/svg', 'line')\n        line.setAttribute('x1', svgCoords.x)\n        line.setAttribute('y1', svgCoords.y)\n        line.setAttribute('x2', nextSvgCoords.x)\n        line.setAttribute('y2', nextSvgCoords.y)\n        line.setAttribute('stroke', colors[event.event_type] || '#6b7280')\n        line.setAttribute('stroke-width', '2')\n        line.setAttribute('stroke-dasharray', '5,5')\n        line.setAttribute('opacity', '0.7')\n        \n        svgOverlay.appendChild(line)\n        this.eventSequenceElements.push(line)\n      }\n    })\n  }\n\n  // Convert net-relative coordinates to SVG coordinates\n  netCoordinatesToSVG(netX, netY) {\n    if (!this.rinkDimensionsValue) {\n      return { x: 0, y: 0 }\n    }\n\n    netX = parseFloat(netX)\n    netY = parseFloat(netY)\n\n    // Convert net-relative coordinates back to ice coordinates\n    const iceX = parseFloat(netX + this.rinkDimensionsValue.net_center_x)\n    const iceY = parseFloat(netY + this.rinkDimensionsValue.goal_line_distance)\n\n    // Convert ice coordinates to SVG coordinates (matching the click handler logic)\n    const svgX = (iceX / this.rinkDimensionsValue.width) * this.rinkDimensionsValue.svg_width\n    const svgY = (iceY / this.rinkDimensionsValue.height) * this.rinkDimensionsValue.svg_height\n\n    // Convert SVG coordinates to percentage for responsive positioning\n    const percentX = (svgX / this.rinkDimensionsValue.svg_width) * 100\n    // The SVG is flipped vertically, so we need to invert the y coordinate and since\n    // we're only showing the bottom half of the SVG, we need to multiply by 2\n    const percentY = 100.0 - ((svgY / this.rinkDimensionsValue.svg_height) * 100) * 2\n\n    return { x: `${percentX}%`, y: `${percentY}%` }\n  }\n\n  // Clear event sequence elements\n  clearEventSequenceElements() {\n    this.eventSequenceElements.forEach(element => {\n      if (element.parentNode) {\n        element.parentNode.removeChild(element)\n      }\n    })\n    this.eventSequenceElements = []\n  }\n\n  // Highlight the active event on the ice map\n  highlightActiveEvent(activeEventIndex) {\n    // Remove active highlighting from all event circles\n    this.eventSequenceElements.forEach(element => {\n      if (element.tagName === 'circle') {\n        element.classList.remove('animate-pulse')\n        element.setAttribute('stroke-width', '2')\n        element.setAttribute('r', '4')\n        // Remove any custom styling\n        element.style.filter = ''\n        element.style.stroke = ''\n      }\n    })\n\n    // Highlight the active event if it exists\n    if (activeEventIndex >= 0 && activeEventIndex < this.currentEvents.length) {\n      // Find the corresponding circle element by the original event index\n      const activeEventElement = this.eventSequenceElements.find(element => \n        element.tagName === 'circle' && \n        element.getAttribute('data-event-index') === activeEventIndex.toString()\n      )\n\n      if (activeEventElement) {\n        // Add Tailwind classes for active event styling\n        activeEventElement.classList.add('animate-pulse')\n        activeEventElement.setAttribute('stroke-width', '4')\n        activeEventElement.setAttribute('r', '6')\n        \n        // Add custom inline styles for drop shadow and stroke color\n        activeEventElement.style.filter = 'drop-shadow(0 0 8px rgba(59, 130, 246, 0.8))'\n        activeEventElement.style.stroke = '#3b82f6'\n        \n        // Remove pulse animation after 2 seconds\n        setTimeout(() => {\n          if (activeEventElement.style.stroke === '#3b82f6') {\n            activeEventElement.classList.remove('animate-pulse')\n          }\n        }, 2000)\n      }\n    }\n  }\n\n  // Update puck position based on current timestamp\n  updatePuckPosition(currentTimestamp) {\n    if (!this.currentEvents || this.currentEvents.length === 0) {\n      this.hidePuck()\n      return\n    }\n\n    // Find the earliest and latest event timestamps\n    const timestamps = this.currentEvents.map(event => parseFloat(event.timestamp || event.start_timestamp))\n    const earliestTime = Math.min(...timestamps)\n    const latestTime = Math.max(...timestamps)\n\n    // If current timestamp is before the earliest event, don't show puck\n    if (currentTimestamp < earliestTime) {\n      this.hidePuck()\n      return\n    }\n\n    // If current timestamp is after the latest event, place puck at the last event location\n    if (currentTimestamp >= latestTime) {\n      const lastEvent = this.currentEvents[this.currentEvents.length - 1]\n      const puckPosition = this.netCoordinatesToSVG(lastEvent.x_coordinate, lastEvent.y_coordinate)\n      this.showPuck(puckPosition.x, puckPosition.y)\n      return\n    }\n\n    // Find the two events to interpolate between\n    let eventA = null\n    let eventB = null\n\n    for (let i = 0; i < this.currentEvents.length - 1; i++) {\n      const event1 = this.currentEvents[i]\n      const event2 = this.currentEvents[i + 1]\n      const time1 = parseFloat(event1.timestamp || event1.start_timestamp)\n      const time2 = parseFloat(event2.timestamp || event2.start_timestamp)\n\n      if (currentTimestamp >= time1 && currentTimestamp <= time2) {\n        eventA = event1\n        eventB = event2\n        break\n      }\n    }\n\n    if (eventA && eventB) {\n      // Interpolate puck position between the two events\n      const timeA = parseFloat(eventA.timestamp || eventA.start_timestamp)\n      const timeB = parseFloat(eventB.timestamp || eventB.start_timestamp)\n      const timeDiff = timeB - timeA\n      const currentDiff = currentTimestamp - timeA\n      const interpolationRatio = timeDiff > 0 ? currentDiff / timeDiff : 0\n\n      // Interpolate coordinates\n      const xA = parseFloat(eventA.x_coordinate)\n      const yA = parseFloat(eventA.y_coordinate)\n      const xB = parseFloat(eventB.x_coordinate)\n      const yB = parseFloat(eventB.y_coordinate)\n\n      const interpolatedX = xA + (xB - xA) * interpolationRatio\n      const interpolatedY = yA + (yB - yA) * interpolationRatio\n\n      // Convert to SVG coordinates and show puck\n      const puckPosition = this.netCoordinatesToSVG(interpolatedX, interpolatedY)\n      this.showPuck(puckPosition.x, puckPosition.y)\n    } else {\n      // Fallback: hide puck if we can't interpolate\n      this.hidePuck()\n    }\n  }\n\n  // Show puck at the specified position\n  showPuck(x, y) {\n    if (!this.hasEventSequenceOverlayTarget) return\n\n    // Remove existing puck if it exists\n    this.hidePuck()\n\n    // Create puck element\n    this.puckElement = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n    this.puckElement.setAttribute('cx', x)\n    this.puckElement.setAttribute('cy', y)\n    this.puckElement.setAttribute('r', '3')\n    this.puckElement.setAttribute('fill', '#000000')\n    this.puckElement.setAttribute('stroke', '#ffffff')\n    this.puckElement.setAttribute('stroke-width', '1')\n    this.puckElement.setAttribute('data-puck', 'true')\n    this.puckElement.style.zIndex = '10'\n\n    // Add to the SVG overlay\n    const svgOverlay = this.eventSequenceOverlayTarget.querySelector('svg')\n    if (svgOverlay) {\n      svgOverlay.appendChild(this.puckElement)\n    }\n  }\n\n  // Hide the puck\n  hidePuck() {\n    if (this.puckElement && this.puckElement.parentNode) {\n      this.puckElement.parentNode.removeChild(this.puckElement)\n      this.puckElement = null\n    }\n  }\n\n  // Handle timestamp updates from video player\n  handleTimestampUpdate(detail) {\n    const currentTime = detail.localTime || detail.timestamp || 0\n    this.updatePuckPosition(currentTime)\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"manualClipLink\"]\n  static values = {\n    clipPointId: String,\n    clipPointTimestamp: Number\n  }\n  static outlets = [\"review--player-component\", \"review--annotation--event-sequence-component\"]\n\n  connect() {\n    console.log(\"Annotation studio controller connected\")\n    this.setupEventListeners()\n\n    // Show the overlay initially for new clip points\n    this.showOverlay()\n  }\n\n  clipPointTimestampValueChanged() {\n    console.log(\"Clip point timestamp changed\")\n    // Don't show overlay on timestamp changes, only on ID changes\n  }\n\n  reviewPlayerComponentOutletConnected(outlet) {\n    console.log(\"Video player outlet connected\")\n    this.videoPlayerOutlet = outlet\n\n    // Set initial timestamp when player is ready\n    if (this.clipPointTimestampValue) {\n      console.log(`Setting initial timestamp: ${this.clipPointTimestampValue}`)\n      outlet.seekToLocalTime(this.clipPointTimestampValue)\n    }\n  }\n\n  setupEventListeners() {\n    // Listen for ice map coordinate clicks\n    this.element.addEventListener('ice-map:coordinate-selected', (event) => {\n      this.reviewAnnotationEventSequenceComponentOutlet.handleCoordinateSelected(event, this.getCurrentTimestamp())\n    })\n\n    // Listen for player initialization to seek to clip point timestamp\n    this.element.addEventListener('player:initialized', (event) => {\n      this.handlePlayerInitialized(event)\n    })\n  }\n\n  handlePlayerInitialized(detail) {\n    console.log(\"Player initialized:\", detail)\n\n    // Set initial timestamp using outlet\n    if (this.hasReviewPlayerComponentOutlet && this.clipPointTimestampValue) {\n      console.log(`Seeking to clip point timestamp: ${this.clipPointTimestampValue}`)\n      this.backToStart()\n    }\n  }\n\n  // Frame-by-frame controls\n  nextFrame() {\n    if (this.hasReviewPlayerComponentOutlet) {\n      this.reviewPlayerComponentOutlet.nextFrame()\n    }\n  }\n\n  previousFrame() {\n    if (this.hasReviewPlayerComponentOutlet) {\n      this.reviewPlayerComponentOutlet.previousFrame()\n    }\n  }\n\n  minusOneSecond() {\n    if (this.hasReviewPlayerComponentOutlet) {\n      this.reviewPlayerComponentOutlet.seekToLocalTime(this.getCurrentTimestamp() - 1)\n    }\n  }\n\n  plusOneSecond() {\n    if (this.hasReviewPlayerComponentOutlet) {\n      this.reviewPlayerComponentOutlet.seekToLocalTime(this.getCurrentTimestamp() + 1)\n    }\n  }\n\n  backToStart() {\n    if (this.hasReviewPlayerComponentOutlet) {\n      this.reviewPlayerComponentOutlet.seekToLocalTime(this.clipPointTimestampValue)\n    }\n  }\n\n  // Playback controls\n  togglePlayPause() {\n    if (this.hasReviewPlayerComponentOutlet) {\n      if (this.reviewPlayerComponentOutlet.isPlaying()) {\n        this.reviewPlayerComponentOutlet.pause()\n      } else {\n        this.reviewPlayerComponentOutlet.play()\n      }\n    }\n  }\n\n  // Seek to specific timestamp\n  seekToTimestamp(timestamp) {\n    if (this.hasReviewPlayerComponentOutlet) {\n      this.reviewPlayerComponentOutlet.seekToLocalTime(timestamp)\n    }\n  }\n\n  // Get current timestamp\n  getCurrentTimestamp() {\n    if (this.hasReviewPlayerComponentOutlet) {\n      return this.reviewPlayerComponentOutlet.currentLocalTime || 0\n    }\n    return 0\n  }\n\n  // Get current timestamp relative to clip point (for event annotation)\n  getCurrentRelativeTimestamp() {\n    const currentTime = this.getCurrentTimestamp()\n    return currentTime - (this.clipPointTimestampValue || 0)\n  }\n\n  // Show the clip point overlay\n  showOverlay() {\n    const overlay = this.element.querySelector('[data-controller*=\"clip-point-overlay-component\"]')\n    if (overlay) {\n      overlay.classList.remove('hidden')\n    }\n  }\n\n  // Hide the clip point overlay\n  hideOverlay() {\n    const overlay = this.element.querySelector('[data-controller*=\"clip-point-overlay-component\"]')\n    if (overlay) {\n      overlay.classList.add('hidden')\n    }\n  }\n\n  // Play shot sequence functionality moved from clip point overlay controller\n  async playShotSequence(clipPointTimestamp) {\n    if (!this.hasReviewPlayerComponentOutlet) {\n      console.error(\"Player component outlet not available\")\n      return\n    }\n\n    // Calculate the shot sequence timing\n    const shotStartTime = clipPointTimestamp - 0.75 // 0.75 seconds before\n    const shotEndTime = clipPointTimestamp + 1.5   // 1.5 seconds after\n\n    try {\n      // Ensure we start from a paused state\n      if (this.reviewPlayerComponentOutlet.isPlaying()) {\n        this.reviewPlayerComponentOutlet.pause()\n        await this.sleep(100)\n      }\n\n      // Seek to the shot start time\n      console.log(`Seeking to shot start time: ${shotStartTime}`)\n      this.reviewPlayerComponentOutlet.seekToLocalTime(shotStartTime)\n\n      // Wait a moment for seeking to complete\n      await this.sleep(500)\n\n      // Start playing\n      console.log(\"Starting playback of shot sequence\")\n      this.reviewPlayerComponentOutlet.play()\n\n      // Wait for the shot sequence to complete\n      const sequenceDuration = (shotEndTime - shotStartTime) * 1000 // Convert to milliseconds\n      await this.sleep(sequenceDuration)\n\n      // Pause the video\n      this.reviewPlayerComponentOutlet.pause()\n\n      // Wait a moment\n      await this.sleep(500)\n\n      // Return to the clip point timestamp\n      console.log(`Returning to clip point timestamp: ${clipPointTimestamp}`)\n      this.reviewPlayerComponentOutlet.seekToLocalTime(clipPointTimestamp)\n\n      console.log(\"Shot sequence completed, ready for annotation\")\n\n    } catch (error) {\n      console.error(\"Error during shot sequence playback:\", error)\n      // Fallback: just seek to the clip point timestamp\n      try {\n        this.reviewPlayerComponentOutlet.seekToLocalTime(clipPointTimestamp)\n      } catch (fallbackError) {\n        console.error(\"Fallback seek also failed:\", fallbackError)\n      }\n    }\n  }\n\n  sleep(ms) {\n    return new Promise(resolve => setTimeout(resolve, ms))\n  }\n\n  // Replay shot sequence\n  replayShot() {\n    console.log(\"Replaying shot sequence\")\n    this.playShotSequence(this.clipPointTimestampValue)\n  }\n\n  goToFirstEvent() {\n    console.log(\"Going to first event\")\n    this.reviewAnnotationEventSequenceComponentOutlet.goToFirstEvent()\n  }\n\n  goToLastEvent() {\n    console.log(\"Going to last event\")\n    this.reviewAnnotationEventSequenceComponentOutlet.goToLastEvent()\n  }\n\n  prepareManualClipForm(event) {\n    if (!this.hasManualClipLinkTarget) return\n\n    // Get the current player timestamp and camera location from the clip point\n    if (!this.hasReviewPlayerComponentOutlet) {\n      console.error('No player outlet available')\n      return\n    }\n\n    const player = this.reviewPlayerComponentOutlet\n    const timestamp = player.currentLocalTime\n    const cameraLocationId = player.cameraLocationIdValue\n\n    console.log('Preparing manual clip form (annotation):', { timestamp, cameraLocationId })\n\n    // Get the base URL from the link\n    const baseUrl = this.manualClipLinkTarget.getAttribute('href')\n\n    // Add query parameters\n    const url = new URL(baseUrl, window.location.origin)\n    url.searchParams.set('timestamp', timestamp)\n    url.searchParams.set('camera_location_id', cameraLocationId)\n\n    console.log('Updated URL:', url.toString())\n\n    // Update the href\n    this.manualClipLinkTarget.setAttribute('href', url.toString())\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = { id: String }\n\n  connect() {\n    console.log(`Annotation point component connected: ${this.idValue}`)\n  }\n\n  // Seek to this annotation point's timestamp\n  seekTo() {\n    // This will be integrated with the video player\n    const timestamp = this.element.querySelector('.annotation-point-item').dataset.timestamp\n    console.log(`Seek to annotation point at ${timestamp} seconds`)\n    \n    // Dispatch event to studio component\n    this.dispatch('seek', { detail: { timestamp: parseFloat(timestamp) } })\n  }\n\n  // Edit this annotation point\n  edit() {\n    // This could open an edit modal or inline form\n    console.log(`Edit annotation point: ${this.idValue}`)\n  }\n\n  // Delete this annotation point\n  delete() {\n    if (confirm('Are you sure you want to delete this annotation point?')) {\n      const form = this.element.querySelector('form[method=\"delete\"]')\n      if (form) {\n        form.requestSubmit()\n      }\n    }\n  }\n} ", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Review::CameraContextMenu\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Review::CameraContextMenu controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Review::CameraContextMenu controller disconnected\")\n  }\n}\n", "/**\n * Enhanced HLS configuration for video.js to improve segment prefetching\n * and reduce waiting time during frequent skips\n */\n\nexport function getEnhancedHLSConfig() {\n  return {\n    html5: {\n      vhs: {\n        // Enhanced HLS buffering for frequent skips\n        GOAL_BUFFER_LENGTH: 100,\n        MAX_GOAL_BUFFER_LENGTH: 250,\n        BUFFER_LENGTH: 30,\n        MAX_BUFFER_LENGTH: 60,\n        BUFFER_LOW_WATER_LINE: 5,\n        BUFFER_HIGH_WATER_LINE: 15,\n        // Enable aggressive segment prefetching\n        ENABLE_LOW_LATENCY_HLS: true,\n        // Increase segment prefetch ahead\n        SEGMENT_PREFETCH_AHEAD: 3,\n        // Enable fast quality changes for skips\n        ENABLE_FAST_QUALITY_CHANGE: true,\n        // Additional optimizations for frequent seeking\n        ENABLE_SEGMENT_PREFETCH: true,\n        SEGMENT_PREFETCH_COUNT: 2,\n        // Reduce rebuffering during seeks\n        ENABLE_FAST_SEEK: true,\n        // Optimize for frequent time changes\n        ENABLE_AGGRESSIVE_BUFFERING: true\n      }\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { getEnhancedHLSConfig } from '../../utils/hls_config.js'\n\n/**\n * Stimulus controller for Review::CameraSyncModal\n * Handles two-step workflow for syncing cameras to a reference camera\n * Uses Video.js for HLS playback\n */\nexport default class extends Controller {\n  static targets = [\n    \"syncStep\",\n    \"sourcePlayer\", \"referencePlayer\",\n    \"sourceTimestamp\", \"referenceTimestamp\",\n    \"sourceTimestampField\", \"referenceTimestampField\",\n    \"saveButton\",\n    \"syncForm\"\n  ]\n\n  static values = {\n    sourceLocationId: String,\n    sourceVideoUrl: String,\n    referenceLocationId: String,\n    referenceVideoUrl: String,\n    sourceTime: Number,\n    referenceTime: Number\n  }\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   */\n  connect() {\n    // Wait for Video.js to be available, then initialize\n    this.waitForVideoJS().then(() => {\n      this.initializeVideoPlayers()\n    })\n  }\n\n  /**\n   * Wait for Video.js to be loaded\n   */\n  async waitForVideoJS() {\n    if (typeof window.videojs === 'function') {\n      return Promise.resolve()\n    }\n\n    return new Promise((resolve) => {\n      const checkVideoJS = setInterval(() => {\n        if (typeof window.videojs === 'function') {\n          clearInterval(checkVideoJS)\n          resolve()\n        }\n      }, 100)\n    })\n  }\n\n  /**\n   * Initialize Video.js players for HLS playback\n   */\n  async initializeVideoPlayers() {\n    const hlsConfig = getEnhancedHLSConfig()\n    const videojs = window.videojs\n\n    // Initialize source player\n    if (this.hasSourcePlayerTarget && this.sourceVideoUrlValue) {\n      await this.setupPlayer(\n        this.sourcePlayerTarget,\n        this.sourceVideoUrlValue,\n        hlsConfig,\n        videojs,\n        (player) => { this.sourcePlayer = player }\n      )\n    }\n\n    // Initialize reference player\n    if (this.hasReferencePlayerTarget && this.referenceVideoUrlValue) {\n      await this.setupPlayer(\n        this.referencePlayerTarget,\n        this.referenceVideoUrlValue,\n        hlsConfig,\n        videojs,\n        (player) => { this.referencePlayer = player }\n      )\n    }\n  }\n\n  /**\n   * Set up a single Video.js player with proper HLS configuration\n   */\n  async setupPlayer(videoElement, videoUrl, hlsConfig, videojs, setPlayer) {\n    // Fetch cookie for authentication\n    const cookieUrl = videoUrl\n    const cdnUrl = `https://cdn.creaselogic.com${videoUrl.replace('/cdn', '')}`\n\n    try {\n      await fetch(cookieUrl, { credentials: 'include' })\n      videoElement.setAttribute('crossorigin', 'use-credentials')\n    } catch (error) {\n      console.warn('Cookie fetch failed, continuing anyway:', error)\n    }\n\n    // Initialize Video.js player\n    const player = videojs(videoElement, {\n      controls: true,\n      autoplay: false,\n      fluid: true,\n      responsive: true,\n      ...hlsConfig\n    })\n\n    // Set source with credentials\n    player.src({\n      src: cdnUrl,\n      type: 'application/x-mpegURL',\n      withCredentials: true\n    })\n\n    // Store player reference\n    setPlayer(player)\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   */\n  disconnect() {\n    // Dispose Video.js players\n    if (this.sourcePlayer) {\n      this.sourcePlayer.dispose()\n    }\n    if (this.referencePlayer) {\n      this.referencePlayer.dispose()\n    }\n  }\n\n  /**\n   * Handle video scrubbing on source player\n   */\n  onSourceScrub(event) {\n    if (this.sourcePlayer) {\n      this.sourceTimeValue = this.sourcePlayer.currentTime()\n      this.updateTimestamps()\n    }\n  }\n\n  /**\n   * Handle video scrubbing on reference player\n   */\n  onReferenceScrub(event) {\n    if (this.referencePlayer) {\n      this.referenceTimeValue = this.referencePlayer.currentTime()\n      this.updateTimestamps()\n    }\n  }\n\n  /**\n   * Step source player backward by one frame\n   */\n  stepSourceBackward(event) {\n    event.preventDefault()\n    this.stepFrame(this.sourcePlayer, -1)\n  }\n\n  /**\n   * Step source player forward by one frame\n   */\n  stepSourceForward(event) {\n    event.preventDefault()\n    this.stepFrame(this.sourcePlayer, 1)\n  }\n\n  /**\n   * Step reference player backward by one frame\n   */\n  stepReferenceBackward(event) {\n    event.preventDefault()\n    this.stepFrame(this.referencePlayer, -1)\n  }\n\n  /**\n   * Step reference player forward by one frame\n   */\n  stepReferenceForward(event) {\n    event.preventDefault()\n    this.stepFrame(this.referencePlayer, 1)\n  }\n\n  /**\n   * Step a video player by one frame in the given direction\n   * @param {object} player - The Video.js player instance\n   * @param {number} direction - 1 for forward, -1 for backward\n   */\n  stepFrame(player, direction) {\n    if (!player) return\n\n    // Pause the video for precise control\n    player.pause()\n\n    // Calculate frame duration (assuming 30fps)\n    const frameDuration = 1 / 30\n\n    // Get current time and calculate new time\n    const currentTime = player.currentTime()\n    const newTime = currentTime + (frameDuration * direction)\n\n    // Clamp to valid range\n    const duration = player.duration() || Infinity\n    player.currentTime(Math.max(0, Math.min(newTime, duration)))\n  }\n\n  /**\n   * Update timestamp displays and enable save button when both are set\n   */\n  updateTimestamps() {\n    // Update displays\n    if (this.hasSourceTimestampTarget) {\n      this.sourceTimestampTarget.textContent = this.formatTime(this.sourceTimeValue || 0)\n    }\n\n    if (this.hasReferenceTimestampTarget) {\n      this.referenceTimestampTarget.textContent = this.formatTime(this.referenceTimeValue || 0)\n    }\n\n    // Update hidden form fields\n    if (this.hasSourceTimestampFieldTarget) {\n      this.sourceTimestampFieldTarget.value = this.sourceTimeValue || 0\n    }\n\n    if (this.hasReferenceTimestampFieldTarget) {\n      this.referenceTimestampFieldTarget.value = this.referenceTimeValue || 0\n    }\n\n    // Enable save button when both times are set (> 0)\n    if (this.sourceTimeValue > 0 && this.referenceTimeValue > 0) {\n      this.saveButtonTarget.disabled = false\n    }\n  }\n\n  /**\n   * Format seconds to HH:MM:SS.mmm\n   */\n  formatTime(seconds) {\n    const hrs = Math.floor(seconds / 3600)\n    const mins = Math.floor((seconds % 3600) / 60)\n    const secs = Math.floor(seconds % 60)\n    const ms = Math.floor((seconds % 1) * 1000)\n\n    return `${hrs.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}.${ms.toString().padStart(3, '0')}`\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Controller for individual clip point components\n * Handles clip point-specific interactions\n */\nexport default class extends Controller {\n  static values = {\n    id: String\n  }\n\n  connect() {\n    console.log(`Clip point component connected: ${this.idValue}`)\n  }\n\n  disconnect() {\n    console.log(`Clip point component disconnected: ${this.idValue}`)\n  }\n\n  // Navigate to this clip point's timestamp\n  navigateTo() {\n    // Dispatch event to studio component to seek to this timestamp\n    this.element.dispatchEvent(new CustomEvent('clip-point:navigate', {\n      bubbles: true,\n      detail: { clipPointId: this.idValue }\n    }))\n  }\n} ", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"content\", \"icon\"]\n\n  toggle() {\n    this.contentTarget.classList.toggle('hidden')\n\n    // Rotate the icon\n    if (this.hasIconTarget) {\n      this.iconTarget.classList.toggle('rotate-180')\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Review::EventSequenceListItem\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Review::EventSequenceListItem controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Review::EventSequenceListItem controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Controller for managing keybindings in the review studio\n * Handles keyboard event routing and action dispatching\n */\nexport default class extends Controller {\n  static values = {\n    config: Object\n  }\n\n  connect() {\n    this.keybindings = this.loadKeybindings()\n    this.setupEventListeners()\n    console.log('Review keybinding manager connected')\n  }\n\n  disconnect() {\n    this.removeEventListeners()\n    console.log('Review keybinding manager disconnected')\n  }\n\n  loadKeybindings() {\n    return this.configValue || {}\n  }\n\n  setupEventListeners() {\n    this.boundHandleKeydown = this.handleKeydown.bind(this)\n    document.addEventListener('keydown', this.boundHandleKeydown)\n  }\n\n  removeEventListeners() {\n    document.removeEventListener('keydown', this.boundHandleKeydown)\n  }\n\n  handleKeydown(event) {\n    // Don't handle keybindings if user is typing in an input field\n    if (this.isTypingInInput(event.target)) {\n      return\n    }\n\n    const key = this.getKeyString(event)\n    const action = this.keybindings[key]\n    \n    if (action) {\n      event.preventDefault()\n      this.dispatchAction(action, event)\n    }\n  }\n\n  isTypingInInput(element) {\n    const inputTypes = ['input', 'textarea', 'select']\n    return inputTypes.includes(element.tagName.toLowerCase()) || \n           element.contentEditable === 'true'\n  }\n\n  getKeyString(event) {\n    const modifiers = []\n    if (event.ctrlKey) modifiers.push('Ctrl')\n    if (event.altKey) modifiers.push('Alt')\n    if (event.shiftKey) modifiers.push('Shift')\n    \n    const key = event.key\n    return modifiers.length > 0 ? `${modifiers.join('+')}+${key}` : key\n  }\n\n  dispatchAction(action, event) {\n    console.log(`Dispatching action: ${action}`)\n    \n    // Dispatch to appropriate component based on action\n    this.element.dispatchEvent(new CustomEvent(`review:${action}`, {\n      bubbles: true,\n      detail: { event, action }\n    }))\n  }\n} ", "import { Controller } from \"@hotwired/stimulus\"\n// Use global videojs from CDN\nconst videojs = window.videojs\nimport { getEnhancedHLSConfig } from '../../utils/hls_config.js'\n\nexport default class extends Controller {\n  static targets = [\"video\", \"noVideoOverlay\", \"localTimeDisplay\"]\n  static values = {\n    cameraLocationId: String,\n    masterOffset: Number,\n    duration: Number,\n    frameRate: Number,\n    videoPath: String\n  }\n  static currentLocalTime = 0\n  static initialized = false\n\n  async connect() {\n    this.setupVideoPlayer()\n    this.initialize()\n  }\n\n  async initialize() {\n    this.initialized = true\n    this.dispatchInitializedEvent()\n  }\n\n  async setupVideoPlayer() {\n    this.player = null\n\n    this.videoElement = this.videoTarget\n    if (this.videoTarget.dataset.initialized === 'true') {\n      this.player = videojs(this.videoElement)\n      this.setupEventListeners()\n      return\n    }\n\n    this.videoTarget.dataset.initialized = 'true'\n    const cookieUrl = `/cdn${this.videoPathValue}`\n    const cdnUrl = `https://cdn.creaselogic.com${this.videoPathValue}`\n    const originalSrc = this.videoElement.getAttribute('src')\n    try {\n      await fetch(cookieUrl, { credentials: 'include' })\n      // Ensure the video element has the correct type attribute\n      this.videoElement.setAttribute('crossorigin', 'use-credentials')\n    } catch (error) {\n      // Gracefully handle - just continue\n    }\n\n    if (this.videoElement) {\n      const hlsConfig = getEnhancedHLSConfig();\n\n      this.player = videojs(this.videoElement, {\n        controls: false,\n        autoplay: false,\n        fluid: true,\n        responsive: true,\n        playbackRates: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2],\n        ...hlsConfig\n      })\n\n      // Set up event listeners\n      this.player.ready(() => {\n        this.setupEventListeners()\n      })\n\n      this.player.src({\n        src: cdnUrl,\n        type: 'application/x-mpegURL',\n        withCredentials: true\n      })\n\n      this.seekToLocalTime(this.currentLocalTime)\n    }\n  }\n\n  setupEventListeners() {\n    if (!this.player) return\n\n    // Time update event\n    this.player.on('timeupdate', () => {\n      this.handleTimeUpdate()\n    })\n\n    // Play event\n    this.player.on('play', () => {\n      this.handlePlay()\n    })\n\n    // Pause event\n    this.player.on('pause', () => {\n      this.handlePause()\n    })\n\n    // Seeked event\n    this.player.on('seeked', () => {\n      this.handleSeeked()\n    })\n\n    // Error handling\n    this.player.on('error', (error) => {\n      // Gracefully handle errors\n    })\n\n    // Add click event listener to make this player active\n    this.element.addEventListener('click', (event) => {\n      // Don't trigger if clicking on video controls\n      if (event.target.closest('.vjs-control-bar') || event.target.closest('.vjs-control')) {\n        return\n      }\n      this.handlePlayerClick()\n    })\n  }\n\n  swallowClick() {\n    event.preventDefault()\n    event.stopPropagation()\n  }\n\n  // Handle time update from video player\n  handleTimeUpdate() {\n    if (!this.player) return\n    this.currentLocalTime = this.player.currentTime()\n    this.updateOverlay(this.currentMasterTimestamp)\n    this.updateLocalTimeDisplay()\n    this.dispatchTimeUpdateEvent()\n  }\n\n  get currentMasterTimestamp() {\n    return this.currentLocalTime + this.masterOffsetValue\n  }\n\n  // Handle play event\n  handlePlay() {\n    console.log(`[PLAY EVENT] Camera ${this.cameraLocationIdValue} play event fired`)\n    this.dispatchPlayEvent()\n  }\n\n  // Handle pause event\n  handlePause() {\n    console.log(`[PAUSE EVENT] Camera ${this.cameraLocationIdValue} pause event fired`)\n    console.trace('Pause event stack trace')\n    this.dispatchPauseEvent()\n  }\n\n  // Handle seeked event\n  handleSeeked() {\n    if (!this.player) return\n\n    this.currentLocalTime = this.player.currentTime()\n    this.dispatchSeekedEvent(this.currentMasterTimestamp, this.currentLocalTime)\n  }\n\n  // Seek to a specific local timestamp\n  seekToLocalTime(localTime) {\n    this.currentLocalTime = localTime\n    if (!this.player) return\n\n    try {\n      // Validate that we have finite numbers\n      if (!isFinite(localTime) || !isFinite(this.durationValue)) {\n        return\n      }\n\n      // Ensure the time is within bounds\n      const clampedTime = Math.max(0, Math.min(localTime, this.durationValue))\n\n      // Final check that clampedTime is finite\n      if (!isFinite(clampedTime)) {\n        return\n      }\n\n      this.player.currentTime(clampedTime)\n    } catch (error) {\n      // Gracefully handle - just continue\n    }\n  }\n\n  syncToMasterTimestamp(masterTimestamp) {\n    // Guard: if player not initialized yet, just return\n    if (!this.player) {\n      return\n    }\n\n    // Validate master timestamp\n    if (!isFinite(masterTimestamp)) {\n      return\n    }\n\n    // if the master timestamp is more than 1 second away from the current local time, seek to it\n    if (Math.abs(masterTimestamp - this.currentMasterTimestamp) > 1) {\n      this.seekToMasterTimestamp(masterTimestamp)\n    }\n  }\n\n  // Seek to a master timeline timestamp\n  seekToMasterTimestamp(masterTimestamp) {\n    // Guard: if player not initialized yet, just return\n    if (!this.player) {\n      return false\n    }\n\n    // Validate master timestamp\n    if (!isFinite(masterTimestamp)) {\n      return false\n    }\n\n    this.updateOverlay(masterTimestamp)\n\n    // Check if the timestamp is within this camera's recording range\n    if (this.masterTimestampInRange(masterTimestamp)) {\n      const localTime = masterTimestamp - this.masterOffsetValue\n\n      // Validate the calculated local time\n      if (!isFinite(localTime)) {\n        return false\n      }\n\n      this.seekToLocalTime(localTime)\n      return true\n    } else {\n      // Outside recording range, pause the player\n      this.player.pause()\n      return false\n    }\n  }\n\n  // Play the video\n  play() {\n    console.log(`[PLAY CALLED] Camera ${this.cameraLocationIdValue} play() called`)\n    if (this.player) {\n      try {\n        this.player.play().catch(error => {\n          // Handle play() promise rejection (common when player is not ready)\n          console.log(`[PLAY CALLED] Camera ${this.cameraLocationIdValue} - play promise rejected: ${error.message}`)\n        })\n      } catch (error) {\n        console.error(`[PLAY CALLED] Camera ${this.cameraLocationIdValue} - error:`, error)\n      }\n    } else {\n      console.log(`[PLAY CALLED] Camera ${this.cameraLocationIdValue} - player is null`)\n    }\n  }\n\n  // Pause the video\n  pause() {\n    console.log(`[PAUSE CALLED] Camera ${this.cameraLocationIdValue} pause() called`)\n    if (this.player) {\n      try {\n        this.player.pause()\n      } catch (error) {\n        console.error(`[PAUSE CALLED] Camera ${this.cameraLocationIdValue} - error:`, error)\n      }\n    } else {\n      console.log(`[PAUSE CALLED] Camera ${this.cameraLocationIdValue} - player is null`)\n    }\n  }\n\n  get frameDuration() {\n    return 1.0 / this.frameRateValue;\n  }\n\n  nextFrame() {\n    if (!this.player) return\n    const currentTime = this.player.currentTime()\n    const newTime = currentTime + this.frameDuration\n\n    if (!isFinite(newTime)) {\n      return\n    }\n\n    this.player.currentTime(newTime)\n  }\n\n  previousFrame() {\n    if (!this.player) return\n    const currentTime = this.player.currentTime()\n    const newTime = currentTime - this.frameDuration\n\n    if (!isFinite(newTime)) {\n      return\n    }\n\n    this.player.currentTime(newTime)\n  }\n\n  // Set playback rate\n  setPlaybackRate(rate) {\n    if (this.player) {\n      this.player.playbackRate(rate)\n    }\n  }\n\n  // Get current master timestamp\n  get currentMasterTimestamp() {\n    return this.currentLocalTime + this.masterOffsetValue\n  }\n\n  // Check if the player is playing\n  isPlaying() {\n    return this.player ? !this.player.paused() : false\n  }\n\n  get minMasterTimestamp() {\n    return this.masterOffsetValue\n  }\n\n  get maxMasterTimestamp() {\n    return this.durationValue + this.masterOffsetValue\n  }\n\n  // Check if a master timestamp is within this camera's recording range\n  masterTimestampInRange(masterTimestamp) {\n    return masterTimestamp >= this.minMasterTimestamp && masterTimestamp <= this.maxMasterTimestamp\n  }\n\n  // Dispatch time update event\n  dispatchTimeUpdateEvent() {\n    const event = new CustomEvent('player:timeupdate', {\n      detail: {\n        masterTimestamp: this.currentMasterTimestamp,\n        localTime: this.currentLocalTime,\n        cameraLocationId: this.cameraLocationIdValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Dispatch play event\n  dispatchPlayEvent() {\n    const event = new CustomEvent('camera-video-player:play', {\n      detail: {\n        cameraLocationId: this.cameraLocationIdValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Dispatch pause event\n  dispatchPauseEvent() {\n    const event = new CustomEvent('camera-video-player:pause', {\n      detail: {\n        cameraLocationId: this.cameraLocationIdValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Dispatch seeked event\n  dispatchSeekedEvent(masterTimestamp, localTime) {\n    const event = new CustomEvent('camera-video-player:seeked', {\n      detail: {\n        masterTimestamp,\n        localTime,\n        cameraLocationId: this.cameraLocationIdValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Dispatch initialized event\n  dispatchInitializedEvent() {\n    const event = new CustomEvent('player:initialized', {\n      detail: {\n        cameraLocationId: this.cameraLocationIdValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Handle player click to make it the active player\n  handlePlayerClick() {\n    const event = new CustomEvent('camera-video-player:clicked', {\n      detail: {\n        cameraLocationId: this.cameraLocationIdValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  updateOverlay(timestamp) {\n    const inRange = this.masterTimestampInRange(timestamp)\n    this.toggleNoVideoOverlay(!inRange)\n  }\n\n  toggleNoVideoOverlay(show) {\n    if (!this.hasNoVideoOverlayTarget) return\n    if (show) {\n      this.noVideoOverlayTarget.classList.remove('hidden')\n    } else {\n      this.noVideoOverlayTarget.classList.add('hidden')\n    }\n  }\n\n  // Update the local time display\n  updateLocalTimeDisplay() {\n    if (!this.hasLocalTimeDisplayTarget) return\n    const formattedTime = this.formatTime(this.currentLocalTime)\n    this.localTimeDisplayTarget.textContent = formattedTime\n  }\n\n  // Format time as MM:SS.XXX or HH:MM:SS.XXX (ffmpeg compatible)\n  formatTime(seconds) {\n    const totalSeconds = Math.floor(seconds)\n    const milliseconds = Math.floor((seconds - totalSeconds) * 1000)\n    const hours = Math.floor(totalSeconds / 3600)\n    const minutes = Math.floor((totalSeconds % 3600) / 60)\n    const secs = totalSeconds % 60\n\n    if (hours > 0) {\n      return `${hours}:${String(minutes).padStart(2, '0')}:${String(secs).padStart(2, '0')}.${String(milliseconds).padStart(3, '0')}`\n    } else {\n      return `${minutes}:${String(secs).padStart(2, '0')}.${String(milliseconds).padStart(3, '0')}`\n    }\n  }\n\n  // Show the local time display\n  showLocalTimeDisplay() {\n    if (!this.hasLocalTimeDisplayTarget) return\n    this.localTimeDisplayTarget.classList.remove('hidden')\n  }\n\n  // Hide the local time display\n  hideLocalTimeDisplay() {\n    if (!this.hasLocalTimeDisplayTarget) return\n    this.localTimeDisplayTarget.classList.add('hidden')\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n// Use global videojs from CDN\nconst videojs = window.videojs\n\nexport default class extends Controller {\n  static targets = [\n    \"playPauseBtn\",\n    \"sidebar\",\n    \"mainPlayer\",\n    \"playerWrapper\",\n    \"setPlayer\",\n    \"manualClipLink\",\n    \"speedBtn\"\n  ]\n\n  static values = {\n    reviewId: String,\n    masterDuration: Number,\n    currentPosition: Number,\n    activePlayerId: String,\n    playbackRate: { type: Number, default: 1 }\n  }\n  static classes = [\n    \"active\",\n    \"inactive\"\n  ]\n\n  static outlets = [\"review--player-component\", \"review--seeker-component\"]\n\n  connect() {\n    this.isPlaying = false\n    this.outletsConnected = 0\n    this.expectedOutlets = this.element.querySelectorAll('[data-review--player-set-component-review--player-component-outlet]').length\n\n    // Add a small delay to ensure DOM is fully rendered\n    setTimeout(() => {\n      // Seek will auto-advance if we start in a gap\n      this.seekToMasterTimestamp(this.currentPositionValue)\n      this.setupEventListeners()\n      this.updatePlayPauseButton()\n      this.updateSpeedButtons()\n      // Initialize active player ID if not set\n      if (!this.activePlayerIdValue && this.reviewPlayerComponentOutlets.length > 0) {\n        this.activePlayerIdValue = this.reviewPlayerComponentOutlets[0].cameraLocationIdValue\n      }\n      // Initialize local time display visibility\n      this.updateLocalTimeDisplayVisibility()\n      // Initialize preview visibility will be called when outlets connect\n    }, 100)\n  }\n\n  // Called when each player outlet connects\n  reviewPlayerComponentOutletConnected(outlet, element) {\n    this.outletsConnected++\n    // Apply whatever speed is currently selected in case it was set before this\n    // camera finished connecting (e.g. a sidebar camera loading after the main one)\n    outlet.setPlaybackRate(this.playbackRateValue)\n\n    // Once all outlets are connected, initialize preview visibility\n    if (this.outletsConnected === this.expectedOutlets && this.expectedOutlets > 0) {\n      // Use a small delay to ensure outlet values are fully initialized\n      setTimeout(() => {\n        this.updatePreviewVisibility(this.currentPositionValue)\n      }, 50)\n    }\n  }\n\n  // Called when a player outlet disconnects\n  reviewPlayerComponentOutletDisconnected(outlet, element) {\n    // Reset the counter if outlets are disconnecting (shouldn't normally happen)\n  }\n\n  setupEventListeners() {\n    this.element.addEventListener('player:timeupdate', (event) => {\n      const { masterTimestamp, localTime, cameraLocationId } = event.detail\n      this.handleTimeUpdate(cameraLocationId, localTime, masterTimestamp)\n    })\n\n    // Listen for play events from individual players\n    this.element.addEventListener('camera-video-player:play', (event) => {\n      const { cameraLocationId } = event.detail\n      if(cameraLocationId === this.activePlayerIdValue) {\n        this.handlePlay(cameraLocationId)\n      }\n    })\n\n    // Listen for pause events from individual players\n    this.element.addEventListener('camera-video-player:pause', (event) => {\n      const { cameraLocationId } = event.detail\n      if(cameraLocationId === this.activePlayerIdValue) {\n        this.handlePause(cameraLocationId)\n      }\n    })\n\n    // Listen for click events from individual players to make them active\n    this.element.addEventListener('camera-video-player:clicked', (event) => {\n      const { cameraLocationId } = event.detail\n      this.handlePlayerClicked(cameraLocationId)\n    })\n\n    // Listen for keyboard shortcuts\n    document.addEventListener('keydown', (event) => {\n      if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {\n        return\n      }\n\n      switch(event.key.toLowerCase()) {\n        case ' ':\n          event.preventDefault()\n          this.togglePlayback()\n          break\n        case 'a':\n          event.preventDefault()\n          this.seekBackward()\n          break\n        case 'd':\n          event.preventDefault()\n          this.seekForward()\n          break\n        case 'f':\n          event.preventDefault()\n          this.seekFarForward()\n          break\n        case 'arrowright':\n          event.preventDefault()\n          this.nextFrame()\n          break\n        case 'arrowleft':\n          event.preventDefault()\n          this.previousFrame()\n          break\n        case 's':\n          event.preventDefault()\n          this.nextActivePlayer()\n          break\n        case '1':\n          event.preventDefault()\n          this.applyPlaybackRate(1)\n          break\n        case '2':\n          event.preventDefault()\n          this.applyPlaybackRate(1.1)\n          break\n        case '3':\n          event.preventDefault()\n          this.applyPlaybackRate(1.25)\n          break\n        case '4':\n          event.preventDefault()\n          this.applyPlaybackRate(1.5)\n          break\n      }\n    })\n  }\n\n  nextActivePlayer() {\n    // Filter to only cameras that have active footage at the current timestamp\n    const activePlayers = this.reviewPlayerComponentOutlets.filter((outlet) =>\n      this.currentPositionValue >= outlet.minMasterTimestamp &&\n      this.currentPositionValue < outlet.maxMasterTimestamp\n    )\n\n    // If there's only one active player (or none), don't switch\n    if (activePlayers.length <= 1) {\n      return\n    }\n\n    // Find current active player index in the filtered list\n    const currentIndex = activePlayers.findIndex((outlet) => outlet.cameraLocationIdValue === this.activePlayerIdValue)\n\n    // Get next player in the active players list\n    const nextIndex = (currentIndex + 1) % activePlayers.length\n    this.activePlayerIdValue = activePlayers[nextIndex].cameraLocationIdValue\n  }\n\n  // Handle time update from a camera video player\n  handleTimeUpdate(cameraLocationId, localTime, masterTimestamp) {\n    if (cameraLocationId === this.activePlayerIdValue) {\n      this.currentPositionValue = masterTimestamp\n      this.syncOtherPlayers(masterTimestamp)\n      this.updatePreviewVisibility(masterTimestamp)\n\n      // Check if active camera is about to run out of footage during playback\n      if (this.isPlaying) {\n        const didSwitch = this.autoSwitchIfActiveCameraEnding(masterTimestamp)\n        if (didSwitch) {\n          // Camera was switched, continue playback on new camera\n          return\n        }\n\n        // Check if we've hit a gap across all cameras and auto-advance if needed\n        const didAdvance = this.autoAdvanceIfInGap(masterTimestamp)\n        if (didAdvance) {\n          // If we auto-advanced, don't dispatch the time update event\n          // because we're jumping to a new position\n          return\n        }\n      }\n\n      this.dispatchTimeUpdateEvent(masterTimestamp, cameraLocationId)\n    }\n  }\n\n  // Auto-switch to another camera if the active camera is ending\n  autoSwitchIfActiveCameraEnding(masterTimestamp) {\n    const activePlayer = this.activePlayer\n    if (!activePlayer) return false\n\n    // Check if we're within 0.5 seconds of the end of the active camera's footage\n    const timeUntilEnd = activePlayer.maxMasterTimestamp - masterTimestamp\n    if (timeUntilEnd > 0.5) return false\n\n    // Find other cameras that have footage at the current timestamp\n    const otherActivePlayers = this.reviewPlayerComponentOutlets.filter((outlet) =>\n      outlet.cameraLocationIdValue !== this.activePlayerIdValue &&\n      masterTimestamp >= outlet.minMasterTimestamp &&\n      masterTimestamp < outlet.maxMasterTimestamp\n    )\n\n    if (otherActivePlayers.length > 0) {\n      // Switch to the first available camera\n      const newActivePlayer = otherActivePlayers[0]\n      this.activePlayerIdValue = newActivePlayer.cameraLocationIdValue\n      return true\n    }\n\n    return false\n  }\n\n  // Update which preview windows are visible based on current timestamp\n  updatePreviewVisibility(masterTimestamp) {\n    if (!this.hasPlayerWrapperTarget) {\n      return\n    }\n\n    this.playerWrapperTargets.forEach((playerWrapper) => {\n      const cameraLocationId = playerWrapper.getAttribute('data-camera-location-id')\n      const player = this.playerForCameraLocationId(cameraLocationId)\n\n      // Check if player exists and has required values\n      if (player &&\n          typeof player.minMasterTimestamp !== 'undefined' &&\n          typeof player.maxMasterTimestamp !== 'undefined' &&\n          masterTimestamp >= player.minMasterTimestamp &&\n          masterTimestamp < player.maxMasterTimestamp) {\n        // Camera has active footage - show it\n        playerWrapper.classList.remove('hidden')\n      } else {\n        // Camera doesn't have active footage - hide it\n        playerWrapper.classList.add('hidden')\n      }\n    })\n  }\n\n  // Check if any cameras have active footage at the given timestamp\n  hasActiveCameraAt(masterTimestamp) {\n    return this.reviewPlayerComponentOutlets.some((outlet) =>\n      masterTimestamp >= outlet.minMasterTimestamp &&\n      masterTimestamp < outlet.maxMasterTimestamp\n    )\n  }\n\n  // Find the next timestamp where any camera has footage\n  findNextActiveCameraTimestamp(currentTimestamp) {\n    // Get all camera start times that are after the current timestamp\n    const nextStarts = this.reviewPlayerComponentOutlets\n      .map((outlet) => outlet.minMasterTimestamp)\n      .filter((startTime) => startTime > currentTimestamp)\n      .sort((a, b) => a - b)\n\n    // Return the earliest next start time, or null if none found\n    return nextStarts.length > 0 ? nextStarts[0] : null\n  }\n\n  // Auto-advance to next available footage if we're in a gap\n  autoAdvanceIfInGap(masterTimestamp) {\n    if (!this.hasActiveCameraAt(masterTimestamp)) {\n      const nextActiveTimestamp = this.findNextActiveCameraTimestamp(masterTimestamp)\n      if (nextActiveTimestamp !== null) {\n        // Use internal seek to avoid re-checking for gaps (prevent infinite loop)\n        this.seekToMasterTimestamp(nextActiveTimestamp, { skipGapCheck: true })\n        return true\n      } else {\n        this.pause()\n        return false\n      }\n    }\n    return false\n  }\n\n  // Handle play event from a camera video player\n  handlePlay(cameraLocationId) {\n    const player = this.playerForCameraLocationId(cameraLocationId)\n    console.log(`[PLAYER SET] \u25B6\uFE0F  Player ${cameraLocationId} started playing`)\n    console.log(`[PLAYER SET] Current timestamp: ${this.currentPositionValue}s`)\n    console.log(`[PLAYER SET] Camera range: ${player?.minMasterTimestamp}-${player?.maxMasterTimestamp}`)\n\n    this.isPlaying = true\n    this.updatePlayPauseButton()\n\n    // Always play other players when one is clicked\n    this.playOtherPlayers(cameraLocationId)\n  }\n\n  // Handle pause event from a camera video player\n  handlePause(cameraLocationId) {\n    const player = this.playerForCameraLocationId(cameraLocationId)\n\n    // Get the player's current local time (not master timestamp)\n    const playerLocalTime = player?.player?.currentTime() || 0\n\n    console.log(`[PLAYER SET] \u26A0\uFE0F  Player ${cameraLocationId} paused`)\n    console.log(`[PLAYER SET] Player local time: ${playerLocalTime}s`)\n    console.log(`[PLAYER SET] Current master timestamp: ${this.currentPositionValue}s`)\n\n    // Ignore pause events at time ~0 - these are loadTech_ initialization pauses\n    // video.js fires pause events during loadTech_ which happen at the very start (time 0)\n    if (playerLocalTime < 0.1) {\n      console.log(`[PLAYER SET] \uD83D\uDD07 Ignoring loadTech pause event (player at time ${playerLocalTime}s)`)\n      return\n    }\n\n    const inRange = player && this.currentPositionValue >= player.minMasterTimestamp &&\n                    this.currentPositionValue < player.maxMasterTimestamp\n\n    console.log(`[PLAYER SET] Camera in range: ${inRange}`)\n    console.log(`[PLAYER SET] Camera range: ${player?.minMasterTimestamp}-${player?.maxMasterTimestamp}`)\n\n    // If a camera pauses due to being out of range, don't cascade the pause to other cameras\n    if (!inRange) {\n      console.log(`[PLAYER SET] \u2139\uFE0F  Ignoring pause from out-of-range camera`)\n      return\n    }\n\n    // Only cascade pause if the camera that paused is in range (user-initiated or natural pause)\n    console.log(`[PLAYER SET] \uD83D\uDD04 Cascading pause to other players`)\n    this.isPlaying = false\n    this.updatePlayPauseButton()\n\n    // Always pause other players when one is paused\n    this.pauseOtherPlayers(cameraLocationId)\n  }\n\n  // Handle player clicked to make it the active player\n  handlePlayerClicked(cameraLocationId) {\n    this.activePlayerIdValue = cameraLocationId\n  }\n\n  // Toggle playback for all players\n  togglePlayback() {\n    if (this.isPlaying) {\n      this.pause()\n    } else {\n      this.play()\n    }\n  }\n\n  // Play all players\n  play() {\n    console.log(`[PLAYER SET] \uD83C\uDFAC PLAY ALL - Starting playback`)\n    console.log(`[PLAYER SET] Current timestamp: ${this.currentPositionValue}s`)\n\n    this.isPlaying = true\n    this.updatePlayPauseButton()\n\n    const currentTimestamp = this.currentPositionValue\n\n    // Only play cameras that have footage at the current timestamp\n    this.reviewPlayerComponentOutlets.forEach((outlet) => {\n      const inRange = currentTimestamp >= outlet.minMasterTimestamp && currentTimestamp < outlet.maxMasterTimestamp\n      if (inRange) {\n        console.log(`[PLAYER SET] \u2192 \u25B6\uFE0F  Playing in-range camera ${outlet.cameraLocationIdValue}`)\n        outlet.play()\n      } else {\n        console.log(`[PLAYER SET] \u2192 \u23ED\uFE0F  Skipping out-of-range camera ${outlet.cameraLocationIdValue}`)\n      }\n    })\n  }\n\n  // Pause all players\n  pause() {\n    console.log(`[PLAYER SET] \u23F8\uFE0F  PAUSE ALL - Pausing all cameras`)\n    this.isPlaying = false\n    this.updatePlayPauseButton()\n    this.reviewPlayerComponentOutlets.forEach((outlet) => {\n      console.log(`[PLAYER SET] \u2192 Pausing camera ${outlet.cameraLocationIdValue}`)\n      outlet.pause()\n    })\n  }\n\n  // Set playback speed from a toolbar button click (data-speed on the button)\n  setSpeed(event) {\n    const rate = parseFloat(event.currentTarget.dataset.speed)\n    this.applyPlaybackRate(rate)\n  }\n\n  // Apply a playback rate to every camera player and update button/active state\n  applyPlaybackRate(rate) {\n    this.playbackRateValue = rate\n    this.reviewPlayerComponentOutlets.forEach((outlet) => {\n      outlet.setPlaybackRate(rate)\n    })\n    this.updateSpeedButtons()\n  }\n\n  updateSpeedButtons() {\n    this.speedBtnTargets.forEach((button) => {\n      const isActive = parseFloat(button.dataset.speed) === this.playbackRateValue\n      button.classList.toggle('bg-blue-600', isActive)\n      button.classList.toggle('hover:bg-blue-700', isActive)\n      button.classList.toggle('bg-gray-600', !isActive)\n      button.classList.toggle('hover:bg-gray-700', !isActive)\n    })\n  }\n\n  nextFrame() {\n    this.activePlayer.nextFrame()\n  }\n\n  previousFrame() {\n    this.activePlayer.previousFrame()\n  }\n\n  // Seek backward by 5 seconds\n  seekBackward(seconds = 5) {\n    const newPosition = Math.max(0, this.currentPositionValue - seconds)\n    this.seekToMasterTimestamp(newPosition)\n  }\n\n  // Seek forward by 5 seconds\n  seekForward(seconds = 5) {\n    const newPosition = Math.min(this.masterDurationValue, this.currentPositionValue + seconds)\n    this.seekToMasterTimestamp(newPosition)\n  }\n\n  seekFarForward() {\n    this.seekForward(10)\n  }\n\n  // Seek to a specific master timeline timestamp\n  seekToMasterTimestamp(masterTimestamp, options = {}) {\n    this.currentPositionValue = masterTimestamp\n\n    if (this.activePlayerIdValue) {\n      // If seeking to a position that is not in the range of the active player,\n      // switch the active camera to the first player that has a position in the range\n      if (\n        this.currentPositionValue < this.activePlayer.minMasterTimestamp ||\n        this.currentPositionValue >= this.activePlayer.maxMasterTimestamp\n      ) {\n        const inRangePlayer = this.reviewPlayerComponentOutlets.find(\n          (outlet) =>\n            this.currentPositionValue >= outlet.minMasterTimestamp &&\n            this.currentPositionValue < outlet.maxMasterTimestamp\n        )\n        if (inRangePlayer) {\n          this.activePlayerIdValue = inRangePlayer.cameraLocationIdValue\n        }\n      }\n    }\n\n    this.reviewPlayerComponentOutlets.forEach((player) => {\n      player.seekToMasterTimestamp(masterTimestamp)\n    })\n\n    // Update preview visibility for the new timestamp\n    this.updatePreviewVisibility(masterTimestamp)\n\n    // Check if we've landed in a gap when manually seeking (unless explicitly skipped)\n    if (!options.skipGapCheck) {\n      this.autoAdvanceIfInGap(masterTimestamp)\n    }\n\n    // Dispatch seek event back to studio component\n    this.dispatchSeekEvent(masterTimestamp)\n  }\n\n  // Dispatch seek event back to studio component\n  dispatchSeekEvent(masterTimestamp) {\n    const event = new CustomEvent('multi-camera-video-player:seek', {\n      detail: {\n        masterTimestamp,\n        reviewId: this.reviewIdValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Sync other players to match the active player\n  syncOtherPlayers(masterTimestamp) {\n    this.reviewPlayerComponentOutlets.forEach((outlet) => {\n      if (outlet.cameraLocationIdValue !== this.activePlayerIdValue) {\n        // Only sync if the camera has footage at this timestamp\n        // The individual player will handle pausing if out of range\n        outlet.syncToMasterTimestamp(masterTimestamp)\n      }\n    })\n  }\n\n  // Play other players\n  playOtherPlayers(triggeringCameraId) {\n    console.log(`[PLAYER SET] \uD83D\uDD04 playOtherPlayers called (triggered by ${triggeringCameraId})`)\n    const currentTimestamp = this.currentPositionValue\n    console.log(`[PLAYER SET] Current timestamp: ${currentTimestamp}s`)\n\n    this.reviewPlayerComponentOutlets.forEach((outlet) => {\n      // Only play cameras that have footage at the current timestamp\n      const inRange = currentTimestamp >= outlet.minMasterTimestamp && currentTimestamp < outlet.maxMasterTimestamp\n      console.log(`[PLAYER SET] Camera ${outlet.cameraLocationIdValue}: ${inRange ? 'IN RANGE' : 'OUT OF RANGE'}`)\n      console.log(`[PLAYER SET]   Range: ${outlet.minMasterTimestamp}s - ${outlet.maxMasterTimestamp}s`)\n\n      if (inRange) {\n        console.log(`[PLAYER SET] \u2192 \u25B6\uFE0F  Playing camera ${outlet.cameraLocationIdValue}`)\n        outlet.play()\n      } else {\n        console.log(`[PLAYER SET] \u2192 \u23F8\uFE0F  Pausing out-of-range camera ${outlet.cameraLocationIdValue}`)\n        outlet.pause()\n      }\n    })\n  }\n\n  // Pause other players\n  pauseOtherPlayers(triggeringCameraId) {\n    console.log(`[PLAYER SET] \uD83D\uDD04 pauseOtherPlayers called (triggered by ${triggeringCameraId})`)\n    this.reviewPlayerComponentOutlets.forEach((outlet) => {\n      console.log(`[PLAYER SET] \u2192 \u23F8\uFE0F  Pausing camera ${outlet.cameraLocationIdValue}`)\n      outlet.pause()\n    })\n  }\n\n  // Select camera by clicking on camera selection button\n  selectCamera(event) {\n    const cameraLocationId = event.currentTarget.dataset.cameraLocationId\n    this.activePlayerIdValue = cameraLocationId\n  }\n\n  get activePlayer() {\n    return this.playerForCameraLocationId(this.activePlayerIdValue)\n  }\n\n  getActiveSetPlayer() {\n    return this.getSetPlayerForCameraLocationId(this.activePlayerIdValue)\n  }\n\n  getSetPlayerForCameraLocationId(cameraLocationId) {\n    return this.setPlayerTargets.find((player) => player.dataset.cameraLocationId === cameraLocationId)\n  }\n\n  get currentLocalTime() {\n    return this.activePlayer.currentLocalTime\n  }\n\n  playerForCameraLocationId(cameraLocationId) {\n    return this.reviewPlayerComponentOutlets.find((outlet) => outlet.cameraLocationIdValue === cameraLocationId)\n  }\n\n  // Value change callback for activePlayerId\n  activePlayerIdValueChanged(currentValue, previousValue) {\n    if(currentValue === undefined || currentValue === '') {\n      return;\n    }\n\n    this.playerWrapperTargets.forEach((playerWrapper) => {\n      if(playerWrapper.getAttribute('data-camera-location-id') === this.activePlayerIdValue) {\n        playerWrapper.classList.add(...this.activeClasses);\n        playerWrapper.classList.remove(...this.inactiveClasses);\n        playerWrapper.querySelector('.overlay').classList.add(...['hidden', 'mr-[200px]']);\n      }\n      else {\n        playerWrapper.classList.add(...this.inactiveClasses);\n        playerWrapper.classList.remove(...this.activeClasses);\n        playerWrapper.querySelector('.overlay').classList.remove(...['hidden', 'mr-[200px]']);\n        if(playerWrapper.getAttribute('data-camera-location-id') === previousValue) {\n          playerWrapper.appendChild(\n            this.getSetPlayerForCameraLocationId(previousValue)\n          );\n        }\n      }\n    })\n\n    this.mainPlayerTarget.appendChild(this.getActiveSetPlayer())\n\n    // Update active player visual indicators\n    this.reviewPlayerComponentOutletElements.forEach((element) => {\n      const elementCameraId = element.dataset.cameraLocationId\n      const activeIndicator = element.querySelector('.active-indicator')\n\n      if (elementCameraId === this.activePlayerIdValue) {\n        element.dataset.activePlayer = 'true'\n        if (activeIndicator) {\n          activeIndicator.classList.add('border-opacity-100')\n          activeIndicator.classList.remove('border-opacity-0')\n        }\n      } else {\n        element.dataset.activePlayer = 'false'\n        if (activeIndicator) {\n          activeIndicator.classList.remove('border-opacity-100')\n          activeIndicator.classList.add('border-opacity-0')\n        }\n      }\n    })\n\n    // Update the seeker component's active player\n    this.reviewSeekerComponentOutlet.updateCameraRangeStates()\n\n    // Update local time display visibility\n    this.updateLocalTimeDisplayVisibility()\n  }\n\n  // Show local time display only for the active player\n  updateLocalTimeDisplayVisibility() {\n    this.reviewPlayerComponentOutlets.forEach((outlet) => {\n      if (outlet.cameraLocationIdValue === this.activePlayerIdValue) {\n        outlet.showLocalTimeDisplay()\n      } else {\n        outlet.hideLocalTimeDisplay()\n      }\n    })\n  }\n\n  // Update play/pause button text\n  updatePlayPauseButton() {\n    const button = this.playPauseBtnTarget\n    if (button) {\n      const span = button.querySelector('span')\n      if (span) {\n        span.textContent = this.isPlaying ? 'Pause' : 'Play'\n      }\n    }\n  }\n\n  // Dispatch time update event\n  dispatchTimeUpdateEvent(masterTimestamp, cameraLocationId) {\n    const event = new CustomEvent('player-set:time-update', {\n      detail: {\n        masterTimestamp,\n        cameraLocationId\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Get current master timestamp from active player\n  get currentMasterTimestamp() {\n    return this.currentPositionValue\n  }\n\n  // Getter for current timestamp (alias for compatibility)\n  get currentTimestamp() {\n    return this.currentPositionValue\n  }\n\n  // Getter for active camera location ID\n  get activeCameraLocationId() {\n    return this.activePlayerIdValue\n  }\n\n  // Update the manual clip link href with current timestamp and camera location\n  openManualClipForm(event) {\n    if (!this.hasManualClipLinkTarget) return\n\n    const timestamp = this.currentPositionValue\n    const cameraLocationId = this.activePlayerIdValue\n\n    console.log('Opening manual clip form:', { timestamp, cameraLocationId })\n\n    // Get the base URL\n    const baseUrl = this.manualClipLinkTarget.getAttribute('href')\n\n    // Add query parameters\n    const url = new URL(baseUrl, window.location.origin)\n    url.searchParams.set('timestamp', timestamp)\n    url.searchParams.set('camera_location_id', cameraLocationId)\n\n    console.log('Updated URL:', url.toString())\n\n    // Update the href\n    this.manualClipLinkTarget.setAttribute('href', url.toString())\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Review::Queues::Base\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Review::Queues::Base controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Review::Queues::Base controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Review::Queues::Classifications\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Review::Queues::Classifications controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Review::Queues::Classifications controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Review::Queues::Games\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Review::Queues::Games controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Review::Queues::Games controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Review::Queues::Plays\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Review::Queues::Plays controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Review::Queues::Plays controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Review::Queues::QueueItem\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Review::Queues::QueueItem controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Review::Queues::QueueItem controller disconnected\")\n  }\n}\n", "/**\n * Utility functions for time formatting\n */\nexport class TimeFormatter {\n  /**\n   * Format a float in seconds to hh:mm:ss.ss format\n   * @param {number} seconds - Time in seconds (can be float)\n   * @param {boolean} showMilliseconds - Whether to show milliseconds (default: true)\n   * @returns {string} Formatted time string\n   */\n  static formatTime(seconds, showMilliseconds = true) {\n    if (seconds === null || seconds === undefined || isNaN(seconds)) {\n      return '00:00:00.00'\n    }\n\n    // Ensure seconds is a number\n    seconds = parseFloat(seconds)\n    \n    // Handle negative values\n    const isNegative = seconds < 0\n    seconds = Math.abs(seconds)\n\n    // Calculate hours, minutes, seconds\n    const hours = Math.floor(seconds / 3600)\n    const minutes = Math.floor((seconds % 3600) / 60)\n    const secs = Math.floor(seconds % 60)\n    const milliseconds = Math.floor((seconds % 1) * 100)\n\n    // Format the time string\n    let timeString = ''\n    \n    if (isNegative) {\n      timeString += '-'\n    }\n    \n    if (hours > 0) {\n      timeString += `${hours.toString().padStart(2, '0')}:`\n    }\n    \n    timeString += `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`\n    \n    if (showMilliseconds) {\n      timeString += `.${milliseconds.toString().padStart(2, '0')}`\n    }\n\n    return timeString\n  }\n\n  /**\n   * Format a float in seconds to mm:ss.ss format (for shorter durations)\n   * @param {number} seconds - Time in seconds (can be float)\n   * @param {boolean} showMilliseconds - Whether to show milliseconds (default: true)\n   * @returns {string} Formatted time string\n   */\n  static formatShortTime(seconds, showMilliseconds = true) {\n    if (seconds === null || seconds === undefined || isNaN(seconds)) {\n      return '00:00.00'\n    }\n\n    seconds = parseFloat(seconds)\n    const isNegative = seconds < 0\n    seconds = Math.abs(seconds)\n\n    const minutes = Math.floor(seconds / 60)\n    const secs = Math.floor(seconds % 60)\n    const milliseconds = Math.floor((seconds % 1) * 100)\n\n    let timeString = ''\n    \n    if (isNegative) {\n      timeString += '-'\n    }\n    \n    timeString += `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`\n    \n    if (showMilliseconds) {\n      timeString += `.${milliseconds.toString().padStart(2, '0')}`\n    }\n\n    return timeString\n  }\n\n  /**\n   * Parse a time string in hh:mm:ss.ss format back to seconds\n   * @param {string} timeString - Time string to parse\n   * @returns {number} Time in seconds\n   */\n  static parseTime(timeString) {\n    if (!timeString || typeof timeString !== 'string') {\n      return 0\n    }\n\n    // Handle negative values\n    const isNegative = timeString.startsWith('-')\n    const cleanString = isNegative ? timeString.substring(1) : timeString\n\n    // Split by colons and dots\n    const parts = cleanString.split(':')\n    let seconds = 0\n\n    if (parts.length === 3) {\n      // hh:mm:ss.ss format\n      const hours = parseInt(parts[0]) || 0\n      const minutes = parseInt(parts[1]) || 0\n      const secParts = parts[2].split('.')\n      const secs = parseInt(secParts[0]) || 0\n      const ms = parseInt(secParts[1]) || 0\n      \n      seconds = hours * 3600 + minutes * 60 + secs + ms / 100\n    } else if (parts.length === 2) {\n      // mm:ss.ss format\n      const minutes = parseInt(parts[0]) || 0\n      const secParts = parts[1].split('.')\n      const secs = parseInt(secParts[0]) || 0\n      const ms = parseInt(secParts[1]) || 0\n      \n      seconds = minutes * 60 + secs + ms / 100\n    }\n\n    return isNegative ? -seconds : seconds\n  }\n\n  /**\n   * Format a duration (difference between two times)\n   * @param {number} duration - Duration in seconds\n   * @returns {string} Formatted duration string\n   */\n  static formatDuration(duration) {\n    return this.formatTime(duration, true)\n  }\n\n  /**\n   * Format a timestamp for display (always shows hours if > 1 hour)\n   * @param {number} seconds - Time in seconds\n   * @returns {string} Formatted timestamp\n   */\n  static formatTimestamp(seconds) {\n    if (seconds === null || seconds === undefined || isNaN(seconds)) {\n      return '00:00:00.00'\n    }\n\n    seconds = parseFloat(seconds)\n    const hours = Math.floor(seconds / 3600)\n    \n    if (hours > 0) {\n      return this.formatTime(seconds, true)\n    } else {\n      return this.formatShortTime(seconds, true)\n    }\n  }\n}\n\n// Export individual functions for convenience\nexport const formatTime = TimeFormatter.formatTime\nexport const formatShortTime = TimeFormatter.formatShortTime\nexport const parseTime = TimeFormatter.parseTime\nexport const formatDuration = TimeFormatter.formatDuration\nexport const formatTimestamp = TimeFormatter.formatTimestamp ", "import { Controller } from \"@hotwired/stimulus\"\nimport { formatTime } from \"../../utils/time_formatter.js\"\n\nexport default class extends Controller {\n  static targets = [\"seeker\", \"positionIndicator\", \"seekArea\", \"currentPosition\", \"cameraRange\", \"contextMenu\", \"syncLink\", \"selectionOverlay\", \"selectionCancel\"]\n  static values = {\n    reviewId: String,\n    masterDuration: Number,\n    currentPosition: Number,\n    sourceCameraLocationId: String\n  }\n\n  static outlets = [\"review--player-set-component\"]\n\n  connect() {\n    console.log(\"Unified timeline seeker connected\")\n    this.setupEventListeners()\n    this.updateCameraRangeStates()\n    this.boundHideContextMenu = this.hideContextMenu.bind(this)\n    this.cameraSelectionMode = false\n  }\n\n  disconnect() {\n    document.removeEventListener('click', this.boundHideContextMenu)\n  }\n\n  setupEventListeners() {\n    // Listen for camera video player time updates\n    document.addEventListener('player-set:time-update', (event) => {\n      const { masterTimestamp } = event.detail\n      this.updatePosition(masterTimestamp)\n      this.updateTimelineOverlay(masterTimestamp)\n    })\n  }\n\n  // Handle click-to-seek on the timeline\n  seekOnClick(event) {\n    // Don't handle clicks on camera ranges - let them handle their own actions\n    if (event.target.closest('.camera-range')) {\n      return\n    }\n\n    // Don't handle clicks on markers or other interactive elements\n    if (event.target.closest('.timeline-marker, .period-start-marker, .period-end-marker, .game-end-marker')) {\n      return\n    }\n\n    const rect = this.seekAreaTarget.getBoundingClientRect()\n    const clickX = event.clientX - rect.left\n    const percentage = (clickX / rect.width) * 100\n    const masterTimestamp = (percentage / 100) * this.masterDurationValue\n\n    this.seekTo(masterTimestamp)\n  }\n\n  // Handle seek to specific timestamp (from markers or external calls)\n  seekTo(event) {\n    let masterTimestamp\n\n    if (event.type === 'click') {\n      // Extract timestamp from data attribute\n      masterTimestamp = parseFloat(event.currentTarget.dataset.reviewUnifiedTimelineSeekerMasterTimestampValue)\n    } else {\n      // Direct timestamp parameter\n      masterTimestamp = event\n    }\n\n    if (masterTimestamp !== undefined && !isNaN(masterTimestamp)) {\n      this.seekToMasterTimestamp(masterTimestamp)\n    }\n  }\n\n  // Seek to a specific master timeline timestamp\n  seekToMasterTimestamp(masterTimestamp) {\n    console.debug(`Timeline seeker: Seeking to master timestamp: ${masterTimestamp}s`)\n\n    // Update the position indicator\n    this.updatePosition(masterTimestamp)\n\n    this.reviewPlayerSetComponentOutlet.seekToMasterTimestamp(masterTimestamp)\n  }\n\n  updateTimelineOverlay(masterTimestamp) {\n    this.currentPositionTarget.textContent = formatTime(masterTimestamp)\n  }\n\n  // Update the position indicator\n  updatePosition(masterTimestamp) {\n    if (!this.masterDurationValue || this.masterDurationValue <= 0) return\n\n    const percentage = (masterTimestamp / this.masterDurationValue) * 100\n    this.positionIndicatorTarget.style.left = `${percentage}%`\n    this.currentPositionValue = masterTimestamp\n  }\n\n  // Get current position\n  get currentPosition() {\n    return this.currentPositionValue || 0\n  }\n\n  // Set current position\n  set currentPosition(value) {\n    this.currentPositionValue = value\n    this.updatePosition(value)\n  }\n\n  handleClickSeek(event) {\n    // If in camera selection mode, select the reference camera instead of seeking\n    if (this.cameraSelectionMode) {\n      this.selectReferenceCamera(event)\n      return\n    }\n\n    this.reviewPlayerSetComponentOutlet.activePlayerIdValue = event.currentTarget.dataset.playerId;\n    this.seekInRange(event)\n  }\n\n  // Set active player and seek when clicking on camera range\n  seekInRange(event) {\n    if (this.hasReviewPlayerSetComponentOutlet) {\n      // Calculate seek position based on click location within the camera range's actual timeline position\n      const cameraRange = event.currentTarget\n      const rect = cameraRange.getBoundingClientRect()\n      const clickX = event.clientX - rect.left\n\n      // Get the camera range's position within the master timeline\n      const leftPercentage = parseFloat(cameraRange.style.left)\n      const rightPercentage = parseFloat(cameraRange.style.right)\n      const rangeWidthPercentage = 100 - leftPercentage - rightPercentage\n\n      // Calculate the click position as a percentage within the camera range\n      const clickPercentageWithinRange = (clickX / rect.width) * 100\n\n      // Calculate the master timeline timestamp based on the camera range's position\n      const rangeStartTimestamp = (leftPercentage / 100) * this.masterDurationValue\n      const rangeEndTimestamp = ((100 - rightPercentage) / 100) * this.masterDurationValue\n      const rangeDuration = rangeEndTimestamp - rangeStartTimestamp\n\n      // Calculate the seek timestamp within the camera range's timeline\n      const seekTimestampWithinRange = (clickPercentageWithinRange / 100) * rangeDuration\n      const masterTimestamp = rangeStartTimestamp + seekTimestampWithinRange\n\n      console.log(`Timeline seeker: Camera range ${leftPercentage}% to ${100 - rightPercentage}%, click at ${clickPercentageWithinRange}% within range, seeking to ${masterTimestamp}s`)\n      this.seekToMasterTimestamp(masterTimestamp)\n    }\n  }\n\n  // Update camera range visual states based on active player\n  updateCameraRangeStates() {\n    if (!this.hasReviewPlayerSetComponentOutlet) return\n\n    const activePlayerId = this.reviewPlayerSetComponentOutlet.activePlayerIdValue\n\n    this.cameraRangeTargets.forEach(cameraRange => {\n      const playerId = cameraRange.dataset.playerId\n      const isActive = playerId === activePlayerId\n\n      if (isActive) {\n        cameraRange.classList.remove('opacity-70')\n        cameraRange.classList.add('opacity-100')\n      } else {\n        cameraRange.classList.remove('opacity-100')\n        cameraRange.classList.add('opacity-70')\n      }\n    })\n  }\n\n  // Show context menu for camera location\n  showCameraContextMenu(event) {\n    event.preventDefault()\n    event.stopPropagation()\n\n    // Get camera location ID from the clicked element\n    const cameraLocationId = event.currentTarget.dataset.cameraLocationId\n    console.log('Right-clicked camera location:', cameraLocationId)\n    if (!cameraLocationId) return\n\n    // Store the source camera location ID\n    this.sourceCameraLocationIdValue = cameraLocationId\n    console.log('Stored source camera location ID:', this.sourceCameraLocationIdValue)\n\n    // Position the menu at the mouse coordinates\n    const menu = this.contextMenuTarget\n    menu.style.left = `${event.clientX}px`\n    menu.style.top = `${event.clientY}px`\n\n    // Show the menu\n    menu.classList.remove('hidden')\n\n    // Add click listener to hide menu when clicking elsewhere\n    setTimeout(() => {\n      document.addEventListener('click', this.boundHideContextMenu)\n    }, 0)\n  }\n\n  // Hide context menu\n  hideContextMenu(event) {\n    // Don't hide if clicking inside the menu\n    if (event && this.contextMenuTarget.contains(event.target)) {\n      return\n    }\n\n    this.contextMenuTarget.classList.add('hidden')\n    document.removeEventListener('click', this.boundHideContextMenu)\n  }\n\n  // Enter camera selection mode\n  enterCameraSelectionMode(event) {\n    event.preventDefault()\n    this.hideContextMenu()\n\n    this.cameraSelectionMode = true\n\n    // Show overlay\n    if (this.hasSelectionOverlayTarget) {\n      this.selectionOverlayTarget.classList.remove('hidden')\n    }\n\n    // Add hover effects to camera ranges\n    this.cameraRangeTargets.forEach(range => {\n      const rangeId = range.dataset.cameraLocationId\n      // Don't allow selecting the source camera\n      if (rangeId !== this.sourceCameraLocationIdValue) {\n        range.classList.add('cursor-pointer', 'hover:ring-2', 'hover:ring-yellow-400')\n      } else {\n        range.classList.add('opacity-50', 'cursor-not-allowed')\n      }\n    })\n  }\n\n  // Exit camera selection mode\n  exitCameraSelectionMode(event) {\n    if (event) event.preventDefault()\n\n    this.cameraSelectionMode = false\n\n    // Hide overlay\n    if (this.hasSelectionOverlayTarget) {\n      this.selectionOverlayTarget.classList.add('hidden')\n    }\n\n    // Remove hover effects from camera ranges\n    this.cameraRangeTargets.forEach(range => {\n      range.classList.remove('cursor-pointer', 'hover:ring-2', 'hover:ring-yellow-400', 'opacity-50', 'cursor-not-allowed')\n    })\n\n    this.sourceCameraLocationIdValue = ''\n  }\n\n  // Handle camera location selection\n  selectReferenceCamera(event) {\n    if (!this.cameraSelectionMode) return\n\n    event.preventDefault()\n    event.stopPropagation()\n\n    const referenceCameraLocationId = event.currentTarget.dataset.cameraLocationId\n    console.log('Selected reference camera:', referenceCameraLocationId)\n    console.log('Source camera location ID:', this.sourceCameraLocationIdValue)\n\n    // Don't allow selecting the source camera\n    if (referenceCameraLocationId === this.sourceCameraLocationIdValue) {\n      console.log('Cannot select the same camera as source and reference')\n      return\n    }\n\n    // Build the sync path BEFORE exiting selection mode (which clears sourceCameraLocationIdValue)\n    const syncPath = `/review/camera_syncs/new?camera_location_id=${this.sourceCameraLocationIdValue}&reference_location_id=${referenceCameraLocationId}&review_id=${this.reviewIdValue}`\n    console.log('Navigating to sync path:', syncPath)\n\n    // Exit selection mode\n    this.exitCameraSelectionMode()\n\n    // Navigate to the sync modal\n    window.Turbo.visit(syncPath, { frame: 'modal' })\n  }\n\n  // Refresh timeline markers with new data\n  refreshMarkers(markerData) {\n    console.log(\"Refreshing seeker markers with data:\", markerData)\n\n    // Clear existing markers\n    this.clearMarkers()\n\n    // Add all timeline markers\n    const allMarkers = [...markerData.periodItems, ...markerData.clipItems]\n    allMarkers.forEach(marker => {\n      this.addTimelineMarker(marker)\n    })\n  }\n\n  // Clear all timeline markers\n  clearMarkers() {\n    const existingMarkers = this.element.querySelectorAll('.timeline-marker')\n    existingMarkers.forEach(marker => marker.remove())\n  }\n\n  // Add a timeline marker (period, clip, annotation, etc.)\n  addTimelineMarker(markerData) {\n    const percentage = (markerData.masterTimestamp / this.masterDurationValue) * 100\n\n    const markerElement = document.createElement('div')\n    markerElement.className = 'timeline-marker absolute top-0 bottom-0 z-30 opacity-70'\n    markerElement.style.left = `${percentage}%`\n    markerElement.style.transform = 'translateX(-50%)'\n    markerElement.title = `${markerData.type?.humanize || 'Timeline Item'} - ${markerData.formattedTime}`\n\n        // Create the marker line based on type and annotation type\n    const markerLine = document.createElement('div')\n\n    if (markerData.type === 'clip_point') {\n      markerLine.className = 'w-[2px] h-full bg-blue-500 shadow-lg'\n    } else {\n      markerLine.className = 'w-[2px] h-full shadow-lg'\n\n      // Add specific background colors for different annotation types\n      if (markerData.annotationType === 'goaltender_change') {\n        markerLine.classList.add('bg-purple-500')\n      } else if (markerData.annotationType === 'period_start') {\n        markerLine.classList.add('bg-green-500')\n      } else if (markerData.annotationType === 'period_end') {\n        markerLine.classList.add('bg-red-500')\n      } else if (markerData.annotationType === 'game_end') {\n        markerLine.classList.add('bg-purple-600')\n      } else {\n        markerLine.classList.add('bg-yellow-500')\n      }\n    }\n\n    markerElement.appendChild(markerLine)\n\n    // Add to timeline markers container\n    const markersContainer = this.element.querySelector('.timeline-markers')\n    if (markersContainer) {\n      markersContainer.appendChild(markerElement)\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"timestamp\", \"keybindingsModal\", \"goaltenderAssignmentsData\", \"assignmentsContainer\", \"assignmentItem\", \"manualClipTimestamp\", \"manualClipCameraLocationId\"]\n  static values = {\n    reviewId: String,\n    currentPosition: Number,\n    goaltenderAssignments: Array\n  }\n  static outlets = [\"review--player-set-component\", \"review--seeker-component\"]\n\n  connect() {\n    console.log(\"Review studio component connected\")\n    this.setupKeybindings()\n    this.setupEventListeners()\n\n    // Check if we need to create an initial goaltender annotation\n    this.checkForInitialGoaltender()\n\n    // Initialize button states\n    this.updateEndGameButton()\n\n    // Initialize assignments display\n    this.updateGoaltenderAssignmentsFromTarget()\n  }\n\n  setupEventListeners() {\n    // Once the cameras are all initialized, seek to the initial global timestamp\n    this.element.addEventListener('camera-video-player:initialized', () => {\n      this.seekTo(this.currentPositionValue)\n    })\n\n    // Listen for seek events from timeline items\n    this.element.addEventListener('review--timeline-item:seek', (event) => {\n      const { masterTimestamp, cameraTimestamp, cameraLocationId } = event.detail\n      this.seekTo(masterTimestamp, cameraTimestamp, cameraLocationId)\n    })\n\n    // Listen for seek events from unified timeline seeker\n    this.element.addEventListener('review--unified-timeline-seeker:seek', (event) => {\n      const { masterTimestamp } = event.detail\n      this.seekTo(masterTimestamp)\n    })\n\n    // Listen for time updates from video players\n    this.element.addEventListener('player-set:time-update', (event) => {\n      const { masterTimestamp } = event.detail\n      this.updateTimestamp(masterTimestamp)\n    })\n\n    // Listen for seek events from multi-camera video player\n    this.element.addEventListener('multi-camera-video-player:seek', (event) => {\n      const { masterTimestamp } = event.detail\n      this.updateTimestamp(masterTimestamp)\n    })\n\n    // Listen for timeline refresh events\n    this.element.addEventListener('review--timeline-component:refresh', (event) => {\n      this.updatePeriodActions()\n      this.updateEndGameButton()\n    })\n\n    // Watch for changes to goaltender assignments data\n    if (this.hasGoaltenderAssignmentsDataTarget) {\n      const observer = new MutationObserver((mutations) => {\n        mutations.forEach((mutation) => {\n          if (mutation.type === 'childList' || mutation.type === 'characterData') {\n            console.log('Goaltender assignments data content changed')\n            this.updateGoaltenderAssignmentsFromTarget()\n          }\n        })\n      })\n\n      observer.observe(this.goaltenderAssignmentsDataTarget, {\n        childList: true,\n        characterData: true,\n        subtree: true\n      })\n\n      // Store observer for cleanup\n      this.goaltenderAssignmentsObserver = observer\n    }\n  }\n\n  setupKeybindings() {\n    console.log(\"Setting up keybindings\")\n    document.addEventListener('keydown', (event) => {\n      // Only handle keybindings if we're not in an input field\n      if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {\n        return\n      }\n\n      // Handle Cmd+K (or Ctrl+K on Windows/Linux)\n      if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n        event.preventDefault()\n        console.log(\"Showing keybindings\")\n        this.showKeybindings()\n        return\n      }\n\n      // Handle Escape to close modal\n      if (event.key === 'Escape') {\n        this.hideKeybindings()\n        return\n      }\n\n      switch(event.key.toLowerCase()) {\n        case 'c':\n          event.preventDefault()\n\n          this.createClipPoint()\n          break\n      }\n    })\n  }\n\n  // Quick action buttons\n  endCurrentPeriod() {\n    if (confirm('End the current period?')) {\n      this.submitPeriodEnd()\n    }\n  }\n\n  endGame() {\n    if (confirm('End the game? This will close all active periods.')) {\n      this.submitGameEnd()\n    }\n  }\n\n  submitPeriodEnd() {\n    // Get current master timestamp\n    const masterTimestamp = this.reviewPlayerSetComponentOutlet.currentPositionValue\n    const cameraTimestamp = this.reviewPlayerSetComponentOutlet.currentLocalTime\n\n    // Get active camera location ID from player set outlet\n    const activeCameraLocationId = this.reviewPlayerSetComponentOutlet.activePlayerIdValue\n\n    // Create form data\n    const formData = new FormData()\n    formData.append('annotation_point[type]', 'Review::Annotations::PeriodMarker')\n    formData.append('annotation_point[timestamp]', cameraTimestamp)\n    formData.append('annotation_point[camera_location_id]', activeCameraLocationId || '')\n    formData.append('annotation_point[annotation_type]', 'period_end')\n    formData.append('annotation_point[period_number]', this.getCurrentPeriod())\n    formData.append('annotation_point[master_timestamp]', masterTimestamp)\n\n    this.submitAnnotation(formData)\n  }\n\n  submitGameEnd() {\n    // Get current master timestamp\n    const masterTimestamp = this.reviewPlayerSetComponentOutlet.currentPositionValue\n    const cameraTimestamp = this.reviewPlayerSetComponentOutlet.currentLocalTime\n\n    // Get active camera location ID from player set outlet\n    const activeCameraLocationId = this.reviewPlayerSetComponentOutlet.activePlayerIdValue\n\n    // Create form data\n    const formData = new FormData()\n    formData.append('annotation_point[timestamp]', cameraTimestamp)\n    formData.append('annotation_point[camera_location_id]', activeCameraLocationId || '')\n    formData.append('annotation_point[annotation_type]', 'game_end')\n    formData.append('annotation_point[master_timestamp]', masterTimestamp)\n\n    this.submitAnnotation(formData)\n  }\n\n  submitAnnotation(formData) {\n    fetch(`/review/reviews/${this.reviewIdValue}/annotation_points`, {\n      method: 'POST',\n      body: formData,\n      headers: {\n        'X-CSRF-Token': document.querySelector('[name=\"csrf-token\"]').content\n      }\n    })\n    .then(response => response.text())\n    .then(html => {\n      Turbo.renderStreamMessage(html)\n    })\n    .catch(error => {\n      console.error('Error submitting annotation:', error)\n    })\n  }\n\n  // Create a clip point at the current timestamp\n  createClipPoint() {\n    const timestamp = this.reviewPlayerSetComponentOutlet.currentLocalTime\n    const masterTimestamp = this.reviewPlayerSetComponentOutlet.currentPositionValue\n    const cameraLocationId = this.reviewPlayerSetComponentOutlet.activePlayerIdValue\n\n    if (!cameraLocationId) {\n      console.error('No camera location selected')\n      return\n    }\n\n    // Get the current goaltender for the active camera\n    const currentGoaltenderId = this.getCurrentGoaltenderIdForActiveCamera()\n\n    // Create form data\n    const formData = new FormData()\n    formData.append('clip_point[timestamp]', timestamp)\n    formData.append('clip_point[master_timestamp]', masterTimestamp)\n    formData.append('clip_point[camera_location_id]', cameraLocationId)\n    formData.append('clip_point[goaltender_id]', currentGoaltenderId || '')\n    formData.append('clip_point[period_number]', this.getCurrentPeriod())\n\n    // Submit to create clip point\n    fetch(`/review/reviews/${this.reviewIdValue}/clip_points`, {\n      method: 'POST',\n      body: formData,\n      headers: {\n        'X-CSRF-Token': document.querySelector('[name=\"csrf-token\"]').content\n      }\n    })\n    .then(response => response.text())\n    .then(html => {\n      // Handle Turbo Stream response\n      Turbo.renderStreamMessage(html)\n    })\n    .catch(error => {\n      console.error('Error creating clip point:', error)\n    })\n  }\n\n  // Update timestamp from video player\n  updateTimestamp(seconds) {\n    this.currentPositionValue = seconds\n    this.updatePeriodActions()\n    this.updateAssignmentsDisplay()\n  }\n\n  // Submit period action with current timestamps and active camera\n  submitPeriodAction(event) {\n    const button = event.currentTarget\n    const annotationType = button.dataset.periodActionType\n    const periodNumber = button.dataset.periodNumber\n\n    // Get current master timestamp\n    const masterTimestamp = this.reviewPlayerSetComponentOutlet.currentPositionValue\n    const cameraTimestamp = this.reviewPlayerSetComponentOutlet.currentLocalTime\n\n    // Get active camera location ID from player set outlet\n    const activeCameraLocationId = this.reviewPlayerSetComponentOutlet.activePlayerIdValue\n\n    console.log(`Submitting period action: ${annotationType}, camera=${cameraTimestamp}s, master=${masterTimestamp}s, camera_id=${activeCameraLocationId}`)\n\n    if (annotationType === 'period_start') {\n      // For period starts, open the period start modal with goaltender assignments\n      const url = `/review/reviews/${this.reviewIdValue}/period_starts/new?timestamp=${cameraTimestamp}&master_timestamp=${masterTimestamp}&period_number=${periodNumber}&camera_location_id=${activeCameraLocationId}`\n\n      fetch(url, {\n        method: 'GET',\n        headers: {\n          'Accept': 'text/vnd.turbo-stream.html'\n        }\n      })\n      .then(response => response.text())\n      .then(html => {\n        Turbo.renderStreamMessage(html)\n      })\n      .catch(error => {\n        console.error('Error opening period start modal:', error)\n      })\n    } else {\n      // For other period actions (like period_end), use the existing annotation points endpoint\n      const formData = new FormData()\n      formData.append('annotation_point[timestamp]', cameraTimestamp)\n      formData.append('annotation_point[camera_location_id]', activeCameraLocationId || '')\n      formData.append('annotation_point[annotation_type]', annotationType)\n      formData.append('annotation_point[period_number]', periodNumber)\n      formData.append('annotation_point[master_timestamp]', masterTimestamp)\n\n      // Submit XHR request\n      fetch(`/review/reviews/${this.reviewIdValue}/annotation_points`, {\n        method: 'POST',\n        body: formData,\n        headers: {\n          'X-CSRF-Token': document.querySelector('[name=\"csrf-token\"]').content,\n          'Accept': 'text/vnd.turbo-stream.html'\n        }\n      })\n      .then(response => response.text())\n      .then(html => {\n        Turbo.renderStreamMessage(html)\n      })\n      .catch(error => {\n        console.error('Error submitting period action:', error)\n      })\n    }\n  }\n\n  assignGoaltenders() {\n    const activeCameraLocationId = this.reviewPlayerSetComponentOutlet.activePlayerIdValue\n    const url = `/review/reviews/${this.reviewIdValue}/annotations/goaltender_camera_assignments/new?master_timestamp=${this.reviewPlayerSetComponentOutlet.currentPositionValue}&active_camera_location_id=${activeCameraLocationId}`\n    fetch(url, {\n      method: 'GET',\n      headers: {\n        'Accept': 'text/vnd.turbo-stream.html'\n      }\n    })\n    .then(response => response.text())\n    .then(html => {\n      Turbo.renderStreamMessage(html)\n    })\n    .catch(error => {\n      console.error('Error assigning goaltenders:', error)\n    })\n  }\n\n  // Update period action buttons based on current video position\n  updatePeriodActions() {\n    const masterTimestamp = this.reviewPlayerSetComponentOutlet?.currentPositionValue || 0\n\n    // Get the last period annotation to determine available actions\n    this.getLastPeriodAnnotation().then(lastAnnotation => {\n      this.updateQuickActionButtons(masterTimestamp, lastAnnotation)\n    })\n  }\n\n  // Get the last period annotation from the timeline\n  async getLastPeriodAnnotation() {\n    // Look for period start/end annotations in the timeline\n    const periodAnnotations = Array.from(document.querySelectorAll('[data-annotation-type=\"period_start\"], [data-annotation-type=\"period_end\"]'))\n      .map(element => ({\n        type: element.dataset.annotationType,\n        timestamp: parseFloat(element.dataset.masterTimestamp || 0),\n        periodNumber: element.dataset.periodNumber\n      }))\n      .filter(annotation => annotation.timestamp > 0)\n      .sort((a, b) => b.timestamp - a.timestamp) // Sort by timestamp descending\n\n    return periodAnnotations[0] || null\n  }\n\n  // Check if game has ended\n  hasGameEnded() {\n    const gameEndAnnotations = document.querySelectorAll('[data-annotation-type=\"game_end\"]')\n    return gameEndAnnotations.length > 0\n  }\n\n  // Update quick action buttons based on current position and last annotation\n  updateQuickActionButtons(currentTimestamp, lastAnnotation) {\n    const quickActionsContainer = document.querySelector('.quick-actions')\n    if (!quickActionsContainer) {\n      console.log('Quick actions container not found')\n      return\n    }\n\n    console.log('Updating quick action buttons:', { currentTimestamp, lastAnnotation })\n\n    // Check if we can show period actions\n    // Show period actions if: a) there are no period markers, or b) current timestamp is later than the last period marker\n    const canShowPeriodActions = !lastAnnotation || (lastAnnotation && currentTimestamp > lastAnnotation.timestamp)\n\n    if (!canShowPeriodActions) {\n      console.log('Cannot show period actions - current timestamp is not after last period marker')\n      this.updatePeriodActionButtons(null, false)\n      return\n    }\n\n    let nextPeriodAction = null\n    let canEndCurrentPeriod = false\n\n    if (!lastAnnotation) {\n      // No period annotations yet - can start period 1\n      nextPeriodAction = { type: 'period_start', label: 'Start Period 1', periodNumber: '1' }\n      console.log('No period annotations - can start period 1')\n    } else if (lastAnnotation.type === 'period_start') {\n      // Last annotation was a period start - can end current period if we're past it\n      if (currentTimestamp > lastAnnotation.timestamp) {\n        canEndCurrentPeriod = true\n        console.log('Can end current period - past period start')\n      }\n    } else if (lastAnnotation.type === 'period_end') {\n      // Last annotation was a period end - can start next period\n      let nextPeriodNumber\n      let nextPeriodLabel\n\n      if (lastAnnotation.periodNumber === '3') {\n        nextPeriodNumber = 'OT'\n        nextPeriodLabel = 'Start OT'\n      } else if (lastAnnotation.periodNumber === 'OT') {\n        nextPeriodNumber = '2 OT'\n        nextPeriodLabel = 'Start 2 OT'\n      } else {\n        nextPeriodNumber = (parseInt(lastAnnotation.periodNumber) + 1).toString()\n        nextPeriodLabel = `Start Period ${nextPeriodNumber}`\n      }\n\n      nextPeriodAction = {\n        type: 'period_start',\n        label: nextPeriodLabel,\n        periodNumber: nextPeriodNumber\n      }\n      console.log('Can start next period after period end:', nextPeriodAction)\n    }\n\n    console.log('Period action buttons:', { nextPeriodAction, canEndCurrentPeriod })\n    // Update the UI\n    this.updatePeriodActionButtons(nextPeriodAction, canEndCurrentPeriod)\n\n    // Update end game button visibility\n    this.updateEndGameButton()\n  }\n\n    // Update the period action buttons in the UI\n  updatePeriodActionButtons(nextPeriodAction, canEndCurrentPeriod) {\n    const quickActionsContainer = document.querySelector('.quick-actions')\n    if (!quickActionsContainer) {\n      console.log('Quick actions container not found in updatePeriodActionButtons')\n      return\n    }\n\n    console.log('Updating period action buttons:', { nextPeriodAction, canEndCurrentPeriod })\n\n    // Update period action button visibility and content\n    const periodActionButton = quickActionsContainer.querySelector('.quick-action-button')\n    if (periodActionButton) {\n      if (nextPeriodAction) {\n        periodActionButton.textContent = nextPeriodAction.label\n        periodActionButton.dataset.periodActionType = nextPeriodAction.type\n        periodActionButton.dataset.periodNumber = nextPeriodAction.periodNumber\n        periodActionButton.classList.remove('hidden')\n        console.log('Showing period action button:', nextPeriodAction.label)\n      } else {\n        periodActionButton.classList.add('hidden')\n        console.log('Hiding period action button')\n      }\n    } else {\n      console.log('Period action button not found')\n    }\n\n    // Update end current period button visibility\n    const endCurrentPeriodButton = quickActionsContainer.querySelector('.end-current-period-button')\n    if (endCurrentPeriodButton) {\n      if (canEndCurrentPeriod) {\n        endCurrentPeriodButton.classList.remove('hidden')\n        console.log('Showing end current period button')\n      } else {\n        endCurrentPeriodButton.classList.add('hidden')\n        console.log('Hiding end current period button')\n      }\n    } else {\n      console.log('End current period button not found')\n    }\n  }\n\n  // Update end game button visibility\n  updateEndGameButton() {\n    const quickActionsContainer = document.querySelector('.quick-actions')\n    if (!quickActionsContainer) return\n\n    const endGameButton = quickActionsContainer.querySelector('[data-action*=\"endGame\"]')\n    const gameHasEnded = this.hasGameEnded()\n\n    if (endGameButton) {\n      if (gameHasEnded) {\n        endGameButton.classList.add('hidden')\n        console.log('Hiding end game button - game has ended')\n      } else {\n        endGameButton.classList.remove('hidden')\n        console.log('Showing end game button - game has not ended')\n      }\n    } else {\n      console.log('End game button not found')\n    }\n  }\n\n  // Updated seek method to handle both master timeline and camera-specific seeking\n  seekTo(masterTimestamp, cameraLocationId = null) {\n    // Update the timestamp input with the master timeline timestamp\n    this.reviewPlayerSetComponentOutlet.seekToMasterTimestamp(masterTimestamp)\n    if (cameraLocationId) {\n      this.reviewPlayerSetComponentOutlet.activePlayerIdValue = cameraLocationId\n    }\n  }\n\n  // Dispatch video control event\n  dispatchVideoEvent(action) {\n    const event = new CustomEvent('review--studio-component:video-control', {\n      detail: {\n        action,\n        reviewId: this.reviewIdValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  get currentTimestamp() {\n    return parseFloat(this.timestampTarget.value) || 0\n  }\n\n  getCurrentPeriod() {\n    // Get the current period from the UI\n    const currentPeriodElement = document.getElementById('current-period')\n    if (currentPeriodElement && currentPeriodElement.textContent !== 'No active period') {\n      return currentPeriodElement.textContent.trim()\n    }\n    return null\n  }\n\n  checkForInitialGoaltender() {\n    // Check if there's a data attribute indicating we need to create an initial goaltender annotation\n    const needsInitialGoaltender = this.element.dataset.needsInitialGoaltender === 'true'\n\n    if (needsInitialGoaltender) {\n      this.createInitialGoaltenderAnnotation()\n    }\n  }\n\n  createInitialGoaltenderAnnotation() {\n    const cameraLocationId = this.element.querySelector('input[name*=\"camera_location_id\"]')?.value\n    const initialGoaltenderId = this.element.dataset.initialGoaltenderId\n\n    if (!cameraLocationId || !initialGoaltenderId) {\n      console.error('Missing required data for initial goaltender annotation')\n      return\n    }\n\n    const formData = new FormData()\n    formData.append('annotation_point[timestamp]', '0')\n    formData.append('annotation_point[master_timestamp]', '0')\n    formData.append('annotation_point[camera_location_id]', cameraLocationId)\n    formData.append('annotation_point[annotation_type]', 'goaltender_change')\n    formData.append('annotation_point[goaltender_id]', initialGoaltenderId)\n    formData.append('annotation_point[notes]', 'Initial goaltender from game data')\n\n    this.submitAnnotation(formData)\n  }\n\n  showKeybindings() {\n    const modal = this.keybindingsModalTarget || document.getElementById('keybindings-modal');\n    console.log('showKeybindings', modal);\n    if (!modal) {\n      console.error('Keybindings modal not found');\n      return;\n    }\n    modal.classList.remove('hidden');\n    modal.focus();\n  }\n\n  hideKeybindings() {\n    const modal = this.keybindingsModalTarget || document.getElementById('keybindings-modal');\n    if (!modal) return;\n    modal.classList.add('hidden');\n  }\n\n  // Goaltender Assignment Methods\n\n  getCurrentGoaltenderForActiveCamera() {\n    const activeCameraLocationId = this.reviewPlayerSetComponentOutlet?.activePlayerIdValue\n    if (!activeCameraLocationId) return null\n\n    const currentMasterTimestamp = this.reviewPlayerSetComponentOutlet?.currentPositionValue || 0\n\n    // Find all assignments for this camera up to the current timestamp\n    const assignmentsForCamera = this.goaltenderAssignmentsValue.filter(assignment => \n      assignment.camera_location_id === activeCameraLocationId &&\n      assignment.master_timestamp <= currentMasterTimestamp\n    )\n\n    // Return the most recent assignment (highest timestamp)\n    if (assignmentsForCamera.length > 0) {\n      const mostRecent = assignmentsForCamera.reduce((latest, current) => \n        current.master_timestamp > latest.master_timestamp ? current : latest\n      )\n      return mostRecent\n    }\n\n    return null\n  }\n\n  getCurrentGoaltenderIdForActiveCamera() {\n    const assignment = this.getCurrentGoaltenderForActiveCamera()\n    return assignment?.goaltender_id || null\n  }\n\n  getCurrentGoaltenderNameForActiveCamera() {\n    const assignment = this.getCurrentGoaltenderForActiveCamera()\n    return assignment?.goaltender_name || 'No goaltender assigned'\n  }\n\n  // Get current goaltender for any camera at current timestamp\n  getCurrentGoaltenderForCamera(cameraLocationId) {\n    const currentTimestamp = this.reviewPlayerSetComponentOutlet?.currentPositionValue || 0\n\n    // Find all assignments for this camera up to current timestamp\n    const assignmentsForCamera = this.goaltenderAssignmentsValue.filter(assignment => \n      assignment.camera_location_id === cameraLocationId && \n      assignment.master_timestamp <= currentTimestamp\n    )\n\n    // Return the most recent assignment (highest timestamp)\n    if (assignmentsForCamera.length > 0) {\n      const mostRecent = assignmentsForCamera.reduce((latest, current) => \n        current.master_timestamp > latest.master_timestamp ? current : latest\n      )\n      return mostRecent\n    }\n\n    return null\n  }\n\n  // Update the sidebar assignments display\n  updateAssignmentsDisplay() {\n    console.log('Updating assignments display')\n\n    if (!this.hasAssignmentsContainerTarget) return\n\n    const currentTimestamp = this.reviewPlayerSetComponentOutlet?.currentPositionValue || 0\n    console.log('Current master timestamp:', currentTimestamp)\n\n    this.assignmentItemTargets.forEach(item => {\n      const cameraId = item.dataset.cameraId\n      const goaltenderElement = item.querySelector('.goaltender-display')\n\n      if (cameraId && goaltenderElement) {\n        // Find all assignments for ANY location on this camera up to the current timestamp\n        const assignmentsForCamera = this.goaltenderAssignmentsValue.filter(assignment =>\n          assignment.camera_id === cameraId &&\n          assignment.master_timestamp <= currentTimestamp\n        )\n\n        // Get the most recent assignment (highest timestamp)\n        if (assignmentsForCamera.length > 0) {\n          const mostRecentAssignment = assignmentsForCamera.reduce((latest, current) =>\n            current.master_timestamp > latest.master_timestamp ? current : latest\n          )\n\n          goaltenderElement.textContent = mostRecentAssignment.goaltender_name\n          goaltenderElement.className = `goaltender-display ${mostRecentAssignment.goaltender_id ? 'text-green-300' : 'text-gray-500'}`\n\n          console.log(`Camera ${cameraId}: ${mostRecentAssignment.goaltender_name} at ${mostRecentAssignment.master_timestamp}s`)\n        } else {\n          goaltenderElement.textContent = 'No assignment'\n          goaltenderElement.className = 'goaltender-display text-gray-500'\n          console.log(`Camera ${cameraId}: No assignment found`)\n        }\n      }\n    })\n\n    // Also update video player headers\n    this.updateVideoPlayerHeaders(currentTimestamp)\n  }\n\n  // Update goaltender status in video player headers\n  updateVideoPlayerHeaders(currentTimestamp) {\n    const videoPlayers = document.querySelectorAll('.review-player')\n\n    videoPlayers.forEach(player => {\n      const cameraLocationId = player.dataset.cameraLocationId\n      const goaltenderStatusElement = player.querySelector('.goaltender-status')\n\n      if (cameraLocationId && goaltenderStatusElement) {\n        // Find all assignments for this camera up to the current timestamp\n        const assignmentsForCamera = this.goaltenderAssignmentsValue.filter(assignment =>\n          assignment.camera_location_id === cameraLocationId &&\n          assignment.master_timestamp <= currentTimestamp\n        )\n\n        // Get the most recent assignment (highest timestamp)\n        if (assignmentsForCamera.length > 0) {\n          const mostRecentAssignment = assignmentsForCamera.reduce((latest, current) =>\n            current.master_timestamp > latest.master_timestamp ? current : latest\n          )\n\n          goaltenderStatusElement.textContent = mostRecentAssignment.goaltender_name\n          goaltenderStatusElement.className = `goaltender-status text-xs ${mostRecentAssignment.goaltender_id ? 'text-green-400' : 'text-gray-400'}`\n\n          console.log(`Video player ${cameraLocationId}: ${mostRecentAssignment.goaltender_name}`)\n        } else {\n          goaltenderStatusElement.textContent = 'No assignment'\n          goaltenderStatusElement.className = 'goaltender-status text-xs text-gray-400'\n          console.log(`Video player ${cameraLocationId}: No assignment found`)\n        }\n      }\n    })\n  }\n\n  // Update goaltender assignments from the target element content\n  updateGoaltenderAssignmentsFromTarget() {\n    try {\n      const assignmentsData = JSON.parse(this.goaltenderAssignmentsDataTarget.textContent)\n      this.goaltenderAssignmentsValue = assignmentsData\n      console.log('Updated goaltender assignments from target:', assignmentsData)\n    } catch (error) {\n      console.error('Error parsing goaltender assignments data:', error)\n    }\n  }\n\n  // Called automatically when goaltenderAssignmentsValue changes\n  goaltenderAssignmentsValueChanged() {\n    this.updateAssignmentsDisplay()\n  }\n\n  prepareManualClipForm(event) {\n    // Get the current player timestamp and camera location\n    if (!this.hasReviewPlayerSetComponentOutlet) {\n      console.error('No player set outlet available')\n      return\n    }\n\n    const playerSet = this.reviewPlayerSetComponentOutlet\n    const currentTime = playerSet.currentTimestamp\n    const activeCameraLocationId = playerSet.activeCameraLocationId\n\n    console.log('Preparing manual clip form:', { currentTime, activeCameraLocationId })\n\n    // Wait for the modal to load, then populate the form\n    const modalFrame = document.getElementById('modal')\n    const checkForForm = () => {\n      if (this.hasManualClipTimestampTarget && this.hasManualClipCameraLocationIdTarget) {\n        this.manualClipTimestampTarget.value = currentTime\n        this.manualClipCameraLocationIdTarget.value = activeCameraLocationId\n        console.log('Manual clip form populated:', { timestamp: currentTime, cameraLocationId: activeCameraLocationId })\n      } else {\n        // Try again in a bit\n        setTimeout(checkForForm, 50)\n      }\n    }\n\n    setTimeout(checkForForm, 100)\n  }\n\n  disconnect() {\n    // Clean up the MutationObserver\n    if (this.goaltenderAssignmentsObserver) {\n      this.goaltenderAssignmentsObserver.disconnect()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    reviewId: String\n  }\n\n  static outlets = [\"review--seeker-component\"]\n\n  connect() {\n    console.log(\"Timeline component connected.\")\n    // Dispatch event with bubbling to ensure parent components can catch it\n    // Use a small delay to ensure parent components are connected first\n    setTimeout(() => {\n      this.element.dispatchEvent(new CustomEvent('review--timeline-component:refresh', {\n        bubbles: true,\n        detail: { source: 'timeline-component' }\n      }))\n\n      // Refresh seeker markers after the timeline is loaded\n      this.refreshSeekerMarkers()\n    }, 100)\n  }\n\n  // Method to refresh the timeline (called from parent components)\n  refresh() {\n    // This will be called when the timeline needs to be re-rendered\n    // The parent component will handle the actual re-rendering via Turbo Stream\n    console.log(\"Timeline refresh requested\")\n    this.element.dispatchEvent(new CustomEvent('review--timeline-component:refresh', {\n      bubbles: true,\n      detail: { source: 'timeline-component', action: 'refresh' }\n    }))\n\n    // Refresh seeker markers after a short delay to ensure timeline is updated\n    setTimeout(() => {\n      this.refreshSeekerMarkers()\n    }, 100)\n  }\n\n  // Method to refresh seeker markers with timeline data\n  refreshSeekerMarkers() {\n    if (!this.hasReviewSeekerComponentOutlet) {\n      console.log(\"Seeker component outlet not found\")\n      return\n    }\n\n    // Collect marker data from timeline items\n    const markerData = this.collectMarkerData()\n    console.log(\"Refreshing seeker markers with data:\", markerData)\n\n    this.reviewSeekerComponentOutlet.refreshMarkers(markerData)\n  }\n\n  // Collect marker data from timeline items\n  collectMarkerData() {\n    const timelineItems = this.element.querySelectorAll('.timeline-item')\n    const periodItems = []\n    const clipItems = []\n\n    timelineItems.forEach(item => {\n      const type = item.dataset.annotationType || 'clip_point'\n      const masterTimestamp = parseFloat(item.dataset.masterTimestamp || 0)\n      const formattedTime = item.querySelector('.text-white.font-mono.text-xs')?.textContent || ''\n\n      if (masterTimestamp > 0) {\n        const markerData = {\n          type: type,\n          masterTimestamp: masterTimestamp,\n          formattedTime: formattedTime,\n          annotationType: item.dataset.annotationType,\n          periodNumber: item.dataset.periodNumber\n        }\n\n        if (type === 'clip_point') {\n          clipItems.push(markerData)\n        } else {\n          periodItems.push(markerData)\n        }\n      }\n    })\n\n    return {\n      periodItems: periodItems,\n      clipItems: clipItems\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static values = {\n    masterTimestamp: Number,\n    cameraTimestamp: Number,\n    cameraLocationId: String\n  }\n\n  static outlets = [ 'review--studio-component' ]\n\n  connect() {\n    console.log(`Timeline item connected: master=${this.masterTimestampValue}s, camera=${this.cameraTimestampValue}s`)\n  }\n\n  seekTo() {\n    console.log(`Seek to timeline item at master=${this.masterTimestampValue}s, camera=${this.cameraTimestampValue}s`)\n\n    this.reviewStudioComponentOutlet.seekTo(this.masterTimestampValue, this.cameraLocationIdValue)\n  }\n} ", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\n    \"profilePhotoInput\",\n    \"originalPhotoInput\",\n    \"cropXInput\",\n    \"cropYInput\",\n    \"cropScaleInput\",\n    \"photoPreview\",\n    \"editorModal\",\n    \"canvas\",\n    \"canvasContainer\",\n    \"zoomSlider\",\n    \"submitButton\",\n    \"submitContainer\"\n  ]\n\n  static values = {\n    hasPhoto: Boolean,\n    currentPhotoUrl: String,\n    originalPhotoUrl: String,\n    cropX: Number,\n    cropY: Number,\n    cropScale: Number\n  }\n\n  connect() {\n    this.image = null\n    this.scale = 1\n    this.offsetX = 0\n    this.offsetY = 0\n    this.isDragging = false\n    this.startX = 0\n    this.startY = 0\n    this.croppedBlob = null\n\n    // Bind methods for proper cleanup\n    this.boundMouseDown = this.handleMouseDown.bind(this)\n    this.boundMouseMove = this.handleMouseMove.bind(this)\n    this.boundMouseUp = this.handleMouseUp.bind(this)\n    this.boundTouchStart = this.handleTouchStart.bind(this)\n    this.boundTouchMove = this.handleTouchMove.bind(this)\n    this.boundTouchEnd = this.handleTouchEnd.bind(this)\n  }\n\n  disconnect() {\n    this.removeCanvasListeners()\n  }\n\n  openFilePicker() {\n    this.profilePhotoInputTarget.click()\n  }\n\n  async editPhoto() {\n    console.log('Edit photo clicked')\n    console.log('Original photo URL:', this.originalPhotoUrlValue)\n\n    if (!this.originalPhotoUrlValue) {\n      alert('Original photo not found. Please upload a new photo.')\n      return\n    }\n\n    // Fetch the original photo\n    try {\n      const response = await fetch(this.originalPhotoUrlValue)\n      const blob = await response.blob()\n\n      console.log('Fetched original photo blob:', blob.size, 'bytes')\n\n      // Store as originalFile for re-upload\n      this.originalFile = new File([blob], 'original_photo.jpg', { type: blob.type })\n\n      // Load the image and apply saved crop parameters\n      const reader = new FileReader()\n      reader.onload = (e) => {\n        this.loadImageForEditing(e.target.result)\n      }\n      reader.readAsDataURL(blob)\n    } catch (error) {\n      console.error('Error loading original photo:', error)\n      alert('Failed to load original photo. Please try uploading a new photo.')\n    }\n  }\n\n  loadImageForEditing(dataUrl) {\n    console.log('Loading image for editing')\n    this.image = new Image()\n    this.image.onload = () => {\n      console.log('Image loaded, opening editor')\n      this.openEditor()\n\n      // Always reset transform first to calculate baseWidth and baseHeight\n      this.resetTransform()\n\n      // Then apply saved crop parameters if they exist\n      if (this.cropXValue !== undefined && this.cropYValue !== undefined && this.cropScaleValue !== undefined) {\n        console.log('Applying saved crop parameters:', {\n          x: this.cropXValue,\n          y: this.cropYValue,\n          scale: this.cropScaleValue\n        })\n        this.offsetX = this.cropXValue\n        this.offsetY = this.cropYValue\n        this.scale = this.cropScaleValue\n        this.zoomSliderTarget.value = this.scale\n      }\n\n      this.constrainOffset()\n      this.drawImage()\n    }\n    this.image.src = dataUrl\n  }\n\n  handleFileSelect(event) {\n    const file = event.target.files[0]\n    if (!file) return\n\n    // Validate file type\n    const validTypes = ['image/png', 'image/jpeg', 'image/jpg']\n    if (!validTypes.includes(file.type)) {\n      alert('Please select a PNG or JPG image.')\n      return\n    }\n\n    // Validate file size (5MB)\n    const maxSize = 5 * 1024 * 1024\n    if (file.size > maxSize) {\n      alert('File size must be less than 5MB.')\n      return\n    }\n\n    // Store the original file for later upload\n    this.originalFile = file\n\n    // Load the image\n    const reader = new FileReader()\n    reader.onload = (e) => {\n      this.loadImage(e.target.result)\n    }\n    reader.readAsDataURL(file)\n  }\n\n  loadImage(dataUrl) {\n    this.image = new Image()\n    this.image.onload = () => {\n      this.openEditor()\n      this.resetTransform()\n      this.constrainOffset()\n      this.drawImage()\n    }\n    this.image.src = dataUrl\n  }\n\n  openEditor() {\n    this.editorModalTarget.classList.remove('hidden')\n    document.body.style.overflow = 'hidden'\n\n    // Setup canvas\n    const size = 400\n    this.canvasTarget.width = size\n    this.canvasTarget.height = size\n\n    // Add event listeners for dragging\n    this.addCanvasListeners()\n  }\n\n  closeEditor() {\n    this.editorModalTarget.classList.add('hidden')\n    document.body.style.overflow = ''\n    this.removeCanvasListeners()\n\n    // Reset file inputs\n    this.profilePhotoInputTarget.value = ''\n    this.originalPhotoInputTarget.value = ''\n  }\n\n  addCanvasListeners() {\n    this.canvasTarget.addEventListener('mousedown', this.boundMouseDown)\n    this.canvasTarget.addEventListener('mousemove', this.boundMouseMove)\n    this.canvasTarget.addEventListener('mouseup', this.boundMouseUp)\n    this.canvasTarget.addEventListener('mouseleave', this.boundMouseUp)\n\n    // Touch events for mobile\n    this.canvasTarget.addEventListener('touchstart', this.boundTouchStart, { passive: false })\n    this.canvasTarget.addEventListener('touchmove', this.boundTouchMove, { passive: false })\n    this.canvasTarget.addEventListener('touchend', this.boundTouchEnd)\n  }\n\n  removeCanvasListeners() {\n    if (!this.hasCanvasTarget) return\n\n    this.canvasTarget.removeEventListener('mousedown', this.boundMouseDown)\n    this.canvasTarget.removeEventListener('mousemove', this.boundMouseMove)\n    this.canvasTarget.removeEventListener('mouseup', this.boundMouseUp)\n    this.canvasTarget.removeEventListener('mouseleave', this.boundMouseUp)\n    this.canvasTarget.removeEventListener('touchstart', this.boundTouchStart)\n    this.canvasTarget.removeEventListener('touchmove', this.boundTouchMove)\n    this.canvasTarget.removeEventListener('touchend', this.boundTouchEnd)\n  }\n\n  resetTransform() {\n    this.scale = 1\n    this.zoomSliderTarget.value = 1\n\n    // Center the image\n    const canvas = this.canvasTarget\n    const imgAspect = this.image.width / this.image.height\n    const canvasAspect = canvas.width / canvas.height\n\n    let renderWidth, renderHeight\n\n    if (imgAspect > canvasAspect) {\n      renderHeight = canvas.height\n      renderWidth = renderHeight * imgAspect\n    } else {\n      renderWidth = canvas.width\n      renderHeight = renderWidth / imgAspect\n    }\n\n    this.offsetX = (canvas.width - renderWidth) / 2\n    this.offsetY = (canvas.height - renderHeight) / 2\n    this.baseWidth = renderWidth\n    this.baseHeight = renderHeight\n  }\n\n  handleZoom(event) {\n    this.scale = parseFloat(event.target.value)\n    this.constrainOffset()\n    this.drawImage()\n  }\n\n  handleMouseDown(event) {\n    this.isDragging = true\n    this.startX = event.clientX\n    this.startY = event.clientY\n    this.canvasTarget.style.cursor = 'grabbing'\n  }\n\n  handleMouseMove(event) {\n    if (!this.isDragging) return\n\n    const dx = event.clientX - this.startX\n    const dy = event.clientY - this.startY\n\n    this.offsetX += dx\n    this.offsetY += dy\n\n    this.startX = event.clientX\n    this.startY = event.clientY\n\n    this.constrainOffset()\n    this.drawImage()\n  }\n\n  handleMouseUp() {\n    this.isDragging = false\n    this.canvasTarget.style.cursor = 'grab'\n  }\n\n  handleTouchStart(event) {\n    event.preventDefault()\n    const touch = event.touches[0]\n    this.isDragging = true\n    this.startX = touch.clientX\n    this.startY = touch.clientY\n  }\n\n  handleTouchMove(event) {\n    if (!this.isDragging) return\n    event.preventDefault()\n\n    const touch = event.touches[0]\n    const dx = touch.clientX - this.startX\n    const dy = touch.clientY - this.startY\n\n    this.offsetX += dx\n    this.offsetY += dy\n\n    this.startX = touch.clientX\n    this.startY = touch.clientY\n\n    this.constrainOffset()\n    this.drawImage()\n  }\n\n  handleTouchEnd() {\n    this.isDragging = false\n  }\n\n  drawImage() {\n    if (!this.image) return\n\n    const canvas = this.canvasTarget\n    const ctx = canvas.getContext('2d')\n\n    // Clear canvas\n    ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n    // Apply transformations\n    const scaledWidth = this.baseWidth * this.scale\n    const scaledHeight = this.baseHeight * this.scale\n\n    ctx.drawImage(\n      this.image,\n      this.offsetX,\n      this.offsetY,\n      scaledWidth,\n      scaledHeight\n    )\n\n    // Set cursor\n    this.canvasTarget.style.cursor = this.isDragging ? 'grabbing' : 'grab'\n  }\n\n  constrainOffset() {\n    // Ensure the image always covers the circular crop area\n    // Crop circle is centered at (200, 200) with radius 150\n    const centerX = 200\n    const centerY = 200\n    const radius = 150\n\n    const scaledWidth = this.baseWidth * this.scale\n    const scaledHeight = this.baseHeight * this.scale\n\n    // The image must cover the bounding box of the circle\n    const minX = centerX - radius  // 50\n    const minY = centerY - radius  // 50\n    const maxX = centerX + radius  // 350\n    const maxY = centerY + radius  // 350\n\n    // Constrain left edge: image left shouldn't be past circle left\n    if (this.offsetX > minX) {\n      this.offsetX = minX\n    }\n\n    // Constrain top edge: image top shouldn't be past circle top\n    if (this.offsetY > minY) {\n      this.offsetY = minY\n    }\n\n    // Constrain right edge: image right shouldn't be past circle right\n    if (this.offsetX + scaledWidth < maxX) {\n      this.offsetX = maxX - scaledWidth\n    }\n\n    // Constrain bottom edge: image bottom shouldn't be past circle bottom\n    if (this.offsetY + scaledHeight < maxY) {\n      this.offsetY = maxY - scaledHeight\n    }\n  }\n\n  async savePhoto() {\n    if (!this.image) return\n\n    // Ensure we have the latest scale value from the slider\n    this.scale = parseFloat(this.zoomSliderTarget.value)\n\n    // Create a temporary canvas for the circular crop\n    // Use 300x300 to match the circle diameter (150px radius * 2)\n    const radius = 150\n    const size = radius * 2\n    const cropCanvas = document.createElement('canvas')\n    cropCanvas.width = size\n    cropCanvas.height = size\n    const cropCtx = cropCanvas.getContext('2d')\n\n    // Calculate the portion of the main canvas (400x400) to crop\n    const mainCanvasSize = 400\n    const cropX = (mainCanvasSize - size) / 2  // 50px offset from center\n    const cropY = (mainCanvasSize - size) / 2\n\n    // Draw the transformed image, adjusting offsets for the smaller canvas\n    const scaledWidth = this.baseWidth * this.scale\n    const scaledHeight = this.baseHeight * this.scale\n\n    cropCtx.drawImage(\n      this.image,\n      this.offsetX - cropX,  // Adjust offset for smaller canvas\n      this.offsetY - cropY,\n      scaledWidth,\n      scaledHeight\n    )\n\n    // Apply circular mask\n    cropCtx.globalCompositeOperation = 'destination-in'\n    cropCtx.beginPath()\n    cropCtx.arc(radius, radius, radius, 0, Math.PI * 2)\n    cropCtx.fill()\n\n    // Convert to blob and upload\n    cropCanvas.toBlob(async (blob) => {\n      // Close editor\n      this.closeEditor()\n\n      // Update preview immediately\n      this.updatePreview(URL.createObjectURL(blob))\n\n      // Create form data and submit\n      await this.submitPhoto(blob)\n    }, 'image/png')\n  }\n\n  async submitPhoto(croppedBlob) {\n    // Get the form element\n    const form = this.profilePhotoInputTarget.closest('form')\n\n    if (!form) {\n      console.error('Form element not found')\n      alert('Error: Could not find form element')\n      return\n    }\n\n    console.log('Form action:', form.action)\n    console.log('Cropped blob size:', croppedBlob.size, 'bytes')\n    console.log('Original file:', this.originalFile)\n    console.log('Crop parameters:', {\n      x: this.offsetX,\n      y: this.offsetY,\n      scale: this.scale\n    })\n\n    try {\n      // Set the profile_photo file input with the cropped blob\n      const croppedFile = new File([croppedBlob], 'profile_photo.png', { type: 'image/png' })\n      const profilePhotoTransfer = new DataTransfer()\n      profilePhotoTransfer.items.add(croppedFile)\n      this.profilePhotoInputTarget.files = profilePhotoTransfer.files\n\n      // Set the original_photo file input if we have an original\n      if (this.originalFile) {\n        const originalPhotoTransfer = new DataTransfer()\n        originalPhotoTransfer.items.add(this.originalFile)\n        this.originalPhotoInputTarget.files = originalPhotoTransfer.files\n      }\n\n      // Set crop parameter values\n      this.cropXInputTarget.value = this.offsetX\n      this.cropYInputTarget.value = this.offsetY\n      this.cropScaleInputTarget.value = this.scale\n\n      // Listen for form submission completion\n      const handleSubmitEnd = (event) => {\n        console.log('Turbo submit end:', event.detail)\n        if (event.detail.success) {\n          window.location.reload()\n        } else {\n          alert('Failed to upload photo. Please try again.')\n        }\n        form.removeEventListener('turbo:submit-end', handleSubmitEnd)\n      }\n\n      form.addEventListener('turbo:submit-end', handleSubmitEnd)\n\n      // Submit the form using Turbo\n      form.requestSubmit()\n    } catch (error) {\n      console.error('Upload error:', error)\n      alert('Failed to upload photo. Please try again.')\n    }\n  }\n\n  updatePreview(url) {\n    const preview = this.photoPreviewTarget\n    preview.innerHTML = `<img src=\"${url}\" alt=\"Profile photo\" class=\"h-full w-full object-cover\">`\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Shared::GoaltenderSwitcher\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Shared::GoaltenderSwitcher controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Shared::GoaltenderSwitcher controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Shared keyboard shortcuts controller for video players\n *\n * This controller handles keyboard shortcuts for video playback and can be used\n * by any player component. It communicates with player components via Stimulus outlets.\n *\n * Usage:\n *   Add data-controller=\"shared--player-keyboard\" to a parent element\n *   Add the appropriate outlet connection to your player\n *\n * Supported shortcuts:\n *   Space: Play/Pause\n *   Arrow Left: Previous frame\n *   Arrow Right: Next frame\n *   A: Seek backward (configurable amount)\n *   D: Seek forward (configurable amount)\n *   F: Seek far forward (configurable amount)\n *   J: Rotate ice map for left goal (90\u00B0 CW)\n *   K: Rotate ice map to normal orientation\n *   L: Rotate ice map for right goal (90\u00B0 CCW)\n */\nexport default class extends Controller {\n  static values = {\n    seekAmount: { type: Number, default: 5 },      // seconds for A/D keys\n    seekFarAmount: { type: Number, default: 30 }    // seconds for F key\n  }\n\n  // Define which player outlets this controller can work with\n  static outlets = [\n    \"review--player-component\",\n    \"video--player-component\",\n    \"review--annotation--studio-component\"\n  ]\n\n  connect() {\n    console.log(\"Player keyboard shortcuts controller connected\")\n    this.setupKeyboardShortcuts()\n  }\n\n  disconnect() {\n    this.teardownKeyboardShortcuts()\n  }\n\n  setupKeyboardShortcuts() {\n    this.handleKeydown = (event) => {\n      // Ignore keyboard shortcuts when typing in input fields or textareas\n      if (this.isTypingInInput(event.target)) {\n        return\n      }\n\n      // Get the active player outlet\n      const player = this.getActivePlayer()\n      if (!player) {\n        console.log(\"No active player outlet found\")\n        return\n      }\n\n      switch(event.key.toLowerCase()) {\n        case ' ':\n          event.preventDefault()\n          this.togglePlayPause(player)\n          break\n        case 'a':\n          event.preventDefault()\n          this.seekBackward(player)\n          break\n        case 'd':\n          event.preventDefault()\n          this.seekForward(player)\n          break\n        case 'f':\n          event.preventDefault()\n          this.seekFarForward(player)\n          break\n        case 'q':\n          event.preventDefault()\n          this.goToFirstEvent(player)\n          break\n        case 'arrowright':\n          event.preventDefault()\n          this.nextFrame(player)\n          break\n        case 'arrowleft':\n          event.preventDefault()\n          this.previousFrame(player)\n          break\n        case 'j':\n          event.preventDefault()\n          this.rotateIceMap('left')\n          break\n        case 'k':\n          event.preventDefault()\n          this.rotateIceMap('down')\n          break\n        case 'l':\n          event.preventDefault()\n          this.rotateIceMap('right')\n          break\n      }\n    }\n\n    document.addEventListener('keydown', this.handleKeydown)\n  }\n\n  teardownKeyboardShortcuts() {\n    if (this.handleKeydown) {\n      document.removeEventListener('keydown', this.handleKeydown)\n    }\n  }\n\n  // Check if user is typing in an input field\n  isTypingInInput(element) {\n    const inputTypes = ['INPUT', 'TEXTAREA', 'SELECT']\n    return inputTypes.includes(element.tagName) || element.contentEditable === 'true'\n  }\n\n  // Get the active player outlet (priority order: review-player, video-player, studio)\n  getActivePlayer() {\n    if (this.hasReviewPlayerComponentOutlet) {\n      return this.reviewPlayerComponentOutlet\n    }\n    if (this.hasVideoPlayerComponentOutlet) {\n      return this.videoPlayerComponentOutlet\n    }\n    if (this.hasReviewAnnotationStudioComponentOutlet) {\n      return this.reviewAnnotationStudioComponentOutlet\n    }\n    return null\n  }\n\n  // Playback control methods\n  togglePlayPause(player) {\n    if (typeof player.togglePlayPause === 'function') {\n      player.togglePlayPause()\n    } else if (typeof player.isPlaying === 'function') {\n      if (player.isPlaying()) {\n        player.pause()\n      } else {\n        player.play()\n      }\n    }\n  }\n\n  seekBackward(player) {\n    if (typeof player.seekBackward === 'function') {\n      player.seekBackward()\n    } else if (player.player && typeof player.seekToLocalTime === 'function') {\n      const currentTime = typeof player.currentLocalTime === 'number' ? player.currentLocalTime : player.player.currentTime()\n      player.seekToLocalTime(Math.max(0, currentTime - this.seekAmountValue))\n    }\n  }\n\n  seekForward(player) {\n    if (typeof player.seekForward === 'function') {\n      player.seekForward()\n    } else if (player.player && typeof player.seekToLocalTime === 'function') {\n      const currentTime = typeof player.currentLocalTime === 'number' ? player.currentLocalTime : player.player.currentTime()\n      const duration = player.player.duration()\n      player.seekToLocalTime(Math.min(duration, currentTime + this.seekAmountValue))\n    }\n  }\n\n  seekFarForward(player) {\n    if (typeof player.seekFarForward === 'function') {\n      player.seekFarForward()\n    } else if (player.player && typeof player.seekToLocalTime === 'function') {\n      const currentTime = typeof player.currentLocalTime === 'number' ? player.currentLocalTime : player.player.currentTime()\n      const duration = player.player.duration()\n      player.seekToLocalTime(Math.min(duration, currentTime + this.seekFarAmountValue))\n    }\n  }\n\n  nextFrame(player) {\n    if (typeof player.nextFrame === 'function') {\n      player.nextFrame()\n    }\n  }\n\n  previousFrame(player) {\n    if (typeof player.previousFrame === 'function') {\n      player.previousFrame()\n    }\n  }\n\n  goToFirstEvent(player) {\n    // goToFirstEvent is a studio-specific method, try the studio outlet first\n    if (this.hasReviewAnnotationStudioComponentOutlet &&\n        typeof this.reviewAnnotationStudioComponentOutlet.goToFirstEvent === 'function') {\n      this.reviewAnnotationStudioComponentOutlet.goToFirstEvent()\n    } else if (typeof player.goToFirstEvent === 'function') {\n      player.goToFirstEvent()\n    }\n  }\n\n  rotateIceMap(rotation) {\n    // Dispatch custom event for ice map rotation\n    const event = new CustomEvent('ice-map:rotate', {\n      detail: { rotation },\n      bubbles: true\n    })\n    document.dispatchEvent(event)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"input\", \"hiddenInput\", \"results\", \"resultTemplate\", \"resultName\", \"resultSeason\", \"seasonLabel\", \"seasonPicker\", \"creationToggle\", \"creationSection\", \"creationInput\", \"levelSelect\"]\n  static values = {\n    searchUrl: String,\n    year: { type: String, default: '' },\n    minLength: { type: Number, default: 2 },\n    debounceMs: { type: Number, default: 250 },\n    createUrl: String\n  }\n\n  connect() {\n    console.log('TeamSeasonTypeahead connected')\n    console.log('Template target:', this.resultTemplateTarget)\n    this.searchTimeout = null\n    this.selectedIndex = -1\n    this.results = []\n\n    // Handle pre-loaded values\n    this.handlePreloadedValue()\n  }\n\n  disconnect() {\n    if (this.searchTimeout) {\n      clearTimeout(this.searchTimeout)\n    }\n  }\n\n  handlePreloadedValue() {\n    // If there's a pre-loaded value in the input, we need to ensure the hidden input is set\n    const inputValue = this.inputTarget.value.trim()\n    const hiddenValue = this.hiddenInputTarget.value.trim()\n\n    if (inputValue && !hiddenValue) {\n      // If we have a display value but no hidden value, we need to fetch the team ID\n      this.fetchTeamId(inputValue)\n    }\n  }\n\n  async fetchTeamId(teamName) {\n    try {\n      const response = await fetch(`${this.searchUrlValue}?season=${encodeURIComponent(this.yearValue)}&q=${encodeURIComponent(teamName)}`)\n      const data = await response.json()\n\n      const exactMatch = data.find(team => team.name === teamName)\n      if (exactMatch) {\n        this.hiddenInputTarget.value = exactMatch.id\n      }\n    } catch (error) {\n      console.error('Error fetching team ID:', error)\n    }\n  }\n\n  search(event) {\n    const query = event.target.value.trim()\n\n    if (query.length < this.minLengthValue) {\n      this.hideResults()\n      return\n    }\n\n    if (this.searchTimeout) {\n      clearTimeout(this.searchTimeout)\n    }\n\n    this.searchTimeout = setTimeout(() => {\n      this.fetchResults(query)\n    }, this.debounceMsValue)\n  }\n\n  async fetchResults(query) {\n    try {\n      const response = await fetch(`${this.searchUrlValue}?season=${encodeURIComponent(this.yearValue)}&q=${encodeURIComponent(query)}`)\n      const data = await response.json()\n      this.results = data\n      this.showResults()\n    } catch (error) {\n      console.error('Error fetching results:', error)\n      this.hideResults()\n    }\n  }\n\n  showResults() {\n    // Store the template before clearing\n    const template = this.resultTemplateTarget\n\n    // Clear results but preserve the template\n    const resultsContainer = this.resultsTarget\n    const children = Array.from(resultsContainer.children)\n    children.forEach(child => {\n      if (child !== template) {\n        child.remove()\n      }\n    })\n\n    this.resultsTarget.classList.remove('hidden')\n\n    this.results.forEach((result, index) => {\n      const templateContent = template.content.cloneNode(true)\n      const resultElement = templateContent.querySelector('[data-action*=\"click->team-season-typeahead#select\"]')\n      const nameElement = templateContent.querySelector('[data-team-season-typeahead-target=\"resultName\"]')\n\n      nameElement.textContent = result.name\n      const seasonElement = templateContent.querySelector('[data-team-season-typeahead-target=\"resultSeason\"]')\n      if (seasonElement) seasonElement.textContent = result.season || ''\n      resultElement.dataset.id = result.id\n      resultElement.dataset.index = index\n\n      this.resultsTarget.appendChild(templateContent)\n    })\n  }\n\n  hideResults() {\n    // Store the template before clearing\n    const template = this.resultTemplateTarget\n\n    // Clear results but preserve the template\n    const resultsContainer = this.resultsTarget\n    const children = Array.from(resultsContainer.children)\n    children.forEach(child => {\n      if (child !== template) {\n        child.remove()\n      }\n    })\n\n    this.resultsTarget.classList.add('hidden')\n    this.selectedIndex = -1\n  }\n\n  handleKeydown(event) {\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault()\n        this.navigateResults(1)\n        break\n      case 'ArrowUp':\n        event.preventDefault()\n        this.navigateResults(-1)\n        break\n      case 'Enter':\n        event.preventDefault()\n        if (this.selectedIndex >= 0) {\n          this.selectResult(this.results[this.selectedIndex])\n        }\n        break\n      case 'Escape':\n        event.preventDefault()\n        this.hideResults()\n        break\n    }\n  }\n\n  navigateResults(direction) {\n    const newIndex = this.selectedIndex + direction\n\n    if (newIndex >= 0 && newIndex < this.results.length) {\n      this.selectedIndex = newIndex\n      this.highlightSelectedResult()\n    }\n  }\n\n  highlightSelectedResult() {\n    const resultElements = this.resultsTarget.querySelectorAll('[data-action*=\"click->team-season-typeahead#select\"]')\n    resultElements.forEach((element, index) => {\n      element.classList.toggle('bg-gray-100', index === this.selectedIndex)\n    })\n  }\n\n  select(event) {\n    const resultElement = event.currentTarget\n    const result = this.results[parseInt(resultElement.dataset.index)]\n    this.selectResult(result)\n  }\n\n  selectResult(result) {\n    this.inputTarget.value = result.name\n    this.hiddenInputTarget.value = result.id\n    this.dispatch('teamSelected', { detail: { value: result.id, text: result.name } })\n    this.hideResults()\n  }\n\n  toggleSeasonPicker() {\n    this.seasonPickerTarget.classList.toggle('hidden')\n  }\n\n  setSeason(event) {\n    const { year, label } = event.currentTarget.dataset\n    this.yearValue = year\n    this.seasonLabelTarget.textContent = label\n    this.seasonPickerTarget.classList.add('hidden')\n    this.inputTarget.value = ''\n    this.hiddenInputTarget.value = ''\n    this.inputTarget.focus()\n  }\n\n  showCreation() {\n    if (this.hasCreationToggleTarget) this.creationToggleTarget.classList.add('hidden')\n    if (this.hasCreationSectionTarget) {\n      this.creationSectionTarget.classList.remove('hidden')\n      if (this.hasCreationInputTarget) this.creationInputTarget.focus()\n    }\n    this.inputTarget.value = ''\n    this.hiddenInputTarget.value = ''\n    this.hideResults()\n  }\n\n  hideCreation() {\n    if (this.hasCreationSectionTarget) this.creationSectionTarget.classList.add('hidden')\n    if (this.hasCreationToggleTarget) this.creationToggleTarget.classList.remove('hidden')\n    if (this.hasCreationInputTarget) this.creationInputTarget.value = ''\n    if (this.hasLevelSelectTarget) this.levelSelectTarget.value = ''\n  }\n\n  async createTeam(event) {\n    event.preventDefault()\n    if (!this.hasCreationInputTarget) return\n\n    const name = this.creationInputTarget.value.trim()\n    if (!name) return\n\n    const csrfToken = document.querySelector('[name=\"csrf-token\"]')?.content\n\n    try {\n      const response = await fetch(this.createUrlValue, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'X-CSRF-Token': csrfToken,\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({ name, season: this.yearValue, level_id: this.hasLevelSelectTarget ? this.levelSelectTarget.value : undefined })\n      })\n\n      if (response.ok) {\n        const team = await response.json()\n        this.selectResult(team)\n        this.hideCreation()\n      }\n    } catch (error) {\n      console.error('Error creating team:', error)\n    }\n  }\n}\n", "import { Controller } from '@hotwired/stimulus'\n\nexport default class TimezoneGuesserController extends Controller {\n  static targets = ['tzField']\n  static values = { tzMappings: Object }\n\n  declare tzFieldTarget: HTMLInputElement\n  declare tzMappingsValue: Object\n\n  connect() {\n    var ctrlr = this;\n\n    this.tzFieldTarget.value = ctrlr.tzMappingsValue[Intl.DateTimeFormat().resolvedOptions().timeZone]\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Simple tooltip controller for hover interactions\n */\nexport default class extends Controller {\n  static targets = [\"trigger\", \"content\"]\n\n  connect() {\n    this.hideTimeout = null\n    this.boundShow = this.show.bind(this)\n    this.boundHide = this.hide.bind(this)\n    this.boundCancelHide = this.cancelHide.bind(this)\n\n    this.triggerTarget.addEventListener('mouseenter', this.boundShow)\n    this.triggerTarget.addEventListener('mouseleave', this.boundHide)\n\n    // Keep tooltip visible when hovering over it\n    this.contentTarget.addEventListener('mouseenter', this.boundCancelHide)\n    this.contentTarget.addEventListener('mouseleave', this.boundHide)\n  }\n\n  disconnect() {\n    this.triggerTarget.removeEventListener('mouseenter', this.boundShow)\n    this.triggerTarget.removeEventListener('mouseleave', this.boundHide)\n    this.contentTarget.removeEventListener('mouseenter', this.boundCancelHide)\n    this.contentTarget.removeEventListener('mouseleave', this.boundHide)\n\n    if (this.hideTimeout) {\n      clearTimeout(this.hideTimeout)\n    }\n  }\n\n  show() {\n    if (this.hideTimeout) {\n      clearTimeout(this.hideTimeout)\n      this.hideTimeout = null\n    }\n    this.contentTarget.classList.remove('hidden')\n  }\n\n  hide() {\n    // Delay hiding to allow moving cursor to tooltip\n    this.hideTimeout = setTimeout(() => {\n      this.contentTarget.classList.add('hidden')\n    }, 100)\n  }\n\n  cancelHide() {\n    if (this.hideTimeout) {\n      clearTimeout(this.hideTimeout)\n      this.hideTimeout = null\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"seasonSelect\", \"typeaheadWrapper\"]\n\n  connect() {\n    this.syncSeasonToTypeahead()\n  }\n\n  seasonChanged() {\n    this.syncSeasonToTypeahead()\n    this.clearTypeaheadSelection()\n  }\n\n  syncSeasonToTypeahead() {\n    if (!this.hasSeasonSelectTarget || !this.hasTypeaheadWrapperTarget) return\n\n    const select = this.seasonSelectTarget\n    const year = select.value\n    const label = select.options[select.selectedIndex]?.text || year\n\n    const typeaheadEl = this.typeaheadWrapperTarget.querySelector('[data-controller~=\"team-season-typeahead\"]')\n    if (!typeaheadEl) return\n\n    typeaheadEl.dataset.teamSeasonTypeaheadYearValue = year\n\n    const labelEl = typeaheadEl.querySelector('[data-team-season-typeahead-target=\"seasonLabel\"]')\n    if (labelEl) labelEl.textContent = label\n  }\n\n  clearTypeaheadSelection() {\n    if (!this.hasTypeaheadWrapperTarget) return\n\n    const typeaheadEl = this.typeaheadWrapperTarget.querySelector('[data-controller~=\"team-season-typeahead\"]')\n    if (!typeaheadEl) return\n\n    const inputEl = typeaheadEl.querySelector('[data-team-season-typeahead-target=\"input\"]')\n    const hiddenEl = typeaheadEl.querySelector('[data-team-season-typeahead-target=\"hiddenInput\"]')\n    if (inputEl) inputEl.value = ''\n    if (hiddenEl) hiddenEl.value = ''\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for dual-handle range slider\n * Manages two range inputs to create a min/max range selector\n */\nexport default class extends Controller {\n  static targets = [\"minInput\", \"maxInput\", \"range\", \"display\"]\n  static values = {\n    min: { type: Number, default: 0 },\n    max: { type: Number, default: 100 },\n    step: { type: Number, default: 1 },\n    minValue: { type: Number, default: 0 },\n    maxValue: { type: Number, default: 100 },\n    color: { type: String, default: \"indigo\" }\n  }\n\n  connect() {\n    this.updateDisplay()\n    this.updateRange()\n    this.updateRangeColor()\n    this.applyThumbBorderColor()\n  }\n\n  applyThumbBorderColor() {\n    // Create a temporary element to get computed Tailwind color value\n    const tempEl = document.createElement('div')\n    tempEl.className = `border-${this.colorValue}-600`\n    tempEl.style.display = 'none'\n    // border-brand-600\n    document.body.appendChild(tempEl)\n\n    // Get the computed border color from Tailwind\n    const computedColor = window.getComputedStyle(tempEl).borderColor\n    document.body.removeChild(tempEl)\n\n    // Inject styles with the computed color\n    const style = document.createElement('style')\n    style.textContent = `\n      [data-ui--dual-range-slider-component-target=\"minInput\"]::-webkit-slider-thumb,\n      [data-ui--dual-range-slider-component-target=\"maxInput\"]::-webkit-slider-thumb {\n        border-color: ${computedColor} !important;\n      }\n      [data-ui--dual-range-slider-component-target=\"minInput\"]::-moz-range-thumb,\n      [data-ui--dual-range-slider-component-target=\"maxInput\"]::-moz-range-thumb {\n        border-color: ${computedColor} !important;\n      }\n    `\n    this.element.appendChild(style)\n  }\n\n  updateRangeColor() {\n    if (!this.hasRangeTarget) return\n\n    // Remove any existing bg-* color classes\n    const classes = Array.from(this.rangeTarget.classList)\n    classes.forEach(cls => {\n      if (cls.startsWith('bg-') && cls.endsWith('-600')) {\n        this.rangeTarget.classList.remove(cls)\n      }\n    })\n\n    // Add the correct color class\n    this.rangeTarget.classList.add(`bg-${this.colorValue}-600`)\n  }\n\n  updateMin(event) {\n    const value = parseFloat(event.target.value)\n\n    // Ensure min doesn't exceed max\n    if (value > this.maxValueValue) {\n      this.minInputTarget.value = this.maxValueValue\n      this.minValueValue = this.maxValueValue\n    } else {\n      this.minValueValue = value\n    }\n\n    this.updateDisplay()\n    this.updateRange()\n  }\n\n  updateMax(event) {\n    const value = parseFloat(event.target.value)\n\n    // Ensure max doesn't go below min\n    if (value < this.minValueValue) {\n      this.maxInputTarget.value = this.minValueValue\n      this.maxValueValue = this.minValueValue\n    } else {\n      this.maxValueValue = value\n    }\n\n    this.updateDisplay()\n    this.updateRange()\n  }\n\n  updateDisplay() {\n    if (this.hasDisplayTarget) {\n      const minFormatted = this.minValueValue.toFixed(1)\n      const maxFormatted = this.maxValueValue.toFixed(1)\n      this.displayTarget.textContent = `${minFormatted} - ${maxFormatted}`\n    }\n  }\n\n  updateRange() {\n    if (!this.hasRangeTarget) return\n\n    const minPercent = ((this.minValueValue - this.minValue) / (this.maxValue - this.minValue)) * 100\n    const maxPercent = ((this.maxValueValue - this.minValue) / (this.maxValue - this.minValue)) * 100\n\n    this.rangeTarget.style.left = `${minPercent}%`\n    this.rangeTarget.style.width = `${maxPercent - minPercent}%`\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { Turbo } from \"@hotwired/turbo-rails\"\n\n/**\n * Stimulus controller for Ui::GoaltenderSelectDropdown\n * Handles navigation to different goaltender analysis pages via Turbo Frame\n */\nexport default class extends Controller {\n  /**\n   * Navigate to the selected goaltender's analysis page\n   * @param {Event} event - The change event from the select element\n   * @returns {void}\n   */\n  navigate(event) {\n    const path = event.target.value\n    const turboFrame = document.getElementById(this.element.dataset.turboFrame)\n\n    if (turboFrame && path) {\n      // Update the turbo frame's src to load the new goaltender's content\n      turboFrame.src = path\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Ui::KeyboardShortcuts\n * Handles showing/hiding keyboard shortcuts with icon and expanded states\n */\nexport default class extends Controller {\n  static targets = [\"icon\", \"shortcuts\"]\n\n  connect() {\n    this.isPersistent = false\n    this.hideTimeout = null\n    this.collapseTimeout = null\n\n    // Set initial state for icon (hidden)\n    this.iconTarget.classList.add('opacity-0', 'pointer-events-none')\n\n    // Start with shortcuts expanded\n    this.shortcutsTarget.classList.add('opacity-100', 'pointer-events-auto')\n\n    // Schedule collapse after 5 seconds\n    this.scheduleCollapse()\n\n    // Listen for clicks outside to close when persistent\n    this.boundHandleClickOutside = this.handleClickOutside.bind(this)\n    document.addEventListener('click', this.boundHandleClickOutside)\n  }\n\n  disconnect() {\n    // Clean up timeouts\n    if (this.hideTimeout) {\n      clearTimeout(this.hideTimeout)\n    }\n    if (this.collapseTimeout) {\n      clearTimeout(this.collapseTimeout)\n    }\n\n    // Clean up event listener\n    document.removeEventListener('click', this.boundHandleClickOutside)\n  }\n\n  scheduleCollapse() {\n    this.collapseTimeout = setTimeout(() => {\n      if (!this.isPersistent) {\n        this.collapse()\n      }\n    }, 5000) // 5 seconds\n  }\n\n  collapse() {\n    this.hideShortcuts()\n    this.showIcon()\n  }\n\n  expand() {\n    this.showShortcuts()\n    this.hideIcon()\n  }\n\n  showIcon() {\n    this.iconTarget.classList.remove('opacity-0', 'pointer-events-none')\n    this.iconTarget.classList.add('opacity-100', 'pointer-events-auto')\n  }\n\n  hideIcon() {\n    this.iconTarget.classList.remove('opacity-100', 'pointer-events-auto')\n    this.iconTarget.classList.add('opacity-0', 'pointer-events-none')\n  }\n\n  showShortcuts() {\n    this.shortcutsTarget.classList.remove('opacity-0', 'pointer-events-none')\n    this.shortcutsTarget.classList.add('opacity-100', 'pointer-events-auto')\n  }\n\n  hideShortcuts() {\n    this.shortcutsTarget.classList.remove('opacity-100', 'pointer-events-auto')\n    this.shortcutsTarget.classList.add('opacity-0', 'pointer-events-none')\n  }\n\n  // Show on hover (temporary)\n  showOnHover(event) {\n    event.stopPropagation()\n    if (this.hideTimeout) {\n      clearTimeout(this.hideTimeout)\n    }\n    this.expand()\n  }\n\n  // Hide on hover leave (unless persistent)\n  hideOnHover(event) {\n    event.stopPropagation()\n    if (!this.isPersistent) {\n      this.hideTimeout = setTimeout(() => {\n        this.collapse()\n      }, 100)\n    }\n  }\n\n  // Cancel auto-hide when hovering over shortcuts\n  cancelAutoHide() {\n    if (this.hideTimeout) {\n      clearTimeout(this.hideTimeout)\n    }\n  }\n\n  // Toggle persistent state on click\n  togglePersistent(event) {\n    event.stopPropagation()\n    this.isPersistent = !this.isPersistent\n\n    if (this.isPersistent) {\n      this.expand()\n    }\n  }\n\n  // Close button clicked\n  close(event) {\n    event.stopPropagation()\n    this.isPersistent = false\n    this.collapse()\n  }\n\n  // Handle clicks outside to close when persistent\n  handleClickOutside(event) {\n    if (!this.isPersistent) return\n\n    // Check if click is outside the component\n    if (!this.element.contains(event.target)) {\n      this.isPersistent = false\n      this.collapse()\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Ui::MultiSelectDropdown\n * Provides checkbox-based multi-select dropdown with auto-submit\n */\nexport default class extends Controller {\n  static targets = [\"dropdown\", \"displayText\", \"trigger\", \"checkbox\"]\n  static values = {\n    name: String\n  }\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    // Bind methods for proper cleanup\n    this.boundHandleClickOutside = this.handleClickOutside.bind(this)\n    this.updateDisplayText()\n  }\n\n  /**\n   * Toggle dropdown open/close\n   * @returns {void}\n   */\n  toggle(event) {\n    event.preventDefault()\n    event.stopPropagation()\n\n    if (this.dropdownTarget.classList.contains('hidden')) {\n      this.open()\n    } else {\n      this.close()\n    }\n  }\n\n  /**\n   * Open dropdown\n   * @returns {void}\n   */\n  open() {\n    this.dropdownTarget.classList.remove('hidden')\n    // Add click outside listener\n    setTimeout(() => {\n      document.addEventListener('click', this.boundHandleClickOutside)\n    }, 0)\n  }\n\n  /**\n   * Close dropdown\n   * @returns {void}\n   */\n  close() {\n    this.dropdownTarget.classList.add('hidden')\n    // Remove click outside listener\n    document.removeEventListener('click', this.boundHandleClickOutside)\n  }\n\n  /**\n   * Handle clicks outside the dropdown to close it\n   * @param {Event} event - Click event\n   * @returns {void}\n   */\n  handleClickOutside(event) {\n    if (!this.element.contains(event.target)) {\n      this.close()\n    }\n  }\n\n  /**\n   * Handle checkbox changes\n   * @returns {void}\n   */\n  handleChange() {\n    // Update display text\n    this.updateDisplayText()\n\n    // Debounce form submission to allow multiple selections\n    clearTimeout(this.submitTimeout)\n    this.submitTimeout = setTimeout(() => {\n      this.submitForm()\n    }, 300)\n  }\n\n  /**\n   * Update the display text based on selected checkboxes\n   * @returns {void}\n   */\n  updateDisplayText() {\n    const checked = this.checkboxTargets.filter(cb => cb.checked)\n    const count = checked.length\n\n    if (count === 0) {\n      this.displayTextTarget.textContent = this.triggerTarget.dataset.placeholder || 'Select options'\n    } else if (count === 1) {\n      // Show the label of the single selected item\n      const label = checked[0].nextElementSibling?.textContent || `${count} selected`\n      this.displayTextTarget.textContent = label\n    } else {\n      this.displayTextTarget.textContent = `${count} selected`\n    }\n  }\n\n  /**\n   * Submit the parent form\n   * @returns {void}\n   */\n  submitForm() {\n    const form = this.element.closest('form')\n    if (form) {\n      // Trigger the form's submit action if it has the clips-filter controller\n      const filterController = this.application.getControllerForElementAndIdentifier(form, 'video--clips-filter')\n      if (filterController) {\n        filterController.submit()\n      } else {\n        // Fallback: just submit the form\n        form.requestSubmit()\n      }\n    }\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    // Clean up event listeners\n    document.removeEventListener('click', this.boundHandleClickOutside)\n\n    // Clear timeout\n    if (this.submitTimeout) {\n      clearTimeout(this.submitTimeout)\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Ui::RadioGroup\n * Handles visual state updates when radio selection changes\n */\nexport default class extends Controller {\n  static targets = [\"radio\", \"label\"]\n\n  connect() {\n    this.updateVisualState()\n  }\n\n  /**\n   * Handle radio button change - update visual styling\n   */\n  handleChange(event) {\n    this.updateVisualState()\n  }\n\n  /**\n   * Update label styling based on checked state\n   */\n  updateVisualState() {\n    this.radioTargets.forEach((radio, index) => {\n      const label = this.labelTargets[index]\n      const span = label.querySelector('span')\n\n      if (radio.checked) {\n        // Selected state\n        label.className = \"flex items-center justify-center p-3 border border-blue-600 bg-blue-600 rounded-lg cursor-pointer transition-all duration-150\"\n        span.className = \"text-sm font-medium text-white\"\n      } else {\n        // Unselected state\n        label.className = \"flex items-center justify-center p-3 border border-gray-200 rounded-lg cursor-pointer transition-all duration-150 hover:border-blue-300 hover:bg-blue-50\"\n        span.className = \"text-sm font-medium text-gray-700\"\n      }\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Ui::Tabs\n */\nexport default class extends Controller {\n  static targets = [\"tabButton\", \"tabPanel\"]\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Ui::Tabs controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Ui::Tabs controller disconnected\")\n  }\n\n  /**\n   * Switch to the clicked tab\n   * @param {Event} event - The click event from the tab button\n   * @returns {void}\n   */\n  switchTab(event) {\n    const clickedButton = event.currentTarget\n    const tabName = clickedButton.dataset.tabName\n\n    // Update all buttons - remove active state\n    this.tabButtonTargets.forEach(button => {\n      button.classList.remove('border-gray-300', 'text-gray-200')\n      button.classList.add('border-transparent', 'text-gray-400')\n    })\n\n    // Add active state to clicked button\n    clickedButton.classList.remove('border-transparent', 'text-gray-400')\n    clickedButton.classList.add('border-gray-300', 'text-gray-200')\n\n    // Hide all panels\n    this.tabPanelTargets.forEach(panel => {\n      panel.classList.add('hidden')\n    })\n\n    // Show the matching panel\n    const activePanel = this.tabPanelTargets.find(panel => panel.dataset.tabName === tabName)\n    if (activePanel) {\n      activePanel.classList.remove('hidden')\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Video::Clip\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Video::Clip controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Video::Clip controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n\nexport default class extends Controller {\n  static targets = [\n    \"compilationSelect\",\n    \"highlightLevelSelect\",\n    \"video\",\n    \"seekBar\",\n    \"seekHandle\",\n    \"startTrimHandle\",\n    \"endTrimHandle\",\n    \"startTrimInput\",\n    \"endTrimInput\",\n    \"playButton\",\n    \"playIcon\",\n    \"pauseIcon\",\n    \"muteButton\",\n    \"volumeIcon\",\n    \"muteIcon\",\n    \"currentTime\",\n    \"duration\",\n    \"startTrimShade\",\n    \"endTrimShade\"\n  ]\n\n  connect() {\n    document.addEventListener('keydown', this.handleKeydown.bind(this))\n    this.initializeSeekBar()\n    this.initializePlaybackControls()\n  }\n\n  disconnect() {\n    document.removeEventListener('keydown', this.handleKeydown.bind(this))\n  }\n\n  initializeSeekBar() {\n    let isDragging = false\n    let currentHandle = null\n\n    // Wait for video metadata to load to get duration\n    this.videoTarget.addEventListener('loadedmetadata', () => {\n      // Set initial trim values if not set\n      if (!this.startTrimInputTarget.value) {\n        this.startTrimInputTarget.value = \"0.00\"\n      }\n      if (!this.endTrimInputTarget.value) {\n        this.endTrimInputTarget.value = this.videoTarget.duration.toFixed(2)\n      }\n\n      this.updateTrimHandles()\n      this.updateDurationDisplay()\n      this.updateTrimShading()\n    })\n\n    // Ensure video stays within trim points\n    this.videoTarget.addEventListener('timeupdate', () => {\n      const currentTime = this.videoTarget.currentTime\n      const startTrim = parseFloat(this.startTrimInputTarget.value)\n      const endTrim = parseFloat(this.endTrimInputTarget.value)\n\n      const progress = (currentTime / this.videoTarget.duration) * 100\n      this.seekHandleTarget.style.left = `${progress}%`\n\n      // If video goes beyond trim points, reset to appropriate position\n      if (currentTime < startTrim) {\n        this.videoTarget.currentTime = startTrim\n      } else if (currentTime > endTrim) {\n        this.videoTarget.currentTime = startTrim\n      }\n      this.currentTimeTarget.textContent = this.formatTime(Math.max(0, currentTime - startTrim))\n    })\n\n    // Update duration when trim points change\n    const updateTrimmedDuration = () => {\n      this.updateDurationDisplay()\n    }\n\n    this.startTrimInputTarget.addEventListener('change', updateTrimmedDuration)\n    this.endTrimInputTarget.addEventListener('change', updateTrimmedDuration)\n\n    const startDrag = (e, handle) => {\n      isDragging = true\n      currentHandle = handle\n      document.addEventListener('mousemove', handleDrag)\n      document.addEventListener('mouseup', stopDrag)\n    }\n\n    const handleDrag = (e) => {\n      if (!isDragging) return\n\n      const seekBarRect = this.seekBarTarget.getBoundingClientRect()\n      let position = (e.clientX - seekBarRect.left) / seekBarRect.width\n      position = Math.max(0, Math.min(1, position))\n      const percentage = position * 100\n      const time = this.videoTarget.duration * position\n\n      if (currentHandle === this.seekHandleTarget) {\n        // Constrain seek handle between trim points\n        const startTrim = parseFloat(this.startTrimInputTarget.value)\n        const endTrim = parseFloat(this.endTrimInputTarget.value)\n        if (time >= startTrim && time <= endTrim) {\n          this.videoTarget.currentTime = time\n          currentHandle.style.left = `${percentage}%`\n        }\n      } else if (currentHandle === this.startTrimHandleTarget) {\n        // Don't allow start trim to go past end trim\n        const endTrim = parseFloat(this.endTrimInputTarget.value)\n        if (time < endTrim) {\n          this.startTrimInputTarget.value = time.toFixed(2)\n          currentHandle.style.left = `${percentage}%`\n          this.videoTarget.currentTime = time\n          this.updateDurationDisplay()\n          this.updateTrimShading()\n        }\n      } else if (currentHandle === this.endTrimHandleTarget) {\n        // Don't allow end trim to go before start trim\n        const startTrim = parseFloat(this.startTrimInputTarget.value)\n        if (time > startTrim) {\n          this.endTrimInputTarget.value = time.toFixed(2)\n          currentHandle.style.left = `${percentage}%`\n          this.videoTarget.currentTime = time\n          this.updateDurationDisplay()\n          this.updateTrimShading()\n        }\n      }\n    }\n\n    const stopDrag = () => {\n      isDragging = false\n      currentHandle = null\n      document.removeEventListener('mousemove', handleDrag)\n      document.removeEventListener('mouseup', stopDrag)\n    }\n\n    // Initialize drag events for all handles\n    this.seekHandleTarget.addEventListener('mousedown', (e) => startDrag(e, this.seekHandleTarget))\n    this.startTrimHandleTarget.addEventListener('mousedown', (e) => startDrag(e, this.startTrimHandleTarget))\n    this.endTrimHandleTarget.addEventListener('mousedown', (e) => startDrag(e, this.endTrimHandleTarget))\n\n    // Allow clicking anywhere on the seek bar to seek (within trim points)\n    this.seekBarTarget.addEventListener('click', (e) => {\n      const seekBarRect = this.seekBarTarget.getBoundingClientRect()\n      const position = (e.clientX - seekBarRect.left) / seekBarRect.width\n      const time = this.videoTarget.duration * position\n      const startTrim = parseFloat(this.startTrimInputTarget.value)\n      const endTrim = parseFloat(this.endTrimInputTarget.value)\n\n      if (time >= startTrim && time <= endTrim) {\n        this.videoTarget.currentTime = time\n      }\n    })\n\n    // Add ended event listener to loop within trim points\n    this.videoTarget.addEventListener('ended', () => {\n      this.videoTarget.currentTime = parseFloat(this.startTrimInputTarget.value)\n      this.videoTarget.play()\n    })\n  }\n\n  handleKeydown(event) {\n    // Ignore keyboard shortcuts when user is typing in input fields\n    const activeElement = document.activeElement\n    const isTyping = activeElement && (\n      activeElement.tagName === 'INPUT' ||\n      activeElement.tagName === 'TEXTAREA' ||\n      activeElement.tagName === 'SELECT' ||\n      activeElement.isContentEditable\n    )\n\n    if (isTyping) {\n      return\n    }\n\n    if (event.key === 'a') {\n      this.addFirstCompilation()\n    } else if (event.key === '0') {\n      this.setHighlightLevel(0)\n    } else if (event.key === '1') {\n      this.setHighlightLevel(1)\n    } else if (event.key === '2') {\n      this.setHighlightLevel(2)\n    } else if (event.key === '3') {\n      this.setHighlightLevel(3)\n    } else if (event.key === 'Enter') {\n      this.save()\n    }\n  }\n\n  addFirstCompilation() {\n    const firstCompilation = this.compilationSelectTarget.options[0]\n    firstCompilation.selected = true\n  }\n\n  setHighlightLevel(level) {\n    this.highlightLevelSelectTarget.value = level\n  }\n\n  save() {\n    // Use rails to submit the form as a turbo stream\n    this.element.closest('form').requestSubmit()\n  }\n\n  initializePlaybackControls() {\n    // Update play/pause button state when video state changes\n    this.videoTarget.addEventListener('play', () => {\n      this.playIconTarget.classList.add('hidden')\n      this.pauseIconTarget.classList.remove('hidden')\n    })\n\n    this.videoTarget.addEventListener('pause', () => {\n      this.playIconTarget.classList.remove('hidden')\n      this.pauseIconTarget.classList.add('hidden')\n    })\n\n    // Update mute button state when video state changes\n    this.videoTarget.addEventListener('volumechange', () => {\n      if (this.videoTarget.muted) {\n        this.volumeIconTarget.classList.add('hidden')\n        this.muteIconTarget.classList.remove('hidden')\n      } else {\n        this.volumeIconTarget.classList.remove('hidden')\n        this.muteIconTarget.classList.add('hidden')\n      }\n    })\n\n    // Add space bar shortcut for play/pause\n    document.addEventListener('keydown', (e) => {\n      if (e.code === 'Space' && e.target === document.body) {\n        e.preventDefault()\n        this.togglePlay()\n      }\n    })\n  }\n\n  togglePlay() {\n    if (this.videoTarget.paused) {\n      this.videoTarget.play()\n    } else {\n      this.videoTarget.pause()\n    }\n  }\n\n  toggleMute() {\n    this.videoTarget.muted = !this.videoTarget.muted\n  }\n\n  formatTime(seconds) {\n    const minutes = Math.floor(seconds / 60)\n    const remainingSeconds = Math.floor(seconds % 60)\n    const milliseconds = Math.floor((seconds % 1) * 1000)\n    return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}.${milliseconds.toString().padStart(3, '0')}`\n  }\n\n  updateDurationDisplay() {\n    const startTrim = parseFloat(this.startTrimInputTarget.value)\n    const endTrim = parseFloat(this.endTrimInputTarget.value)\n    const trimmedDuration = endTrim - startTrim\n    this.durationTarget.textContent = this.formatTime(trimmedDuration)\n  }\n\n  updateTrimShading() {\n    const startPosition = (parseFloat(this.startTrimInputTarget.value) / this.videoTarget.duration) * 100\n    const endPosition = (parseFloat(this.endTrimInputTarget.value) / this.videoTarget.duration) * 100\n\n    this.startTrimShadeTarget.style.width = `${startPosition}%`\n    this.endTrimShadeTarget.style.width = `${100 - endPosition}%`\n  }\n\n  updateTrimHandles() {\n    const startPosition = (parseFloat(this.startTrimInputTarget.value) / this.videoTarget.duration) * 100\n    const endPosition = (parseFloat(this.endTrimInputTarget.value) / this.videoTarget.duration) * 100\n\n    this.startTrimHandleTarget.style.left = `${startPosition}%`\n    this.endTrimHandleTarget.style.left = `${endPosition}%`\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Video::ClipResult\n * Handles hover preview functionality for clip results\n */\nexport default class extends Controller {\n  static targets = [\"thumbnail\", \"video\"]\n  static values = {\n    previewUrl: String\n  }\n\n  connect() {\n    console.log('ClipResult controller connected', {\n      previewUrl: this.previewUrlValue,\n      hasThumbnail: this.hasThumbnailTarget,\n      hasVideo: this.hasVideoTarget\n    })\n  }\n\n  /**\n   * Prevent navigation when clicking checkbox\n   * @returns {void}\n   */\n  preventNavigation(event) {\n    event.stopPropagation()\n  }\n\n  /**\n   * Play preview video on hover (with delay)\n   * @returns {void}\n   */\n  playPreview() {\n    console.log('playPreview called')\n\n    // Start loading video immediately (before delay) to avoid black flash\n    if (!this.videoTarget.src) {\n      console.log('Loading video source:', this.previewUrlValue)\n      this.videoTarget.src = this.previewUrlValue\n      // Preload the video\n      this.videoTarget.load()\n    }\n\n    // Clear any existing timeout\n    if (this.previewTimeout) {\n      clearTimeout(this.previewTimeout)\n    }\n\n    // Wait 350ms before playing to avoid playing when just moving mouse through\n    this.previewTimeout = setTimeout(() => {\n      // Hide thumbnail, show and play video\n      this.thumbnailTarget.classList.add('hidden')\n      this.videoTarget.classList.remove('hidden')\n      this.videoTarget.play().catch((error) => {\n        console.error('Error playing video:', error)\n      })\n    }, 500)\n  }\n\n  /**\n   * Stop preview video on mouse leave\n   * @returns {void}\n   */\n  stopPreview() {\n    // Clear the preview timeout if still pending\n    if (this.previewTimeout) {\n      clearTimeout(this.previewTimeout)\n      this.previewTimeout = null\n    }\n\n    // Pause and reset video\n    this.videoTarget.pause()\n    this.videoTarget.currentTime = 0\n\n    // Show thumbnail, hide video\n    this.videoTarget.classList.add('hidden')\n    this.thumbnailTarget.classList.remove('hidden')\n  }\n\n  /**\n   * Clean up when disconnected\n   * @returns {void}\n   */\n  disconnect() {\n    if (this.hasVideoTarget && this.videoTarget.src) {\n      this.videoTarget.pause()\n      this.videoTarget.src = ''\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for multi-select location filter grid\n */\nexport default class extends Controller {\n  static targets = [\"cell\", \"checkbox\", \"hiddenInputs\"]\n  static values = {\n    fieldPrefix: String\n  }\n\n  connect() {\n    console.log('Location filter grid controller connected')\n    console.log('Field prefix:', this.fieldPrefixValue)\n    console.log('Cell targets:', this.cellTargets.length)\n    console.log('Checkbox targets:', this.checkboxTargets.length)\n  }\n\n  /**\n   * Toggle cell selection\n   * @param {Event} event - The click event\n   * @returns {void}\n   */\n  toggleCell(event) {\n    const cell = event.currentTarget\n    const xRegion = cell.dataset.xRegion\n    const yRegion = cell.dataset.yRegion\n\n    console.log('Cell clicked:', xRegion, yRegion)\n    console.log('Available checkboxes:', this.checkboxTargets.length)\n\n    // Find the corresponding checkbox\n    const checkbox = this.checkboxTargets.find(cb => {\n      console.log('Checking checkbox:', cb.dataset.xRegion, cb.dataset.yRegion)\n      return cb.dataset.xRegion === xRegion && cb.dataset.yRegion === yRegion\n    })\n\n    console.log('Found checkbox:', checkbox)\n\n    if (checkbox) {\n      // Toggle checkbox state\n      checkbox.checked = !checkbox.checked\n\n      console.log('Checkbox toggled to:', checkbox.checked)\n\n      // Update cell visual state\n      this.updateCellStyle(cell, checkbox.checked)\n\n      // Trigger form submission through the checkbox change event\n      checkbox.dispatchEvent(new Event('change', { bubbles: true }))\n    } else {\n      console.error('No matching checkbox found for:', xRegion, yRegion)\n    }\n  }\n\n  /**\n   * Update cell visual styling based on selection state\n   * @param {HTMLElement} cell - The cell element\n   * @param {boolean} isSelected - Whether the cell is selected\n   * @returns {void}\n   */\n  updateCellStyle(cell, isSelected) {\n    if (isSelected) {\n      cell.classList.add('bg-brand-400/40')\n\n      // Add checkmark\n      if (!cell.querySelector('svg')) {\n        cell.innerHTML = `\n          <svg class=\"w-4 h-4 text-white\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"/>\n          </svg>\n        `\n      }\n    } else {\n      cell.classList.remove('bg-brand-400/40')\n      cell.innerHTML = ''\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for shot origin filter with ice rink visualization\n */\nexport default class extends Controller {\n  static targets = [\"zone\", \"checkbox\", \"hiddenInputs\"]\n\n  connect() {\n    console.log('Shot origin filter controller connected')\n    console.log('Zone targets:', this.zoneTargets.length)\n    console.log('Checkbox targets:', this.checkboxTargets.length)\n  }\n\n  /**\n   * Toggle zone selection\n   * @param {Event} event - The click event\n   * @returns {void}\n   */\n  toggleZone(event) {\n    const zoneElement = event.currentTarget\n    const zoneName = zoneElement.dataset.zone\n\n    console.log('Zone clicked:', zoneName)\n\n    // Find the corresponding hidden checkbox\n    const checkbox = this.checkboxTargets.find(cb => cb.dataset.zone === zoneName)\n\n    if (checkbox) {\n      // Toggle checkbox state\n      checkbox.checked = !checkbox.checked\n\n      console.log('Checkbox toggled to:', checkbox.checked)\n\n      // Update zone visual state\n      this.updateZoneStyle(zoneElement, checkbox.checked, zoneName)\n\n      // Trigger form submission through the checkbox change event\n      checkbox.dispatchEvent(new Event('change', { bubbles: true }))\n    } else {\n      console.error('No matching checkbox found for zone:', zoneName)\n    }\n  }\n\n  /**\n   * Update zone visual styling based on selection state\n   * @param {SVGElement} zoneElement - The SVG zone element\n   * @param {boolean} isSelected - Whether the zone is selected\n   * @param {string} zoneName - Name of the zone\n   * @returns {void}\n   */\n  updateZoneStyle(zoneElement, isSelected, zoneName) {\n    // All zones use the same brand color\n    const colors = {\n      selected: 'fill-brand-500/60 stroke-brand-700',\n      unselected: 'fill-transparent stroke-brand-400 hover:fill-brand-400/40'\n    }\n\n    if (isSelected) {\n      zoneElement.classList.remove(...colors.unselected.split(' '))\n      zoneElement.classList.add(...colors.selected.split(' '))\n    } else {\n      zoneElement.classList.remove(...colors.selected.split(' '))\n      zoneElement.classList.add(...colors.unselected.split(' '))\n    }\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for auto-submitting clip filters\n */\nexport default class extends Controller {\n  static targets = [\"status\"]\n\n  connect() {\n    // Listen for turbo frame load to hide loading indicator\n    this.boundHideLoading = this.hideLoading.bind(this)\n    document.addEventListener('turbo:frame-load', this.boundHideLoading)\n  }\n\n  /**\n   * Auto-submit the form when any input changes\n   * @returns {void}\n   */\n  submit() {\n    // Clear any existing timeout to debounce rapid changes\n    clearTimeout(this.timeout)\n\n    // Submit after a short delay to allow for multiple rapid changes\n    this.timeout = setTimeout(() => {\n      this.showLoading()\n      this.element.requestSubmit()\n    }, 300)\n  }\n\n  /**\n   * Show loading indicator\n   * @returns {void}\n   */\n  showLoading() {\n    if (this.hasStatusTarget) {\n      this.statusTarget.classList.remove(\"hidden\")\n    }\n  }\n\n  /**\n   * Hide loading indicator\n   * @returns {void}\n   */\n  hideLoading() {\n    if (this.hasStatusTarget) {\n      this.statusTarget.classList.add(\"hidden\")\n    }\n  }\n\n  /**\n   * Clean up timeout and event listeners on disconnect\n   * @returns {void}\n   */\n  disconnect() {\n    clearTimeout(this.timeout)\n    document.removeEventListener('turbo:frame-load', this.boundHideLoading)\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Manages clip selection state and bulk actions\n */\nexport default class extends Controller {\n  static targets = [\"selectAllCheckbox\", \"selectedCount\", \"addButton\", \"selectAllLink\", \"totalCount\"]\n  static values = {\n    selectedIds: { type: Array, default: [] },\n    selectingAllFiltered: { type: Boolean, default: false },\n    filterParams: { type: Object, default: {} }\n  }\n\n  connect() {\n    console.log('ClipsSelection controller connected')\n    this.updateUI()\n\n    // Listen for successful compilation addition\n    this.boundHandleSuccess = this.handleCompilationSuccess.bind(this)\n    document.addEventListener('turbo:submit-end', this.boundHandleSuccess)\n  }\n\n  disconnect() {\n    document.removeEventListener('turbo:submit-end', this.boundHandleSuccess)\n  }\n\n  /**\n   * Toggle selection of a clip\n   * @param {Event} event - The change event from the checkbox\n   */\n  toggleSelection(event) {\n    const clipId = event.target.dataset.clipId\n    const isChecked = event.target.checked\n\n    // Reset \"select all filtered\" mode when manually toggling\n    this.selectingAllFilteredValue = false\n\n    if (isChecked) {\n      // Add to selection\n      if (!this.selectedIdsValue.includes(clipId)) {\n        this.selectedIdsValue = [...this.selectedIdsValue, clipId]\n      }\n    } else {\n      // Remove from selection\n      this.selectedIdsValue = this.selectedIdsValue.filter(id => id !== clipId)\n    }\n\n    this.updateUI()\n  }\n\n  /**\n   * Toggle all clips\n   */\n  toggleAll(event) {\n    const isChecked = event.target.checked\n    const checkboxes = this.element.querySelectorAll('[data-clip-checkbox]')\n\n    if (!isChecked) {\n      // Unchecking - clear everything including \"select all filtered\" mode\n      this.selectingAllFilteredValue = false\n      this.selectedIdsValue = []\n      checkboxes.forEach(checkbox => {\n        checkbox.checked = false\n      })\n    } else {\n      // Checking - select all on current page\n      this.selectingAllFilteredValue = false\n      checkboxes.forEach(checkbox => {\n        checkbox.checked = true\n        const clipId = checkbox.dataset.clipId\n        if (!this.selectedIdsValue.includes(clipId)) {\n          this.selectedIdsValue = [...this.selectedIdsValue, clipId]\n        }\n      })\n    }\n\n    this.updateUI()\n  }\n\n  /**\n   * Clear all selections\n   */\n  clearSelection() {\n    this.selectedIdsValue = []\n    this.selectingAllFilteredValue = false\n    const checkboxes = this.element.querySelectorAll('[data-clip-checkbox]')\n    checkboxes.forEach(checkbox => {\n      checkbox.checked = false\n    })\n    this.updateUI()\n  }\n\n  /**\n   * Select all clips matching current filters\n   */\n  selectAllFiltered(event) {\n    event.preventDefault()\n    this.selectingAllFilteredValue = true\n\n    // Check all boxes on current page for visual feedback\n    const checkboxes = this.element.querySelectorAll('[data-clip-checkbox]')\n    checkboxes.forEach(checkbox => {\n      checkbox.checked = true\n    })\n\n    this.updateUI()\n  }\n\n  /**\n   * Update UI based on selection state\n   */\n  updateUI() {\n    const count = this.selectedIdsValue.length\n    const checkboxes = this.element.querySelectorAll('[data-clip-checkbox]')\n    const allPageItemsSelected = checkboxes.length > 0 && count === checkboxes.length\n\n    // Update selected count display\n    if (this.hasSelectedCountTarget) {\n      if (this.selectingAllFilteredValue && this.hasTotalCountTarget) {\n        const totalCount = this.totalCountTarget.textContent\n        this.selectedCountTarget.textContent = `All ${totalCount} clips selected`\n      } else {\n        this.selectedCountTarget.textContent = `${count} selected`\n      }\n    }\n\n    // Show/hide \"select all filtered\" link\n    if (this.hasSelectAllLinkTarget) {\n      const totalCount = this.hasTotalCountTarget ? parseInt(this.totalCountTarget.textContent) : 0\n      // Show the link if all items on current page are selected but not all filtered items\n      if (allPageItemsSelected && !this.selectingAllFilteredValue && totalCount > count) {\n        this.selectAllLinkTarget.classList.remove('hidden')\n      } else {\n        this.selectAllLinkTarget.classList.add('hidden')\n      }\n    }\n\n    // Enable/disable bulk action buttons\n    if (this.hasAddButtonTarget) {\n      const hasSelection = count > 0 || this.selectingAllFilteredValue\n      if (hasSelection) {\n        this.addButtonTarget.removeAttribute('disabled')\n        this.addButtonTarget.classList.remove('opacity-50', 'cursor-not-allowed')\n        this.addButtonTarget.classList.add('cursor-pointer')\n      } else {\n        this.addButtonTarget.setAttribute('disabled', 'disabled')\n        this.addButtonTarget.classList.add('opacity-50', 'cursor-not-allowed')\n        this.addButtonTarget.classList.remove('cursor-pointer')\n      }\n    }\n\n    // Update select all checkbox state\n    if (this.hasSelectAllCheckboxTarget) {\n      this.selectAllCheckboxTarget.checked = allPageItemsSelected || this.selectingAllFilteredValue\n      this.selectAllCheckboxTarget.indeterminate = count > 0 && count < checkboxes.length && !this.selectingAllFilteredValue\n    }\n  }\n\n  /**\n   * Open modal to add selected clips to a compilation\n   */\n  async openCompilationModal(event) {\n    event.preventDefault()\n\n    // Don't open if button is disabled\n    if (event.currentTarget.hasAttribute('disabled')) {\n      return\n    }\n\n    let clipIds\n\n    if (this.selectingAllFilteredValue) {\n      // Fetch all clip IDs matching current filters via JSON API\n      const filterParams = this.filterParamsValue\n      const searchParams = new URLSearchParams()\n\n      if (filterParams && Object.keys(filterParams).length > 0) {\n        Object.keys(filterParams).forEach(key => {\n          const value = filterParams[key]\n          if (value !== null && value !== undefined && value !== '') {\n            // Handle array values (e.g., shot_origin_in with multiple values)\n            if (Array.isArray(value)) {\n              value.forEach(v => {\n                if (v !== null && v !== undefined && v !== '') {\n                  searchParams.append(`q[${key}][]`, v)\n                }\n              })\n            } else {\n              searchParams.append(`q[${key}]`, value)\n            }\n          }\n        })\n      }\n\n      const response = await fetch(`/video/clips.json?${searchParams.toString()}`)\n      const data = await response.json()\n      clipIds = data.clip_ids\n    } else {\n      // Use specific selected clip IDs\n      clipIds = this.selectedIdsValue\n      if (clipIds.length === 0) {\n        return\n      }\n    }\n\n    // Navigate to modal with clip IDs as query param\n    const url = `/video/compilations/bulk_membership/new?clip_ids=${clipIds.join(',')}`\n    Turbo.visit(url, { frame: 'modal' })\n  }\n\n  /**\n   * Handle successful compilation addition\n   */\n  handleCompilationSuccess(event) {\n    // Check if this was the bulk membership form\n    if (event.detail.success && event.detail.formSubmission) {\n      const formAction = event.detail.formSubmission.action\n      if (formAction.includes('bulk_membership')) {\n        console.log('Compilation added successfully, clearing selections')\n        this.clearSelection()\n      }\n    }\n  }\n\n  /**\n   * Get array of selected clip IDs\n   * @returns {Array<string>}\n   */\n  getSelectedIds() {\n    return this.selectedIdsValue\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Video::CompilationClipItem\n */\nexport default class extends Controller {\n  static targets = []\n  static values = {}\n  static classes = []\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Video::CompilationClipItem controller connected\")\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Video::CompilationClipItem controller disconnected\")\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Video::Compilation\n */\nexport default class extends Controller {\n  static targets = ['clipOverview']\n  static values = {\n    allowReordering: Boolean\n  }\n  static classes = []\n  static outlets = [\"video--player-component\"]\n\n  /**\n   * Initialize the controller when the element is connected to the DOM\n   * @returns {void}\n   */\n  connect() {\n    console.log(\"Video::Compilation controller connected\")\n    this.setupEventListeners()\n    this.setupDragAndDrop()\n    this.setActiveClipFromTimestamp(0)\n  }\n\n  /**\n   * Clean up when the element is disconnected from the DOM\n   * @returns {void}\n   */\n  disconnect() {\n    console.log(\"Video::Compilation controller disconnected\")\n  }\n\n  seekToClip(event) {\n    console.log(\"Video::Compilation controller seek to clip\", event)\n\n    // Don't seek if the click was on the dropdown actions\n    if (event.target.closest('.clip-actions')) {\n      return\n    }\n\n    const clipOverview = event.currentTarget\n    const startTimestamp = clipOverview.dataset.clipStartTimestamp\n    this.setActiveClip(clipOverview)\n\n    if (this.hasVideoPlayerComponentOutlet) {\n      this.videoPlayerComponentOutlet.seekToLocalTime(startTimestamp)\n      this.videoPlayerComponentOutlet.play()\n    } else {\n      console.error(\"Video player component outlet not found\")\n    }\n  }\n\n  stopPropagation(event) {\n    event.stopPropagation()\n  }\n\n  setupEventListeners() {\n    // listen for the player timestamp updates\n    this.element.addEventListener('video-player:timeupdate', this.handleTimeUpdate.bind(this))\n  }\n\n  clipOverviewTargetConnected(element) {\n    // Re-setup drag and drop for new targets added via Turbo Stream\n    if (this.allowReorderingValue) {\n      this.setupDragAndDropForElement(element)\n    }\n  }\n\n  setupDragAndDrop() {\n    if (!this.allowReorderingValue) {\n      console.log(\"Reordering not allowed for this compilation\")\n      return\n    }\n\n    console.log(\"Setting up drag and drop for compilation clips\")\n\n    // Set up drag handlers for each clip\n    this.clipOverviewTargets.forEach((clipElement) => {\n      this.setupDragAndDropForElement(clipElement)\n    })\n\n    // Also add dragover and drop to the container for better drop zone coverage\n    const container = this.clipOverviewTargets[0]?.parentElement\n    if (container) {\n      container.addEventListener('dragover', this.handleDragOver.bind(this))\n      container.addEventListener('drop', this.handleDrop.bind(this))\n    }\n  }\n\n  setupDragAndDropForElement(clipElement) {\n    if (clipElement.dataset.dragSetup === 'true') {\n      return // Already set up\n    }\n\n    clipElement.draggable = true\n    clipElement.dataset.dragSetup = 'true'\n\n    clipElement.addEventListener('dragstart', (e) => {\n      const currentIndex = this.clipOverviewTargets.indexOf(clipElement)\n      this.handleDragStart(e, currentIndex)\n    })\n    clipElement.addEventListener('dragover', this.handleDragOver.bind(this))\n    clipElement.addEventListener('dragenter', this.handleDragEnter.bind(this))\n    clipElement.addEventListener('dragleave', this.handleDragLeave.bind(this))\n    clipElement.addEventListener('dragend', this.handleDragEnd.bind(this))\n  }\n\n  handleDragEnd() {\n    // Clean up placeholder if drag was cancelled\n    if (this.placeholder && this.placeholder.parentElement) {\n      this.placeholder.remove()\n    }\n    // Remove opacity styling\n    if (this.draggedElement) {\n      this.draggedElement.classList.remove('opacity-50')\n    }\n  }\n\n  handleTimeUpdate(event) {\n    this.setActiveClipFromTimestamp(event.detail.localTime)\n  }\n\n  setActiveClipFromTimestamp(timestamp) {\n    const clipOverview = this.clipOverviewTargets.find(target => {\n      const startTimestamp = target.dataset.clipStartTimestamp\n      const endTimestamp = target.dataset.clipEndTimestamp\n      return timestamp >= startTimestamp && timestamp < endTimestamp\n    })\n\n    this.setActiveClip(clipOverview)\n  }\n\n  setActiveClip(clipOverview) {\n    // Don't do anything if this clip is already active\n    if (this.currentActiveClip === clipOverview) {\n      return\n    }\n\n    this.clipOverviewTargets.forEach(target => {\n      target.classList.remove('bg-gray-500')\n    })\n\n    if (clipOverview) {\n      clipOverview.classList.add('bg-gray-500')\n\n      // Scroll the active clip into view\n      clipOverview.scrollIntoView({\n        behavior: 'smooth',\n        block: 'nearest',\n        inline: 'nearest'\n      })\n    }\n\n    this.currentActiveClip = clipOverview\n  }\n\n  handleDragStart(e, index) {\n    e.dataTransfer.setData('text/plain', index)\n    e.target.classList.add('opacity-50')\n    this.draggedElement = e.target\n    this.draggedIndex = index\n\n    // Create placeholder\n    this.placeholder = document.createElement('li')\n    this.placeholder.className = 'h-12 bg-brand-500/20 border-2 border-dashed border-brand-500 rounded'\n  }\n\n  handleDragOver(e) {\n    e.preventDefault()\n\n    // Determine the container - either the event target itself (if it's the ul) or its parent\n    const container = e.currentTarget.tagName === 'UL' ? e.currentTarget : e.currentTarget.parentElement\n    const afterElement = this.getDragAfterElement(container, e.clientY)\n\n    // Calculate where the placeholder would be inserted\n    let targetIndex\n    if (afterElement == null) {\n      // Would be appended at the end\n      targetIndex = container.children.length - 1 // -1 because dragged element is still in DOM\n    } else {\n      // Would be inserted before afterElement\n      targetIndex = [...container.children].indexOf(afterElement)\n    }\n\n    // Adjust target index if placeholder is already in the DOM\n    const placeholderCurrentIndex = [...container.children].indexOf(this.placeholder)\n    if (placeholderCurrentIndex !== -1 && placeholderCurrentIndex < targetIndex) {\n      targetIndex--\n    }\n\n    // Calculate the actual drop index (accounting for the dragged element)\n    const actualDropIndex = targetIndex > this.draggedIndex ? targetIndex - 1 : targetIndex\n\n    // Don't show placeholder if dropping at the same position\n    if (actualDropIndex === this.draggedIndex) {\n      if (this.placeholder.parentElement) {\n        this.placeholder.remove()\n      }\n      return\n    }\n\n    // Insert the placeholder\n    if (afterElement == null) {\n      container.appendChild(this.placeholder)\n    } else {\n      container.insertBefore(this.placeholder, afterElement)\n    }\n  }\n\n  handleDragEnter(e) {\n    e.preventDefault()\n  }\n\n  handleDragLeave() {\n    // Placeholder handles the visual feedback now\n  }\n\n  getDragAfterElement(container, y) {\n    const draggableElements = [...container.querySelectorAll('li:not(.opacity-50)')]\n      .filter(el => el !== this.placeholder)\n\n    return draggableElements.reduce((closest, child) => {\n      const box = child.getBoundingClientRect()\n      const offset = y - box.top - box.height / 2\n\n      if (offset < 0 && offset > closest.offset) {\n        return { offset: offset, element: child }\n      } else {\n        return closest\n      }\n    }, { offset: Number.NEGATIVE_INFINITY }).element\n  }\n\n  handleDrop(e) {\n    e.preventDefault()\n    const dragIndex = parseInt(e.dataTransfer.getData('text/plain'))\n\n    // Remove drag styling\n    this.draggedElement.classList.remove('opacity-50')\n\n    // Calculate the actual drop index based on placeholder position\n    if (!this.placeholder || !this.placeholder.parentElement) {\n      console.log('No placeholder found - cancelling drop')\n      return\n    }\n\n    const container = this.placeholder.parentElement\n    const placeholderIndex = [...container.children].indexOf(this.placeholder)\n    const actualDropIndex = placeholderIndex > dragIndex ? placeholderIndex - 1 : placeholderIndex\n\n    console.log(`Placeholder index: ${placeholderIndex}, Drag index: ${dragIndex}, Actual drop index: ${actualDropIndex}`)\n\n    if (dragIndex === actualDropIndex) {\n      console.log('Same position - no move needed')\n      this.placeholder.remove()\n      return\n    }\n\n    const movedElement = this.draggedElement\n\n    // Optimistically move the DOM element immediately (before server response)\n    // Insert the dragged element where the placeholder is\n    container.insertBefore(movedElement, this.placeholder)\n\n    // Remove placeholder\n    this.placeholder.remove()\n\n    // Send update to backend using Turbo\n    const formData = new FormData()\n    formData.append('video_compilation_clip[order]', actualDropIndex)\n\n    console.log('Sending reorder request:', movedElement.dataset.updateUrl)\n\n    fetch(movedElement.dataset.updateUrl, {\n      method: 'PATCH',\n      headers: {\n        \"Accept\": \"text/vnd.turbo-stream.html\",\n        \"X-CSRF-Token\": document.querySelector(\"[name='csrf-token']\").content\n      },\n      body: formData,\n      credentials: 'same-origin'\n    })\n    .then(response => {\n      console.log('Reorder response:', response.status)\n      if (!response.ok) {\n        throw new Error('Network response was not ok')\n      }\n      return response.text()\n    })\n    .then(html => {\n      console.log('Rendering turbo stream')\n      Turbo.renderStreamMessage(html)\n    })\n    .catch(error => {\n      console.error('Error reordering clip:', error)\n      // On error, could optionally revert the DOM change here\n      // But for now, we'll let the user know something went wrong\n      alert('Failed to reorder clip. Please refresh the page.')\n    })\n  }\n}\n", "import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n  static targets = [\"clipContainer\", \"videoPlayer\"]\n  static values = {\n    clips: Array,\n    allowReordering: Boolean\n  }\n\n  setupVideoWithTrimTimes(videoElement, index, onReady = null) {\n    return new Promise((resolve) => {\n      videoElement.addEventListener('loadedmetadata', () => {\n        // Get trim times from the feed_clip_component which gets updated via turbo stream\n        const clipContainer = this.clipContainerTargets[index]\n        // The turbo-frame is the direct child of clipContainer\n        const feedClipFrame = clipContainer.querySelector('turbo-frame[data-controller*=\"video--feed-clip-component\"]')\n\n        let startTrim = 0\n        let endTrim = videoElement.duration\n\n        if (feedClipFrame) {\n          // Stimulus uses a special format: data-video--feed-clip-component-start-trim-value\n          // becomes dataset['video-FeedClipComponentStartTrimValue'] (note the dash after 'video')\n          startTrim = parseFloat(feedClipFrame.dataset['video-FeedClipComponentStartTrimValue'])\n          endTrim = parseFloat(feedClipFrame.dataset['video-FeedClipComponentEndTrimValue'])\n\n          // If values are NaN (not set), use defaults\n          if (isNaN(startTrim)) startTrim = 0\n          if (isNaN(endTrim)) endTrim = videoElement.duration\n        } else {\n          // Fallback to reading from the container (for initial load)\n          startTrim = parseFloat(clipContainer.dataset.startTrim) || 0\n          endTrim = parseFloat(clipContainer.dataset.endTrim) || videoElement.duration\n        }\n\n        this.actualTrimTimes[index] = {\n          start: startTrim,\n          end: endTrim\n        }\n\n        // Set the start time\n        videoElement.currentTime = this.actualTrimTimes[index].start\n\n        // Call optional callback\n        if (onReady) onReady(videoElement)\n        resolve()\n      }, { once: true })\n    })\n  }\n\n  connect() {\n    if (this.clipsValue.length === 0) return\n\n    this.currentIndex = 0\n    this.actualTrimTimes = []\n    this.refreshTimeout = null\n\n    // Create a hidden video element for preloading\n    this.preloadVideo = document.createElement('video')\n    this.preloadVideo.style.display = 'none'\n    this.preloadVideo.preload = 'auto'\n    this.element.parentNode.appendChild(this.preloadVideo)\n\n    // Set initial source and preload next\n    this.videoPlayerTarget.src = this.clipsValue[0]\n    this.setupVideoWithTrimTimes(this.videoPlayerTarget, 0)\n    this.preloadNextClip()\n\n    // Handle video timeupdate to check for trim end\n    this.videoPlayerTarget.addEventListener('timeupdate', () => {\n      const currentTrim = this.actualTrimTimes[this.currentIndex]\n      if (currentTrim && this.videoPlayerTarget.currentTime >= currentTrim.end) {\n        this.playNext()\n      }\n    })\n\n    // Handle video end\n    this.videoPlayerTarget.addEventListener('ended', () => {\n      this.playNext()\n    })\n\n    // Handle timeupdate to highlight current clip\n    this.videoPlayerTarget.addEventListener('playing', () => {\n      this.highlightCurrentClip()\n      this.preloadNextClip()\n    })\n\n    // pause the player on a turbo frame response (specifically for modal)\n    document.addEventListener('turbo:frame-load', (e) => {\n      if (e.target.id === 'modal') {\n        this.videoPlayerTarget.pause()\n      }\n    })\n\n    // Refresh trim times when clips are updated via turbo stream\n    // Debounce to avoid multiple rapid calls\n    this.boundStreamRender = () => {\n      if (this.refreshTimeout) {\n        clearTimeout(this.refreshTimeout)\n      }\n      this.refreshTimeout = setTimeout(() => {\n        this.refreshAllTrimTimes()\n      }, 100)\n    }\n    document.addEventListener('turbo:before-stream-render', this.boundStreamRender)\n\n    // Also pause when any edit link is clicked in a clip\n    this.clipContainerTargets.forEach((container) => {\n      const editLink = container.querySelector('a[href*=\"edit\"]')\n      if (editLink) {\n        editLink.addEventListener('click', () => {\n          this.videoPlayerTarget.pause()\n        })\n      }\n    })\n\n    // Add drag handlers to clips (only if reordering is allowed)\n    this.clipContainerTargets.forEach((container) => {\n      if (this.allowReorderingValue) {\n        container.draggable = true\n        container.addEventListener('dragstart', (e) => {\n          // Get current index by finding position in clipContainerTargets\n          const currentIndex = this.clipContainerTargets.indexOf(container)\n          this.handleDragStart(e, currentIndex)\n        })\n        container.addEventListener('dragover', this.handleDragOver)\n        container.addEventListener('drop', (e) => {\n          const dropIndex = this.clipContainerTargets.indexOf(container)\n          this.handleDrop(e, dropIndex)\n        })\n      }\n\n      // Click handler (always enabled)\n      container.addEventListener('click', () => {\n        const currentIndex = this.clipContainerTargets.indexOf(container)\n        this.jumpToClip(currentIndex)\n        this.videoPlayerTarget.play()\n      })\n    })\n\n    // Store bound function reference for proper cleanup\n    this.boundHandleKeyPress = this.handleKeyPress.bind(this)\n    document.addEventListener('keydown', this.boundHandleKeyPress)\n\n    // Prevent native video controls from handling keyboard events\n    // This stops the browser from toggling play/pause when we do\n    this.boundVideoKeyDown = (e) => {\n      if (e.key === ' ' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n        e.preventDefault()\n        e.stopPropagation()\n      }\n    }\n    this.videoPlayerTarget.addEventListener('keydown', this.boundVideoKeyDown)\n  }\n\n  disconnect() {\n    // Clean up the preload video element when the controller disconnects\n    if (this.preloadVideo) {\n      this.preloadVideo.remove()\n    }\n\n    // Clean up timeout\n    if (this.refreshTimeout) {\n      clearTimeout(this.refreshTimeout)\n    }\n\n    // Clean up event listeners\n    if (this.boundHandleKeyPress) {\n      document.removeEventListener('keydown', this.boundHandleKeyPress)\n    }\n    if (this.boundVideoKeyDown) {\n      this.videoPlayerTarget.removeEventListener('keydown', this.boundVideoKeyDown)\n    }\n    if (this.boundStreamRender) {\n      document.removeEventListener('turbo:before-stream-render', this.boundStreamRender)\n    }\n  }\n\n  handleKeyPress(e) {\n    // Ignore keyboard shortcuts when user is typing in input fields\n    const activeElement = document.activeElement\n    const isTyping = activeElement && (\n      activeElement.tagName === 'INPUT' ||\n      activeElement.tagName === 'TEXTAREA' ||\n      activeElement.tagName === 'SELECT' ||\n      activeElement.isContentEditable\n    )\n\n    if (isTyping) {\n      return\n    }\n\n    if (e.key === 'ArrowRight') {\n      e.preventDefault()\n      e.stopPropagation()\n      this.playNext()\n    } else if (e.key === 'ArrowLeft') {\n      e.preventDefault()\n      e.stopPropagation()\n      this.playPrevious()\n    } else if (e.key === 'e') {\n      e.preventDefault()\n      e.stopPropagation()\n      this.editActiveClip()\n    } else if (e.key === ' ') {\n      e.preventDefault()\n      e.stopPropagation() // Prevent event from bubbling up and scrolling\n      this.togglePlay()\n    }\n  }\n\n  editActiveClip() {\n    this.videoPlayerTarget.pause()\n    const currentClip = this.clipContainerTargets[this.currentIndex]\n    const editLink = currentClip.querySelector('a[href*=\"edit\"]')\n    if (editLink) {\n      // prefent the edit link click from bubbling\n      editLink.click()\n    }\n  }\n\n  togglePlay() {\n    if (this.videoPlayerTarget.paused) {\n      this.videoPlayerTarget.play()\n    } else {\n      this.videoPlayerTarget.pause()\n    }\n  }\n  preloadNextClip() {\n    const nextIndex = this.currentIndex + 1\n    if (nextIndex < this.clipsValue.length) {\n      this.preloadVideo.src = this.clipsValue[nextIndex]\n      this.preloadVideo.load()\n    }\n  }\n\n  refreshAllTrimTimes() {\n    // Update trim times from the current DOM state\n    // Read from the feed_clip_component which gets updated via turbo stream\n    this.clipContainerTargets.forEach((container, index) => {\n      // The turbo-frame is the direct child of clipContainer\n      const feedClipFrame = container.querySelector('turbo-frame[data-controller*=\"video--feed-clip-component\"]')\n\n      let startTrim = 0\n      let endTrim = 9999 // Large default, will be overridden by actual values\n\n      if (feedClipFrame) {\n        // Stimulus uses a special format: data-video--feed-clip-component-start-trim-value\n        // becomes dataset['video-FeedClipComponentStartTrimValue'] (note the dash after 'video')\n        startTrim = parseFloat(feedClipFrame.dataset['video-FeedClipComponentStartTrimValue'])\n        endTrim = parseFloat(feedClipFrame.dataset['video-FeedClipComponentEndTrimValue'])\n      } else {\n        // Fallback to reading from the container (for initial load)\n        startTrim = parseFloat(container.dataset.startTrim) || 0\n        endTrim = parseFloat(container.dataset.endTrim) || 9999\n      }\n\n      this.actualTrimTimes[index] = {\n        start: startTrim,\n        end: endTrim\n      }\n    })\n  }\n\n  highlightCurrentClip() {\n    // Remove highlight from all clips\n    this.clipContainerTargets.forEach(container => {\n      container.classList.remove('ring-4', 'ring-pink-500')\n    })\n\n    // Add highlight to current clip\n    const currentContainer = this.clipContainerTargets[this.currentIndex]\n    currentContainer.classList.add('ring-4', 'ring-pink-500')\n  }\n\n  playNext() {\n    this.currentIndex++\n    if (this.currentIndex < this.clipsValue.length) {\n      const currentSrc = this.preloadVideo.src\n      this.videoPlayerTarget.src = currentSrc\n      this.videoPlayerTarget.pause()\n      this.setupVideoWithTrimTimes(this.videoPlayerTarget, this.currentIndex, (video) => {\n        video.play().catch(e => console.log(\"Playback failed:\", e))\n      })\n\n      this.highlightCurrentClip()\n      this.preloadNextClip()\n    }\n  }\n\n  playPrevious() {\n    if (this.videoPlayerTarget.currentTime > 1) {\n      // If more than 1 second in, restart current clip at its trim start\n      const currentTrim = this.actualTrimTimes[this.currentIndex]\n      if (currentTrim) {\n        this.videoPlayerTarget.currentTime = currentTrim.start\n      } else {\n        this.setupVideoWithTrimTimes(this.videoPlayerTarget, this.currentIndex)\n      }\n    } else if (this.currentIndex >= 1) {\n      this.currentIndex--\n      this.videoPlayerTarget.src = this.clipsValue[this.currentIndex]\n\n      this.setupVideoWithTrimTimes(this.videoPlayerTarget, this.currentIndex, (video) => {\n        video.play().catch(e => console.log(\"Playback failed:\", e))\n      })\n    }\n  }\n\n  jumpToClip(index) {\n    if (index >= 0 && index < this.clipsValue.length) {\n      this.currentIndex = index\n      this.videoPlayerTarget.src = this.clipsValue[this.currentIndex]\n\n      this.setupVideoWithTrimTimes(this.videoPlayerTarget, this.currentIndex, (video) => {\n        video.play().catch(e => console.log(\"Playback failed:\", e))\n      })\n\n      this.highlightCurrentClip()\n      this.preloadNextClip()\n    }\n  }\n\n  handleDragStart(e, index) {\n    e.dataTransfer.setData('text/plain', index)\n    e.target.classList.add('opacity-50')\n  }\n\n  handleDragOver(e) {\n    e.preventDefault()\n  }\n\n  handleDrop(e, dropIndex) {\n    e.preventDefault()\n    const dragIndex = parseInt(e.dataTransfer.getData('text/plain'))\n\n    console.log(`Moving clip from index ${dragIndex} to index ${dropIndex}`)\n\n    // Remove drag styling\n    this.clipContainerTargets[dragIndex].classList.remove('opacity-50')\n\n    if (dragIndex === dropIndex) {\n      console.log('Same position - no move needed')\n      return\n    }\n\n    const movedContainer = this.clipContainerTargets[dragIndex]\n\n    // Send update to backend using Turbo\n    const formData = new FormData()\n    formData.append('video_compilation_clip[order]', dropIndex)\n\n    fetch(movedContainer.dataset.updateUrl, {\n      method: 'PATCH',\n      headers: {\n        \"Accept\": \"text/vnd.turbo-stream.html\",\n        \"X-CSRF-Token\": document.querySelector(\"[name='csrf-token']\").content\n      },\n      body: formData,\n      credentials: 'same-origin'\n    })\n    .then(response => {\n      if (!response.ok) {\n        throw new Error('Network response was not ok')\n      }\n\n      // Update the clips array\n      const newClips = [...this.clipsValue]\n      const [movedClip] = newClips.splice(dragIndex, 1)\n      newClips.splice(dropIndex, 0, movedClip)\n      this.clipsValue = newClips\n\n      // Physically move the DOM element\n      const clipReel = movedContainer.parentElement\n      // Adjust the insertion point if moving forward\n      const adjustedDropIndex = dragIndex < dropIndex ? dropIndex + 1 : dropIndex\n      if (adjustedDropIndex >= clipReel.children.length) {\n        clipReel.appendChild(movedContainer)\n      } else {\n        clipReel.insertBefore(movedContainer, clipReel.children[adjustedDropIndex])\n      }\n\n      // Update indices\n      this.clipContainerTargets.forEach((container, index) => {\n        container.dataset.index = index\n        container.dataset.position = index\n      })\n\n      this.highlightCurrentClip()\n\n      return response.text()\n    })\n    .then(html => {\n      Turbo.renderStreamMessage(html)\n    })\n    .catch(error => {\n      console.error('Error:', error)\n    })\n  }\n}", "export class FetchResponse {\n  constructor (response) {\n    this.response = response\n  }\n\n  get statusCode () {\n    return this.response.status\n  }\n\n  get redirected () {\n    return this.response.redirected\n  }\n\n  get ok () {\n    return this.response.ok\n  }\n\n  get unauthenticated () {\n    return this.statusCode === 401\n  }\n\n  get unprocessableEntity () {\n    return this.statusCode === 422\n  }\n\n  get authenticationURL () {\n    return this.response.headers.get('WWW-Authenticate')\n  }\n\n  get contentType () {\n    const contentType = this.response.headers.get('Content-Type') || ''\n\n    return contentType.replace(/;.*$/, '')\n  }\n\n  get headers () {\n    return this.response.headers\n  }\n\n  get html () {\n    if (this.contentType.match(/^(application|text)\\/(html|xhtml\\+xml)$/)) {\n      return this.text\n    }\n\n    return Promise.reject(new Error(`Expected an HTML response but got \"${this.contentType}\" instead`))\n  }\n\n  get json () {\n    if (this.contentType.match(/^application\\/.*json$/)) {\n      return this.responseJson || (this.responseJson = this.response.json())\n    }\n\n    return Promise.reject(new Error(`Expected a JSON response but got \"${this.contentType}\" instead`))\n  }\n\n  get text () {\n    return this.responseText || (this.responseText = this.response.text())\n  }\n\n  get isTurboStream () {\n    return this.contentType.match(/^text\\/vnd\\.turbo-stream\\.html/)\n  }\n\n  async renderTurboStream () {\n    if (this.isTurboStream) {\n      if (window.Turbo) {\n        await window.Turbo.renderStreamMessage(await this.text)\n      } else {\n        console.warn('You must set `window.Turbo = Turbo` to automatically process Turbo Stream events with request.js')\n      }\n    } else {\n      return Promise.reject(new Error(`Expected a Turbo Stream response but got \"${this.contentType}\" instead`))\n    }\n  }\n}\n", "export class RequestInterceptor {\n  static register (interceptor) {\n    this.interceptor = interceptor\n  }\n\n  static get () {\n    return this.interceptor\n  }\n\n  static reset () {\n    this.interceptor = undefined\n  }\n}\n", "export function getCookie (name) {\n  const cookies = document.cookie ? document.cookie.split('; ') : []\n  const prefix = `${encodeURIComponent(name)}=`\n  const cookie = cookies.find(cookie => cookie.startsWith(prefix))\n\n  if (cookie) {\n    const value = cookie.split('=').slice(1).join('=')\n\n    if (value) {\n      return decodeURIComponent(value)\n    }\n  }\n}\n\nexport function compact (object) {\n  const result = {}\n\n  for (const key in object) {\n    const value = object[key]\n    if (value !== undefined) {\n      result[key] = value\n    }\n  }\n\n  return result\n}\n\nexport function metaContent (name) {\n  const element = document.head.querySelector(`meta[name=\"${name}\"]`)\n  return element && element.content\n}\n\nexport function stringEntriesFromFormData (formData) {\n  return [...formData].reduce((entries, [name, value]) => {\n    return entries.concat(typeof value === 'string' ? [[name, value]] : [])\n  }, [])\n}\n\nexport function mergeEntries (searchParams, entries) {\n  for (const [name, value] of entries) {\n    if (value instanceof window.File) continue\n\n    if (searchParams.has(name) && !name.includes('[]')) {\n      searchParams.delete(name)\n      searchParams.set(name, value)\n    } else {\n      searchParams.append(name, value)\n    }\n  }\n}\n", "import { FetchResponse } from './fetch_response'\nimport { RequestInterceptor } from './request_interceptor'\nimport { getCookie, compact, metaContent, stringEntriesFromFormData, mergeEntries } from './lib/utils'\n\nexport class FetchRequest {\n  constructor (method, url, options = {}) {\n    this.method = method\n    this.options = options\n    this.originalUrl = url.toString()\n  }\n\n  async perform () {\n    try {\n      const requestInterceptor = RequestInterceptor.get()\n      if (requestInterceptor) {\n        await requestInterceptor(this)\n      }\n    } catch (error) {\n      console.error(error)\n    }\n\n    const response = new FetchResponse(await window.fetch(this.url, this.fetchOptions))\n\n    if (response.unauthenticated && response.authenticationURL) {\n      return Promise.reject(window.location.href = response.authenticationURL)\n    }\n\n    const responseStatusIsTurboStreamable = response.ok || response.unprocessableEntity\n\n    if (responseStatusIsTurboStreamable && response.isTurboStream) {\n      await response.renderTurboStream()\n    }\n\n    return response\n  }\n\n  addHeader (key, value) {\n    const headers = this.additionalHeaders\n    headers[key] = value\n    this.options.headers = headers\n  }\n\n  sameHostname () {\n    if (!this.originalUrl.startsWith('http:')) {\n      return true\n    }\n\n    try {\n      return new URL(this.originalUrl).hostname === window.location.hostname\n    } catch (_) {\n      return true\n    }\n  }\n\n  get fetchOptions () {\n    return {\n      method: this.method.toUpperCase(),\n      headers: this.headers,\n      body: this.formattedBody,\n      signal: this.signal,\n      credentials: this.credentials,\n      redirect: this.redirect\n    }\n  }\n\n  get headers () {\n    const baseHeaders = {\n      'X-Requested-With': 'XMLHttpRequest',\n      'Content-Type': this.contentType,\n      Accept: this.accept\n    }\n\n    if (this.sameHostname()) {\n      baseHeaders['X-CSRF-Token'] = this.csrfToken\n    }\n\n    return compact(\n      Object.assign(baseHeaders, this.additionalHeaders)\n    )\n  }\n\n  get csrfToken () {\n    return getCookie(metaContent('csrf-param')) || metaContent('csrf-token')\n  }\n\n  get contentType () {\n    if (this.options.contentType) {\n      return this.options.contentType\n    } else if (this.body == null || this.body instanceof window.FormData) {\n      return undefined\n    } else if (this.body instanceof window.File) {\n      return this.body.type\n    }\n\n    return 'application/json'\n  }\n\n  get accept () {\n    switch (this.responseKind) {\n      case 'html':\n        return 'text/html, application/xhtml+xml'\n      case 'turbo-stream':\n        return 'text/vnd.turbo-stream.html, text/html, application/xhtml+xml'\n      case 'json':\n        return 'application/json, application/vnd.api+json'\n      default:\n        return '*/*'\n    }\n  }\n\n  get body () {\n    return this.options.body\n  }\n\n  get query () {\n    const originalQuery = (this.originalUrl.split('?')[1] || '').split('#')[0]\n    const params = new URLSearchParams(originalQuery)\n\n    let requestQuery = this.options.query\n    if (requestQuery instanceof window.FormData) {\n      requestQuery = stringEntriesFromFormData(requestQuery)\n    } else if (requestQuery instanceof window.URLSearchParams) {\n      requestQuery = requestQuery.entries()\n    } else {\n      requestQuery = Object.entries(requestQuery || {})\n    }\n\n    mergeEntries(params, requestQuery)\n\n    const query = params.toString()\n    return (query.length > 0 ? `?${query}` : '')\n  }\n\n  get url () {\n    return (this.originalUrl.split('?')[0]).split('#')[0] + this.query\n  }\n\n  get responseKind () {\n    return this.options.responseKind || 'html'\n  }\n\n  get signal () {\n    return this.options.signal\n  }\n\n  get redirect () {\n    return this.options.redirect || 'follow'\n  }\n\n  get credentials () {\n    return this.options.credentials || 'same-origin'\n  }\n\n  get additionalHeaders () {\n    return this.options.headers || {}\n  }\n\n  get formattedBody () {\n    const bodyIsAString = Object.prototype.toString.call(this.body) === '[object String]'\n    const contentTypeIsJson = this.headers['Content-Type'] === 'application/json'\n\n    if (contentTypeIsJson && !bodyIsAString) {\n      return JSON.stringify(this.body)\n    }\n\n    return this.body\n  }\n}\n", "import { FetchRequest } from './fetch_request'\n\nasync function get (url, options) {\n  const request = new FetchRequest('get', url, options)\n  return request.perform()\n}\n\nasync function post (url, options) {\n  const request = new FetchRequest('post', url, options)\n  return request.perform()\n}\n\nasync function put (url, options) {\n  const request = new FetchRequest('put', url, options)\n  return request.perform()\n}\n\nasync function patch (url, options) {\n  const request = new FetchRequest('patch', url, options)\n  return request.perform()\n}\n\nasync function destroy (url, options) {\n  const request = new FetchRequest('delete', url, options)\n  return request.perform()\n}\n\nexport { get, post, put, patch, destroy }\n", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * This is a base controller for all studio controllers. It provides\n * common methods and properties that are shared across all studio\n * controllers.\n */\nexport default class extends Controller {\n  isElectronConnected() {\n    return typeof window.studioApi === 'object';\n  }\n}\n", "import { put } from '@rails/request.js'\nimport StudioController from './studio_controller.js'\n\nexport default class extends StudioController {\n  static targets = ['thumbnail', 'preview'];\n\n  static values = {\n    id: String,\n    teamId: String,\n    uploadUrl: String,\n    thumbUploadUrl: String,\n    previewUploadUrl: String,\n    publicPreviewUrl: String,\n    startTrim: Number,\n    endTrim: Number,\n    state: String,\n    segments: Array\n  }\n\n  connect() {\n    console.log(this.segmentsValue);\n    if (this.isElectronConnected()) {\n      if (this.stateValue === 'ready_to_process') {\n        window.studioApi.handleClipGenerated(this.idValue, this.markReady.bind(this));\n        console.log('generating clip');\n        window.studioApi.generateClip(\n          this.segmentsValue,\n          this.idValue,\n          this.uploadUrlValue,\n          this.thumbUploadUrlValue,\n          this.previewUploadUrlValue\n        );\n      }\n    }\n\n    const previewVideo = this.previewTarget;\n\n    // Load metadata to get video duration\n    previewVideo.addEventListener('loadedmetadata', () => {\n      if (this.endTrimValue === null) {\n        this.endTrimValue = previewVideo.duration * 1000; // Convert to ms\n      }\n    });\n\n    // on hover, show the clip preview and autoplay the video\n    this.element.addEventListener('mouseover', () => {\n      if(!previewVideo.src) {\n        previewVideo.src = this.publicPreviewUrlValue;\n      }\n\n      previewVideo.classList.remove('hidden');\n      this.thumbnailTarget.classList.add('hidden');\n\n      // Set the start time before playing, default to 0 if null\n      previewVideo.currentTime = (this.startTrimValue || 0);\n      previewVideo.play();\n    });\n\n    this.element.addEventListener('mouseout', () => {\n      previewVideo.classList.add('hidden');\n      this.thumbnailTarget.classList.remove('hidden');\n      previewVideo.pause();\n    });\n\n    // Add timeupdate listener to handle end trim\n    previewVideo.addEventListener('timeupdate', () => {\n      const endTime = this.endTrimValue;\n      if (previewVideo.currentTime >= endTime) {\n        previewVideo.pause();\n        previewVideo.currentTime = (this.startTrimValue || 0);\n      }\n    });\n  }\n\n  markReady(event, data) {\n    console.log('Received clip-generated event with data:', data);\n    this.stateValue = 'ready';\n\n    put(`/${this.teamIdValue}/clips/${this.idValue}`, {\n      responseKind: 'turbo-stream',\n      body: {\n        video_clip: {\n          state: 'ready',\n          duration: data\n        }\n      }\n    }).then((data) => {\n      console.log('clip ready');\n    })\n  }\n\n\n  // attachClip(event, data) {\n  //   console.log('clip generated');\n  //   const formData = new FormData();\n\n  //   const blob = new Blob([data], {type: 'video/mp4'});\n\n  //   // Append the Blob to formData\n  //   formData.append('video_clip[clip]', blob, `${this.idValue}.mp4`);\n\n  //   put(`/${this.teamIdValue}/clips/${this.idValue}`, {\n  //     responseKind: 'turbo-stream',\n  //     body: formData\n  //   }).then((data) => {\n  //     console.log(data);\n  //   });\n  // }\n}\n", "import { put, post } from '@rails/request.js'\nimport StudioController from './studio_controller.js'\n// Use global videojs from CDN\nconst videojs = window.videojs\n\nexport default class extends StudioController {\n  static targets = [\n    \"addFeedButton\",\n    \"syncButton\",\n    \"unsyncButton\",\n    \"compileButton\",\n  ];\n\n  static values = {\n    id: String,\n    teamId: String,\n    activeFeedId: String,\n    synced: Boolean\n  }\n\n  static classes = [\"clipping\"]\n\n  static outlets = [ \"video--player-collection-component\", \"video--feed-seeker-component\" ]\n\n  static isClipping = false;\n  static clipStartTime = 0;\n  // There's a slight delay in reporting times of the player, this makes sure we don't clip the video too short\n  static clipBufferSec = 0.5;\n\n  initialize() {\n    // Set high buffer lengths to preload video\n    videojs.Vhs.GOAL_BUFFER_LENGTH = 100;\n    videojs.Vhs.MAX_GOAL_BUFFER_LENGTH = 250;\n    this.clipBufferSec = 0;\n\n    if( this.isElectronConnected() ) {\n      window.studioApi.handleFilesSelected(this.addFeedFromFiles.bind(this));\n      window.studioApi.setCurrentFeedCollection(this.idValue);\n    } else {\n      this.addFeedButtonTarget.style.display = 'none';\n    }\n  }\n\n  connect() {\n    // on the player-timeupdate event, update the current time of the feed seeker\n    this.element.addEventListener(\"player-timeupdate\", (event) => {\n      this.seekerForFeed(event.detail.feedId).updateTime(event.detail.currentTime);\n    });\n\n    this.element.addEventListener(\"player-active-feed-change\", (event) => {\n      this.activeFeedIdValue = event.detail.activeFeedId;\n    });\n    document.addEventListener('keydown', this.handleKeyDown.bind(this));\n  }\n\n  disconnect() {\n    document.removeEventListener('keydown', this.handleKeyDown.bind(this));\n  }\n\n  selectFiles() {\n    if( this.isElectronConnected() ) {\n      window.studioApi.selectFiles();\n    } else {\n      // This code is running in a web browser, handle accordingly\n      console.log('Running in a web browser, cannot access Electron.');\n    }\n  }\n\n  handleKeyDown(event) {\n    if (event.key === 'c') {\n      if (!this.isClipping) {\n        this.startClip();\n      } else {\n        this.endClip();\n      }\n    }\n  }\n\n  // This is a convenience method to avoid having to call this.videoPlayerCollectionComponentOutlet\n  get playerCollection() {\n    return this.videoPlayerCollectionComponentOutlet\n  }\n\n  seekerForFeed(feedId) {\n    if (this.syncedValue) {\n      return this.videoFeedSeekerComponentOutlet;\n    } else {\n      return this.videoFeedSeekerComponentOutlets.find((seeker) => {\n        return seeker.idValue === feedId\n      });\n    }\n  }\n\n  filenameFromPath(path) {\n    return path.split('/').pop();\n  }\n\n  addFeedFromFiles(event, files) {\n    // open file from path in files[0] and run it through mp4metadata\n\n    // create file object from path\n\n    let feedSegmentAttributes = files.map((file, index) => {\n      return {\n        local_path: file.format.filename,\n        probedata: JSON.stringify(file)\n      }\n    });\n\n    post(`/video/feed_collections/${this.idValue}/feeds`, {\n      responseKind: 'turbo-stream',\n      body: JSON.stringify({\n              video_feed: {\n                name: this.filenameFromPath(files[0].format.filename),\n                feed_segments_attributes: feedSegmentAttributes,\n              }\n            })\n    }).then((data) => {\n      console.log(data);\n    });\n  }\n\n  unsyncFeeds() {\n    put(`/video/feed_collections/${this.idValue}`, {\n      responseKind: 'turbo-stream',\n      body: JSON.stringify({\n              video_feed_collection: {\n                sync_data: {}\n              }\n            })\n    }).then((data) => {\n      this.playerCollection.syncedValue = false;\n      this.syncedValue = false;\n    });\n  }\n\n  syncFeeds() {\n    // Get the current times of all feeds\n    let feedTimes = this.playerCollection.currentTimes();\n\n    // These feed times represent the points in the video for the same moment in time.\n    // Convert these times into an offset from the start of the video\n    // This will allow us to sync the feeds to the same point in time\n    let maxTime = Math.max(...feedTimes.map((feedTime) => feedTime.currentTime));\n\n    let offsetTimes = feedTimes.map((feedTime) => {\n      return {\n        feed_id: feedTime.feedId,\n        offset: maxTime - feedTime.currentTime\n      }\n    });\n\n    console.log(offsetTimes);\n\n    put(`/video/feed_collections/${this.idValue}`, {\n      responseKind: 'turbo-stream',\n      body: JSON.stringify({\n              video_feed_collection: {\n                sync_data: offsetTimes\n              }\n            })\n    }).then((data) => {\n      this.playerCollection.syncedValue = true;\n      this.syncedValue = true;\n    });\n  }\n\n  generateCompilation() {\n    post(`/${this.teamIdValue}/compilations`, {\n      responseKind: 'turbo-stream',\n      body: JSON.stringify({\n        video_compilation: {\n          feed_collection_id: this.idValue\n        }\n      })\n    })\n  }\n\n  activeFeedIdValueChanged(current, previous) {\n    if(this.isClipping) {\n      this.currentClip.newSection(\n        this.playerCollection.currentLocalTime(previous) + this.clipBufferSec,\n        this.playerCollection.currentLocalTime(current) + this.clipBufferSec,\n        this.activeFeedIdValue\n      );\n    }\n  }\n\n  startClip() {\n    this.isClipping = true;\n    this.playerCollection.play();\n    this.playerCollection.element.classList.add(...this.clippingClasses)\n    this.currentClip = new Clip(this.playerCollection.currentLocalTime() - this.clipBufferSec,\n                                this.playerCollection.activeFeedIdValue)\n    this.clipStartTime = this.playerCollection.getCurrentTime() - this.clipBufferSec;\n  }\n\n  endClip() {\n    this.isClipping = false;\n    this.playerCollection.pause();\n    this.playerCollection.element.classList.remove(...this.clippingClasses)\n    this.currentClip.finish(this.playerCollection.currentLocalTime() + this.clipBufferSec);\n\n    post(`/video/feed_collections/${this.idValue}/clips`, {\n      responseKind: 'turbo-stream',\n      body: JSON.stringify({\n              video_clip: {\n                start_time: this.clipStartTime,\n                end_time: this.playerCollection.getCurrentTime() + this.clipBufferSec,\n                segments_attributes: this.currentClip.segments.map((segment) => {\n                  return {\n                    feed_id: segment.feedId,\n                    start_time: segment.startTime,\n                    end_time: segment.endTime\n                  }\n                })\n              }\n            })\n    }).then((data) => {\n      console.log(data);\n    });\n  }\n}\n\nclass Clip {\n  segments = []\n\n  constructor(startTime, feedId) {\n    this.segments = [];\n    this.segments.push({startTime: startTime, feedId: feedId});\n  }\n\n  newSection(feedEndTime, feedStartTime, feedId) {\n    //set endTime of last segment to startTime of new segment\n    this.segments[this.segments.length - 1].endTime = feedEndTime;\n    this.segments.push({startTime: feedStartTime, feedId: feedId});\n  }\n\n  finish(endTime) {\n    this.segments[this.segments.length - 1].endTime = endTime;\n    console.log(this.segments)\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\nimport StudioController from './studio_controller.js'\n\nexport default class extends StudioController {\n  static targets = [];\n\n  static values = {\n    id: String,\n  }\n}\n", "// Use global videojs from CDN\nconst videojs = window.videojs;\nimport StudioController from './studio_controller.js'\n\nexport default class extends StudioController {\n  static targets = [\"player\"];\n\n  static values = {\n    id: String,\n    segmentPaths: Array,\n    offset: Number,\n    videoFilters: String\n  }\n\n  static vjsPlayer = null;\n  static localTime = 0;\n\n  initialize() {\n    this.loadVideo.bind(this)();\n\n    this.vjsPlayer = videojs(this.playerTarget, {\n      controls: true,\n      autoplay: false,\n      fluid: true,\n      sources: [{\n        src: `http://localhost:3939/hls/${this.idValue}.m3u8`,\n        type: 'application/x-mpegURL'\n      }]\n    });\n\n    this.vjsPlayer.ready(() => {\n      this.addVideoClassToTech();\n    });\n  }\n\n  // Add a helper method to handle the class addition\n  addVideoClassToTech() {\n    const tech = this.vjsPlayer.tech({ IWillNotUseThisInPlugins: true });\n    if (tech && tech.el()) {\n      if (this.videoFiltersValue && this.videoFiltersValue === 'hflip,vflip') {\n        tech.el().classList.add('transform', 'transform-gpu', 'scale-flipxy');\n      }\n    }\n  }\n\n  disconnect() {\n    // window.studioApi.unloadVideo(this.playerTarget.getAttribute('data-segment-id'));\n  }\n\n  onPlayerEvent(event, handler) {\n    this.vjsPlayer.on(event, handler);\n  }\n\n  play(globalTime) {\n    this.localTime = globalTime - this.offsetValue;\n\n    console.log(`playing feed: ${this.idValue} at time: ${globalTime} (local: ${this.localTime})`);\n\n    // return if the current time is after the duration\n    if (this.localTime > this.vjsPlayer.duration() || this.localTime < 0) {\n      console.log(`invalid time: ${this.localTime} for feed: ${this.idValue}`);\n      return;\n    }\n\n    this.vjsPlayer.currentTime(this.localTime);\n    return this.vjsPlayer.play();\n  }\n\n  pause() {\n    return this.vjsPlayer.pause();\n  }\n\n  paused() {\n    return this.vjsPlayer.paused();\n  }\n\n  playbackRate(rate) {\n    return this.vjsPlayer.playbackRate(rate);\n  }\n\n  getCurrentTime() {\n    return this.vjsPlayer.currentTime() + this.offsetValue;\n  }\n\n  timeIsPlayable(globalTime) {\n    let t = globalTime - this.offsetValue;\n    return t >= 0 && t <= this.vjsPlayer.duration();\n  }\n\n  currentTime(globalTime) {\n    // if the current time is after the duration, set it to the duration and pause\n    this.localTime = globalTime - this.offsetValue;\n    console.log(`setting playertime: ${globalTime} (local: ${this.localTime}) for feed: ${this.idValue}`)\n\n    if (this.localTime > this.vjsPlayer.duration()) {\n      console.log(`setting playertime to duration for feed: ${this.idValue}`);\n      return this.pause();\n    } else if (this.localTime < 0) {\n      console.log(`setting playertime to 0 for feed: ${this.idValue}`);\n      return this.pause();\n    }\n\n    return this.vjsPlayer.currentTime(this.localTime);\n  }\n\n  duration() {\n    return this.vjsPlayer.duration() + this.offsetValue;\n  }\n\n  loadVideo() {\n    // return if window.studioApi is undefined\n    if (!this.isElectronConnected()) {\n      return\n    }\n\n    let id = this.idValue;\n    let segmentPaths = this.segmentPathsValue;\n\n    window.studioApi.handleFeedConstructed(id, (event) => {\n      console.log(`feed constructed - ${id}`);\n    });\n\n    window.studioApi.handleFeedStatus((event, status) => {\n      // output the status object in the console\n      console.log(status);\n\n      let feedStatus = status[id];\n\n      // if (feedStatus.status === 'completed') {\n      //   this.setVideoSrc(event, feedStatus.src);\n      // }\n    });\n\n    window.studioApi.handleVideoLoaded(id, this.setVideoSrc.bind(this));\n\n    console.log('loading video')\n    window.studioApi.loadVideo(segmentPaths, id);\n  }\n\n  setVideoSrc(event, src) {\n    console.log('setting video src');\n    // return unless vjsPlayer is defined\n    if (typeof this.vjsPlayer === 'undefined') {\n      return;\n    }\n\n    this.vjsPlayer.src({\n      src: src,\n      type: 'application/x-mpegURL'\n    });\n  }\n}\n\n", "import { Controller } from \"@hotwired/stimulus\"\nimport { get, post } from '@rails/request.js'\nimport StudioController from './studio_controller.js'\n\nexport default class extends StudioController {\n  static targets = [\"handle\", \"seekBar\", \"handleTooltip\"];\n\n  static values = {\n    id: String,\n    activeFeedId: String\n  }\n\n  static outlets = [ \"video--player-collection-component\" ]\n\n  static player;\n  static isDragging;\n\n  initialize() {\n    this.player = this.videoPlayerCollectionComponentOutlet;\n  }\n\n  startDrag(event) {\n    event.preventDefault();\n    this.isDragging = true;\n    this.showHandleTooltip();\n    window.addEventListener('mousemove', this.doDrag.bind(this));\n    window.addEventListener('mouseup', this.stopDrag.bind(this));\n    this.player.pause();\n    if(!this.player.syncedValue) {\n      this.player.setActiveFeed(this.idValue);\n    }\n  }\n\n  doDrag(event) {\n    if (!this.isDragging) return;\n\n    const rect = this.element.getBoundingClientRect();\n    const max = rect.width;\n    let position = event.clientX - rect.left;\n    position = Math.max(0, Math.min(position, max)); // Constrain within seek bar\n\n    const percentage = position / max;\n    const seekTime = percentage * this.player.duration();\n\n    // Update tooltip\n    this.showHandleTooltip();\n    this.handleTooltipTarget.textContent = this.formatTime(seekTime);\n    this.handleTooltipTarget.style.left = `${position - this.handleTooltipTarget.offsetWidth / 2}px`;\n\n    // Update handle position\n    this.handleTarget.style.left = `${position - this.handleTarget.offsetWidth / 2}px`;\n  }\n\n  showHandleTooltip() {\n    this.handleTooltipTarget.classList.add('visible');\n    this.handleTooltipTarget.classList.remove('invisible');\n  }\n\n  hideHandleTooltip() {\n    this.handleTooltipTarget.classList.remove('visible');\n    this.handleTooltipTarget.classList.add('invisible');\n  }\n\n  stopDrag(event) {\n    if (!this.isDragging) return;\n    this.isDragging = false;\n    this.hideHandleTooltip();\n    window.removeEventListener('mousemove', this.doDrag.bind(this));\n    window.removeEventListener('mouseup', this.stopDrag.bind(this));\n\n    // Seek the video\n    const percentage = (parseInt(this.handleTarget.style.left) + (this.handleTarget.offsetWidth/2)) / this.element.offsetWidth;\n    console.log(\"left: \" + (parseInt(this.handleTarget.style.left) + (this.handleTarget.offsetWidth/2)))\n    console.log(\"width: \" + this.element.offsetWidth)\n    console.log(percentage);\n    this.player.currentTime(percentage * this.player.duration());\n\n    this.handleTooltipTarget.classList.remove('visible');\n  }\n\n  formatTime(seconds) {\n    const date = new Date(seconds * 1000);\n    const hh = date.getUTCHours();\n    const mm = date.getUTCMinutes();\n    const ss = this.pad(date.getUTCSeconds());\n    if (hh) {\n        return `${hh}:${this.pad(mm)}:${ss}`;\n    }\n    return `${mm}:${ss}`;\n  }\n\n  pad(string) {\n    return ('0' + string).slice(-2);\n  }\n\n  updateTime(t) {\n    if (this.isDragging) return;\n    const percentage = (t / this.player.duration()) * 100;\n\n    let handlePos = (this.element.offsetWidth * percentage/100) - (this.handleTarget.offsetWidth / 2);\n    this.handleTarget.style.left = `${handlePos}px`;\n\n\n    this.handleTooltipTarget.textContent = this.formatTime(t);\n    let ttPos = (this.element.offsetWidth * percentage/100) - (this.handleTooltipTarget.offsetWidth / 2);\n\n    this.handleTooltipTarget.style.left = `${ttPos}px`;\n  }\n\n  seek(event) {\n    // find parent with data-feed-id\n    const feedId = event.target.closest('[data-feed-id]').dataset.feedId;\n    if (this.isDragging) return;\n    if(!this.player.syncedValue) {\n      this.player.setActiveFeed(this.idValue);\n    } else if (feedId) {\n      this.player.setActiveFeed(feedId);\n    }\n    // get the css left value of the seek bar\n    const feedBar = event.target.closest('.feed-bar')\n    const leftValue = parseInt(window.getComputedStyle(feedBar).left)\n    const seekTime = (event.offsetX + leftValue) / this.element.offsetWidth * this.player.duration();\n    console.log('seekTime', seekTime);\n    this.player.currentTime(seekTime);\n  }\n}", "import StudioController from './studio_controller.js'\n// Use global videojs from CDN\nconst videojs = window.videojs\n\nexport default class extends StudioController {\n\n  static values = {\n    id: String,\n    activeFeedId: String,\n    synced: Boolean\n  }\n\n  static targets = [\n    \"player\",\n    \"sidebar\",\n    \"mainPlayer\",\n    \"playerWrapper\"\n  ]\n\n  static classes = [\n    \"active\",\n    \"inactive\"\n  ]\n\n  static holdTimeouts;\n  static holdThreshold;\n  static holding;\n\n  static isFastForwarding;\n  static preSeekPlay;\n  static frameTime;\n  static seekIntervalId;\n\n  static feedIds;\n\n  initialize() {\n    this.holdTimeouts = {};\n    this.holdThreshold = 250;\n    this.holding = {};\n    this.isFastForwarding = false;\n    this.preSeekPlay = false;\n    this.frameTime = 1/60;\n    this.seekIntervalId = null;\n    this.isDragging = false;\n    this.keybindingsEnabled = true;\n    this.feedIds = [];\n\n    this.playerTargets.forEach((player) => {\n      this.feedIds.push(player.getAttribute('data-video--feed-player-component-id-value'));\n      setTimeout(() => {\n        let p = this.feedPlayer(player);\n        let feedId = player.getAttribute('data-video--feed-player-component-id-value');\n        p.onPlayerEvent(\"timeupdate\", this.dispatchTimeUpdate(p, feedId).bind(this));\n      }, 1000);\n    });\n\n    this.activeFeedIdValueChanged();\n\n  }\n\n  connect() {\n    document.addEventListener('keydown', this.handleKeyDown.bind(this));\n    document.addEventListener('keyup', this.handleKeyUp.bind(this));\n    window.addEventListener('keybindings:enable', this.enableKeybindings.bind(this));\n    window.addEventListener('keybindings:disable', this.disableKeybindings.bind(this));\n  }\n\n  disconnect() {\n    document.removeEventListener('keydown', this.handleKeyDown.bind(this));\n    document.removeEventListener('keyup', this.handleKeyUp.bind(this));\n    window.removeEventListener('keybindings:enable', this.enableKeybindings.bind(this));\n    window.removeEventListener('keybindings:disable', this.disableKeybindings.bind(this));\n  }\n\n  enableKeybindings() {\n    console.log(\"enabling keybindings\")\n    this.keybindingsEnabled = true;\n  }\n\n  disableKeybindings() {\n    console.log(\"disabling keybindings\")\n    this.keybindingsEnabled = false;\n  }\n\n  activePlayer() {\n    return this.playerForFeed(this.activeFeedIdValue);\n  }\n\n  playerTargetForFeed(feedId) {\n    return this.playerTargets.find((player) => {\n      return player.getAttribute('data-video--feed-player-component-id-value') === feedId\n    });\n  }\n\n  playerForFeed(feedId) {\n    return this.feedPlayer(this.playerTargetForFeed(feedId));\n  }\n\n  activeFeedIdValueChanged(currentValue, previousValue) {\n    if(currentValue === undefined || currentValue === '') {\n      return;\n    }\n\n    if(previousValue != '' && previousValue != undefined && !this.syncedValue) {\n      this.playerForFeed(previousValue).pause();\n    }\n\n    this.playerWrapperTargets.forEach((playerWrapper) => {\n      if(playerWrapper.getAttribute('data-id') === this.activeFeedIdValue) {\n        playerWrapper.classList.add(...this.activeClasses);\n        playerWrapper.classList.remove(...this.inactiveClasses);\n        playerWrapper.querySelector('.overlay').classList.add(...['hidden', 'mr-[200px]']);\n      }\n      else {\n        playerWrapper.classList.add(...this.inactiveClasses);\n        playerWrapper.classList.remove(...this.activeClasses);\n        playerWrapper.querySelector('.overlay').classList.remove(...['hidden', 'mr-[200px]']);\n        if(playerWrapper.getAttribute('data-id') === previousValue) {\n          console.log(\"moving player to playerWrapper\")\n          playerWrapper.appendChild(this.playerTargetForFeed(previousValue));\n        }\n      }\n    })\n\n    // move the player into the mainPlayer div\n    console.log(\"moving player to mainPlayer\")\n    this.mainPlayerTarget.appendChild(this.playerTargetForFeed(this.activeFeedIdValue));\n\n\n    // Set all of the players to match the time of the active player\n    let currentPlayer = this.activePlayer();\n\n    if(this.syncedValue && currentPlayer != null) {\n      let activePlayerTime = this.activePlayer().getCurrentTime();\n      this.playerTargets.forEach((player) => {\n        if(player.getAttribute('data-video--feed-player-component-id-value') === this.activeFeedIdValue) {\n          return;\n        }\n\n        this.feedPlayer(player).currentTime(activePlayerTime);\n      })\n\n      this.dispatchActiveFeedChange();\n      console.log(`active feed: ${this.activeFeedIdValue}`)\n    }\n  }\n\n  currentTimes() {\n    return this.playerTargets.map((player) => {\n      return {\n        feedId: player.getAttribute('data-video--feed-player-component-id-value'),\n        currentTime: this.feedPlayer(player).getCurrentTime()\n      }\n    });\n  }\n\n  currentLocalTime(feedId) {\n    if (feedId === undefined) feedId = this.activeFeedIdValue;\n    return this.feedPlayer(this.playerTargetForFeed(feedId)).vjsPlayer.currentTime();\n  }\n\n  dispatchTimeUpdate(feedPlayer, feedId) {\n    return (event) => {\n      const e = new CustomEvent(\"player-timeupdate\", {\n        detail: { currentTime: feedPlayer.getCurrentTime(), feedId: feedId }, // Optional: pass data with event\n        bubbles: true, // Event bubbles up through the DOM\n      });\n      this.element.dispatchEvent(e);\n    }\n  }\n\n  dispatchActiveFeedChange() {\n    const e = new CustomEvent(\"player-active-feed-change\", {\n      detail: { activeFeedId: this.activeFeedIdValue }, // Optional: pass data with event\n      bubbles: true, // Event bubbles up through the DOM\n    });\n    this.element.dispatchEvent(e);\n  }\n\n  play() {\n    const time = this.getCurrentTime();\n    if(this.syncedValue) {\n      this.playerTargets.forEach((player) => {\n        this.feedPlayer(player).play(time);\n      })\n    } else {\n      this.activePlayer().play(time);\n    }\n  }\n\n  pause() {\n    if(this.syncedValue) {\n      this.playerTargets.forEach((player) => {\n        this.feedPlayer(player).pause();\n      })\n    } else {\n      this.activePlayer().pause();\n    }\n  }\n\n  paused() {\n    return this.activePlayer().paused();\n  }\n\n  playbackRate(rate) {\n    if(this.syncedValue) {\n      this.playerTargets.forEach((player) => {\n        this.feedPlayer(player).playbackRate(rate)\n      })\n    } else {\n      this.activePlayer().playbackRate(rate);\n    }\n  }\n\n  getCurrentTime() {\n    return this.activePlayer().getCurrentTime();\n  }\n\n  currentTime(t) {\n    console.log(`setting time: ${t}`)\n    if(this.syncedValue) {\n      this.playerTargets.forEach((player) => {\n        this.feedPlayer(player).currentTime(t)\n      })\n    } else {\n      this.activePlayer().currentTime(t);\n    }\n  }\n\n  duration() {\n    // max duration of all feeds\n    return Math.max(...this.playerTargets.map((player) => this.feedPlayer(player).duration()));\n  }\n\n  feedPlayer(playerTarget) {\n    return this.application.getControllerForElementAndIdentifier(playerTarget, \"video--feed-player-component\");\n  }\n\n  selectFeed(event) {\n    if (event.currentTarget.getAttribute('data-id') === this.activeFeedIdValue) {\n      return;\n    }\n\n    this.setActiveFeed(event.currentTarget.getAttribute('data-id'));\n    event.stopPropagation();\n    event.preventDefault();\n  }\n\n  setActiveFeed(feedId) {\n    if(feedId === undefined || feedId === '') {\n      return;\n    }\n\n    this.activeFeedIdValue = feedId;\n  }\n\n  handleKeyDown(event) {\n    if (!this.keybindingsEnabled) {\n      return;\n    }\n\n    const key = this.getKeyName(event.key);\n\n    const holdableKeys = ['ArrowRight', 'ArrowLeft'];\n\n    if (holdableKeys.includes(key) && !this.holding[key]) {\n      this.holdTimeouts[key] = setTimeout(this.handleHoldStart(key).bind(this), this.holdThreshold);\n    }\n\n    // Prevent default behavior for space bar\n    if (key === 'Space') {\n      event.preventDefault();\n    }\n  }\n\n  handleKeyUp(event) {\n    if (!this.keybindingsEnabled) {\n      return;\n    }\n\n    const key = this.getKeyName(event.key);\n\n    if (this.holdTimeouts[key] !== undefined) {\n      clearTimeout(this.holdTimeouts[key]);\n      this.holdTimeouts[key] = undefined;\n    }\n\n    if (this.holding[key]) {\n      this.handleHoldEnd(key);\n      return;\n    }\n\n    switch (key) {\n      case 'ArrowRight':\n        this.handleArrowRight(event);\n        break;\n      case 'ArrowLeft':\n        this.handleArrowLeft(event);\n        break;\n      case 'Space':\n        this.handleSingleSpace(event);\n        break;\n      case 'D':\n      case 'd':\n        this.handleD(event);\n        break;\n      case 'A':\n      case 'a':\n        this.handleA(event);\n        break;\n      case 'S':\n      case 's':\n        this.handleS(event);\n        break;\n    }\n  }\n\n  handleHoldEnd(key) {\n    this.holding[key] = false;\n    switch (key) {\n      case 'ArrowRight':\n        this.stopFastForward();\n        break;\n      case 'ArrowLeft':\n        this.stopRewind();\n        break;\n    }\n  }\n\n  handleHoldStart(key) {\n    return () => {\n      this.holding[key] = true;\n      this.holdTimeouts[key] = undefined;\n      switch (key) {\n        case 'ArrowRight':\n          return this.startFastForward();\n        case 'ArrowLeft':\n          return this.startRewind();\n      }\n    }\n  }\n\n  getKeyName(key) {\n    return key === ' ' ? 'Space' : key;\n  }\n\n  startFastForward() {\n    console.log('Starting fast forward');\n    this.isFastForwarding = true;\n    this.preSeekPlay = !this.paused();\n    this.play();\n    this.playbackRate(8);\n    this.showHandleTooltip();\n  }\n\n  stopFastForward() {\n    console.log('Stopping fast forward');\n    if (this.isFastForwarding) {\n      this.isFastForwarding = false;\n\n      // Go back a few seconds to give the user a chance to see where they are\n      const currentTime = this.getCurrentTime();\n      const newTime = Math.max(0, currentTime - 3.5);\n      this.currentTime(newTime);\n\n      this.playbackRate(1.0); // Reset playback speed to normal\n      if (!this.preSeekPlay) {\n        this.pause();\n      }\n    }\n  }\n\n  startRewind() {\n    console.log('Starting rewind');\n    if (this.seekIntervalId) {\n      // Ensure there's only one interval running\n      clearInterval(this.seekIntervalId);\n    }\n\n    this.preSeekPlay = !this.paused();\n    this.pause();\n\n    this.seekIntervalId = setInterval(() => {\n        const currentTime = this.getCurrentTime();\n        const newTime = Math.max(0, currentTime - 3); // Ensure time doesn't go below 0\n        this.currentTime(newTime);\n    }, 750);\n  }\n\n  stopRewind() {\n    console.log('Stopping rewind');\n    if (this.seekIntervalId) {\n      clearInterval(this.seekIntervalId);\n      this.seekIntervalId = null;\n      if (this.preSeekPlay) {\n        this.play();\n      }\n    }\n  }\n\n  handleArrowRight(event) {\n    console.log('Single right arrow key pressed');\n    this.pause();\n    this.currentTime(this.getCurrentTime() + this.frameTime);\n  }\n\n  handleArrowLeft(event) {\n    console.log('Single left arrow key pressed');\n    this.pause();\n    this.currentTime(this.getCurrentTime() - this.frameTime);\n  }\n\n  handleArrowUp() {\n    console.log('Single up arrow key pressed');\n  }\n\n  handleArrowDown() {\n    console.log('Single down arrow key pressed');\n  }\n\n  handleA(event) {\n    console.log('A key pressed');\n    // back 5 seconds\n    this.currentTime(this.getCurrentTime() - 5);\n  }\n\n  handleD(event) {\n    console.log('D key pressed');\n    // forward 5 seconds\n    this.currentTime(this.getCurrentTime() + 5);\n  }\n\n  handleS(event) {\n    console.log('S key pressed');\n    // switch to next feed\n    this.activateNextFeed();\n  }\n\n  activateNextFeed() {\n    let nextFeedIndex = this.feedIds.indexOf(this.activeFeedIdValue) + 1;\n\n    if (nextFeedIndex >= this.playerTargets.length || nextFeedIndex < 0) {\n      nextFeedIndex = 0;\n    }\n\n    this.setActiveFeed(this.feedIds[nextFeedIndex]);\n  }\n\n  handleSingleSpace(event) {\n    console.log('Space bar pressed');\n    if (this.paused()) {\n      this.play();\n    } else {\n      this.pause();\n    }\n  }\n}", "import { Controller } from \"@hotwired/stimulus\"\n\n/**\n * Stimulus controller for Video::Player\n */\nexport default class extends Controller {\n  static targets = ['video']\n  static values = {\n    videoPath: String,\n    frameRate: Number,\n    mimeType: String,\n    autoplay: Boolean\n  }\n  static classes = []\n\n  static initialized = false\n\n  connect() {\n    console.debug(`Video path: ${this.videoPathValue}`)\n\n    // Wait for videojs to be available from CDN, then setup\n    this.waitForVideoJS()\n      .then(() => {\n        this.setupVideoPlayer()\n        this.initialize()\n        // Only setup keyboard shortcuts if not using shared controller\n        if (!this.hasSharedKeyboardController()) {\n          this.setupKeyboardShortcuts()\n        }\n      })\n      .catch((error) => {\n        console.error('Failed to initialize video player:', error)\n      })\n  }\n\n  async waitForVideoJS() {\n    // If videojs is already available, return immediately\n    if (window.videojs) {\n      console.debug('Video.js already loaded')\n      return Promise.resolve()\n    }\n\n    console.debug('Waiting for Video.js to load from CDN...')\n\n    // Otherwise, wait for it to load (with timeout)\n    return new Promise((resolve, reject) => {\n      let attempts = 0\n      const maxAttempts = 100 // 10 seconds with 100ms intervals\n\n      const checkInterval = setInterval(() => {\n        attempts++\n        if (window.videojs) {\n          console.debug('Video.js loaded successfully')\n          clearInterval(checkInterval)\n          resolve()\n        } else if (attempts >= maxAttempts) {\n          clearInterval(checkInterval)\n          const error = new Error('Video.js CDN script failed to load within 10 seconds')\n          console.error(error)\n          reject(error)\n        }\n      }, 100)\n    })\n  }\n\n  async initialize() {\n    this.initialized = true\n    this.dispatchInitializedEvent()\n  }\n\n  async setupVideoPlayer() {\n    console.debug('Setting up video player...')\n    this.player = null\n\n    this.videoElement = this.videoTarget\n    if (this.videoTarget.dataset.initialized === 'true') {\n      console.debug('Video element already initialized, reattaching player')\n      this.player = window.videojs(this.videoElement)\n      this.setupEventListeners()\n      return\n    }\n\n    console.debug('Initializing new video player')\n    this.videoTarget.dataset.initialized = 'true'\n\n    // Check if the path is already a full URL (e.g., presigned S3 URL)\n    const isFullUrl = this.videoPathValue.startsWith('http://') || this.videoPathValue.startsWith('https://')\n\n    let videoSrc\n    let shouldSetCredentials = false\n\n    if (isFullUrl) {\n      // Use the full URL directly (for presigned URLs)\n      videoSrc = this.videoPathValue\n      shouldSetCredentials = false\n    } else {\n      // Use CDN path and set cookies\n      const cookieUrl = `/cdn${this.videoPathValue}`\n      const cdnUrl = `https://cdn.creaselogic.com${this.videoPathValue}`\n\n      try {\n        await fetch(cookieUrl, { credentials: 'include' })\n        // Ensure the video element has the correct type attribute\n        this.videoElement.setAttribute('crossorigin', 'use-credentials')\n      } catch (error) {\n        console.error('Failed to set CDN cookies:', error)\n      }\n\n      videoSrc = cdnUrl\n      shouldSetCredentials = true\n    }\n\n    if (this.videoElement) {\n      console.debug('Creating video.js player instance')\n      this.player = window.videojs(this.videoElement, {\n        controls: true,\n        autoplay: this.autoplayValue,\n        muted: this.autoplayValue, // Mute when autoplaying (required by browsers)\n        fluid: true,\n        responsive: true,\n        playbackRates: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2],\n        ...this.additionalConfig()\n      })\n\n      console.debug('Video.js player created, waiting for ready event')\n\n      // Set up event listeners\n      this.player.ready(() => {\n        console.debug('Video.js player ready')\n        this.setupEventListeners()\n      })\n\n      console.debug('Setting video source:', videoSrc)\n      this.player.src({\n        src: videoSrc,\n        type: this.mimeTypeValue,\n        withCredentials: shouldSetCredentials\n      })\n\n      this.seekToLocalTime(this.currentLocalTime)\n    }\n  }\n\n  additionalConfig() {\n    return {}\n  }\n\n  setupEventListeners() {\n    if (!this.player) return\n\n    // Time update event\n    this.player.on('timeupdate', () => {\n      this.handleTimeUpdate()\n    })\n\n    // Play event\n    this.player.on('play', () => {\n      this.handlePlay()\n    })\n\n    // Pause event\n    this.player.on('pause', () => {\n      this.handlePause()\n    })\n\n    // Seeked event\n    this.player.on('seeked', () => {\n      this.handleSeeked()\n    })\n\n    // Error handling\n    this.player.on('error', (error) => {\n      console.error(`Video player error for camera ${this.cameraLocationIdValue}:`, error)\n    })\n\n    // Add click event listener to make this player active\n    this.element.addEventListener('click', (event) => {\n      // Don't trigger if clicking on video controls\n      if (event.target.closest('.vjs-control-bar') || event.target.closest('.vjs-control')) {\n        return\n      }\n      this.handlePlayerClick()\n    })\n  }\n\n  // Handle time update from video player\n  handleTimeUpdate() {\n    if (!this.player) return\n    this.currentLocalTime = this.player.currentTime()\n    this.dispatchTimeUpdateEvent()\n  }\n\n   // Handle play event\n   handlePlay() {\n    this.dispatchPlayEvent()\n  }\n\n  // Handle pause event\n  handlePause() {\n    this.dispatchPauseEvent()\n  }\n\n  // Handle seeked event\n  handleSeeked() {\n    if (!this.player) return\n\n    this.currentLocalTime = this.player.currentTime()\n    this.dispatchSeekedEvent(this.currentLocalTime)\n  }\n\n  // Seek to a specific local timestamp\n  seekToLocalTime(localTime) {\n    if (!this.player) return\n\n    this.currentLocalTime = localTime\n\n    this.player.currentTime(this.currentLocalTime)\n  }\n\n  // Play the video\n  play() {\n    if (this.player) {\n      this.player.play()\n    }\n  }\n\n  // Pause the video\n  pause() {\n    if (this.player) {\n      this.player.pause()\n    }\n  }\n\n  hasSharedKeyboardController() {\n    // Check if parent element has the shared keyboard controller\n    return this.element.closest('[data-controller*=\"shared--player-keyboard\"]') !== null\n  }\n\n  disconnect() {\n    if (this.player) {\n      this.player.dispose()\n    }\n    if (this.handleKeydown) {\n      document.removeEventListener('keydown', this.handleKeydown)\n    }\n  }\n\n  setupKeyboardShortcuts() {\n    this.handleKeydown = (event) => {\n      // Ignore keyboard shortcuts when typing in input fields\n      if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {\n        return\n      }\n\n      switch(event.key.toLowerCase()) {\n        case ' ':\n          event.preventDefault()\n          this.togglePlayback()\n          break\n        case 'a':\n          event.preventDefault()\n          this.seekBackward()\n          break\n        case 'd':\n          event.preventDefault()\n          this.seekForward()\n          break\n        case 'f':\n          event.preventDefault()\n          this.seekFarForward()\n          break\n        case 'arrowright':\n          event.preventDefault()\n          this.nextFrame()\n          break\n        case 'arrowleft':\n          event.preventDefault()\n          this.previousFrame()\n          break\n      }\n    }\n\n    document.addEventListener('keydown', this.handleKeydown)\n  }\n\n  togglePlayback() {\n    if (this.isPlaying()) {\n      this.pause()\n    } else {\n      this.play()\n    }\n  }\n\n  seekBackward() {\n    if (this.player) {\n      this.player.currentTime(Math.max(0, this.player.currentTime() - 5))\n    }\n  }\n\n  seekForward() {\n    if (this.player) {\n      this.player.currentTime(Math.min(this.player.duration(), this.player.currentTime() + 5))\n    }\n  }\n\n  seekFarForward() {\n    if (this.player) {\n      this.player.currentTime(Math.min(this.player.duration(), this.player.currentTime() + 30))\n    }\n  }\n\n  get frameDuration() {\n    return 1.0 / this.frameRateValue;\n  }\n\n  nextFrame() {\n    console.log(\"Next frame:\", this.player.currentTime() + this.frameDuration)\n    this.player.currentTime(this.player.currentTime() + this.frameDuration)\n  }\n\n  previousFrame() {\n    this.player.currentTime(this.player.currentTime() - this.frameDuration)\n  }\n\n  // Set playback rate\n  setPlaybackRate(rate) {\n    if (this.player) {\n      this.player.playbackRate(rate)\n    }\n  }\n\n  // Check if the player is playing\n  isPlaying() {\n    return this.player ? !this.player.paused() : false\n  }\n  // Dispatch time update event\n  dispatchTimeUpdateEvent() {\n    const event = new CustomEvent('video-player:timeupdate', {\n      detail: {\n        localTime: this.currentLocalTime,\n        videoUrl: this.videoUrlValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Dispatch play event\n  dispatchPlayEvent() {\n    const event = new CustomEvent('video-player:play', {\n      detail: {\n        videoUrl: this.videoUrlValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Dispatch pause event\n  dispatchPauseEvent() {\n    const event = new CustomEvent('video-player:pause', {\n      detail: {\n        videoUrl: this.videoUrlValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Dispatch seeked event\n  dispatchSeekedEvent(localTime) {\n    const event = new CustomEvent('video-player:seeked', {\n      detail: {\n        localTime,\n        videoUrl: this.videoUrlValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Dispatch initialized event\n  dispatchInitializedEvent() {\n    const event = new CustomEvent('player:initialized', {\n      detail: {\n        videoUrl: this.videoUrlValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  // Handle player click to make it the active player\n  handlePlayerClick() {\n    const event = new CustomEvent('video-player:clicked', {\n      detail: {\n        videoUrl: this.videoUrlValue\n      },\n      bubbles: true\n    })\n    this.element.dispatchEvent(event)\n  }\n\n  updateOverlay(timestamp) {\n    const inRange = this.masterTimestampInRange(timestamp)\n    this.toggleNoVideoOverlay(!inRange)\n  }\n\n  toggleNoVideoOverlay(show) {\n    if (!this.hasNoVideoOverlayTarget) return\n    if (show) {\n      this.noVideoOverlayTarget.classList.remove('hidden')\n    } else {\n      this.noVideoOverlayTarget.classList.add('hidden')\n    }\n  }\n}\n", "import StudioController from './studio_controller.js'\n\nexport default class extends StudioController {\n  static targets = [];\n\n  static values = {\n  }\n\n  connect() {\n    console.log('studio connected');\n  }\n}\n", "// This file is auto-generated by ./bin/rails stimulus:manifest:update\n// Run that command whenever you add a new controller or create them with\n// ./bin/rails generate stimulus controllerName\n\nimport { application } from \"./application\"\n\nimport AlertController from \"./alert_controller\"\napplication.register(\"alert\", AlertController)\n\nimport Analytics__CiChartController from \"./analytics/ci_chart_controller\"\napplication.register(\"analytics--ci-chart\", Analytics__CiChartController)\n\nimport Analytics__GameLogComponentController from \"./analytics/game_log_component_controller\"\napplication.register(\"analytics--game-log-component\", Analytics__GameLogComponentController)\n\nimport Analytics__GradePerformanceChartComponentController from \"./analytics/grade_performance_chart_component_controller\"\napplication.register(\"analytics--grade-performance-chart-component\", Analytics__GradePerformanceChartComponentController)\n\nimport Analytics__GradePerformanceTabsComponentController from \"./analytics/grade_performance_tabs_component_controller\"\napplication.register(\"analytics--grade-performance-tabs-component\", Analytics__GradePerformanceTabsComponentController)\n\nimport Analytics__PerformanceChartComponentController from \"./analytics/performance_chart_component_controller\"\napplication.register(\"analytics--performance-chart-component\", Analytics__PerformanceChartComponentController)\n\nimport Charts__BaseController from \"./charts/base_controller\"\napplication.register(\"charts--base\", Charts__BaseController)\n\nimport ClipboardController from \"./clipboard_controller\"\napplication.register(\"clipboard\", ClipboardController)\n\nimport ConfirmationController from \"./confirmation_controller\"\napplication.register(\"confirmation\", ConfirmationController)\n\nimport ContextMenuController from \"./context_menu_controller\"\napplication.register(\"context-menu\", ContextMenuController)\n\nimport DependentCheckboxController from \"./dependent_checkbox_controller\"\napplication.register(\"dependent-checkbox\", DependentCheckboxController)\n\nimport DropdownController from \"./dropdown_controller\"\napplication.register(\"dropdown\", DropdownController)\n\nimport Game__Analysis__CameraComponentController from \"./game/analysis/camera_component_controller\"\napplication.register(\"game--analysis--camera-component\", Game__Analysis__CameraComponentController)\n\nimport Game__Analysis__CamerasComponentController from \"./game/analysis/cameras_component_controller\"\napplication.register(\"game--analysis--cameras-component\", Game__Analysis__CamerasComponentController)\n\nimport Game__Analysis__Charts__ReboundResultBreakdownChartComponentController from \"./game/analysis/charts/rebound_result_breakdown_chart_component_controller\"\napplication.register(\"game--analysis--charts--rebound-result-breakdown-chart-component\", Game__Analysis__Charts__ReboundResultBreakdownChartComponentController)\n\nimport Game__Analysis__Charts__SafeAreaReboundRateChartComponentController from \"./game/analysis/charts/safe_area_rebound_rate_chart_component_controller\"\napplication.register(\"game--analysis--charts--safe-area-rebound-rate-chart-component\", Game__Analysis__Charts__SafeAreaReboundRateChartComponentController)\n\nimport Game__Analysis__Charts__ShotBreakdownChartComponentController from \"./game/analysis/charts/shot_breakdown_chart_component_controller\"\napplication.register(\"game--analysis--charts--shot-breakdown-chart-component\", Game__Analysis__Charts__ShotBreakdownChartComponentController)\n\nimport Game__Analysis__Charts__XgBreakdownChartComponentController from \"./game/analysis/charts/xg_breakdown_chart_component_controller\"\napplication.register(\"game--analysis--charts--xg-breakdown-chart-component\", Game__Analysis__Charts__XgBreakdownChartComponentController)\n\nimport Game__Analysis__GoaltenderAssignmentController from \"./game/analysis/goaltender_assignment_controller\"\napplication.register(\"game--analysis--goaltender-assignment\", Game__Analysis__GoaltenderAssignmentController)\n\nimport Game__Analysis__LocationComponentController from \"./game/analysis/location_component_controller\"\napplication.register(\"game--analysis--location-component\", Game__Analysis__LocationComponentController)\n\nimport Game__Analysis__PlayViewerComponentController from \"./game/analysis/play_viewer_component_controller\"\napplication.register(\"game--analysis--play-viewer-component\", Game__Analysis__PlayViewerComponentController)\n\nimport Game__Analysis__SetupComponentController from \"./game/analysis/setup_component_controller\"\napplication.register(\"game--analysis--setup-component\", Game__Analysis__SetupComponentController)\n\nimport Game__Analysis__ShotListController from \"./game/analysis/shot_list_controller\"\napplication.register(\"game--analysis--shot-list\", Game__Analysis__ShotListController)\n\nimport Game__Analysis__ShotMapComponentController from \"./game/analysis/shot_map_component_controller\"\napplication.register(\"game--analysis--shot-map-component\", Game__Analysis__ShotMapComponentController)\n\nimport Game__Analysis__VideoFileUploadComponentController from \"./game/analysis/video_file_upload_component_controller\"\napplication.register(\"game--analysis--video-file-upload-component\", Game__Analysis__VideoFileUploadComponentController)\n\nimport Game__Analysis__VideoPlayerController from \"./game/analysis/video_player_controller\"\napplication.register(\"game--analysis--video-player\", Game__Analysis__VideoPlayerController)\n\nimport GameFormController from \"./game_form_controller\"\napplication.register(\"game-form\", GameFormController)\n\nimport GameListItemController from \"./game_list_item_controller\"\napplication.register(\"game-list-item\", GameListItemController)\n\nimport GoaltenderAssignmentModalController from \"./goaltender_assignment_modal_controller\"\napplication.register(\"goaltender-assignment-modal\", GoaltenderAssignmentModalController)\n\nimport ManualClipDurationController from \"./manual_clip_duration_controller\"\napplication.register(\"manual-clip-duration\", ManualClipDurationController)\n\nimport MobileMenuController from \"./mobile_menu_controller\"\napplication.register(\"mobile-menu\", MobileMenuController)\n\nimport ModalController from \"./modal_controller\"\napplication.register(\"modal\", ModalController)\n\nimport NavigateController from \"./navigate_controller\"\napplication.register(\"navigate\", NavigateController)\n\nimport NestedFieldsController from \"./nested_fields_controller\"\napplication.register(\"nested-fields\", NestedFieldsController)\n\nimport Public__BiographicalInfoComponentController from \"./public/biographical_info_component_controller\"\napplication.register(\"public--biographical-info-component\", Public__BiographicalInfoComponentController)\n\nimport Public__GameCardComponentController from \"./public/game_card_component_controller\"\napplication.register(\"public--game-card-component\", Public__GameCardComponentController)\n\nimport Public__HighlightReelComponentController from \"./public/highlight_reel_component_controller\"\napplication.register(\"public--highlight-reel-component\", Public__HighlightReelComponentController)\n\nimport Public__RecentGamesGridComponentController from \"./public/recent_games_grid_component_controller\"\napplication.register(\"public--recent-games-grid-component\", Public__RecentGamesGridComponentController)\n\nimport Public__TeamInfoComponentController from \"./public/team_info_component_controller\"\napplication.register(\"public--team-info-component\", Public__TeamInfoComponentController)\n\nimport Public__TrustIndicatorComponentController from \"./public/trust_indicator_component_controller\"\napplication.register(\"public--trust-indicator-component\", Public__TrustIndicatorComponentController)\n\nimport Review__Annotation__ClipPointOverlayComponentController from \"./review/annotation/clip_point_overlay_component_controller\"\napplication.register(\"review--annotation--clip-point-overlay-component\", Review__Annotation__ClipPointOverlayComponentController)\n\nimport Review__Annotation__CustomFields__GridComponentController from \"./review/annotation/custom_fields/grid_component_controller\"\napplication.register(\"review--annotation--custom-fields--grid-component\", Review__Annotation__CustomFields__GridComponentController)\n\nimport Review__Annotation__CustomFields__PlaySituationFieldComponentController from \"./review/annotation/custom_fields/play_situation_field_component_controller\"\napplication.register(\"review--annotation--custom-fields--play-situation-field-component\", Review__Annotation__CustomFields__PlaySituationFieldComponentController)\n\nimport Review__Annotation__CustomFields__RadioGroupComponentController from \"./review/annotation/custom_fields/radio_group_component_controller\"\napplication.register(\"review--annotation--custom-fields--radio-group-component\", Review__Annotation__CustomFields__RadioGroupComponentController)\n\nimport Review__Annotation__EventFormComponentController from \"./review/annotation/event_form_component_controller\"\napplication.register(\"review--annotation--event-form-component\", Review__Annotation__EventFormComponentController)\n\nimport Review__Annotation__EventSequenceComponentController from \"./review/annotation/event_sequence_component_controller\"\napplication.register(\"review--annotation--event-sequence-component\", Review__Annotation__EventSequenceComponentController)\n\nimport Review__Annotation__EventTypeSelectorComponentController from \"./review/annotation/event_type_selector_component_controller\"\napplication.register(\"review--annotation--event-type-selector-component\", Review__Annotation__EventTypeSelectorComponentController)\n\nimport Review__Annotation__IceMapComponentController from \"./review/annotation/ice_map_component_controller\"\napplication.register(\"review--annotation--ice-map-component\", Review__Annotation__IceMapComponentController)\n\nimport Review__Annotation__StudioComponentController from \"./review/annotation/studio_component_controller\"\napplication.register(\"review--annotation--studio-component\", Review__Annotation__StudioComponentController)\n\nimport Review__AnnotationPointComponentController from \"./review/annotation_point_component_controller\"\napplication.register(\"review--annotation-point-component\", Review__AnnotationPointComponentController)\n\nimport Review__CameraContextMenuComponentController from \"./review/camera_context_menu_component_controller\"\napplication.register(\"review--camera-context-menu-component\", Review__CameraContextMenuComponentController)\n\nimport Review__CameraSyncModalComponentController from \"./review/camera_sync_modal_component_controller\"\napplication.register(\"review--camera-sync-modal-component\", Review__CameraSyncModalComponentController)\n\nimport Review__ClipPointComponentController from \"./review/clip_point_component_controller\"\napplication.register(\"review--clip-point-component\", Review__ClipPointComponentController)\n\nimport Review__Debug__ClassificationToggleController from \"./review/debug/classification_toggle_controller\"\napplication.register(\"review--debug--classification-toggle\", Review__Debug__ClassificationToggleController)\n\nimport Review__EventSequenceListItemController from \"./review/event_sequence_list_item_controller\"\napplication.register(\"review--event-sequence-list-item\", Review__EventSequenceListItemController)\n\nimport Review__KeybindingManagerController from \"./review/keybinding_manager_controller\"\napplication.register(\"review--keybinding-manager\", Review__KeybindingManagerController)\n\nimport Review__PlayerComponentController from \"./review/player_component_controller\"\napplication.register(\"review--player-component\", Review__PlayerComponentController)\n\nimport Review__PlayerSetComponentController from \"./review/player_set_component_controller\"\napplication.register(\"review--player-set-component\", Review__PlayerSetComponentController)\n\nimport Review__Queues__BaseComponentController from \"./review/queues/base_component_controller\"\napplication.register(\"review--queues--base-component\", Review__Queues__BaseComponentController)\n\nimport Review__Queues__ClassificationsComponentController from \"./review/queues/classifications_component_controller\"\napplication.register(\"review--queues--classifications-component\", Review__Queues__ClassificationsComponentController)\n\nimport Review__Queues__GamesComponentController from \"./review/queues/games_component_controller\"\napplication.register(\"review--queues--games-component\", Review__Queues__GamesComponentController)\n\nimport Review__Queues__PlaysComponentController from \"./review/queues/plays_component_controller\"\napplication.register(\"review--queues--plays-component\", Review__Queues__PlaysComponentController)\n\nimport Review__Queues__QueueItemComponentController from \"./review/queues/queue_item_component_controller\"\napplication.register(\"review--queues--queue-item-component\", Review__Queues__QueueItemComponentController)\n\nimport Review__SeekerComponentController from \"./review/seeker_component_controller\"\napplication.register(\"review--seeker-component\", Review__SeekerComponentController)\n\nimport Review__StudioComponentController from \"./review/studio_component_controller\"\napplication.register(\"review--studio-component\", Review__StudioComponentController)\n\nimport Review__TimelineComponentController from \"./review/timeline_component_controller\"\napplication.register(\"review--timeline-component\", Review__TimelineComponentController)\n\nimport Review__TimelineItemController from \"./review/timeline_item_controller\"\napplication.register(\"review--timeline-item\", Review__TimelineItemController)\n\nimport Settings__ProfilePhotoUploadComponentController from \"./settings/profile_photo_upload_component_controller\"\napplication.register(\"settings--profile-photo-upload-component\", Settings__ProfilePhotoUploadComponentController)\n\nimport Shared__GoaltenderSwitcherComponentController from \"./shared/goaltender_switcher_component_controller\"\napplication.register(\"shared--goaltender-switcher-component\", Shared__GoaltenderSwitcherComponentController)\n\nimport Shared__PlayerKeyboardController from \"./shared/player_keyboard_controller\"\napplication.register(\"shared--player-keyboard\", Shared__PlayerKeyboardController)\n\nimport TeamSeasonTypeaheadController from \"./team_season_typeahead_controller\"\napplication.register(\"team-season-typeahead\", TeamSeasonTypeaheadController)\n\nimport TimezoneGuesserController from \"./timezone_guesser_controller\"\napplication.register(\"timezone-guesser\", TimezoneGuesserController)\n\nimport TooltipController from \"./tooltip_controller\"\napplication.register(\"tooltip\", TooltipController)\n\nimport TournamentTeamFormController from \"./tournament_team_form_controller\"\napplication.register(\"tournament-team-form\", TournamentTeamFormController)\n\nimport Ui__DualRangeSliderComponentController from \"./ui/dual_range_slider_component_controller\"\napplication.register(\"ui--dual-range-slider-component\", Ui__DualRangeSliderComponentController)\n\nimport Ui__GoaltenderSelectDropdownComponentController from \"./ui/goaltender_select_dropdown_component_controller\"\napplication.register(\"ui--goaltender-select-dropdown-component\", Ui__GoaltenderSelectDropdownComponentController)\n\nimport Ui__KeyboardShortcutsComponentController from \"./ui/keyboard_shortcuts_component_controller\"\napplication.register(\"ui--keyboard-shortcuts-component\", Ui__KeyboardShortcutsComponentController)\n\nimport Ui__MultiSelectDropdownComponentController from \"./ui/multi_select_dropdown_component_controller\"\napplication.register(\"ui--multi-select-dropdown-component\", Ui__MultiSelectDropdownComponentController)\n\nimport Ui__RadioGroupComponentController from \"./ui/radio_group_component_controller\"\napplication.register(\"ui--radio-group-component\", Ui__RadioGroupComponentController)\n\nimport Ui__TabsComponentController from \"./ui/tabs_component_controller\"\napplication.register(\"ui--tabs-component\", Ui__TabsComponentController)\n\nimport Video__ClipComponentController from \"./video/clip_component_controller\"\napplication.register(\"video--clip-component\", Video__ClipComponentController)\n\nimport Video__ClipEditComponentController from \"./video/clip_edit_component_controller\"\napplication.register(\"video--clip-edit-component\", Video__ClipEditComponentController)\n\nimport Video__ClipResultComponentController from \"./video/clip_result_component_controller\"\napplication.register(\"video--clip-result-component\", Video__ClipResultComponentController)\n\nimport Video__Clips__LocationFilterGridController from \"./video/clips/location_filter_grid_controller\"\napplication.register(\"video--clips--location-filter-grid\", Video__Clips__LocationFilterGridController)\n\nimport Video__Clips__ShotOriginFilterController from \"./video/clips/shot_origin_filter_controller\"\napplication.register(\"video--clips--shot-origin-filter\", Video__Clips__ShotOriginFilterController)\n\nimport Video__ClipsFilterController from \"./video/clips_filter_controller\"\napplication.register(\"video--clips-filter\", Video__ClipsFilterController)\n\nimport Video__ClipsSelectionController from \"./video/clips_selection_controller\"\napplication.register(\"video--clips-selection\", Video__ClipsSelectionController)\n\nimport Video__CompilationClipItemComponentController from \"./video/compilation_clip_item_component_controller\"\napplication.register(\"video--compilation-clip-item-component\", Video__CompilationClipItemComponentController)\n\nimport Video__CompilationComponentController from \"./video/compilation_component_controller\"\napplication.register(\"video--compilation-component\", Video__CompilationComponentController)\n\nimport Video__CompilationPlayerComponentController from \"./video/compilation_player_component_controller\"\napplication.register(\"video--compilation-player-component\", Video__CompilationPlayerComponentController)\n\nimport Video__FeedClipComponentController from \"./video/feed_clip_component_controller\"\napplication.register(\"video--feed-clip-component\", Video__FeedClipComponentController)\n\nimport Video__FeedCollectionComponentController from \"./video/feed_collection_component_controller\"\napplication.register(\"video--feed-collection-component\", Video__FeedCollectionComponentController)\n\nimport Video__FeedComponentController from \"./video/feed_component_controller\"\napplication.register(\"video--feed-component\", Video__FeedComponentController)\n\nimport Video__FeedPlayerComponentController from \"./video/feed_player_component_controller\"\napplication.register(\"video--feed-player-component\", Video__FeedPlayerComponentController)\n\nimport Video__FeedSeekerComponentController from \"./video/feed_seeker_component_controller\"\napplication.register(\"video--feed-seeker-component\", Video__FeedSeekerComponentController)\n\nimport Video__PlayerCollectionComponentController from \"./video/player_collection_component_controller\"\napplication.register(\"video--player-collection-component\", Video__PlayerCollectionComponentController)\n\nimport Video__PlayerComponentController from \"./video/player_component_controller\"\napplication.register(\"video--player-component\", Video__PlayerComponentController)\n\nimport Video__StudioComponentController from \"./video/studio_component_controller\"\napplication.register(\"video--studio-component\", Video__StudioComponentController)\n\nimport Video__StudioController from \"./video/studio_controller\"\napplication.register(\"video--studio\", Video__StudioController)\n", "// Entry point for the build script in your package.json\nimport \"@hotwired/turbo-rails\"\nimport { Turbo } from \"@hotwired/turbo-rails\"\nimport \"./controllers\"\nimport \"trix\"\nimport \"@rails/actiontext\"\n\nimport {enter, leave, toggle} from 'el-transition'\n\n// Custom Turbo Stream action: navigates the full page, breaking out of any turbo-frame.\n// Usage: turbo_stream.action(:redirect, url)\nTurbo.StreamActions.redirect = function() {\n  Turbo.visit(this.getAttribute(\"target\"))\n}\n", "import { DirectUpload } from \"@rails/activestorage\"\n\nexport class AttachmentUpload {\n  constructor(attachment, element) {\n    this.attachment = attachment\n    this.element = element\n    this.directUpload = new DirectUpload(attachment.file, this.directUploadUrl, this)\n  }\n\n  start() {\n    this.directUpload.create(this.directUploadDidComplete.bind(this))\n  }\n\n  directUploadWillStoreFileWithXHR(xhr) {\n    xhr.upload.addEventListener(\"progress\", event => {\n      const progress = event.loaded / event.total * 100\n      this.attachment.setUploadProgress(progress)\n    })\n  }\n\n  directUploadDidComplete(error, attributes) {\n    if (error) {\n      throw new Error(`Direct upload failed: ${error}`)\n    }\n\n    this.attachment.setAttributes({\n      sgid: attributes.attachable_sgid,\n      url: this.createBlobUrl(attributes.signed_id, attributes.filename)\n    })\n  }\n\n  createBlobUrl(signedId, filename) {\n    return this.blobUrlTemplate\n      .replace(\":signed_id\", signedId)\n      .replace(\":filename\", encodeURIComponent(filename))\n  }\n\n  get directUploadUrl() {\n    return this.element.dataset.directUploadUrl\n  }\n\n  get blobUrlTemplate() {\n    return this.element.dataset.blobUrlTemplate\n  }\n}\n", "import { AttachmentUpload } from \"./attachment_upload\"\n\naddEventListener(\"trix-attachment-add\", event => {\n  const { attachment, target } = event\n\n  if (attachment.file) {\n    const upload = new AttachmentUpload(attachment, target)\n    upload.start()\n  }\n})\n"],
  "mappings": "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",
  "names": []
}
