Subversion Repository Public Repository

Nextrek

Diff Revisions 1085 vs 1086 for /s2s/data/9D2D1D14K49FAA43CBS8582E7937AF84F3A2.json

Diff revisions: vs.
  @@ -6,8 +6,8 @@
6 6 "name": "GameManager",
7 7 "type": "game_script",
8 8 "order": 1,
9 - "content": "# ===================================================================\n#\n# Script: GameManager\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass GameManager\n ###*\n * Manages all general things around the game like holding the game settings,\n * manages the save/load of a game, etc.\n *\n * @module gs\n * @class GameManager\n * @memberof gs\n * @constructor\n ###\n constructor: ->\n ###*\n * The current scene data.\n * @property sceneData\n * @type Object\n ### \n @sceneData = {}\n \n ###*\n * The scene viewport containing all visual objects which are part of the scene and influenced\n * by the in-game camera.\n * @property sceneViewport\n * @type gs.Object_Viewport\n ###\n @sceneViewport = null\n \n ###*\n * The list of common events.\n * @property commonEvents\n * @type gs.Object_CommonEvent[]\n ### \n @commonEvents = []\n \n ###*\n * Indicates if the GameManager is initialized.\n * @property commonEvents\n * @type gs.Object_CommonEvent[]\n ### \n @initialized = no\n \n ###*\n * Temporary game settings.\n * @property tempSettings\n * @type Object\n ### \n @tempSettings = skip: false, skipTime: 5, loadMenuAccess: true, menuAccess: true, backlogAccess: true, saveMenuAccess: true, messageFading: { animation: { type: 1 }, duration: 15, easing: null }\n \n ###*\n * Temporary game fields.\n * @property tempFields\n * @type Object\n ### \n @tempFields = null\n \n ###*\n * Stores default values for backgrounds, pictures, etc.\n * @property defaults\n * @type Object\n ###\n @defaults = { \n background: { \"duration\": 30, \"origin\": 0, \"zOrder\": 0, \"loopVertical\": 0, \"loopHorizontal\": 0, \"easing\": { \"type\": 0, \"inOut\": 1 }, \"animation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n picture: { \"appearDuration\": 30, \"disappearDuration\": 30, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n character: { \"expressionDuration\": 0, \"appearDuration\": 40, \"disappearDuration\": 40, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 2, \"inOut\": 2 }, \"disappearEasing\": { \"type\": 1, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 }, \"changeAnimation\": { \"type\": 1, \"movement\": 0, \"fading\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"changeEasing\": { \"type\": 2, \"inOut\": 2 } },\n text: { \"appearDuration\": 30, \"disappearDuration\": 30, \"positionOrigin\": 0, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n video: { \"appearDuration\": 30, \"disappearDuration\": 30, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n live2d: { \"motionFadeInTime\": 1000, \"appearDuration\": 30, \"disappearDuration\": 30, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } } },\n messageBox: { \"appearDuration\": 30, \"disappearDuration\": 30, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 0, \"movement\": 3, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 0, \"movement\": 3, \"mask\": { \"graphic\": null, \"vague\": 30 } } },\n audio: { \"musicFadeInDuration\": 0, \"musicFadeOutDuration\": 0, \"musicVolume\": 100, \"musicPlaybackRate\": 100, \"soundVolume\": 100, \"soundPlaybackRate\": 100, \"voiceVolume\": 100, \"voicePlaybackRate\": 100 }\n }\n \n ###*\n * The game's backlog.\n * @property backlog\n * @type Object[]\n ### \n @backlog = []\n \n ###*\n * Character parameters by character ID.\n * @property characterParams\n * @type Object[]\n ### \n @characterParams = []\n \n ###*\n * The game's chapter\n * @property chapters\n * @type gs.Document[]\n ### \n @chapters = []\n \n ###*\n * The game's current displayed messages. Especially in NVL mode the messages \n * of the current page are stored here.\n * @property messages\n * @type Object[]\n ### \n @messages = []\n \n ###*\n * Count of save slots. Default is 100.\n * @property saveSlotCount\n * @type number\n ### \n @saveSlotCount = 100\n \n ###*\n * The index of save games. Contains the header-info for each save game slot.\n * @property saveGameSlots\n * @type Object[]\n ### \n @saveGameSlots = []\n \n ###*\n * Stores global data like the state of persistent game variables.\n * @property globalData\n * @type Object\n ### \n @globalData = null\n \n ###*\n * Indicates if the game runs in editor's live-preview.\n * @property inLivePreview\n * @type Object\n ### \n @inLivePreview = no\n \n \n ###*\n * Initializes the GameManager, should be called before the actual game starts.\n *\n * @method initialize\n ### \n initialize: ->\n @initialized = yes\n @inLivePreview = $PARAMS.preview?\n @saveSlotCount = RecordManager.system.saveSlotCount || 100\n @tempFields = new gs.GameTemp()\n window.$tempFields = @tempFields\n \n @createSaveGameIndex()\n @variableStore = new gs.VariableStore()\n @variableStore.setupDomains(DataManager.getDocumentsByType(\"global_variables\").select (v) -> v.items.domain||\"\")\n @variableStore.persistentNumbers = @globalData.persistentNumbers ? @variableStore.persistentNumbers\n @variableStore.persistentBooleans = @globalData.persistentBooleans ? @variableStore.persistentBooleans\n @variableStore.persistentStrings = @globalData.persistentStrings ? @variableStore.persistentStrings\n @variableStore.persistentLists = @globalData.persistentLists ? @variableStore.persistentLists\n \n @sceneViewport = new gs.Object_Viewport(new Viewport(0, 0, Graphics.width, Graphics.height, Graphics.viewport))\n for character in RecordManager.charactersArray\n if character?\n @characterParams[character.index] = {}\n if character.params?\n for param in character.params\n @characterParams[character.index][param.name] = param.value \n\n \n @setupCommonEvents()\n \n for i in [0...RecordManager.characters]\n @settings.voicesPerCharacter[i] = 100\n \n @chapters = DataManager.getDocumentsByType(\"vn.chapter\")\n @chapters.sort (a, b) ->\n if a.items.order > b.items.order\n return 1\n else if a.items.order < b.items.order\n return -1\n else\n return 0\n \n ###*\n * Sets up common events.\n *\n * @method setupCommonEvents\n ### \n setupCommonEvents: ->\n for event in @commonEvents\n event?.dispose()\n \n @commonEvents = [] \n for event in RecordManager.commonEvents\n continue if not event\n if event.startCondition == 1 and event.autoPreload\n gs.ResourceLoader.loadEventCommandsGraphics(event.commands)\n \n object = new gs.Object_CommonEvent()\n object.record = event\n object.rid = event.index\n @commonEvents[event.index] = object\n @commonEvents.push(object)\n \n ###*\n * Sets up cursor depending on system settings.\n *\n * @method setupCursor\n ###\n setupCursor: ->\n if RecordManager.system.cursor?.name\n bitmap = ResourceManager.getBitmap(\"Graphics/Pictures/#{RecordManager.system.cursor.name}\")\n Graphics.setCursorBitmap(bitmap, RecordManager.system.cursor.hx, RecordManager.system.cursor.hy)\n else\n Graphics.setCursorBitmap(null)\n \n ###*\n * Disposes the GameManager. Should be called before quit the game.\n *\n * @method dispose\n ### \n dispose: ->\n \n ###*\n * Quits the game. The implementation depends on the platform. So for example on mobile\n * devices this method has no effect.\n *\n * @method exit\n ### \n exit: -> Application.exit()\n \n ###*\n * Resets the GameManager by disposing and re-initializing it.\n *\n * @method reset\n ### \n reset: ->\n @initialized = no\n @interpreter = null\n @dispose()\n @initialize()\n \n ###*\n * Starts a new game.\n *\n * @method newGame\n ### \n newGame: ->\n @messages = []\n @variableStore.clearAllGlobalVariables()\n @variableStore.clearAllLocalVariables()\n @tempSettings.skip = no\n @tempFields.clear()\n @tempFields.inGame = yes\n @setupCommonEvents()\n @tempSettings.menuAccess = yes\n @tempSettings.saveMenuAccess = yes\n @tempSettings.loadMenuAccess = yes\n @tempSettings.backlogAccess = yes\n \n \n ###*\n * Exists the game and resets the GameManager which is important before going back to\n * the main menu or title screen.\n *\n * @method exitGame\n ### \n exitGame: ->\n @tempFields.inGame = no \n @tempFields.isExitingGame = yes\n \n ###*\n * Updates the GameManager. Should be called once per frame.\n *\n * @method update\n ### \n update: ->\n \n ###*\n * Creates the index of all save-games. Should be called whenever a new save game\n * is created.\n *\n * @method createSaveGameIndex\n * @protected\n ### \n createSaveGameIndex: ->\n @saveGameSlots = []\n for i in [0...@saveSlotCount]\n if GameStorage.exists(\"SaveGame_#{i}_Header\")\n header = GameStorage.getObject(\"SaveGame_#{i}_Header\")\n chapter = DataManager.getDocument(header.chapterUid)\n scene = DataManager.getDocumentSummary(header.sceneUid)\n image = header.image\n else\n header = null\n chaper = null\n scene = null\n \n if chapter? and scene? and !@inLivePreview\n @saveGameSlots.push({\n date: header.date,\n chapter: chapter.items.name || \"DELETED\"\n scene: scene.items.name || \"DELETED\",\n image: image #chapter.items.commands[0].params.saveGameGraphic?.name\n })\n else\n @saveGameSlots.push({ \"date\": \"\", \"chapter\": \"\", \"scene\": \"\", \"image\": null })\n \n return @saveGameSlots\n \n ###*\n * Resets the game's settings to its default values.\n *\n * @method resetSettings\n ### \n resetSettings: ->\n @settings = { version: 339, renderer: 0, filter: 1, confirmation: yes, adjustAspectRatio: no, allowSkip: yes, allowSkipUnreadMessages: yes, allowVideoSkip: yes, skipVoiceOnAction: yes, allowChoiceSkip: no, voicesByCharacter: [], timeMessageToVoice: true, \"autoMessage\": { enabled: false, time: 0, waitForVoice: yes, stopOnAction: no }, \"voiceEnabled\": true, \"bgmEnabled\": true, \"soundEnabled\": true, \"voiceVolume\": 100, \"bgmVolume\": 100, \"seVolume\": 100, \"messageSpeed\": 4, \"fullScreen\": no, \"aspectRatio\": 0 }\n @saveGameSlots = []\n for i in [0...@saveSlotCount]\n GameStorage.remove(\"SaveGame_#{i}_Header\")\n GameStorage.remove(\"SaveGame_#{i}\")\n \n @saveGameSlots.push({ \"date\": \"\", \"chapter\": \"\", \"scene\": \"\", \"thumb\": \"\" })\n \n GameStorage.setObject(\"settings\", @settings)\n @globalData = { messages: {}, cgGallery: {} }\n GameStorage.setObject(\"globalData\", @globalData)\n \n ###*\n * Saves current game settings.\n *\n * @method saveSettings\n ### \n saveSettings: ->\n GameStorage.setObject(\"settings\", @settings)\n \n ###*\n * Saves current global data.\n *\n * @method saveGlobalData\n ### \n saveGlobalData: ->\n @globalData.persistentNumbers = @variableStore.persistentNumbers\n @globalData.persistentLists = @variableStore.persistentLists\n @globalData.persistentBooleans = @variableStore.persistentBooleans\n @globalData.persistentStrings = @variableStore.persistentStrings\n GameStorage.setObject(\"globalData\", @globalData)\n \n ###*\n * Resets current global data. All stored data about read messages, persistent variables and\n * CG gallery will be deleted.\n *\n * @method resetGlobalData\n ### \n resetGlobalData: ->\n @globalData = { messages: {}, cgGallery: {}, version: 339 }\n \n for cg, i in RecordManager.cgGalleryArray\n if cg?\n @globalData.cgGallery[cg.index] = { unlocked: no }\n \n GameStorage.setObject(\"globalData\", @globalData) \n \n \n readSaveGame: (saveGame) ->\n writeSaveGame: (saveGame) ->\n \n prepareSaveGame: (snapshot) ->\n if snapshot\n snapshot = ResourceManager.getCustomBitmap(\"$snapshot\")\n snapshot?.dispose()\n ResourceManager.setCustomBitmap(\"$snapshot\", Graphics.snapshot())\n \n context = new gs.ObjectCodecContext()\n context.decodedObjectStore.push(Graphics.viewport)\n context.decodedObjectStore.push(@scene)\n context.decodedObjectStore.push(@scene.behavior)\n \n messageBoxIds = [\"messageBox\", \"nvlMessageBox\", \"messageMenu\"];\n messageIds = [\"gameMessage_message\", \"nvlGameMessage_message\"];\n messageBoxes = messageBoxIds.select (id) => @scene.behavior.objectManager.objectById(id)\n messages = messageIds.select (id) => @scene.behavior.objectManager.objectById(id)\n \n sceneData = {}\n saveGame = {}\n saveGame.encodedObjectStore = null\n saveGame.sceneUid = @scene.sceneDocument.uid\n saveGame.data = {\n resourceContext: @scene.behavior.resourceContext.toDataBundle(),\n currentCharacter: @scene.currentCharacter,\n characterParams: @characterParams,\n frameCount: Graphics.frameCount,\n tempFields: @tempFields,\n viewport: @scene.viewport,\n characters: @scene.characters,\n characterNames: RecordManager.charactersArray.select((c) -> { name: c.name, index: c.index }),\n backgrounds: @scene.backgrounds,\n pictures: @scene.pictureContainer.subObjectsByDomain,\n texts: @scene.textContainer.subObjectsByDomain,\n videos: @scene.videoContainer.subObjectsByDomain,\n viewports: @scene.viewportContainer.subObjects,\n commonEvents: @scene.commonEventContainer.subObjects,\n hotspots: @scene.hotspotContainer.subObjectsByDomain,\n interpreter: @scene.interpreter,\n messageBoxes: messageBoxes.select((mb, i) => { visible: mb.visible, id: mb.id, message: messages[i] }),\n backlog: @backlog,\n variableStore: @variableStore,\n defaults: @defaults,\n transitionData: SceneManager.transitionData,\n audio: { audioBuffers: AudioManager.audioBuffers, audioBuffersByLayer: AudioManager.audioBuffersByLayer, audioLayers: AudioManager.audioLayers, soundReferences: AudioManager.soundReferences },\n messageAreas: @scene.messageAreaContainer.subObjectsByDomain\n # messageAreas: @scene.messageAreas.select (f) ->\n # if f \n # { \n # message: f.message, \n # layout: { dstRect: gs.Rect.fromObject(f.layout.dstRect) } \n # } \n # else \n # null\n }\n \n #ss = window.performance.now()\n saveGame.data = gs.ObjectCodec.encode(saveGame.data, context)\n #console.log(window.performance.now() - ss)\n saveGame.encodedObjectStore = context.encodedObjectStore\n\n @saveGame = saveGame\n \n createSaveGameSlot: (header) ->\n slot = {\n \"date\": new Date().toDateString(),\n \"chapter\": @scene.chapter.items.name,\n \"scene\": @scene.sceneDocument.items.name,\n \"image\": header.image\n }\n \n return slot;\n \n createSaveGameHeader: (thumbWidth, thumbHeight) ->\n thumbImage = @createSaveGameThumbImage(thumbWidth, thumbHeight)\n \n header = {\n \"date\": new Date().toDateString(),\n \"chapterUid\": @scene.chapter.uid,\n \"sceneUid\": @scene.sceneDocument.uid,\n \"image\": thumbImage?.image.toDataURL() \n }\n \n thumbImage?.dispose()\n \n return header\n \n createSaveGameThumbImage: (width, height) ->\n snapshot = ResourceManager.getBitmap(\"$snapshot\")\n thumbImage = null\n \n if snapshot\n if width and height\n thumbImage = new Bitmap(width, height)\n else\n thumbImage = new Bitmap(Graphics.width / 8, Graphics.height / 8)\n thumbImage.stretchBlt(new Rect(0, 0, thumbImage.width, thumbImage.height), snapshot, new Rect(0, 0, snapshot.width, snapshot.height))\n \n return thumbImage\n \n storeSaveGame: (name, saveGame, header) ->\n if header\n GameStorage.setData(\"#{name}_Header\", JSON.stringify(header))\n \n GameStorage.setData(name, JSON.stringify(saveGame))\n \n ###*\n * Saves the current game at the specified slot.\n *\n * @method save\n * @param {number} slot - The slot where the game should be saved at.\n * @param {number} thumbWidth - The width for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated width.\n * @param {number} thumbHeight - The height for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated height.\n ### \n save: (slot, thumbWidth, thumbHeight) ->\n if @saveGame\n header = @createSaveGameHeader(thumbWidth, thumbHeight)\n @saveGameSlots[slot] = @createSaveGameSlot(header)\n @storeSaveGame(\"SaveGame_#{slot}\", @saveGame, header)\n @sceneData = {}\n \n return @saveGame\n \n restore: (saveGame) ->\n @backlog = saveGame.data.backlog\n @defaults = saveGame.data.defaults\n @variableStore = saveGame.data.variableStore\n @sceneData = saveGame.data\n @saveGame = null\n @loadedSaveGame = null\n @tempFields = saveGame.data.tempFields\n @characterParams = saveGame.data.characterParams\n window.$tempFields = @tempFields\n window.$dataFields.backlog = @backlog\n \n \n prepareLoadGame: ->\n AudioManager.stopAllMusic(30)\n \n ###*\n * Loads the game from the specified save game slot. This method triggers\n * a automatic scene change.\n *\n * @method load\n * @param {number} slot - The slot where the game should be loaded from.\n ### \n load: (slot) ->\n return if !@saveGameSlots[slot] or @saveGameSlots[slot].date.trim().length == 0\n \n @prepareLoadGame()\n @loadedSaveGame = @loadSaveGame(\"SaveGame_#{slot}\")\n \n \n SceneManager.switchTo(new vn.Object_Scene())\n SceneManager.clear()\n \n \n loadSaveGame: (name) -> JSON.parse(GameStorage.getData(name))\n \n \n ###*\n * Gets the save game data for a specified slot.\n *\n * @method getSaveGame\n * @param {number} slot - The slot to get the save data from.\n * @return {Object} The save game data.\n ### \n getSaveGame: (slot) -> JSON.parse(GameStorage.getData(\"SaveGame_#{slot}\"))\n \nwindow.GameManager = new GameManager()\ngs.GameManager = window.GameManager",
10 - "compiledContent": "var GameManager;\n\nGameManager = (function() {\n\n /**\n * Manages all general things around the game like holding the game settings,\n * manages the save/load of a game, etc.\n *\n * @module gs\n * @class GameManager\n * @memberof gs\n * @constructor\n */\n function GameManager() {\n\n /**\n * The current scene data.\n * @property sceneData\n * @type Object\n */\n this.sceneData = {};\n\n /**\n * The scene viewport containing all visual objects which are part of the scene and influenced\n * by the in-game camera.\n * @property sceneViewport\n * @type gs.Object_Viewport\n */\n this.sceneViewport = null;\n\n /**\n * The list of common events.\n * @property commonEvents\n * @type gs.Object_CommonEvent[]\n */\n this.commonEvents = [];\n\n /**\n * Indicates if the GameManager is initialized.\n * @property commonEvents\n * @type gs.Object_CommonEvent[]\n */\n this.initialized = false;\n\n /**\n * Temporary game settings.\n * @property tempSettings\n * @type Object\n */\n this.tempSettings = {\n skip: false,\n skipTime: 5,\n loadMenuAccess: true,\n menuAccess: true,\n backlogAccess: true,\n saveMenuAccess: true,\n messageFading: {\n animation: {\n type: 1\n },\n duration: 15,\n easing: null\n }\n\n /**\n * Temporary game fields.\n * @property tempFields\n * @type Object\n */\n };\n this.tempFields = null;\n\n /**\n * Stores default values for backgrounds, pictures, etc.\n * @property defaults\n * @type Object\n */\n this.defaults = {\n background: {\n \"duration\": 30,\n \"origin\": 0,\n \"zOrder\": 0,\n \"loopVertical\": 0,\n \"loopHorizontal\": 0,\n \"easing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"animation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n }\n },\n picture: {\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"origin\": 0,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n }\n },\n character: {\n \"expressionDuration\": 0,\n \"appearDuration\": 40,\n \"disappearDuration\": 40,\n \"origin\": 0,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 2,\n \"inOut\": 2\n },\n \"disappearEasing\": {\n \"type\": 1,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n },\n \"changeAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"fading\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"changeEasing\": {\n \"type\": 2,\n \"inOut\": 2\n }\n },\n text: {\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"positionOrigin\": 0,\n \"origin\": 0,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n }\n },\n video: {\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"origin\": 0,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n }\n },\n live2d: {\n \"motionFadeInTime\": 1000,\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n }\n },\n messageBox: {\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 0,\n \"movement\": 3,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 0,\n \"movement\": 3,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n }\n },\n audio: {\n \"musicFadeInDuration\": 0,\n \"musicFadeOutDuration\": 0,\n \"musicVolume\": 100,\n \"musicPlaybackRate\": 100,\n \"soundVolume\": 100,\n \"soundPlaybackRate\": 100,\n \"voiceVolume\": 100,\n \"voicePlaybackRate\": 100\n }\n };\n\n /**\n * The game's backlog.\n * @property backlog\n * @type Object[]\n */\n this.backlog = [];\n\n /**\n * Character parameters by character ID.\n * @property characterParams\n * @type Object[]\n */\n this.characterParams = [];\n\n /**\n * The game's chapter\n * @property chapters\n * @type gs.Document[]\n */\n this.chapters = [];\n\n /**\n * The game's current displayed messages. Especially in NVL mode the messages \n * of the current page are stored here.\n * @property messages\n * @type Object[]\n */\n this.messages = [];\n\n /**\n * Count of save slots. Default is 100.\n * @property saveSlotCount\n * @type number\n */\n this.saveSlotCount = 100;\n\n /**\n * The index of save games. Contains the header-info for each save game slot.\n * @property saveGameSlots\n * @type Object[]\n */\n this.saveGameSlots = [];\n\n /**\n * Stores global data like the state of persistent game variables.\n * @property globalData\n * @type Object\n */\n this.globalData = null;\n\n /**\n * Indicates if the game runs in editor's live-preview.\n * @property inLivePreview\n * @type Object\n */\n this.inLivePreview = false;\n }\n\n\n /**\n * Initializes the GameManager, should be called before the actual game starts.\n *\n * @method initialize\n */\n\n GameManager.prototype.initialize = function() {\n var character, i, j, k, l, len, len1, param, ref, ref1, ref2, ref3, ref4, ref5, ref6;\n this.initialized = true;\n this.inLivePreview = $PARAMS.preview != null;\n this.saveSlotCount = RecordManager.system.saveSlotCount || 100;\n this.tempFields = new gs.GameTemp();\n window.$tempFields = this.tempFields;\n this.createSaveGameIndex();\n this.variableStore = new gs.VariableStore();\n this.variableStore.setupDomains(DataManager.getDocumentsByType(\"global_variables\").select(function(v) {\n return v.items.domain || \"\";\n }));\n this.variableStore.persistentNumbers = (ref = this.globalData.persistentNumbers) != null ? ref : this.variableStore.persistentNumbers;\n this.variableStore.persistentBooleans = (ref1 = this.globalData.persistentBooleans) != null ? ref1 : this.variableStore.persistentBooleans;\n this.variableStore.persistentStrings = (ref2 = this.globalData.persistentStrings) != null ? ref2 : this.variableStore.persistentStrings;\n this.variableStore.persistentLists = (ref3 = this.globalData.persistentLists) != null ? ref3 : this.variableStore.persistentLists;\n this.sceneViewport = new gs.Object_Viewport(new Viewport(0, 0, Graphics.width, Graphics.height, Graphics.viewport));\n ref4 = RecordManager.charactersArray;\n for (j = 0, len = ref4.length; j < len; j++) {\n character = ref4[j];\n if (character != null) {\n this.characterParams[character.index] = {};\n if (character.params != null) {\n ref5 = character.params;\n for (k = 0, len1 = ref5.length; k < len1; k++) {\n param = ref5[k];\n this.characterParams[character.index][param.name] = param.value;\n }\n }\n }\n }\n this.setupCommonEvents();\n for (i = l = 0, ref6 = RecordManager.characters; 0 <= ref6 ? l < ref6 : l > ref6; i = 0 <= ref6 ? ++l : --l) {\n this.settings.voicesPerCharacter[i] = 100;\n }\n this.chapters = DataManager.getDocumentsByType(\"vn.chapter\");\n return this.chapters.sort(function(a, b) {\n if (a.items.order > b.items.order) {\n return 1;\n } else if (a.items.order < b.items.order) {\n return -1;\n } else {\n return 0;\n }\n });\n };\n\n\n /**\n * Sets up common events.\n *\n * @method setupCommonEvents\n */\n\n GameManager.prototype.setupCommonEvents = function() {\n var event, j, k, len, len1, object, ref, ref1, results;\n ref = this.commonEvents;\n for (j = 0, len = ref.length; j < len; j++) {\n event = ref[j];\n if (event != null) {\n event.dispose();\n }\n }\n this.commonEvents = [];\n ref1 = RecordManager.commonEvents;\n results = [];\n for (k = 0, len1 = ref1.length; k < len1; k++) {\n event = ref1[k];\n if (!event) {\n continue;\n }\n if (event.startCondition === 1 && event.autoPreload) {\n gs.ResourceLoader.loadEventCommandsGraphics(event.commands);\n }\n object = new gs.Object_CommonEvent();\n object.record = event;\n object.rid = event.index;\n this.commonEvents[event.index] = object;\n results.push(this.commonEvents.push(object));\n }\n return results;\n };\n\n\n /**\n * Sets up cursor depending on system settings.\n *\n * @method setupCursor\n */\n\n GameManager.prototype.setupCursor = function() {\n var bitmap, ref;\n if ((ref = RecordManager.system.cursor) != null ? ref.name : void 0) {\n bitmap = ResourceManager.getBitmap(\"Graphics/Pictures/\" + RecordManager.system.cursor.name);\n return Graphics.setCursorBitmap(bitmap, RecordManager.system.cursor.hx, RecordManager.system.cursor.hy);\n } else {\n return Graphics.setCursorBitmap(null);\n }\n };\n\n\n /**\n * Disposes the GameManager. Should be called before quit the game.\n *\n * @method dispose\n */\n\n GameManager.prototype.dispose = function() {};\n\n\n /**\n * Quits the game. The implementation depends on the platform. So for example on mobile\n * devices this method has no effect.\n *\n * @method exit\n */\n\n GameManager.prototype.exit = function() {\n return Application.exit();\n };\n\n\n /**\n * Resets the GameManager by disposing and re-initializing it.\n *\n * @method reset\n */\n\n GameManager.prototype.reset = function() {\n this.initialized = false;\n this.interpreter = null;\n this.dispose();\n return this.initialize();\n };\n\n\n /**\n * Starts a new game.\n *\n * @method newGame\n */\n\n GameManager.prototype.newGame = function() {\n this.messages = [];\n this.variableStore.clearAllGlobalVariables();\n this.variableStore.clearAllLocalVariables();\n this.tempSettings.skip = false;\n this.tempFields.clear();\n this.tempFields.inGame = true;\n this.setupCommonEvents();\n this.tempSettings.menuAccess = true;\n this.tempSettings.saveMenuAccess = true;\n this.tempSettings.loadMenuAccess = true;\n return this.tempSettings.backlogAccess = true;\n };\n\n\n /**\n * Exists the game and resets the GameManager which is important before going back to\n * the main menu or title screen.\n *\n * @method exitGame\n */\n\n GameManager.prototype.exitGame = function() {\n this.tempFields.inGame = false;\n return this.tempFields.isExitingGame = true;\n };\n\n\n /**\n * Updates the GameManager. Should be called once per frame.\n *\n * @method update\n */\n\n GameManager.prototype.update = function() {};\n\n\n /**\n * Creates the index of all save-games. Should be called whenever a new save game\n * is created.\n *\n * @method createSaveGameIndex\n * @protected\n */\n\n GameManager.prototype.createSaveGameIndex = function() {\n var chaper, chapter, header, i, image, j, ref, scene;\n this.saveGameSlots = [];\n for (i = j = 0, ref = this.saveSlotCount; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {\n if (GameStorage.exists(\"SaveGame_\" + i + \"_Header\")) {\n header = GameStorage.getObject(\"SaveGame_\" + i + \"_Header\");\n chapter = DataManager.getDocument(header.chapterUid);\n scene = DataManager.getDocumentSummary(header.sceneUid);\n image = header.image;\n } else {\n header = null;\n chaper = null;\n scene = null;\n }\n if ((chapter != null) && (scene != null) && !this.inLivePreview) {\n this.saveGameSlots.push({\n date: header.date,\n chapter: chapter.items.name || \"DELETED\",\n scene: scene.items.name || \"DELETED\",\n image: image\n });\n } else {\n this.saveGameSlots.push({\n \"date\": \"\",\n \"chapter\": \"\",\n \"scene\": \"\",\n \"image\": null\n });\n }\n }\n return this.saveGameSlots;\n };\n\n\n /**\n * Resets the game's settings to its default values.\n *\n * @method resetSettings\n */\n\n GameManager.prototype.resetSettings = function() {\n var i, j, ref;\n this.settings = {\n version: 339,\n renderer: 0,\n filter: 1,\n confirmation: true,\n adjustAspectRatio: false,\n allowSkip: true,\n allowSkipUnreadMessages: true,\n allowVideoSkip: true,\n skipVoiceOnAction: true,\n allowChoiceSkip: false,\n voicesByCharacter: [],\n timeMessageToVoice: true,\n \"autoMessage\": {\n enabled: false,\n time: 0,\n waitForVoice: true,\n stopOnAction: false\n },\n \"voiceEnabled\": true,\n \"bgmEnabled\": true,\n \"soundEnabled\": true,\n \"voiceVolume\": 100,\n \"bgmVolume\": 100,\n \"seVolume\": 100,\n \"messageSpeed\": 4,\n \"fullScreen\": false,\n \"aspectRatio\": 0\n };\n this.saveGameSlots = [];\n for (i = j = 0, ref = this.saveSlotCount; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {\n GameStorage.remove(\"SaveGame_\" + i + \"_Header\");\n GameStorage.remove(\"SaveGame_\" + i);\n this.saveGameSlots.push({\n \"date\": \"\",\n \"chapter\": \"\",\n \"scene\": \"\",\n \"thumb\": \"\"\n });\n }\n GameStorage.setObject(\"settings\", this.settings);\n this.globalData = {\n messages: {},\n cgGallery: {}\n };\n return GameStorage.setObject(\"globalData\", this.globalData);\n };\n\n\n /**\n * Saves current game settings.\n *\n * @method saveSettings\n */\n\n GameManager.prototype.saveSettings = function() {\n return GameStorage.setObject(\"settings\", this.settings);\n };\n\n\n /**\n * Saves current global data.\n *\n * @method saveGlobalData\n */\n\n GameManager.prototype.saveGlobalData = function() {\n this.globalData.persistentNumbers = this.variableStore.persistentNumbers;\n this.globalData.persistentLists = this.variableStore.persistentLists;\n this.globalData.persistentBooleans = this.variableStore.persistentBooleans;\n this.globalData.persistentStrings = this.variableStore.persistentStrings;\n return GameStorage.setObject(\"globalData\", this.globalData);\n };\n\n\n /**\n * Resets current global data. All stored data about read messages, persistent variables and\n * CG gallery will be deleted.\n *\n * @method resetGlobalData\n */\n\n GameManager.prototype.resetGlobalData = function() {\n var cg, i, j, len, ref;\n this.globalData = {\n messages: {},\n cgGallery: {},\n version: 339\n };\n ref = RecordManager.cgGalleryArray;\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n cg = ref[i];\n if (cg != null) {\n this.globalData.cgGallery[cg.index] = {\n unlocked: false\n };\n }\n }\n return GameStorage.setObject(\"globalData\", this.globalData);\n };\n\n GameManager.prototype.readSaveGame = function(saveGame) {};\n\n GameManager.prototype.writeSaveGame = function(saveGame) {};\n\n GameManager.prototype.prepareSaveGame = function(snapshot) {\n var context, messageBoxIds, messageBoxes, messageIds, messages, saveGame, sceneData;\n if (snapshot) {\n snapshot = ResourceManager.getCustomBitmap(\"$snapshot\");\n if (snapshot != null) {\n snapshot.dispose();\n }\n ResourceManager.setCustomBitmap(\"$snapshot\", Graphics.snapshot());\n }\n context = new gs.ObjectCodecContext();\n context.decodedObjectStore.push(Graphics.viewport);\n context.decodedObjectStore.push(this.scene);\n context.decodedObjectStore.push(this.scene.behavior);\n messageBoxIds = [\"messageBox\", \"nvlMessageBox\", \"messageMenu\"];\n messageIds = [\"gameMessage_message\", \"nvlGameMessage_message\"];\n messageBoxes = messageBoxIds.select((function(_this) {\n return function(id) {\n return _this.scene.behavior.objectManager.objectById(id);\n };\n })(this));\n messages = messageIds.select((function(_this) {\n return function(id) {\n return _this.scene.behavior.objectManager.objectById(id);\n };\n })(this));\n sceneData = {};\n saveGame = {};\n saveGame.encodedObjectStore = null;\n saveGame.sceneUid = this.scene.sceneDocument.uid;\n saveGame.data = {\n resourceContext: this.scene.behavior.resourceContext.toDataBundle(),\n currentCharacter: this.scene.currentCharacter,\n characterParams: this.characterParams,\n frameCount: Graphics.frameCount,\n tempFields: this.tempFields,\n viewport: this.scene.viewport,\n characters: this.scene.characters,\n characterNames: RecordManager.charactersArray.select(function(c) {\n return {\n name: c.name,\n index: c.index\n };\n }),\n backgrounds: this.scene.backgrounds,\n pictures: this.scene.pictureContainer.subObjectsByDomain,\n texts: this.scene.textContainer.subObjectsByDomain,\n videos: this.scene.videoContainer.subObjectsByDomain,\n viewports: this.scene.viewportContainer.subObjects,\n commonEvents: this.scene.commonEventContainer.subObjects,\n hotspots: this.scene.hotspotContainer.subObjectsByDomain,\n interpreter: this.scene.interpreter,\n messageBoxes: messageBoxes.select((function(_this) {\n return function(mb, i) {\n return {\n visible: mb.visible,\n id: mb.id,\n message: messages[i]\n };\n };\n })(this)),\n backlog: this.backlog,\n variableStore: this.variableStore,\n defaults: this.defaults,\n transitionData: SceneManager.transitionData,\n audio: {\n audioBuffers: AudioManager.audioBuffers,\n audioBuffersByLayer: AudioManager.audioBuffersByLayer,\n audioLayers: AudioManager.audioLayers,\n soundReferences: AudioManager.soundReferences\n },\n messageAreas: this.scene.messageAreaContainer.subObjectsByDomain\n };\n saveGame.data = gs.ObjectCodec.encode(saveGame.data, context);\n saveGame.encodedObjectStore = context.encodedObjectStore;\n return this.saveGame = saveGame;\n };\n\n GameManager.prototype.createSaveGameSlot = function(header) {\n var slot;\n slot = {\n \"date\": new Date().toDateString(),\n \"chapter\": this.scene.chapter.items.name,\n \"scene\": this.scene.sceneDocument.items.name,\n \"image\": header.image\n };\n return slot;\n };\n\n GameManager.prototype.createSaveGameHeader = function(thumbWidth, thumbHeight) {\n var header, thumbImage;\n thumbImage = this.createSaveGameThumbImage(thumbWidth, thumbHeight);\n header = {\n \"date\": new Date().toDateString(),\n \"chapterUid\": this.scene.chapter.uid,\n \"sceneUid\": this.scene.sceneDocument.uid,\n \"image\": thumbImage != null ? thumbImage.image.toDataURL() : void 0\n };\n if (thumbImage != null) {\n thumbImage.dispose();\n }\n return header;\n };\n\n GameManager.prototype.createSaveGameThumbImage = function(width, height) {\n var snapshot, thumbImage;\n snapshot = ResourceManager.getBitmap(\"$snapshot\");\n thumbImage = null;\n if (snapshot) {\n if (width && height) {\n thumbImage = new Bitmap(width, height);\n } else {\n thumbImage = new Bitmap(Graphics.width / 8, Graphics.height / 8);\n }\n thumbImage.stretchBlt(new Rect(0, 0, thumbImage.width, thumbImage.height), snapshot, new Rect(0, 0, snapshot.width, snapshot.height));\n }\n return thumbImage;\n };\n\n GameManager.prototype.storeSaveGame = function(name, saveGame, header) {\n if (header) {\n GameStorage.setData(name + \"_Header\", JSON.stringify(header));\n }\n return GameStorage.setData(name, JSON.stringify(saveGame));\n };\n\n\n /**\n * Saves the current game at the specified slot.\n *\n * @method save\n * @param {number} slot - The slot where the game should be saved at.\n * @param {number} thumbWidth - The width for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated width.\n * @param {number} thumbHeight - The height for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated height.\n */\n\n GameManager.prototype.save = function(slot, thumbWidth, thumbHeight) {\n var header;\n if (this.saveGame) {\n header = this.createSaveGameHeader(thumbWidth, thumbHeight);\n this.saveGameSlots[slot] = this.createSaveGameSlot(header);\n this.storeSaveGame(\"SaveGame_\" + slot, this.saveGame, header);\n this.sceneData = {};\n return this.saveGame;\n }\n };\n\n GameManager.prototype.restore = function(saveGame) {\n this.backlog = saveGame.data.backlog;\n this.defaults = saveGame.data.defaults;\n this.variableStore = saveGame.data.variableStore;\n this.sceneData = saveGame.data;\n this.saveGame = null;\n this.loadedSaveGame = null;\n this.tempFields = saveGame.data.tempFields;\n this.characterParams = saveGame.data.characterParams;\n window.$tempFields = this.tempFields;\n return window.$dataFields.backlog = this.backlog;\n };\n\n GameManager.prototype.prepareLoadGame = function() {\n return AudioManager.stopAllMusic(30);\n };\n\n\n /**\n * Loads the game from the specified save game slot. This method triggers\n * a automatic scene change.\n *\n * @method load\n * @param {number} slot - The slot where the game should be loaded from.\n */\n\n GameManager.prototype.load = function(slot) {\n if (!this.saveGameSlots[slot] || this.saveGameSlots[slot].date.trim().length === 0) {\n return;\n }\n this.prepareLoadGame();\n this.loadedSaveGame = this.loadSaveGame(\"SaveGame_\" + slot);\n SceneManager.switchTo(new vn.Object_Scene());\n return SceneManager.clear();\n };\n\n GameManager.prototype.loadSaveGame = function(name) {\n return JSON.parse(GameStorage.getData(name));\n };\n\n\n /**\n * Gets the save game data for a specified slot.\n *\n * @method getSaveGame\n * @param {number} slot - The slot to get the save data from.\n * @return {Object} The save game data.\n */\n\n GameManager.prototype.getSaveGame = function(slot) {\n return JSON.parse(GameStorage.getData(\"SaveGame_\" + slot));\n };\n\n return GameManager;\n\n})();\n\nwindow.GameManager = new GameManager();\n\ngs.GameManager = window.GameManager;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUE7O0FBQU07O0FBQ0Y7Ozs7Ozs7OztFQVNhLHFCQUFBOztBQUNUOzs7OztJQUtBLElBQUMsQ0FBQSxTQUFELEdBQWE7O0FBRWI7Ozs7OztJQU1BLElBQUMsQ0FBQSxhQUFELEdBQWlCOztBQUVqQjs7Ozs7SUFLQSxJQUFDLENBQUEsWUFBRCxHQUFnQjs7QUFFaEI7Ozs7O0lBS0EsSUFBQyxDQUFBLFdBQUQsR0FBZTs7QUFFZjs7Ozs7SUFLQSxJQUFDLENBQUEsWUFBRCxHQUFnQjtNQUFBLElBQUEsRUFBTSxLQUFOO01BQWEsUUFBQSxFQUFVLENBQXZCO01BQTBCLGNBQUEsRUFBZ0IsSUFBMUM7TUFBZ0QsVUFBQSxFQUFZLElBQTVEO01BQWtFLGFBQUEsRUFBZSxJQUFqRjtNQUF1RixjQUFBLEVBQWdCLElBQXZHO01BQTZHLGFBQUEsRUFBZTtRQUFFLFNBQUEsRUFBVztVQUFFLElBQUEsRUFBTSxDQUFSO1NBQWI7UUFBMEIsUUFBQSxFQUFVLEVBQXBDO1FBQXdDLE1BQUEsRUFBUSxJQUFoRDs7O0FBRTVJOzs7O1NBRmdCOztJQU9oQixJQUFDLENBQUEsVUFBRCxHQUFjOztBQUVkOzs7OztJQUtBLElBQUMsQ0FBQSxRQUFELEdBQVk7TUFDUixVQUFBLEVBQVk7UUFBRSxVQUFBLEVBQVksRUFBZDtRQUFrQixRQUFBLEVBQVUsQ0FBNUI7UUFBK0IsUUFBQSxFQUFVLENBQXpDO1FBQTRDLGNBQUEsRUFBZ0IsQ0FBNUQ7UUFBK0QsZ0JBQUEsRUFBa0IsQ0FBakY7UUFBb0YsUUFBQSxFQUFVO1VBQUUsTUFBQSxFQUFRLENBQVY7VUFBYSxPQUFBLEVBQVMsQ0FBdEI7U0FBOUY7UUFBeUgsV0FBQSxFQUFhO1VBQUUsTUFBQSxFQUFRLENBQVY7VUFBYSxVQUFBLEVBQVksQ0FBekI7VUFBNEIsTUFBQSxFQUFRO1lBQUUsU0FBQSxFQUFXLElBQWI7WUFBbUIsT0FB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WUFBWSxDQUFDLFFBQWIsQ0FBMEIsSUFBQSxFQUFFLENBQUMsWUFBSCxDQUFBLENBQTFCO1dBQ0EsWUFBWSxDQUFDLEtBQWIsQ0FBQTtFQVJFOzt3QkFXTixZQUFBLEdBQWMsU0FBQyxJQUFEO1dBQVUsSUFBSSxDQUFDLEtBQUwsQ0FBVyxXQUFXLENBQUMsT0FBWixDQUFvQixJQUFwQixDQUFYO0VBQVY7OztBQUdkOzs7Ozs7Ozt3QkFPQSxXQUFBLEdBQWEsU0FBQyxJQUFEO1dBQVUsSUFBSSxDQUFDLEtBQUwsQ0FBVyxXQUFXLENBQUMsT0FBWixDQUFvQixXQUFBLEdBQVksSUFBaEMsQ0FBWDtFQUFWOzs7Ozs7QUFFakIsTUFBTSxDQUFDLFdBQVAsR0FBeUIsSUFBQSxXQUFBLENBQUE7O0FBQ3pCLEVBQUUsQ0FBQyxXQUFILEdBQWlCLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogR2FtZU1hbmFnZXJcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIEdhbWVNYW5hZ2VyXG4gICAgIyMjKlxuICAgICogTWFuYWdlcyBhbGwgZ2VuZXJhbCB0aGluZ3MgYXJvdW5kIHRoZSBnYW1lIGxpa2UgaG9sZGluZyB0aGUgZ2FtZSBzZXR0aW5ncyxcbiAgICAqIG1hbmFnZXMgdGhlIHNhdmUvbG9hZCBvZiBhIGdhbWUsIGV0Yy5cbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgR2FtZU1hbmFnZXJcbiAgICAqIEBtZW1iZXJvZiBnc1xuICAgICogQGNvbnN0cnVjdG9yXG4gICAgIyMjXG4gICAgY29uc3RydWN0b3I6IC0+XG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgY3VycmVudCBzY2VuZSBkYXRhLlxuICAgICAgICAqIEBwcm9wZXJ0eSBzY2VuZURhdGFcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjIFxuICAgICAgICBAc2NlbmVEYXRhID0ge31cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgc2NlbmUgdmlld3BvcnQgY29udGFpbmluZyBhbGwgdmlzdWFsIG9iamVjdHMgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHNjZW5lIGFuZCBpbmZsdWVuY2VkXG4gICAgICAgICogYnkgdGhlIGluLWdhbWUgY2FtZXJhLlxuICAgICAgICAqIEBwcm9wZXJ0eSBzY2VuZVZpZXdwb3J0XG4gICAgICAgICogQHR5cGUgZ3MuT2JqZWN0X1ZpZXdwb3J0XG4gICAgICAgICMjI1xuICAgICAgICBAc2NlbmVWaWV3cG9ydCA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgbGlzdCBvZiBjb21tb24gZXZlbnRzLlxuICAgICAgICAqIEBwcm9wZXJ0eSBjb21tb25FdmVudHNcbiAgICAgICAgKiBAdHlwZSBncy5PYmplY3RfQ29tbW9uRXZlbnRbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBjb21tb25FdmVudHMgPSBbXVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgR2FtZU1hbmFnZXIgaXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICogQHByb3BlcnR5IGNvbW1vbkV2ZW50c1xuICAgICAgICAqIEB0eXBlIGdzLk9iamVjdF9Db21tb25FdmVudFtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQGluaXRpYWxpemVkID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUZW1wb3JhcnkgZ2FtZSBzZXR0aW5ncy5cbiAgICAgICAgKiBAcHJvcGVydHkgdGVtcFNldHRpbmdzXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICMjIyBcbiAgICAgICAgQHRlbXBTZXR0aW5ncyA9IHNraXA6IGZhbHNlLCBza2lwVGltZTogNSwgbG9hZE1lbnVBY2Nlc3M6IHRydWUsIG1lbnVBY2Nlc3M6IHRydWUsIGJhY2tsb2dBY2Nlc3M6IHRydWUsIHNhdmVNZW51QWNjZXNzOiB0cnVlLCBtZXNzYWdlRmFkaW5nOiB7IGFuaW1hdGlvbjogeyB0eXBlOiAxIH0sIGR1cmF0aW9uOiAxNSwgZWFzaW5nOiBudWxsIH1cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUZW1wb3JhcnkgZ2FtZSBmaWVsZHMuXG4gICAgICAgICogQHByb3BlcnR5IHRlbXBGaWVsZHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjIFxuICAgICAgICBAdGVtcEZpZWxkcyA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBTdG9yZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIGJhY2tncm91bmRzLCBwaWN0dXJlcywgZXRjLlxuICAgICAgICAqIEBwcm9wZXJ0eSBkZWZhdWx0c1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyNcbiAgICAgICAgQGRlZmF1bHRzID0geyBcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHsgXCJkdXJhdGlvblwiOiAzMCwgXCJvcmlnaW5cIjogMCwgXCJ6T3JkZXJcIjogMCwgXCJsb29wVmVydGljYWxcIjogMCwgXCJsb29wSG9yaXpvbnRhbFwiOiAwLCBcImVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwibW90aW9uQmx1clwiOiB7IFwiZW5hYmxlZFwiOiAwLCBcImRlbGF5XCI6IDIsIFwib3BhY2l0eVwiOiAxMDAsIFwiZGlzc29sdmVTcGVlZFwiOiAzIH0gfSxcbiAgICAgICAgICAgIHBpY3R1cmU6IHsgXCJhcHBlYXJEdXJhdGlvblwiOiAzMCwgXCJkaXNhcHBlYXJEdXJhdGlvblwiOiAzMCwgXCJvcmlnaW5cIjogMCwgXCJ6T3JkZXJcIjogMCwgXCJhcHBlYXJFYXNpbmdcIjogeyBcInR5cGVcIjogMCwgXCJpbk91dFwiOiAxIH0sIFwiZGlzYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImFwcGVhckFuaW1hdGlvblwiOiB7IFwidHlwZVwiOiAxLCBcIm1vdmVtZW50XCI6IDAsIFwibWFza1wiOiB7IFwiZ3JhcGhpY1wiOiBudWxsLCBcInZhZ3VlXCI6IDMwIH0gfSwgXCJkaXNhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwibW90aW9uQmx1clwiOiB7IFwiZW5hYmxlZFwiOiAwLCBcImRlbGF5XCI6IDIsIFwib3BhY2l0eVwiOiAxMDAsIFwiZGlzc29sdmVTcGVlZFwiOiAzIH0gfSxcbiAgICAgICAgICAgIGNoYXJhY3RlcjogeyBcImV4cHJlc3Npb25EdXJhdGlvblwiOiAwLCBcImFwcGVhckR1cmF0aW9uXCI6IDQwLCBcImRpc2FwcGVhckR1cmF0aW9uXCI6IDQwLCBcIm9yaWdpblwiOiAwLCBcInpPcmRlclwiOiAwLCBcImFwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAyLCBcImluT3V0XCI6IDIgfSwgXCJkaXNhcHBlYXJFYXNpbmdcIjogeyBcInR5cGVcIjogMSwgXCJpbk91dFwiOiAxIH0sIFwiYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDEsIFwibW92ZW1lbnRcIjogMCwgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9LCBcImRpc2FwcGVhckFuaW1hdGlvblwiOiB7IFwidHlwZVwiOiAxLCBcIm1vdmVtZW50XCI6IDAsIFwibWFza1wiOiB7IFwiZ3JhcGhpY1wiOiBudWxsLCBcInZhZ3VlXCI6IDMwIH0gfSwgXCJtb3Rpb25CbHVyXCI6IHsgXCJlbmFibGVkXCI6IDAsIFwiZGVsYXlcIjogMiwgXCJvcGFjaXR5XCI6IDEwMCwgXCJkaXNzb2x2ZVNwZWVkXCI6IDMgfSwgXCJjaGFuZ2VBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcImZhZGluZ1wiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiY2hhbmdlRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDIsIFwiaW5PdXRcIjogMiB9IH0sXG4gICAgICAgICAgICB0ZXh0OiB7IFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwicG9zaXRpb25PcmlnaW5cIjogMCwgXCJvcmlnaW5cIjogMCwgXCJ6T3JkZXJcIjogMCwgXCJhcHBlYXJFYXNpbmdcIjogeyBcInR5cGVcIjogMCwgXCJpbk91dFwiOiAxIH0sIFwiZGlzYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImFwcGVhckFuaW1hdGlvblwiOiB7IFwidHlwZVwiOiAxLCBcIm1vdmVtZW50XCI6IDAsIFwibWFza1wiOiB7IFwiZ3JhcGhpY1wiOiBudWxsLCBcInZhZ3VlXCI6IDMwIH0gfSwgXCJkaXNhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwibW90aW9uQmx1clwiOiB7IFwiZW5hYmxlZFwiOiAwLCBcImRlbGF5XCI6IDIsIFwib3BhY2l0eVwiOiAxMDAsIFwiZGlzc29sdmVTcGVlZFwiOiAzIH0gfSxcbiAgICAgICAgICAgIHZpZGVvOiB7IFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwib3JpZ2luXCI6IDAsIFwiek9yZGVyXCI6IDAsIFwiYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImRpc2FwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiZGlzYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDEsIFwibW92ZW1lbnRcIjogMCwgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9LCBcIm1vdGlvbkJsdXJcIjogeyBcImVuYWJsZWRcIjogMCwgXCJkZWxheVwiOiAyLCBcIm9wYWNpdHlcIjogMTAwLCBcImRpc3NvbHZlU3BlZWRcIjogMyB9IH0sXG4gICAgICAgICAgICBsaXZlMmQ6IHsgXCJtb3Rpb25GYWRlSW5UaW1lXCI6IDEwMDAsIFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiek9yZGVyXCI6IDAsIFwiYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImRpc2FwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiZGlzYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDEsIFwibW92ZW1lbnRcIjogMCwgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9IH0sXG4gICAgICAgICAgICBtZXNzYWdlQm94OiB7IFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiek9yZGVyXCI6IDAsIFwiYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImRpc2FwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMCwgXCJtb3ZlbWVudFwiOiAzLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiZGlzYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDAsIFwibW92ZW1lbnRcIjogMywgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9IH0sXG4gICAgICAgICAgICBhdWRpbzogeyBcIm11c2ljRmFkZUluRHVyYXRpb25cIjogMCwgXCJtdXNpY0ZhZGVPdXREdXJhdGlvblwiOiAwLCBcIm11c2ljVm9sdW1lXCI6IDEwMCwgXCJtdXNpY1BsYXliYWNrUmF0ZVwiOiAxMDAsIFwic291bmRWb2x1bWVcIjogMTAwLCBcInNvdW5kUGxheWJhY2tSYXRlXCI6IDEwMCwgXCJ2b2ljZVZvbHVtZVwiOiAxMDAsIFwidm9pY2VQbGF5YmFja1JhdGVcIjogMTAwIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBnYW1lJ3MgYmFja2xvZy5cbiAgICAgICAgKiBAcHJvcGVydHkgYmFja2xvZ1xuICAgICAgICAqIEB0eXBlIE9iamVjdFtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQGJhY2tsb2cgPSBbXVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIENoYXJhY3RlciBwYXJhbWV0ZXJzIGJ5IGNoYXJhY3RlciBJRC5cbiAgICAgICAgKiBAcHJvcGVydHkgY2hhcmFjdGVyUGFyYW1zXG4gICAgICAgICogQHR5cGUgT2JqZWN0W11cbiAgICAgICAgIyMjIFxuICAgICAgICBAY2hhcmFjdGVyUGFyYW1zID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZ2FtZSdzIGNoYXB0ZXJcbiAgICAgICAgKiBAcHJvcGVydHkgY2hhcHRlcnNcbiAgICAgICAgKiBAdHlwZSBncy5Eb2N1bWVudFtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQGNoYXB0ZXJzID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZ2FtZSdzIGN1cnJlbnQgZGlzcGxheWVkIG1lc3NhZ2VzLiBFc3BlY2lhbGx5IGluIE5WTCBtb2RlIHRoZSBtZXNzYWdlcyBcbiAgICAgICAgKiBvZiB0aGUgY3VycmVudCBwYWdlIGFyZSBzdG9yZWQgaGVyZS5cbiAgICAgICAgKiBAcHJvcGVydHkgbWVzc2FnZXNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBtZXNzYWdlcyA9IFtdXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQ291bnQgb2Ygc2F2ZSBzbG90cy4gRGVmYXVsdCBpcyAxMDAuXG4gICAgICAgICogQHByb3BlcnR5IHNhdmVTbG90Q291bnRcbiAgICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAgIyMjIFxuICAgICAgICBAc2F2ZVNsb3RDb3VudCA9IDEwMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBpbmRleCBvZiBzYXZlIGdhbWVzLiBDb250YWlucyB0aGUgaGVhZGVyLWluZm8gZm9yIGVhY2ggc2F2ZSBnYW1lIHNsb3QuXG4gICAgICAgICogQHByb3BlcnR5IHNhdmVHYW1lU2xvdHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBzYXZlR2FtZVNsb3RzID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBTdG9yZXMgZ2xvYmFsIGRhdGEgbGlrZSB0aGUgc3RhdGUgb2YgcGVyc2lzdGVudCBnYW1lIHZhcmlhYmxlcy5cbiAgICAgICAgKiBAcHJvcGVydHkgZ2xvYmFsRGF0YVxuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyMgXG4gICAgICAgIEBnbG9iYWxEYXRhID0gbnVsbFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2FtZSBydW5zIGluIGVkaXRvcidzIGxpdmUtcHJldmlldy5cbiAgICAgICAgKiBAcHJvcGVydHkgaW5MaXZlUHJldmlld1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyMgXG4gICAgICAgIEBpbkxpdmVQcmV2aWV3ID0gbm9cbiAgICAgICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogSW5pdGlhbGl6ZXMgdGhlIEdhbWVNYW5hZ2VyLCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgYWN0dWFsIGdhbWUgc3RhcnRzLlxuICAgICpcbiAgICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgICMjIyAgICBcbiAgICBpbml0aWFsaXplOiAtPlxuICAgICAgICBAaW5pdGlhbGl6ZWQgPSB5ZXNcbiAgICAgICAgQGluTGl2ZVByZXZpZXcgPSAkUEFSQU1TLnByZXZpZXc/XG4gICAgICAgIEBzYXZlU2xvdENvdW50ID0gUmVjb3JkTWFuYWdlci5zeXN0ZW0uc2F2ZVNsb3RDb3VudCB8fCAxMDBcbiAgICAgICAgQHRlbXBGaWVsZHMgPSBuZXcgZ3MuR2FtZVRlbXAoKVxuICAgICAgICB3aW5kb3cuJHRlbXBGaWVsZHMgPSBAdGVtcEZpZWxkc1xuICAgICAgICBcbiAgICAgICAgQGNyZWF0ZVNhdmVHYW1lSW5kZXgoKVxuICAgICAgICBAdmFyaWFibGVTdG9yZSA9IG5ldyBncy5WYXJpYWJsZVN0b3JlKClcbiAgICAgICAgQHZhcmlhYmxlU3RvcmUuc2V0dXBEb21haW5zKERhdGFNYW5hZ2VyLmdldERvY3VtZW50c0J5VHlwZShcImdsb2JhbF92YXJpYWJsZXNcIikuc2VsZWN0ICh2KSAtPiB2Lml0ZW1zLmRvbWFpbnx8XCJcIilcbiAgICAgICAgQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudE51bWJlcnMgPSBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50TnVtYmVycyA/IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnROdW1iZXJzXG4gICAgICAgIEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRCb29sZWFucyA9IEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRCb29sZWFucyA/IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRCb29sZWFuc1xuICAgICAgICBAdmFyaWFibGVTdG9yZS5wZXJzaXN0ZW50U3RyaW5ncyA9IEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRTdHJpbmdzID8gQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudFN0cmluZ3NcbiAgICAgICAgQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudExpc3RzID0gQGdsb2JhbERhdGEucGVyc2lzdGVudExpc3RzID8gQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudExpc3RzXG4gICAgICAgIFxuICAgICAgICBAc2NlbmVWaWV3cG9ydCA9IG5ldyBncy5PYmplY3RfVmlld3BvcnQobmV3IFZpZXdwb3J0KDAsIDAsIEdyYXBoaWNzLndpZHRoLCBHcmFwaGljcy5oZWlnaHQsIEdyYXBoaWNzLnZpZXdwb3J0KSlcbiAgICAgICAgZm9yIGNoYXJhY3RlciBpbiBSZWNvcmRNYW5hZ2VyLmNoYXJhY3RlcnNBcnJheVxuICAgICAgICAgICAgaWYgY2hhcmFjdGVyP1xuICAgICAgICAgICAgICAgIEBjaGFyYWN0ZXJQYXJhbXNbY2hhcmFjdGVyLmluZGV4XSA9IHt9XG4gICAgICAgICAgICAgICAgaWYgY2hhcmFjdGVyLnBhcmFtcz9cbiAgICAgICAgICAgICAgICAgICAgZm9yIHBhcmFtIGluIGNoYXJhY3Rlci5wYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjaGFyYWN0ZXJQYXJhbXNbY2hhcmFjdGVyLmluZGV4XVtwYXJhbS5uYW1lXSA9IHBhcmFtLnZhbHVlIFxuXG4gICAgICAgIFxuICAgICAgICBAc2V0dXBDb21tb25FdmVudHMoKVxuICAgICAgICAgICAgXG4gICAgICAgIGZvciBpIGluIFswLi4uUmVjb3JkTWFuYWdlci5jaGFyYWN0ZXJzXVxuICAgICAgICAgICAgQHNldHRpbmdzLnZvaWNlc1BlckNoYXJhY3RlcltpXSA9IDEwMFxuICAgICAgICAgICAgIFxuICAgICAgICBAY2hhcHRlcnMgPSBEYXRhTWFuYWdlci5nZXREb2N1bWVudHNCeVR5cGUoXCJ2bi5jaGFwdGVyXCIpXG4gICAgICAgIEBjaGFwdGVycy5zb3J0IChhLCBiKSAtPlxuICAgICAgICAgICAgaWYgYS5pdGVtcy5vcmRlciA+IGIuaXRlbXMub3JkZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICAgICAgZWxzZSBpZiBhLml0ZW1zLm9yZGVyIDwgYi5pdGVtcy5vcmRlclxuICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgIFxuICAgICMjIypcbiAgICAqIFNldHMgdXAgY29tbW9uIGV2ZW50cy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwQ29tbW9uRXZlbnRzXG4gICAgIyMjICAgICAgICAgICAgXG4gICAgc2V0dXBDb21tb25FdmVudHM6IC0+XG4gICAgICAgIGZvciBldmVudCBpbiBAY29tbW9uRXZlbnRzXG4gICAgICAgICAgICBldmVudD8uZGlzcG9zZSgpXG4gICAgICAgIFxuICAgICAgICBAY29tbW9uRXZlbnRzID0gW10gICAgXG4gICAgICAgIGZvciBldmVudCBpbiBSZWNvcmRNYW5hZ2VyLmNvbW1vbkV2ZW50c1xuICAgICAgICAgICAgY29udGludWUgaWYgbm90IGV2ZW50XG4gICAgICAgICAgICBpZiBldmVudC5zdGFydENvbmRpdGlvbiA9PSAxIGFuZCBldmVudC5hdXRvUHJlbG9hZFxuICAgICAgICAgICAgICAgIGdzLlJlc291cmNlTG9hZGVyLmxvYWRFdmVudENvbW1hbmRzR3JhcGhpY3MoZXZlbnQuY29tbWFuZHMpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBvYmplY3QgPSBuZXcgZ3MuT2JqZWN0X0NvbW1vbkV2ZW50KClcbiAgICAgICAgICAgIG9iamVjdC5yZWNvcmQgPSBldmVudFxuICAgICAgICAgICAgb2JqZWN0LnJpZCA9IGV2ZW50LmluZGV4XG4gICAgICAgICAgICBAY29tbW9uRXZlbnRzW2V2ZW50LmluZGV4XSA9IG9iamVjdFxuICAgICAgICAgICAgQGNvbW1vbkV2ZW50cy5wdXNoKG9iamVjdClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBTZXRzIHVwIGN1cnNvciBkZXBlbmRpbmcgb24gc3lzdGVtIHNldHRpbmdzLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0dXBDdXJzb3JcbiAgICAjIyNcbiAgICBzZXR1cEN1cnNvcjogLT5cbiAgICAgICAgaWYgUmVjb3JkTWFuYWdlci5zeXN0ZW0uY3Vyc29yPy5uYW1lXG4gICAgICAgICAgICBiaXRtYXAgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0Qml0bWFwKFwiR3JhcGhpY3MvUGljdHVyZXMvI3tSZWNvcmRNYW5hZ2VyLnN5c3RlbS5jdXJzb3IubmFtZX1cIilcbiAgICAgICAgICAgIEdyYXBoaWNzLnNldEN1cnNvckJpdG1hcChiaXRtYXAsIFJlY29yZE1hbmFnZXIuc3lzdGVtLmN1cnNvci5oeCwgUmVjb3JkTWFuYWdlci5zeXN0ZW0uY3Vyc29yLmh5KVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBHcmFwaGljcy5zZXRDdXJzb3JCaXRtYXAobnVsbClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogRGlzcG9zZXMgdGhlIEdhbWVNYW5hZ2VyLiBTaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBxdWl0IHRoZSBnYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzcG9zZVxuICAgICMjIyAgICAgICAgICAgICAgIFxuICAgIGRpc3Bvc2U6IC0+XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFF1aXRzIHRoZSBnYW1lLiBUaGUgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiB0aGUgcGxhdGZvcm0uIFNvIGZvciBleGFtcGxlIG9uIG1vYmlsZVxuICAgICogZGV2aWNlcyB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LlxuICAgICpcbiAgICAqIEBtZXRob2QgZXhpdFxuICAgICMjIyAgIFxuICAgIGV4aXQ6IC0+IEFwcGxpY2F0aW9uLmV4aXQoKVxuICAgIFxuICAgICMjIypcbiAgICAqIFJlc2V0cyB0aGUgR2FtZU1hbmFnZXIgYnkgZGlzcG9zaW5nIGFuZCByZS1pbml0aWFsaXppbmcgaXQuXG4gICAgKlxuICAgICogQG1ldGhvZCByZXNldFxuICAgICMjIyAgICAgICAgICBcbiAgICByZXNldDogLT5cbiAgICAgICAgQGluaXRpYWxpemVkID0gbm9cbiAgICAgICAgQGludGVycHJldGVyID0gbnVsbFxuICAgICAgICBAZGlzcG9zZSgpXG4gICAgICAgIEBpbml0aWFsaXplKClcbiAgICAgXG4gICAgIyMjKlxuICAgICogU3RhcnRzIGEgbmV3IGdhbWUuXG4gICAgKlxuICAgICogQG1ldGhvZCBuZXdHYW1lXG4gICAgIyMjICAgICAgXG4gICAgbmV3R2FtZTogLT5cbiAgICAgICAgQG1lc3NhZ2VzID0gW11cbiAgICAgICAgQHZhcmlhYmxlU3RvcmUuY2xlYXJBbGxHbG9iYWxWYXJpYWJsZXMoKVxuICAgICAgICBAdmFyaWFibGVTdG9yZS5jbGVhckFsbExvY2FsVmFyaWFibGVzKClcbiAgICAgICAgQHRlbXBTZXR0aW5ncy5za2lwID0gbm9cbiAgICAgICAgQHRlbXBGaWVsZHMuY2xlYXIoKVxuICAgICAgICBAdGVtcEZpZWxkcy5pbkdhbWUgPSB5ZXNcbiAgICAgICAgQHNldHVwQ29tbW9uRXZlbnRzKClcbiAgICAgICAgQHRlbXBTZXR0aW5ncy5tZW51QWNjZXNzID0geWVzXG4gICAgICAgIEB0ZW1wU2V0dGluZ3Muc2F2ZU1lbnVBY2Nlc3MgPSB5ZXNcbiAgICAgICAgQHRlbXBTZXR0aW5ncy5sb2FkTWVudUFjY2VzcyA9IHllc1xuICAgICAgICBAdGVtcFNldHRpbmdzLmJhY2tsb2dBY2Nlc3MgPSB5ZXNcbiAgICBcbiAgICBcbiAgICAjIyMqXG4gICAgKiBFeGlzdHMgdGhlIGdhbWUgYW5kIHJlc2V0cyB0aGUgR2FtZU1hbmFnZXIgd2hpY2ggaXMgaW1wb3J0YW50IGJlZm9yZSBnb2luZyBiYWNrIHRvXG4gICAgKiB0aGUgbWFpbiBtZW51IG9yIHRpdGxlIHNjcmVlbi5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGV4aXRHYW1lXG4gICAgIyMjICAgIFxuICAgIGV4aXRHYW1lOiAtPlxuICAgICAgICBAdGVtcEZpZWxkcy5pbkdhbWUgPSBubyAgICAgXG4gICAgICAgIEB0ZW1wRmllbGRzLmlzRXhpdGluZ0dhbWUgPSB5ZXNcbiAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBHYW1lTWFuYWdlci4gU2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlciBmcmFtZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICMjIyAgICAgXG4gICAgdXBkYXRlOiAtPlxuICAgIFxuICAgICMjIypcbiAgICAqIENyZWF0ZXMgdGhlIGluZGV4IG9mIGFsbCBzYXZlLWdhbWVzLiBTaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IHNhdmUgZ2FtZVxuICAgICogaXMgY3JlYXRlZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGNyZWF0ZVNhdmVHYW1lSW5kZXhcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgXG4gICAgY3JlYXRlU2F2ZUdhbWVJbmRleDogLT5cbiAgICAgICAgQHNhdmVHYW1lU2xvdHMgPSBbXVxuICAgICAgICBmb3IgaSBpbiBbMC4uLkBzYXZlU2xvdENvdW50XVxuICAgICAgICAgICAgaWYgR2FtZVN0b3JhZ2UuZXhpc3RzKFwiU2F2ZUdhbWVfI3tpfV9IZWFkZXJcIilcbiAgICAgICAgICAgICAgICBoZWFkZXIgPSBHYW1lU3RvcmFnZS5nZXRPYmplY3QoXCJTYXZlR2FtZV8je2l9X0hlYWRlclwiKVxuICAgICAgICAgICAgICAgIGNoYXB0ZXIgPSBEYXRhTWFuYWdlci5nZXREb2N1bWVudChoZWFkZXIuY2hhcHRlclVpZClcbiAgICAgICAgICAgICAgICBzY2VuZSA9IERhdGFNYW5hZ2VyLmdldERvY3VtZW50U3VtbWFyeShoZWFkZXIuc2NlbmVVaWQpXG4gICAgICAgICAgICAgICAgaW1hZ2UgPSBoZWFkZXIuaW1hZ2VcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBoZWFkZXIgPSBudWxsXG4gICAgICAgICAgICAgICAgY2hhcGVyID0gbnVsbFxuICAgICAgICAgICAgICAgIHNjZW5lID0gbnVsbFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgY2hhcHRlcj8gYW5kIHNjZW5lPyBhbmQgIUBpbkxpdmVQcmV2aWV3XG4gICAgICAgICAgICAgICAgQHNhdmVHYW1lU2xvdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGhlYWRlci5kYXRlLFxuICAgICAgICAgICAgICAgICAgICBjaGFwdGVyOiBjaGFwdGVyLml0ZW1zLm5hbWUgfHwgXCJERUxFVEVEXCJcbiAgICAgICAgICAgICAgICAgICAgc2NlbmU6IHNjZW5lLml0ZW1zLm5hbWUgfHwgXCJERUxFVEVEXCIsXG4gICAgICAgICAgICAgICAgICAgIGltYWdlOiBpbWFnZSAjY2hhcHRlci5pdGVtcy5jb21tYW5kc1swXS5wYXJhbXMuc2F2ZUdhbWVHcmFwaGljPy5uYW1lXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBAc2F2ZUdhbWVTbG90cy5wdXNoKHsgXCJkYXRlXCI6IFwiXCIsIFwiY2hhcHRlclwiOiBcIlwiLCBcInNjZW5lXCI6IFwiXCIsIFwiaW1hZ2VcIjogbnVsbCB9KVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIEBzYXZlR2FtZVNsb3RzXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFJlc2V0cyB0aGUgZ2FtZSdzIHNldHRpbmdzIHRvIGl0cyBkZWZhdWx0IHZhbHVlcy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHJlc2V0U2V0dGluZ3NcbiAgICAjIyMgICAgICAgICAgICBcbiAgICByZXNldFNldHRpbmdzOiAtPlxuICAgICAgICBAc2V0dGluZ3MgPSB7IHZlcnNpb246IDMzOSwgcmVuZGVyZXI6IDAsIGZpbHRlcjogMSwgY29uZmlybWF0aW9uOiB5ZXMsIGFkanVzdEFzcGVjdFJhdGlvOiBubywgYWxsb3dTa2lwOiB5ZXMsIGFsbG93U2tpcFVucmVhZE1lc3NhZ2VzOiB5ZXMsICBhbGxvd1ZpZGVvU2tpcDogeWVzLCBza2lwVm9pY2VPbkFjdGlvbjogeWVzLCBhbGxvd0Nob2ljZVNraXA6IG5vLCB2b2ljZXNCeUNoYXJhY3RlcjogW10sIHRpbWVNZXNzYWdlVG9Wb2ljZTogdHJ1ZSwgIFwiYXV0b01lc3NhZ2VcIjogeyBlbmFibGVkOiBmYWxzZSwgdGltZTogMCwgd2FpdEZvclZvaWNlOiB5ZXMsIHN0b3BPbkFjdGlvbjogbm8gfSwgIFwidm9pY2VFbmFibGVkXCI6IHRydWUsIFwiYmdtRW5hYmxlZFwiOiB0cnVlLCBcInNvdW5kRW5hYmxlZFwiOiB0cnVlLCBcInZvaWNlVm9sdW1lXCI6IDEwMCwgXCJiZ21Wb2x1bWVcIjogMTAwLCBcInNlVm9sdW1lXCI6IDEwMCwgXCJtZXNzYWdlU3BlZWRcIjogNCwgXCJmdWxsU2NyZWVuXCI6IG5vLCBcImFzcGVjdFJhdGlvXCI6IDAgfVxuICAgICAgICBAc2F2ZUdhbWVTbG90cyA9IFtdXG4gICAgICAgIGZvciBpIGluIFswLi4uQHNhdmVTbG90Q291bnRdXG4gICAgICAgICAgICBHYW1lU3RvcmFnZS5yZW1vdmUoXCJTYXZlR2FtZV8je2l9X0hlYWRlclwiKVxuICAgICAgICAgICAgR2FtZVN0b3JhZ2UucmVtb3ZlKFwiU2F2ZUdhbWVfI3tpfVwiKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBAc2F2ZUdhbWVTbG90cy5wdXNoKHsgXCJkYXRlXCI6IFwiXCIsIFwiY2hhcHRlclwiOiBcIlwiLCBcInNjZW5lXCI6IFwiXCIsIFwidGh1bWJcIjogXCJcIiB9KVxuICAgICAgIFxuICAgICAgICBHYW1lU3RvcmFnZS5zZXRPYmplY3QoXCJzZXR0aW5nc1wiLCBAc2V0dGluZ3MpXG4gICAgICAgIEBnbG9iYWxEYXRhID0geyBtZXNzYWdlczoge30sIGNnR2FsbGVyeToge30gfVxuICAgICAgICBHYW1lU3RvcmFnZS5zZXRPYmplY3QoXCJnbG9iYWxEYXRhXCIsIEBnbG9iYWxEYXRhKVxuICAgIFxuICAgICMjIypcbiAgICAqIFNhdmVzIGN1cnJlbnQgZ2FtZSBzZXR0aW5ncy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNhdmVTZXR0aW5nc1xuICAgICMjIyAgICAgXG4gICAgc2F2ZVNldHRpbmdzOiAtPlxuICAgICAgICBHYW1lU3RvcmFnZS5zZXRPYmplY3QoXCJzZXR0aW5nc1wiLCBAc2V0dGluZ3MpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNhdmVzIGN1cnJlbnQgZ2xvYmFsIGRhdGEuXG4gICAgKlxuICAgICogQG1ldGhvZCBzYXZlR2xvYmFsRGF0YVxuICAgICMjIyAgXG4gICAgc2F2ZUdsb2JhbERhdGE6IC0+XG4gICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnROdW1iZXJzID0gQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudE51bWJlcnNcbiAgICAgICAgQGdsb2JhbERhdGEucGVyc2lzdGVudExpc3RzID0gQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudExpc3RzXG4gICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRCb29sZWFucyA9IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRCb29sZWFuc1xuICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50U3RyaW5ncyA9IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRTdHJpbmdzXG4gICAgICAgIEdhbWVTdG9yYWdlLnNldE9iamVjdChcImdsb2JhbERhdGFcIiwgQGdsb2JhbERhdGEpXG4gICAgIFxuICAgICMjIypcbiAgICAqIFJlc2V0cyBjdXJyZW50IGdsb2JhbCBkYXRhLiBBbGwgc3RvcmVkIGRhdGEgYWJvdXQgcmVhZCBtZXNzYWdlcywgcGVyc2lzdGVudCB2YXJpYWJsZXMgYW5kXG4gICAgKiBDRyBnYWxsZXJ5IHdpbGwgYmUgZGVsZXRlZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHJlc2V0R2xvYmFsRGF0YVxuICAgICMjIyAgICAgXG4gICAgcmVzZXRHbG9iYWxEYXRhOiAtPlxuICAgICAgICBAZ2xvYmFsRGF0YSA9IHsgbWVzc2FnZXM6IHt9LCBjZ0dhbGxlcnk6IHt9LCB2ZXJzaW9uOiAzMzkgfVxuICAgICAgICBcbiAgICAgICAgZm9yIGNnLCBpIGluIFJlY29yZE1hbmFnZXIuY2dHYWxsZXJ5QXJyYXlcbiAgICAgICAgICAgIGlmIGNnP1xuICAgICAgICAgICAgICAgIEBnbG9iYWxEYXRhLmNnR2FsbGVyeVtjZy5pbmRleF0gPSB7IHVubG9ja2VkOiBubyB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIEdhbWVTdG9yYWdlLnNldE9iamVjdChcImdsb2JhbERhdGFcIiwgQGdsb2JhbERhdGEpIFxuICAgICBcbiAgICAgXG4gICAgcmVhZFNhdmVHYW1lOiAoc2F2ZUdhbWUpIC0+XG4gICAgd3JpdGVTYXZlR2FtZTogKHNhdmVHYW1lKSAtPlxuICAgICAgICBcbiAgICBwcmVwYXJlU2F2ZUdhbWU6IChzbmFwc2hvdCkgLT5cbiAgICAgICAgaWYgc25hcHNob3RcbiAgICAgICAgICAgIHNuYXBzaG90ID0gUmVzb3VyY2VNYW5hZ2VyLmdldEN1c3RvbUJpdG1hcChcIiRzbmFwc2hvdFwiKVxuICAgICAgICAgICAgc25hcHNob3Q/LmRpc3Bvc2UoKVxuICAgICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLnNldEN1c3RvbUJpdG1hcChcIiRzbmFwc2hvdFwiLCBHcmFwaGljcy5zbmFwc2hvdCgpKVxuICAgICAgICBcbiAgICAgICAgY29udGV4dCA9IG5ldyBncy5PYmplY3RDb2RlY0NvbnRleHQoKVxuICAgICAgICBjb250ZXh0LmRlY29kZWRPYmplY3RTdG9yZS5wdXNoKEdyYXBoaWNzLnZpZXdwb3J0KVxuICAgICAgICBjb250ZXh0LmRlY29kZWRPYmplY3RTdG9yZS5wdXNoKEBzY2VuZSlcbiAgICAgICAgY29udGV4dC5kZWNvZGVkT2JqZWN0U3RvcmUucHVzaChAc2NlbmUuYmVoYXZpb3IpXG4gIFxuICAgICAgICBtZXNzYWdlQm94SWRzID0gW1wibWVzc2FnZUJveFwiLCBcIm52bE1lc3NhZ2VCb3hcIiwgXCJtZXNzYWdlTWVudVwiXTtcbiAgICAgICAgbWVzc2FnZUlkcyA9IFtcImdhbWVNZXNzYWdlX21lc3NhZ2VcIiwgXCJudmxHYW1lTWVzc2FnZV9tZXNzYWdlXCJdO1xuICAgICAgICBtZXNzYWdlQm94ZXMgPSBtZXNzYWdlQm94SWRzLnNlbGVjdCAoaWQpID0+IEBzY2VuZS5iZWhhdmlvci5vYmplY3RNYW5hZ2VyLm9iamVjdEJ5SWQoaWQpXG4gICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZUlkcy5zZWxlY3QgKGlkKSA9PiBAc2NlbmUuYmVoYXZpb3Iub2JqZWN0TWFuYWdlci5vYmplY3RCeUlkKGlkKVxuICAgICAgICBcbiAgICAgICAgc2NlbmVEYXRhID0ge31cbiAgICAgICAgc2F2ZUdhbWUgPSB7fVxuICAgICAgICBzYXZlR2FtZS5lbmNvZGVkT2JqZWN0U3RvcmUgPSBudWxsXG4gICAgICAgIHNhdmVHYW1lLnNjZW5lVWlkID0gQHNjZW5lLnNjZW5lRG9jdW1lbnQudWlkXG4gICAgICAgIHNhdmVHYW1lLmRhdGEgPSB7XG4gICAgICAgICAgICByZXNvdXJjZUNvbnRleHQ6IEBzY2VuZS5iZWhhdmlvci5yZXNvdXJjZUNvbnRleHQudG9EYXRhQnVuZGxlKCksXG4gICAgICAgICAgICBjdXJyZW50Q2hhcmFjdGVyOiBAc2NlbmUuY3VycmVudENoYXJhY3RlcixcbiAgICAgICAgICAgIGNoYXJhY3RlclBhcmFtczogQGNoYXJhY3RlclBhcmFtcyxcbiAgICAgICAgICAgIGZyYW1lQ291bnQ6IEdyYXBoaWNzLmZyYW1lQ291bnQsXG4gICAgICAgICAgICB0ZW1wRmllbGRzOiBAdGVtcEZpZWxkcyxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBAc2NlbmUudmlld3BvcnQsXG4gICAgICAgICAgICBjaGFyYWN0ZXJzOiBAc2NlbmUuY2hhcmFjdGVycyxcbiAgICAgICAgICAgIGNoYXJhY3Rlck5hbWVzOiBSZWNvcmRNYW5hZ2VyLmNoYXJhY3RlcnNBcnJheS5zZWxlY3QoKGMpIC0+IHsgbmFtZTogYy5uYW1lLCBpbmRleDogYy5pbmRleCB9KSxcbiAgICAgICAgICAgIGJhY2tncm91bmRzOiBAc2NlbmUuYmFja2dyb3VuZHMsXG4gICAgICAgICAgICBwaWN0dXJlczogQHNjZW5lLnBpY3R1cmVDb250YWluZXIuc3ViT2JqZWN0c0J5RG9tYWluLFxuICAgICAgICAgICAgdGV4dHM6IEBzY2VuZS50ZXh0Q29udGFpbmVyLnN1Yk9iamVjdHNCeURvbWFpbixcbiAgICAgICAgICAgIHZpZGVvczogQHNjZW5lLnZpZGVvQ29udGFpbmVyLnN1Yk9iamVjdHNCeURvbWFpbixcbiAgICAgICAgICAgIHZpZXdwb3J0czogQHNjZW5lLnZpZXdwb3J0Q29udGFpbmVyLnN1Yk9iamVjdHMsXG4gICAgICAgICAgICBjb21tb25FdmVudHM6IEBzY2VuZS5jb21tb25FdmVudENvbnRhaW5lci5zdWJPYmplY3RzLFxuICAgICAgICAgICAgaG90c3BvdHM6IEBzY2VuZS5ob3RzcG90Q29udGFpbmVyLnN1Yk9iamVjdHNCeURvbWFpbixcbiAgICAgICAgICAgIGludGVycHJldGVyOiBAc2NlbmUuaW50ZXJwcmV0ZXIsXG4gICAgICAgICAgICBtZXNzYWdlQm94ZXM6IG1lc3NhZ2VCb3hlcy5zZWxlY3QoKG1iLCBpKSA9PiB7IHZpc2libGU6IG1iLnZpc2libGUsIGlkOiBtYi5pZCwgbWVzc2FnZTogbWVzc2FnZXNbaV0gfSksXG4gICAgICAgICAgICBiYWNrbG9nOiBAYmFja2xvZyxcbiAgICAgICAgICAgIHZhcmlhYmxlU3RvcmU6IEB2YXJpYWJsZVN0b3JlLFxuICAgICAgICAgICAgZGVmYXVsdHM6IEBkZWZhdWx0cyxcbiAgICAgICAgICAgIHRyYW5zaXRpb25EYXRhOiBTY2VuZU1hbmFnZXIudHJhbnNpdGlvbkRhdGEsXG4gICAgICAgICAgICBhdWRpbzogeyBhdWRpb0J1ZmZlcnM6IEF1ZGlvTWFuYWdlci5hdWRpb0J1ZmZlcnMsIGF1ZGlvQnVmZmVyc0J5TGF5ZXI6IEF1ZGlvTWFuYWdlci5hdWRpb0J1ZmZlcnNCeUxheWVyLCBhdWRpb0xheWVyczogQXVkaW9NYW5hZ2VyLmF1ZGlvTGF5ZXJzLCBzb3VuZFJlZmVyZW5jZXM6IEF1ZGlvTWFuYWdlci5zb3VuZFJlZmVyZW5jZXMgfSxcbiAgICAgICAgICAgIG1lc3NhZ2VBcmVhczogQHNjZW5lLm1lc3NhZ2VBcmVhQ29udGFpbmVyLnN1Yk9iamVjdHNCeURvbWFpblxuICAgICAgICAgICMgIG1lc3NhZ2VBcmVhczogQHNjZW5lLm1lc3NhZ2VBcmVhcy5zZWxlY3QgKGYpIC0+XG4gICAgICAgICAgIyAgICAgIGlmIGYgXG4gICAgICAgICAgIyAgICAgICAgICB7IFxuICAgICAgICAgICMgICAgICAgICAgICAgIG1lc3NhZ2U6IGYubWVzc2FnZSwgXG4gICAgICAgICAgIyAgICAgICAgICAgICAgbGF5b3V0OiB7IGRzdFJlY3Q6IGdzLlJlY3QuZnJvbU9iamVjdChmLmxheW91dC5kc3RSZWN0KSB9IFxuICAgICAgICAgICMgICAgICAgICAgfSBcbiAgICAgICAgICAjICAgICAgZWxzZSBcbiAgICAgICAgICAjICAgICAgICAgIG51bGxcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgI3NzID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpXG4gICAgICAgIHNhdmVHYW1lLmRhdGEgPSBncy5PYmplY3RDb2RlYy5lbmNvZGUoc2F2ZUdhbWUuZGF0YSwgY29udGV4dClcbiAgICAgICAgI2NvbnNvbGUubG9nKHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSAtIHNzKVxuICAgICAgICBzYXZlR2FtZS5lbmNvZGVkT2JqZWN0U3RvcmUgPSBjb250ZXh0LmVuY29kZWRPYmplY3RTdG9yZVxuXG4gICAgICAgIEBzYXZlR2FtZSA9IHNhdmVHYW1lXG4gICAgICBcbiAgICBjcmVhdGVTYXZlR2FtZVNsb3Q6IChoZWFkZXIpIC0+XG4gICAgICAgIHNsb3QgPSB7XG4gICAgICAgICAgICBcImRhdGVcIjogbmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKSxcbiAgICAgICAgICAgIFwiY2hhcHRlclwiOiBAc2NlbmUuY2hhcHRlci5pdGVtcy5uYW1lLFxuICAgICAgICAgICAgXCJzY2VuZVwiOiBAc2NlbmUuc2NlbmVEb2N1bWVudC5pdGVtcy5uYW1lLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBoZWFkZXIuaW1hZ2VcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNsb3Q7XG4gICAgICAgIFxuICAgIGNyZWF0ZVNhdmVHYW1lSGVhZGVyOiAodGh1bWJXaWR0aCwgdGh1bWJIZWlnaHQpIC0+XG4gICAgICAgIHRodW1iSW1hZ2UgPSBAY3JlYXRlU2F2ZUdhbWVUaHVtYkltYWdlKHRodW1iV2lkdGgsIHRodW1iSGVpZ2h0KVxuICAgICAgICBcbiAgICAgICAgaGVhZGVyID0ge1xuICAgICAgICAgICAgXCJkYXRlXCI6IG5ldyBEYXRlKCkudG9EYXRlU3RyaW5nKCksXG4gICAgICAgICAgICBcImNoYXB0ZXJVaWRcIjogQHNjZW5lLmNoYXB0ZXIudWlkLFxuICAgICAgICAgICAgXCJzY2VuZVVpZFwiOiBAc2NlbmUuc2NlbmVEb2N1bWVudC51aWQsXG4gICAgICAgICAgICBcImltYWdlXCI6IHRodW1iSW1hZ2U/LmltYWdlLnRvRGF0YVVSTCgpIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aHVtYkltYWdlPy5kaXNwb3NlKClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBoZWFkZXJcbiAgICAgICAgXG4gICAgY3JlYXRlU2F2ZUdhbWVUaHVtYkltYWdlOiAod2lkdGgsIGhlaWdodCkgLT5cbiAgICAgICAgc25hcHNob3QgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0Qml0bWFwKFwiJHNuYXBzaG90XCIpXG4gICAgICAgIHRodW1iSW1hZ2UgPSBudWxsXG4gICAgICAgIFxuICAgICAgICBpZiBzbmFwc2hvdFxuICAgICAgICAgICAgaWYgd2lkdGggYW5kIGhlaWdodFxuICAgICAgICAgICAgICAgIHRodW1iSW1hZ2UgPSBuZXcgQml0bWFwKHdpZHRoLCBoZWlnaHQpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGh1bWJJbWFnZSA9IG5ldyBCaXRtYXAoR3JhcGhpY3Mud2lkdGggLyA4LCBHcmFwaGljcy5oZWlnaHQgLyA4KVxuICAgICAgICAgICAgdGh1bWJJbWFnZS5zdHJldGNoQmx0KG5ldyBSZWN0KDAsIDAsIHRodW1iSW1hZ2Uud2lkdGgsIHRodW1iSW1hZ2UuaGVpZ2h0KSwgc25hcHNob3QsIG5ldyBSZWN0KDAsIDAsIHNuYXBzaG90LndpZHRoLCBzbmFwc2hvdC5oZWlnaHQpKVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiB0aHVtYkltYWdlXG4gICAgICBcbiAgICBzdG9yZVNhdmVHYW1lOiAobmFtZSwgc2F2ZUdhbWUsIGhlYWRlcikgLT5cbiAgICAgICAgaWYgaGVhZGVyXG4gICAgICAgICAgICBHYW1lU3RvcmFnZS5zZXREYXRhKFwiI3tuYW1lfV9IZWFkZXJcIiwgSlNPTi5zdHJpbmdpZnkoaGVhZGVyKSlcbiAgICAgICAgICAgIFxuICAgICAgICBHYW1lU3RvcmFnZS5zZXREYXRhKG5hbWUsIEpTT04uc3RyaW5naWZ5KHNhdmVHYW1lKSlcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgZ2FtZSBhdCB0aGUgc3BlY2lmaWVkIHNsb3QuXG4gICAgKlxuICAgICogQG1ldGhvZCBzYXZlXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc2xvdCAtIFRoZSBzbG90IHdoZXJlIHRoZSBnYW1lIHNob3VsZCBiZSBzYXZlZCBhdC5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aHVtYldpZHRoIC0gVGhlIHdpZHRoIGZvciB0aGUgc25hcHNob3QtdGh1bWIuIFlvdSBjYW4gc3BlY2lmeSA8Yj5udWxsPC9iPiBvciAwIHRvIHVzZSBhbiBhdXRvIGNhbGN1bGF0ZWQgd2lkdGguXG4gICAgKiBAcGFyYW0ge251bWJlcn0gdGh1bWJIZWlnaHQgLSBUaGUgaGVpZ2h0IGZvciB0aGUgc25hcHNob3QtdGh1bWIuIFlvdSBjYW4gc3BlY2lmeSA8Yj5udWxsPC9iPiBvciAwIHRvIHVzZSBhbiBhdXRvIGNhbGN1bGF0ZWQgaGVpZ2h0LlxuICAgICMjIyAgICAgXG4gICAgc2F2ZTogKHNsb3QsIHRodW1iV2lkdGgsIHRodW1iSGVpZ2h0KSAtPlxuICAgICAgICBpZiBAc2F2ZUdhbWVcbiAgICAgICAgICAgIGhlYWRlciA9IEBjcmVhdGVTYXZlR2FtZUhlYWRlcih0aHVtYldpZHRoLCB0aHVtYkhlaWdodClcbiAgICAgICAgICAgIEBzYXZlR2FtZVNsb3RzW3Nsb3RdID0gQGNyZWF0ZVNhdmVHYW1lU2xvdChoZWFkZXIpXG4gICAgICAgICAgICBAc3RvcmVTYXZlR2FtZShcIlNhdmVHYW1lXyN7c2xvdH1cIiwgQHNhdmVHYW1lLCBoZWFkZXIpXG4gICAgICAgICAgICBAc2NlbmVEYXRhID0ge31cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIEBzYXZlR2FtZVxuICAgIFxuICAgIHJlc3RvcmU6IChzYXZlR2FtZSkgLT5cbiAgICAgICAgQGJhY2tsb2cgPSBzYXZlR2FtZS5kYXRhLmJhY2tsb2dcbiAgICAgICAgQGRlZmF1bHRzID0gc2F2ZUdhbWUuZGF0YS5kZWZhdWx0c1xuICAgICAgICBAdmFyaWFibGVTdG9yZSA9IHNhdmVHYW1lLmRhdGEudmFyaWFibGVTdG9yZVxuICAgICAgICBAc2NlbmVEYXRhID0gc2F2ZUdhbWUuZGF0YVxuICAgICAgICBAc2F2ZUdhbWUgPSBudWxsXG4gICAgICAgIEBsb2FkZWRTYXZlR2FtZSA9IG51bGxcbiAgICAgICAgQHRlbXBGaWVsZHMgPSBzYXZlR2FtZS5kYXRhLnRlbXBGaWVsZHNcbiAgICAgICAgQGNoYXJhY3RlclBhcmFtcyA9IHNhdmVHYW1lLmRhdGEuY2hhcmFjdGVyUGFyYW1zXG4gICAgICAgIHdpbmRvdy4kdGVtcEZpZWxkcyA9IEB0ZW1wRmllbGRzXG4gICAgICAgIHdpbmRvdy4kZGF0YUZpZWxkcy5iYWNrbG9nID0gQGJhY2tsb2dcbiAgICAgICAgICAgIFxuICAgIFxuICAgIHByZXBhcmVMb2FkR2FtZTogLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLnN0b3BBbGxNdXNpYygzMClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogTG9hZHMgdGhlIGdhbWUgZnJvbSB0aGUgc3BlY2lmaWVkIHNhdmUgZ2FtZSBzbG90LiBUaGlzIG1ldGhvZCB0cmlnZ2Vyc1xuICAgICogYSBhdXRvbWF0aWMgc2NlbmUgY2hhbmdlLlxuICAgICpcbiAgICAqIEBtZXRob2QgbG9hZFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNsb3QgLSBUaGUgc2xvdCB3aGVyZSB0aGUgZ2FtZSBzaG91bGQgYmUgbG9hZGVkIGZyb20uXG4gICAgIyMjICAgICAgICBcbiAgICBsb2FkOiAoc2xvdCkgLT5cbiAgICAgICAgcmV0dXJuIGlmICFAc2F2ZUdhbWVTbG90c1tzbG90XSBvciBAc2F2ZUdhbWVTbG90c1tzbG90XS5kYXRlLnRyaW0oKS5sZW5ndGggPT0gMFxuICAgICAgICBcbiAgICAgICAgQHByZXBhcmVMb2FkR2FtZSgpXG4gICAgICAgIEBsb2FkZWRTYXZlR2FtZSA9IEBsb2FkU2F2ZUdhbWUoXCJTYXZlR2FtZV8je3Nsb3R9XCIpXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgU2NlbmVNYW5hZ2VyLnN3aXRjaFRvKG5ldyB2bi5PYmplY3RfU2NlbmUoKSlcbiAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgXG4gICAgICAgIFxuICAgIGxvYWRTYXZlR2FtZTogKG5hbWUpIC0+IEpTT04ucGFyc2UoR2FtZVN0b3JhZ2UuZ2V0RGF0YShuYW1lKSlcbiAgICAgICAgXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEdldHMgdGhlIHNhdmUgZ2FtZSBkYXRhIGZvciBhIHNwZWNpZmllZCBzbG90LlxuICAgICpcbiAgICAqIEBtZXRob2QgZ2V0U2F2ZUdhbWVcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBzbG90IC0gVGhlIHNsb3QgdG8gZ2V0IHRoZSBzYXZlIGRhdGEgZnJvbS5cbiAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIHNhdmUgZ2FtZSBkYXRhLlxuICAgICMjIyAgICAgICAgXG4gICAgZ2V0U2F2ZUdhbWU6IChzbG90KSAtPiBKU09OLnBhcnNlKEdhbWVTdG9yYWdlLmdldERhdGEoXCJTYXZlR2FtZV8je3Nsb3R9XCIpKVxuICAgIFxud2luZG93LkdhbWVNYW5hZ2VyID0gbmV3IEdhbWVNYW5hZ2VyKClcbmdzLkdhbWVNYW5hZ2VyID0gd2luZG93LkdhbWVNYW5hZ2VyIl19\n//# sourceURL=GameManager_25.js",
9 + "content": "# ===================================================================\n#\n# Script: GameManager\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass GameManager\n ###*\n * Manages all general things around the game like holding the game settings,\n * manages the save/load of a game, etc.\n *\n * @module gs\n * @class GameManager\n * @memberof gs\n * @constructor\n ###\n constructor: ->\n ###*\n * The current scene data.\n * @property sceneData\n * @type Object\n ### \n @sceneData = {}\n \n ###*\n * The scene viewport containing all visual objects which are part of the scene and influenced\n * by the in-game camera.\n * @property sceneViewport\n * @type gs.Object_Viewport\n ###\n @sceneViewport = null\n \n ###*\n * The list of common events.\n * @property commonEvents\n * @type gs.Object_CommonEvent[]\n ### \n @commonEvents = []\n \n ###*\n * Indicates if the GameManager is initialized.\n * @property commonEvents\n * @type gs.Object_CommonEvent[]\n ### \n @initialized = no\n \n ###*\n * Temporary game settings.\n * @property tempSettings\n * @type Object\n ### \n @tempSettings = skip: false, skipTime: 5, loadMenuAccess: true, menuAccess: true, backlogAccess: true, saveMenuAccess: true, messageFading: { animation: { type: 1 }, duration: 15, easing: null }\n \n ###*\n * Temporary game fields.\n * @property tempFields\n * @type Object\n ### \n @tempFields = null\n \n ###*\n * Stores default values for backgrounds, pictures, etc.\n * @property defaults\n * @type Object\n ###\n @defaults = { \n background: { \"duration\": 30, \"origin\": 0, \"zOrder\": 0, \"loopVertical\": 0, \"loopHorizontal\": 0, \"easing\": { \"type\": 0, \"inOut\": 1 }, \"animation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n picture: { \"appearDuration\": 30, \"disappearDuration\": 30, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n character: { \"expressionDuration\": 0, \"appearDuration\": 40, \"disappearDuration\": 40, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 2, \"inOut\": 2 }, \"disappearEasing\": { \"type\": 1, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 }, \"changeAnimation\": { \"type\": 1, \"movement\": 0, \"fading\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"changeEasing\": { \"type\": 2, \"inOut\": 2 } },\n text: { \"appearDuration\": 30, \"disappearDuration\": 30, \"positionOrigin\": 0, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n video: { \"appearDuration\": 30, \"disappearDuration\": 30, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n live2d: { \"motionFadeInTime\": 1000, \"appearDuration\": 30, \"disappearDuration\": 30, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } } },\n messageBox: { \"appearDuration\": 30, \"disappearDuration\": 30, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 0, \"movement\": 3, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 0, \"movement\": 3, \"mask\": { \"graphic\": null, \"vague\": 30 } } },\n audio: { \"musicFadeInDuration\": 0, \"musicFadeOutDuration\": 0, \"musicVolume\": 100, \"musicPlaybackRate\": 100, \"soundVolume\": 100, \"soundPlaybackRate\": 100, \"voiceVolume\": 100, \"voicePlaybackRate\": 100 }\n }\n \n ###*\n * The game's backlog.\n * @property backlog\n * @type Object[]\n ### \n @backlog = []\n \n ###*\n * Character parameters by character ID.\n * @property characterParams\n * @type Object[]\n ### \n @characterParams = []\n \n ###*\n * The game's chapter\n * @property chapters\n * @type gs.Document[]\n ### \n @chapters = []\n \n ###*\n * The game's current displayed messages. Especially in NVL mode the messages \n * of the current page are stored here.\n * @property messages\n * @type Object[]\n ### \n @messages = []\n \n ###*\n * Count of save slots. Default is 100.\n * @property saveSlotCount\n * @type number\n ### \n @saveSlotCount = 100\n \n ###*\n * The index of save games. Contains the header-info for each save game slot.\n * @property saveGameSlots\n * @type Object[]\n ### \n @saveGameSlots = []\n \n ###*\n * Stores global data like the state of persistent game variables.\n * @property globalData\n * @type Object\n ### \n @globalData = null\n \n ###*\n * Indicates if the game runs in editor's live-preview.\n * @property inLivePreview\n * @type Object\n ### \n @inLivePreview = no\n \n \n ###*\n * Initializes the GameManager, should be called before the actual game starts.\n *\n * @method initialize\n ### \n initialize: ->\n @initialized = yes\n @inLivePreview = $PARAMS.preview?\n @saveSlotCount = RecordManager.system.saveSlotCount || 100\n @tempFields = new gs.GameTemp()\n window.$tempFields = @tempFields\n \n @createSaveGameIndex()\n @variableStore = new gs.VariableStore()\n DataManager.getDocumentsByType(\"persistent_variables\")\n @variableStore.setupDomains(DataManager.getDocumentsByType(\"global_variables\").select (v) -> v.items.domain||\"\")\n @variableStore.persistentNumbersByDomain = @globalData.persistentNumbers ? @variableStore.persistentNumbersByDomain\n @variableStore.persistentBooleansByDomain = @globalData.persistentBooleans ? @variableStore.persistentBooleansByDomain\n @variableStore.persistentStringsByDomain = @globalData.persistentStrings ? @variableStore.persistentStringsByDomain\n @variableStore.persistentListsByDomain = @globalData.persistentLists ? @variableStore.persistentListsByDomain\n \n @sceneViewport = new gs.Object_Viewport(new Viewport(0, 0, Graphics.width, Graphics.height, Graphics.viewport))\n for character in RecordManager.charactersArray\n if character?\n @characterParams[character.index] = {}\n if character.params?\n for param in character.params\n @characterParams[character.index][param.name] = param.value \n\n \n @setupCommonEvents()\n \n for i in [0...RecordManager.characters]\n @settings.voicesPerCharacter[i] = 100\n \n @chapters = DataManager.getDocumentsByType(\"vn.chapter\")\n @chapters.sort (a, b) ->\n if a.items.order > b.items.order\n return 1\n else if a.items.order < b.items.order\n return -1\n else\n return 0\n \n ###*\n * Sets up common events.\n *\n * @method setupCommonEvents\n ### \n setupCommonEvents: ->\n for event in @commonEvents\n event?.dispose()\n \n @commonEvents = [] \n for event in RecordManager.commonEvents\n continue if not event\n if event.startCondition == 1 and event.autoPreload\n gs.ResourceLoader.loadEventCommandsGraphics(event.commands)\n \n object = new gs.Object_CommonEvent()\n object.record = event\n object.rid = event.index\n @commonEvents[event.index] = object\n @commonEvents.push(object)\n \n ###*\n * Sets up cursor depending on system settings.\n *\n * @method setupCursor\n ###\n setupCursor: ->\n if RecordManager.system.cursor?.name\n bitmap = ResourceManager.getBitmap(\"Graphics/Pictures/#{RecordManager.system.cursor.name}\")\n Graphics.setCursorBitmap(bitmap, RecordManager.system.cursor.hx, RecordManager.system.cursor.hy)\n else\n Graphics.setCursorBitmap(null)\n \n ###*\n * Disposes the GameManager. Should be called before quit the game.\n *\n * @method dispose\n ### \n dispose: ->\n \n ###*\n * Quits the game. The implementation depends on the platform. So for example on mobile\n * devices this method has no effect.\n *\n * @method exit\n ### \n exit: -> Application.exit()\n \n ###*\n * Resets the GameManager by disposing and re-initializing it.\n *\n * @method reset\n ### \n reset: ->\n @initialized = no\n @interpreter = null\n @dispose()\n @initialize()\n \n ###*\n * Starts a new game.\n *\n * @method newGame\n ### \n newGame: ->\n @messages = []\n @variableStore.clearAllGlobalVariables()\n @variableStore.clearAllLocalVariables()\n @tempSettings.skip = no\n @tempFields.clear()\n @tempFields.inGame = yes\n @setupCommonEvents()\n @tempSettings.menuAccess = yes\n @tempSettings.saveMenuAccess = yes\n @tempSettings.loadMenuAccess = yes\n @tempSettings.backlogAccess = yes\n \n \n ###*\n * Exists the game and resets the GameManager which is important before going back to\n * the main menu or title screen.\n *\n * @method exitGame\n ### \n exitGame: ->\n @tempFields.inGame = no \n @tempFields.isExitingGame = yes\n \n ###*\n * Updates the GameManager. Should be called once per frame.\n *\n * @method update\n ### \n update: ->\n \n ###*\n * Creates the index of all save-games. Should be called whenever a new save game\n * is created.\n *\n * @method createSaveGameIndex\n * @protected\n ### \n createSaveGameIndex: ->\n @saveGameSlots = []\n for i in [0...@saveSlotCount]\n if GameStorage.exists(\"SaveGame_#{i}_Header\")\n header = GameStorage.getObject(\"SaveGame_#{i}_Header\")\n chapter = DataManager.getDocument(header.chapterUid)\n scene = DataManager.getDocumentSummary(header.sceneUid)\n image = header.image\n else\n header = null\n chaper = null\n scene = null\n \n if chapter? and scene? and !@inLivePreview\n @saveGameSlots.push({\n date: header.date,\n chapter: chapter.items.name || \"DELETED\"\n scene: scene.items.name || \"DELETED\",\n image: image #chapter.items.commands[0].params.saveGameGraphic?.name\n })\n else\n @saveGameSlots.push({ \"date\": \"\", \"chapter\": \"\", \"scene\": \"\", \"image\": null })\n \n return @saveGameSlots\n \n ###*\n * Resets the game's settings to its default values.\n *\n * @method resetSettings\n ### \n resetSettings: ->\n @settings = { version: 342, renderer: 0, filter: 1, confirmation: yes, adjustAspectRatio: no, allowSkip: yes, allowSkipUnreadMessages: yes, allowVideoSkip: yes, skipVoiceOnAction: yes, allowChoiceSkip: no, voicesByCharacter: [], timeMessageToVoice: true, \"autoMessage\": { enabled: false, time: 0, waitForVoice: yes, stopOnAction: no }, \"voiceEnabled\": true, \"bgmEnabled\": true, \"soundEnabled\": true, \"voiceVolume\": 100, \"bgmVolume\": 100, \"seVolume\": 100, \"messageSpeed\": 4, \"fullScreen\": no, \"aspectRatio\": 0 }\n @saveGameSlots = []\n for i in [0...@saveSlotCount]\n GameStorage.remove(\"SaveGame_#{i}_Header\")\n GameStorage.remove(\"SaveGame_#{i}\")\n \n @saveGameSlots.push({ \"date\": \"\", \"chapter\": \"\", \"scene\": \"\", \"thumb\": \"\" })\n \n GameStorage.setObject(\"settings\", @settings)\n \n \n \n ###*\n * Saves current game settings.\n *\n * @method saveSettings\n ### \n saveSettings: ->\n GameStorage.setObject(\"settings\", @settings)\n \n ###*\n * Saves current global data.\n *\n * @method saveGlobalData\n ### \n saveGlobalData: ->\n @globalData.persistentNumbers = @variableStore.persistentNumbersByDomain\n @globalData.persistentLists = @variableStore.persistentListsByDomain\n @globalData.persistentBooleans = @variableStore.persistentBooleansByDomain\n @globalData.persistentStrings = @variableStore.persistentStringsByDomain\n GameStorage.setObject(\"globalData\", @globalData)\n \n ###*\n * Resets current global data. All stored data about read messages, persistent variables and\n * CG gallery will be deleted.\n *\n * @method resetGlobalData\n ### \n resetGlobalData: ->\n version = @globalData?.version\n data = @globalData\n \n @globalData = { \n messages: {}, cgGallery: {}, version: 342, \n persistentNumbers: { \"0\": [], \"com.degica.vnm.default\": [] }, \n persistentStrings: { \"0\": [], \"com.degica.vnm.default\": [] }, \n persistentBooleans: { \"0\": [], \"com.degica.vnm.default\": [] }, \n persistentLists: { \"0\": [], \"com.degica.vnm.default\": [] } \n }\n \n for cg, i in RecordManager.cgGalleryArray\n if cg?\n @globalData.cgGallery[cg.index] = { unlocked: no }\n \n GameStorage.setObject(\"globalData\", @globalData) \n \n @migrateGlobalData(data, version+1, @globalData.version)\n \n migrateGlobalData: (data, from, to) ->\n for i in [from..to]\n if this[\"migrateGlobalData#{i}\"]?\n this[\"migrateGlobalData#{i}\"](data)\n \n migrateGlobalData342: (data) -> \n if data?\n @globalData.persistentNumbers[0] = data.persistentNumbers[0] || []\n @globalData.persistentStrings[0] = data.persistentStrings[0] || []\n @globalData.persistentBooleans[0] = data.persistentBooleans[0] || []\n @globalData.persistentLists[0] = data.persistentLists[0] || []\n @globalData.persistentNumbers[\"com.degica.vnm.default\"] = data.persistentNumbers[0] || []\n @globalData.persistentStrings[\"com.degica.vnm.default\"] = data.persistentStrings[0] || []\n @globalData.persistentBooleans[\"com.degica.vnm.default\"] = data.persistentBooleans[0] || []\n @globalData.persistentLists[\"com.degica.vnm.default\"] = data.persistentLists[0] || []\n \n readSaveGame: (saveGame) ->\n writeSaveGame: (saveGame) ->\n \n prepareSaveGame: (snapshot) ->\n if snapshot\n snapshot = ResourceManager.getCustomBitmap(\"$snapshot\")\n snapshot?.dispose()\n ResourceManager.setCustomBitmap(\"$snapshot\", Graphics.snapshot())\n \n context = new gs.ObjectCodecContext()\n context.decodedObjectStore.push(Graphics.viewport)\n context.decodedObjectStore.push(@scene)\n context.decodedObjectStore.push(@scene.behavior)\n \n messageBoxIds = [\"messageBox\", \"nvlMessageBox\", \"messageMenu\"];\n messageIds = [\"gameMessage_message\", \"nvlGameMessage_message\"];\n messageBoxes = messageBoxIds.select (id) => @scene.behavior.objectManager.objectById(id)\n messages = messageIds.select (id) => @scene.behavior.objectManager.objectById(id)\n \n sceneData = {}\n saveGame = {}\n saveGame.encodedObjectStore = null\n saveGame.sceneUid = @scene.sceneDocument.uid\n saveGame.data = {\n resourceContext: @scene.behavior.resourceContext.toDataBundle(),\n currentCharacter: @scene.currentCharacter,\n characterParams: @characterParams,\n frameCount: Graphics.frameCount,\n tempFields: @tempFields,\n viewport: @scene.viewport,\n characters: @scene.characters,\n characterNames: RecordManager.charactersArray.select((c) -> { name: c.name, index: c.index }),\n backgrounds: @scene.backgrounds,\n pictures: @scene.pictureContainer.subObjectsByDomain,\n texts: @scene.textContainer.subObjectsByDomain,\n videos: @scene.videoContainer.subObjectsByDomain,\n viewports: @scene.viewportContainer.subObjects,\n commonEvents: @scene.commonEventContainer.subObjects,\n hotspots: @scene.hotspotContainer.subObjectsByDomain,\n interpreter: @scene.interpreter,\n choices: @scene.choices,\n messageBoxes: messageBoxes.select((mb, i) => { visible: mb.visible, id: mb.id, message: messages[i] }),\n backlog: @backlog,\n variableStore: @variableStore,\n defaults: @defaults,\n transitionData: SceneManager.transitionData,\n audio: { audioBuffers: AudioManager.audioBuffers, audioBuffersByLayer: AudioManager.audioBuffersByLayer, audioLayers: AudioManager.audioLayers, soundReferences: AudioManager.soundReferences },\n messageAreas: @scene.messageAreaContainer.subObjectsByDomain\n # messageAreas: @scene.messageAreas.select (f) ->\n # if f \n # { \n # message: f.message, \n # layout: { dstRect: gs.Rect.fromObject(f.layout.dstRect) } \n # } \n # else \n # null\n }\n \n #ss = window.performance.now()\n saveGame.data = gs.ObjectCodec.encode(saveGame.data, context)\n #console.log(window.performance.now() - ss)\n saveGame.encodedObjectStore = context.encodedObjectStore\n\n @saveGame = saveGame\n \n createSaveGameSlot: (header) ->\n slot = {\n \"date\": new Date().toDateString(),\n \"chapter\": @scene.chapter.items.name,\n \"scene\": @scene.sceneDocument.items.name,\n \"image\": header.image\n }\n \n return slot;\n \n createSaveGameHeader: (thumbWidth, thumbHeight) ->\n thumbImage = @createSaveGameThumbImage(thumbWidth, thumbHeight)\n \n header = {\n \"date\": new Date().toDateString(),\n \"chapterUid\": @scene.chapter.uid,\n \"sceneUid\": @scene.sceneDocument.uid,\n \"image\": thumbImage?.image.toDataURL() \n }\n \n thumbImage?.dispose()\n \n return header\n \n createSaveGameThumbImage: (width, height) ->\n snapshot = ResourceManager.getBitmap(\"$snapshot\")\n thumbImage = null\n \n if snapshot and snapshot.loaded\n if width and height\n thumbImage = new Bitmap(width, height)\n else\n thumbImage = new Bitmap(Graphics.width / 8, Graphics.height / 8)\n thumbImage.stretchBlt(new Rect(0, 0, thumbImage.width, thumbImage.height), snapshot, new Rect(0, 0, snapshot.width, snapshot.height))\n \n return thumbImage\n \n storeSaveGame: (name, saveGame, header) ->\n if header\n GameStorage.setData(\"#{name}_Header\", JSON.stringify(header))\n \n GameStorage.setData(name, JSON.stringify(saveGame))\n \n ###*\n * Saves the current game at the specified slot.\n *\n * @method save\n * @param {number} slot - The slot where the game should be saved at.\n * @param {number} thumbWidth - The width for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated width.\n * @param {number} thumbHeight - The height for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated height.\n ### \n save: (slot, thumbWidth, thumbHeight) ->\n if @saveGame\n header = @createSaveGameHeader(thumbWidth, thumbHeight)\n @saveGameSlots[slot] = @createSaveGameSlot(header)\n @storeSaveGame(\"SaveGame_#{slot}\", @saveGame, header)\n @sceneData = {}\n \n return @saveGame\n \n restore: (saveGame) ->\n @backlog = saveGame.data.backlog\n @defaults = saveGame.data.defaults\n @variableStore = saveGame.data.variableStore\n @sceneData = saveGame.data\n @saveGame = null\n @loadedSaveGame = null\n @tempFields = saveGame.data.tempFields\n @characterParams = saveGame.data.characterParams\n window.$tempFields = @tempFields\n window.$dataFields.backlog = @backlog\n \n \n prepareLoadGame: ->\n AudioManager.stopAllMusic(30)\n \n ###*\n * Loads the game from the specified save game slot. This method triggers\n * a automatic scene change.\n *\n * @method load\n * @param {number} slot - The slot where the game should be loaded from.\n ### \n load: (slot) ->\n return if !@saveGameSlots[slot] or @saveGameSlots[slot].date.trim().length == 0\n \n @prepareLoadGame()\n @loadedSaveGame = @loadSaveGame(\"SaveGame_#{slot}\")\n \n \n SceneManager.switchTo(new vn.Object_Scene())\n SceneManager.clear()\n \n \n loadSaveGame: (name) -> JSON.parse(GameStorage.getData(name))\n \n \n ###*\n * Gets the save game data for a specified slot.\n *\n * @method getSaveGame\n * @param {number} slot - The slot to get the save data from.\n * @return {Object} The save game data.\n ### \n getSaveGame: (slot) -> JSON.parse(GameStorage.getData(\"SaveGame_#{slot}\"))\n \nwindow.GameManager = new GameManager()\ngs.GameManager = window.GameManager",
10 + "compiledContent": "var GameManager;\n\nGameManager = (function() {\n\n /**\n * Manages all general things around the game like holding the game settings,\n * manages the save/load of a game, etc.\n *\n * @module gs\n * @class GameManager\n * @memberof gs\n * @constructor\n */\n function GameManager() {\n\n /**\n * The current scene data.\n * @property sceneData\n * @type Object\n */\n this.sceneData = {};\n\n /**\n * The scene viewport containing all visual objects which are part of the scene and influenced\n * by the in-game camera.\n * @property sceneViewport\n * @type gs.Object_Viewport\n */\n this.sceneViewport = null;\n\n /**\n * The list of common events.\n * @property commonEvents\n * @type gs.Object_CommonEvent[]\n */\n this.commonEvents = [];\n\n /**\n * Indicates if the GameManager is initialized.\n * @property commonEvents\n * @type gs.Object_CommonEvent[]\n */\n this.initialized = false;\n\n /**\n * Temporary game settings.\n * @property tempSettings\n * @type Object\n */\n this.tempSettings = {\n skip: false,\n skipTime: 5,\n loadMenuAccess: true,\n menuAccess: true,\n backlogAccess: true,\n saveMenuAccess: true,\n messageFading: {\n animation: {\n type: 1\n },\n duration: 15,\n easing: null\n }\n\n /**\n * Temporary game fields.\n * @property tempFields\n * @type Object\n */\n };\n this.tempFields = null;\n\n /**\n * Stores default values for backgrounds, pictures, etc.\n * @property defaults\n * @type Object\n */\n this.defaults = {\n background: {\n \"duration\": 30,\n \"origin\": 0,\n \"zOrder\": 0,\n \"loopVertical\": 0,\n \"loopHorizontal\": 0,\n \"easing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"animation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n }\n },\n picture: {\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"origin\": 0,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n }\n },\n character: {\n \"expressionDuration\": 0,\n \"appearDuration\": 40,\n \"disappearDuration\": 40,\n \"origin\": 0,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 2,\n \"inOut\": 2\n },\n \"disappearEasing\": {\n \"type\": 1,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n },\n \"changeAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"fading\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"changeEasing\": {\n \"type\": 2,\n \"inOut\": 2\n }\n },\n text: {\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"positionOrigin\": 0,\n \"origin\": 0,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n }\n },\n video: {\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"origin\": 0,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"motionBlur\": {\n \"enabled\": 0,\n \"delay\": 2,\n \"opacity\": 100,\n \"dissolveSpeed\": 3\n }\n },\n live2d: {\n \"motionFadeInTime\": 1000,\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 1,\n \"movement\": 0,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n }\n },\n messageBox: {\n \"appearDuration\": 30,\n \"disappearDuration\": 30,\n \"zOrder\": 0,\n \"appearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"disappearEasing\": {\n \"type\": 0,\n \"inOut\": 1\n },\n \"appearAnimation\": {\n \"type\": 0,\n \"movement\": 3,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n },\n \"disappearAnimation\": {\n \"type\": 0,\n \"movement\": 3,\n \"mask\": {\n \"graphic\": null,\n \"vague\": 30\n }\n }\n },\n audio: {\n \"musicFadeInDuration\": 0,\n \"musicFadeOutDuration\": 0,\n \"musicVolume\": 100,\n \"musicPlaybackRate\": 100,\n \"soundVolume\": 100,\n \"soundPlaybackRate\": 100,\n \"voiceVolume\": 100,\n \"voicePlaybackRate\": 100\n }\n };\n\n /**\n * The game's backlog.\n * @property backlog\n * @type Object[]\n */\n this.backlog = [];\n\n /**\n * Character parameters by character ID.\n * @property characterParams\n * @type Object[]\n */\n this.characterParams = [];\n\n /**\n * The game's chapter\n * @property chapters\n * @type gs.Document[]\n */\n this.chapters = [];\n\n /**\n * The game's current displayed messages. Especially in NVL mode the messages \n * of the current page are stored here.\n * @property messages\n * @type Object[]\n */\n this.messages = [];\n\n /**\n * Count of save slots. Default is 100.\n * @property saveSlotCount\n * @type number\n */\n this.saveSlotCount = 100;\n\n /**\n * The index of save games. Contains the header-info for each save game slot.\n * @property saveGameSlots\n * @type Object[]\n */\n this.saveGameSlots = [];\n\n /**\n * Stores global data like the state of persistent game variables.\n * @property globalData\n * @type Object\n */\n this.globalData = null;\n\n /**\n * Indicates if the game runs in editor's live-preview.\n * @property inLivePreview\n * @type Object\n */\n this.inLivePreview = false;\n }\n\n\n /**\n * Initializes the GameManager, should be called before the actual game starts.\n *\n * @method initialize\n */\n\n GameManager.prototype.initialize = function() {\n var character, i, j, k, l, len, len1, param, ref, ref1, ref2, ref3, ref4, ref5, ref6;\n this.initialized = true;\n this.inLivePreview = $PARAMS.preview != null;\n this.saveSlotCount = RecordManager.system.saveSlotCount || 100;\n this.tempFields = new gs.GameTemp();\n window.$tempFields = this.tempFields;\n this.createSaveGameIndex();\n this.variableStore = new gs.VariableStore();\n DataManager.getDocumentsByType(\"persistent_variables\");\n this.variableStore.setupDomains(DataManager.getDocumentsByType(\"global_variables\").select(function(v) {\n return v.items.domain || \"\";\n }));\n this.variableStore.persistentNumbersByDomain = (ref = this.globalData.persistentNumbers) != null ? ref : this.variableStore.persistentNumbersByDomain;\n this.variableStore.persistentBooleansByDomain = (ref1 = this.globalData.persistentBooleans) != null ? ref1 : this.variableStore.persistentBooleansByDomain;\n this.variableStore.persistentStringsByDomain = (ref2 = this.globalData.persistentStrings) != null ? ref2 : this.variableStore.persistentStringsByDomain;\n this.variableStore.persistentListsByDomain = (ref3 = this.globalData.persistentLists) != null ? ref3 : this.variableStore.persistentListsByDomain;\n this.sceneViewport = new gs.Object_Viewport(new Viewport(0, 0, Graphics.width, Graphics.height, Graphics.viewport));\n ref4 = RecordManager.charactersArray;\n for (j = 0, len = ref4.length; j < len; j++) {\n character = ref4[j];\n if (character != null) {\n this.characterParams[character.index] = {};\n if (character.params != null) {\n ref5 = character.params;\n for (k = 0, len1 = ref5.length; k < len1; k++) {\n param = ref5[k];\n this.characterParams[character.index][param.name] = param.value;\n }\n }\n }\n }\n this.setupCommonEvents();\n for (i = l = 0, ref6 = RecordManager.characters; 0 <= ref6 ? l < ref6 : l > ref6; i = 0 <= ref6 ? ++l : --l) {\n this.settings.voicesPerCharacter[i] = 100;\n }\n this.chapters = DataManager.getDocumentsByType(\"vn.chapter\");\n return this.chapters.sort(function(a, b) {\n if (a.items.order > b.items.order) {\n return 1;\n } else if (a.items.order < b.items.order) {\n return -1;\n } else {\n return 0;\n }\n });\n };\n\n\n /**\n * Sets up common events.\n *\n * @method setupCommonEvents\n */\n\n GameManager.prototype.setupCommonEvents = function() {\n var event, j, k, len, len1, object, ref, ref1, results;\n ref = this.commonEvents;\n for (j = 0, len = ref.length; j < len; j++) {\n event = ref[j];\n if (event != null) {\n event.dispose();\n }\n }\n this.commonEvents = [];\n ref1 = RecordManager.commonEvents;\n results = [];\n for (k = 0, len1 = ref1.length; k < len1; k++) {\n event = ref1[k];\n if (!event) {\n continue;\n }\n if (event.startCondition === 1 && event.autoPreload) {\n gs.ResourceLoader.loadEventCommandsGraphics(event.commands);\n }\n object = new gs.Object_CommonEvent();\n object.record = event;\n object.rid = event.index;\n this.commonEvents[event.index] = object;\n results.push(this.commonEvents.push(object));\n }\n return results;\n };\n\n\n /**\n * Sets up cursor depending on system settings.\n *\n * @method setupCursor\n */\n\n GameManager.prototype.setupCursor = function() {\n var bitmap, ref;\n if ((ref = RecordManager.system.cursor) != null ? ref.name : void 0) {\n bitmap = ResourceManager.getBitmap(\"Graphics/Pictures/\" + RecordManager.system.cursor.name);\n return Graphics.setCursorBitmap(bitmap, RecordManager.system.cursor.hx, RecordManager.system.cursor.hy);\n } else {\n return Graphics.setCursorBitmap(null);\n }\n };\n\n\n /**\n * Disposes the GameManager. Should be called before quit the game.\n *\n * @method dispose\n */\n\n GameManager.prototype.dispose = function() {};\n\n\n /**\n * Quits the game. The implementation depends on the platform. So for example on mobile\n * devices this method has no effect.\n *\n * @method exit\n */\n\n GameManager.prototype.exit = function() {\n return Application.exit();\n };\n\n\n /**\n * Resets the GameManager by disposing and re-initializing it.\n *\n * @method reset\n */\n\n GameManager.prototype.reset = function() {\n this.initialized = false;\n this.interpreter = null;\n this.dispose();\n return this.initialize();\n };\n\n\n /**\n * Starts a new game.\n *\n * @method newGame\n */\n\n GameManager.prototype.newGame = function() {\n this.messages = [];\n this.variableStore.clearAllGlobalVariables();\n this.variableStore.clearAllLocalVariables();\n this.tempSettings.skip = false;\n this.tempFields.clear();\n this.tempFields.inGame = true;\n this.setupCommonEvents();\n this.tempSettings.menuAccess = true;\n this.tempSettings.saveMenuAccess = true;\n this.tempSettings.loadMenuAccess = true;\n return this.tempSettings.backlogAccess = true;\n };\n\n\n /**\n * Exists the game and resets the GameManager which is important before going back to\n * the main menu or title screen.\n *\n * @method exitGame\n */\n\n GameManager.prototype.exitGame = function() {\n this.tempFields.inGame = false;\n return this.tempFields.isExitingGame = true;\n };\n\n\n /**\n * Updates the GameManager. Should be called once per frame.\n *\n * @method update\n */\n\n GameManager.prototype.update = function() {};\n\n\n /**\n * Creates the index of all save-games. Should be called whenever a new save game\n * is created.\n *\n * @method createSaveGameIndex\n * @protected\n */\n\n GameManager.prototype.createSaveGameIndex = function() {\n var chaper, chapter, header, i, image, j, ref, scene;\n this.saveGameSlots = [];\n for (i = j = 0, ref = this.saveSlotCount; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {\n if (GameStorage.exists(\"SaveGame_\" + i + \"_Header\")) {\n header = GameStorage.getObject(\"SaveGame_\" + i + \"_Header\");\n chapter = DataManager.getDocument(header.chapterUid);\n scene = DataManager.getDocumentSummary(header.sceneUid);\n image = header.image;\n } else {\n header = null;\n chaper = null;\n scene = null;\n }\n if ((chapter != null) && (scene != null) && !this.inLivePreview) {\n this.saveGameSlots.push({\n date: header.date,\n chapter: chapter.items.name || \"DELETED\",\n scene: scene.items.name || \"DELETED\",\n image: image\n });\n } else {\n this.saveGameSlots.push({\n \"date\": \"\",\n \"chapter\": \"\",\n \"scene\": \"\",\n \"image\": null\n });\n }\n }\n return this.saveGameSlots;\n };\n\n\n /**\n * Resets the game's settings to its default values.\n *\n * @method resetSettings\n */\n\n GameManager.prototype.resetSettings = function() {\n var i, j, ref;\n this.settings = {\n version: 342,\n renderer: 0,\n filter: 1,\n confirmation: true,\n adjustAspectRatio: false,\n allowSkip: true,\n allowSkipUnreadMessages: true,\n allowVideoSkip: true,\n skipVoiceOnAction: true,\n allowChoiceSkip: false,\n voicesByCharacter: [],\n timeMessageToVoice: true,\n \"autoMessage\": {\n enabled: false,\n time: 0,\n waitForVoice: true,\n stopOnAction: false\n },\n \"voiceEnabled\": true,\n \"bgmEnabled\": true,\n \"soundEnabled\": true,\n \"voiceVolume\": 100,\n \"bgmVolume\": 100,\n \"seVolume\": 100,\n \"messageSpeed\": 4,\n \"fullScreen\": false,\n \"aspectRatio\": 0\n };\n this.saveGameSlots = [];\n for (i = j = 0, ref = this.saveSlotCount; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {\n GameStorage.remove(\"SaveGame_\" + i + \"_Header\");\n GameStorage.remove(\"SaveGame_\" + i);\n this.saveGameSlots.push({\n \"date\": \"\",\n \"chapter\": \"\",\n \"scene\": \"\",\n \"thumb\": \"\"\n });\n }\n return GameStorage.setObject(\"settings\", this.settings);\n };\n\n\n /**\n * Saves current game settings.\n *\n * @method saveSettings\n */\n\n GameManager.prototype.saveSettings = function() {\n return GameStorage.setObject(\"settings\", this.settings);\n };\n\n\n /**\n * Saves current global data.\n *\n * @method saveGlobalData\n */\n\n GameManager.prototype.saveGlobalData = function() {\n this.globalData.persistentNumbers = this.variableStore.persistentNumbersByDomain;\n this.globalData.persistentLists = this.variableStore.persistentListsByDomain;\n this.globalData.persistentBooleans = this.variableStore.persistentBooleansByDomain;\n this.globalData.persistentStrings = this.variableStore.persistentStringsByDomain;\n return GameStorage.setObject(\"globalData\", this.globalData);\n };\n\n\n /**\n * Resets current global data. All stored data about read messages, persistent variables and\n * CG gallery will be deleted.\n *\n * @method resetGlobalData\n */\n\n GameManager.prototype.resetGlobalData = function() {\n var cg, data, i, j, len, ref, ref1, version;\n version = (ref = this.globalData) != null ? ref.version : void 0;\n data = this.globalData;\n this.globalData = {\n messages: {},\n cgGallery: {},\n version: 342,\n persistentNumbers: {\n \"0\": [],\n \"com.degica.vnm.default\": []\n },\n persistentStrings: {\n \"0\": [],\n \"com.degica.vnm.default\": []\n },\n persistentBooleans: {\n \"0\": [],\n \"com.degica.vnm.default\": []\n },\n persistentLists: {\n \"0\": [],\n \"com.degica.vnm.default\": []\n }\n };\n ref1 = RecordManager.cgGalleryArray;\n for (i = j = 0, len = ref1.length; j < len; i = ++j) {\n cg = ref1[i];\n if (cg != null) {\n this.globalData.cgGallery[cg.index] = {\n unlocked: false\n };\n }\n }\n GameStorage.setObject(\"globalData\", this.globalData);\n return this.migrateGlobalData(data, version + 1, this.globalData.version);\n };\n\n GameManager.prototype.migrateGlobalData = function(data, from, to) {\n var i, j, ref, ref1, results;\n results = [];\n for (i = j = ref = from, ref1 = to; ref <= ref1 ? j <= ref1 : j >= ref1; i = ref <= ref1 ? ++j : --j) {\n if (this[\"migrateGlobalData\" + i] != null) {\n results.push(this[\"migrateGlobalData\" + i](data));\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n GameManager.prototype.migrateGlobalData342 = function(data) {\n if (data != null) {\n this.globalData.persistentNumbers[0] = data.persistentNumbers[0] || [];\n this.globalData.persistentStrings[0] = data.persistentStrings[0] || [];\n this.globalData.persistentBooleans[0] = data.persistentBooleans[0] || [];\n this.globalData.persistentLists[0] = data.persistentLists[0] || [];\n this.globalData.persistentNumbers[\"com.degica.vnm.default\"] = data.persistentNumbers[0] || [];\n this.globalData.persistentStrings[\"com.degica.vnm.default\"] = data.persistentStrings[0] || [];\n this.globalData.persistentBooleans[\"com.degica.vnm.default\"] = data.persistentBooleans[0] || [];\n return this.globalData.persistentLists[\"com.degica.vnm.default\"] = data.persistentLists[0] || [];\n }\n };\n\n GameManager.prototype.readSaveGame = function(saveGame) {};\n\n GameManager.prototype.writeSaveGame = function(saveGame) {};\n\n GameManager.prototype.prepareSaveGame = function(snapshot) {\n var context, messageBoxIds, messageBoxes, messageIds, messages, saveGame, sceneData;\n if (snapshot) {\n snapshot = ResourceManager.getCustomBitmap(\"$snapshot\");\n if (snapshot != null) {\n snapshot.dispose();\n }\n ResourceManager.setCustomBitmap(\"$snapshot\", Graphics.snapshot());\n }\n context = new gs.ObjectCodecContext();\n context.decodedObjectStore.push(Graphics.viewport);\n context.decodedObjectStore.push(this.scene);\n context.decodedObjectStore.push(this.scene.behavior);\n messageBoxIds = [\"messageBox\", \"nvlMessageBox\", \"messageMenu\"];\n messageIds = [\"gameMessage_message\", \"nvlGameMessage_message\"];\n messageBoxes = messageBoxIds.select((function(_this) {\n return function(id) {\n return _this.scene.behavior.objectManager.objectById(id);\n };\n })(this));\n messages = messageIds.select((function(_this) {\n return function(id) {\n return _this.scene.behavior.objectManager.objectById(id);\n };\n })(this));\n sceneData = {};\n saveGame = {};\n saveGame.encodedObjectStore = null;\n saveGame.sceneUid = this.scene.sceneDocument.uid;\n saveGame.data = {\n resourceContext: this.scene.behavior.resourceContext.toDataBundle(),\n currentCharacter: this.scene.currentCharacter,\n characterParams: this.characterParams,\n frameCount: Graphics.frameCount,\n tempFields: this.tempFields,\n viewport: this.scene.viewport,\n characters: this.scene.characters,\n characterNames: RecordManager.charactersArray.select(function(c) {\n return {\n name: c.name,\n index: c.index\n };\n }),\n backgrounds: this.scene.backgrounds,\n pictures: this.scene.pictureContainer.subObjectsByDomain,\n texts: this.scene.textContainer.subObjectsByDomain,\n videos: this.scene.videoContainer.subObjectsByDomain,\n viewports: this.scene.viewportContainer.subObjects,\n commonEvents: this.scene.commonEventContainer.subObjects,\n hotspots: this.scene.hotspotContainer.subObjectsByDomain,\n interpreter: this.scene.interpreter,\n choices: this.scene.choices,\n messageBoxes: messageBoxes.select((function(_this) {\n return function(mb, i) {\n return {\n visible: mb.visible,\n id: mb.id,\n message: messages[i]\n };\n };\n })(this)),\n backlog: this.backlog,\n variableStore: this.variableStore,\n defaults: this.defaults,\n transitionData: SceneManager.transitionData,\n audio: {\n audioBuffers: AudioManager.audioBuffers,\n audioBuffersByLayer: AudioManager.audioBuffersByLayer,\n audioLayers: AudioManager.audioLayers,\n soundReferences: AudioManager.soundReferences\n },\n messageAreas: this.scene.messageAreaContainer.subObjectsByDomain\n };\n saveGame.data = gs.ObjectCodec.encode(saveGame.data, context);\n saveGame.encodedObjectStore = context.encodedObjectStore;\n return this.saveGame = saveGame;\n };\n\n GameManager.prototype.createSaveGameSlot = function(header) {\n var slot;\n slot = {\n \"date\": new Date().toDateString(),\n \"chapter\": this.scene.chapter.items.name,\n \"scene\": this.scene.sceneDocument.items.name,\n \"image\": header.image\n };\n return slot;\n };\n\n GameManager.prototype.createSaveGameHeader = function(thumbWidth, thumbHeight) {\n var header, thumbImage;\n thumbImage = this.createSaveGameThumbImage(thumbWidth, thumbHeight);\n header = {\n \"date\": new Date().toDateString(),\n \"chapterUid\": this.scene.chapter.uid,\n \"sceneUid\": this.scene.sceneDocument.uid,\n \"image\": thumbImage != null ? thumbImage.image.toDataURL() : void 0\n };\n if (thumbImage != null) {\n thumbImage.dispose();\n }\n return header;\n };\n\n GameManager.prototype.createSaveGameThumbImage = function(width, height) {\n var snapshot, thumbImage;\n snapshot = ResourceManager.getBitmap(\"$snapshot\");\n thumbImage = null;\n if (snapshot && snapshot.loaded) {\n if (width && height) {\n thumbImage = new Bitmap(width, height);\n } else {\n thumbImage = new Bitmap(Graphics.width / 8, Graphics.height / 8);\n }\n thumbImage.stretchBlt(new Rect(0, 0, thumbImage.width, thumbImage.height), snapshot, new Rect(0, 0, snapshot.width, snapshot.height));\n }\n return thumbImage;\n };\n\n GameManager.prototype.storeSaveGame = function(name, saveGame, header) {\n if (header) {\n GameStorage.setData(name + \"_Header\", JSON.stringify(header));\n }\n return GameStorage.setData(name, JSON.stringify(saveGame));\n };\n\n\n /**\n * Saves the current game at the specified slot.\n *\n * @method save\n * @param {number} slot - The slot where the game should be saved at.\n * @param {number} thumbWidth - The width for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated width.\n * @param {number} thumbHeight - The height for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated height.\n */\n\n GameManager.prototype.save = function(slot, thumbWidth, thumbHeight) {\n var header;\n if (this.saveGame) {\n header = this.createSaveGameHeader(thumbWidth, thumbHeight);\n this.saveGameSlots[slot] = this.createSaveGameSlot(header);\n this.storeSaveGame(\"SaveGame_\" + slot, this.saveGame, header);\n this.sceneData = {};\n return this.saveGame;\n }\n };\n\n GameManager.prototype.restore = function(saveGame) {\n this.backlog = saveGame.data.backlog;\n this.defaults = saveGame.data.defaults;\n this.variableStore = saveGame.data.variableStore;\n this.sceneData = saveGame.data;\n this.saveGame = null;\n this.loadedSaveGame = null;\n this.tempFields = saveGame.data.tempFields;\n this.characterParams = saveGame.data.characterParams;\n window.$tempFields = this.tempFields;\n return window.$dataFields.backlog = this.backlog;\n };\n\n GameManager.prototype.prepareLoadGame = function() {\n return AudioManager.stopAllMusic(30);\n };\n\n\n /**\n * Loads the game from the specified save game slot. This method triggers\n * a automatic scene change.\n *\n * @method load\n * @param {number} slot - The slot where the game should be loaded from.\n */\n\n GameManager.prototype.load = function(slot) {\n if (!this.saveGameSlots[slot] || this.saveGameSlots[slot].date.trim().length === 0) {\n return;\n }\n this.prepareLoadGame();\n this.loadedSaveGame = this.loadSaveGame(\"SaveGame_\" + slot);\n SceneManager.switchTo(new vn.Object_Scene());\n return SceneManager.clear();\n };\n\n GameManager.prototype.loadSaveGame = function(name) {\n return JSON.parse(GameStorage.getData(name));\n };\n\n\n /**\n * Gets the save game data for a specified slot.\n *\n * @method getSaveGame\n * @param {number} slot - The slot to get the save data from.\n * @return {Object} The save game data.\n */\n\n GameManager.prototype.getSaveGame = function(slot) {\n return JSON.parse(GameStorage.getData(\"SaveGame_\" + slot));\n };\n\n return GameManager;\n\n})();\n\nwindow.GameManager = new GameManager();\n\ngs.GameManager = window.GameManager;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUE7O0FBQU07O0FBQ0Y7Ozs7Ozs7OztFQVNhLHFCQUFBOztBQUNUOzs7OztJQUtBLElBQUMsQ0FBQSxTQUFELEdBQWE7O0FBRWI7Ozs7OztJQU1BLElBQUMsQ0FBQSxhQUFELEdBQWlCOztBQUVqQjs7Ozs7SUFLQSxJQUFDLENBQUEsWUFBRCxHQUFnQjs7QUFFaEI7Ozs7O0lBS0EsSUFBQyxDQUFBLFdBQUQsR0FBZTs7QUFFZjs7Ozs7SUFLQSxJQUFDLENBQUEsWUFBRCxHQUFnQjtNQUFBLElBQUEsRUFBTSxLQUFOO01BQWEsUUFBQSxFQUFVLENBQXZCO01BQTBCLGNBQUEsRUFBZ0IsSUFBMUM7TUFBZ0QsVUFBQSxFQUFZLElBQTVEO01BQWtFLGFBQUEsRUFBZSxJQUFqRjtNQUF1RixjQUFBLEVBQWdCLElBQXZHO01BQTZHLGFBQUEsRUFBZTtRQUFFLFNBQUEsRUFBVztVQUFFLElBQUEsRUFBTSxDQUFSO1NBQWI7UUFBMEIsUUFBQSxFQUFVLEVBQXBDO1FBQXdDLE1BQUEsRUFBUSxJQUFoRDs7O0FBRTVJOzs7O1NBRmdCOztJQU9oQixJQUFDLENBQUEsVUFBRCxHQUFjOztBQUVkOzs7OztJQUtBLElBQUMsQ0FBQSxRQUFELEdBQVk7TUFDUixVQUFBLEVBQVk7UUFBRSxVQUFBLEVBQVksRUFBZDtRQUFrQixRQUFBLEVBQVUsQ0FBNUI7UUFBK0IsUUFBQSxFQUFVLENBQXpDO1FBQTRDLGNBQUEsRUFBZ0IsQ0FBNUQ7UUFBK0QsZ0JBQUEsRUFBa0IsQ0FBakY7UUFBb0YsUUFBQSxFQUFVO1VBQUUsTUFBQSxFQUFRLENBQVY7VUFBYSxPQUFBLEVBQVMsQ0FBdEI7U0FBOUY7UUFBeUgsV0FBQSxFQUFhO1VBQUUsTUFBQSxFQUFRLENBQVY7VUFBYSxVQUFBLEVBQVksQ0FBekI7VUFBNEIsTUFBQSxFQUFRO1lBQUUsU0FBQSxFQUFXLElBQWI7WUFBbUIsT0FB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bUIsUUFBUSxDQUFDLElBQUksQ0FBQztJQUNqQyxNQUFNLENBQUMsV0FBUCxHQUFxQixJQUFDLENBQUE7V0FDdEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFuQixHQUE2QixJQUFDLENBQUE7RUFWekI7O3dCQWFULGVBQUEsR0FBaUIsU0FBQTtXQUNiLFlBQVksQ0FBQyxZQUFiLENBQTBCLEVBQTFCO0VBRGE7OztBQUdqQjs7Ozs7Ozs7d0JBT0EsSUFBQSxHQUFNLFNBQUMsSUFBRDtJQUNGLElBQVUsQ0FBQyxJQUFDLENBQUEsYUFBYyxDQUFBLElBQUEsQ0FBaEIsSUFBeUIsSUFBQyxDQUFBLGFBQWMsQ0FBQSxJQUFBLENBQUssQ0FBQyxJQUFJLENBQUMsSUFBMUIsQ0FBQSxDQUFnQyxDQUFDLE1BQWpDLEtBQTJDLENBQTlFO0FBQUEsYUFBQTs7SUFFQSxJQUFDLENBQUEsZUFBRCxDQUFBO0lBQ0EsSUFBQyxDQUFBLGNBQUQsR0FBa0IsSUFBQyxDQUFBLFlBQUQsQ0FBYyxXQUFBLEdBQVksSUFBMUI7SUFHbEIsWUFBWSxDQUFDLFFBQWIsQ0FBMEIsSUFBQSxFQUFFLENBQUMsWUFBSCxDQUFBLENBQTFCO1dBQ0EsWUFBWSxDQUFDLEtBQWIsQ0FBQTtFQVJFOzt3QkFXTixZQUFBLEdBQWMsU0FBQyxJQUFEO1dBQVUsSUFBSSxDQUFDLEtBQUwsQ0FBVyxXQUFXLENBQUMsT0FBWixDQUFvQixJQUFwQixDQUFYO0VBQVY7OztBQUdkOzs7Ozs7Ozt3QkFPQSxXQUFBLEdBQWEsU0FBQyxJQUFEO1dBQVUsSUFBSSxDQUFDLEtBQUwsQ0FBVyxXQUFXLENBQUMsT0FBWixDQUFvQixXQUFBLEdBQVksSUFBaEMsQ0FBWDtFQUFWOzs7Ozs7QUFFakIsTUFBTSxDQUFDLFdBQVAsR0FBeUIsSUFBQSxXQUFBLENBQUE7O0FBQ3pCLEVBQUUsQ0FBQyxXQUFILEdBQWlCLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogR2FtZU1hbmFnZXJcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIEdhbWVNYW5hZ2VyXG4gICAgIyMjKlxuICAgICogTWFuYWdlcyBhbGwgZ2VuZXJhbCB0aGluZ3MgYXJvdW5kIHRoZSBnYW1lIGxpa2UgaG9sZGluZyB0aGUgZ2FtZSBzZXR0aW5ncyxcbiAgICAqIG1hbmFnZXMgdGhlIHNhdmUvbG9hZCBvZiBhIGdhbWUsIGV0Yy5cbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgR2FtZU1hbmFnZXJcbiAgICAqIEBtZW1iZXJvZiBnc1xuICAgICogQGNvbnN0cnVjdG9yXG4gICAgIyMjXG4gICAgY29uc3RydWN0b3I6IC0+XG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgY3VycmVudCBzY2VuZSBkYXRhLlxuICAgICAgICAqIEBwcm9wZXJ0eSBzY2VuZURhdGFcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjIFxuICAgICAgICBAc2NlbmVEYXRhID0ge31cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgc2NlbmUgdmlld3BvcnQgY29udGFpbmluZyBhbGwgdmlzdWFsIG9iamVjdHMgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHNjZW5lIGFuZCBpbmZsdWVuY2VkXG4gICAgICAgICogYnkgdGhlIGluLWdhbWUgY2FtZXJhLlxuICAgICAgICAqIEBwcm9wZXJ0eSBzY2VuZVZpZXdwb3J0XG4gICAgICAgICogQHR5cGUgZ3MuT2JqZWN0X1ZpZXdwb3J0XG4gICAgICAgICMjI1xuICAgICAgICBAc2NlbmVWaWV3cG9ydCA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgbGlzdCBvZiBjb21tb24gZXZlbnRzLlxuICAgICAgICAqIEBwcm9wZXJ0eSBjb21tb25FdmVudHNcbiAgICAgICAgKiBAdHlwZSBncy5PYmplY3RfQ29tbW9uRXZlbnRbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBjb21tb25FdmVudHMgPSBbXVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgR2FtZU1hbmFnZXIgaXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICogQHByb3BlcnR5IGNvbW1vbkV2ZW50c1xuICAgICAgICAqIEB0eXBlIGdzLk9iamVjdF9Db21tb25FdmVudFtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQGluaXRpYWxpemVkID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUZW1wb3JhcnkgZ2FtZSBzZXR0aW5ncy5cbiAgICAgICAgKiBAcHJvcGVydHkgdGVtcFNldHRpbmdzXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICMjIyBcbiAgICAgICAgQHRlbXBTZXR0aW5ncyA9IHNraXA6IGZhbHNlLCBza2lwVGltZTogNSwgbG9hZE1lbnVBY2Nlc3M6IHRydWUsIG1lbnVBY2Nlc3M6IHRydWUsIGJhY2tsb2dBY2Nlc3M6IHRydWUsIHNhdmVNZW51QWNjZXNzOiB0cnVlLCBtZXNzYWdlRmFkaW5nOiB7IGFuaW1hdGlvbjogeyB0eXBlOiAxIH0sIGR1cmF0aW9uOiAxNSwgZWFzaW5nOiBudWxsIH1cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUZW1wb3JhcnkgZ2FtZSBmaWVsZHMuXG4gICAgICAgICogQHByb3BlcnR5IHRlbXBGaWVsZHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjIFxuICAgICAgICBAdGVtcEZpZWxkcyA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBTdG9yZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIGJhY2tncm91bmRzLCBwaWN0dXJlcywgZXRjLlxuICAgICAgICAqIEBwcm9wZXJ0eSBkZWZhdWx0c1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyNcbiAgICAgICAgQGRlZmF1bHRzID0geyBcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHsgXCJkdXJhdGlvblwiOiAzMCwgXCJvcmlnaW5cIjogMCwgXCJ6T3JkZXJcIjogMCwgXCJsb29wVmVydGljYWxcIjogMCwgXCJsb29wSG9yaXpvbnRhbFwiOiAwLCBcImVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwibW90aW9uQmx1clwiOiB7IFwiZW5hYmxlZFwiOiAwLCBcImRlbGF5XCI6IDIsIFwib3BhY2l0eVwiOiAxMDAsIFwiZGlzc29sdmVTcGVlZFwiOiAzIH0gfSxcbiAgICAgICAgICAgIHBpY3R1cmU6IHsgXCJhcHBlYXJEdXJhdGlvblwiOiAzMCwgXCJkaXNhcHBlYXJEdXJhdGlvblwiOiAzMCwgXCJvcmlnaW5cIjogMCwgXCJ6T3JkZXJcIjogMCwgXCJhcHBlYXJFYXNpbmdcIjogeyBcInR5cGVcIjogMCwgXCJpbk91dFwiOiAxIH0sIFwiZGlzYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImFwcGVhckFuaW1hdGlvblwiOiB7IFwidHlwZVwiOiAxLCBcIm1vdmVtZW50XCI6IDAsIFwibWFza1wiOiB7IFwiZ3JhcGhpY1wiOiBudWxsLCBcInZhZ3VlXCI6IDMwIH0gfSwgXCJkaXNhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwibW90aW9uQmx1clwiOiB7IFwiZW5hYmxlZFwiOiAwLCBcImRlbGF5XCI6IDIsIFwib3BhY2l0eVwiOiAxMDAsIFwiZGlzc29sdmVTcGVlZFwiOiAzIH0gfSxcbiAgICAgICAgICAgIGNoYXJhY3RlcjogeyBcImV4cHJlc3Npb25EdXJhdGlvblwiOiAwLCBcImFwcGVhckR1cmF0aW9uXCI6IDQwLCBcImRpc2FwcGVhckR1cmF0aW9uXCI6IDQwLCBcIm9yaWdpblwiOiAwLCBcInpPcmRlclwiOiAwLCBcImFwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAyLCBcImluT3V0XCI6IDIgfSwgXCJkaXNhcHBlYXJFYXNpbmdcIjogeyBcInR5cGVcIjogMSwgXCJpbk91dFwiOiAxIH0sIFwiYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDEsIFwibW92ZW1lbnRcIjogMCwgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9LCBcImRpc2FwcGVhckFuaW1hdGlvblwiOiB7IFwidHlwZVwiOiAxLCBcIm1vdmVtZW50XCI6IDAsIFwibWFza1wiOiB7IFwiZ3JhcGhpY1wiOiBudWxsLCBcInZhZ3VlXCI6IDMwIH0gfSwgXCJtb3Rpb25CbHVyXCI6IHsgXCJlbmFibGVkXCI6IDAsIFwiZGVsYXlcIjogMiwgXCJvcGFjaXR5XCI6IDEwMCwgXCJkaXNzb2x2ZVNwZWVkXCI6IDMgfSwgXCJjaGFuZ2VBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcImZhZGluZ1wiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiY2hhbmdlRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDIsIFwiaW5PdXRcIjogMiB9IH0sXG4gICAgICAgICAgICB0ZXh0OiB7IFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwicG9zaXRpb25PcmlnaW5cIjogMCwgXCJvcmlnaW5cIjogMCwgXCJ6T3JkZXJcIjogMCwgXCJhcHBlYXJFYXNpbmdcIjogeyBcInR5cGVcIjogMCwgXCJpbk91dFwiOiAxIH0sIFwiZGlzYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImFwcGVhckFuaW1hdGlvblwiOiB7IFwidHlwZVwiOiAxLCBcIm1vdmVtZW50XCI6IDAsIFwibWFza1wiOiB7IFwiZ3JhcGhpY1wiOiBudWxsLCBcInZhZ3VlXCI6IDMwIH0gfSwgXCJkaXNhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwibW90aW9uQmx1clwiOiB7IFwiZW5hYmxlZFwiOiAwLCBcImRlbGF5XCI6IDIsIFwib3BhY2l0eVwiOiAxMDAsIFwiZGlzc29sdmVTcGVlZFwiOiAzIH0gfSxcbiAgICAgICAgICAgIHZpZGVvOiB7IFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwib3JpZ2luXCI6IDAsIFwiek9yZGVyXCI6IDAsIFwiYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImRpc2FwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiZGlzYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDEsIFwibW92ZW1lbnRcIjogMCwgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9LCBcIm1vdGlvbkJsdXJcIjogeyBcImVuYWJsZWRcIjogMCwgXCJkZWxheVwiOiAyLCBcIm9wYWNpdHlcIjogMTAwLCBcImRpc3NvbHZlU3BlZWRcIjogMyB9IH0sXG4gICAgICAgICAgICBsaXZlMmQ6IHsgXCJtb3Rpb25GYWRlSW5UaW1lXCI6IDEwMDAsIFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiek9yZGVyXCI6IDAsIFwiYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImRpc2FwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiZGlzYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDEsIFwibW92ZW1lbnRcIjogMCwgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9IH0sXG4gICAgICAgICAgICBtZXNzYWdlQm94OiB7IFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiek9yZGVyXCI6IDAsIFwiYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImRpc2FwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMCwgXCJtb3ZlbWVudFwiOiAzLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiZGlzYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDAsIFwibW92ZW1lbnRcIjogMywgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9IH0sXG4gICAgICAgICAgICBhdWRpbzogeyBcIm11c2ljRmFkZUluRHVyYXRpb25cIjogMCwgXCJtdXNpY0ZhZGVPdXREdXJhdGlvblwiOiAwLCBcIm11c2ljVm9sdW1lXCI6IDEwMCwgXCJtdXNpY1BsYXliYWNrUmF0ZVwiOiAxMDAsIFwic291bmRWb2x1bWVcIjogMTAwLCBcInNvdW5kUGxheWJhY2tSYXRlXCI6IDEwMCwgXCJ2b2ljZVZvbHVtZVwiOiAxMDAsIFwidm9pY2VQbGF5YmFja1JhdGVcIjogMTAwIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBnYW1lJ3MgYmFja2xvZy5cbiAgICAgICAgKiBAcHJvcGVydHkgYmFja2xvZ1xuICAgICAgICAqIEB0eXBlIE9iamVjdFtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQGJhY2tsb2cgPSBbXVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIENoYXJhY3RlciBwYXJhbWV0ZXJzIGJ5IGNoYXJhY3RlciBJRC5cbiAgICAgICAgKiBAcHJvcGVydHkgY2hhcmFjdGVyUGFyYW1zXG4gICAgICAgICogQHR5cGUgT2JqZWN0W11cbiAgICAgICAgIyMjIFxuICAgICAgICBAY2hhcmFjdGVyUGFyYW1zID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZ2FtZSdzIGNoYXB0ZXJcbiAgICAgICAgKiBAcHJvcGVydHkgY2hhcHRlcnNcbiAgICAgICAgKiBAdHlwZSBncy5Eb2N1bWVudFtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQGNoYXB0ZXJzID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZ2FtZSdzIGN1cnJlbnQgZGlzcGxheWVkIG1lc3NhZ2VzLiBFc3BlY2lhbGx5IGluIE5WTCBtb2RlIHRoZSBtZXNzYWdlcyBcbiAgICAgICAgKiBvZiB0aGUgY3VycmVudCBwYWdlIGFyZSBzdG9yZWQgaGVyZS5cbiAgICAgICAgKiBAcHJvcGVydHkgbWVzc2FnZXNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBtZXNzYWdlcyA9IFtdXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQ291bnQgb2Ygc2F2ZSBzbG90cy4gRGVmYXVsdCBpcyAxMDAuXG4gICAgICAgICogQHByb3BlcnR5IHNhdmVTbG90Q291bnRcbiAgICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAgIyMjIFxuICAgICAgICBAc2F2ZVNsb3RDb3VudCA9IDEwMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBpbmRleCBvZiBzYXZlIGdhbWVzLiBDb250YWlucyB0aGUgaGVhZGVyLWluZm8gZm9yIGVhY2ggc2F2ZSBnYW1lIHNsb3QuXG4gICAgICAgICogQHByb3BlcnR5IHNhdmVHYW1lU2xvdHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBzYXZlR2FtZVNsb3RzID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBTdG9yZXMgZ2xvYmFsIGRhdGEgbGlrZSB0aGUgc3RhdGUgb2YgcGVyc2lzdGVudCBnYW1lIHZhcmlhYmxlcy5cbiAgICAgICAgKiBAcHJvcGVydHkgZ2xvYmFsRGF0YVxuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyMgXG4gICAgICAgIEBnbG9iYWxEYXRhID0gbnVsbFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2FtZSBydW5zIGluIGVkaXRvcidzIGxpdmUtcHJldmlldy5cbiAgICAgICAgKiBAcHJvcGVydHkgaW5MaXZlUHJldmlld1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyMgXG4gICAgICAgIEBpbkxpdmVQcmV2aWV3ID0gbm9cbiAgICAgICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogSW5pdGlhbGl6ZXMgdGhlIEdhbWVNYW5hZ2VyLCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgYWN0dWFsIGdhbWUgc3RhcnRzLlxuICAgICpcbiAgICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgICMjIyAgICBcbiAgICBpbml0aWFsaXplOiAtPlxuICAgICAgICBAaW5pdGlhbGl6ZWQgPSB5ZXNcbiAgICAgICAgQGluTGl2ZVByZXZpZXcgPSAkUEFSQU1TLnByZXZpZXc/XG4gICAgICAgIEBzYXZlU2xvdENvdW50ID0gUmVjb3JkTWFuYWdlci5zeXN0ZW0uc2F2ZVNsb3RDb3VudCB8fCAxMDBcbiAgICAgICAgQHRlbXBGaWVsZHMgPSBuZXcgZ3MuR2FtZVRlbXAoKVxuICAgICAgICB3aW5kb3cuJHRlbXBGaWVsZHMgPSBAdGVtcEZpZWxkc1xuICAgICAgICBcbiAgICAgICAgQGNyZWF0ZVNhdmVHYW1lSW5kZXgoKVxuICAgICAgICBAdmFyaWFibGVTdG9yZSA9IG5ldyBncy5WYXJpYWJsZVN0b3JlKClcbiAgICAgICAgRGF0YU1hbmFnZXIuZ2V0RG9jdW1lbnRzQnlUeXBlKFwicGVyc2lzdGVudF92YXJpYWJsZXNcIilcbiAgICAgICAgQHZhcmlhYmxlU3RvcmUuc2V0dXBEb21haW5zKERhdGFNYW5hZ2VyLmdldERvY3VtZW50c0J5VHlwZShcImdsb2JhbF92YXJpYWJsZXNcIikuc2VsZWN0ICh2KSAtPiB2Lml0ZW1zLmRvbWFpbnx8XCJcIilcbiAgICAgICAgQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudE51bWJlcnNCeURvbWFpbiA9IEBnbG9iYWxEYXRhLnBlcnNpc3RlbnROdW1iZXJzID8gQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudE51bWJlcnNCeURvbWFpblxuICAgICAgICBAdmFyaWFibGVTdG9yZS5wZXJzaXN0ZW50Qm9vbGVhbnNCeURvbWFpbiA9IEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRCb29sZWFucyA/IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRCb29sZWFuc0J5RG9tYWluXG4gICAgICAgIEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRTdHJpbmdzQnlEb21haW4gPSBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50U3RyaW5ncyA/IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRTdHJpbmdzQnlEb21haW5cbiAgICAgICAgQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudExpc3RzQnlEb21haW4gPSBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50TGlzdHMgPyBAdmFyaWFibGVTdG9yZS5wZXJzaXN0ZW50TGlzdHNCeURvbWFpblxuICAgICAgICBcbiAgICAgICAgQHNjZW5lVmlld3BvcnQgPSBuZXcgZ3MuT2JqZWN0X1ZpZXdwb3J0KG5ldyBWaWV3cG9ydCgwLCAwLCBHcmFwaGljcy53aWR0aCwgR3JhcGhpY3MuaGVpZ2h0LCBHcmFwaGljcy52aWV3cG9ydCkpXG4gICAgICAgIGZvciBjaGFyYWN0ZXIgaW4gUmVjb3JkTWFuYWdlci5jaGFyYWN0ZXJzQXJyYXlcbiAgICAgICAgICAgIGlmIGNoYXJhY3Rlcj9cbiAgICAgICAgICAgICAgICBAY2hhcmFjdGVyUGFyYW1zW2NoYXJhY3Rlci5pbmRleF0gPSB7fVxuICAgICAgICAgICAgICAgIGlmIGNoYXJhY3Rlci5wYXJhbXM/XG4gICAgICAgICAgICAgICAgICAgIGZvciBwYXJhbSBpbiBjaGFyYWN0ZXIucGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBAY2hhcmFjdGVyUGFyYW1zW2NoYXJhY3Rlci5pbmRleF1bcGFyYW0ubmFtZV0gPSBwYXJhbS52YWx1ZSBcblxuICAgICAgICBcbiAgICAgICAgQHNldHVwQ29tbW9uRXZlbnRzKClcbiAgICAgICAgICAgIFxuICAgICAgICBmb3IgaSBpbiBbMC4uLlJlY29yZE1hbmFnZXIuY2hhcmFjdGVyc11cbiAgICAgICAgICAgIEBzZXR0aW5ncy52b2ljZXNQZXJDaGFyYWN0ZXJbaV0gPSAxMDBcbiAgICAgICAgICAgICBcbiAgICAgICAgQGNoYXB0ZXJzID0gRGF0YU1hbmFnZXIuZ2V0RG9jdW1lbnRzQnlUeXBlKFwidm4uY2hhcHRlclwiKVxuICAgICAgICBAY2hhcHRlcnMuc29ydCAoYSwgYikgLT5cbiAgICAgICAgICAgIGlmIGEuaXRlbXMub3JkZXIgPiBiLml0ZW1zLm9yZGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgIGVsc2UgaWYgYS5pdGVtcy5vcmRlciA8IGIuaXRlbXMub3JkZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICBcbiAgICAjIyMqXG4gICAgKiBTZXRzIHVwIGNvbW1vbiBldmVudHMuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cENvbW1vbkV2ZW50c1xuICAgICMjIyAgICAgICAgICAgIFxuICAgIHNldHVwQ29tbW9uRXZlbnRzOiAtPlxuICAgICAgICBmb3IgZXZlbnQgaW4gQGNvbW1vbkV2ZW50c1xuICAgICAgICAgICAgZXZlbnQ/LmRpc3Bvc2UoKVxuICAgICAgICBcbiAgICAgICAgQGNvbW1vbkV2ZW50cyA9IFtdICAgIFxuICAgICAgICBmb3IgZXZlbnQgaW4gUmVjb3JkTWFuYWdlci5jb21tb25FdmVudHNcbiAgICAgICAgICAgIGNvbnRpbnVlIGlmIG5vdCBldmVudFxuICAgICAgICAgICAgaWYgZXZlbnQuc3RhcnRDb25kaXRpb24gPT0gMSBhbmQgZXZlbnQuYXV0b1ByZWxvYWRcbiAgICAgICAgICAgICAgICBncy5SZXNvdXJjZUxvYWRlci5sb2FkRXZlbnRDb21tYW5kc0dyYXBoaWNzKGV2ZW50LmNvbW1hbmRzKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgb2JqZWN0ID0gbmV3IGdzLk9iamVjdF9Db21tb25FdmVudCgpXG4gICAgICAgICAgICBvYmplY3QucmVjb3JkID0gZXZlbnRcbiAgICAgICAgICAgIG9iamVjdC5yaWQgPSBldmVudC5pbmRleFxuICAgICAgICAgICAgQGNvbW1vbkV2ZW50c1tldmVudC5pbmRleF0gPSBvYmplY3RcbiAgICAgICAgICAgIEBjb21tb25FdmVudHMucHVzaChvYmplY3QpXG4gICAgXG4gICAgIyMjKlxuICAgICogU2V0cyB1cCBjdXJzb3IgZGVwZW5kaW5nIG9uIHN5c3RlbSBzZXR0aW5ncy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwQ3Vyc29yXG4gICAgIyMjXG4gICAgc2V0dXBDdXJzb3I6IC0+XG4gICAgICAgIGlmIFJlY29yZE1hbmFnZXIuc3lzdGVtLmN1cnNvcj8ubmFtZVxuICAgICAgICAgICAgYml0bWFwID0gUmVzb3VyY2VNYW5hZ2VyLmdldEJpdG1hcChcIkdyYXBoaWNzL1BpY3R1cmVzLyN7UmVjb3JkTWFuYWdlci5zeXN0ZW0uY3Vyc29yLm5hbWV9XCIpXG4gICAgICAgICAgICBHcmFwaGljcy5zZXRDdXJzb3JCaXRtYXAoYml0bWFwLCBSZWNvcmRNYW5hZ2VyLnN5c3RlbS5jdXJzb3IuaHgsIFJlY29yZE1hbmFnZXIuc3lzdGVtLmN1cnNvci5oeSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgR3JhcGhpY3Muc2V0Q3Vyc29yQml0bWFwKG51bGwpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIERpc3Bvc2VzIHRoZSBHYW1lTWFuYWdlci4gU2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgcXVpdCB0aGUgZ2FtZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICAjIyMgICAgICAgICAgICAgICBcbiAgICBkaXNwb3NlOiAtPlxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBRdWl0cyB0aGUgZ2FtZS4gVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtLiBTbyBmb3IgZXhhbXBsZSBvbiBtb2JpbGVcbiAgICAqIGRldmljZXMgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGV4aXRcbiAgICAjIyMgICBcbiAgICBleGl0OiAtPiBBcHBsaWNhdGlvbi5leGl0KClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBSZXNldHMgdGhlIEdhbWVNYW5hZ2VyIGJ5IGRpc3Bvc2luZyBhbmQgcmUtaW5pdGlhbGl6aW5nIGl0LlxuICAgICpcbiAgICAqIEBtZXRob2QgcmVzZXRcbiAgICAjIyMgICAgICAgICAgXG4gICAgcmVzZXQ6IC0+XG4gICAgICAgIEBpbml0aWFsaXplZCA9IG5vXG4gICAgICAgIEBpbnRlcnByZXRlciA9IG51bGxcbiAgICAgICAgQGRpc3Bvc2UoKVxuICAgICAgICBAaW5pdGlhbGl6ZSgpXG4gICAgIFxuICAgICMjIypcbiAgICAqIFN0YXJ0cyBhIG5ldyBnYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgbmV3R2FtZVxuICAgICMjIyAgICAgIFxuICAgIG5ld0dhbWU6IC0+XG4gICAgICAgIEBtZXNzYWdlcyA9IFtdXG4gICAgICAgIEB2YXJpYWJsZVN0b3JlLmNsZWFyQWxsR2xvYmFsVmFyaWFibGVzKClcbiAgICAgICAgQHZhcmlhYmxlU3RvcmUuY2xlYXJBbGxMb2NhbFZhcmlhYmxlcygpXG4gICAgICAgIEB0ZW1wU2V0dGluZ3Muc2tpcCA9IG5vXG4gICAgICAgIEB0ZW1wRmllbGRzLmNsZWFyKClcbiAgICAgICAgQHRlbXBGaWVsZHMuaW5HYW1lID0geWVzXG4gICAgICAgIEBzZXR1cENvbW1vbkV2ZW50cygpXG4gICAgICAgIEB0ZW1wU2V0dGluZ3MubWVudUFjY2VzcyA9IHllc1xuICAgICAgICBAdGVtcFNldHRpbmdzLnNhdmVNZW51QWNjZXNzID0geWVzXG4gICAgICAgIEB0ZW1wU2V0dGluZ3MubG9hZE1lbnVBY2Nlc3MgPSB5ZXNcbiAgICAgICAgQHRlbXBTZXR0aW5ncy5iYWNrbG9nQWNjZXNzID0geWVzXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogRXhpc3RzIHRoZSBnYW1lIGFuZCByZXNldHMgdGhlIEdhbWVNYW5hZ2VyIHdoaWNoIGlzIGltcG9ydGFudCBiZWZvcmUgZ29pbmcgYmFjayB0b1xuICAgICogdGhlIG1haW4gbWVudSBvciB0aXRsZSBzY3JlZW4uXG4gICAgKlxuICAgICogQG1ldGhvZCBleGl0R2FtZVxuICAgICMjIyAgICBcbiAgICBleGl0R2FtZTogLT5cbiAgICAgICAgQHRlbXBGaWVsZHMuaW5HYW1lID0gbm8gICAgIFxuICAgICAgICBAdGVtcEZpZWxkcy5pc0V4aXRpbmdHYW1lID0geWVzXG4gICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgR2FtZU1hbmFnZXIuIFNob3VsZCBiZSBjYWxsZWQgb25jZSBwZXIgZnJhbWUuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyMgICAgIFxuICAgIHVwZGF0ZTogLT5cbiAgICBcbiAgICAjIyMqXG4gICAgKiBDcmVhdGVzIHRoZSBpbmRleCBvZiBhbGwgc2F2ZS1nYW1lcy4gU2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBzYXZlIGdhbWVcbiAgICAqIGlzIGNyZWF0ZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCBjcmVhdGVTYXZlR2FtZUluZGV4XG4gICAgKiBAcHJvdGVjdGVkXG4gICAgIyMjIFxuICAgIGNyZWF0ZVNhdmVHYW1lSW5kZXg6IC0+XG4gICAgICAgIEBzYXZlR2FtZVNsb3RzID0gW11cbiAgICAgICAgZm9yIGkgaW4gWzAuLi5Ac2F2ZVNsb3RDb3VudF1cbiAgICAgICAgICAgIGlmIEdhbWVTdG9yYWdlLmV4aXN0cyhcIlNhdmVHYW1lXyN7aX1fSGVhZGVyXCIpXG4gICAgICAgICAgICAgICAgaGVhZGVyID0gR2FtZVN0b3JhZ2UuZ2V0T2JqZWN0KFwiU2F2ZUdhbWVfI3tpfV9IZWFkZXJcIilcbiAgICAgICAgICAgICAgICBjaGFwdGVyID0gRGF0YU1hbmFnZXIuZ2V0RG9jdW1lbnQoaGVhZGVyLmNoYXB0ZXJVaWQpXG4gICAgICAgICAgICAgICAgc2NlbmUgPSBEYXRhTWFuYWdlci5nZXREb2N1bWVudFN1bW1hcnkoaGVhZGVyLnNjZW5lVWlkKVxuICAgICAgICAgICAgICAgIGltYWdlID0gaGVhZGVyLmltYWdlXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaGVhZGVyID0gbnVsbFxuICAgICAgICAgICAgICAgIGNoYXBlciA9IG51bGxcbiAgICAgICAgICAgICAgICBzY2VuZSA9IG51bGxcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIGNoYXB0ZXI/IGFuZCBzY2VuZT8gYW5kICFAaW5MaXZlUHJldmlld1xuICAgICAgICAgICAgICAgIEBzYXZlR2FtZVNsb3RzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBkYXRlOiBoZWFkZXIuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhcHRlcjogY2hhcHRlci5pdGVtcy5uYW1lIHx8IFwiREVMRVRFRFwiXG4gICAgICAgICAgICAgICAgICAgIHNjZW5lOiBzY2VuZS5pdGVtcy5uYW1lIHx8IFwiREVMRVRFRFwiLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogaW1hZ2UgI2NoYXB0ZXIuaXRlbXMuY29tbWFuZHNbMF0ucGFyYW1zLnNhdmVHYW1lR3JhcGhpYz8ubmFtZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgQHNhdmVHYW1lU2xvdHMucHVzaCh7IFwiZGF0ZVwiOiBcIlwiLCBcImNoYXB0ZXJcIjogXCJcIiwgXCJzY2VuZVwiOiBcIlwiLCBcImltYWdlXCI6IG51bGwgfSlcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAc2F2ZUdhbWVTbG90c1xuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBSZXNldHMgdGhlIGdhbWUncyBzZXR0aW5ncyB0byBpdHMgZGVmYXVsdCB2YWx1ZXMuXG4gICAgKlxuICAgICogQG1ldGhvZCByZXNldFNldHRpbmdzXG4gICAgIyMjICAgICAgICAgICAgXG4gICAgcmVzZXRTZXR0aW5nczogLT5cbiAgICAgICAgQHNldHRpbmdzID0geyB2ZXJzaW9uOiAzNDIsIHJlbmRlcmVyOiAwLCBmaWx0ZXI6IDEsIGNvbmZpcm1hdGlvbjogeWVzLCBhZGp1c3RBc3BlY3RSYXRpbzogbm8sIGFsbG93U2tpcDogeWVzLCBhbGxvd1NraXBVbnJlYWRNZXNzYWdlczogeWVzLCAgYWxsb3dWaWRlb1NraXA6IHllcywgc2tpcFZvaWNlT25BY3Rpb246IHllcywgYWxsb3dDaG9pY2VTa2lwOiBubywgdm9pY2VzQnlDaGFyYWN0ZXI6IFtdLCB0aW1lTWVzc2FnZVRvVm9pY2U6IHRydWUsICBcImF1dG9NZXNzYWdlXCI6IHsgZW5hYmxlZDogZmFsc2UsIHRpbWU6IDAsIHdhaXRGb3JWb2ljZTogeWVzLCBzdG9wT25BY3Rpb246IG5vIH0sICBcInZvaWNlRW5hYmxlZFwiOiB0cnVlLCBcImJnbUVuYWJsZWRcIjogdHJ1ZSwgXCJzb3VuZEVuYWJsZWRcIjogdHJ1ZSwgXCJ2b2ljZVZvbHVtZVwiOiAxMDAsIFwiYmdtVm9sdW1lXCI6IDEwMCwgXCJzZVZvbHVtZVwiOiAxMDAsIFwibWVzc2FnZVNwZWVkXCI6IDQsIFwiZnVsbFNjcmVlblwiOiBubywgXCJhc3BlY3RSYXRpb1wiOiAwIH1cbiAgICAgICAgQHNhdmVHYW1lU2xvdHMgPSBbXVxuICAgICAgICBmb3IgaSBpbiBbMC4uLkBzYXZlU2xvdENvdW50XVxuICAgICAgICAgICAgR2FtZVN0b3JhZ2UucmVtb3ZlKFwiU2F2ZUdhbWVfI3tpfV9IZWFkZXJcIilcbiAgICAgICAgICAgIEdhbWVTdG9yYWdlLnJlbW92ZShcIlNhdmVHYW1lXyN7aX1cIilcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQHNhdmVHYW1lU2xvdHMucHVzaCh7IFwiZGF0ZVwiOiBcIlwiLCBcImNoYXB0ZXJcIjogXCJcIiwgXCJzY2VuZVwiOiBcIlwiLCBcInRodW1iXCI6IFwiXCIgfSlcbiAgICAgICBcbiAgICAgICAgR2FtZVN0b3JhZ2Uuc2V0T2JqZWN0KFwic2V0dGluZ3NcIiwgQHNldHRpbmdzKVxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNhdmVzIGN1cnJlbnQgZ2FtZSBzZXR0aW5ncy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNhdmVTZXR0aW5nc1xuICAgICMjIyAgICAgXG4gICAgc2F2ZVNldHRpbmdzOiAtPlxuICAgICAgICBHYW1lU3RvcmFnZS5zZXRPYmplY3QoXCJzZXR0aW5nc1wiLCBAc2V0dGluZ3MpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNhdmVzIGN1cnJlbnQgZ2xvYmFsIGRhdGEuXG4gICAgKlxuICAgICogQG1ldGhvZCBzYXZlR2xvYmFsRGF0YVxuICAgICMjIyAgXG4gICAgc2F2ZUdsb2JhbERhdGE6IC0+XG4gICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnROdW1iZXJzID0gQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudE51bWJlcnNCeURvbWFpblxuICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50TGlzdHMgPSBAdmFyaWFibGVTdG9yZS5wZXJzaXN0ZW50TGlzdHNCeURvbWFpblxuICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50Qm9vbGVhbnMgPSBAdmFyaWFibGVTdG9yZS5wZXJzaXN0ZW50Qm9vbGVhbnNCeURvbWFpblxuICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50U3RyaW5ncyA9IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRTdHJpbmdzQnlEb21haW5cbiAgICAgICAgR2FtZVN0b3JhZ2Uuc2V0T2JqZWN0KFwiZ2xvYmFsRGF0YVwiLCBAZ2xvYmFsRGF0YSlcbiAgICAgXG4gICAgIyMjKlxuICAgICogUmVzZXRzIGN1cnJlbnQgZ2xvYmFsIGRhdGEuIEFsbCBzdG9yZWQgZGF0YSBhYm91dCByZWFkIG1lc3NhZ2VzLCBwZXJzaXN0ZW50IHZhcmlhYmxlcyBhbmRcbiAgICAqIENHIGdhbGxlcnkgd2lsbCBiZSBkZWxldGVkLlxuICAgICpcbiAgICAqIEBtZXRob2QgcmVzZXRHbG9iYWxEYXRhXG4gICAgIyMjICAgICBcbiAgICByZXNldEdsb2JhbERhdGE6IC0+XG4gICAgICAgIHZlcnNpb24gPSBAZ2xvYmFsRGF0YT8udmVyc2lvblxuICAgICAgICBkYXRhID0gQGdsb2JhbERhdGFcbiAgICAgICAgXG4gICAgICAgIEBnbG9iYWxEYXRhID0geyBcbiAgICAgICAgICAgIG1lc3NhZ2VzOiB7fSwgY2dHYWxsZXJ5OiB7fSwgdmVyc2lvbjogMzQyLCBcbiAgICAgICAgICAgIHBlcnNpc3RlbnROdW1iZXJzOiB7IFwiMFwiOiBbXSwgXCJjb20uZGVnaWNhLnZubS5kZWZhdWx0XCI6IFtdIH0sIFxuICAgICAgICAgICAgcGVyc2lzdGVudFN0cmluZ3M6IHsgXCIwXCI6IFtdLCBcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIjogW10gfSwgXG4gICAgICAgICAgICBwZXJzaXN0ZW50Qm9vbGVhbnM6IHsgXCIwXCI6IFtdLCBcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIjogW10gfSwgXG4gICAgICAgICAgICBwZXJzaXN0ZW50TGlzdHM6IHsgXCIwXCI6IFtdLCBcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIjogW10gfSBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZm9yIGNnLCBpIGluIFJlY29yZE1hbmFnZXIuY2dHYWxsZXJ5QXJyYXlcbiAgICAgICAgICAgIGlmIGNnP1xuICAgICAgICAgICAgICAgIEBnbG9iYWxEYXRhLmNnR2FsbGVyeVtjZy5pbmRleF0gPSB7IHVubG9ja2VkOiBubyB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIEdhbWVTdG9yYWdlLnNldE9iamVjdChcImdsb2JhbERhdGFcIiwgQGdsb2JhbERhdGEpIFxuICAgIFxuICAgICAgICBAbWlncmF0ZUdsb2JhbERhdGEoZGF0YSwgdmVyc2lvbisxLCBAZ2xvYmFsRGF0YS52ZXJzaW9uKVxuICAgIFxuICAgIG1pZ3JhdGVHbG9iYWxEYXRhOiAoZGF0YSwgZnJvbSwgdG8pIC0+XG4gICAgICAgIGZvciBpIGluIFtmcm9tLi50b11cbiAgICAgICAgICAgIGlmIHRoaXNbXCJtaWdyYXRlR2xvYmFsRGF0YSN7aX1cIl0/XG4gICAgICAgICAgICAgICAgdGhpc1tcIm1pZ3JhdGVHbG9iYWxEYXRhI3tpfVwiXShkYXRhKVxuICAgICAgICAgICAgICAgIFxuICAgIG1pZ3JhdGVHbG9iYWxEYXRhMzQyOiAoZGF0YSkgLT4gXG4gICAgICAgIGlmIGRhdGE/XG4gICAgICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50TnVtYmVyc1swXSA9IGRhdGEucGVyc2lzdGVudE51bWJlcnNbMF0gfHwgW11cbiAgICAgICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRTdHJpbmdzWzBdID0gZGF0YS5wZXJzaXN0ZW50U3RyaW5nc1swXSB8fCBbXVxuICAgICAgICAgICAgQGdsb2JhbERhdGEucGVyc2lzdGVudEJvb2xlYW5zWzBdID0gZGF0YS5wZXJzaXN0ZW50Qm9vbGVhbnNbMF0gfHwgW11cbiAgICAgICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRMaXN0c1swXSA9IGRhdGEucGVyc2lzdGVudExpc3RzWzBdIHx8IFtdXG4gICAgICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50TnVtYmVyc1tcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIl0gPSBkYXRhLnBlcnNpc3RlbnROdW1iZXJzWzBdIHx8IFtdXG4gICAgICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50U3RyaW5nc1tcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIl0gPSBkYXRhLnBlcnNpc3RlbnRTdHJpbmdzWzBdIHx8IFtdXG4gICAgICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50Qm9vbGVhbnNbXCJjb20uZGVnaWNhLnZubS5kZWZhdWx0XCJdID0gZGF0YS5wZXJzaXN0ZW50Qm9vbGVhbnNbMF0gfHwgW11cbiAgICAgICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRMaXN0c1tcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIl0gPSBkYXRhLnBlcnNpc3RlbnRMaXN0c1swXSB8fCBbXVxuICAgICBcbiAgICByZWFkU2F2ZUdhbWU6IChzYXZlR2FtZSkgLT5cbiAgICB3cml0ZVNhdmVHYW1lOiAoc2F2ZUdhbWUpIC0+XG4gICAgICAgIFxuICAgIHByZXBhcmVTYXZlR2FtZTogKHNuYXBzaG90KSAtPlxuICAgICAgICBpZiBzbmFwc2hvdFxuICAgICAgICAgICAgc25hcHNob3QgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0Q3VzdG9tQml0bWFwKFwiJHNuYXBzaG90XCIpXG4gICAgICAgICAgICBzbmFwc2hvdD8uZGlzcG9zZSgpXG4gICAgICAgICAgICBSZXNvdXJjZU1hbmFnZXIuc2V0Q3VzdG9tQml0bWFwKFwiJHNuYXBzaG90XCIsIEdyYXBoaWNzLnNuYXBzaG90KCkpXG4gICAgICAgIFxuICAgICAgICBjb250ZXh0ID0gbmV3IGdzLk9iamVjdENvZGVjQ29udGV4dCgpXG4gICAgICAgIGNvbnRleHQuZGVjb2RlZE9iamVjdFN0b3JlLnB1c2goR3JhcGhpY3Mudmlld3BvcnQpXG4gICAgICAgIGNvbnRleHQuZGVjb2RlZE9iamVjdFN0b3JlLnB1c2goQHNjZW5lKVxuICAgICAgICBjb250ZXh0LmRlY29kZWRPYmplY3RTdG9yZS5wdXNoKEBzY2VuZS5iZWhhdmlvcilcbiAgXG4gICAgICAgIG1lc3NhZ2VCb3hJZHMgPSBbXCJtZXNzYWdlQm94XCIsIFwibnZsTWVzc2FnZUJveFwiLCBcIm1lc3NhZ2VNZW51XCJdO1xuICAgICAgICBtZXNzYWdlSWRzID0gW1wiZ2FtZU1lc3NhZ2VfbWVzc2FnZVwiLCBcIm52bEdhbWVNZXNzYWdlX21lc3NhZ2VcIl07XG4gICAgICAgIG1lc3NhZ2VCb3hlcyA9IG1lc3NhZ2VCb3hJZHMuc2VsZWN0IChpZCkgPT4gQHNjZW5lLmJlaGF2aW9yLm9iamVjdE1hbmFnZXIub2JqZWN0QnlJZChpZClcbiAgICAgICAgbWVzc2FnZXMgPSBtZXNzYWdlSWRzLnNlbGVjdCAoaWQpID0+IEBzY2VuZS5iZWhhdmlvci5vYmplY3RNYW5hZ2VyLm9iamVjdEJ5SWQoaWQpXG4gICAgICAgIFxuICAgICAgICBzY2VuZURhdGEgPSB7fVxuICAgICAgICBzYXZlR2FtZSA9IHt9XG4gICAgICAgIHNhdmVHYW1lLmVuY29kZWRPYmplY3RTdG9yZSA9IG51bGxcbiAgICAgICAgc2F2ZUdhbWUuc2NlbmVVaWQgPSBAc2NlbmUuc2NlbmVEb2N1bWVudC51aWRcbiAgICAgICAgc2F2ZUdhbWUuZGF0YSA9IHtcbiAgICAgICAgICAgIHJlc291cmNlQ29udGV4dDogQHNjZW5lLmJlaGF2aW9yLnJlc291cmNlQ29udGV4dC50b0RhdGFCdW5kbGUoKSxcbiAgICAgICAgICAgIGN1cnJlbnRDaGFyYWN0ZXI6IEBzY2VuZS5jdXJyZW50Q2hhcmFjdGVyLFxuICAgICAgICAgICAgY2hhcmFjdGVyUGFyYW1zOiBAY2hhcmFjdGVyUGFyYW1zLFxuICAgICAgICAgICAgZnJhbWVDb3VudDogR3JhcGhpY3MuZnJhbWVDb3VudCxcbiAgICAgICAgICAgIHRlbXBGaWVsZHM6IEB0ZW1wRmllbGRzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IEBzY2VuZS52aWV3cG9ydCxcbiAgICAgICAgICAgIGNoYXJhY3RlcnM6IEBzY2VuZS5jaGFyYWN0ZXJzLFxuICAgICAgICAgICAgY2hhcmFjdGVyTmFtZXM6IFJlY29yZE1hbmFnZXIuY2hhcmFjdGVyc0FycmF5LnNlbGVjdCgoYykgLT4geyBuYW1lOiBjLm5hbWUsIGluZGV4OiBjLmluZGV4IH0pLFxuICAgICAgICAgICAgYmFja2dyb3VuZHM6IEBzY2VuZS5iYWNrZ3JvdW5kcyxcbiAgICAgICAgICAgIHBpY3R1cmVzOiBAc2NlbmUucGljdHVyZUNvbnRhaW5lci5zdWJPYmplY3RzQnlEb21haW4sXG4gICAgICAgICAgICB0ZXh0czogQHNjZW5lLnRleHRDb250YWluZXIuc3ViT2JqZWN0c0J5RG9tYWluLFxuICAgICAgICAgICAgdmlkZW9zOiBAc2NlbmUudmlkZW9Db250YWluZXIuc3ViT2JqZWN0c0J5RG9tYWluLFxuICAgICAgICAgICAgdmlld3BvcnRzOiBAc2NlbmUudmlld3BvcnRDb250YWluZXIuc3ViT2JqZWN0cyxcbiAgICAgICAgICAgIGNvbW1vbkV2ZW50czogQHNjZW5lLmNvbW1vbkV2ZW50Q29udGFpbmVyLnN1Yk9iamVjdHMsXG4gICAgICAgICAgICBob3RzcG90czogQHNjZW5lLmhvdHNwb3RDb250YWluZXIuc3ViT2JqZWN0c0J5RG9tYWluLFxuICAgICAgICAgICAgaW50ZXJwcmV0ZXI6IEBzY2VuZS5pbnRlcnByZXRlcixcbiAgICAgICAgICAgIGNob2ljZXM6IEBzY2VuZS5jaG9pY2VzLFxuICAgICAgICAgICAgbWVzc2FnZUJveGVzOiBtZXNzYWdlQm94ZXMuc2VsZWN0KChtYiwgaSkgPT4geyB2aXNpYmxlOiBtYi52aXNpYmxlLCBpZDogbWIuaWQsIG1lc3NhZ2U6IG1lc3NhZ2VzW2ldIH0pLFxuICAgICAgICAgICAgYmFja2xvZzogQGJhY2tsb2csXG4gICAgICAgICAgICB2YXJpYWJsZVN0b3JlOiBAdmFyaWFibGVTdG9yZSxcbiAgICAgICAgICAgIGRlZmF1bHRzOiBAZGVmYXVsdHMsXG4gICAgICAgICAgICB0cmFuc2l0aW9uRGF0YTogU2NlbmVNYW5hZ2VyLnRyYW5zaXRpb25EYXRhLFxuICAgICAgICAgICAgYXVkaW86IHsgYXVkaW9CdWZmZXJzOiBBdWRpb01hbmFnZXIuYXVkaW9CdWZmZXJzLCBhdWRpb0J1ZmZlcnNCeUxheWVyOiBBdWRpb01hbmFnZXIuYXVkaW9CdWZmZXJzQnlMYXllciwgYXVkaW9MYXllcnM6IEF1ZGlvTWFuYWdlci5hdWRpb0xheWVycywgc291bmRSZWZlcmVuY2VzOiBBdWRpb01hbmFnZXIuc291bmRSZWZlcmVuY2VzIH0sXG4gICAgICAgICAgICBtZXNzYWdlQXJlYXM6IEBzY2VuZS5tZXNzYWdlQXJlYUNvbnRhaW5lci5zdWJPYmplY3RzQnlEb21haW5cbiAgICAgICAgICAjICBtZXNzYWdlQXJlYXM6IEBzY2VuZS5tZXNzYWdlQXJlYXMuc2VsZWN0IChmKSAtPlxuICAgICAgICAgICMgICAgICBpZiBmIFxuICAgICAgICAgICMgICAgICAgICAgeyBcbiAgICAgICAgICAjICAgICAgICAgICAgICBtZXNzYWdlOiBmLm1lc3NhZ2UsIFxuICAgICAgICAgICMgICAgICAgICAgICAgIGxheW91dDogeyBkc3RSZWN0OiBncy5SZWN0LmZyb21PYmplY3QoZi5sYXlvdXQuZHN0UmVjdCkgfSBcbiAgICAgICAgICAjICAgICAgICAgIH0gXG4gICAgICAgICAgIyAgICAgIGVsc2UgXG4gICAgICAgICAgIyAgICAgICAgICBudWxsXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICNzcyA9IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKVxuICAgICAgICBzYXZlR2FtZS5kYXRhID0gZ3MuT2JqZWN0Q29kZWMuZW5jb2RlKHNhdmVHYW1lLmRhdGEsIGNvbnRleHQpXG4gICAgICAgICNjb25zb2xlLmxvZyh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgLSBzcylcbiAgICAgICAgc2F2ZUdhbWUuZW5jb2RlZE9iamVjdFN0b3JlID0gY29udGV4dC5lbmNvZGVkT2JqZWN0U3RvcmVcblxuICAgICAgICBAc2F2ZUdhbWUgPSBzYXZlR2FtZVxuICAgICAgXG4gICAgY3JlYXRlU2F2ZUdhbWVTbG90OiAoaGVhZGVyKSAtPlxuICAgICAgICBzbG90ID0ge1xuICAgICAgICAgICAgXCJkYXRlXCI6IG5ldyBEYXRlKCkudG9EYXRlU3RyaW5nKCksXG4gICAgICAgICAgICBcImNoYXB0ZXJcIjogQHNjZW5lLmNoYXB0ZXIuaXRlbXMubmFtZSxcbiAgICAgICAgICAgIFwic2NlbmVcIjogQHNjZW5lLnNjZW5lRG9jdW1lbnQuaXRlbXMubmFtZSxcbiAgICAgICAgICAgIFwiaW1hZ2VcIjogaGVhZGVyLmltYWdlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzbG90O1xuICAgICAgICBcbiAgICBjcmVhdGVTYXZlR2FtZUhlYWRlcjogKHRodW1iV2lkdGgsIHRodW1iSGVpZ2h0KSAtPlxuICAgICAgICB0aHVtYkltYWdlID0gQGNyZWF0ZVNhdmVHYW1lVGh1bWJJbWFnZSh0aHVtYldpZHRoLCB0aHVtYkhlaWdodClcbiAgICAgICAgXG4gICAgICAgIGhlYWRlciA9IHtcbiAgICAgICAgICAgIFwiZGF0ZVwiOiBuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpLFxuICAgICAgICAgICAgXCJjaGFwdGVyVWlkXCI6IEBzY2VuZS5jaGFwdGVyLnVpZCxcbiAgICAgICAgICAgIFwic2NlbmVVaWRcIjogQHNjZW5lLnNjZW5lRG9jdW1lbnQudWlkLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB0aHVtYkltYWdlPy5pbWFnZS50b0RhdGFVUkwoKSBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGh1bWJJbWFnZT8uZGlzcG9zZSgpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gaGVhZGVyXG4gICAgICAgIFxuICAgIGNyZWF0ZVNhdmVHYW1lVGh1bWJJbWFnZTogKHdpZHRoLCBoZWlnaHQpIC0+XG4gICAgICAgIHNuYXBzaG90ID0gUmVzb3VyY2VNYW5hZ2VyLmdldEJpdG1hcChcIiRzbmFwc2hvdFwiKVxuICAgICAgICB0aHVtYkltYWdlID0gbnVsbFxuICAgICAgICBcbiAgICAgICAgaWYgc25hcHNob3QgYW5kIHNuYXBzaG90LmxvYWRlZFxuICAgICAgICAgICAgaWYgd2lkdGggYW5kIGhlaWdodFxuICAgICAgICAgICAgICAgIHRodW1iSW1hZ2UgPSBuZXcgQml0bWFwKHdpZHRoLCBoZWlnaHQpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGh1bWJJbWFnZSA9IG5ldyBCaXRtYXAoR3JhcGhpY3Mud2lkdGggLyA4LCBHcmFwaGljcy5oZWlnaHQgLyA4KVxuICAgICAgICAgICAgdGh1bWJJbWFnZS5zdHJldGNoQmx0KG5ldyBSZWN0KDAsIDAsIHRodW1iSW1hZ2Uud2lkdGgsIHRodW1iSW1hZ2UuaGVpZ2h0KSwgc25hcHNob3QsIG5ldyBSZWN0KDAsIDAsIHNuYXBzaG90LndpZHRoLCBzbmFwc2hvdC5oZWlnaHQpKVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiB0aHVtYkltYWdlXG4gICAgICBcbiAgICBzdG9yZVNhdmVHYW1lOiAobmFtZSwgc2F2ZUdhbWUsIGhlYWRlcikgLT5cbiAgICAgICAgaWYgaGVhZGVyXG4gICAgICAgICAgICBHYW1lU3RvcmFnZS5zZXREYXRhKFwiI3tuYW1lfV9IZWFkZXJcIiwgSlNPTi5zdHJpbmdpZnkoaGVhZGVyKSlcbiAgICAgICAgICAgIFxuICAgICAgICBHYW1lU3RvcmFnZS5zZXREYXRhKG5hbWUsIEpTT04uc3RyaW5naWZ5KHNhdmVHYW1lKSlcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgZ2FtZSBhdCB0aGUgc3BlY2lmaWVkIHNsb3QuXG4gICAgKlxuICAgICogQG1ldGhvZCBzYXZlXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc2xvdCAtIFRoZSBzbG90IHdoZXJlIHRoZSBnYW1lIHNob3VsZCBiZSBzYXZlZCBhdC5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aHVtYldpZHRoIC0gVGhlIHdpZHRoIGZvciB0aGUgc25hcHNob3QtdGh1bWIuIFlvdSBjYW4gc3BlY2lmeSA8Yj5udWxsPC9iPiBvciAwIHRvIHVzZSBhbiBhdXRvIGNhbGN1bGF0ZWQgd2lkdGguXG4gICAgKiBAcGFyYW0ge251bWJlcn0gdGh1bWJIZWlnaHQgLSBUaGUgaGVpZ2h0IGZvciB0aGUgc25hcHNob3QtdGh1bWIuIFlvdSBjYW4gc3BlY2lmeSA8Yj5udWxsPC9iPiBvciAwIHRvIHVzZSBhbiBhdXRvIGNhbGN1bGF0ZWQgaGVpZ2h0LlxuICAgICMjIyAgICAgXG4gICAgc2F2ZTogKHNsb3QsIHRodW1iV2lkdGgsIHRodW1iSGVpZ2h0KSAtPlxuICAgICAgICBpZiBAc2F2ZUdhbWVcbiAgICAgICAgICAgIGhlYWRlciA9IEBjcmVhdGVTYXZlR2FtZUhlYWRlcih0aHVtYldpZHRoLCB0aHVtYkhlaWdodClcbiAgICAgICAgICAgIEBzYXZlR2FtZVNsb3RzW3Nsb3RdID0gQGNyZWF0ZVNhdmVHYW1lU2xvdChoZWFkZXIpXG4gICAgICAgICAgICBAc3RvcmVTYXZlR2FtZShcIlNhdmVHYW1lXyN7c2xvdH1cIiwgQHNhdmVHYW1lLCBoZWFkZXIpXG4gICAgICAgICAgICBAc2NlbmVEYXRhID0ge31cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIEBzYXZlR2FtZVxuICAgIFxuICAgIHJlc3RvcmU6IChzYXZlR2FtZSkgLT5cbiAgICAgICAgQGJhY2tsb2cgPSBzYXZlR2FtZS5kYXRhLmJhY2tsb2dcbiAgICAgICAgQGRlZmF1bHRzID0gc2F2ZUdhbWUuZGF0YS5kZWZhdWx0c1xuICAgICAgICBAdmFyaWFibGVTdG9yZSA9IHNhdmVHYW1lLmRhdGEudmFyaWFibGVTdG9yZVxuICAgICAgICBAc2NlbmVEYXRhID0gc2F2ZUdhbWUuZGF0YVxuICAgICAgICBAc2F2ZUdhbWUgPSBudWxsXG4gICAgICAgIEBsb2FkZWRTYXZlR2FtZSA9IG51bGxcbiAgICAgICAgQHRlbXBGaWVsZHMgPSBzYXZlR2FtZS5kYXRhLnRlbXBGaWVsZHNcbiAgICAgICAgQGNoYXJhY3RlclBhcmFtcyA9IHNhdmVHYW1lLmRhdGEuY2hhcmFjdGVyUGFyYW1zXG4gICAgICAgIHdpbmRvdy4kdGVtcEZpZWxkcyA9IEB0ZW1wRmllbGRzXG4gICAgICAgIHdpbmRvdy4kZGF0YUZpZWxkcy5iYWNrbG9nID0gQGJhY2tsb2dcbiAgICAgICAgICAgIFxuICAgIFxuICAgIHByZXBhcmVMb2FkR2FtZTogLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLnN0b3BBbGxNdXNpYygzMClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogTG9hZHMgdGhlIGdhbWUgZnJvbSB0aGUgc3BlY2lmaWVkIHNhdmUgZ2FtZSBzbG90LiBUaGlzIG1ldGhvZCB0cmlnZ2Vyc1xuICAgICogYSBhdXRvbWF0aWMgc2NlbmUgY2hhbmdlLlxuICAgICpcbiAgICAqIEBtZXRob2QgbG9hZFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNsb3QgLSBUaGUgc2xvdCB3aGVyZSB0aGUgZ2FtZSBzaG91bGQgYmUgbG9hZGVkIGZyb20uXG4gICAgIyMjICAgICAgICBcbiAgICBsb2FkOiAoc2xvdCkgLT5cbiAgICAgICAgcmV0dXJuIGlmICFAc2F2ZUdhbWVTbG90c1tzbG90XSBvciBAc2F2ZUdhbWVTbG90c1tzbG90XS5kYXRlLnRyaW0oKS5sZW5ndGggPT0gMFxuICAgICAgICBcbiAgICAgICAgQHByZXBhcmVMb2FkR2FtZSgpXG4gICAgICAgIEBsb2FkZWRTYXZlR2FtZSA9IEBsb2FkU2F2ZUdhbWUoXCJTYXZlR2FtZV8je3Nsb3R9XCIpXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgU2NlbmVNYW5hZ2VyLnN3aXRjaFRvKG5ldyB2bi5PYmplY3RfU2NlbmUoKSlcbiAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgXG4gICAgICAgIFxuICAgIGxvYWRTYXZlR2FtZTogKG5hbWUpIC0+IEpTT04ucGFyc2UoR2FtZVN0b3JhZ2UuZ2V0RGF0YShuYW1lKSlcbiAgICAgICAgXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEdldHMgdGhlIHNhdmUgZ2FtZSBkYXRhIGZvciBhIHNwZWNpZmllZCBzbG90LlxuICAgICpcbiAgICAqIEBtZXRob2QgZ2V0U2F2ZUdhbWVcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBzbG90IC0gVGhlIHNsb3QgdG8gZ2V0IHRoZSBzYXZlIGRhdGEgZnJvbS5cbiAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIHNhdmUgZ2FtZSBkYXRhLlxuICAgICMjIyAgICAgICAgXG4gICAgZ2V0U2F2ZUdhbWU6IChzbG90KSAtPiBKU09OLnBhcnNlKEdhbWVTdG9yYWdlLmdldERhdGEoXCJTYXZlR2FtZV8je3Nsb3R9XCIpKVxuICAgIFxud2luZG93LkdhbWVNYW5hZ2VyID0gbmV3IEdhbWVNYW5hZ2VyKClcbmdzLkdhbWVNYW5hZ2VyID0gd2luZG93LkdhbWVNYW5hZ2VyIl19\n//# sourceURL=GameManager_27.js",
11 11 "parentId": "C0268943K60B3A42B7SA6F1EDDCF2F642FD7"
12 12 },
13 13 "summary": [