Subversion Repository Public Repository

Nextrek

Diff Revisions 1085 vs 1086 for /s2s/data/310BAD46K234CA48DBSABF0EE1601511F062.json

Diff revisions: vs.
  @@ -6,10 +6,10 @@
6 6 "name": "Component_MessageBehavior",
7 7 "type": "game_script",
8 8 "order": 12,
9 - "content": "# ===================================================================\n#\n# Script: Component_MessageBehavior\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\n###*\n* An enumeration of game message modes.\n*\n* ADV - Adventure Mode\n* NVL - Novel Mode\n*\n* @typedef MessageMode\n* @memberof vn\n###\nclass MessageMode\n @ADV = 0\n @NVL = 1\n \nvn.MessageMode = MessageMode\n\n\nclass Component_MessageBehavior extends gs.Component\n @objectCodecBlackList = [\"onMessageWaiting\", \"onMessageFinish\"]\n \n ###*\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n ###\n onDataBundleRestore: (data, context) ->\n @tempSettings = GameManager.tempSettings\n @setupEventHandlers()\n \n ###*\n * A behavior-component to define the behavior of a game-message.\n *\n * @module vn\n * @class Component_MessageBehavior\n * @extends gs.Component\n * @memberof vn\n * @constructor\n ###\n constructor: ->\n ###*\n * Reference to game settings.\n * @property settings\n * @type Object\n * @protected\n ###\n @settings = GameManager.settings\n ###*\n * Reference to temporary game settings.\n * @property settings\n * @type Object\n * @protected\n ###\n @tempSettings = GameManager.tempSettings\n \n ###*\n * Indicates if the message is currently waiting.\n * @property isWaiting\n * @type boolean\n * @readOnly\n ###\n @isWaiting = no\n \n ###*\n * Indicates if the message is currently running.\n * @property isRunning\n * @type boolean\n * @readOnly\n ###\n @isRunning = no\n \n ###*\n * Indicates if a voice is currently playing together with the message.\n * @property isVoicePlaying\n * @type boolean\n * @readOnly\n ###\n @isVoicePlaying = no\n \n ###*\n * Current message caret/cursor position.\n * @property caretPosition\n * @type gs.Point\n * @readOnly\n ###\n @caretPosition = new gs.Point(0, 0)\n \n ###*\n * Current raw message text.\n * @property message\n * @type string\n * @readOnly\n ###\n @message = \"\"\n \n ###*\n * All currently displayed raw messages.\n * @property messages\n * @type string[]\n * @readOnly\n ###\n @messages = []\n \n ###*\n * Voice associated with the current message.\n * @property voice\n * @type gs.AudioBufferReference\n ###\n @voice = null\n \n ###*\n * Indicates if current message is partial. DEPRECATED. Please do not use.\n * @property partial\n * @deprecated\n * @type boolean\n * @readOnly\n ###\n @partial = no\n \n ###*\n * Indicates if the message is currently waiting in live-preview.\n * @property waitingPreview\n * @type boolean\n * @readOnly\n ###\n @waitingPreview = no\n \n ###*\n * Indicates if the auto-message is enabled.\n * @property autoMessageEnabled\n * @type boolean\n * @readOnly\n ###\n @autoMessageEnabled = no\n \n @onMessageFinish = (sender) =>\n @object.events.emit \"finish\", this\n \n if @object.settings.autoErase or @object.settings.paragraphSpacing > 0\n @message = \"\"\n \n @onMessageWaiting = (sender) =>\n if !@object.textRenderer.isBatched() or !@object.textRenderer.isBatchInProgress()\n @object.textRenderer.waitAtEnd = !@partial\n @object.events.emit \"waiting\", this\n ###*\n * Adds event-handlers\n *\n * @method setupEventHandlers\n ### \n setupEventHandlers: ->\n @object.events.offByOwner(\"messageFinish\", this)\n @object.events.offByOwner(\"messageWaiting\", this)\n \n @object.events.on \"messageFinish\", gs.CallBack(\"onMessageFinish\", this), null, this\n @object.events.on \"messageWaiting\", gs.CallBack(\"onMessageWaiting\", this), null, this\n \n gs.GlobalEventManager.offByOwner(\"previewWaiting\", this)\n gs.GlobalEventManager.offByOwner(\"previewRestart\", this)\n \n gs.GlobalEventManager.on \"previewWaiting\", ((sender) =>\n @waitingPreview = yes\n ), null, this\n \n gs.GlobalEventManager.on \"previewRestart\", ((sender) =>\n @waitingPreview = no\n ), null, this\n \n ###*\n * Setup the component. Adds event handlers.\n *\n * @method setup\n ###\n setup: ->\n @setupEventHandlers()\n \n ###*\n * Disposes the component.\n *\n * @method toDataBundle\n ### \n dispose: ->\n super\n \n gs.GlobalEventManager.offByOwner(\"previewWaiting\", this)\n gs.GlobalEventManager.offByOwner(\"previewRestart\", this)\n \n ###*\n * Not implemented yet.\n *\n * @method toDataBundle\n ###\n toDataBundle: ->\n ###*\n * Not implemented yet.\n *\n * @method restore\n * @param {Object} bundle - A data bundle.\n ### \n restore: (bundle) ->\n \n ###*\n * Action to show a game message.\n *\n * @method showMessage\n * @param {Object} sender - The sender of this action.\n * @param {Object} params - An object containing the necessary parameters.\n ###\n showMessage: (sender, params) ->\n gs.GameNotifier.postContextChange(lcsm(params.message))\n \n @partial = params.partial\n @message += lcsm(params.message)\n @addMessage(params.message, RecordManager.characters[params.characterId], @object.messages.length > 0 and @object.settings.paragraphSpacing > 0, !@partial)\n \n if @object.textRenderer.isBatched()\n @object.textRenderer.waitAtEnd = yes\n else\n @object.textRenderer.waitAtEnd = !@partial\n \n \n ###*\n * Deprecated. Not longer used.\n *\n * @method updateBitmap\n ###\n updateBitmap: ->\n if !@object.bitmap or @object.bitmap.width != @object.dstRect.width or @object.bitmap.height != @object.dstRect.height\n @object.bitmap?.dispose()\n @object.bitmap = new Bitmap(@object.dstRect.width, @object.dstRect.height)\n @object.bitmap.font = @object.font\n \n ###*\n * Restores a NVL game message of an array of message-objects. That is\n * necessary to restore a NVL game message from a save-game.\n *\n * @method restoreMessages\n * @param {Array} messages - An array of messages to restore.\n ###\n restoreMessages: (messages) ->\n @updateBitmap()\n @clear()\n \n @object.opacity = 255\n @object.srcRect = new Rect(0, 0, @object.dstRect.width, @object.dstRect.height)\n \n for message in messages\n @object.font.color = new Color(message.character?.textColor || Color.WHITE)\n @object.textRenderer.drawFormattedTextImmediately(0, 0, @object.dstRect.width, @object.dstRect.height, lcsm(message.text ? message), yes)\n\n return null\n \n ###*\n * Adds a new message.\n * \n * @method addMessage\n * @param {string} message - The message.\n * @param {Object} character - Database-Record of a character.\n * @param {boolean} newLine - Indicates if the message should make a line break.\n ###\n addMessage: (message, character, newLine, waitAtEnd) ->\n @object.textRenderer.partialMessage = null\n @object.offset = x: 0, y: 0\n @object.visible = yes\n \n @object.messages.push({ text: message, character: character})\n \n @object.textRenderer.waitAtEnd = waitAtEnd\n if not @object.settings.autoErase\n @object.textRenderer.currentY += @object.settings.paragraphSpacing\n if newLine\n @object.textRenderer.newLine()\n @updateBitmap()\n \n if character? and @object.settings.useCharacterColor\n @object.font.color = new Color(character?.textColor || Color.WHITE)\n \n @object.opacity = 255\n @object.srcRect = new Rect(0, 0, @object.dstRect.width, @object.dstRect.height)\n \n @update()\n @object.textRenderer.drawFormattedText(0, 0, @object.dstRect.width, @object.dstRect.height, message, yes)\n\n ###*\n * Clears the game message by deleting/clearing all messages.\n *\n * @method clear\n ###\n clear: -> \n @object.textRenderer.clear()\n @object.messages = []\n @message = \"\"\n \n ###*\n * Closes the game message by making it invisible.\n *\n * @method close\n ###\n close: -> \n @object.visible = no\n \n ###*\n * Gets the duration of an associated voice or 0 if no voice is associated.\n *\n * @method voiceDuration\n * @return {number} The duration in frames.\n ###\n voiceDuration: ->\n duration = 0\n if @voice? and (@settings.autoMessage.waitForVoice or @settings.timeMessageToVoice)\n duration = Math.round((@voice.source.buffer.duration * (1.0 / @voice.source.playbackRate.value)) * 1000 / 16.6)\n else\n duration = 0\n \n return if @tempSettings.skip then 1 else duration\n \n ###*\n * Gets the duration of rendering the game-message.\n *\n * @method messageDuration\n * @return {number} The duration in frames.\n ###\n messageDuration: -> \n duration = @object.textRenderer.calculateDuration()\n \n return if @tempSettings.skip then 1 else duration\n \n ###*\n * Gets the time between two messages in auto-read mode.\n *\n * @method autoMessageTime\n * @return {number} The time in frames.\n ###\n autoMessageTime: -> \n if @tempSettings.skip\n return 1\n else\n return Math.max(Math.round(@settings.autoMessage.time * Graphics.frameRate), @voiceDuration() - @messageDuration())\n \n ###*\n * Gets the current message speed.\n *\n * @method messageSpeed\n * @return {number} The message speed.\n ###\n messageSpeed: -> Math.max(11 - Math.round(GameManager.settings.messageSpeed * 2.5), 0)\n \n ###*\n * Checks if a mouse-button or key was pressed to continue with the message-rendering.\n *\n * @method actionTrigger\n * @return {boolean} If true, the an action-button or action-key is pressed.\n ###\n actionTrigger: -> (gs.ObjectManager.current.input and @object.visible and @object.dstRect.contains(Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y) and Input.Mouse.buttons[Input.Mouse.LEFT] == 2) or Input.trigger(Input.C)\n \n finish: ->\n #@object.character = null\n \n if @object.voice? and GameManager.settings.skipVoiceOnAction\n AudioManager.stopSound(@object.voice.name)\n \n erase: ->\n fading = GameManager.tempSettings.messageFading\n duration = if GameManager.tempSettings.skip then 0 else fading.duration\n \n @object.animator.disappear(fading.animation, fading.easing, duration, =>\n SceneManager.scene.currentCharacter = { name: \"\" }\n @clear()\n @object.visible = no\n )\n \n ###*\n * FIXME: Deprecated? It is also a re-definition of gs.Component_Visual.updateOrigin.\n *\n * @method updateOrigin\n ###\n updateOrigin: ->\n ox = 0\n oy = 0\n if @object.parent? and @object.parent.dstRect?\n p = @object.parent\n while p? and p.dstRect?\n ox += p.dstRect.x\n oy += p.dstRect.y\n p = p.parent\n \n @object.origin.x = ox\n @object.origin.y = oy\n \n ###*\n * Updates the object. \n *\n * @method updateObject\n * @private\n ###\n updateObject: ->\n @updateOrigin()\n \n if @tempSettings.skip and not @waitingPreview\n @object.textRenderer.isWaiting = no\n \n ###*\n * Updates the message.\n *\n * @method updateMessage\n * @private\n ###\n updateMessage: ->\n @caretPosition = @object.textRenderer.caretPosition\n \n if @tempSettings.skip and (@settings.allowSkipUnreadMessages or GameManager.globalData.messages[@message]?.read)\n @object.textRenderer.drawImmediately = yes\n @object.textRenderer.waitAtEnd = @waitingPreview\n @object.textRenderer.waitAtEndTime = 0\n else\n #@object.textRenderer.drawImmediately = no\n @updateSpeed()\n @updateAutoMessage()\n \n ###*\n * Updates the speed of the message. That depends on game-settings if a message\n * is timed to its voice or not.\n *\n * @method updateSpeed\n * @private\n ###\n updateSpeed: ->\n voiceDuration = @voiceDuration()\n if voiceDuration > 0 and @settings.timeMessageToVoice\n @object.textRenderer.speed = voiceDuration / @message.length\n else\n @object.textRenderer.speed = @messageSpeed()\n \n ###*\n * Update auto-read mode.\n *\n * @method updateAutoMessage\n * @private\n ###\n updateAutoMessage: ->\n if @settings.autoMessage.stopOnAction and @actionTrigger()\n @settings.autoMessage.enabled = no\n \n if @settings.autoMessage.enabled and not @partial\n if @object.textRenderer.waitAtEnd\n @object.textRenderer.isWaiting = no\n @object.textRenderer.waitAtEndTime = @autoMessageTime()\n @object.textRenderer.waitAtEnd = no\n else if @autoMessageEnabled != @settings.autoMessage.enabled\n @object.textRenderer.waitAtEnd = yes\n @object.textRenderer.waitAtEndTime = 0\n \n @autoMessageEnabled = @settings.autoMessage.enabled\n \n ###\n * Updates the game message behavior\n *\n * @method update\n ###\n update: ->\n @object.needsUpdate = yes\n @updateObject()\n @updateMessage()\n \n if @character != @object.character \n gs.GlobalEventManager.emit(\"talkingEnded\", this, character: @character)\n @character = @object.character\n \n if @object.textRenderer.isWaiting != @isWaiting or @object.textRenderer.isRunning != @isRunning or (@voice?.playing && (!@object.character?.timeTalkingToVoiceVolume or @voice.averageVolume > @object.character.talkingVolume)) != @isVoicePlaying\n @isWaiting = @object.textRenderer.isWaiting\n @isRunning = @object.textRenderer.isRunning\n @isVoicePlaying = (@voice?.playing && (!@object.character?.timeTalkingToVoiceVolume or @voice.averageVolume > @object.character.talkingVolume))\n \n if not @tempSettings.skip\n if @voice?.playing\n if not @isVoicePlaying\n gs.GlobalEventManager.emit(\"talkingEnded\", this, character: @object.character)\n else\n gs.GlobalEventManager.emit(\"talkingStarted\", this, character: @object.character)\n else\n if @isWaiting\n gs.GlobalEventManager.emit(\"talkingEnded\", this, character: @object.character)\n else if @isRunning\n gs.GlobalEventManager.emit(\"talkingStarted\", this, character: @object.character)\n \n if @object.layoutRect? and @object.parent?.dstRect?\n if @object.layoutRect.x then @object.dstRect.x = @object.layoutRect.x(@object.parent.dstRect.width)\n if @object.layoutRect.y then @object.dstRect.y = @object.layoutRect.y(@object.parent.dstRect.height)\n if @object.layoutRect.width then @object.dstRect.width = @object.layoutRect.width(@object.parent.dstRect.width)\n if @object.layoutRect.height then @object.dstRect.height = @object.layoutRect.height(@object.parent.dstRect.height)\nvn.Component_MessageBehavior = Component_MessageBehavior",
9 + "content": "# ===================================================================\n#\n# Script: Component_MessageBehavior\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\n###*\n* An enumeration of game message modes.\n*\n* ADV - Adventure Mode\n* NVL - Novel Mode\n*\n* @typedef MessageMode\n* @memberof vn\n###\nclass MessageMode\n @ADV = 0\n @NVL = 1\n \nvn.MessageMode = MessageMode\n\n\nclass Component_MessageBehavior extends gs.Component\n @objectCodecBlackList = [\"onMessageWaiting\", \"onMessageFinish\"]\n \n ###*\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n ###\n onDataBundleRestore: (data, context) ->\n @tempSettings = GameManager.tempSettings\n @setupEventHandlers()\n \n ###*\n * A behavior-component to define the behavior of a game-message.\n *\n * @module vn\n * @class Component_MessageBehavior\n * @extends gs.Component\n * @memberof vn\n * @constructor\n ###\n constructor: ->\n ###*\n * Reference to temporary game settings.\n * @property settings\n * @type Object\n * @protected\n ###\n @tempSettings = GameManager.tempSettings\n \n ###*\n * Indicates if the message is currently waiting.\n * @property isWaiting\n * @type boolean\n * @readOnly\n ###\n @isWaiting = no\n \n ###*\n * Indicates if the message is currently running.\n * @property isRunning\n * @type boolean\n * @readOnly\n ###\n @isRunning = no\n \n ###*\n * Indicates if a voice is currently playing together with the message.\n * @property isVoicePlaying\n * @type boolean\n * @readOnly\n ###\n @isVoicePlaying = no\n \n ###*\n * Current message caret/cursor position.\n * @property caretPosition\n * @type gs.Point\n * @readOnly\n ###\n @caretPosition = new gs.Point(0, 0)\n \n ###*\n * Current raw message text.\n * @property message\n * @type string\n * @readOnly\n ###\n @message = \"\"\n \n ###*\n * All currently displayed raw messages.\n * @property messages\n * @type string[]\n * @readOnly\n ###\n @messages = []\n \n ###*\n * Voice associated with the current message.\n * @property voice\n * @type gs.AudioBufferReference\n ###\n @voice = null\n \n ###*\n * Indicates if current message is partial. DEPRECATED. Please do not use.\n * @property partial\n * @deprecated\n * @type boolean\n * @readOnly\n ###\n @partial = no\n \n ###*\n * Indicates if the message is currently waiting in live-preview.\n * @property waitingPreview\n * @type boolean\n * @readOnly\n ###\n @waitingPreview = no\n \n ###*\n * Indicates if the auto-message is enabled.\n * @property autoMessageEnabled\n * @type boolean\n * @readOnly\n ###\n @autoMessageEnabled = no\n \n @onMessageFinish = (sender) =>\n @object.events.emit \"finish\", this\n \n if @object.settings.autoErase or @object.settings.paragraphSpacing > 0\n @message = \"\"\n \n @onMessageWaiting = (sender) =>\n if !@object.textRenderer.isBatched() or !@object.textRenderer.isBatchInProgress()\n @object.textRenderer.waitAtEnd = !@partial\n @object.events.emit \"waiting\", this\n \n ###*\n * Reference to game settings.\n * @property settings\n * @type Object\n * @protected\n ###\n @accessors \"settings\", get: -> GameManager.settings\n \n ###*\n * Adds event-handlers\n *\n * @method setupEventHandlers\n ### \n setupEventHandlers: ->\n @object.events.offByOwner(\"messageFinish\", this)\n @object.events.offByOwner(\"messageWaiting\", this)\n \n @object.events.on \"messageFinish\", gs.CallBack(\"onMessageFinish\", this), null, this\n @object.events.on \"messageWaiting\", gs.CallBack(\"onMessageWaiting\", this), null, this\n \n gs.GlobalEventManager.offByOwner(\"previewWaiting\", this)\n gs.GlobalEventManager.offByOwner(\"previewRestart\", this)\n \n gs.GlobalEventManager.on \"previewWaiting\", ((sender) =>\n @waitingPreview = yes\n ), null, this\n \n gs.GlobalEventManager.on \"previewRestart\", ((sender) =>\n @waitingPreview = no\n ), null, this\n \n ###*\n * Setup the component. Adds event handlers.\n *\n * @method setup\n ###\n setup: ->\n @setupEventHandlers()\n \n ###*\n * Disposes the component.\n *\n * @method toDataBundle\n ### \n dispose: ->\n super\n \n gs.GlobalEventManager.offByOwner(\"previewWaiting\", this)\n gs.GlobalEventManager.offByOwner(\"previewRestart\", this)\n \n ###*\n * Not implemented yet.\n *\n * @method toDataBundle\n ###\n toDataBundle: ->\n ###*\n * Not implemented yet.\n *\n * @method restore\n * @param {Object} bundle - A data bundle.\n ### \n restore: (bundle) ->\n \n ###*\n * Action to show a game message.\n *\n * @method showMessage\n * @param {Object} sender - The sender of this action.\n * @param {Object} params - An object containing the necessary parameters.\n ###\n showMessage: (sender, params) ->\n gs.GameNotifier.postContextChange(lcsm(params.message))\n \n @partial = params.partial\n @message += lcsm(params.message)\n @addMessage(params.message, RecordManager.characters[params.characterId], @object.messages.length > 0 and @object.settings.paragraphSpacing > 0, !@partial)\n \n if @object.textRenderer.isBatched()\n @object.textRenderer.waitAtEnd = yes\n else\n @object.textRenderer.waitAtEnd = !@partial\n \n \n ###*\n * Deprecated. Not longer used.\n *\n * @method updateBitmap\n ###\n updateBitmap: ->\n if !@object.bitmap or @object.bitmap.width != @object.dstRect.width or @object.bitmap.height != @object.dstRect.height\n @object.bitmap?.dispose()\n @object.bitmap = new Bitmap(@object.dstRect.width, @object.dstRect.height)\n @object.bitmap.font = @object.font\n \n ###*\n * Restores a NVL game message of an array of message-objects. That is\n * necessary to restore a NVL game message from a save-game.\n *\n * @method restoreMessages\n * @param {Array} messages - An array of messages to restore.\n ###\n restoreMessages: (messages) ->\n @updateBitmap()\n @clear()\n \n @object.opacity = 255\n @object.srcRect = new Rect(0, 0, @object.dstRect.width, @object.dstRect.height)\n \n for message in messages\n @object.font.color = new Color(message.character?.textColor || Color.WHITE)\n @object.textRenderer.drawFormattedTextImmediately(0, 0, @object.dstRect.width, @object.dstRect.height, lcsm(message.text ? message), yes)\n\n return null\n \n ###*\n * Adds a new message.\n * \n * @method addMessage\n * @param {string} message - The message.\n * @param {Object} character - Database-Record of a character.\n * @param {boolean} newLine - Indicates if the message should make a line break.\n ###\n addMessage: (message, character, newLine, waitAtEnd) ->\n @object.textRenderer.partialMessage = null\n @object.offset = x: 0, y: 0\n @object.visible = yes\n \n @object.messages.push({ text: message, character: character})\n \n @object.textRenderer.waitAtEnd = waitAtEnd\n if not @object.settings.autoErase\n @object.textRenderer.currentY += @object.settings.paragraphSpacing\n if newLine\n @object.textRenderer.newLine()\n @updateBitmap()\n \n if character? and @object.settings.useCharacterColor\n @object.font.color = new Color(character?.textColor || Color.WHITE)\n \n @object.opacity = 255\n @object.srcRect = new Rect(0, 0, @object.dstRect.width, @object.dstRect.height)\n \n @update()\n @object.textRenderer.drawFormattedText(0, 0, @object.dstRect.width, @object.dstRect.height, message, yes)\n\n ###*\n * Clears the game message by deleting/clearing all messages.\n *\n * @method clear\n ###\n clear: -> \n @object.textRenderer.clear()\n @object.messages = []\n @message = \"\"\n \n ###*\n * Closes the game message by making it invisible.\n *\n * @method close\n ###\n close: -> \n @object.visible = no\n \n ###*\n * Gets the duration of an associated voice or 0 if no voice is associated.\n *\n * @method voiceDuration\n * @return {number} The duration in frames.\n ###\n voiceDuration: ->\n duration = 0\n if @voice? and (@settings.autoMessage.waitForVoice or @settings.timeMessageToVoice)\n duration = Math.round((@voice.source.buffer.duration * (1.0 / @voice.source.playbackRate.value)) * 1000 / 16.6)\n else\n duration = 0\n \n return if @tempSettings.skip then 1 else duration\n \n ###*\n * Gets the duration of rendering the game-message.\n *\n * @method messageDuration\n * @return {number} The duration in frames.\n ###\n messageDuration: -> \n duration = @object.textRenderer.calculateDuration()\n \n return if @tempSettings.skip then 1 else duration\n \n ###*\n * Gets the time between two messages in auto-read mode.\n *\n * @method autoMessageTime\n * @return {number} The time in frames.\n ###\n autoMessageTime: -> \n if @tempSettings.skip\n return 1\n else\n return Math.max(Math.round(@settings.autoMessage.time * Graphics.frameRate), @voiceDuration() - @messageDuration())\n \n ###*\n * Gets the current message speed.\n *\n * @method messageSpeed\n * @return {number} The message speed.\n ###\n messageSpeed: -> Math.max(11 - Math.round(GameManager.settings.messageSpeed * 2.5), 0)\n \n ###*\n * Checks if a mouse-button or key was pressed to continue with the message-rendering.\n *\n * @method actionTrigger\n * @return {boolean} If true, the an action-button or action-key is pressed.\n ###\n actionTrigger: -> (gs.ObjectManager.current.input and @object.visible and @object.dstRect.contains(Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y) and Input.Mouse.buttons[Input.Mouse.LEFT] == 2) or Input.trigger(Input.C)\n \n finish: ->\n #@object.character = null\n \n if @object.voice? and GameManager.settings.skipVoiceOnAction\n AudioManager.stopSound(@object.voice.name)\n \n erase: ->\n fading = GameManager.tempSettings.messageFading\n duration = if GameManager.tempSettings.skip then 0 else fading.duration\n \n @object.animator.disappear(fading.animation, fading.easing, duration, =>\n SceneManager.scene.currentCharacter = { name: \"\" }\n @clear()\n @object.visible = no\n )\n \n ###*\n * FIXME: Deprecated? It is also a re-definition of gs.Component_Visual.updateOrigin.\n *\n * @method updateOrigin\n ###\n updateOrigin: ->\n ox = 0\n oy = 0\n if @object.parent? and @object.parent.dstRect?\n p = @object.parent\n while p? and p.dstRect?\n ox += p.dstRect.x\n oy += p.dstRect.y\n p = p.parent\n \n @object.origin.x = ox\n @object.origin.y = oy\n \n ###*\n * Updates the object. \n *\n * @method updateObject\n * @private\n ###\n updateObject: ->\n @updateOrigin()\n \n if @tempSettings.skip and not @waitingPreview\n @object.textRenderer.isWaiting = no\n \n ###*\n * Updates the message.\n *\n * @method updateMessage\n * @private\n ###\n updateMessage: ->\n @caretPosition = @object.textRenderer.caretPosition\n \n if @tempSettings.skip and (@settings.allowSkipUnreadMessages or GameManager.globalData.messages[@message]?.read)\n @object.textRenderer.drawImmediately = yes\n @object.textRenderer.waitAtEnd = @waitingPreview\n @object.textRenderer.waitAtEndTime = 0\n else\n #@object.textRenderer.drawImmediately = no\n @updateSpeed()\n @updateAutoMessage()\n \n ###*\n * Updates the speed of the message. That depends on game-settings if a message\n * is timed to its voice or not.\n *\n * @method updateSpeed\n * @private\n ###\n updateSpeed: ->\n voiceDuration = @voiceDuration()\n if voiceDuration > 0 and @settings.timeMessageToVoice\n @object.textRenderer.speed = voiceDuration / @message.length\n else\n @object.textRenderer.speed = @messageSpeed()\n \n ###*\n * Update auto-read mode.\n *\n * @method updateAutoMessage\n * @private\n ###\n updateAutoMessage: ->\n if @settings.autoMessage.stopOnAction and @actionTrigger()\n @settings.autoMessage.enabled = no\n \n if @settings.autoMessage.enabled and not @partial\n if @object.textRenderer.waitAtEnd\n @object.textRenderer.isWaiting = no\n @object.textRenderer.waitAtEndTime = @autoMessageTime()\n @object.textRenderer.waitAtEnd = no\n else if @autoMessageEnabled != @settings.autoMessage.enabled\n @object.textRenderer.waitAtEnd = yes\n @object.textRenderer.waitAtEndTime = 0\n \n @autoMessageEnabled = @settings.autoMessage.enabled\n \n ###\n * Updates the game message behavior\n *\n * @method update\n ###\n update: ->\n @object.needsUpdate = yes\n @updateObject()\n @updateMessage()\n \n if @character != @object.character \n gs.GlobalEventManager.emit(\"talkingEnded\", this, character: @character)\n @character = @object.character\n \n if @object.textRenderer.isWaiting != @isWaiting or @object.textRenderer.isRunning != @isRunning or (@voice?.playing && (!@object.character?.timeTalkingToVoiceVolume or @voice.averageVolume > @object.character.talkingVolume)) != @isVoicePlaying\n @isWaiting = @object.textRenderer.isWaiting\n @isRunning = @object.textRenderer.isRunning\n @isVoicePlaying = (@voice?.playing && (!@object.character?.timeTalkingToVoiceVolume or @voice.averageVolume > @object.character.talkingVolume))\n \n if not @tempSettings.skip\n if @voice?.playing\n if not @isVoicePlaying\n gs.GlobalEventManager.emit(\"talkingEnded\", this, character: @object.character)\n else\n gs.GlobalEventManager.emit(\"talkingStarted\", this, character: @object.character)\n else\n if @isWaiting\n gs.GlobalEventManager.emit(\"talkingEnded\", this, character: @object.character)\n else if @isRunning\n gs.GlobalEventManager.emit(\"talkingStarted\", this, character: @object.character)\n \n if @object.layoutRect? and @object.parent?.dstRect?\n if @object.layoutRect.x then @object.dstRect.x = @object.layoutRect.x(@object.parent.dstRect.width)\n if @object.layoutRect.y then @object.dstRect.y = @object.layoutRect.y(@object.parent.dstRect.height)\n if @object.layoutRect.width then @object.dstRect.width = @object.layoutRect.width(@object.parent.dstRect.width)\n if @object.layoutRect.height then @object.dstRect.height = @object.layoutRect.height(@object.parent.dstRect.height)\nvn.Component_MessageBehavior = Component_MessageBehavior",
10 10 "parentId": "D3325122KACDEA4515SB731E37A42B9D779F",
11 11 "folder": false,
12 - "compiledContent": "\n/**\n* An enumeration of game message modes.\n*\n* ADV - Adventure Mode\n* NVL - Novel Mode\n*\n* @typedef MessageMode\n* @memberof vn\n */\nvar Component_MessageBehavior, MessageMode,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nMessageMode = (function() {\n function MessageMode() {}\n\n MessageMode.ADV = 0;\n\n MessageMode.NVL = 1;\n\n return MessageMode;\n\n})();\n\nvn.MessageMode = MessageMode;\n\nComponent_MessageBehavior = (function(superClass) {\n extend(Component_MessageBehavior, superClass);\n\n Component_MessageBehavior.objectCodecBlackList = [\"onMessageWaiting\", \"onMessageFinish\"];\n\n\n /**\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n */\n\n Component_MessageBehavior.prototype.onDataBundleRestore = function(data, context) {\n this.tempSettings = GameManager.tempSettings;\n return this.setupEventHandlers();\n };\n\n\n /**\n * A behavior-component to define the behavior of a game-message.\n *\n * @module vn\n * @class Component_MessageBehavior\n * @extends gs.Component\n * @memberof vn\n * @constructor\n */\n\n function Component_MessageBehavior() {\n\n /**\n * Reference to game settings.\n * @property settings\n * @type Object\n * @protected\n */\n this.settings = GameManager.settings;\n\n /**\n * Reference to temporary game settings.\n * @property settings\n * @type Object\n * @protected\n */\n this.tempSettings = GameManager.tempSettings;\n\n /**\n * Indicates if the message is currently waiting.\n * @property isWaiting\n * @type boolean\n * @readOnly\n */\n this.isWaiting = false;\n\n /**\n * Indicates if the message is currently running.\n * @property isRunning\n * @type boolean\n * @readOnly\n */\n this.isRunning = false;\n\n /**\n * Indicates if a voice is currently playing together with the message.\n * @property isVoicePlaying\n * @type boolean\n * @readOnly\n */\n this.isVoicePlaying = false;\n\n /**\n * Current message caret/cursor position.\n * @property caretPosition\n * @type gs.Point\n * @readOnly\n */\n this.caretPosition = new gs.Point(0, 0);\n\n /**\n * Current raw message text.\n * @property message\n * @type string\n * @readOnly\n */\n this.message = \"\";\n\n /**\n * All currently displayed raw messages.\n * @property messages\n * @type string[]\n * @readOnly\n */\n this.messages = [];\n\n /**\n * Voice associated with the current message.\n * @property voice\n * @type gs.AudioBufferReference\n */\n this.voice = null;\n\n /**\n * Indicates if current message is partial. DEPRECATED. Please do not use.\n * @property partial\n * @deprecated\n * @type boolean\n * @readOnly\n */\n this.partial = false;\n\n /**\n * Indicates if the message is currently waiting in live-preview.\n * @property waitingPreview\n * @type boolean\n * @readOnly\n */\n this.waitingPreview = false;\n\n /**\n * Indicates if the auto-message is enabled.\n * @property autoMessageEnabled\n * @type boolean\n * @readOnly\n */\n this.autoMessageEnabled = false;\n this.onMessageFinish = (function(_this) {\n return function(sender) {\n _this.object.events.emit(\"finish\", _this);\n if (_this.object.settings.autoErase || _this.object.settings.paragraphSpacing > 0) {\n return _this.message = \"\";\n }\n };\n })(this);\n this.onMessageWaiting = (function(_this) {\n return function(sender) {\n if (!_this.object.textRenderer.isBatched() || !_this.object.textRenderer.isBatchInProgress()) {\n _this.object.textRenderer.waitAtEnd = !_this.partial;\n return _this.object.events.emit(\"waiting\", _this);\n }\n };\n })(this);\n }\n\n\n /**\n * Adds event-handlers\n *\n * @method setupEventHandlers\n */\n\n Component_MessageBehavior.prototype.setupEventHandlers = function() {\n this.object.events.offByOwner(\"messageFinish\", this);\n this.object.events.offByOwner(\"messageWaiting\", this);\n this.object.events.on(\"messageFinish\", gs.CallBack(\"onMessageFinish\", this), null, this);\n this.object.events.on(\"messageWaiting\", gs.CallBack(\"onMessageWaiting\", this), null, this);\n gs.GlobalEventManager.offByOwner(\"previewWaiting\", this);\n gs.GlobalEventManager.offByOwner(\"previewRestart\", this);\n gs.GlobalEventManager.on(\"previewWaiting\", ((function(_this) {\n return function(sender) {\n return _this.waitingPreview = true;\n };\n })(this)), null, this);\n return gs.GlobalEventManager.on(\"previewRestart\", ((function(_this) {\n return function(sender) {\n return _this.waitingPreview = false;\n };\n })(this)), null, this);\n };\n\n\n /**\n * Setup the component. Adds event handlers.\n *\n * @method setup\n */\n\n Component_MessageBehavior.prototype.setup = function() {\n return this.setupEventHandlers();\n };\n\n\n /**\n * Disposes the component.\n *\n * @method toDataBundle\n */\n\n Component_MessageBehavior.prototype.dispose = function() {\n Component_MessageBehavior.__super__.dispose.apply(this, arguments);\n gs.GlobalEventManager.offByOwner(\"previewWaiting\", this);\n return gs.GlobalEventManager.offByOwner(\"previewRestart\", this);\n };\n\n\n /**\n * Not implemented yet.\n *\n * @method toDataBundle\n */\n\n Component_MessageBehavior.prototype.toDataBundle = function() {};\n\n\n /**\n * Not implemented yet.\n *\n * @method restore\n * @param {Object} bundle - A data bundle.\n */\n\n Component_MessageBehavior.prototype.restore = function(bundle) {};\n\n\n /**\n * Action to show a game message.\n *\n * @method showMessage\n * @param {Object} sender - The sender of this action.\n * @param {Object} params - An object containing the necessary parameters.\n */\n\n Component_MessageBehavior.prototype.showMessage = function(sender, params) {\n gs.GameNotifier.postContextChange(lcsm(params.message));\n this.partial = params.partial;\n this.message += lcsm(params.message);\n this.addMessage(params.message, RecordManager.characters[params.characterId], this.object.messages.length > 0 && this.object.settings.paragraphSpacing > 0, !this.partial);\n if (this.object.textRenderer.isBatched()) {\n return this.object.textRenderer.waitAtEnd = true;\n } else {\n return this.object.textRenderer.waitAtEnd = !this.partial;\n }\n };\n\n\n /**\n * Deprecated. Not longer used.\n *\n * @method updateBitmap\n */\n\n Component_MessageBehavior.prototype.updateBitmap = function() {\n var ref;\n if (!this.object.bitmap || this.object.bitmap.width !== this.object.dstRect.width || this.object.bitmap.height !== this.object.dstRect.height) {\n if ((ref = this.object.bitmap) != null) {\n ref.dispose();\n }\n this.object.bitmap = new Bitmap(this.object.dstRect.width, this.object.dstRect.height);\n return this.object.bitmap.font = this.object.font;\n }\n };\n\n\n /**\n * Restores a NVL game message of an array of message-objects. That is\n * necessary to restore a NVL game message from a save-game.\n *\n * @method restoreMessages\n * @param {Array} messages - An array of messages to restore.\n */\n\n Component_MessageBehavior.prototype.restoreMessages = function(messages) {\n var i, len, message, ref, ref1;\n this.updateBitmap();\n this.clear();\n this.object.opacity = 255;\n this.object.srcRect = new Rect(0, 0, this.object.dstRect.width, this.object.dstRect.height);\n for (i = 0, len = messages.length; i < len; i++) {\n message = messages[i];\n this.object.font.color = new Color(((ref = message.character) != null ? ref.textColor : void 0) || Color.WHITE);\n this.object.textRenderer.drawFormattedTextImmediately(0, 0, this.object.dstRect.width, this.object.dstRect.height, lcsm((ref1 = message.text) != null ? ref1 : message), true);\n }\n return null;\n };\n\n\n /**\n * Adds a new message.\n * \n * @method addMessage\n * @param {string} message - The message.\n * @param {Object} character - Database-Record of a character.\n * @param {boolean} newLine - Indicates if the message should make a line break.\n */\n\n Component_MessageBehavior.prototype.addMessage = function(message, character, newLine, waitAtEnd) {\n this.object.textRenderer.partialMessage = null;\n this.object.offset = {\n x: 0,\n y: 0\n };\n this.object.visible = true;\n this.object.messages.push({\n text: message,\n character: character\n });\n this.object.textRenderer.waitAtEnd = waitAtEnd;\n if (!this.object.settings.autoErase) {\n this.object.textRenderer.currentY += this.object.settings.paragraphSpacing;\n }\n if (newLine) {\n this.object.textRenderer.newLine();\n }\n this.updateBitmap();\n if ((character != null) && this.object.settings.useCharacterColor) {\n this.object.font.color = new Color((character != null ? character.textColor : void 0) || Color.WHITE);\n }\n this.object.opacity = 255;\n this.object.srcRect = new Rect(0, 0, this.object.dstRect.width, this.object.dstRect.height);\n this.update();\n return this.object.textRenderer.drawFormattedText(0, 0, this.object.dstRect.width, this.object.dstRect.height, message, true);\n };\n\n\n /**\n * Clears the game message by deleting/clearing all messages.\n *\n * @method clear\n */\n\n Component_MessageBehavior.prototype.clear = function() {\n this.object.textRenderer.clear();\n this.object.messages = [];\n return this.message = \"\";\n };\n\n\n /**\n * Closes the game message by making it invisible.\n *\n * @method close\n */\n\n Component_MessageBehavior.prototype.close = function() {\n return this.object.visible = false;\n };\n\n\n /**\n * Gets the duration of an associated voice or 0 if no voice is associated.\n *\n * @method voiceDuration\n * @return {number} The duration in frames.\n */\n\n Component_MessageBehavior.prototype.voiceDuration = function() {\n var duration;\n duration = 0;\n if ((this.voice != null) && (this.settings.autoMessage.waitForVoice || this.settings.timeMessageToVoice)) {\n duration = Math.round((this.voice.source.buffer.duration * (1.0 / this.voice.source.playbackRate.value)) * 1000 / 16.6);\n } else {\n duration = 0;\n }\n if (this.tempSettings.skip) {\n return 1;\n } else {\n return duration;\n }\n };\n\n\n /**\n * Gets the duration of rendering the game-message.\n *\n * @method messageDuration\n * @return {number} The duration in frames.\n */\n\n Component_MessageBehavior.prototype.messageDuration = function() {\n var duration;\n duration = this.object.textRenderer.calculateDuration();\n if (this.tempSettings.skip) {\n return 1;\n } else {\n return duration;\n }\n };\n\n\n /**\n * Gets the time between two messages in auto-read mode.\n *\n * @method autoMessageTime\n * @return {number} The time in frames.\n */\n\n Component_MessageBehavior.prototype.autoMessageTime = function() {\n if (this.tempSettings.skip) {\n return 1;\n } else {\n return Math.max(Math.round(this.settings.autoMessage.time * Graphics.frameRate), this.voiceDuration() - this.messageDuration());\n }\n };\n\n\n /**\n * Gets the current message speed.\n *\n * @method messageSpeed\n * @return {number} The message speed.\n */\n\n Component_MessageBehavior.prototype.messageSpeed = function() {\n return Math.max(11 - Math.round(GameManager.settings.messageSpeed * 2.5), 0);\n };\n\n\n /**\n * Checks if a mouse-button or key was pressed to continue with the message-rendering.\n *\n * @method actionTrigger\n * @return {boolean} If true, the an action-button or action-key is pressed.\n */\n\n Component_MessageBehavior.prototype.actionTrigger = function() {\n return (gs.ObjectManager.current.input && this.object.visible && this.object.dstRect.contains(Input.Mouse.x - this.object.origin.x, Input.Mouse.y - this.object.origin.y) && Input.Mouse.buttons[Input.Mouse.LEFT] === 2) || Input.trigger(Input.C);\n };\n\n Component_MessageBehavior.prototype.finish = function() {\n if ((this.object.voice != null) && GameManager.settings.skipVoiceOnAction) {\n return AudioManager.stopSound(this.object.voice.name);\n }\n };\n\n Component_MessageBehavior.prototype.erase = function() {\n var duration, fading;\n fading = GameManager.tempSettings.messageFading;\n duration = GameManager.tempSettings.skip ? 0 : fading.duration;\n return this.object.animator.disappear(fading.animation, fading.easing, duration, (function(_this) {\n return function() {\n SceneManager.scene.currentCharacter = {\n name: \"\"\n };\n _this.clear();\n return _this.object.visible = false;\n };\n })(this));\n };\n\n\n /**\n * FIXME: Deprecated? It is also a re-definition of gs.Component_Visual.updateOrigin.\n *\n * @method updateOrigin\n */\n\n Component_MessageBehavior.prototype.updateOrigin = function() {\n var ox, oy, p;\n ox = 0;\n oy = 0;\n if ((this.object.parent != null) && (this.object.parent.dstRect != null)) {\n p = this.object.parent;\n while ((p != null) && (p.dstRect != null)) {\n ox += p.dstRect.x;\n oy += p.dstRect.y;\n p = p.parent;\n }\n }\n this.object.origin.x = ox;\n return this.object.origin.y = oy;\n };\n\n\n /**\n * Updates the object. \n *\n * @method updateObject\n * @private\n */\n\n Component_MessageBehavior.prototype.updateObject = function() {\n this.updateOrigin();\n if (this.tempSettings.skip && !this.waitingPreview) {\n return this.object.textRenderer.isWaiting = false;\n }\n };\n\n\n /**\n * Updates the message.\n *\n * @method updateMessage\n * @private\n */\n\n Component_MessageBehavior.prototype.updateMessage = function() {\n var ref;\n this.caretPosition = this.object.textRenderer.caretPosition;\n if (this.tempSettings.skip && (this.settings.allowSkipUnreadMessages || ((ref = GameManager.globalData.messages[this.message]) != null ? ref.read : void 0))) {\n this.object.textRenderer.drawImmediately = true;\n this.object.textRenderer.waitAtEnd = this.waitingPreview;\n return this.object.textRenderer.waitAtEndTime = 0;\n } else {\n this.updateSpeed();\n return this.updateAutoMessage();\n }\n };\n\n\n /**\n * Updates the speed of the message. That depends on game-settings if a message\n * is timed to its voice or not.\n *\n * @method updateSpeed\n * @private\n */\n\n Component_MessageBehavior.prototype.updateSpeed = function() {\n var voiceDuration;\n voiceDuration = this.voiceDuration();\n if (voiceDuration > 0 && this.settings.timeMessageToVoice) {\n return this.object.textRenderer.speed = voiceDuration / this.message.length;\n } else {\n return this.object.textRenderer.speed = this.messageSpeed();\n }\n };\n\n\n /**\n * Update auto-read mode.\n *\n * @method updateAutoMessage\n * @private\n */\n\n Component_MessageBehavior.prototype.updateAutoMessage = function() {\n if (this.settings.autoMessage.stopOnAction && this.actionTrigger()) {\n this.settings.autoMessage.enabled = false;\n }\n if (this.settings.autoMessage.enabled && !this.partial) {\n if (this.object.textRenderer.waitAtEnd) {\n this.object.textRenderer.isWaiting = false;\n }\n this.object.textRenderer.waitAtEndTime = this.autoMessageTime();\n this.object.textRenderer.waitAtEnd = false;\n } else if (this.autoMessageEnabled !== this.settings.autoMessage.enabled) {\n this.object.textRenderer.waitAtEnd = true;\n this.object.textRenderer.waitAtEndTime = 0;\n }\n return this.autoMessageEnabled = this.settings.autoMessage.enabled;\n };\n\n\n /*\n * Updates the game message behavior\n *\n * @method update\n */\n\n Component_MessageBehavior.prototype.update = function() {\n var ref, ref1, ref2, ref3, ref4, ref5;\n this.object.needsUpdate = true;\n this.updateObject();\n this.updateMessage();\n if (this.character !== this.object.character) {\n gs.GlobalEventManager.emit(\"talkingEnded\", this, {\n character: this.character\n });\n this.character = this.object.character;\n }\n if (this.object.textRenderer.isWaiting !== this.isWaiting || this.object.textRenderer.isRunning !== this.isRunning || (((ref = this.voice) != null ? ref.playing : void 0) && (!((ref1 = this.object.character) != null ? ref1.timeTalkingToVoiceVolume : void 0) || this.voice.averageVolume > this.object.character.talkingVolume)) !== this.isVoicePlaying) {\n this.isWaiting = this.object.textRenderer.isWaiting;\n this.isRunning = this.object.textRenderer.isRunning;\n this.isVoicePlaying = ((ref2 = this.voice) != null ? ref2.playing : void 0) && (!((ref3 = this.object.character) != null ? ref3.timeTalkingToVoiceVolume : void 0) || this.voice.averageVolume > this.object.character.talkingVolume);\n if (!this.tempSettings.skip) {\n if ((ref4 = this.voice) != null ? ref4.playing : void 0) {\n if (!this.isVoicePlaying) {\n gs.GlobalEventManager.emit(\"talkingEnded\", this, {\n character: this.object.character\n });\n } else {\n gs.GlobalEventManager.emit(\"talkingStarted\", this, {\n character: this.object.character\n });\n }\n } else {\n if (this.isWaiting) {\n gs.GlobalEventManager.emit(\"talkingEnded\", this, {\n character: this.object.character\n });\n } else if (this.isRunning) {\n gs.GlobalEventManager.emit(\"talkingStarted\", this, {\n character: this.object.character\n });\n }\n }\n }\n }\n if ((this.object.layoutRect != null) && (((ref5 = this.object.parent) != null ? ref5.dstRect : void 0) != null)) {\n if (this.object.layoutRect.x) {\n this.object.dstRect.x = this.object.layoutRect.x(this.object.parent.dstRect.width);\n }\n if (this.object.layoutRect.y) {\n this.object.dstRect.y = this.object.layoutRect.y(this.object.parent.dstRect.height);\n }\n if (this.object.layoutRect.width) {\n this.object.dstRect.width = this.object.layoutRect.width(this.object.parent.dstRect.width);\n }\n if (this.object.layoutRect.height) {\n return this.object.dstRect.height = this.object.layoutRect.height(this.object.parent.dstRect.height);\n }\n }\n };\n\n return Component_MessageBehavior;\n\n})(gs.Component);\n\nvn.Component_MessageBehavior = Component_MessageBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFPQTs7Ozs7Ozs7O0FBQUEsSUFBQSxzQ0FBQTtFQUFBOzs7QUFTTTs7O0VBQ0YsV0FBQyxDQUFBLEdBQUQsR0FBTzs7RUFDUCxXQUFDLENBQUEsR0FBRCxHQUFPOzs7Ozs7QUFFWCxFQUFFLENBQUMsV0FBSCxHQUFpQjs7QUFHWDs7O0VBQ0YseUJBQUMsQ0FBQSxvQkFBRCxHQUF3QixDQUFDLGtCQUFELEVBQXFCLGlCQUFyQjs7O0FBRXhCOzs7Ozs7Ozs7c0NBUUEsbUJBQUEsR0FBcUIsU0FBQyxJQUFELEVBQU8sT0FBUDtJQUNqQixJQUFDLENBQUEsWUFBRCxHQUFnQixXQUFXLENBQUM7V0FDNUIsSUFBQyxDQUFBLGtCQUFELENBQUE7RUFGaUI7OztBQUlyQjs7Ozs7Ozs7OztFQVNhLG1DQUFBOztBQUNUOzs7Ozs7SUFNQSxJQUFDLENBQUEsUUFBRCxHQUFZLFdBQVcsQ0FBQzs7QUFDeEI7Ozs7OztJQU1BLElBQUMsQ0FBQSxZQUFELEdBQWdCLFdBQVcsQ0FBQzs7QUFFNUI7Ozs7OztJQU1BLElBQUMsQ0FBQSxTQUFELEdBQWE7O0FBRWI7Ozs7OztJQU1BLElBQUMsQ0FBQSxTQUFELEdBQWE7O0FBRWI7Ozs7OztJQU1BLElBQUMsQ0FBQSxjQUFELEdBQWtCOztBQUVsQjs7Ozs7O0lBTUEsSUFBQyxDQUFBLGFBQUQsR0FBcUIsSUFBQSxFQUFFLENBQUMsS0FBSCxDQUFTLENBQVQsRUFBWSxDQUFaOztBQUVyQjs7Ozs7O0lBTUEsSUFBQyxDQUFBLE9BQUQsR0FBVzs7QUFFWDs7Ozs7O0lBTUEsSUFBQyxDQUFBLFFBQUQsR0FBWTs7QUFFWjs7Ozs7SUFLQSxJQUFDLENBQUEsS0FBRCxHQUFTOztBQUVUOzs7Ozs7O0lBT0EsSUFBQyxDQUFBLE9BQUQsR0FBVzs7QUFFWDs7Ozs7O0lBTUEsSUFBQyxDQUFBLGNBQUQsR0FBa0I7O0FBRWxCOzs7Ozs7SUFNQSxJQUFDLENBQUEsa0JBQUQsR0FBc0I7SUFFdEIsSUFBQyxDQUFBLGVBQUQsR0FBbUIsQ0FBQSxTQUFBLEtBQUE7YUFBQSxTQUFDLE1BQUQ7UUFDZixLQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFmLENBQW9CLFFBQXBCLEVBQThCLEtBQTlCO1FBRUEsSUFBRyxLQUFDLENBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFqQixJQUE4QixLQUFDLENBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBakIsR0FBb0MsQ0FBckU7aUJBQ0ksS0FBQyxDQUFBLE9BQUQsR0FBVyxHQURmOztNQUhlO0lBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQTtJQU1uQixJQUFDLENBQUEsZ0JBQUQsR0FBb0IsQ0FBQSxTQUFBLEtBQUE7YUFBQSxTQUFDLE1BQUQ7UUFDaEIsSUFBRyxDQUFDLEtBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXJCLENBQUEsQ0FBRCxJQUFxQyxDQUFDLEtBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLGlCQUFyQixDQUFBLENBQXpDO1VBQ0ksS0FBQyxDQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBckIsR0FBaUMsQ0FBQyxLQUFDLENBQUE7aUJBQ25DLEtBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQWYsQ0FBb0IsU0FBcEIsRUFBK0IsS0FBL0IsRUFGSjs7TUFEZ0I7SUFBQSxDQUFBLENBQUEsQ0FBQSxJQUFBO0VBdEdYOzs7QUEwR2I7Ozs7OztzQ0FLQSxrQkFBQSxHQUFvQixTQUFBO0lBQ2hCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQWYsQ0FBMEIsZUFBMUIsRUFBMkMsSUFBM0M7SUFDQSxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFmLENBQTBCLGdCQUExQixFQUE0QyxJQUE1QztJQUVBLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQWYsQ0FBa0IsZUFBbEIsRUFBbUMsRUFBRSxDQUFDLFFBQUgsQ0FBWSxpQkFBWixFQUErQixJQUEvQixDQUFuQyxFQUF5RSxJQUF6RSxFQUErRSxJQUEvRTtJQUNBLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQWYsQ0FBa0IsZ0JBQWxCLEVBQW9DLEVBQUUsQ0FBQyxRQUFILENBQVksa0JBQVosRUFBZ0MsSUFBaEMsQ0FBcEMsRUFBMkUsSUFBM0UsRUFBaUYsSUFBakY7SUFFQSxFQUFFLENBQUMsa0JBQWtCLENBQUMsVUFBdEIsQ0FBaUMsZ0JBQWpDLEVBQW1ELElBQW5EO0lBQ0EsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFVBQXRCLENBQWlDLGdCQUFqQyxFQUFtRCxJQUFuRDtJQUVBLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUF0QixDQUF5QixnQkFBekIsRUFBMkMsQ0FBQyxDQUFBLFNBQUEsS0FBQTthQUFBLFNBQUMsTUFBRDtlQUN4QyxLQUFDLENBQUEsY0FBRCxHQUFrQjtNQURzQjtJQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBRCxDQUEzQyxFQUVHLElBRkgsRUFFUyxJQUZUO1dBSUEsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQXRCLENBQXlCLGdCQUF6QixFQUEyQyxDQUFDLENBQUEsU0FBQSxLQUFBO2FBQUEsU0FBQyxNQUFEO2VBQ3hDLEtBQUMsQ0FBQSxjQUFELEdBQWtCO01BRHNCO0lBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxDQUFELENBQTNDLEVBRUcsSUFGSCxFQUVTLElBRlQ7RUFkZ0I7OztBQWtCcEI7Ozs7OztzQ0FLQSxLQUFBLEdBQU8sU0FBQTtXQUNILElBQUMsQ0FBQSxrQkFBRCxDQUFBO0VBREc7OztBQUdQOzs7Ozs7c0NBS0EsT0FBQSxHQUFTLFNBQUE7SUFDTCx3REFBQSxTQUFBO0lBRUEsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFVBQXRCLENBQWlDLGdCQUFqQyxFQUFtRCxJQUFuRDtXQUNBLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxVQUF0QixDQUFpQyxnQkFBakMsRUFBbUQsSUFBbkQ7RUFKSzs7O0FBTVQ7Ozs7OztzQ0FLQSxZQUFBLEdBQWMsU0FBQSxHQUFBOzs7QUFDZDs7Ozs7OztzQ0FNQSxPQUFBLEdBQVMsU0FBQyxNQUFELEdBQUE7OztBQUVUOzs7Ozs7OztzQ0FPQSxXQUFBLEdBQWEsU0FBQyxNQUFELEVBQVMsTUFBVDtJQUNULEVBQUUsQ0FBQyxZQUFZLENBQUMsaUJBQWhCLENBQWtDLElBQUEsQ0FBSyxNQUFNLENBQUMsT0FBWixDQUFsQztJQUVBLElBQUMsQ0FBQSxPQUFELEdBQVcsTUFBTSxDQUFDO0lBQ2xCLElBQUMsQ0FBQSxPQUFELElBQVksSUFBQSxDQUFLLE1BQU0sQ0FBQyxPQUFaO0lBQ1osSUFBQyxDQUFBLFVBQUQsQ0FBWSxNQUFNLENBQUMsT0FBbkIsRUFBNEIsYUFBYSxDQUFDLFVBQVcsQ0FBQSxNQUFNLENBQUMsV0FBUCxDQUFyRCxFQUEwRSxJQUFDLENBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFqQixHQUEwQixDQUExQixJQUFnQyxJQUFDLENBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBakIsR0FBb0MsQ0FBOUksRUFBaUosQ0FBQyxJQUFDLENBQUEsT0FBbko7SUFFQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXJCLENBQUEsQ0FBSDthQUNJLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXJCLEdBQWlDLEtBRHJDO0tBQUEsTUFBQTthQUdJLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXJCLEdBQWlDLENBQUMsSUFBQyxDQUFBLFFBSHZDOztFQVBTOzs7QUFhYjs7Ozs7O3NDQUtBLFlBQUEsR0FBYyxTQUFBO0FBQ1YsUUFBQTtJQUFBLElBQUcsQ0FBQyxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQVQsSUFBbUIsSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBZixLQUF3QixJQUFDLENBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUEzRCxJQUFvRSxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFmLEtBQXlCLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWhIOztXQUNrQixDQUFFLE9BQWhCLENBQUE7O01BQ0EsSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFSLEdBQXFCLElBQUEsTUFBQSxDQUFPLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQXZCLEVBQThCLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQTlDO2FBQ3JCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQWYsR0FBc0IsSUFBQyxDQUFBLE1BQU0sQ0FBQyxLQUhsQzs7RUFEVTs7O0FBTWQ7Ozs7Ozs7O3NDQU9BLGVBQUEsR0FBaUIsU0FBQyxRQUFEO0FBQ2IsUUFBQTtJQUFBLElBQUMsQ0FBQSxZQUFELENBQUE7SUFDQSxJQUFDLENBQUEsS0FBRCxDQUFBO0lBRUEsSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFSLEdBQWtCO0lBQ2xCLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBUixHQUFzQixJQUFBLElBQUEsQ0FBSyxDQUFMLEVBQVEsQ0FBUixFQUFXLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQTNCLEVBQWtDLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWxEO0FBRXRCLFNBQUEsMENBQUE7O01BQ0ksSUFBQyxDQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBYixHQUF5QixJQUFBLEtBQUEseUNBQXVCLENBQUUsbUJBQW5CLElBQWdDLEtBQUssQ0FBQyxLQUE1QztNQUN6QixJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyw0QkFBckIsQ0FBa0QsQ0FBbEQsRUFBcUQsQ0FBckQsRUFBd0QsSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBeEUsRUFBK0UsSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBL0YsRUFBdUcsSUFBQSx3Q0FBb0IsT0FBcEIsQ0FBdkcsRUFBcUksSUFBckk7QUFGSjtBQUlBLFdBQU87RUFYTTs7O0FBYWpCOzs7Ozs7Ozs7c0NBUUEsVUFBQSxHQUFZLFNBQUMsT0FBRCxFQUFVLFNBQVYsRUFBcUIsT0FBckIsRUFBOEIsU0FBOUI7SUFDUixJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFyQixHQUFzQztJQUN0QyxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQVIsR0FBaUI7TUFBQSxDQUFBLEVBQUcsQ0FBSDtNQUFNLENBQUEsRUFBRyxDQUFUOztJQUNqQixJQUFDLENBQUEsTUFBTSxDQUFDLE9BQVIsR0FBa0I7SUFFbEIsSUFBQyxDQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBakIsQ0FBc0I7TUFBRSxJQUFBLEVBQU0sT0FBUjtNQUFpQixTQUFBLEVBQVcsU0FBNUI7S0FBdEI7SUFFQSxJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFyQixHQUFpQztJQUNqQyxJQUFHLENBQUksSUFBQyxDQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBeEI7TUFDSSxJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFyQixJQUFpQyxJQUFDLENBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFEdEQ7O0lBRUEsSUFBRyxPQUFIO01BQ0ksSUFBQyxDQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBckIsQ0FBQSxFQURKOztJQUVBLElBQUMsQ0FBQSxZQUFELENBQUE7SUFFQSxJQUFHLG1CQUFBLElBQWUsSUFBQyxDQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQW5DO01BQ0ksSUFBQyxDQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBYixHQUF5QixJQUFBLEtBQUEsc0JBQU0sU0FBUyxDQUFFLG1CQUFYLElBQXdCLEtBQUssQ0FBQyxLQUFwQyxFQUQ3Qjs7SUFHQSxJQUFDLENBQUEsTUFBTSxDQUFDLE9BQVIsR0FBa0I7SUFDbEIsSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFSLEdBQXNCLElBQUEsSUFBQSxDQUFLLENBQUwsRUFBUSxDQUFSLEVBQVcsSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBM0IsRUFBa0MsSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBbEQ7SUFFdEIsSUFBQyxDQUFBLE1BQUQsQ0FBQTtXQUNBLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLGlCQUFyQixDQUF1QyxDQUF2QyxFQUEwQyxDQUExQyxFQUE2QyxJQUFDLENBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUE3RCxFQUFvRSxJQUFDLENBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFwRixFQUE0RixPQUE1RixFQUFxRyxJQUFyRztFQXJCUTs7O0FBdUJaOzs7Ozs7c0NBS0EsS0FBQSxHQUFPLFNBQUE7SUFDSCxJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFyQixDQUFBO0lBQ0EsSUFBQyxDQUFBLE1BQU0sQ0FBQyxRQUFSLEdBQW1CO1dBQ25CLElBQUMsQ0FBQSxPQUFELEdBQVc7RUFIUjs7O0FBS1A7Ozs7OztzQ0FLQSxLQUFBLEdBQU8sU0FBQTtXQUNILElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBUixHQUFrQjtFQURmOzs7QUFHUDs7Ozs7OztzQ0FNQSxhQUFBLEdBQWUsU0FBQTtBQUNYLFFBQUE7SUFBQSxRQUFBLEdBQVc7SUFDWCxJQUFHLG9CQUFBLElBQVksQ0FBQyxJQUFDLENBQUEsUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUF0QixJQUFzQyxJQUFDLENBQUEsUUFBUSxDQUFDLGtCQUFqRCxDQUFmO01BQ0ksUUFBQSxHQUFXLElBQUksQ0FBQyxLQUFMLENBQVcsQ0FBQyxJQUFDLENBQUEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBckIsR0FBZ0MsQ0FBQyxHQUFBLEdBQU0sSUFBQyxDQUFBLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQWxDLENBQWpDLENBQUEsR0FBNkUsSUFBN0UsR0FBb0YsSUFBL0YsRUFEZjtLQUFBLE1BQUE7TUFHSSxRQUFBLEdBQVcsRUFIZjs7SUFLTyxJQUFHLElBQUMsQ0FBQSxZQUFZLENBQUMsSUFBakI7YUFBMkIsRUFBM0I7S0FBQSxNQUFBO2FBQWtDLFNBQWxDOztFQVBJOzs7QUFTZjs7Ozs7OztzQ0FNQSxlQUFBLEdBQWlCLFNBQUE7QUFDYixRQUFBO0lBQUEsUUFBQSxHQUFXLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLGlCQUFyQixDQUFBO0lBRUosSUFBRyxJQUFDLENBQUEsWUFBWSxDQUFDLElBQWpCO2FBQTJCLEVBQTNCO0tBQUEsTUFBQTthQUFrQyxTQUFsQzs7RUFITTs7O0FBS2pCOzs7Ozs7O3NDQU1BLGVBQUEsR0FBaUIsU0FBQTtJQUNiLElBQUcsSUFBQyxDQUFBLFlBQVksQ0FBQyxJQUFqQjtBQUNJLGFBQU8sRUFEWDtLQUFBLE1BQUE7QUFHSSxhQUFPLElBQUksQ0FBQyxHQUFMLENBQVMsSUFBSSxDQUFDLEtBQUwsQ0FBVyxJQUFDLENBQUEsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUF0QixHQUE2QixRQUFRLENBQUMsU0FBakQsQ0FBVCxFQUFzRSxJQUFDLENBQUEsYUFBRCxDQUFBLENBQUEsR0FBbUIsSUFBQyxDQUFBLGVBQUQsQ0FBQSxDQUF6RixFQUhYOztFQURhOzs7QUFNakI7Ozs7Ozs7c0NBTUEsWUFBQSxHQUFjLFNBQUE7V0FBRyxJQUFJLENBQUMsR0FBTCxDQUFTLEVBQUEsR0FBSyxJQUFJLENBQUMsS0FBTCxDQUFXLFdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBckIsR0FBb0MsR0FBL0MsQ0FBZCxFQUFtRSxDQUFuRTtFQUFIOzs7QUFFZDs7Ozs7OztzQ0FNQSxhQUFBLEdBQWUsU0FBQTtXQUFHLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBekIsSUFBbUMsSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUEzQyxJQUF1RCxJQUFDLENBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFoQixDQUF5QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQVosR0FBZ0IsSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBeEQsRUFBMkQsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFaLEdBQWdCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQTFGLENBQXZELElBQXdKLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBUSxDQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBWixDQUFwQixLQUF5QyxDQUFsTSxDQUFBLElBQXdNLEtBQUssQ0FBQyxPQUFOLENBQWMsS0FBSyxDQUFDLENBQXBCO0VBQTNNOztzQ0FFZixNQUFBLEdBQVEsU0FBQTtJQUdKLElBQUcsMkJBQUEsSUFBbUIsV0FBVyxDQUFDLFFBQVEsQ0FBQyxpQkFBM0M7YUFDSSxZQUFZLENBQUMsU0FBYixDQUF1QixJQUFDLENBQUEsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFyQyxFQURKOztFQUhJOztzQ0FNUixLQUFBLEdBQU8sU0FBQTtBQUNILFFBQUE7SUFBQSxNQUFBLEdBQVMsV0FBVyxDQUFDLFlBQVksQ0FBQztJQUNsQyxRQUFBLEdBQWMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUE1QixHQUFzQyxDQUF0QyxHQUE2QyxNQUFNLENBQUM7V0FFL0QsSUFBQyxDQUFBLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBakIsQ0FBMkIsTUFBTSxDQUFDLFNBQWxDLEVBQTZDLE1BQU0sQ0FBQyxNQUFwRCxFQUE0RCxRQUE1RCxFQUFzRSxDQUFBLFNBQUEsS0FBQTthQUFBLFNBQUE7UUFDbEUsWUFBWSxDQUFDLEtBQUssQ0FBQyxnQkFBbkIsR0FBc0M7VUFBRSxJQUFBLEVBQU0sRUFBUjs7UUFDdEMsS0FBQyxDQUFBLEtBQUQsQ0FBQTtlQUNBLEtBQUMsQ0FBQSxNQUFNLENBQUMsT0FBUixHQUFrQjtNQUhnRDtJQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBdEU7RUFKRzs7O0FBVVA7Ozs7OztzQ0FLQSxZQUFBLEdBQWMsU0FBQTtBQUNWLFFBQUE7SUFBQSxFQUFBLEdBQUs7SUFDTCxFQUFBLEdBQUs7SUFDTCxJQUFHLDRCQUFBLElBQW9CLG9DQUF2QjtNQUNJLENBQUEsR0FBSSxJQUFDLENBQUEsTUFBTSxDQUFDO0FBQ1osYUFBTSxXQUFBLElBQU8sbUJBQWI7UUFDSSxFQUFBLElBQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNoQixFQUFBLElBQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNoQixDQUFBLEdBQUksQ0FBQyxDQUFDO01BSFYsQ0FGSjs7SUFPQSxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFmLEdBQW1CO1dBQ25CLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQWYsR0FBbUI7RUFYVDs7O0FBYWQ7Ozs7Ozs7c0NBTUEsWUFBQSxHQUFjLFNBQUE7SUFDVixJQUFDLENBQUEsWUFBRCxDQUFBO0lBRUEsSUFBRyxJQUFDLENBQUEsWUFBWSxDQUFDLElBQWQsSUFBdUIsQ0FBSSxJQUFDLENBQUEsY0FBL0I7YUFDSSxJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFyQixHQUFpQyxNQURyQzs7RUFIVTs7O0FBTWQ7Ozs7Ozs7c0NBTUEsYUFBQSxHQUFlLFNBQUE7QUFDWCxRQUFBO0lBQUEsSUFBQyxDQUFBLGFBQUQsR0FBaUIsSUFBQyxDQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFFdEMsSUFBRyxJQUFDLENBQUEsWUFBWSxDQUFDLElBQWQsSUFBdUIsQ0FBQyxJQUFDLENBQUEsUUFBUSxDQUFDLHVCQUFWLHdFQUE4RSxDQUFFLGNBQWpGLENBQTFCO01BQ0ksSUFBQyxDQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsZUFBckIsR0FBdUM7TUFDdkMsSUFBQyxDQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBckIsR0FBaUMsSUFBQyxDQUFBO2FBQ2xDLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQXJCLEdBQXFDLEVBSHpDO0tBQUEsTUFBQTtNQU1JLElBQUMsQ0FBQSxXQUFELENBQUE7YUFDQSxJQUFDLENBQUEsaUJBQUQsQ0FBQSxFQVBKOztFQUhXOzs7QUFZZjs7Ozs7Ozs7c0NBT0EsV0FBQSxHQUFhLFNBQUE7QUFDVCxRQUFBO0lBQUEsYUFBQSxHQUFnQixJQUFDLENBQUEsYUFBRCxDQUFBO0lBQ2hCLElBQUcsYUFBQSxHQUFnQixDQUFoQixJQUFzQixJQUFDLENBQUEsUUFBUSxDQUFDLGtCQUFuQzthQUNJLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQXJCLEdBQTZCLGFBQUEsR0FBZ0IsSUFBQyxDQUFBLE9BQU8sQ0FBQyxPQUQxRDtLQUFBLE1BQUE7YUFHSSxJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFyQixHQUE2QixJQUFDLENBQUEsWUFBRCxDQUFBLEVBSGpDOztFQUZTOzs7QUFPYjs7Ozs7OztzQ0FNQSxpQkFBQSxHQUFtQixTQUFBO0lBQ2YsSUFBRyxJQUFDLENBQUEsUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUF0QixJQUF1QyxJQUFDLENBQUEsYUFBRCxDQUFBLENBQTFDO01BQ0ksSUFBQyxDQUFBLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBdEIsR0FBZ0MsTUFEcEM7O0lBR0EsSUFBRyxJQUFDLENBQUEsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUF0QixJQUFrQyxDQUFJLElBQUMsQ0FBQSxPQUExQztNQUNJLElBQUcsSUFBQyxDQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBeEI7UUFDSSxJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFyQixHQUFpQyxNQURyQzs7TUFFQSxJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFyQixHQUFxQyxJQUFDLENBQUEsZUFBRCxDQUFBO01BQ3JDLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXJCLEdBQWlDLE1BSnJDO0tBQUEsTUFLSyxJQUFHLElBQUMsQ0FBQSxrQkFBRCxLQUF1QixJQUFDLENBQUEsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFoRDtNQUNELElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQXJCLEdBQWlDO01BQ2pDLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQXJCLEdBQXFDLEVBRnBDOztXQUlMLElBQUMsQ0FBQSxrQkFBRCxHQUFzQixJQUFDLENBQUEsUUFBUSxDQUFDLFdBQVcsQ0FBQztFQWI3Qjs7O0FBZW5COzs7Ozs7c0NBS0EsTUFBQSxHQUFRLFNBQUE7QUFDSixRQUFBO0lBQUEsSUFBQyxDQUFBLE1BQU0sQ0FBQyxXQUFSLEdBQXNCO0lBQ3RCLElBQUMsQ0FBQSxZQUFELENBQUE7SUFDQSxJQUFDLENBQUEsYUFBRCxDQUFBO0lBRUEsSUFBRyxJQUFDLENBQUEsU0FBRCxLQUFjLElBQUMsQ0FBQSxNQUFNLENBQUMsU0FBekI7TUFDSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBdEIsQ0FBMkIsY0FBM0IsRUFBMkMsSUFBM0MsRUFBaUQ7UUFBQSxTQUFBLEVBQVcsSUFBQyxDQUFBLFNBQVo7T0FBakQ7TUFDQSxJQUFDLENBQUEsU0FBRCxHQUFhLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFGekI7O0lBSUEsSUFBRyxJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFyQixLQUFrQyxJQUFDLENBQUEsU0FBbkMsSUFBZ0QsSUFBQyxDQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsU0FBckIsS0FBa0MsSUFBQyxDQUFBLFNBQW5GLElBQWdHLGtDQUFPLENBQUUsaUJBQVIsSUFBbUIsQ0FBQywrQ0FBa0IsQ0FBRSxrQ0FBcEIsSUFBZ0QsSUFBQyxDQUFBLEtBQUssQ0FBQyxhQUFQLEdBQXVCLElBQUMsQ0FBQSxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQTFGLENBQXBCLENBQUEsS0FBaUksSUFBQyxDQUFBLGNBQXJPO01BQ0ksSUFBQyxDQUFBLFNBQUQsR0FBYSxJQUFDLENBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQztNQUNsQyxJQUFDLENBQUEsU0FBRCxHQUFhLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDO01BQ2xDLElBQUMsQ0FBQSxjQUFELHNDQUF5QixDQUFFLGlCQUFSLElBQW1CLENBQUMsK0NBQWtCLENBQUUsa0NBQXBCLElBQWdELElBQUMsQ0FBQSxLQUFLLENBQUMsYUFBUCxHQUF1QixJQUFDLENBQUEsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUExRjtNQUV0QyxJQUFHLENBQUksSUFBQyxDQUFBLFlBQVksQ0FBQyxJQUFyQjtRQUNJLHNDQUFTLENBQUUsZ0JBQVg7VUFDSSxJQUFHLENBQUksSUFBQyxDQUFBLGNBQVI7WUFDSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBdEIsQ0FBMkIsY0FBM0IsRUFBMkMsSUFBM0MsRUFBaUQ7Y0FBQSxTQUFBLEVBQVcsSUFBQyxDQUFBLE1BQU0sQ0FBQyxTQUFuQjthQUFqRCxFQURKO1dBQUEsTUFBQTtZQUdJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUF0QixDQUEyQixnQkFBM0IsRUFBNkMsSUFBN0MsRUFBbUQ7Y0FBQSxTQUFBLEVBQVcsSUFBQyxDQUFBLE1BQU0sQ0FBQyxTQUFuQjthQUFuRCxFQUhKO1dBREo7U0FBQSxNQUFBO1VBTUksSUFBRyxJQUFDLENBQUEsU0FBSjtZQUNJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUF0QixDQUEyQixjQUEzQixFQUEyQyxJQUEzQyxFQUFpRDtjQUFBLFNBQUEsRUFBVyxJQUFDLENBQUEsTUFBTSxDQUFDLFNBQW5CO2FBQWpELEVBREo7V0FBQSxNQUVLLElBQUcsSUFBQyxDQUFBLFNBQUo7WUFDRCxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBdEIsQ0FBMkIsZ0JBQTNCLEVBQTZDLElBQTdDLEVBQW1EO2NBQUEsU0FBQSxFQUFXLElBQUMsQ0FBQSxNQUFNLENBQUMsU0FBbkI7YUFBbkQsRUFEQztXQVJUO1NBREo7T0FMSjs7SUFpQkEsSUFBRyxnQ0FBQSxJQUF3Qix1RUFBM0I7TUFDSSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQXRCO1FBQTZCLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQWhCLEdBQW9CLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQW5CLENBQXFCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUE1QyxFQUFqRDs7TUFDQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQXRCO1FBQTZCLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQWhCLEdBQW9CLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQW5CLENBQXFCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUE1QyxFQUFqRDs7TUFDQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQXRCO1FBQWlDLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQWhCLEdBQXdCLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQW5CLENBQXlCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFoRCxFQUF6RDs7TUFDQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQXRCO2VBQWtDLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWhCLEdBQXlCLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQW5CLENBQTBCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFqRCxFQUEzRDtPQUpKOztFQTFCSTs7OztHQTViNEIsRUFBRSxDQUFDOztBQTJkM0MsRUFBRSxDQUFDLHlCQUFILEdBQStCIiwic291cmNlc0NvbnRlbnQiOlsiIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jXG4jICAgU2NyaXB0OiBDb21wb25lbnRfTWVzc2FnZUJlaGF2aW9yXG4jXG4jICAgJCRDT1BZUklHSFQkJFxuI1xuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jIyMqXG4qIEFuIGVudW1lcmF0aW9uIG9mIGdhbWUgbWVzc2FnZSBtb2Rlcy5cbipcbiogQURWIC0gQWR2ZW50dXJlIE1vZGVcbiogTlZMIC0gTm92ZWwgTW9kZVxuKlxuKiBAdHlwZWRlZiBNZXNzYWdlTW9kZVxuKiBAbWVtYmVyb2Ygdm5cbiMjI1xuY2xhc3MgTWVzc2FnZU1vZGVcbiAgICBAQURWID0gMFxuICAgIEBOVkwgPSAxXG4gICAgXG52bi5NZXNzYWdlTW9kZSA9IE1lc3NhZ2VNb2RlXG5cblxuY2xhc3MgQ29tcG9uZW50X01lc3NhZ2VCZWhhdmlvciBleHRlbmRzIGdzLkNvbXBvbmVudFxuICAgIEBvYmplY3RDb2RlY0JsYWNrTGlzdCA9IFtcIm9uTWVzc2FnZVdhaXRpbmdcIiwgXCJvbk1lc3NhZ2VGaW5pc2hcIl1cbiAgICBcbiAgICAjIyMqXG4gICAgKiBDYWxsZWQgaWYgdGhpcyBvYmplY3QgaW5zdGFuY2UgaXMgcmVzdG9yZWQgZnJvbSBhIGRhdGEtYnVuZGxlLiBJdCBjYW4gYmUgdXNlZFxuICAgICogcmUtYXNzaWduIGV2ZW50LWhhbmRsZXIsIGFub255bW91cyBmdW5jdGlvbnMsIGV0Yy5cbiAgICAqIFxuICAgICogQG1ldGhvZCBvbkRhdGFCdW5kbGVSZXN0b3JlLlxuICAgICogQHBhcmFtIE9iamVjdCBkYXRhIC0gVGhlIGRhdGEtYnVuZGxlXG4gICAgKiBAcGFyYW0gZ3MuT2JqZWN0Q29kZWNDb250ZXh0IGNvbnRleHQgLSBUaGUgY29kZWMtY29udGV4dC5cbiAgICAjIyNcbiAgICBvbkRhdGFCdW5kbGVSZXN0b3JlOiAoZGF0YSwgY29udGV4dCkgLT5cbiAgICAgICAgQHRlbXBTZXR0aW5ncyA9IEdhbWVNYW5hZ2VyLnRlbXBTZXR0aW5nc1xuICAgICAgICBAc2V0dXBFdmVudEhhbmRsZXJzKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQSBiZWhhdmlvci1jb21wb25lbnQgdG8gZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBhIGdhbWUtbWVzc2FnZS5cbiAgICAqXG4gICAgKiBAbW9kdWxlIHZuXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X01lc3NhZ2VCZWhhdmlvclxuICAgICogQGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgKiBAbWVtYmVyb2Ygdm5cbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICMjI1xuICAgIGNvbnN0cnVjdG9yOiAtPlxuICAgICAgICAjIyMqXG4gICAgICAgICogUmVmZXJlbmNlIHRvIGdhbWUgc2V0dGluZ3MuXG4gICAgICAgICogQHByb3BlcnR5IHNldHRpbmdzXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAjIyNcbiAgICAgICAgQHNldHRpbmdzID0gR2FtZU1hbmFnZXIuc2V0dGluZ3NcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFJlZmVyZW5jZSB0byB0ZW1wb3JhcnkgZ2FtZSBzZXR0aW5ncy5cbiAgICAgICAgKiBAcHJvcGVydHkgc2V0dGluZ3NcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAdGVtcFNldHRpbmdzID0gR2FtZU1hbmFnZXIudGVtcFNldHRpbmdzXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSB3YWl0aW5nLlxuICAgICAgICAqIEBwcm9wZXJ0eSBpc1dhaXRpbmdcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICMjI1xuICAgICAgICBAaXNXYWl0aW5nID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2UgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAgICAgICogQHByb3BlcnR5IGlzUnVubmluZ1xuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBpc1J1bm5pbmcgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiBhIHZvaWNlIGlzIGN1cnJlbnRseSBwbGF5aW5nIHRvZ2V0aGVyIHdpdGggdGhlIG1lc3NhZ2UuXG4gICAgICAgICogQHByb3BlcnR5IGlzVm9pY2VQbGF5aW5nXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAqIEByZWFkT25seVxuICAgICAgICAjIyNcbiAgICAgICAgQGlzVm9pY2VQbGF5aW5nID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBDdXJyZW50IG1lc3NhZ2UgY2FyZXQvY3Vyc29yIHBvc2l0aW9uLlxuICAgICAgICAqIEBwcm9wZXJ0eSBjYXJldFBvc2l0aW9uXG4gICAgICAgICogQHR5cGUgZ3MuUG9pbnRcbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBjYXJldFBvc2l0aW9uID0gbmV3IGdzLlBvaW50KDAsIDApXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQ3VycmVudCByYXcgbWVzc2FnZSB0ZXh0LlxuICAgICAgICAqIEBwcm9wZXJ0eSBtZXNzYWdlXG4gICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICMjI1xuICAgICAgICBAbWVzc2FnZSA9IFwiXCJcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBBbGwgY3VycmVudGx5IGRpc3BsYXllZCByYXcgbWVzc2FnZXMuXG4gICAgICAgICogQHByb3BlcnR5IG1lc3NhZ2VzXG4gICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBtZXNzYWdlcyA9IFtdXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogVm9pY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG1lc3NhZ2UuXG4gICAgICAgICogQHByb3BlcnR5IHZvaWNlXG4gICAgICAgICogQHR5cGUgZ3MuQXVkaW9CdWZmZXJSZWZlcmVuY2VcbiAgICAgICAgIyMjXG4gICAgICAgIEB2b2ljZSA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgY3VycmVudCBtZXNzYWdlIGlzIHBhcnRpYWwuIERFUFJFQ0FURUQuIFBsZWFzZSBkbyBub3QgdXNlLlxuICAgICAgICAqIEBwcm9wZXJ0eSBwYXJ0aWFsXG4gICAgICAgICogQGRlcHJlY2F0ZWRcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICMjI1xuICAgICAgICBAcGFydGlhbCA9IG5vXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSB3YWl0aW5nIGluIGxpdmUtcHJldmlldy5cbiAgICAgICAgKiBAcHJvcGVydHkgd2FpdGluZ1ByZXZpZXdcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICMjI1xuICAgICAgICBAd2FpdGluZ1ByZXZpZXcgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgYXV0by1tZXNzYWdlIGlzIGVuYWJsZWQuXG4gICAgICAgICogQHByb3BlcnR5IGF1dG9NZXNzYWdlRW5hYmxlZFxuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBhdXRvTWVzc2FnZUVuYWJsZWQgPSBub1xuICAgICAgXG4gICAgICAgIEBvbk1lc3NhZ2VGaW5pc2ggPSAoc2VuZGVyKSA9PlxuICAgICAgICAgICAgQG9iamVjdC5ldmVudHMuZW1pdCBcImZpbmlzaFwiLCB0aGlzXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIEBvYmplY3Quc2V0dGluZ3MuYXV0b0VyYXNlIG9yIEBvYmplY3Quc2V0dGluZ3MucGFyYWdyYXBoU3BhY2luZyA+IDBcbiAgICAgICAgICAgICAgICBAbWVzc2FnZSA9IFwiXCJcbiAgICAgICAgICAgIFxuICAgICAgICBAb25NZXNzYWdlV2FpdGluZyA9IChzZW5kZXIpID0+XG4gICAgICAgICAgICBpZiAhQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNCYXRjaGVkKCkgb3IgIUBvYmplY3QudGV4dFJlbmRlcmVyLmlzQmF0Y2hJblByb2dyZXNzKClcbiAgICAgICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSAhQHBhcnRpYWxcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0IFwid2FpdGluZ1wiLCB0aGlzXG4gICAgIyMjKlxuICAgICogQWRkcyBldmVudC1oYW5kbGVyc1xuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0dXBFdmVudEhhbmRsZXJzXG4gICAgIyMjIFxuICAgIHNldHVwRXZlbnRIYW5kbGVyczogLT5cbiAgICAgICAgQG9iamVjdC5ldmVudHMub2ZmQnlPd25lcihcIm1lc3NhZ2VGaW5pc2hcIiwgdGhpcylcbiAgICAgICAgQG9iamVjdC5ldmVudHMub2ZmQnlPd25lcihcIm1lc3NhZ2VXYWl0aW5nXCIsIHRoaXMpXG4gICAgICAgIFxuICAgICAgICBAb2JqZWN0LmV2ZW50cy5vbiBcIm1lc3NhZ2VGaW5pc2hcIiwgZ3MuQ2FsbEJhY2soXCJvbk1lc3NhZ2VGaW5pc2hcIiwgdGhpcyksIG51bGwsIHRoaXNcbiAgICAgICAgQG9iamVjdC5ldmVudHMub24gXCJtZXNzYWdlV2FpdGluZ1wiLCBncy5DYWxsQmFjayhcIm9uTWVzc2FnZVdhaXRpbmdcIiwgdGhpcyksIG51bGwsIHRoaXNcbiAgICAgICAgICAgIFxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcInByZXZpZXdXYWl0aW5nXCIsIHRoaXMpXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwicHJldmlld1Jlc3RhcnRcIiwgdGhpcylcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwicHJldmlld1dhaXRpbmdcIiwgKChzZW5kZXIpID0+XG4gICAgICAgICAgICBAd2FpdGluZ1ByZXZpZXcgPSB5ZXNcbiAgICAgICAgKSwgbnVsbCwgdGhpc1xuICAgICAgICBcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwicHJldmlld1Jlc3RhcnRcIiwgKChzZW5kZXIpID0+XG4gICAgICAgICAgICBAd2FpdGluZ1ByZXZpZXcgPSBub1xuICAgICAgICApLCBudWxsLCB0aGlzXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNldHVwIHRoZSBjb21wb25lbnQuIEFkZHMgZXZlbnQgaGFuZGxlcnMuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cFxuICAgICMjI1xuICAgIHNldHVwOiAtPlxuICAgICAgICBAc2V0dXBFdmVudEhhbmRsZXJzKClcbiAgICAgXG4gICAgIyMjKlxuICAgICogRGlzcG9zZXMgdGhlIGNvbXBvbmVudC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHRvRGF0YUJ1bmRsZVxuICAgICMjIyAgIFxuICAgIGRpc3Bvc2U6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgICAgIFxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcInByZXZpZXdXYWl0aW5nXCIsIHRoaXMpXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwicHJldmlld1Jlc3RhcnRcIiwgdGhpcylcbiAgICAgICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBOb3QgaW1wbGVtZW50ZWQgeWV0LlxuICAgICpcbiAgICAqIEBtZXRob2QgdG9EYXRhQnVuZGxlXG4gICAgIyMjXG4gICAgdG9EYXRhQnVuZGxlOiAtPlxuICAgICMjIypcbiAgICAqIE5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4gICAgKlxuICAgICogQG1ldGhvZCByZXN0b3JlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gYnVuZGxlIC0gQSBkYXRhIGJ1bmRsZS5cbiAgICAjIyMgICAgXG4gICAgcmVzdG9yZTogKGJ1bmRsZSkgLT5cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIHRvIHNob3cgYSBnYW1lIG1lc3NhZ2UuXG4gICAgKlxuICAgICogQG1ldGhvZCBzaG93TWVzc2FnZVxuICAgICogQHBhcmFtIHtPYmplY3R9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2YgdGhpcyBhY3Rpb24uXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzLlxuICAgICMjI1xuICAgIHNob3dNZXNzYWdlOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIGdzLkdhbWVOb3RpZmllci5wb3N0Q29udGV4dENoYW5nZShsY3NtKHBhcmFtcy5tZXNzYWdlKSlcbiAgICAgICAgXG4gICAgICAgIEBwYXJ0aWFsID0gcGFyYW1zLnBhcnRpYWxcbiAgICAgICAgQG1lc3NhZ2UgKz0gbGNzbShwYXJhbXMubWVzc2FnZSlcbiAgICAgICAgQGFkZE1lc3NhZ2UocGFyYW1zLm1lc3NhZ2UsIFJlY29yZE1hbmFnZXIuY2hhcmFjdGVyc1twYXJhbXMuY2hhcmFjdGVySWRdLCBAb2JqZWN0Lm1lc3NhZ2VzLmxlbmd0aCA+IDAgYW5kIEBvYmplY3Quc2V0dGluZ3MucGFyYWdyYXBoU3BhY2luZyA+IDAsICFAcGFydGlhbClcbiAgICAgICAgXG4gICAgICAgIGlmIEBvYmplY3QudGV4dFJlbmRlcmVyLmlzQmF0Y2hlZCgpXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSB5ZXNcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIud2FpdEF0RW5kID0gIUBwYXJ0aWFsXG4gICAgICAgICAgICBcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogRGVwcmVjYXRlZC4gTm90IGxvbmdlciB1c2VkLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlQml0bWFwXG4gICAgIyMjXG4gICAgdXBkYXRlQml0bWFwOiAtPlxuICAgICAgICBpZiAhQG9iamVjdC5iaXRtYXAgb3IgQG9iamVjdC5iaXRtYXAud2lkdGggIT0gQG9iamVjdC5kc3RSZWN0LndpZHRoIG9yIEBvYmplY3QuYml0bWFwLmhlaWdodCAhPSBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0XG4gICAgICAgICAgICBAb2JqZWN0LmJpdG1hcD8uZGlzcG9zZSgpXG4gICAgICAgICAgICBAb2JqZWN0LmJpdG1hcCA9IG5ldyBCaXRtYXAoQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0KVxuICAgICAgICAgICAgQG9iamVjdC5iaXRtYXAuZm9udCA9IEBvYmplY3QuZm9udFxuICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIFJlc3RvcmVzIGEgTlZMIGdhbWUgbWVzc2FnZSBvZiBhbiBhcnJheSBvZiBtZXNzYWdlLW9iamVjdHMuIFRoYXQgaXNcbiAgICAqIG5lY2Vzc2FyeSB0byByZXN0b3JlIGEgTlZMIGdhbWUgbWVzc2FnZSBmcm9tIGEgc2F2ZS1nYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgcmVzdG9yZU1lc3NhZ2VzXG4gICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyAtIEFuIGFycmF5IG9mIG1lc3NhZ2VzIHRvIHJlc3RvcmUuXG4gICAgIyMjXG4gICAgcmVzdG9yZU1lc3NhZ2VzOiAobWVzc2FnZXMpIC0+XG4gICAgICAgIEB1cGRhdGVCaXRtYXAoKVxuICAgICAgICBAY2xlYXIoKVxuICAgICAgICBcbiAgICAgICAgQG9iamVjdC5vcGFjaXR5ID0gMjU1XG4gICAgICAgIEBvYmplY3Quc3JjUmVjdCA9IG5ldyBSZWN0KDAsIDAsIEBvYmplY3QuZHN0UmVjdC53aWR0aCwgQG9iamVjdC5kc3RSZWN0LmhlaWdodClcbiAgICAgICAgXG4gICAgICAgIGZvciBtZXNzYWdlIGluIG1lc3NhZ2VzXG4gICAgICAgICAgICBAb2JqZWN0LmZvbnQuY29sb3IgPSBuZXcgQ29sb3IobWVzc2FnZS5jaGFyYWN0ZXI/LnRleHRDb2xvciB8fCBDb2xvci5XSElURSlcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmRyYXdGb3JtYXR0ZWRUZXh0SW1tZWRpYXRlbHkoMCwgMCwgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0LCBsY3NtKG1lc3NhZ2UudGV4dCA/IG1lc3NhZ2UpLCB5ZXMpXG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWRkcyBhIG5ldyBtZXNzYWdlLlxuICAgICogXG4gICAgKiBAbWV0aG9kIGFkZE1lc3NhZ2VcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gY2hhcmFjdGVyIC0gRGF0YWJhc2UtUmVjb3JkIG9mIGEgY2hhcmFjdGVyLlxuICAgICogQHBhcmFtIHtib29sZWFufSBuZXdMaW5lIC0gSW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBtYWtlIGEgbGluZSBicmVhay5cbiAgICAjIyNcbiAgICBhZGRNZXNzYWdlOiAobWVzc2FnZSwgY2hhcmFjdGVyLCBuZXdMaW5lLCB3YWl0QXRFbmQpIC0+XG4gICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLnBhcnRpYWxNZXNzYWdlID0gbnVsbFxuICAgICAgICBAb2JqZWN0Lm9mZnNldCA9IHg6IDAsIHk6IDBcbiAgICAgICAgQG9iamVjdC52aXNpYmxlID0geWVzXG4gICAgICAgIFxuICAgICAgICBAb2JqZWN0Lm1lc3NhZ2VzLnB1c2goeyB0ZXh0OiBtZXNzYWdlLCBjaGFyYWN0ZXI6IGNoYXJhY3Rlcn0pXG4gICAgICAgIFxuICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSB3YWl0QXRFbmRcbiAgICAgICAgaWYgbm90IEBvYmplY3Quc2V0dGluZ3MuYXV0b0VyYXNlXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci5jdXJyZW50WSArPSBAb2JqZWN0LnNldHRpbmdzLnBhcmFncmFwaFNwYWNpbmdcbiAgICAgICAgaWYgbmV3TGluZVxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIubmV3TGluZSgpXG4gICAgICAgIEB1cGRhdGVCaXRtYXAoKVxuICAgICAgICAgICAgXG4gICAgICAgIGlmIGNoYXJhY3Rlcj8gYW5kIEBvYmplY3Quc2V0dGluZ3MudXNlQ2hhcmFjdGVyQ29sb3JcbiAgICAgICAgICAgIEBvYmplY3QuZm9udC5jb2xvciA9IG5ldyBDb2xvcihjaGFyYWN0ZXI/LnRleHRDb2xvciB8fCBDb2xvci5XSElURSlcbiAgICAgICAgICAgIFxuICAgICAgICBAb2JqZWN0Lm9wYWNpdHkgPSAyNTVcbiAgICAgICAgQG9iamVjdC5zcmNSZWN0ID0gbmV3IFJlY3QoMCwgMCwgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0KVxuICAgICBcbiAgICAgICAgQHVwZGF0ZSgpXG4gICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmRyYXdGb3JtYXR0ZWRUZXh0KDAsIDAsIEBvYmplY3QuZHN0UmVjdC53aWR0aCwgQG9iamVjdC5kc3RSZWN0LmhlaWdodCwgbWVzc2FnZSwgeWVzKVxuXG4gICAgIyMjKlxuICAgICogQ2xlYXJzIHRoZSBnYW1lIG1lc3NhZ2UgYnkgZGVsZXRpbmcvY2xlYXJpbmcgYWxsIG1lc3NhZ2VzLlxuICAgICpcbiAgICAqIEBtZXRob2QgY2xlYXJcbiAgICAjIyNcbiAgICBjbGVhcjogLT4gXG4gICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmNsZWFyKClcbiAgICAgICAgQG9iamVjdC5tZXNzYWdlcyA9IFtdXG4gICAgICAgIEBtZXNzYWdlID0gXCJcIlxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBDbG9zZXMgdGhlIGdhbWUgbWVzc2FnZSBieSBtYWtpbmcgaXQgaW52aXNpYmxlLlxuICAgICpcbiAgICAqIEBtZXRob2QgY2xvc2VcbiAgICAjIyNcbiAgICBjbG9zZTogLT4gXG4gICAgICAgIEBvYmplY3QudmlzaWJsZSA9IG5vXG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgZHVyYXRpb24gb2YgYW4gYXNzb2NpYXRlZCB2b2ljZSBvciAwIGlmIG5vIHZvaWNlIGlzIGFzc29jaWF0ZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCB2b2ljZUR1cmF0aW9uXG4gICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgIyMjXG4gICAgdm9pY2VEdXJhdGlvbjogLT5cbiAgICAgICAgZHVyYXRpb24gPSAwXG4gICAgICAgIGlmIEB2b2ljZT8gYW5kIChAc2V0dGluZ3MuYXV0b01lc3NhZ2Uud2FpdEZvclZvaWNlIG9yIEBzZXR0aW5ncy50aW1lTWVzc2FnZVRvVm9pY2UpXG4gICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgucm91bmQoKEB2b2ljZS5zb3VyY2UuYnVmZmVyLmR1cmF0aW9uICogKDEuMCAvIEB2b2ljZS5zb3VyY2UucGxheWJhY2tSYXRlLnZhbHVlKSkgKiAxMDAwIC8gMTYuNilcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZHVyYXRpb24gPSAwXG4gICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIGlmIEB0ZW1wU2V0dGluZ3Muc2tpcCB0aGVuIDEgZWxzZSBkdXJhdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIHRoZSBkdXJhdGlvbiBvZiByZW5kZXJpbmcgdGhlIGdhbWUtbWVzc2FnZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG1lc3NhZ2VEdXJhdGlvblxuICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICMjI1xuICAgIG1lc3NhZ2VEdXJhdGlvbjogLT4gXG4gICAgICAgIGR1cmF0aW9uID0gQG9iamVjdC50ZXh0UmVuZGVyZXIuY2FsY3VsYXRlRHVyYXRpb24oKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGlmIEB0ZW1wU2V0dGluZ3Muc2tpcCB0aGVuIDEgZWxzZSBkdXJhdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIHRoZSB0aW1lIGJldHdlZW4gdHdvIG1lc3NhZ2VzIGluIGF1dG8tcmVhZCBtb2RlLlxuICAgICpcbiAgICAqIEBtZXRob2QgYXV0b01lc3NhZ2VUaW1lXG4gICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0aW1lIGluIGZyYW1lcy5cbiAgICAjIyNcbiAgICBhdXRvTWVzc2FnZVRpbWU6IC0+IFxuICAgICAgICBpZiBAdGVtcFNldHRpbmdzLnNraXBcbiAgICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLnJvdW5kKEBzZXR0aW5ncy5hdXRvTWVzc2FnZS50aW1lICogR3JhcGhpY3MuZnJhbWVSYXRlKSwgQHZvaWNlRHVyYXRpb24oKSAtIEBtZXNzYWdlRHVyYXRpb24oKSlcbiAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIHRoZSBjdXJyZW50IG1lc3NhZ2Ugc3BlZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCBtZXNzYWdlU3BlZWRcbiAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1lc3NhZ2Ugc3BlZWQuXG4gICAgIyMjXG4gICAgbWVzc2FnZVNwZWVkOiAtPiBNYXRoLm1heCgxMSAtIE1hdGgucm91bmQoR2FtZU1hbmFnZXIuc2V0dGluZ3MubWVzc2FnZVNwZWVkICogMi41KSwgMClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBDaGVja3MgaWYgYSBtb3VzZS1idXR0b24gb3Iga2V5IHdhcyBwcmVzc2VkIHRvIGNvbnRpbnVlIHdpdGggdGhlIG1lc3NhZ2UtcmVuZGVyaW5nLlxuICAgICpcbiAgICAqIEBtZXRob2QgYWN0aW9uVHJpZ2dlclxuICAgICogQHJldHVybiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIGFuIGFjdGlvbi1idXR0b24gb3IgYWN0aW9uLWtleSBpcyBwcmVzc2VkLlxuICAgICMjI1xuICAgIGFjdGlvblRyaWdnZXI6IC0+IChncy5PYmplY3RNYW5hZ2VyLmN1cnJlbnQuaW5wdXQgYW5kIEBvYmplY3QudmlzaWJsZSBhbmQgQG9iamVjdC5kc3RSZWN0LmNvbnRhaW5zKElucHV0Lk1vdXNlLnggLSBAb2JqZWN0Lm9yaWdpbi54LCBJbnB1dC5Nb3VzZS55IC0gQG9iamVjdC5vcmlnaW4ueSkgYW5kIElucHV0Lk1vdXNlLmJ1dHRvbnNbSW5wdXQuTW91c2UuTEVGVF0gPT0gMikgb3IgSW5wdXQudHJpZ2dlcihJbnB1dC5DKVxuICAgIFxuICAgIGZpbmlzaDogLT5cbiAgICAgICAgI0BvYmplY3QuY2hhcmFjdGVyID0gbnVsbFxuICAgICAgICBcbiAgICAgICAgaWYgQG9iamVjdC52b2ljZT8gYW5kIEdhbWVNYW5hZ2VyLnNldHRpbmdzLnNraXBWb2ljZU9uQWN0aW9uXG4gICAgICAgICAgICBBdWRpb01hbmFnZXIuc3RvcFNvdW5kKEBvYmplY3Qudm9pY2UubmFtZSlcbiAgICBcbiAgICBlcmFzZTogLT5cbiAgICAgICAgZmFkaW5nID0gR2FtZU1hbmFnZXIudGVtcFNldHRpbmdzLm1lc3NhZ2VGYWRpbmdcbiAgICAgICAgZHVyYXRpb24gPSBpZiBHYW1lTWFuYWdlci50ZW1wU2V0dGluZ3Muc2tpcCB0aGVuIDAgZWxzZSBmYWRpbmcuZHVyYXRpb25cbiAgICAgICAgXG4gICAgICAgIEBvYmplY3QuYW5pbWF0b3IuZGlzYXBwZWFyKGZhZGluZy5hbmltYXRpb24sIGZhZGluZy5lYXNpbmcsIGR1cmF0aW9uLCA9PlxuICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLnNjZW5lLmN1cnJlbnRDaGFyYWN0ZXIgPSB7IG5hbWU6IFwiXCIgfVxuICAgICAgICAgICAgQGNsZWFyKClcbiAgICAgICAgICAgIEBvYmplY3QudmlzaWJsZSA9IG5vXG4gICAgICAgIClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogRklYTUU6IERlcHJlY2F0ZWQ/IEl0IGlzIGFsc28gYSByZS1kZWZpbml0aW9uIG9mIGdzLkNvbXBvbmVudF9WaXN1YWwudXBkYXRlT3JpZ2luLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlT3JpZ2luXG4gICAgIyMjXG4gICAgdXBkYXRlT3JpZ2luOiAtPlxuICAgICAgICBveCA9IDBcbiAgICAgICAgb3kgPSAwXG4gICAgICAgIGlmIEBvYmplY3QucGFyZW50PyBhbmQgQG9iamVjdC5wYXJlbnQuZHN0UmVjdD9cbiAgICAgICAgICAgIHAgPSBAb2JqZWN0LnBhcmVudFxuICAgICAgICAgICAgd2hpbGUgcD8gYW5kIHAuZHN0UmVjdD9cbiAgICAgICAgICAgICAgICBveCArPSBwLmRzdFJlY3QueFxuICAgICAgICAgICAgICAgIG95ICs9IHAuZHN0UmVjdC55XG4gICAgICAgICAgICAgICAgcCA9IHAucGFyZW50XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICBAb2JqZWN0Lm9yaWdpbi54ID0gb3hcbiAgICAgICAgQG9iamVjdC5vcmlnaW4ueSA9IG95XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFVwZGF0ZXMgdGhlIG9iamVjdC4gXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVPYmplY3RcbiAgICAqIEBwcml2YXRlXG4gICAgIyMjXG4gICAgdXBkYXRlT2JqZWN0OiAtPlxuICAgICAgICBAdXBkYXRlT3JpZ2luKClcbiAgICAgICAgXG4gICAgICAgIGlmIEB0ZW1wU2V0dGluZ3Muc2tpcCBhbmQgbm90IEB3YWl0aW5nUHJldmlld1xuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNXYWl0aW5nID0gbm9cbiAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBtZXNzYWdlLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlTWVzc2FnZVxuICAgICogQHByaXZhdGVcbiAgICAjIyNcbiAgICB1cGRhdGVNZXNzYWdlOiAtPlxuICAgICAgICBAY2FyZXRQb3NpdGlvbiA9IEBvYmplY3QudGV4dFJlbmRlcmVyLmNhcmV0UG9zaXRpb25cbiAgICAgICAgXG4gICAgICAgIGlmIEB0ZW1wU2V0dGluZ3Muc2tpcCBhbmQgKEBzZXR0aW5ncy5hbGxvd1NraXBVbnJlYWRNZXNzYWdlcyBvciBHYW1lTWFuYWdlci5nbG9iYWxEYXRhLm1lc3NhZ2VzW0BtZXNzYWdlXT8ucmVhZClcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmRyYXdJbW1lZGlhdGVseSA9IHllc1xuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIud2FpdEF0RW5kID0gQHdhaXRpbmdQcmV2aWV3XG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmRUaW1lID0gMFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICAjQG9iamVjdC50ZXh0UmVuZGVyZXIuZHJhd0ltbWVkaWF0ZWx5ID0gbm9cbiAgICAgICAgICAgIEB1cGRhdGVTcGVlZCgpXG4gICAgICAgICAgICBAdXBkYXRlQXV0b01lc3NhZ2UoKVxuICAgICAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgc3BlZWQgb2YgdGhlIG1lc3NhZ2UuIFRoYXQgZGVwZW5kcyBvbiBnYW1lLXNldHRpbmdzIGlmIGEgbWVzc2FnZVxuICAgICogaXMgdGltZWQgdG8gaXRzIHZvaWNlIG9yIG5vdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZVNwZWVkXG4gICAgKiBAcHJpdmF0ZVxuICAgICMjI1xuICAgIHVwZGF0ZVNwZWVkOiAtPlxuICAgICAgICB2b2ljZUR1cmF0aW9uID0gQHZvaWNlRHVyYXRpb24oKVxuICAgICAgICBpZiB2b2ljZUR1cmF0aW9uID4gMCBhbmQgQHNldHRpbmdzLnRpbWVNZXNzYWdlVG9Wb2ljZVxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuc3BlZWQgPSB2b2ljZUR1cmF0aW9uIC8gQG1lc3NhZ2UubGVuZ3RoXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLnNwZWVkID0gQG1lc3NhZ2VTcGVlZCgpXG4gICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGUgYXV0by1yZWFkIG1vZGUuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVBdXRvTWVzc2FnZVxuICAgICogQHByaXZhdGVcbiAgICAjIyNcbiAgICB1cGRhdGVBdXRvTWVzc2FnZTogLT5cbiAgICAgICAgaWYgQHNldHRpbmdzLmF1dG9NZXNzYWdlLnN0b3BPbkFjdGlvbiBhbmQgQGFjdGlvblRyaWdnZXIoKVxuICAgICAgICAgICAgQHNldHRpbmdzLmF1dG9NZXNzYWdlLmVuYWJsZWQgPSBub1xuICAgICAgICAgICAgXG4gICAgICAgIGlmIEBzZXR0aW5ncy5hdXRvTWVzc2FnZS5lbmFibGVkIGFuZCBub3QgQHBhcnRpYWxcbiAgICAgICAgICAgIGlmIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZFxuICAgICAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmlzV2FpdGluZyA9IG5vXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmRUaW1lID0gQGF1dG9NZXNzYWdlVGltZSgpXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSBub1xuICAgICAgICBlbHNlIGlmIEBhdXRvTWVzc2FnZUVuYWJsZWQgIT0gQHNldHRpbmdzLmF1dG9NZXNzYWdlLmVuYWJsZWRcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZCA9IHllc1xuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIud2FpdEF0RW5kVGltZSA9IDBcbiAgICAgICAgICAgIFxuICAgICAgICBAYXV0b01lc3NhZ2VFbmFibGVkID0gQHNldHRpbmdzLmF1dG9NZXNzYWdlLmVuYWJsZWRcbiAgICAgICAgICAgIFxuICAgICMjI1xuICAgICogVXBkYXRlcyB0aGUgZ2FtZSBtZXNzYWdlIGJlaGF2aW9yXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyNcbiAgICB1cGRhdGU6IC0+XG4gICAgICAgIEBvYmplY3QubmVlZHNVcGRhdGUgPSB5ZXNcbiAgICAgICAgQHVwZGF0ZU9iamVjdCgpXG4gICAgICAgIEB1cGRhdGVNZXNzYWdlKClcbiAgICAgICAgXG4gICAgICAgIGlmIEBjaGFyYWN0ZXIgIT0gQG9iamVjdC5jaGFyYWN0ZXIgICBcbiAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwidGFsa2luZ0VuZGVkXCIsIHRoaXMsIGNoYXJhY3RlcjogQGNoYXJhY3RlcilcbiAgICAgICAgICAgIEBjaGFyYWN0ZXIgPSBAb2JqZWN0LmNoYXJhY3RlclxuICAgICAgICAgICAgXG4gICAgICAgIGlmIEBvYmplY3QudGV4dFJlbmRlcmVyLmlzV2FpdGluZyAhPSBAaXNXYWl0aW5nIG9yIEBvYmplY3QudGV4dFJlbmRlcmVyLmlzUnVubmluZyAhPSBAaXNSdW5uaW5nIG9yIChAdm9pY2U/LnBsYXlpbmcgJiYgKCFAb2JqZWN0LmNoYXJhY3Rlcj8udGltZVRhbGtpbmdUb1ZvaWNlVm9sdW1lIG9yIEB2b2ljZS5hdmVyYWdlVm9sdW1lID4gQG9iamVjdC5jaGFyYWN0ZXIudGFsa2luZ1ZvbHVtZSkpICE9IEBpc1ZvaWNlUGxheWluZ1xuICAgICAgICAgICAgQGlzV2FpdGluZyA9IEBvYmplY3QudGV4dFJlbmRlcmVyLmlzV2FpdGluZ1xuICAgICAgICAgICAgQGlzUnVubmluZyA9IEBvYmplY3QudGV4dFJlbmRlcmVyLmlzUnVubmluZ1xuICAgICAgICAgICAgQGlzVm9pY2VQbGF5aW5nID0gKEB2b2ljZT8ucGxheWluZyAmJiAoIUBvYmplY3QuY2hhcmFjdGVyPy50aW1lVGFsa2luZ1RvVm9pY2VWb2x1bWUgb3IgQHZvaWNlLmF2ZXJhZ2VWb2x1bWUgPiBAb2JqZWN0LmNoYXJhY3Rlci50YWxraW5nVm9sdW1lKSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgbm90IEB0ZW1wU2V0dGluZ3Muc2tpcFxuICAgICAgICAgICAgICAgIGlmIEB2b2ljZT8ucGxheWluZ1xuICAgICAgICAgICAgICAgICAgICBpZiBub3QgQGlzVm9pY2VQbGF5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcInRhbGtpbmdFbmRlZFwiLCB0aGlzLCBjaGFyYWN0ZXI6IEBvYmplY3QuY2hhcmFjdGVyKVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcInRhbGtpbmdTdGFydGVkXCIsIHRoaXMsIGNoYXJhY3RlcjogQG9iamVjdC5jaGFyYWN0ZXIpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpZiBAaXNXYWl0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcInRhbGtpbmdFbmRlZFwiLCB0aGlzLCBjaGFyYWN0ZXI6IEBvYmplY3QuY2hhcmFjdGVyKVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIEBpc1J1bm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwidGFsa2luZ1N0YXJ0ZWRcIiwgdGhpcywgY2hhcmFjdGVyOiBAb2JqZWN0LmNoYXJhY3RlcilcbiAgICAgICAgXG4gICAgICAgIGlmIEBvYmplY3QubGF5b3V0UmVjdD8gYW5kIEBvYmplY3QucGFyZW50Py5kc3RSZWN0P1xuICAgICAgICAgICAgaWYgQG9iamVjdC5sYXlvdXRSZWN0LnggdGhlbiBAb2JqZWN0LmRzdFJlY3QueCA9IEBvYmplY3QubGF5b3V0UmVjdC54KEBvYmplY3QucGFyZW50LmRzdFJlY3Qud2lkdGgpXG4gICAgICAgICAgICBpZiBAb2JqZWN0LmxheW91dFJlY3QueSB0aGVuIEBvYmplY3QuZHN0UmVjdC55ID0gQG9iamVjdC5sYXlvdXRSZWN0LnkoQG9iamVjdC5wYXJlbnQuZHN0UmVjdC5oZWlnaHQpXG4gICAgICAgICAgICBpZiBAb2JqZWN0LmxheW91dFJlY3Qud2lkdGggdGhlbiBAb2JqZWN0LmRzdFJlY3Qud2lkdGggPSBAb2JqZWN0LmxheW91dFJlY3Qud2lkdGgoQG9iamVjdC5wYXJlbnQuZHN0UmVjdC53aWR0aClcbiAgICAgICAgICAgIGlmIEBvYmplY3QubGF5b3V0UmVjdC5oZWlnaHQgdGhlbiBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0ID0gQG9iamVjdC5sYXlvdXRSZWN0LmhlaWdodChAb2JqZWN0LnBhcmVudC5kc3RSZWN0LmhlaWdodClcbnZuLkNvbXBvbmVudF9NZXNzYWdlQmVoYXZpb3IgPSBDb21wb25lbnRfTWVzc2FnZUJlaGF2aW9yIl19\n//# sourceURL=Component_MessageBehavior_131.js"
12 + "compiledContent": "\n/**\n* An enumeration of game message modes.\n*\n* ADV - Adventure Mode\n* NVL - Novel Mode\n*\n* @typedef MessageMode\n* @memberof vn\n */\nvar Component_MessageBehavior, MessageMode,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nMessageMode = (function() {\n function MessageMode() {}\n\n MessageMode.ADV = 0;\n\n MessageMode.NVL = 1;\n\n return MessageMode;\n\n})();\n\nvn.MessageMode = MessageMode;\n\nComponent_MessageBehavior = (function(superClass) {\n extend(Component_MessageBehavior, superClass);\n\n Component_MessageBehavior.objectCodecBlackList = [\"onMessageWaiting\", \"onMessageFinish\"];\n\n\n /**\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n */\n\n Component_MessageBehavior.prototype.onDataBundleRestore = function(data, context) {\n this.tempSettings = GameManager.tempSettings;\n return this.setupEventHandlers();\n };\n\n\n /**\n * A behavior-component to define the behavior of a game-message.\n *\n * @module vn\n * @class Component_MessageBehavior\n * @extends gs.Component\n * @memberof vn\n * @constructor\n */\n\n function Component_MessageBehavior() {\n\n /**\n * Reference to temporary game settings.\n * @property settings\n * @type Object\n * @protected\n */\n this.tempSettings = GameManager.tempSettings;\n\n /**\n * Indicates if the message is currently waiting.\n * @property isWaiting\n * @type boolean\n * @readOnly\n */\n this.isWaiting = false;\n\n /**\n * Indicates if the message is currently running.\n * @property isRunning\n * @type boolean\n * @readOnly\n */\n this.isRunning = false;\n\n /**\n * Indicates if a voice is currently playing together with the message.\n * @property isVoicePlaying\n * @type boolean\n * @readOnly\n */\n this.isVoicePlaying = false;\n\n /**\n * Current message caret/cursor position.\n * @property caretPosition\n * @type gs.Point\n * @readOnly\n */\n this.caretPosition = new gs.Point(0, 0);\n\n /**\n * Current raw message text.\n * @property message\n * @type string\n * @readOnly\n */\n this.message = \"\";\n\n /**\n * All currently displayed raw messages.\n * @property messages\n * @type string[]\n * @readOnly\n */\n this.messages = [];\n\n /**\n * Voice associated with the current message.\n * @property voice\n * @type gs.AudioBufferReference\n */\n this.voice = null;\n\n /**\n * Indicates if current message is partial. DEPRECATED. Please do not use.\n * @property partial\n * @deprecated\n * @type boolean\n * @readOnly\n */\n this.partial = false;\n\n /**\n * Indicates if the message is currently waiting in live-preview.\n * @property waitingPreview\n * @type boolean\n * @readOnly\n */\n this.waitingPreview = false;\n\n /**\n * Indicates if the auto-message is enabled.\n * @property autoMessageEnabled\n * @type boolean\n * @readOnly\n */\n this.autoMessageEnabled = false;\n this.onMessageFinish = (function(_this) {\n return function(sender) {\n _this.object.events.emit(\"finish\", _this);\n if (_this.object.settings.autoErase || _this.object.settings.paragraphSpacing > 0) {\n return _this.message = \"\";\n }\n };\n })(this);\n this.onMessageWaiting = (function(_this) {\n return function(sender) {\n if (!_this.object.textRenderer.isBatched() || !_this.object.textRenderer.isBatchInProgress()) {\n _this.object.textRenderer.waitAtEnd = !_this.partial;\n return _this.object.events.emit(\"waiting\", _this);\n }\n };\n })(this);\n }\n\n\n /**\n * Reference to game settings.\n * @property settings\n * @type Object\n * @protected\n */\n\n Component_MessageBehavior.accessors(\"settings\", {\n get: function() {\n return GameManager.settings;\n }\n\n /**\n * Adds event-handlers\n *\n * @method setupEventHandlers\n */\n });\n\n Component_MessageBehavior.prototype.setupEventHandlers = function() {\n this.object.events.offByOwner(\"messageFinish\", this);\n this.object.events.offByOwner(\"messageWaiting\", this);\n this.object.events.on(\"messageFinish\", gs.CallBack(\"onMessageFinish\", this), null, this);\n this.object.events.on(\"messageWaiting\", gs.CallBack(\"onMessageWaiting\", this), null, this);\n gs.GlobalEventManager.offByOwner(\"previewWaiting\", this);\n gs.GlobalEventManager.offByOwner(\"previewRestart\", this);\n gs.GlobalEventManager.on(\"previewWaiting\", ((function(_this) {\n return function(sender) {\n return _this.waitingPreview = true;\n };\n })(this)), null, this);\n return gs.GlobalEventManager.on(\"previewRestart\", ((function(_this) {\n return function(sender) {\n return _this.waitingPreview = false;\n };\n })(this)), null, this);\n };\n\n\n /**\n * Setup the component. Adds event handlers.\n *\n * @method setup\n */\n\n Component_MessageBehavior.prototype.setup = function() {\n return this.setupEventHandlers();\n };\n\n\n /**\n * Disposes the component.\n *\n * @method toDataBundle\n */\n\n Component_MessageBehavior.prototype.dispose = function() {\n Component_MessageBehavior.__super__.dispose.apply(this, arguments);\n gs.GlobalEventManager.offByOwner(\"previewWaiting\", this);\n return gs.GlobalEventManager.offByOwner(\"previewRestart\", this);\n };\n\n\n /**\n * Not implemented yet.\n *\n * @method toDataBundle\n */\n\n Component_MessageBehavior.prototype.toDataBundle = function() {};\n\n\n /**\n * Not implemented yet.\n *\n * @method restore\n * @param {Object} bundle - A data bundle.\n */\n\n Component_MessageBehavior.prototype.restore = function(bundle) {};\n\n\n /**\n * Action to show a game message.\n *\n * @method showMessage\n * @param {Object} sender - The sender of this action.\n * @param {Object} params - An object containing the necessary parameters.\n */\n\n Component_MessageBehavior.prototype.showMessage = function(sender, params) {\n gs.GameNotifier.postContextChange(lcsm(params.message));\n this.partial = params.partial;\n this.message += lcsm(params.message);\n this.addMessage(params.message, RecordManager.characters[params.characterId], this.object.messages.length > 0 && this.object.settings.paragraphSpacing > 0, !this.partial);\n if (this.object.textRenderer.isBatched()) {\n return this.object.textRenderer.waitAtEnd = true;\n } else {\n return this.object.textRenderer.waitAtEnd = !this.partial;\n }\n };\n\n\n /**\n * Deprecated. Not longer used.\n *\n * @method updateBitmap\n */\n\n Component_MessageBehavior.prototype.updateBitmap = function() {\n var ref;\n if (!this.object.bitmap || this.object.bitmap.width !== this.object.dstRect.width || this.object.bitmap.height !== this.object.dstRect.height) {\n if ((ref = this.object.bitmap) != null) {\n ref.dispose();\n }\n this.object.bitmap = new Bitmap(this.object.dstRect.width, this.object.dstRect.height);\n return this.object.bitmap.font = this.object.font;\n }\n };\n\n\n /**\n * Restores a NVL game message of an array of message-objects. That is\n * necessary to restore a NVL game message from a save-game.\n *\n * @method restoreMessages\n * @param {Array} messages - An array of messages to restore.\n */\n\n Component_MessageBehavior.prototype.restoreMessages = function(messages) {\n var i, len, message, ref, ref1;\n this.updateBitmap();\n this.clear();\n this.object.opacity = 255;\n this.object.srcRect = new Rect(0, 0, this.object.dstRect.width, this.object.dstRect.height);\n for (i = 0, len = messages.length; i < len; i++) {\n message = messages[i];\n this.object.font.color = new Color(((ref = message.character) != null ? ref.textColor : void 0) || Color.WHITE);\n this.object.textRenderer.drawFormattedTextImmediately(0, 0, this.object.dstRect.width, this.object.dstRect.height, lcsm((ref1 = message.text) != null ? ref1 : message), true);\n }\n return null;\n };\n\n\n /**\n * Adds a new message.\n * \n * @method addMessage\n * @param {string} message - The message.\n * @param {Object} character - Database-Record of a character.\n * @param {boolean} newLine - Indicates if the message should make a line break.\n */\n\n Component_MessageBehavior.prototype.addMessage = function(message, character, newLine, waitAtEnd) {\n this.object.textRenderer.partialMessage = null;\n this.object.offset = {\n x: 0,\n y: 0\n };\n this.object.visible = true;\n this.object.messages.push({\n text: message,\n character: character\n });\n this.object.textRenderer.waitAtEnd = waitAtEnd;\n if (!this.object.settings.autoErase) {\n this.object.textRenderer.currentY += this.object.settings.paragraphSpacing;\n }\n if (newLine) {\n this.object.textRenderer.newLine();\n }\n this.updateBitmap();\n if ((character != null) && this.object.settings.useCharacterColor) {\n this.object.font.color = new Color((character != null ? character.textColor : void 0) || Color.WHITE);\n }\n this.object.opacity = 255;\n this.object.srcRect = new Rect(0, 0, this.object.dstRect.width, this.object.dstRect.height);\n this.update();\n return this.object.textRenderer.drawFormattedText(0, 0, this.object.dstRect.width, this.object.dstRect.height, message, true);\n };\n\n\n /**\n * Clears the game message by deleting/clearing all messages.\n *\n * @method clear\n */\n\n Component_MessageBehavior.prototype.clear = function() {\n this.object.textRenderer.clear();\n this.object.messages = [];\n return this.message = \"\";\n };\n\n\n /**\n * Closes the game message by making it invisible.\n *\n * @method close\n */\n\n Component_MessageBehavior.prototype.close = function() {\n return this.object.visible = false;\n };\n\n\n /**\n * Gets the duration of an associated voice or 0 if no voice is associated.\n *\n * @method voiceDuration\n * @return {number} The duration in frames.\n */\n\n Component_MessageBehavior.prototype.voiceDuration = function() {\n var duration;\n duration = 0;\n if ((this.voice != null) && (this.settings.autoMessage.waitForVoice || this.settings.timeMessageToVoice)) {\n duration = Math.round((this.voice.source.buffer.duration * (1.0 / this.voice.source.playbackRate.value)) * 1000 / 16.6);\n } else {\n duration = 0;\n }\n if (this.tempSettings.skip) {\n return 1;\n } else {\n return duration;\n }\n };\n\n\n /**\n * Gets the duration of rendering the game-message.\n *\n * @method messageDuration\n * @return {number} The duration in frames.\n */\n\n Component_MessageBehavior.prototype.messageDuration = function() {\n var duration;\n duration = this.object.textRenderer.calculateDuration();\n if (this.tempSettings.skip) {\n return 1;\n } else {\n return duration;\n }\n };\n\n\n /**\n * Gets the time between two messages in auto-read mode.\n *\n * @method autoMessageTime\n * @return {number} The time in frames.\n */\n\n Component_MessageBehavior.prototype.autoMessageTime = function() {\n if (this.tempSettings.skip) {\n return 1;\n } else {\n return Math.max(Math.round(this.settings.autoMessage.time * Graphics.frameRate), this.voiceDuration() - this.messageDuration());\n }\n };\n\n\n /**\n * Gets the current message speed.\n *\n * @method messageSpeed\n * @return {number} The message speed.\n */\n\n Component_MessageBehavior.prototype.messageSpeed = function() {\n return Math.max(11 - Math.round(GameManager.settings.messageSpeed * 2.5), 0);\n };\n\n\n /**\n * Checks if a mouse-button or key was pressed to continue with the message-rendering.\n *\n * @method actionTrigger\n * @return {boolean} If true, the an action-button or action-key is pressed.\n */\n\n Component_MessageBehavior.prototype.actionTrigger = function() {\n return (gs.ObjectManager.current.input && this.object.visible && this.object.dstRect.contains(Input.Mouse.x - this.object.origin.x, Input.Mouse.y - this.object.origin.y) && Input.Mouse.buttons[Input.Mouse.LEFT] === 2) || Input.trigger(Input.C);\n };\n\n Component_MessageBehavior.prototype.finish = function() {\n if ((this.object.voice != null) && GameManager.settings.skipVoiceOnAction) {\n return AudioManager.stopSound(this.object.voice.name);\n }\n };\n\n Component_MessageBehavior.prototype.erase = function() {\n var duration, fading;\n fading = GameManager.tempSettings.messageFading;\n duration = GameManager.tempSettings.skip ? 0 : fading.duration;\n return this.object.animator.disappear(fading.animation, fading.easing, duration, (function(_this) {\n return function() {\n SceneManager.scene.currentCharacter = {\n name: \"\"\n };\n _this.clear();\n return _this.object.visible = false;\n };\n })(this));\n };\n\n\n /**\n * FIXME: Deprecated? It is also a re-definition of gs.Component_Visual.updateOrigin.\n *\n * @method updateOrigin\n */\n\n Component_MessageBehavior.prototype.updateOrigin = function() {\n var ox, oy, p;\n ox = 0;\n oy = 0;\n if ((this.object.parent != null) && (this.object.parent.dstRect != null)) {\n p = this.object.parent;\n while ((p != null) && (p.dstRect != null)) {\n ox += p.dstRect.x;\n oy += p.dstRect.y;\n p = p.parent;\n }\n }\n this.object.origin.x = ox;\n return this.object.origin.y = oy;\n };\n\n\n /**\n * Updates the object. \n *\n * @method updateObject\n * @private\n */\n\n Component_MessageBehavior.prototype.updateObject = function() {\n this.updateOrigin();\n if (this.tempSettings.skip && !this.waitingPreview) {\n return this.object.textRenderer.isWaiting = false;\n }\n };\n\n\n /**\n * Updates the message.\n *\n * @method updateMessage\n * @private\n */\n\n Component_MessageBehavior.prototype.updateMessage = function() {\n var ref;\n this.caretPosition = this.object.textRenderer.caretPosition;\n if (this.tempSettings.skip && (this.settings.allowSkipUnreadMessages || ((ref = GameManager.globalData.messages[this.message]) != null ? ref.read : void 0))) {\n this.object.textRenderer.drawImmediately = true;\n this.object.textRenderer.waitAtEnd = this.waitingPreview;\n return this.object.textRenderer.waitAtEndTime = 0;\n } else {\n this.updateSpeed();\n return this.updateAutoMessage();\n }\n };\n\n\n /**\n * Updates the speed of the message. That depends on game-settings if a message\n * is timed to its voice or not.\n *\n * @method updateSpeed\n * @private\n */\n\n Component_MessageBehavior.prototype.updateSpeed = function() {\n var voiceDuration;\n voiceDuration = this.voiceDuration();\n if (voiceDuration > 0 && this.settings.timeMessageToVoice) {\n return this.object.textRenderer.speed = voiceDuration / this.message.length;\n } else {\n return this.object.textRenderer.speed = this.messageSpeed();\n }\n };\n\n\n /**\n * Update auto-read mode.\n *\n * @method updateAutoMessage\n * @private\n */\n\n Component_MessageBehavior.prototype.updateAutoMessage = function() {\n if (this.settings.autoMessage.stopOnAction && this.actionTrigger()) {\n this.settings.autoMessage.enabled = false;\n }\n if (this.settings.autoMessage.enabled && !this.partial) {\n if (this.object.textRenderer.waitAtEnd) {\n this.object.textRenderer.isWaiting = false;\n }\n this.object.textRenderer.waitAtEndTime = this.autoMessageTime();\n this.object.textRenderer.waitAtEnd = false;\n } else if (this.autoMessageEnabled !== this.settings.autoMessage.enabled) {\n this.object.textRenderer.waitAtEnd = true;\n this.object.textRenderer.waitAtEndTime = 0;\n }\n return this.autoMessageEnabled = this.settings.autoMessage.enabled;\n };\n\n\n /*\n * Updates the game message behavior\n *\n * @method update\n */\n\n Component_MessageBehavior.prototype.update = function() {\n var ref, ref1, ref2, ref3, ref4, ref5;\n this.object.needsUpdate = true;\n this.updateObject();\n this.updateMessage();\n if (this.character !== this.object.character) {\n gs.GlobalEventManager.emit(\"talkingEnded\", this, {\n character: this.character\n });\n this.character = this.object.character;\n }\n if (this.object.textRenderer.isWaiting !== this.isWaiting || this.object.textRenderer.isRunning !== this.isRunning || (((ref = this.voice) != null ? ref.playing : void 0) && (!((ref1 = this.object.character) != null ? ref1.timeTalkingToVoiceVolume : void 0) || this.voice.averageVolume > this.object.character.talkingVolume)) !== this.isVoicePlaying) {\n this.isWaiting = this.object.textRenderer.isWaiting;\n this.isRunning = this.object.textRenderer.isRunning;\n this.isVoicePlaying = ((ref2 = this.voice) != null ? ref2.playing : void 0) && (!((ref3 = this.object.character) != null ? ref3.timeTalkingToVoiceVolume : void 0) || this.voice.averageVolume > this.object.character.talkingVolume);\n if (!this.tempSettings.skip) {\n if ((ref4 = this.voice) != null ? ref4.playing : void 0) {\n if (!this.isVoicePlaying) {\n gs.GlobalEventManager.emit(\"talkingEnded\", this, {\n character: this.object.character\n });\n } else {\n gs.GlobalEventManager.emit(\"talkingStarted\", this, {\n character: this.object.character\n });\n }\n } else {\n if (this.isWaiting) {\n gs.GlobalEventManager.emit(\"talkingEnded\", this, {\n character: this.object.character\n });\n } else if (this.isRunning) {\n gs.GlobalEventManager.emit(\"talkingStarted\", this, {\n character: this.object.character\n });\n }\n }\n }\n }\n if ((this.object.layoutRect != null) && (((ref5 = this.object.parent) != null ? ref5.dstRect : void 0) != null)) {\n if (this.object.layoutRect.x) {\n this.object.dstRect.x = this.object.layoutRect.x(this.object.parent.dstRect.width);\n }\n if (this.object.layoutRect.y) {\n this.object.dstRect.y = this.object.layoutRect.y(this.object.parent.dstRect.height);\n }\n if (this.object.layoutRect.width) {\n this.object.dstRect.width = this.object.layoutRect.width(this.object.parent.dstRect.width);\n }\n if (this.object.layoutRect.height) {\n return this.object.dstRect.height = this.object.layoutRect.height(this.object.parent.dstRect.height);\n }\n }\n };\n\n return Component_MessageBehavior;\n\n})(gs.Component);\n\nvn.Component_MessageBehavior = Component_MessageBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFPQTs7Ozs7Ozs7O0FBQUEsSUFBQSxzQ0FBQTtFQUFBOzs7QUFTTTs7O0VBQ0YsV0FBQyxDQUFBLEdBQUQsR0FBTzs7RUFDUCxXQUFDLENBQUEsR0FBRCxHQUFPOzs7Ozs7QUFFWCxFQUFFLENBQUMsV0FBSCxHQUFpQjs7QUFHWDs7O0VBQ0YseUJBQUMsQ0FBQSxvQkFBRCxHQUF3QixDQUFDLGtCQUFELEVBQXFCLGlCQUFyQjs7O0FBRXhCOzs7Ozs7Ozs7c0NBUUEsbUJBQUEsR0FBcUIsU0FBQyxJQUFELEVBQU8sT0FBUDtJQUNqQixJQUFDLENBQUEsWUFBRCxHQUFnQixXQUFXLENBQUM7V0FDNUIsSUFBQyxDQUFBLGtCQUFELENBQUE7RUFGaUI7OztBQUlyQjs7Ozs7Ozs7OztFQVNhLG1DQUFBOztBQUNUOzs7Ozs7SUFNQSxJQUFDLENBQUEsWUFBRCxHQUFnQixXQUFXLENBQUM7O0FBRTVCOzs7Ozs7SUFNQSxJQUFDLENBQUEsU0FBRCxHQUFhOztBQUViOzs7Ozs7SUFNQSxJQUFDLENBQUEsU0FBRCxHQUFhOztBQUViOzs7Ozs7SUFNQSxJQUFDLENBQUEsY0FBRCxHQUFrQjs7QUFFbEI7Ozs7OztJQU1BLElBQUMsQ0FBQSxhQUFELEdBQXFCLElBQUEsRUFBRSxDQUFDLEtBQUgsQ0FBUyxDQUFULEVBQVksQ0FBWjs7QUFFckI7Ozs7OztJQU1BLElBQUMsQ0FBQSxPQUFELEdBQVc7O0FBRVg7Ozs7OztJQU1BLElBQUMsQ0FBQSxRQUFELEdBQVk7O0FBRVo7Ozs7O0lBS0EsSUFBQyxDQUFBLEtBQUQsR0FBUzs7QUFFVDs7Ozs7OztJQU9BLElBQUMsQ0FBQSxPQUFELEdBQVc7O0FBRVg7Ozs7OztJQU1BLElBQUMsQ0FBQSxjQUFELEdBQWtCOztBQUVsQjs7Ozs7O0lBTUEsSUFBQyxDQUFBLGtCQUFELEdBQXNCO0lBRXRCLElBQUMsQ0FBQSxlQUFELEdBQW1CLENB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QUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUE1QyxFQUFqRDs7TUFDQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQXRCO1FBQTZCLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQWhCLEdBQW9CLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQW5CLENBQXFCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUE1QyxFQUFqRDs7TUFDQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQXRCO1FBQWlDLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQWhCLEdBQXdCLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQW5CLENBQXlCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFoRCxFQUF6RDs7TUFDQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQXRCO2VBQWtDLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWhCLEdBQXlCLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQW5CLENBQTBCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFqRCxFQUEzRDtPQUpKOztFQTFCSTs7OztHQTliNEIsRUFBRSxDQUFDOztBQTZkM0MsRUFBRSxDQUFDLHlCQUFILEdBQStCIiwic291cmNlc0NvbnRlbnQiOlsiIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jXG4jICAgU2NyaXB0OiBDb21wb25lbnRfTWVzc2FnZUJlaGF2aW9yXG4jXG4jICAgJCRDT1BZUklHSFQkJFxuI1xuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jIyMqXG4qIEFuIGVudW1lcmF0aW9uIG9mIGdhbWUgbWVzc2FnZSBtb2Rlcy5cbipcbiogQURWIC0gQWR2ZW50dXJlIE1vZGVcbiogTlZMIC0gTm92ZWwgTW9kZVxuKlxuKiBAdHlwZWRlZiBNZXNzYWdlTW9kZVxuKiBAbWVtYmVyb2Ygdm5cbiMjI1xuY2xhc3MgTWVzc2FnZU1vZGVcbiAgICBAQURWID0gMFxuICAgIEBOVkwgPSAxXG4gICAgXG52bi5NZXNzYWdlTW9kZSA9IE1lc3NhZ2VNb2RlXG5cblxuY2xhc3MgQ29tcG9uZW50X01lc3NhZ2VCZWhhdmlvciBleHRlbmRzIGdzLkNvbXBvbmVudFxuICAgIEBvYmplY3RDb2RlY0JsYWNrTGlzdCA9IFtcIm9uTWVzc2FnZVdhaXRpbmdcIiwgXCJvbk1lc3NhZ2VGaW5pc2hcIl1cbiAgICBcbiAgICAjIyMqXG4gICAgKiBDYWxsZWQgaWYgdGhpcyBvYmplY3QgaW5zdGFuY2UgaXMgcmVzdG9yZWQgZnJvbSBhIGRhdGEtYnVuZGxlLiBJdCBjYW4gYmUgdXNlZFxuICAgICogcmUtYXNzaWduIGV2ZW50LWhhbmRsZXIsIGFub255bW91cyBmdW5jdGlvbnMsIGV0Yy5cbiAgICAqIFxuICAgICogQG1ldGhvZCBvbkRhdGFCdW5kbGVSZXN0b3JlLlxuICAgICogQHBhcmFtIE9iamVjdCBkYXRhIC0gVGhlIGRhdGEtYnVuZGxlXG4gICAgKiBAcGFyYW0gZ3MuT2JqZWN0Q29kZWNDb250ZXh0IGNvbnRleHQgLSBUaGUgY29kZWMtY29udGV4dC5cbiAgICAjIyNcbiAgICBvbkRhdGFCdW5kbGVSZXN0b3JlOiAoZGF0YSwgY29udGV4dCkgLT5cbiAgICAgICAgQHRlbXBTZXR0aW5ncyA9IEdhbWVNYW5hZ2VyLnRlbXBTZXR0aW5nc1xuICAgICAgICBAc2V0dXBFdmVudEhhbmRsZXJzKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQSBiZWhhdmlvci1jb21wb25lbnQgdG8gZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBhIGdhbWUtbWVzc2FnZS5cbiAgICAqXG4gICAgKiBAbW9kdWxlIHZuXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X01lc3NhZ2VCZWhhdmlvclxuICAgICogQGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgKiBAbWVtYmVyb2Ygdm5cbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICMjI1xuICAgIGNvbnN0cnVjdG9yOiAtPlxuICAgICAgICAjIyMqXG4gICAgICAgICogUmVmZXJlbmNlIHRvIHRlbXBvcmFyeSBnYW1lIHNldHRpbmdzLlxuICAgICAgICAqIEBwcm9wZXJ0eSBzZXR0aW5nc1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEB0ZW1wU2V0dGluZ3MgPSBHYW1lTWFuYWdlci50ZW1wU2V0dGluZ3NcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2UgaXMgY3VycmVudGx5IHdhaXRpbmcuXG4gICAgICAgICogQHByb3BlcnR5IGlzV2FpdGluZ1xuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBpc1dhaXRpbmcgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgbWVzc2FnZSBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICAgICAgKiBAcHJvcGVydHkgaXNSdW5uaW5nXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAqIEByZWFkT25seVxuICAgICAgICAjIyNcbiAgICAgICAgQGlzUnVubmluZyA9IG5vXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogSW5kaWNhdGVzIGlmIGEgdm9pY2UgaXMgY3VycmVudGx5IHBsYXlpbmcgdG9nZXRoZXIgd2l0aCB0aGUgbWVzc2FnZS5cbiAgICAgICAgKiBAcHJvcGVydHkgaXNWb2ljZVBsYXlpbmdcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICMjI1xuICAgICAgICBAaXNWb2ljZVBsYXlpbmcgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEN1cnJlbnQgbWVzc2FnZSBjYXJldC9jdXJzb3IgcG9zaXRpb24uXG4gICAgICAgICogQHByb3BlcnR5IGNhcmV0UG9zaXRpb25cbiAgICAgICAgKiBAdHlwZSBncy5Qb2ludFxuICAgICAgICAqIEByZWFkT25seVxuICAgICAgICAjIyNcbiAgICAgICAgQGNhcmV0UG9zaXRpb24gPSBuZXcgZ3MuUG9pbnQoMCwgMClcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBDdXJyZW50IHJhdyBtZXNzYWdlIHRleHQuXG4gICAgICAgICogQHByb3BlcnR5IG1lc3NhZ2VcbiAgICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBtZXNzYWdlID0gXCJcIlxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEFsbCBjdXJyZW50bHkgZGlzcGxheWVkIHJhdyBtZXNzYWdlcy5cbiAgICAgICAgKiBAcHJvcGVydHkgbWVzc2FnZXNcbiAgICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICAqIEByZWFkT25seVxuICAgICAgICAjIyNcbiAgICAgICAgQG1lc3NhZ2VzID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBWb2ljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS5cbiAgICAgICAgKiBAcHJvcGVydHkgdm9pY2VcbiAgICAgICAgKiBAdHlwZSBncy5BdWRpb0J1ZmZlclJlZmVyZW5jZVxuICAgICAgICAjIyNcbiAgICAgICAgQHZvaWNlID0gbnVsbFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiBjdXJyZW50IG1lc3NhZ2UgaXMgcGFydGlhbC4gREVQUkVDQVRFRC4gUGxlYXNlIGRvIG5vdCB1c2UuXG4gICAgICAgICogQHByb3BlcnR5IHBhcnRpYWxcbiAgICAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBwYXJ0aWFsID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2UgaXMgY3VycmVudGx5IHdhaXRpbmcgaW4gbGl2ZS1wcmV2aWV3LlxuICAgICAgICAqIEBwcm9wZXJ0eSB3YWl0aW5nUHJldmlld1xuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEB3YWl0aW5nUHJldmlldyA9IG5vXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBhdXRvLW1lc3NhZ2UgaXMgZW5hYmxlZC5cbiAgICAgICAgKiBAcHJvcGVydHkgYXV0b01lc3NhZ2VFbmFibGVkXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAqIEByZWFkT25seVxuICAgICAgICAjIyNcbiAgICAgICAgQGF1dG9NZXNzYWdlRW5hYmxlZCA9IG5vXG4gICAgICBcbiAgICAgICAgQG9uTWVzc2FnZUZpbmlzaCA9IChzZW5kZXIpID0+XG4gICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0IFwiZmluaXNoXCIsIHRoaXNcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgQG9iamVjdC5zZXR0aW5ncy5hdXRvRXJhc2Ugb3IgQG9iamVjdC5zZXR0aW5ncy5wYXJhZ3JhcGhTcGFjaW5nID4gMFxuICAgICAgICAgICAgICAgIEBtZXNzYWdlID0gXCJcIlxuICAgICAgICAgICAgXG4gICAgICAgIEBvbk1lc3NhZ2VXYWl0aW5nID0gKHNlbmRlcikgPT5cbiAgICAgICAgICAgIGlmICFAb2JqZWN0LnRleHRSZW5kZXJlci5pc0JhdGNoZWQoKSBvciAhQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNCYXRjaEluUHJvZ3Jlc3MoKVxuICAgICAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZCA9ICFAcGFydGlhbFxuICAgICAgICAgICAgICAgIEBvYmplY3QuZXZlbnRzLmVtaXQgXCJ3YWl0aW5nXCIsIHRoaXNcbiAgICAgICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBSZWZlcmVuY2UgdG8gZ2FtZSBzZXR0aW5ncy5cbiAgICAqIEBwcm9wZXJ0eSBzZXR0aW5nc1xuICAgICogQHR5cGUgT2JqZWN0XG4gICAgKiBAcHJvdGVjdGVkXG4gICAgIyMjXG4gICAgQGFjY2Vzc29ycyBcInNldHRpbmdzXCIsIGdldDogLT4gR2FtZU1hbmFnZXIuc2V0dGluZ3NcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBZGRzIGV2ZW50LWhhbmRsZXJzXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cEV2ZW50SGFuZGxlcnNcbiAgICAjIyMgXG4gICAgc2V0dXBFdmVudEhhbmRsZXJzOiAtPlxuICAgICAgICBAb2JqZWN0LmV2ZW50cy5vZmZCeU93bmVyKFwibWVzc2FnZUZpbmlzaFwiLCB0aGlzKVxuICAgICAgICBAb2JqZWN0LmV2ZW50cy5vZmZCeU93bmVyKFwibWVzc2FnZVdhaXRpbmdcIiwgdGhpcylcbiAgICAgICAgXG4gICAgICAgIEBvYmplY3QuZXZlbnRzLm9uIFwibWVzc2FnZUZpbmlzaFwiLCBncy5DYWxsQmFjayhcIm9uTWVzc2FnZUZpbmlzaFwiLCB0aGlzKSwgbnVsbCwgdGhpc1xuICAgICAgICBAb2JqZWN0LmV2ZW50cy5vbiBcIm1lc3NhZ2VXYWl0aW5nXCIsIGdzLkNhbGxCYWNrKFwib25NZXNzYWdlV2FpdGluZ1wiLCB0aGlzKSwgbnVsbCwgdGhpc1xuICAgICAgICAgICAgXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwicHJldmlld1dhaXRpbmdcIiwgdGhpcylcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9mZkJ5T3duZXIoXCJwcmV2aWV3UmVzdGFydFwiLCB0aGlzKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub24gXCJwcmV2aWV3V2FpdGluZ1wiLCAoKHNlbmRlcikgPT5cbiAgICAgICAgICAgIEB3YWl0aW5nUHJldmlldyA9IHllc1xuICAgICAgICApLCBudWxsLCB0aGlzXG4gICAgICAgIFxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub24gXCJwcmV2aWV3UmVzdGFydFwiLCAoKHNlbmRlcikgPT5cbiAgICAgICAgICAgIEB3YWl0aW5nUHJldmlldyA9IG5vXG4gICAgICAgICksIG51bGwsIHRoaXNcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogU2V0dXAgdGhlIGNvbXBvbmVudC4gQWRkcyBldmVudCBoYW5kbGVycy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwXG4gICAgIyMjXG4gICAgc2V0dXA6IC0+XG4gICAgICAgIEBzZXR1cEV2ZW50SGFuZGxlcnMoKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBEaXNwb3NlcyB0aGUgY29tcG9uZW50LlxuICAgICpcbiAgICAqIEBtZXRob2QgdG9EYXRhQnVuZGxlXG4gICAgIyMjICAgXG4gICAgZGlzcG9zZTogLT5cbiAgICAgICAgc3VwZXJcbiAgICAgICAgXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwicHJldmlld1dhaXRpbmdcIiwgdGhpcylcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9mZkJ5T3duZXIoXCJwcmV2aWV3UmVzdGFydFwiLCB0aGlzKVxuICAgICAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIE5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4gICAgKlxuICAgICogQG1ldGhvZCB0b0RhdGFCdW5kbGVcbiAgICAjIyNcbiAgICB0b0RhdGFCdW5kbGU6IC0+XG4gICAgIyMjKlxuICAgICogTm90IGltcGxlbWVudGVkIHlldC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHJlc3RvcmVcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBidW5kbGUgLSBBIGRhdGEgYnVuZGxlLlxuICAgICMjIyAgICBcbiAgICByZXN0b3JlOiAoYnVuZGxlKSAtPlxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gdG8gc2hvdyBhIGdhbWUgbWVzc2FnZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNob3dNZXNzYWdlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gc2VuZGVyIC0gVGhlIHNlbmRlciBvZiB0aGlzIGFjdGlvbi5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMuXG4gICAgIyMjXG4gICAgc2hvd01lc3NhZ2U6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgZ3MuR2FtZU5vdGlmaWVyLnBvc3RDb250ZXh0Q2hhbmdlKGxjc20ocGFyYW1zLm1lc3NhZ2UpKVxuICAgICAgICBcbiAgICAgICAgQHBhcnRpYWwgPSBwYXJhbXMucGFydGlhbFxuICAgICAgICBAbWVzc2FnZSArPSBsY3NtKHBhcmFtcy5tZXNzYWdlKVxuICAgICAgICBAYWRkTWVzc2FnZShwYXJhbXMubWVzc2FnZSwgUmVjb3JkTWFuYWdlci5jaGFyYWN0ZXJzW3BhcmFtcy5jaGFyYWN0ZXJJZF0sIEBvYmplY3QubWVzc2FnZXMubGVuZ3RoID4gMCBhbmQgQG9iamVjdC5zZXR0aW5ncy5wYXJhZ3JhcGhTcGFjaW5nID4gMCwgIUBwYXJ0aWFsKVxuICAgICAgICBcbiAgICAgICAgaWYgQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNCYXRjaGVkKClcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZCA9IHllc1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSAhQHBhcnRpYWxcbiAgICAgICAgICAgIFxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBEZXByZWNhdGVkLiBOb3QgbG9uZ2VyIHVzZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVCaXRtYXBcbiAgICAjIyNcbiAgICB1cGRhdGVCaXRtYXA6IC0+XG4gICAgICAgIGlmICFAb2JqZWN0LmJpdG1hcCBvciBAb2JqZWN0LmJpdG1hcC53aWR0aCAhPSBAb2JqZWN0LmRzdFJlY3Qud2lkdGggb3IgQG9iamVjdC5iaXRtYXAuaGVpZ2h0ICE9IEBvYmplY3QuZHN0UmVjdC5oZWlnaHRcbiAgICAgICAgICAgIEBvYmplY3QuYml0bWFwPy5kaXNwb3NlKClcbiAgICAgICAgICAgIEBvYmplY3QuYml0bWFwID0gbmV3IEJpdG1hcChAb2JqZWN0LmRzdFJlY3Qud2lkdGgsIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQpXG4gICAgICAgICAgICBAb2JqZWN0LmJpdG1hcC5mb250ID0gQG9iamVjdC5mb250XG4gICAgICAgICAgXG4gICAgIyMjKlxuICAgICogUmVzdG9yZXMgYSBOVkwgZ2FtZSBtZXNzYWdlIG9mIGFuIGFycmF5IG9mIG1lc3NhZ2Utb2JqZWN0cy4gVGhhdCBpc1xuICAgICogbmVjZXNzYXJ5IHRvIHJlc3RvcmUgYSBOVkwgZ2FtZSBtZXNzYWdlIGZyb20gYSBzYXZlLWdhbWUuXG4gICAgKlxuICAgICogQG1ldGhvZCByZXN0b3JlTWVzc2FnZXNcbiAgICAqIEBwYXJhbSB7QXJyYXl9IG1lc3NhZ2VzIC0gQW4gYXJyYXkgb2YgbWVzc2FnZXMgdG8gcmVzdG9yZS5cbiAgICAjIyNcbiAgICByZXN0b3JlTWVzc2FnZXM6IChtZXNzYWdlcykgLT5cbiAgICAgICAgQHVwZGF0ZUJpdG1hcCgpXG4gICAgICAgIEBjbGVhcigpXG4gICAgICAgIFxuICAgICAgICBAb2JqZWN0Lm9wYWNpdHkgPSAyNTVcbiAgICAgICAgQG9iamVjdC5zcmNSZWN0ID0gbmV3IFJlY3QoMCwgMCwgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0KVxuICAgICAgICBcbiAgICAgICAgZm9yIG1lc3NhZ2UgaW4gbWVzc2FnZXNcbiAgICAgICAgICAgIEBvYmplY3QuZm9udC5jb2xvciA9IG5ldyBDb2xvcihtZXNzYWdlLmNoYXJhY3Rlcj8udGV4dENvbG9yIHx8IENvbG9yLldISVRFKVxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuZHJhd0Zvcm1hdHRlZFRleHRJbW1lZGlhdGVseSgwLCAwLCBAb2JqZWN0LmRzdFJlY3Qud2lkdGgsIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQsIGxjc20obWVzc2FnZS50ZXh0ID8gbWVzc2FnZSksIHllcylcblxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBZGRzIGEgbmV3IG1lc3NhZ2UuXG4gICAgKiBcbiAgICAqIEBtZXRob2QgYWRkTWVzc2FnZVxuICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBUaGUgbWVzc2FnZS5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaGFyYWN0ZXIgLSBEYXRhYmFzZS1SZWNvcmQgb2YgYSBjaGFyYWN0ZXIuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5ld0xpbmUgLSBJbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIG1ha2UgYSBsaW5lIGJyZWFrLlxuICAgICMjI1xuICAgIGFkZE1lc3NhZ2U6IChtZXNzYWdlLCBjaGFyYWN0ZXIsIG5ld0xpbmUsIHdhaXRBdEVuZCkgLT5cbiAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIucGFydGlhbE1lc3NhZ2UgPSBudWxsXG4gICAgICAgIEBvYmplY3Qub2Zmc2V0ID0geDogMCwgeTogMFxuICAgICAgICBAb2JqZWN0LnZpc2libGUgPSB5ZXNcbiAgICAgICAgXG4gICAgICAgIEBvYmplY3QubWVzc2FnZXMucHVzaCh7IHRleHQ6IG1lc3NhZ2UsIGNoYXJhY3RlcjogY2hhcmFjdGVyfSlcbiAgICAgICAgXG4gICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZCA9IHdhaXRBdEVuZFxuICAgICAgICBpZiBub3QgQG9iamVjdC5zZXR0aW5ncy5hdXRvRXJhc2VcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmN1cnJlbnRZICs9IEBvYmplY3Quc2V0dGluZ3MucGFyYWdyYXBoU3BhY2luZ1xuICAgICAgICBpZiBuZXdMaW5lXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci5uZXdMaW5lKClcbiAgICAgICAgQHVwZGF0ZUJpdG1hcCgpXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgY2hhcmFjdGVyPyBhbmQgQG9iamVjdC5zZXR0aW5ncy51c2VDaGFyYWN0ZXJDb2xvclxuICAgICAgICAgICAgQG9iamVjdC5mb250LmNvbG9yID0gbmV3IENvbG9yKGNoYXJhY3Rlcj8udGV4dENvbG9yIHx8IENvbG9yLldISVRFKVxuICAgICAgICAgICAgXG4gICAgICAgIEBvYmplY3Qub3BhY2l0eSA9IDI1NVxuICAgICAgICBAb2JqZWN0LnNyY1JlY3QgPSBuZXcgUmVjdCgwLCAwLCBAb2JqZWN0LmRzdFJlY3Qud2lkdGgsIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQpXG4gICAgIFxuICAgICAgICBAdXBkYXRlKClcbiAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuZHJhd0Zvcm1hdHRlZFRleHQoMCwgMCwgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0LCBtZXNzYWdlLCB5ZXMpXG5cbiAgICAjIyMqXG4gICAgKiBDbGVhcnMgdGhlIGdhbWUgbWVzc2FnZSBieSBkZWxldGluZy9jbGVhcmluZyBhbGwgbWVzc2FnZXMuXG4gICAgKlxuICAgICogQG1ldGhvZCBjbGVhclxuICAgICMjI1xuICAgIGNsZWFyOiAtPiBcbiAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuY2xlYXIoKVxuICAgICAgICBAb2JqZWN0Lm1lc3NhZ2VzID0gW11cbiAgICAgICAgQG1lc3NhZ2UgPSBcIlwiXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIENsb3NlcyB0aGUgZ2FtZSBtZXNzYWdlIGJ5IG1ha2luZyBpdCBpbnZpc2libGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBjbG9zZVxuICAgICMjI1xuICAgIGNsb3NlOiAtPiBcbiAgICAgICAgQG9iamVjdC52aXNpYmxlID0gbm9cbiAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIHRoZSBkdXJhdGlvbiBvZiBhbiBhc3NvY2lhdGVkIHZvaWNlIG9yIDAgaWYgbm8gdm9pY2UgaXMgYXNzb2NpYXRlZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHZvaWNlRHVyYXRpb25cbiAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGR1cmF0aW9uIGluIGZyYW1lcy5cbiAgICAjIyNcbiAgICB2b2ljZUR1cmF0aW9uOiAtPlxuICAgICAgICBkdXJhdGlvbiA9IDBcbiAgICAgICAgaWYgQHZvaWNlPyBhbmQgKEBzZXR0aW5ncy5hdXRvTWVzc2FnZS53YWl0Rm9yVm9pY2Ugb3IgQHNldHRpbmdzLnRpbWVNZXNzYWdlVG9Wb2ljZSlcbiAgICAgICAgICAgIGR1cmF0aW9uID0gTWF0aC5yb3VuZCgoQHZvaWNlLnNvdXJjZS5idWZmZXIuZHVyYXRpb24gKiAoMS4wIC8gQHZvaWNlLnNvdXJjZS5wbGF5YmFja1JhdGUudmFsdWUpKSAqIDEwMDAgLyAxNi42KVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBkdXJhdGlvbiA9IDBcbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gaWYgQHRlbXBTZXR0aW5ncy5za2lwIHRoZW4gMSBlbHNlIGR1cmF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEdldHMgdGhlIGR1cmF0aW9uIG9mIHJlbmRlcmluZyB0aGUgZ2FtZS1tZXNzYWdlLlxuICAgICpcbiAgICAqIEBtZXRob2QgbWVzc2FnZUR1cmF0aW9uXG4gICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgIyMjXG4gICAgbWVzc2FnZUR1cmF0aW9uOiAtPiBcbiAgICAgICAgZHVyYXRpb24gPSBAb2JqZWN0LnRleHRSZW5kZXJlci5jYWxjdWxhdGVEdXJhdGlvbigpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gaWYgQHRlbXBTZXR0aW5ncy5za2lwIHRoZW4gMSBlbHNlIGR1cmF0aW9uXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEdldHMgdGhlIHRpbWUgYmV0d2VlbiB0d28gbWVzc2FnZXMgaW4gYXV0by1yZWFkIG1vZGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBhdXRvTWVzc2FnZVRpbWVcbiAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRpbWUgaW4gZnJhbWVzLlxuICAgICMjI1xuICAgIGF1dG9NZXNzYWdlVGltZTogLT4gXG4gICAgICAgIGlmIEB0ZW1wU2V0dGluZ3Muc2tpcFxuICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgucm91bmQoQHNldHRpbmdzLmF1dG9NZXNzYWdlLnRpbWUgKiBHcmFwaGljcy5mcmFtZVJhdGUpLCBAdm9pY2VEdXJhdGlvbigpIC0gQG1lc3NhZ2VEdXJhdGlvbigpKVxuICAgIFxuICAgICMjIypcbiAgICAqIEdldHMgdGhlIGN1cnJlbnQgbWVzc2FnZSBzcGVlZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG1lc3NhZ2VTcGVlZFxuICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbWVzc2FnZSBzcGVlZC5cbiAgICAjIyNcbiAgICBtZXNzYWdlU3BlZWQ6IC0+IE1hdGgubWF4KDExIC0gTWF0aC5yb3VuZChHYW1lTWFuYWdlci5zZXR0aW5ncy5tZXNzYWdlU3BlZWQgKiAyLjUpLCAwKVxuICAgIFxuICAgICMjIypcbiAgICAqIENoZWNrcyBpZiBhIG1vdXNlLWJ1dHRvbiBvciBrZXkgd2FzIHByZXNzZWQgdG8gY29udGludWUgd2l0aCB0aGUgbWVzc2FnZS1yZW5kZXJpbmcuXG4gICAgKlxuICAgICogQG1ldGhvZCBhY3Rpb25UcmlnZ2VyXG4gICAgKiBAcmV0dXJuIHtib29sZWFufSBJZiB0cnVlLCB0aGUgYW4gYWN0aW9uLWJ1dHRvbiBvciBhY3Rpb24ta2V5IGlzIHByZXNzZWQuXG4gICAgIyMjXG4gICAgYWN0aW9uVHJpZ2dlcjogLT4gKGdzLk9iamVjdE1hbmFnZXIuY3VycmVudC5pbnB1dCBhbmQgQG9iamVjdC52aXNpYmxlIGFuZCBAb2JqZWN0LmRzdFJlY3QuY29udGFpbnMoSW5wdXQuTW91c2UueCAtIEBvYmplY3Qub3JpZ2luLngsIElucHV0Lk1vdXNlLnkgLSBAb2JqZWN0Lm9yaWdpbi55KSBhbmQgSW5wdXQuTW91c2UuYnV0dG9uc1tJbnB1dC5Nb3VzZS5MRUZUXSA9PSAyKSBvciBJbnB1dC50cmlnZ2VyKElucHV0LkMpXG4gICAgXG4gICAgZmluaXNoOiAtPlxuICAgICAgICAjQG9iamVjdC5jaGFyYWN0ZXIgPSBudWxsXG4gICAgICAgIFxuICAgICAgICBpZiBAb2JqZWN0LnZvaWNlPyBhbmQgR2FtZU1hbmFnZXIuc2V0dGluZ3Muc2tpcFZvaWNlT25BY3Rpb25cbiAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5zdG9wU291bmQoQG9iamVjdC52b2ljZS5uYW1lKVxuICAgIFxuICAgIGVyYXNlOiAtPlxuICAgICAgICBmYWRpbmcgPSBHYW1lTWFuYWdlci50ZW1wU2V0dGluZ3MubWVzc2FnZUZhZGluZ1xuICAgICAgICBkdXJhdGlvbiA9IGlmIEdhbWVNYW5hZ2VyLnRlbXBTZXR0aW5ncy5za2lwIHRoZW4gMCBlbHNlIGZhZGluZy5kdXJhdGlvblxuICAgICAgICBcbiAgICAgICAgQG9iamVjdC5hbmltYXRvci5kaXNhcHBlYXIoZmFkaW5nLmFuaW1hdGlvbiwgZmFkaW5nLmVhc2luZywgZHVyYXRpb24sID0+XG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc2NlbmUuY3VycmVudENoYXJhY3RlciA9IHsgbmFtZTogXCJcIiB9XG4gICAgICAgICAgICBAY2xlYXIoKVxuICAgICAgICAgICAgQG9iamVjdC52aXNpYmxlID0gbm9cbiAgICAgICAgKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBGSVhNRTogRGVwcmVjYXRlZD8gSXQgaXMgYWxzbyBhIHJlLWRlZmluaXRpb24gb2YgZ3MuQ29tcG9uZW50X1Zpc3VhbC51cGRhdGVPcmlnaW4uXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVPcmlnaW5cbiAgICAjIyNcbiAgICB1cGRhdGVPcmlnaW46IC0+XG4gICAgICAgIG94ID0gMFxuICAgICAgICBveSA9IDBcbiAgICAgICAgaWYgQG9iamVjdC5wYXJlbnQ/IGFuZCBAb2JqZWN0LnBhcmVudC5kc3RSZWN0P1xuICAgICAgICAgICAgcCA9IEBvYmplY3QucGFyZW50XG4gICAgICAgICAgICB3aGlsZSBwPyBhbmQgcC5kc3RSZWN0P1xuICAgICAgICAgICAgICAgIG94ICs9IHAuZHN0UmVjdC54XG4gICAgICAgICAgICAgICAgb3kgKz0gcC5kc3RSZWN0LnlcbiAgICAgICAgICAgICAgICBwID0gcC5wYXJlbnRcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIEBvYmplY3Qub3JpZ2luLnggPSBveFxuICAgICAgICBAb2JqZWN0Lm9yaWdpbi55ID0gb3lcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgb2JqZWN0LiBcbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZU9iamVjdFxuICAgICogQHByaXZhdGVcbiAgICAjIyNcbiAgICB1cGRhdGVPYmplY3Q6IC0+XG4gICAgICAgIEB1cGRhdGVPcmlnaW4oKVxuICAgICAgICBcbiAgICAgICAgaWYgQHRlbXBTZXR0aW5ncy5za2lwIGFuZCBub3QgQHdhaXRpbmdQcmV2aWV3XG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci5pc1dhaXRpbmcgPSBub1xuICAgIFxuICAgICMjIypcbiAgICAqIFVwZGF0ZXMgdGhlIG1lc3NhZ2UuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVNZXNzYWdlXG4gICAgKiBAcHJpdmF0ZVxuICAgICMjI1xuICAgIHVwZGF0ZU1lc3NhZ2U6IC0+XG4gICAgICAgIEBjYXJldFBvc2l0aW9uID0gQG9iamVjdC50ZXh0UmVuZGVyZXIuY2FyZXRQb3NpdGlvblxuICAgICAgICBcbiAgICAgICAgaWYgQHRlbXBTZXR0aW5ncy5za2lwIGFuZCAoQHNldHRpbmdzLmFsbG93U2tpcFVucmVhZE1lc3NhZ2VzIG9yIEdhbWVNYW5hZ2VyLmdsb2JhbERhdGEubWVzc2FnZXNbQG1lc3NhZ2VdPy5yZWFkKVxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuZHJhd0ltbWVkaWF0ZWx5ID0geWVzXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSBAd2FpdGluZ1ByZXZpZXdcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZFRpbWUgPSAwXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgICNAb2JqZWN0LnRleHRSZW5kZXJlci5kcmF3SW1tZWRpYXRlbHkgPSBub1xuICAgICAgICAgICAgQHVwZGF0ZVNwZWVkKClcbiAgICAgICAgICAgIEB1cGRhdGVBdXRvTWVzc2FnZSgpXG4gICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBzcGVlZCBvZiB0aGUgbWVzc2FnZS4gVGhhdCBkZXBlbmRzIG9uIGdhbWUtc2V0dGluZ3MgaWYgYSBtZXNzYWdlXG4gICAgKiBpcyB0aW1lZCB0byBpdHMgdm9pY2Ugb3Igbm90LlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlU3BlZWRcbiAgICAqIEBwcml2YXRlXG4gICAgIyMjXG4gICAgdXBkYXRlU3BlZWQ6IC0+XG4gICAgICAgIHZvaWNlRHVyYXRpb24gPSBAdm9pY2VEdXJhdGlvbigpXG4gICAgICAgIGlmIHZvaWNlRHVyYXRpb24gPiAwIGFuZCBAc2V0dGluZ3MudGltZU1lc3NhZ2VUb1ZvaWNlXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci5zcGVlZCA9IHZvaWNlRHVyYXRpb24gLyBAbWVzc2FnZS5sZW5ndGhcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuc3BlZWQgPSBAbWVzc2FnZVNwZWVkKClcbiAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIFVwZGF0ZSBhdXRvLXJlYWQgbW9kZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZUF1dG9NZXNzYWdlXG4gICAgKiBAcHJpdmF0ZVxuICAgICMjI1xuICAgIHVwZGF0ZUF1dG9NZXNzYWdlOiAtPlxuICAgICAgICBpZiBAc2V0dGluZ3MuYXV0b01lc3NhZ2Uuc3RvcE9uQWN0aW9uIGFuZCBAYWN0aW9uVHJpZ2dlcigpXG4gICAgICAgICAgICBAc2V0dGluZ3MuYXV0b01lc3NhZ2UuZW5hYmxlZCA9IG5vXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgQHNldHRpbmdzLmF1dG9NZXNzYWdlLmVuYWJsZWQgYW5kIG5vdCBAcGFydGlhbFxuICAgICAgICAgICAgaWYgQG9iamVjdC50ZXh0UmVuZGVyZXIud2FpdEF0RW5kXG4gICAgICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNXYWl0aW5nID0gbm9cbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZFRpbWUgPSBAYXV0b01lc3NhZ2VUaW1lKClcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZCA9IG5vXG4gICAgICAgIGVsc2UgaWYgQGF1dG9NZXNzYWdlRW5hYmxlZCAhPSBAc2V0dGluZ3MuYXV0b01lc3NhZ2UuZW5hYmxlZFxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIud2FpdEF0RW5kID0geWVzXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmRUaW1lID0gMFxuICAgICAgICAgICAgXG4gICAgICAgIEBhdXRvTWVzc2FnZUVuYWJsZWQgPSBAc2V0dGluZ3MuYXV0b01lc3NhZ2UuZW5hYmxlZFxuICAgICAgICAgICAgXG4gICAgIyMjXG4gICAgKiBVcGRhdGVzIHRoZSBnYW1lIG1lc3NhZ2UgYmVoYXZpb3JcbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICMjI1xuICAgIHVwZGF0ZTogLT5cbiAgICAgICAgQG9iamVjdC5uZWVkc1VwZGF0ZSA9IHllc1xuICAgICAgICBAdXBkYXRlT2JqZWN0KClcbiAgICAgICAgQHVwZGF0ZU1lc3NhZ2UoKVxuICAgICAgICBcbiAgICAgICAgaWYgQGNoYXJhY3RlciAhPSBAb2JqZWN0LmNoYXJhY3RlciAgIFxuICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLmVtaXQoXCJ0YWxraW5nRW5kZWRcIiwgdGhpcywgY2hhcmFjdGVyOiBAY2hhcmFjdGVyKVxuICAgICAgICAgICAgQGNoYXJhY3RlciA9IEBvYmplY3QuY2hhcmFjdGVyXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNXYWl0aW5nICE9IEBpc1dhaXRpbmcgb3IgQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNSdW5uaW5nICE9IEBpc1J1bm5pbmcgb3IgKEB2b2ljZT8ucGxheWluZyAmJiAoIUBvYmplY3QuY2hhcmFjdGVyPy50aW1lVGFsa2luZ1RvVm9pY2VWb2x1bWUgb3IgQHZvaWNlLmF2ZXJhZ2VWb2x1bWUgPiBAb2JqZWN0LmNoYXJhY3Rlci50YWxraW5nVm9sdW1lKSkgIT0gQGlzVm9pY2VQbGF5aW5nXG4gICAgICAgICAgICBAaXNXYWl0aW5nID0gQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNXYWl0aW5nXG4gICAgICAgICAgICBAaXNSdW5uaW5nID0gQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNSdW5uaW5nXG4gICAgICAgICAgICBAaXNWb2ljZVBsYXlpbmcgPSAoQHZvaWNlPy5wbGF5aW5nICYmICghQG9iamVjdC5jaGFyYWN0ZXI/LnRpbWVUYWxraW5nVG9Wb2ljZVZvbHVtZSBvciBAdm9pY2UuYXZlcmFnZVZvbHVtZSA+IEBvYmplY3QuY2hhcmFjdGVyLnRhbGtpbmdWb2x1bWUpKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiBub3QgQHRlbXBTZXR0aW5ncy5za2lwXG4gICAgICAgICAgICAgICAgaWYgQHZvaWNlPy5wbGF5aW5nXG4gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBAaXNWb2ljZVBsYXlpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwidGFsa2luZ0VuZGVkXCIsIHRoaXMsIGNoYXJhY3RlcjogQG9iamVjdC5jaGFyYWN0ZXIpXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwidGFsa2luZ1N0YXJ0ZWRcIiwgdGhpcywgY2hhcmFjdGVyOiBAb2JqZWN0LmNoYXJhY3RlcilcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGlmIEBpc1dhaXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwidGFsa2luZ0VuZGVkXCIsIHRoaXMsIGNoYXJhY3RlcjogQG9iamVjdC5jaGFyYWN0ZXIpXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgQGlzUnVubmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLmVtaXQoXCJ0YWxraW5nU3RhcnRlZFwiLCB0aGlzLCBjaGFyYWN0ZXI6IEBvYmplY3QuY2hhcmFjdGVyKVxuICAgICAgICBcbiAgICAgICAgaWYgQG9iamVjdC5sYXlvdXRSZWN0PyBhbmQgQG9iamVjdC5wYXJlbnQ/LmRzdFJlY3Q/XG4gICAgICAgICAgICBpZiBAb2JqZWN0LmxheW91dFJlY3QueCB0aGVuIEBvYmplY3QuZHN0UmVjdC54ID0gQG9iamVjdC5sYXlvdXRSZWN0LngoQG9iamVjdC5wYXJlbnQuZHN0UmVjdC53aWR0aClcbiAgICAgICAgICAgIGlmIEBvYmplY3QubGF5b3V0UmVjdC55IHRoZW4gQG9iamVjdC5kc3RSZWN0LnkgPSBAb2JqZWN0LmxheW91dFJlY3QueShAb2JqZWN0LnBhcmVudC5kc3RSZWN0LmhlaWdodClcbiAgICAgICAgICAgIGlmIEBvYmplY3QubGF5b3V0UmVjdC53aWR0aCB0aGVuIEBvYmplY3QuZHN0UmVjdC53aWR0aCA9IEBvYmplY3QubGF5b3V0UmVjdC53aWR0aChAb2JqZWN0LnBhcmVudC5kc3RSZWN0LndpZHRoKVxuICAgICAgICAgICAgaWYgQG9iamVjdC5sYXlvdXRSZWN0LmhlaWdodCB0aGVuIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQgPSBAb2JqZWN0LmxheW91dFJlY3QuaGVpZ2h0KEBvYmplY3QucGFyZW50LmRzdFJlY3QuaGVpZ2h0KVxudm4uQ29tcG9uZW50X01lc3NhZ2VCZWhhdmlvciA9IENvbXBvbmVudF9NZXNzYWdlQmVoYXZpb3IiXX0=\n//# sourceURL=Component_MessageBehavior_131.js"
13 13 },
14 14 "summary": [
15 15 "name",