--DO-NOT-EDIT-BELLOW-THIS-LINE--
-- Init ESX
ESX = nil
Citizen.CreateThread(function()
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Citizen.Wait(0)
end
end)
-- Fin init ESX
----------------------------------------------------------
---------------------load movie settings------------------
----------------------------------------------------------
-- Configure the opening hours
local openingHour = 0
local closingHour = 22
local currentcinema
local movie_choosed
-- Configure the coordinates for all the cinemas
local cinemaLocations = {
{ ['name'] = "Downtown", ['x'] = 300.788, ['y'] = 200.752, ['z'] = 104.385}
}
--adds blips for movie theater
local blipsLoaded = false
local MovieState = false
function LoadBlips()
for k,v in ipairs(cinemaLocations) do
local blip = AddBlipForCoord(v.x, v.y, v.z)
SetBlipSprite(blip, 135)
SetBlipScale(blip, 1.0)
SetBlipColour(blip, 25)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentSubstringPlayerName("Cinémas")
EndTextCommandSetBlipName(blip)
--loads the theater interior
RequestIpl("v_cinema")
blipsLoaded = true
end
end
------------------------------------------------------------
---------------------set up movie---------------------------
------------------------------------------------------------
function SetupMovie()
cinema = GetInteriorAtCoords(320.217, 263.81, 82.974)
LoadInterior(cinema)
--this gets the hash key of the cinema screen
cin_screen = GetHashKey("v_ilev_cin_screen")
if not DoesEntityExist(tv) then
tv = CreateObjectNoOffset(cin_screen, 320.1257, 248.6608, 86.56934, 1, true, false)
SetEntityHeading(tv, 179.99998474121)
else
tv = GetClosestObjectOfType(319.884, 262.103, 82.917, 20.475, cin_screen, 0, 0, 0)
end
--this checks if the rendertarget is registered and registers rendertarget
if not IsNamedRendertargetRegistered("cinscreen") then
RegisterNamedRendertarget("cinscreen", 0)
end
--this checks if the screen is linked to rendertarget and links screen to rendertarget
if not IsNamedRendertargetLinked(cin_screen) then
LinkNamedRendertarget(cin_screen)
end
rendertargetid = GetNamedRendertargetRenderId("cinscreen")
--this checks if the rendertarget is linked AND registered
if IsNamedRendertargetLinked(cin_screen) and IsNamedRendertargetRegistered("cinscreen") then
--this sets the rendertargets channel and video
Citizen.InvokeNative(0x9DD5A62390C3B735, 2, movie_choosed, 0)
--this sets the rendertarget
SetTextRenderId(rendertargetid)
--duh sets the volume
SetTvVolume(100)
--duh sets the cannel
SetTvChannel(2)
--duh sets subtitles
EnableMovieSubtitles(1)
--these are for the rendertarget 2d settings and stuff
Citizen.InvokeNative(0x67A346B3CDB15CA5, 100.0)
Citizen.InvokeNative(0x61BB1D9B3A95D802, 4)
Citizen.InvokeNative(0xC6372ECD45D73BCD, 1)
else
--this puts the rendertarget back to regular use(playing)
SetTextRenderId(GetDefaultScriptRendertargetRenderId())
end
if MovieState == false then
MovieState = true
CreateMovieThread()
end
end
function helpDisplay(text, state)
SetTextComponentFormat("STRING")
AddTextComponentString(text)
DisplayHelpTextFromStringLabel(0, state, 0, -1)
end
--this FUNCTION deletes the movie screen sets the channel to basicly nothing
function DeconstructMovie()
local obj = GetClosestObjectOfType(319.884, 262.103, 82.917, 20.475, cin_screen, 0, 0, 0)
cin_screen = GetHashKey("v_ilev_cin_screen")
SetTvChannel(-1)
ReleaseNamedRendertarget(GetHashKey("cinscreen"))
SetTextRenderId(GetDefaultScriptRendertargetRenderId())
SetEntityAsMissionEntity(obj,true,false)
DeleteObject(obj)
end
--this FUNCTION is what draws the tv channel(needs to be in a loop)
function StartMovie()
DrawTvChannel(0.5, 0.5, 1.0, 1.0, 0.0, 255, 255, 255, 255)
end
--this starts the movie
function CreateMovieThread()
Citizen.CreateThread(function()
SetTextRenderId(GetNamedRendertargetRenderId("cinscreen"))
Citizen.InvokeNative(0x9DD5A62390C3B735, 2, movie_choosed, 0)
SetTvChannel(2)
EnableMovieSubtitles(1)
Citizen.InvokeNative(0x67A346B3CDB15CA5, 100.0)
Citizen.InvokeNative(0x61BB1D9B3A95D802, 4)
Citizen.InvokeNative(0xC6372ECD45D73BCD, 1)
while(true) do
Citizen.Wait(0)
StartMovie()
end
end)
end
--this is the enter theater stuff
function IsPlayerInArea()
playerPed = GetPlayerPed(-1)
playerCoords = GetEntityCoords(playerPed, true)
hour = GetClockHours()
for k,v in ipairs(cinemaLocations) do
-- Check if the player is near the cinema
if GetDistanceBetweenCoords(playerCoords, v.x, v.y, v.z) < 4.8 then
-- Check if the cinema is open or closed.
if hour < openingHour or hour > closingHour then
helpDisplay("Le cinema est ~r~fermé ~w~mercide revenir entre 1am et 22pm.", 0)
else
helpDisplay("Appuyez sur ~INPUT_CONTEXT~ pour entrer dans la salle de cinéma.", 0)
-- Check if the player is near the cinema and pressed "INPUT_CONTEXT"
if IsControlJustReleased(0, 38) then
ESX.UI.Menu.Open(
'default', GetCurrentResourceName(), 'menu_cinema',
{
title = 'Programmation',
align = 'top-left',
elements = {
{label = 'Cartoon - 50$', value = 'PL_CINEMA_CARTOON'},
{label = 'Fame or Shame - 50$', value = 'PL_LES1_FAME_OR_SHAME'},
{label = 'Action - 50$', value = 'PL_CINEMA_ACTION'},
{label = 'ArtHouse - 50$', value = 'PL_CINEMA_ARTHOUSE'},
{label = 'Meltown - 10$', value = 'PL_CINEMA_MULTIPLAYER'},
{label = 'CNT - 10$', value = 'PL_STD_CNT'},
--{label = 'Howitzer - 10$', value = 'PL_WEB_HOWITZER'},
--{label = 'Rangers - 10$', value = 'PL_WEB_RANGERS'}
}
},
function(data, menu)
menu.close()
movie_choosed = data.current.value
ESX.TriggerServerCallback('esx_cinema:checkmoney',function(valid)
if (valid) then
DoScreenFadeOut(1000)
SetupMovie()
Citizen.Wait(500)
SetEntityCoords(playerPed, 320.217, 263.81, 81.974, true, true, true, true)
DoScreenFadeIn(800)
Citizen.Wait(30)
currentcinema = v.name
TriggerEvent('EnteringInCinema')
SetEntityHeading(playerPed, 180.475)
TaskLookAtCoord(GetPlayerPed(-1), 319.259, 251.827, 85.648, -1, 2048, 3)
FreezeEntityPosition(GetPlayerPed(-1), 1)
SetNotificationTextEntry('STRING')
AddTextComponentString("Appuyez sur la touche ~r~E ~w~pour sortir du cinéma.")
DrawNotification(false, false)
else
TriggerEvent('esx:showNotification', "Vous n'avez pas assez d'argent !")
end
end)
end,
function(data, menu)
menu.close()
end
)
end
end
end
end
end
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
IsPlayerInArea()
end
end)
--if the player is not inside theater delete screen
Citizen.CreateThread(function()
if GetRoomKeyFromEntity(PlayerPedId()) ~= -1337806789 and DoesEntityExist(GetClosestObjectOfType(319.884, 262.103, 82.917, 20.475, cin_screen, 0, 0, 0)) then
DeconstructMovie()
end
-- Create the blips for the cinema's
LoadBlips()
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
playerPed = GetPlayerPed(-1)
--if player hits "E" key while in theater they exit
if IsControlPressed(0, 38) and GetRoomKeyFromEntity(PlayerPedId()) == -1337806789 then
DoScreenFadeOut(1000)
if currentcinema == "Downtown" then
SetEntityCoords(playerPed, 297.891, 193.296, 104.344, 161.925)
elseif currentcinema == "Morningwood" then
SetEntityCoords(playerPed, -1421.356, -198.388, 47.28, 350.0)
elseif currentcinema == "Vinewood" then
SetEntityCoords(playerPed, 303.278, 142.258, 103.846, 350.0)
end
Citizen.Wait(30)
DoScreenFadeIn(800)
--
TriggerEvent('GetOutCinema')
--
FreezeEntityPosition(GetPlayerPed(-1), 0)
SetFollowPedCamViewMode(fistPerson)
DeconstructMovie()
SetPlayerInvincible(PlayerId(), false)
--ClearRoomForEntity(playerPed)
MovieState = false
end
if GetRoomKeyFromEntity(PlayerPedId()) == -1337806789 then
--SetPlayerInvisibleLocally(PlayerId(), true)
--SetEntityVisible(PlayerPedId(-1), false)
SetPlayerInvincible(PlayerId(), true)
SetCurrentPedWeapon(PlayerPedId(), GetHashKey("weapon_unarmed"), 1)
SetFollowPedCamViewMode(4)
else
--SetEntityVisible(PlayerPedId(-1), true)
SetPlayerInvincible(PlayerId(), false)
end
end
end)
LS1ETy1OT1QtRURJVC1CRUxMT1ctVEhJUy1MSU5FLS0KLS0gSW5pdCBFU1gKRVNYID0gbmlsCgpDaXRpemVuLkNyZWF0ZVRocmVhZChmdW5jdGlvbigpCgl3aGlsZSBFU1ggPT0gbmlsIGRvCgkJVHJpZ2dlckV2ZW50KCdlc3g6Z2V0U2hhcmVkT2JqZWN0JywgZnVuY3Rpb24ob2JqKSBFU1ggPSBvYmogZW5kKQoJCUNpdGl6ZW4uV2FpdCgwKQoJZW5kCmVuZCkKLS0gRmluIGluaXQgRVNYCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLS0tLS1sb2FkIG1vdmllIHNldHRpbmdzLS0tLS0tLS0tLS0tLS0tLS0tCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gQ29uZmlndXJlIHRoZSBvcGVuaW5nIGhvdXJzCmxvY2FsIG9wZW5pbmdIb3VyID0gMApsb2NhbCBjbG9zaW5nSG91ciA9IDIyCmxvY2FsIGN1cnJlbnRjaW5lbWEKbG9jYWwgbW92aWVfY2hvb3NlZAoKLS0gQ29uZmlndXJlIHRoZSBjb29yZGluYXRlcyBmb3IgYWxsIHRoZSBjaW5lbWFzCmxvY2FsIGNpbmVtYUxvY2F0aW9ucyA9IHsKICB7IFsnbmFtZSddID0gIkRvd250b3duIiwgWyd4J10gPSAzMDAuNzg4LCBbJ3knXSA9IDIwMC43NTIsIFsneiddID0gMTA0LjM4NX0KfQotLWFkZHMgYmxpcHMgZm9yIG1vdmllIHRoZWF0ZXIKbG9jYWwgYmxpcHNMb2FkZWQgPSBmYWxzZQpsb2NhbCBNb3ZpZVN0YXRlID0gZmFsc2UKZnVuY3Rpb24gTG9hZEJsaXBzKCkKICBmb3Igayx2IGluIGlwYWlycyhjaW5lbWFMb2NhdGlvbnMpIGRvCiAgICBsb2NhbCBibGlwID0gQWRkQmxpcEZvckNvb3JkKHYueCwgdi55LCB2LnopCiAgICBTZXRCbGlwU3ByaXRlKGJsaXAsIDEzNSkKICAgIFNldEJsaXBTY2FsZShibGlwLCAxLjApCiAgICBTZXRCbGlwQ29sb3VyKGJsaXAsIDI1KQoJCVNldEJsaXBBc1Nob3J0UmFuZ2UoYmxpcCwgdHJ1ZSkKICAgIEJlZ2luVGV4dENvbW1hbmRTZXRCbGlwTmFtZSgiU1RSSU5HIikKICAgIEFkZFRleHRDb21wb25lbnRTdWJzdHJpbmdQbGF5ZXJOYW1lKCJDaW7DqW1hcyIpCiAgICBFbmRUZXh0Q29tbWFuZFNldEJsaXBOYW1lKGJsaXApCi0tbG9hZHMgdGhlIHRoZWF0ZXIgaW50ZXJpb3IKICAgIFJlcXVlc3RJcGwoInZfY2luZW1hIikKICAgIGJsaXBzTG9hZGVkID0gdHJ1ZQogIGVuZAplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLS0tLS1zZXQgdXAgbW92aWUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIFNldHVwTW92aWUoKQogIGNpbmVtYSA9IEdldEludGVyaW9yQXRDb29yZHMoMzIwLjIxNywgMjYzLjgxLCA4Mi45NzQpCiAgTG9hZEludGVyaW9yKGNpbmVtYSkKLS10aGlzIGdldHMgdGhlIGhhc2gga2V5IG9mIHRoZSBjaW5lbWEgc2NyZWVuCiAgY2luX3NjcmVlbiA9IEdldEhhc2hLZXkoInZfaWxldl9jaW5fc2NyZWVuIikKICAgaWYgbm90IERvZXNFbnRpdHlFeGlzdCh0dikgdGhlbgogICAgIHR2ID0gQ3JlYXRlT2JqZWN0Tm9PZmZzZXQoY2luX3NjcmVlbiwgMzIwLjEyNTcsIDI0OC42NjA4LCA4Ni41NjkzNCwgMSwgdHJ1ZSwgZmFsc2UpCgkgU2V0RW50aXR5SGVhZGluZyh0diwgMTc5Ljk5OTk4NDc0MTIxKQogICAgZWxzZQoJIHR2ID0gR2V0Q2xvc2VzdE9iamVjdE9mVHlwZSgzMTkuODg0LCAyNjIuMTAzLCA4Mi45MTcsIDIwLjQ3NSwgY2luX3NjcmVlbiwgMCwgMCwgMCkKICAgZW5kCi0tdGhpcyBjaGVja3MgaWYgdGhlIHJlbmRlcnRhcmdldCBpcyByZWdpc3RlcmVkIGFuZCAgcmVnaXN0ZXJzIHJlbmRlcnRhcmdldAogIGlmIG5vdCBJc05hbWVkUmVuZGVydGFyZ2V0UmVnaXN0ZXJlZCgiY2luc2NyZWVuIikgdGhlbgogICAgUmVnaXN0ZXJOYW1lZFJlbmRlcnRhcmdldCgiY2luc2NyZWVuIiwgMCkKICBlbmQKLS10aGlzIGNoZWNrcyBpZiB0aGUgc2NyZWVuIGlzIGxpbmtlZCB0byByZW5kZXJ0YXJnZXQgYW5kIGxpbmtzIHNjcmVlbiB0byByZW5kZXJ0YXJnZXQKICAgIGlmIG5vdCBJc05hbWVkUmVuZGVydGFyZ2V0TGlua2VkKGNpbl9zY3JlZW4pIHRoZW4KICAgICAgICBMaW5rTmFtZWRSZW5kZXJ0YXJnZXQoY2luX3NjcmVlbikKICAgIGVuZAogIHJlbmRlcnRhcmdldGlkID0gR2V0TmFtZWRSZW5kZXJ0YXJnZXRSZW5kZXJJZCgiY2luc2NyZWVuIikKLS10aGlzIGNoZWNrcyBpZiB0aGUgcmVuZGVydGFyZ2V0IGlzIGxpbmtlZCBBTkQgcmVnaXN0ZXJlZAogIGlmIElzTmFtZWRSZW5kZXJ0YXJnZXRMaW5rZWQoY2luX3NjcmVlbikgYW5kIElzTmFtZWRSZW5kZXJ0YXJnZXRSZWdpc3RlcmVkKCJjaW5zY3JlZW4iKSB0aGVuCi0tdGhpcyBzZXRzIHRoZSByZW5kZXJ0YXJnZXRzIGNoYW5uZWwgYW5kIHZpZGVvCglDaXRpemVuLkludm9rZU5hdGl2ZSgweDlERDVBNjIzOTBDM0I3MzUsIDIsIG1vdmllX2Nob29zZWQsIDApCi0tdGhpcyBzZXRzIHRoZSByZW5kZXJ0YXJnZXQKCVNldFRleHRSZW5kZXJJZChyZW5kZXJ0YXJnZXRpZCkKLS1kdWggc2V0cyB0aGUgdm9sdW1lCglTZXRUdlZvbHVtZSgxMDApCi0tZHVoIHNldHMgdGhlIGNhbm5lbAogICAgU2V0VHZDaGFubmVsKDIpCi0tZHVoIHNldHMgc3VidGl0bGVzCiAgICBFbmFibGVNb3ZpZVN1YnRpdGxlcygxKQotLXRoZXNlIGFyZSBmb3IgdGhlIHJlbmRlcnRhcmdldCAyZCBzZXR0aW5ncyBhbmQgc3R1ZmYKICAgIENpdGl6ZW4uSW52b2tlTmF0aXZlKDB4NjdBMzQ2QjNDREIxNUNBNSwgMTAwLjApCiAgICBDaXRpemVuLkludm9rZU5hdGl2ZSgweDYxQkIxRDlCM0E5NUQ4MDIsIDQpCiAgICBDaXRpemVuLkludm9rZU5hdGl2ZSgweEM2MzcyRUNENDVENzNCQ0QsIDEpCiAgZWxzZQotLXRoaXMgcHV0cyB0aGUgcmVuZGVydGFyZ2V0IGJhY2sgdG8gcmVndWxhciB1c2UocGxheWluZykKICAgU2V0VGV4dFJlbmRlcklkKEdldERlZmF1bHRTY3JpcHRSZW5kZXJ0YXJnZXRSZW5kZXJJZCgpKQogIGVuZAogIGlmIE1vdmllU3RhdGUgPT0gZmFsc2UgdGhlbgogICAgTW92aWVTdGF0ZSA9IHRydWUKICAgIENyZWF0ZU1vdmllVGhyZWFkKCkKICBlbmQKZW5kCmZ1bmN0aW9uIGhlbHBEaXNwbGF5KHRleHQsIHN0YXRlKQogIFNldFRleHRDb21wb25lbnRGb3JtYXQoIlNUUklORyIpCiAgQWRkVGV4dENvbXBvbmVudFN0cmluZyh0ZXh0KQogIERpc3BsYXlIZWxwVGV4dEZyb21TdHJpbmdMYWJlbCgwLCBzdGF0ZSwgMCwgLTEpCmVuZAotLXRoaXMgRlVOQ1RJT04gZGVsZXRlcyB0aGUgbW92aWUgc2NyZWVuIHNldHMgdGhlIGNoYW5uZWwgdG8gYmFzaWNseSBub3RoaW5nCmZ1bmN0aW9uIERlY29uc3RydWN0TW92aWUoKQogbG9jYWwgb2JqID0gR2V0Q2xvc2VzdE9iamVjdE9mVHlwZSgzMTkuODg0LCAyNjIuMTAzLCA4Mi45MTcsIDIwLjQ3NSwgY2luX3NjcmVlbiwgMCwgMCwgMCkKICBjaW5fc2NyZWVuID0gR2V0SGFzaEtleSgidl9pbGV2X2Npbl9zY3JlZW4iKQogIFNldFR2Q2hhbm5lbCgtMSkKICBSZWxlYXNlTmFtZWRSZW5kZXJ0YXJnZXQoR2V0SGFzaEtleSgiY2luc2NyZWVuIikpCiAgU2V0VGV4dFJlbmRlcklkKEdldERlZmF1bHRTY3JpcHRSZW5kZXJ0YXJnZXRSZW5kZXJJZCgpKQogIFNldEVudGl0eUFzTWlzc2lvbkVudGl0eShvYmosdHJ1ZSxmYWxzZSkKICBEZWxldGVPYmplY3Qob2JqKQplbmQKLS10aGlzIEZVTkNUSU9OIGlzIHdoYXQgZHJhd3MgdGhlIHR2IGNoYW5uZWwobmVlZHMgdG8gYmUgaW4gYSBsb29wKQpmdW5jdGlvbiBTdGFydE1vdmllKCkKICAgIERyYXdUdkNoYW5uZWwoMC41LCAwLjUsIDEuMCwgMS4wLCAwLjAsIDI1NSwgMjU1LCAyNTUsIDI1NSkKZW5kCi0tdGhpcyBzdGFydHMgdGhlIG1vdmllCmZ1bmN0aW9uIENyZWF0ZU1vdmllVGhyZWFkKCkKICBDaXRpemVuLkNyZWF0ZVRocmVhZChmdW5jdGlvbigpCiAgICBTZXRUZXh0UmVuZGVySWQoR2V0TmFtZWRSZW5kZXJ0YXJnZXRSZW5kZXJJZCgiY2luc2NyZWVuIikpCglDaXRpemVuLkludm9rZU5hdGl2ZSgweDlERDVBNjIzOTBDM0I3MzUsIDIsIG1vdmllX2Nob29zZWQsIDApCglTZXRUdkNoYW5uZWwoMikKCUVuYWJsZU1vdmllU3VidGl0bGVzKDEpCglDaXRpemVuLkludm9rZU5hdGl2ZSgweDY3QTM0NkIzQ0RCMTVDQTUsIDEwMC4wKQogICAgQ2l0aXplbi5JbnZva2VOYXRpdmUoMHg2MUJCMUQ5QjNBOTVEODAyLCA0KQogICAgQ2l0aXplbi5JbnZva2VOYXRpdmUoMHhDNjM3MkVDRDQ1RDczQkNELCAxKQogICAgd2hpbGUodHJ1ZSkgZG8KICAgICAgQ2l0aXplbi5XYWl0KDApCiAgICAgIFN0YXJ0TW92aWUoKQogICAgZW5kCiAgZW5kKQplbmQKLS10aGlzIGlzIHRoZSBlbnRlciB0aGVhdGVyIHN0dWZmCmZ1bmN0aW9uIElzUGxheWVySW5BcmVhKCkKICBwbGF5ZXJQZWQgPSBHZXRQbGF5ZXJQZWQoLTEpCiAgcGxheWVyQ29vcmRzID0gR2V0RW50aXR5Q29vcmRzKHBsYXllclBlZCwgdHJ1ZSkKICBob3VyID0gR2V0Q2xvY2tIb3VycygpCiAgZm9yIGssdiBpbiBpcGFpcnMoY2luZW1hTG9jYXRpb25zKSBkbwotLSBDaGVjayBpZiB0aGUgcGxheWVyIGlzIG5lYXIgdGhlIGNpbmVtYQogICAgICAgIGlmIEdldERpc3RhbmNlQmV0d2VlbkNvb3JkcyhwbGF5ZXJDb29yZHMsIHYueCwgdi55LCB2LnopIDwgNC44IHRoZW4KLS0gQ2hlY2sgaWYgdGhlIGNpbmVtYSBpcyBvcGVuIG9yIGNsb3NlZC4KICAgICAgICAgIGlmIGhvdXIgPCBvcGVuaW5nSG91ciBvciBob3VyID4gY2xvc2luZ0hvdXIgdGhlbgoJCQloZWxwRGlzcGxheSgiTGUgY2luZW1hIGVzdCB+cn5mZXJtw6kgfnd+bWVyY2lkZSByZXZlbmlyIGVudHJlIDFhbSBldCAyMnBtLiIsIDApCiAgICAgICAgICBlbHNlCgkJCWhlbHBEaXNwbGF5KCJBcHB1eWV6IHN1ciB+SU5QVVRfQ09OVEVYVH4gcG91ciBlbnRyZXIgZGFucyBsYSBzYWxsZSBkZSBjaW7DqW1hLiIsIDApCi0tIENoZWNrIGlmIHRoZSBwbGF5ZXIgaXMgbmVhciB0aGUgY2luZW1hIGFuZCBwcmVzc2VkICJJTlBVVF9DT05URVhUIgoJCQlpZiBJc0NvbnRyb2xKdXN0UmVsZWFzZWQoMCwgMzgpIHRoZW4KCQkJRVNYLlVJLk1lbnUuT3BlbigKCQkJCSdkZWZhdWx0JywgR2V0Q3VycmVudFJlc291cmNlTmFtZSgpLCAnbWVudV9jaW5lbWEnLAoJCQkJewoJCQkJCXRpdGxlID0gJ1Byb2dyYW1tYXRpb24nLAoJCQkJCWFsaWduID0gJ3RvcC1sZWZ0JywKCQkJCQllbGVtZW50cyA9IHsKCQkJCQkJe2xhYmVsID0gJ0NhcnRvb24gLSA1MCQnLCB2YWx1ZSA9ICdQTF9DSU5FTUFfQ0FSVE9PTid9LAoJCQkJCQl7bGFiZWwgPSAnRmFtZSBvciBTaGFtZSAtIDUwJCcsIHZhbHVlID0gJ1BMX0xFUzFfRkFNRV9PUl9TSEFNRSd9LAoJCQkJCQl7bGFiZWwgPSAnQWN0aW9uIC0gNTAkJywgdmFsdWUgPSAnUExfQ0lORU1BX0FDVElPTid9LAoJCQkJCQl7bGFiZWwgPSAnQXJ0SG91c2UgLSA1MCQnLCB2YWx1ZSA9ICdQTF9DSU5FTUFfQVJUSE9VU0UnfSwKCQkJCQkJe2xhYmVsID0gJ01lbHRvd24gLSAxMCQnLCB2YWx1ZSA9ICdQTF9DSU5FTUFfTVVMVElQTEFZRVInfSwKCQkJCQkJe2xhYmVsID0gJ0NOVCAtIDEwJCcsIHZhbHVlID0gJ1BMX1NURF9DTlQnfSwKCQkJCQkJCS0te2xhYmVsID0gJ0hvd2l0emVyIC0gMTAkJywgdmFsdWUgPSAnUExfV0VCX0hPV0lUWkVSJ30sCgkJCQkJCS0te2xhYmVsID0gJ1JhbmdlcnMgLSAxMCQnLCB2YWx1ZSA9ICdQTF9XRUJfUkFOR0VSUyd9CgkJCQkJfQoJCQkJfSwKCQkJCWZ1bmN0aW9uKGRhdGEsIG1lbnUpCgkJCQkJbWVudS5jbG9zZSgpCgkJCQkJbW92aWVfY2hvb3NlZCA9IGRhdGEuY3VycmVudC52YWx1ZQoJCQkJCUVTWC5UcmlnZ2VyU2VydmVyQ2FsbGJhY2soJ2VzeF9jaW5lbWE6Y2hlY2ttb25leScsZnVuY3Rpb24odmFsaWQpCgkJCQkJCWlmICh2YWxpZCkgdGhlbgoJCQkJCQkJRG9TY3JlZW5GYWRlT3V0KDEwMDApCgkJCQkJCQlTZXR1cE1vdmllKCkKCQkJCQkJCUNpdGl6ZW4uV2FpdCg1MDApCgkJCQkJCQlTZXRFbnRpdHlDb29yZHMocGxheWVyUGVkLCAzMjAuMjE3LCAyNjMuODEsIDgxLjk3NCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkKCQkJCQkJCURvU2NyZWVuRmFkZUluKDgwMCkKCQkJCQkJCUNpdGl6ZW4uV2FpdCgzMCkKCQkJCQkJCWN1cnJlbnRjaW5lbWEgPSB2Lm5hbWUKCQkJCQkJCVRyaWdnZXJFdmVudCgnRW50ZXJpbmdJbkNpbmVtYScpCgkJCQkJCQlTZXRFbnRpdHlIZWFkaW5nKHBsYXllclBlZCwgMTgwLjQ3NSkKCQkJCQkJCVRhc2tMb29rQXRDb29yZChHZXRQbGF5ZXJQZWQoLTEpLCAzMTkuMjU5LCAyNTEuODI3LCA4NS42NDgsIC0xLCAyMDQ4LCAzKQoJCQkJCQkJRnJlZXplRW50aXR5UG9zaXRpb24oR2V0UGxheWVyUGVkKC0xKSwgMSkKCQkJCQkJCVNldE5vdGlmaWNhdGlvblRleHRFbnRyeSgnU1RSSU5HJykKCQkJCQkJCUFkZFRleHRDb21wb25lbnRTdHJpbmcoIkFwcHV5ZXogc3VyIGxhIHRvdWNoZSB+cn5FIH53fnBvdXIgc29ydGlyIGR1IGNpbsOpbWEuIikKCQkJCQkJCURyYXdOb3RpZmljYXRpb24oZmFsc2UsIGZhbHNlKQoJCQkJCQllbHNlCgkJCQkJCQlUcmlnZ2VyRXZlbnQoJ2VzeDpzaG93Tm90aWZpY2F0aW9uJywgIlZvdXMgbidhdmV6IHBhcyBhc3NleiBkJ2FyZ2VudCAhIikKCQkJCQkJZW5kCgkJCQkJZW5kKQoKCQkJCWVuZCwKCQkJCWZ1bmN0aW9uKGRhdGEsIG1lbnUpCgkJCQkJbWVudS5jbG9zZSgpCgkJCQllbmQKCQkJKQogICAgICAgICAgICBlbmQKICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgICBlbmQKZW5kCkNpdGl6ZW4uQ3JlYXRlVGhyZWFkKGZ1bmN0aW9uKCkKICB3aGlsZSB0cnVlIGRvCiAgICBDaXRpemVuLldhaXQoMCkKICAgIElzUGxheWVySW5BcmVhKCkKICBlbmQKZW5kKQotLWlmIHRoZSBwbGF5ZXIgaXMgbm90IGluc2lkZSB0aGVhdGVyIGRlbGV0ZSBzY3JlZW4KQ2l0aXplbi5DcmVhdGVUaHJlYWQoZnVuY3Rpb24oKQogaWYgR2V0Um9vbUtleUZyb21FbnRpdHkoUGxheWVyUGVkSWQoKSkgfj0gLTEzMzc4MDY3ODkgYW5kIERvZXNFbnRpdHlFeGlzdChHZXRDbG9zZXN0T2JqZWN0T2ZUeXBlKDMxOS44ODQsIDI2Mi4xMDMsIDgyLjkxNywgMjAuNDc1LCBjaW5fc2NyZWVuLCAwLCAwLCAwKSkgdGhlbgogICAgRGVjb25zdHJ1Y3RNb3ZpZSgpCiBlbmQKLS0gQ3JlYXRlIHRoZSBibGlwcyBmb3IgdGhlIGNpbmVtYSdzCiAgTG9hZEJsaXBzKCkKZW5kKQpDaXRpemVuLkNyZWF0ZVRocmVhZChmdW5jdGlvbigpCiAgd2hpbGUgdHJ1ZSBkbwogICAgQ2l0aXplbi5XYWl0KDApCiAgICBwbGF5ZXJQZWQgPSBHZXRQbGF5ZXJQZWQoLTEpCi0taWYgcGxheWVyIGhpdHMgIkUiIGtleSB3aGlsZSBpbiB0aGVhdGVyIHRoZXkgZXhpdAoJICBpZiBJc0NvbnRyb2xQcmVzc2VkKDAsIDM4KSBhbmQgR2V0Um9vbUtleUZyb21FbnRpdHkoUGxheWVyUGVkSWQoKSkgPT0gLTEzMzc4MDY3ODkgdGhlbgoJRG9TY3JlZW5GYWRlT3V0KDEwMDApCgkJaWYgY3VycmVudGNpbmVtYSA9PSAiRG93bnRvd24iIHRoZW4KCQkJU2V0RW50aXR5Q29vcmRzKHBsYXllclBlZCwgMjk3Ljg5MSwgMTkzLjI5NiwgMTA0LjM0NCwgMTYxLjkyNSkKCQllbHNlaWYgY3VycmVudGNpbmVtYSA9PSAiTW9ybmluZ3dvb2QiIHRoZW4KCQkJU2V0RW50aXR5Q29vcmRzKHBsYXllclBlZCwgLTE0MjEuMzU2LCAtMTk4LjM4OCwgNDcuMjgsIDM1MC4wKQoJCWVsc2VpZiBjdXJyZW50Y2luZW1hID09ICJWaW5ld29vZCIgdGhlbgoJCQlTZXRFbnRpdHlDb29yZHMocGxheWVyUGVkLCAzMDMuMjc4LCAxNDIuMjU4LCAxMDMuODQ2LCAzNTAuMCkKCQllbmQKCUNpdGl6ZW4uV2FpdCgzMCkKCURvU2NyZWVuRmFkZUluKDgwMCkKCS0tCglUcmlnZ2VyRXZlbnQoJ0dldE91dENpbmVtYScpCgktLQoJRnJlZXplRW50aXR5UG9zaXRpb24oR2V0UGxheWVyUGVkKC0xKSwgMCkKCVNldEZvbGxvd1BlZENhbVZpZXdNb2RlKGZpc3RQZXJzb24pCglEZWNvbnN0cnVjdE1vdmllKCkKCVNldFBsYXllckludmluY2libGUoUGxheWVySWQoKSwgZmFsc2UpCiAgICAgICAgLS1DbGVhclJvb21Gb3JFbnRpdHkocGxheWVyUGVkKQogICAgICAgIE1vdmllU3RhdGUgPSBmYWxzZQogICAgICBlbmQKICAgIGlmIEdldFJvb21LZXlGcm9tRW50aXR5KFBsYXllclBlZElkKCkpID09IC0xMzM3ODA2Nzg5IHRoZW4KCSAtLVNldFBsYXllckludmlzaWJsZUxvY2FsbHkoUGxheWVySWQoKSwgIHRydWUpCgkgLS1TZXRFbnRpdHlWaXNpYmxlKFBsYXllclBlZElkKC0xKSwgZmFsc2UpCgkgU2V0UGxheWVySW52aW5jaWJsZShQbGF5ZXJJZCgpLCB0cnVlKQogICAgIAkgU2V0Q3VycmVudFBlZFdlYXBvbihQbGF5ZXJQZWRJZCgpLCBHZXRIYXNoS2V5KCJ3ZWFwb25fdW5hcm1lZCIpLCAxKQoJIFNldEZvbGxvd1BlZENhbVZpZXdNb2RlKDQpCgllbHNlCiAgICAgLS1TZXRFbnRpdHlWaXNpYmxlKFBsYXllclBlZElkKC0xKSwgdHJ1ZSkKCSBTZXRQbGF5ZXJJbnZpbmNpYmxlKFBsYXllcklkKCksIGZhbHNlKQoJZW5kCiAgICBlbmQKZW5kKQo=