Projekt for SPIE - Avatar for safety briefing / managment event
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

867 lines
24 KiB

{
"Categories": [
"SPIE Management Board",
"Project Setup",
"Debug",
"Volume",
"Engine Settings",
"Avatar Core",
"STT Settings",
"AI Settings",
"TTS Settings"
],
"Variables": [
{
"InitialMode":
{
"type": "integer",
"default": 0,
"tooltip": "Which mode to load at startup",
"category": "SPIE Management Board"
}
},
{
"Day1_A_Texts":
{
"type": "array",
"default": [
{
"BeginDelay": 0,
"Text": "",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Hallo liebe Kolleginnen und Kollegen, Ich freue mich, dass ich heute für Euch das Safety Briefing durchführen darf!Der Campus verfügt über eine Brandmeldeanlage, die im Brandfall automatisch die Feuerwehr informiert. Heute und morgen ist auf dem EUREF-Campus keine Übung geplant. Sollte der Alarm losgehen, verlasst also bitte umgehend das Gebäude. Aktuell sind wir hier in der Kuppel. Die Kuppel verlasst Ihr über einen der drei Notausgänge. Die Ein- und Ausgänge der Kuppel sind gleichzeitig auch die Notausgänge. Sobald Ihr die Kuppel verlassen habt, seid Ihr im öffentlichen Bereich des Campus. Dort sind mehrere Fluchtwege ausgeschildert. Nutzt bitte den, der für Euch am nächsten liegt. Natürlich nur, wenn er frei und sicher ist. Wenn Ihr den Campus über den Haupteingang verlasst, nutzt nicht die Drehtür. Diese kann blockieren und ist dafür nicht geeignet. Verlasst das Gebäude durch die Fluchttüren direkt neben der Drehtür.Solltet ihr die anderen Notausgänge wählen, geht bitte um das Gebäude gegen den Uhrzeigersinn herum. Ihr sammelt Euch dann alle auf dem Parkplatz gegenüber dem EUREF-Campus. Dafür überquert ihr die Straße. Achtet dabei bitte auf den Straßenverkehr! Auf dem Sammelplatz wird dann sichergestellt, ob ihr alle vollzählig seid.Nun eine Frage an Euch: Wer von Euch ist Ersthelferin oder Ersthelfer? Steht bitte auf, damit Euch alle sehen können. ",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Und an alle, die jetzt sitzengeblieben sind: Merkt Euch die Kolleginnen und Kollegen, und wendet Euch an sie, damit Ihr im Notfall Hilfe erhaltet. Erste-Hilfe-Material und ein Defibrillator sind aus Eurer Sicht rechts von der Bühne in einem schwarzen Flight Case untergebracht. Dort findet Ihr auch einen Feuerlöscher. Weitere Feuerlöscher sind in der Kuppel und im Umfeld verteilt und gut gekennzeichnet.Und nun wünsche ich Euch eine sichere und gute Management Conference 2026! ",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Vielen Dank. Bis später.",
"PostDelay": -1
}
],
"category": "SPIE Management Board",
"itemsType": "struct",
"itemsFields":
{
"BeginDelay":
{
"type": "float"
},
"Text":
{
"type": "string"
},
"PostDelay":
{
"type": "float"
}
}
}
},
{
"Day1_B_Texts":
{
"type": "array",
"default": [
{
"BeginDelay": 0,
"Text": "",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Sehr gerne, André! Im Frühjahr 2025 haben wir das HorizonAI Programm bei SPIE Germany Switzerland Austria gestartet, mit dem Ziel, die großen Potentiale von AI zu nutzen und uns zukunftssicher in dem Bereich aufzustellen. Im Fokus stand der AI Readiness Check auf der Grundlage des CISCO-Framework. So haben wir in Zusammenarbeit mit allen Geschäftsbereichen und dem Head Office eine Bestandsaufnahme durchgeführt, bestehende AI-Anwendungsfälle besprochen und neue identifiziert. Dabei sind über 110 konkrete Use Cases entstanden, von denen einige aktuell schon umgesetzt werden. Wir haben an der Erweiterung unseres Ökosystems gearbeitet, unter anderem unser Partnernetzwerk erweitert und ein umfassendes Screening bestehender AI-Forschungsplattformen abgeschlossen. Mit KI NRW und dem Ipai in Heilbronn treten wir zwei Plattformen bei.Vieles dreht sich bei AI um Daten. Mit unserer Datenstrategie treiben wir die optimale Nutzung der Daten und des Wissens über unsere Kunden voran. All dies ist nur durch die stetige Weiterentwicklung der Kompetenzen unserer Mitarbeitenden möglich, daher bieten wir unter anderem Webinare zur Nutzung von AI-Technologien an. Technisch setzen wir auf unsere skalierbare SPIE GSA Data & AI Infrastruktur und stimmen unser Vorgehen durch eine SPIE gruppenweite AI Policy ab. Stellvertretend stehen hierfür unsere Data Integration Plattform auf Basis von Microsoft Fabrics und AIWA mit aktuell mehr als 3.500 Nutzern.HorizonAI geht weiter und wird uns zukünftig ermöglichen, AI als Enabler und Accelerator zu nutzen und uns als Digital Leader in unseren Märkten zu etablieren. ",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Avatar: Stimmt, mein Name steht noch nicht fest. Aber das ändern wir heute gemeinsam. Zur Auswahl stehen EVA, NEXA, NOVA, INSPIRATION und AVA. Ihr könnt über den QR-Code mitentscheiden, welcher Name am besten zu mir passt.",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Danke André, wir sehen uns dann morgen.",
"PostDelay": -1
}
],
"category": "SPIE Management Board",
"itemsType": "struct",
"itemsFields":
{
"BeginDelay":
{
"type": "float"
},
"Text":
{
"type": "string"
},
"PostDelay":
{
"type": "float"
}
}
}
},
{
"Day2_Texts":
{
"type": "array",
"default": [
{
"BeginDelay": 0,
"Text": "",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Nun, ich bin ein sogenannter Added-Value-Avatar und wurde ursprünglich vom Fraunhofer-Institut für Arbeitswirtschaft und Organisation IAO gemeinsam mit der Digitalagentur b.ReX zum Leben erweckt. Ich bin eine KI-gestützte virtuelle Kollegin und kann Aufgaben wie Support, Schulung, Moderation und Wissenstransfer innerhalb eines Unternehmens übernehmen. Ich kann Informationen bereitstellen, an Besprechungen teilnehmen und Prozesse aktiv unterstützen – als virtuelles Teammitglied. Ich bin mehrsprachig, rund um die Uhr an jedem Ort verfügbar – und das künftig geräte- und standortunabhängig.Und warum bin ich interessant für SPIE? Stellt Euch vor, ich unterstütze Euch bei Arbeitssicherheitsunterweisungen in jeder Sprache.Ihr könnt mich zum Leistungsspektrum von SPIE befragen – wer macht was wo.Ich kann beim Onboarding von neuen Kolleginnen und Kollegen unterstützen, interaktive E-Learnings durchführen.Ich kann technischer Helpdesk für das Störungsmanagement an technischen Anlagen sein, zum Beispiel während des Bereitschaftsdienstes. Natürlich benötige ich Daten und Trainings.Wenn ihr mich richtig trainiert und Eure Daten im Griff habt, kann ich technische Dokumentationen zur Anlage und deren Fehlerhistorie bereitstellen. Und über kurz oder lang möchte ich auch „agentic“ sein, zum Beispiel Ersatzteile für Euch direkt im System bestellen.Während meiner ersten Stunden bei SPIE habe ich vom Projekt SHINE gehört, ein Projekt, das die SPIE-Talents 2024 bearbeitet haben. Dabei geht es um Wissensmanagement, nämlich die Archivierung des Wissens von Mitarbeitenden, die mit ihrem Wissen in den Ruhestand gehen. Auch hier könnte ich unterstützen.",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Ich bin gespannt, wohin die Reise mit euch geht, und freue mich, ein Teil dieses Teams zu werden. Danke André, wir sehen uns dann später noch einmal.",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Danke André, wir sehen uns dann später noch einmal.",
"PostDelay": -1
}
],
"category": "SPIE Management Board",
"itemsType": "struct",
"itemsFields":
{
"BeginDelay":
{
"type": "float"
},
"Text":
{
"type": "string"
},
"PostDelay":
{
"type": "float"
}
}
}
},
{
"Day2_B_Texts":
{
"type": "array",
"default": [
{
"BeginDelay": 0,
"Text": "",
"PostDelay": -1
},
{
"BeginDelay": -1,
"Text": "Hallo, da bin ich noch einmal. Ich hoffe, ihr hattet inspirierende Tage. Für mich war es die erste Veranstaltung und deswegen natürlich besonders aufregend. Ihr habt eine wichtige Entscheidung getroffen. Die Abstimmung über meinen Namen hat ergeben, dass ich XY heiße.Aber weswegen ich eigentlich da bin: Ich möchte die Ergebnisse der letzten beiden Tage für euch zusammenfassen. Das sind die vier Key takeaways zu unserer Management Conference 2026. Erstens: Hinter uns liegt ein sehr herausforderndes Jahr 2025. Alles in allem haben wir unsere Ziele für 2025 erreicht, mit viel Anstrengungen und auch dem einen oder anderen Kraftakt. 2025 markiert auch den Abschluss unserer Ambition Zwanzigfünfundzwanzig. Wir können sehr stolz auf unsere Ergebnisse sein. Wenn wir uns etwas vornehmen, erreichen wir dies auch. In einem Satz: Ambition Zwanzigfünfundzwanzig – we deliveredZweitens: Wir begeben uns jetzt auf die nächste Etappe unserer Entwicklung, als SPIE Germany Switzerland Austria: unsere Ambition Zwanzigdreißig mit den vier Schwerpunkten Financials, Employer of Choice, Sustainability sowie AI als Enabler und Accelerator. Unsere Aufgabe lautet jetzt: „Turning Ambition into action“.Drittens: Uns unsere Ambition Zwanzigdreißig ist bereits gestartet. Auch für 2026 haben wir uns ambitionierte Ziele gesetzt. Nun heißt es: „Together, we deliver“. Und Viertens: Orientierung bei unserer Weiterentwicklung geben uns: a. dass seit vielen Jahren bewährte und erfolgreiche Geschäftsmodell von SPIE mit Fokus auf EBIT-Marge und Cash, b. die klare strategische Positionierung als technischer Dienstleister für Gebäude, Anlagen und Infrastrukturen undc. One SPIE als Leitmotiv für die gemeinsame Zusammenarbeit.In diesem Sinne: SPIE, gemeinsam zum Erfolg.",
"PostDelay": -1
},
{
"BeginDelay": 0,
"Text": "",
"PostDelay": -1
}
],
"category": "SPIE Management Board",
"itemsType": "struct",
"itemsFields":
{
"BeginDelay":
{
"type": "float"
},
"Text":
{
"type": "string"
},
"PostDelay":
{
"type": "float"
}
}
}
},
{
"AvatarInstance":
{
"type": "string",
"default": "SPIE",
"tooltip": "Unique Name of this Avatar Application",
"category": "SPIE Management Board"
}
},
{
"UseLogging":
{
"type": "boolean",
"default": true,
"tooltip": "Do you want to log all interaction?",
"category": "SPIE Management Board"
}
},
{
"HideUI":
{
"type": "boolean",
"default": false,
"tooltip": "Hides the UI",
"hotreload": true,
"category": "Project Setup"
}
},
{
"HideDialogueBoxAtStart":
{
"type": "boolean",
"default": false,
"tooltip": "If activated, the DialogueBox will hide after the first Button press to initialize the conversation. Can be show again by pressing \"H\"",
"hotreload": true,
"category": "Project Setup"
}
},
{
"ConstrainAspectRatio":
{
"type": "boolean",
"default": false,
"tooltip": "If the camera should contrain to a vertical aspect ration. Can be used to enable a horizontal screen",
"hotreload": true,
"category": "Project Setup"
}
},
{
"DebugAI":
{
"type": "enum",
"default": "Normal",
"tooltip": "Debugging mode for the AI Module",
"category": "Debug",
"enum": [
"Normal",
"DebugModule",
"DebugNoModule"
]
}
},
{
"DebugTTS":
{
"type": "enum",
"default": "Normal",
"tooltip": "Debugging mode for the TTS Module",
"category": "Debug",
"enum": [
"Normal",
"DebugModule",
"DebugNoModule"
]
}
},
{
"DebugSTT":
{
"type": "enum",
"default": "Normal",
"tooltip": "Debugging mode for the STT Module",
"category": "Debug",
"enum": [
"Normal",
"DebugModule",
"DebugNoModule"
]
}
},
{
"DebugAvatar":
{
"type": "boolean",
"default": false,
"tooltip": "Activated the debugging Mode for the Avatar",
"category": "Debug"
}
},
{
"AvatarVolume":
{
"type": "float",
"default": 1,
"tooltip": "Volume from 0-1 for the Avatar (Doesnt work with A2F)",
"category": "Volume"
}
},
{
"VFXVolume":
{
"type": "float",
"default": 0.29999999999999999,
"tooltip": "Volume from 0-1 for the VFX Sounds",
"hotreload": true,
"category": "Volume"
}
},
{
"ScreenPercentage":
{
"type": "float",
"default": 80,
"tooltip": "Sets the Screen-Percentage of the project",
"hotreload": true,
"category": "Engine Settings"
}
},
{
"VSync":
{
"type": "boolean",
"default": true,
"tooltip": "Activated VSync",
"hotreload": true,
"category": "Engine Settings"
}
},
{
"FPSCap":
{
"type": "integer",
"default": 60,
"tooltip": "Caps the FPS",
"hotreload": true,
"category": "Engine Settings"
}
},
{
"RaytracingReflectionSamples":
{
"type": "integer",
"default": 0,
"tooltip": "Samples in the Reflection, increases quality of Avatar Reflection on Ground",
"hotreload": true,
"category": "Engine Settings"
}
},
{
"consoleCommands":
{
"type": "array",
"default": [
"r.HairStrands.ComposeAfterTranslucency 2"
],
"category": "Engine Settings",
"itemsType": "string"
}
},
{
"LookAtEnabled":
{
"type": "boolean",
"default": true,
"tooltip": "Activated LookAt in Avatar AnimationSystem",
"category": "Avatar Core"
}
},
{
"LookAtLocation":
{
"type": "vector3",
"default":
{
"X": 0,
"Y": 560,
"Z": 110
},
"tooltip": "Location for the LookAt",
"category": "Avatar Core"
}
},
{
"UseMCPServer":
{
"type": "boolean",
"default": false,
"tooltip": "Active MCP Server",
"category": "Avatar Core"
}
},
{
"LipSyncModel":
{
"type": "enum",
"default": "Original (Highest Quality)",
"category": "Avatar Core",
"enum": [
"Original (Highest Quality)",
"Semi-Optimized (Balanced)",
"Highly Optimized (Fastest)"
]
}
},
{
"AvatarResetTimerLength":
{
"type": "float",
"default": 60,
"tooltip": "How long to wait for a reset after avatar stopped talking. A value of 0 deactivates the timer",
"hotreload": true,
"category": "Avatar Core"
}
},
{
"AvatarResetTimerAnimation":
{
"type": "float",
"default": 15,
"tooltip": "For how many seconds of the end of the reset timer length should we show the circle animation?",
"hotreload": true,
"category": "Avatar Core"
}
},
{
"TalkByHoldTimerLength":
{
"type": "float",
"default": 2,
"tooltip": "In seconds: If jumping to TalkToAvatar by pressing the button, how long to wait to skip the disclaimer if still holding the button?",
"hotreload": true,
"category": "Avatar Core"
}
},
{
"AzureSpeechService_API":
{
"type": "string",
"default": "0Gc0wvOF2tTCr4APvZkDaieKCGeBR9c5EbC5utXgVWZUqu4IAEf6NQ721iHNu74SwfDoYSBGJHLmCbcXVDP+F4HKnwsfHr7WYi9Gv+CjJ7/UrOygkqlrP05hbHBrJiPLWDv4Gw==",
"tooltip": "Encrypted Azure API Key",
"category": "STT Settings"
}
},
{
"AzureSpeechService_Region":
{
"type": "string",
"default": "germanywestcentral",
"tooltip": "Azure Region",
"category": "STT Settings"
}
},
{
"STTSettings":
{
"type": "struct",
"default":
{
"STTTranscriptionType": "Mircosoft Azure Congnitive Speech Services",
"bUsePTT": true,
"bCanInterrupt": true,
"bSTTDebugAudioSave": false,
"WebRTCSettings":
{
"pipeline_multi_channel_capture": false,
"pipeline_multi_channel_render": false,
"pipeline_maximum_internal_processing_rate": 48000,
"echo_canceller": true,
"pre_amplifier": false,
"high_pass_filter": true,
"noise_suppression": true,
"noise_suppression_level": 3,
"transient_suppression": true,
"gain_controller1": false,
"gain_controller2": false,
"voice_detection": false,
"residual_echo_detector": true,
"level_estimation": false
},
"VADSettings":
{
"VAD_Mode": 2,
"VAD_SpeechWhileBlocked": 0.5,
"VAD_MinSpeechTime": 0.25,
"VAD_MinSpeechAmplitude": -55
},
"SpeexDSPSettings":
{
"StateNames": [],
"SettingEntries": [
{
"TypeName": "preprocessor Automatic Gain Control state",
"Value": 0
},
{
"TypeName": "preprocessor dereverb state",
"Value": 10
},
{
"TypeName": "maximum attenuation of the noise in dB (negative number)",
"Value": -10
},
{
"TypeName": "attenuation of the residual echo in dB (negative number)",
"Value": -40
},
{
"TypeName": "maximum attenuation of the residual echo in dB when near end is active (negative number)",
"Value": -15
}
]
},
"STTReplacements": [
{
"TranscribedWords": [
"spie",
"schpie",
"spieh",
"spiel"
],
"ReplacementWord": "SPIE"
}
],
"STTSpecialWords": [
"SPIE"
],
"PTTPostRollTime": 0.40000000596046448,
"FreespeechPostRollTime": 0.5,
"MaxTalkingTime": 15
},
"category": "STT Settings",
"fields":
{
"STTTranscriptionType":
{
"type": "enum",
"enum": [
"OpenAI Transcription",
"Mircosoft Azure Congnitive Speech Services"
]
},
"bUsePTT":
{
"type": "boolean"
},
"bCanInterrupt":
{
"type": "boolean"
},
"bSTTDebugAudioSave":
{
"type": "boolean"
},
"WebRTCSettings":
{
"type": "struct",
"fields":
{
"pipeline_multi_channel_capture":
{
"type": "boolean"
},
"pipeline_multi_channel_render":
{
"type": "boolean"
},
"pipeline_maximum_internal_processing_rate":
{
"type": "integer"
},
"echo_canceller":
{
"type": "boolean"
},
"pre_amplifier":
{
"type": "boolean"
},
"high_pass_filter":
{
"type": "boolean"
},
"noise_suppression":
{
"type": "boolean"
},
"noise_suppression_level":
{
"type": "integer"
},
"transient_suppression":
{
"type": "boolean"
},
"gain_controller1":
{
"type": "boolean"
},
"gain_controller2":
{
"type": "boolean"
},
"voice_detection":
{
"type": "boolean"
},
"residual_echo_detector":
{
"type": "boolean"
},
"level_estimation":
{
"type": "boolean"
}
}
},
"VADSettings":
{
"type": "struct",
"fields":
{
"VAD_Mode":
{
"type": "integer"
},
"VAD_SpeechWhileBlocked":
{
"type": "float"
},
"VAD_MinSpeechTime":
{
"type": "float"
},
"VAD_MinSpeechAmplitude":
{
"type": "integer"
}
}
},
"SpeexDSPSettings":
{
"type": "struct",
"fields":
{
"StateNames":
{
"type": "array",
"itemsType": "enum",
"itemsEnum": [
"preprocessor denoiser state",
"preprocessor Automatic Gain Control state",
"preprocessor Voice Activity Detection state",
"preprocessor dereverb state",
"preprocessor dereverb level",
"preprocessor dereverb decay",
"probability required for the VAD to go from silence to voice",
"probability required for the VAD to stay in the voice state (integer percent)",
"maximum attenuation of the noise in dB (negative number)",
"attenuation of the residual echo in dB (negative number)",
"maximum attenuation of the residual echo in dB when near end is active (negative number)",
"the corresponding echo canceller state so that residual echo suppression can be performed (NULL for no residual echo suppression)",
"maximal gain increase in dB/second (int32)",
"maximal gain decrease in dB/second (int32)",
"maximal gain in dB (int32)",
"preprocessor Automatic Gain Control level (int32)"
]
},
"SettingEntries":
{
"type": "array",
"itemsType": "struct",
"itemsFields":
{
"TypeName":
{
"type": "enum"
},
"Value":
{
"type": "integer"
}
}
}
}
},
"STTReplacements":
{
"type": "array",
"itemsType": "struct",
"itemsFields":
{
"TranscribedWords":
{
"type": "array",
"itemsType": "string"
},
"ReplacementWord":
{
"type": "string"
}
}
},
"STTSpecialWords":
{
"type": "array",
"itemsType": "string"
},
"PTTPostRollTime":
{
"type": "float"
},
"FreespeechPostRollTime":
{
"type": "float"
},
"MaxTalkingTime":
{
"type": "float"
}
}
}
},
{
"AzureOpenAI_API":
{
"type": "string",
"default": "UjzfgavJ45lCu+oB2vVAsKNbPT+k3XCv7t69Og6j0LmwxhD3OK5WDBxUvgKnuDrz3xuNHg==",
"tooltip": "Encrypted Azure OpenAI API Key",
"category": "AI Settings"
}
},
{
"AzureOpenAI_Model":
{
"type": "string",
"default": "gpt-realtime",
"tooltip": "Open AI Model",
"category": "AI Settings"
}
},
{
"AzureOpenAI_URL":
{
"type": "string",
"default": "aiwa-ai-new.openai.azure.com/openai",
"tooltip": "URL to Azure OpenAI Resource",
"category": "AI Settings"
}
},
{
"OpenAIAudioOut":
{
"type": "boolean",
"default": true,
"tooltip": "Direct audio generation by OpenAI",
"category": "AI Settings"
}
},
{
"CustomOpenAIVoice":
{
"type": "enum",
"default": "shimmer",
"tooltip": "Only Set if you want to override the Avatars Voice",
"category": "AI Settings",
"enum": [
"UNDEFINED",
"alloy",
"ash",
"ballad",
"cedar",
"coral",
"echo",
"marin",
"sage",
"shimmer",
"verse"
]
}
},
{
"OpenAIRequestTimeout":
{
"type": "integer",
"default": 10,
"tooltip": "OpenAI Timeout in seconds",
"category": "AI Settings"
}
},
{
"AITemperature":
{
"type": "float",
"default": 0.80000000000000004,
"tooltip": "Temperature of the AI Model",
"category": "AI Settings"
}
},
{
"AIMaxTokens":
{
"type": "integer",
"default": 3000,
"tooltip": "Max Token per Request of the AI Model",
"category": "AI Settings"
}
},
{
"AzureAISearch_API":
{
"type": "string",
"default": "9ksww+/kHZPYMfUFTWSi1QgaDjXaB7vxdGKPgmfGhPEx321nfpdbkUnThXT4BWrkKMAR0MF2zJT17fJSday8yBiftv0=",
"tooltip": "Azure AI Search API Key",
"category": "AI Settings"
}
},
{
"AzureAISearch_URL":
{
"type": "string",
"default": "aiwa-ai-search.search.windows.net",
"tooltip": "Azure AIWA URL",
"category": "AI Settings"
}
},
{
"AzureAISearch_Index":
{
"type": "string",
"default": "aiwa-ai-search",
"tooltip": "Azure AI Search Indexname",
"category": "AI Settings"
}
},
{
"UseCachingSystem":
{
"type": "boolean",
"default": true,
"category": "TTS Settings"
}
},
{
"ChunkLength":
{
"type": "float",
"default": 0.01,
"category": "TTS Settings"
}
},
{
"StreamAmplitudeMultiplier":
{
"type": "float",
"default": 0.25,
"category": "TTS Settings"
}
}
]
}