@serenityjs/core 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.d.mts +14121 -0
- package/dist/index.d.ts +14121 -0
- package/dist/index.js +10 -0
- package/dist/index.mjs +10 -0
- package/package.json +41 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
var Ga=Object.defineProperty;var c=(e,t)=>Ga(e,"name",{value:t,configurable:!0});var Be=(e,t)=>{for(var a in t)Ga(e,a,{get:t[a],enumerable:!0})};import{CompressionMethod as Jp,MINECRAFT_VERSION as Yp,PROTOCOL_VERSION as Kp}from"@serenityjs/protocol";import{Logger as vs,LoggerColors as Zp}from"@serenityjs/logger";import{RAKNET_TPS as Qp}from"@serenityjs/raknet";import Xp from"@serenityjs/emitter";import{deflateRawSync as Ds,inflateRawSync as Ms}from"node:zlib";import{Emitter as As}from"@serenityjs/emitter";import{Frame as Ws,Priority as Ft,Reliability as Gs,Server as zs}from"@serenityjs/raknet";import{Logger as Ls,LoggerColors as Os}from"@serenityjs/logger";import{CompressionMethod as ee,DisconnectMessage as Hs,DisconnectPacket as La,DisconnectReason as Ns,Framer as $t,getPacketId as Rs,Packet as Fs,Packets as $s}from"@serenityjs/protocol";var Ie=function(e){return e[e.Server=0]="Server",e[e.Client=1]="Client",e}(Ie||{});var C=function(e){return e.PinkTulip="minecraft:pink_tulip",e.BuddingAmethyst="minecraft:budding_amethyst",e.LightBlueConcretePowder="minecraft:light_blue_concrete_powder",e.Gravel="minecraft:gravel",e.DetectorRail="minecraft:detector_rail",e.CyanTerracotta="minecraft:cyan_terracotta",e.HardPinkStainedGlass="minecraft:hard_pink_stained_glass",e.LightGrayCandle="minecraft:light_gray_candle",e.NetherGoldOre="minecraft:nether_gold_ore",e.PolishedBasalt="minecraft:polished_basalt",e.BlueCandle="minecraft:blue_candle",e.DarkOakWood="minecraft:dark_oak_wood",e.TuffBrickWall="minecraft:tuff_brick_wall",e.AcaciaWallSign="minecraft:acacia_wall_sign",e.BambooPressurePlate="minecraft:bamboo_pressure_plate",e.MelonBlock="minecraft:melon_block",e.RedWool="minecraft:red_wool",e.GoldOre="minecraft:gold_ore",e.BirchStandingSign="minecraft:birch_standing_sign",e.Element93="minecraft:element_93",e.WaxedCutCopperStairs="minecraft:waxed_cut_copper_stairs",e.Cornflower="minecraft:cornflower",e.RedNetherBrick="minecraft:red_nether_brick",e.OxidizedCutCopperStairs="minecraft:oxidized_cut_copper_stairs",e.WarpedDoor="minecraft:warped_door",e.PolishedGraniteStairs="minecraft:polished_granite_stairs",e.RedMushroomBlock="minecraft:red_mushroom_block",e.Element30="minecraft:element_30",e.DeadBubbleCoralWallFan="minecraft:dead_bubble_coral_wall_fan",e.BlueCarpet="minecraft:blue_carpet",e.BambooBlock="minecraft:bamboo_block",e.DeepslateBricks="minecraft:deepslate_bricks",e.WaxedCopper="minecraft:waxed_copper",e.WhiteWool="minecraft:white_wool",e.WoodenDoor="minecraft:wooden_door",e.PistonArmCollision="minecraft:piston_arm_collision",e.RedSandstoneSlab="minecraft:red_sandstone_slab",e.DarkPrismarineStairs="minecraft:dark_prismarine_stairs",e.EndBricks="minecraft:end_bricks",e.SculkShrieker="minecraft:sculk_shrieker",e.BambooMosaicStairs="minecraft:bamboo_mosaic_stairs",e.Vine="minecraft:vine",e.WaxedOxidizedChiseledCopper="minecraft:waxed_oxidized_chiseled_copper",e.WhiteTulip="minecraft:white_tulip",e.Granite="minecraft:granite",e.PolishedTuffSlab="minecraft:polished_tuff_slab",e.BrownMushroom="minecraft:brown_mushroom",e.CutCopperStairs="minecraft:cut_copper_stairs",e.BlueStainedGlassPane="minecraft:blue_stained_glass_pane",e.Element0="minecraft:element_0",e.ExposedCopperDoor="minecraft:exposed_copper_door",e.BlackstoneDoubleSlab="minecraft:blackstone_double_slab",e.SpruceStandingSign="minecraft:spruce_standing_sign",e.Element118="minecraft:element_118",e.FenceGate="minecraft:fence_gate",e.DeepslateTileSlab="minecraft:deepslate_tile_slab",e.PowderSnow="minecraft:powder_snow",e.MagentaCandle="minecraft:magenta_candle",e.DeepslateTileDoubleSlab="minecraft:deepslate_tile_double_slab",e.Calcite="minecraft:calcite",e.GrayTerracotta="minecraft:gray_terracotta",e.CyanCarpet="minecraft:cyan_carpet",e.CyanStainedGlass="minecraft:cyan_stained_glass",e.DarkOakButton="minecraft:dark_oak_button",e.DeepslateCopperOre="minecraft:deepslate_copper_ore",e.StoneBrickStairs="minecraft:stone_brick_stairs",e.WaxedOxidizedCutCopperSlab="minecraft:waxed_oxidized_cut_copper_slab",e.WarpedWallSign="minecraft:warped_wall_sign",e.Ladder="minecraft:ladder",e.ChiseledStoneBricks="minecraft:chiseled_stone_bricks",e.SprucePressurePlate="minecraft:spruce_pressure_plate",e.DiamondOre="minecraft:diamond_ore",e.WaxedOxidizedCutCopper="minecraft:waxed_oxidized_cut_copper",e.DeadHornCoralWallFan="minecraft:dead_horn_coral_wall_fan",e.GrayConcrete="minecraft:gray_concrete",e.Element73="minecraft:element_73",e.CobblestoneSlab="minecraft:cobblestone_slab",e.GreenTerracotta="minecraft:green_terracotta",e.HardPurpleStainedGlassPane="minecraft:hard_purple_stained_glass_pane",e.WaxedCopperTrapdoor="minecraft:waxed_copper_trapdoor",e.NetherBrickStairs="minecraft:nether_brick_stairs",e.HardBlueStainedGlassPane="minecraft:hard_blue_stained_glass_pane",e.YellowShulkerBox="minecraft:yellow_shulker_box",e.ChiseledCopper="minecraft:chiseled_copper",e.GraniteStairs="minecraft:granite_stairs",e.GrayWool="minecraft:gray_wool",e.GreenConcretePowder="minecraft:green_concrete_powder",e.LimeStainedGlass="minecraft:lime_stained_glass",e.OxidizedCopperBulb="minecraft:oxidized_copper_bulb",e.CobbledDeepslateStairs="minecraft:cobbled_deepslate_stairs",e.WaxedExposedCopper="minecraft:waxed_exposed_copper",e.StrippedAcaciaWood="minecraft:stripped_acacia_wood",e.Element16="minecraft:element_16",e.JungleButton="minecraft:jungle_button",e.DeadBubbleCoralFan="minecraft:dead_bubble_coral_fan",e.PoweredRepeater="minecraft:powered_repeater",e.SpruceStairs="minecraft:spruce_stairs",e.Loom="minecraft:loom",e.HardGreenStainedGlassPane="minecraft:hard_green_stained_glass_pane",e.Element104="minecraft:element_104",e.YellowStainedGlass="minecraft:yellow_stained_glass",e.OxidizedDoubleCutCopperSlab="minecraft:oxidized_double_cut_copper_slab",e.JungleDoor="minecraft:jungle_door",e.Diorite="minecraft:diorite",e.DarkoakWallSign="minecraft:darkoak_wall_sign",e.InfoUpdate2="minecraft:info_update2",e.DripstoneBlock="minecraft:dripstone_block",e.GrayCandleCake="minecraft:gray_candle_cake",e.ExposedCopperTrapdoor="minecraft:exposed_copper_trapdoor",e.BlueTerracotta="minecraft:blue_terracotta",e.HangingRoots="minecraft:hanging_roots",e.SmoothSandstone="minecraft:smooth_sandstone",e.PolishedBlackstoneButton="minecraft:polished_blackstone_button",e.StrippedBirchWood="minecraft:stripped_birch_wood",e.RedCandleCake="minecraft:red_candle_cake",e.MossyStoneBricks="minecraft:mossy_stone_bricks",e.HardLightBlueStainedGlassPane="minecraft:hard_light_blue_stained_glass_pane",e.CherryPressurePlate="minecraft:cherry_pressure_plate",e.HardBrownStainedGlass="minecraft:hard_brown_stained_glass",e.CherryHangingSign="minecraft:cherry_hanging_sign",e.YellowWool="minecraft:yellow_wool",e.BlackCandleCake="minecraft:black_candle_cake",e.CrimsonWallSign="minecraft:crimson_wall_sign",e.PolishedBlackstoneBrickStairs="minecraft:polished_blackstone_brick_stairs",e.LightBlock1="minecraft:light_block_1",e.Element46="minecraft:element_46",e.SmoothSandstoneSlab="minecraft:smooth_sandstone_slab",e.GrayCarpet="minecraft:gray_carpet",e.DarkOakDoor="minecraft:dark_oak_door",e.Wheat="minecraft:wheat",e.Grindstone="minecraft:grindstone",e.OakFence="minecraft:oak_fence",e.YellowStainedGlassPane="minecraft:yellow_stained_glass_pane",e.DarkOakSlab="minecraft:dark_oak_slab",e.PolishedGraniteDoubleSlab="minecraft:polished_granite_double_slab",e.HoneycombBlock="minecraft:honeycomb_block",e.EndGateway="minecraft:end_gateway",e.AzureBluet="minecraft:azure_bluet",e.StoneStairs="minecraft:stone_stairs",e.Beacon="minecraft:beacon",e.PolishedBlackstoneBrickWall="minecraft:polished_blackstone_brick_wall",e.SnowLayer="minecraft:snow_layer",e.HardPinkStainedGlassPane="minecraft:hard_pink_stained_glass_pane",e.BrickDoubleSlab="minecraft:brick_double_slab",e.WhiteCarpet="minecraft:white_carpet",e.BlackCandle="minecraft:black_candle",e.Cactus="minecraft:cactus",e.GlowFrame="minecraft:glow_frame",e.MudBrickDoubleSlab="minecraft:mud_brick_double_slab",e.BambooMosaicSlab="minecraft:bamboo_mosaic_slab",e.BambooFence="minecraft:bamboo_fence",e.DarkPrismarineSlab="minecraft:dark_prismarine_slab",e.PrismarineBricksStairs="minecraft:prismarine_bricks_stairs",e.Mycelium="minecraft:mycelium",e.DioriteSlab="minecraft:diorite_slab",e.RedConcrete="minecraft:red_concrete",e.CrimsonHyphae="minecraft:crimson_hyphae",e.BlackTerracotta="minecraft:black_terracotta",e.StrippedDarkOakLog="minecraft:stripped_dark_oak_log",e.HardOrangeStainedGlassPane="minecraft:hard_orange_stained_glass_pane",e.OxidizedCopperGrate="minecraft:oxidized_copper_grate",e.JungleLog="minecraft:jungle_log",e.BubbleCoralFan="minecraft:bubble_coral_fan",e.BambooSlab="minecraft:bamboo_slab",e.LitRedstoneOre="minecraft:lit_redstone_ore",e.NetherWart="minecraft:nether_wart",e.OrangeStainedGlassPane="minecraft:orange_stained_glass_pane",e.StrippedMangroveWood="minecraft:stripped_mangrove_wood",e.CutRedSandstone="minecraft:cut_red_sandstone",e.LimeShulkerBox="minecraft:lime_shulker_box",e.HardBlackStainedGlassPane="minecraft:hard_black_stained_glass_pane",e.SmoothRedSandstone="minecraft:smooth_red_sandstone",e.LilyOfTheValley="minecraft:lily_of_the_valley",e.BlueOrchid="minecraft:blue_orchid",e.LimeGlazedTerracotta="minecraft:lime_glazed_terracotta",e.Trapdoor="minecraft:trapdoor",e.HardGlassPane="minecraft:hard_glass_pane",e.DeadBrainCoralFan="minecraft:dead_brain_coral_fan",e.AcaciaStandingSign="minecraft:acacia_standing_sign",e.UndyedShulkerBox="minecraft:undyed_shulker_box",e.QuartzOre="minecraft:quartz_ore",e.InfoUpdate="minecraft:info_update",e.Seagrass="minecraft:seagrass",e.TubeCoralFan="minecraft:tube_coral_fan",e.Unknown="minecraft:unknown",e.CherryStairs="minecraft:cherry_stairs",e.Barrel="minecraft:barrel",e.BigDripleaf="minecraft:big_dripleaf",e.QuartzSlab="minecraft:quartz_slab",e.FireCoralBlock="minecraft:fire_coral_block",e.WaxedExposedCutCopperSlab="minecraft:waxed_exposed_cut_copper_slab",e.DeadHornCoral="minecraft:dead_horn_coral",e.InfestedMossyStoneBricks="minecraft:infested_mossy_stone_bricks",e.Element68="minecraft:element_68",e.RedstoneLamp="minecraft:redstone_lamp",e.MossyCobblestone="minecraft:mossy_cobblestone",e.Element113="minecraft:element_113",e.BlueStainedGlass="minecraft:blue_stained_glass",e.Cake="minecraft:cake",e.DarkOakDoubleSlab="minecraft:dark_oak_double_slab",e.StrippedCrimsonHyphae="minecraft:stripped_crimson_hyphae",e.DarkOakHangingSign="minecraft:dark_oak_hanging_sign",e.GreenConcrete="minecraft:green_concrete",e.Deepslate="minecraft:deepslate",e.StrippedOakWood="minecraft:stripped_oak_wood",e.PurpurSlab="minecraft:purpur_slab",e.MagentaCarpet="minecraft:magenta_carpet",e.PitcherCrop="minecraft:pitcher_crop",e.BrownWool="minecraft:brown_wool",e.PinkWool="minecraft:pink_wool",e.WarpedStandingSign="minecraft:warped_standing_sign",e.Deadbush="minecraft:deadbush",e.EnderChest="minecraft:ender_chest",e.WaxedExposedChiseledCopper="minecraft:waxed_exposed_chiseled_copper",e.TuffSlab="minecraft:tuff_slab",e.RedstoneWire="minecraft:redstone_wire",e.WarpedPressurePlate="minecraft:warped_pressure_plate",e.GreenCandleCake="minecraft:green_candle_cake",e.DiamondBlock="minecraft:diamond_block",e.ExposedCopperBulb="minecraft:exposed_copper_bulb",e.Element58="minecraft:element_58",e.BambooMosaicDoubleSlab="minecraft:bamboo_mosaic_double_slab",e.DarkPrismarineDoubleSlab="minecraft:dark_prismarine_double_slab",e.CryingObsidian="minecraft:crying_obsidian",e.OakStairs="minecraft:oak_stairs",e.HardGrayStainedGlass="minecraft:hard_gray_stained_glass",e.OakLog="minecraft:oak_log",e.WaxedWeatheredCutCopper="minecraft:waxed_weathered_cut_copper",e.Andesite="minecraft:andesite",e.BrownStainedGlassPane="minecraft:brown_stained_glass_pane",e.SculkVein="minecraft:sculk_vein",e.PinkStainedGlassPane="minecraft:pink_stained_glass_pane",e.ExposedDoubleCutCopperSlab="minecraft:exposed_double_cut_copper_slab",e.CandleCake="minecraft:candle_cake",e.MagentaShulkerBox="minecraft:magenta_shulker_box",e.PurpleTerracotta="minecraft:purple_terracotta",e.SmoothQuartz="minecraft:smooth_quartz",e.PackedIce="minecraft:packed_ice",e.IronBars="minecraft:iron_bars",e.OxidizedCutCopper="minecraft:oxidized_cut_copper",e.PolishedGranite="minecraft:polished_granite",e.Element39="minecraft:element_39",e.LightBlueStainedGlass="minecraft:light_blue_stained_glass",e.Fern="minecraft:fern",e.PackedMud="minecraft:packed_mud",e.LightBlueCandleCake="minecraft:light_blue_candle_cake",e.Element1="minecraft:element_1",e.Poppy="minecraft:poppy",e.MossCarpet="minecraft:moss_carpet",e.CrimsonStairs="minecraft:crimson_stairs",e.GreenStainedGlassPane="minecraft:green_stained_glass_pane",e.WarpedFungus="minecraft:warped_fungus",e.Element102="minecraft:element_102",e.StoneBrickDoubleSlab="minecraft:stone_brick_double_slab",e.CopperOre="minecraft:copper_ore",e.GrayCandle="minecraft:gray_candle",e.PolishedDeepslateSlab="minecraft:polished_deepslate_slab",e.BambooDoor="minecraft:bamboo_door",e.BlackConcretePowder="minecraft:black_concrete_powder",e.MelonStem="minecraft:melon_stem",e.AmethystBlock="minecraft:amethyst_block",e.GoldBlock="minecraft:gold_block",e.StrippedOakLog="minecraft:stripped_oak_log",e.FlowerPot="minecraft:flower_pot",e.ChiseledBookshelf="minecraft:chiseled_bookshelf",e.JungleFence="minecraft:jungle_fence",e.SpruceLog="minecraft:spruce_log",e.PolishedDeepslateStairs="minecraft:polished_deepslate_stairs",e.HardLimeStainedGlass="minecraft:hard_lime_stained_glass",e.ShortGrass="minecraft:short_grass",e.LapisBlock="minecraft:lapis_block",e.WeatheredChiseledCopper="minecraft:weathered_chiseled_copper",e.CoarseDirt="minecraft:coarse_dirt",e.SmallAmethystBud="minecraft:small_amethyst_bud",e.ActivatorRail="minecraft:activator_rail",e.Podzol="minecraft:podzol",e.MangroveButton="minecraft:mangrove_button",e.IronTrapdoor="minecraft:iron_trapdoor",e.Potatoes="minecraft:potatoes",e.LargeAmethystBud="minecraft:large_amethyst_bud",e.MuddyMangroveRoots="minecraft:muddy_mangrove_roots",e.HardLightBlueStainedGlass="minecraft:hard_light_blue_stained_glass",e.TrialSpawner="minecraft:trial_spawner",e.StrippedJungleWood="minecraft:stripped_jungle_wood",e.DeadTubeCoralBlock="minecraft:dead_tube_coral_block",e.Noteblock="minecraft:noteblock",e.Tuff="minecraft:tuff",e.Reserved6="minecraft:reserved6",e.SoulTorch="minecraft:soul_torch",e.QuartzBricks="minecraft:quartz_bricks",e.MangroveLog="minecraft:mangrove_log",e.SandstoneSlab="minecraft:sandstone_slab",e.WhiteShulkerBox="minecraft:white_shulker_box",e.BirchWood="minecraft:birch_wood",e.PolishedBlackstonePressurePlate="minecraft:polished_blackstone_pressure_plate",e.MossyStoneBrickSlab="minecraft:mossy_stone_brick_slab",e.RawGoldBlock="minecraft:raw_gold_block",e.Allium="minecraft:allium",e.CrackedPolishedBlackstoneBricks="minecraft:cracked_polished_blackstone_bricks",e.MobSpawner="minecraft:mob_spawner",e.CopperGrate="minecraft:copper_grate",e.WeatheredDoubleCutCopperSlab="minecraft:weathered_double_cut_copper_slab",e.DeepslateTiles="minecraft:deepslate_tiles",e.BlackWool="minecraft:black_wool",e.Lava="minecraft:lava",e.LightBlock14="minecraft:light_block_14",e.AcaciaFenceGate="minecraft:acacia_fence_gate",e.CyanCandleCake="minecraft:cyan_candle_cake",e.OrangeCandle="minecraft:orange_candle",e.ColoredTorchBp="minecraft:colored_torch_bp",e.Scaffolding="minecraft:scaffolding",e.PoweredComparator="minecraft:powered_comparator",e.LightBlock8="minecraft:light_block_8",e.SpruceSapling="minecraft:spruce_sapling",e.CutSandstoneDoubleSlab="minecraft:cut_sandstone_double_slab",e.BlastFurnace="minecraft:blast_furnace",e.CutSandstoneSlab="minecraft:cut_sandstone_slab",e.SpruceFence="minecraft:spruce_fence",e.HardYellowStainedGlassPane="minecraft:hard_yellow_stained_glass_pane",e.HardGreenStainedGlass="minecraft:hard_green_stained_glass",e.DarkOakSapling="minecraft:dark_oak_sapling",e.SandstoneDoubleSlab="minecraft:sandstone_double_slab",e.PinkPetals="minecraft:pink_petals",e.SoulFire="minecraft:soul_fire",e.PinkCarpet="minecraft:pink_carpet",e.MangroveDoubleSlab="minecraft:mangrove_double_slab",e.BrownCarpet="minecraft:brown_carpet",e.GreenCandle="minecraft:green_candle",e.PurpleStainedGlassPane="minecraft:purple_stained_glass_pane",e.SmoothQuartzDoubleSlab="minecraft:smooth_quartz_double_slab",e.OxidizedCopperTrapdoor="minecraft:oxidized_copper_trapdoor",e.LightGrayStainedGlass="minecraft:light_gray_stained_glass",e.BrainCoral="minecraft:brain_coral",e.Obsidian="minecraft:obsidian",e.Chest="minecraft:chest",e.DeadBubbleCoralBlock="minecraft:dead_bubble_coral_block",e.LightGrayStainedGlassPane="minecraft:light_gray_stained_glass_pane",e.BlackstoneSlab="minecraft:blackstone_slab",e.StrippedSpruceWood="minecraft:stripped_spruce_wood",e.Cauldron="minecraft:cauldron",e.Glowingobsidian="minecraft:glowingobsidian",e.DeepslateBrickWall="minecraft:deepslate_brick_wall",e.DarkoakStandingSign="minecraft:darkoak_standing_sign",e.WaxedExposedCopperGrate="minecraft:waxed_exposed_copper_grate",e.TubeCoralBlock="minecraft:tube_coral_block",e.AcaciaPlanks="minecraft:acacia_planks",e.Element85="minecraft:element_85",e.JungleWallSign="minecraft:jungle_wall_sign",e.EndBrickStairs="minecraft:end_brick_stairs",e.PolishedBlackstoneDoubleSlab="minecraft:polished_blackstone_double_slab",e.OrangeCarpet="minecraft:orange_carpet",e.ExposedCopper="minecraft:exposed_copper",e.PolishedDeepslateDoubleSlab="minecraft:polished_deepslate_double_slab",e.NetherBrickSlab="minecraft:nether_brick_slab",e.HeavyWeightedPressurePlate="minecraft:heavy_weighted_pressure_plate",e.Element89="minecraft:element_89",e.StoneButton="minecraft:stone_button",e.Stone="minecraft:stone",e.RedNetherBrickDoubleSlab="minecraft:red_nether_brick_double_slab",e.PitcherPlant="minecraft:pitcher_plant",e.Element101="minecraft:element_101",e.WaxedCopperBulb="minecraft:waxed_copper_bulb",e.AndesiteStairs="minecraft:andesite_stairs",e.Sponge="minecraft:sponge",e.BoneBlock="minecraft:bone_block",e.NormalStoneStairs="minecraft:normal_stone_stairs",e.WarpedHangingSign="minecraft:warped_hanging_sign",e.GreenStainedGlass="minecraft:green_stained_glass",e.DioriteDoubleSlab="minecraft:diorite_double_slab",e.GrayStainedGlassPane="minecraft:gray_stained_glass_pane",e.EndStoneBrickSlab="minecraft:end_stone_brick_slab",e.Frame="minecraft:frame",e.Smoker="minecraft:smoker",e.HardenedClay="minecraft:hardened_clay",e.BirchHangingSign="minecraft:birch_hanging_sign",e.PolishedTuffWall="minecraft:polished_tuff_wall",e.UnlitRedstoneTorch="minecraft:unlit_redstone_torch",e.StrippedJungleLog="minecraft:stripped_jungle_log",e.LapisOre="minecraft:lapis_ore",e.HardBlueStainedGlass="minecraft:hard_blue_stained_glass",e.PolishedGraniteSlab="minecraft:polished_granite_slab",e.LightBlock9="minecraft:light_block_9",e.OxidizedCutCopperSlab="minecraft:oxidized_cut_copper_slab",e.Beehive="minecraft:beehive",e.LimeStainedGlassPane="minecraft:lime_stained_glass_pane",e.LightBlock7="minecraft:light_block_7",e.CherryDoubleSlab="minecraft:cherry_double_slab",e.LightBlock6="minecraft:light_block_6",e.LightBlock5="minecraft:light_block_5",e.WaxedOxidizedCutCopperStairs="minecraft:waxed_oxidized_cut_copper_stairs",e.LightBlock4="minecraft:light_block_4",e.WarpedRoots="minecraft:warped_roots",e.SmallDripleafBlock="minecraft:small_dripleaf_block",e.GreenWool="minecraft:green_wool",e.LimeCandleCake="minecraft:lime_candle_cake",e.MangroveLeaves="minecraft:mangrove_leaves",e.LightBlock3="minecraft:light_block_3",e.AcaciaLeaves="minecraft:acacia_leaves",e.Barrier="minecraft:barrier",e.RawIronBlock="minecraft:raw_iron_block",e.Dispenser="minecraft:dispenser",e.CrimsonRoots="minecraft:crimson_roots",e.LightBlock2="minecraft:light_block_2",e.LightBlock0="minecraft:light_block_0",e.Stonecutter="minecraft:stonecutter",e.AndesiteDoubleSlab="minecraft:andesite_double_slab",e.UnpoweredRepeater="minecraft:unpowered_repeater",e.OakSapling="minecraft:oak_sapling",e.LightGrayTerracotta="minecraft:light_gray_terracotta",e.PinkStainedGlass="minecraft:pink_stained_glass",e.HardMagentaStainedGlassPane="minecraft:hard_magenta_stained_glass_pane",e.BrownStainedGlass="minecraft:brown_stained_glass",e.FireCoral="minecraft:fire_coral",e.CobbledDeepslate="minecraft:cobbled_deepslate",e.Element99="minecraft:element_99",e.BirchLog="minecraft:birch_log",e.OrangeStainedGlass="minecraft:orange_stained_glass",e.OrangeWool="minecraft:orange_wool",e.PolishedBlackstoneBrickDoubleSlab="minecraft:polished_blackstone_brick_double_slab",e.BubbleCoralBlock="minecraft:bubble_coral_block",e.CrimsonDoubleSlab="minecraft:crimson_double_slab",e.Kelp="minecraft:kelp",e.UnderwaterTorch="minecraft:underwater_torch",e.RespawnAnchor="minecraft:respawn_anchor",e.DeadFireCoralWallFan="minecraft:dead_fire_coral_wall_fan",e.LightGrayConcrete="minecraft:light_gray_concrete",e.BirchPlanks="minecraft:birch_planks",e.SeaPickle="minecraft:sea_pickle",e.RedSandstoneDoubleSlab="minecraft:red_sandstone_double_slab",e.Element74="minecraft:element_74",e.RedSand="minecraft:red_sand",e.HayBlock="minecraft:hay_block",e.SuspiciousGravel="minecraft:suspicious_gravel",e.HeavyCore="minecraft:heavy_core",e.JungleWood="minecraft:jungle_wood",e.RedStainedGlass="minecraft:red_stained_glass",e.PurpleShulkerBox="minecraft:purple_shulker_box",e.PolishedTuffDoubleSlab="minecraft:polished_tuff_double_slab",e.OxidizedCopperDoor="minecraft:oxidized_copper_door",e.WaxedWeatheredCopper="minecraft:waxed_weathered_copper",e.ChiseledQuartzBlock="minecraft:chiseled_quartz_block",e.InfestedCrackedStoneBricks="minecraft:infested_cracked_stone_bricks",e.LightBlueTerracotta="minecraft:light_blue_terracotta",e.DeepslateBrickSlab="minecraft:deepslate_brick_slab",e.FloweringAzalea="minecraft:flowering_azalea",e.InvisibleBedrock="minecraft:invisible_bedrock",e.OakLeaves="minecraft:oak_leaves",e.BrainCoralFan="minecraft:brain_coral_fan",e.BambooStairs="minecraft:bamboo_stairs",e.Torch="minecraft:torch",e.GlowLichen="minecraft:glow_lichen",e.CopperTrapdoor="minecraft:copper_trapdoor",e.RedCandle="minecraft:red_candle",e.MudBrickWall="minecraft:mud_brick_wall",e.HoneyBlock="minecraft:honey_block",e.CherryTrapdoor="minecraft:cherry_trapdoor",e.BrownConcrete="minecraft:brown_concrete",e.LitPumpkin="minecraft:lit_pumpkin",e.PinkConcrete="minecraft:pink_concrete",e.YellowGlazedTerracotta="minecraft:yellow_glazed_terracotta",e.SmoothBasalt="minecraft:smooth_basalt",e.WarpedPlanks="minecraft:warped_planks",e.Piston="minecraft:piston",e.CherryFence="minecraft:cherry_fence",e.MangrovePlanks="minecraft:mangrove_planks",e.HardLightGrayStainedGlassPane="minecraft:hard_light_gray_stained_glass_pane",e.RedTerracotta="minecraft:red_terracotta",e.Water="minecraft:water",e.WeatheredCopperTrapdoor="minecraft:weathered_copper_trapdoor",e.Element77="minecraft:element_77",e.WeatheredCopperGrate="minecraft:weathered_copper_grate",e.SpruceButton="minecraft:spruce_button",e.WallBanner="minecraft:wall_banner",e.DeadFireCoralBlock="minecraft:dead_fire_coral_block",e.MagentaWool="minecraft:magenta_wool",e.WaxedWeatheredCopperGrate="minecraft:waxed_weathered_copper_grate",e.WaxedWeatheredCopperBulb="minecraft:waxed_weathered_copper_bulb",e.VerdantFroglight="minecraft:verdant_froglight",e.MossyCobblestoneSlab="minecraft:mossy_cobblestone_slab",e.MagentaGlazedTerracotta="minecraft:magenta_glazed_terracotta",e.PolishedAndesite="minecraft:polished_andesite",e.PurpleStainedGlass="minecraft:purple_stained_glass",e.QuartzDoubleSlab="minecraft:quartz_double_slab",e.MangroveSlab="minecraft:mangrove_slab",e.WallSign="minecraft:wall_sign",e.InfestedDeepslate="minecraft:infested_deepslate",e.OrangeGlazedTerracotta="minecraft:orange_glazed_terracotta",e.BirchSapling="minecraft:birch_sapling",e.ClientRequestPlaceholderBlock="minecraft:client_request_placeholder_block",e.HardBrownStainedGlassPane="minecraft:hard_brown_stained_glass_pane",e.Torchflower="minecraft:torchflower",e.SporeBlossom="minecraft:spore_blossom",e.Waterlily="minecraft:waterlily",e.EmeraldBlock="minecraft:emerald_block",e.Conduit="minecraft:conduit",e.Anvil="minecraft:anvil",e.SuspiciousSand="minecraft:suspicious_sand",e.AncientDebris="minecraft:ancient_debris",e.DarkOakPlanks="minecraft:dark_oak_planks",e.JungleLeaves="minecraft:jungle_leaves",e.LightningRod="minecraft:lightning_rod",e.NetherBrickFence="minecraft:nether_brick_fence",e.BlackStainedGlassPane="minecraft:black_stained_glass_pane",e.MagentaConcrete="minecraft:magenta_concrete",e.CobblestoneWall="minecraft:cobblestone_wall",e.LightBlueStainedGlassPane="minecraft:light_blue_stained_glass_pane",e.DeepslateBrickDoubleSlab="minecraft:deepslate_brick_double_slab",e.TubeCoralWallFan="minecraft:tube_coral_wall_fan",e.SpruceDoubleSlab="minecraft:spruce_double_slab",e.RedSandstone="minecraft:red_sandstone",e.DarkOakLog="minecraft:dark_oak_log",e.OakPlanks="minecraft:oak_planks",e.RedstoneOre="minecraft:redstone_ore",e.AcaciaHangingSign="minecraft:acacia_hanging_sign",e.LightBlock13="minecraft:light_block_13",e.OchreFroglight="minecraft:ochre_froglight",e.PolishedBlackstoneStairs="minecraft:polished_blackstone_stairs",e.TuffWall="minecraft:tuff_wall",e.MangrovePressurePlate="minecraft:mangrove_pressure_plate",e.Observer="minecraft:observer",e.PinkGlazedTerracotta="minecraft:pink_glazed_terracotta",e.YellowTerracotta="minecraft:yellow_terracotta",e.BrownGlazedTerracotta="minecraft:brown_glazed_terracotta",e.BrownCandleCake="minecraft:brown_candle_cake",e.PinkCandleCake="minecraft:pink_candle_cake",e.QuartzBlock="minecraft:quartz_block",e.RedstoneTorch="minecraft:redstone_torch",e.BirchLeaves="minecraft:birch_leaves",e.SilverGlazedTerracotta="minecraft:silver_glazed_terracotta",e.CyanConcretePowder="minecraft:cyan_concrete_powder",e.OxidizedCopper="minecraft:oxidized_copper",e.BirchPressurePlate="minecraft:birch_pressure_plate",e.Element19="minecraft:element_19",e.SandstoneStairs="minecraft:sandstone_stairs",e.StrippedBambooBlock="minecraft:stripped_bamboo_block",e.CrackedStoneBricks="minecraft:cracked_stone_bricks",e.DeadTubeCoralWallFan="minecraft:dead_tube_coral_wall_fan",e.BirchFenceGate="minecraft:birch_fence_gate",e.SculkCatalyst="minecraft:sculk_catalyst",e.Element115="minecraft:element_115",e.Cobblestone="minecraft:cobblestone",e.HornCoral="minecraft:horn_coral",e.WhiteConcretePowder="minecraft:white_concrete_powder",e.YellowConcrete="minecraft:yellow_concrete",e.OakDoubleSlab="minecraft:oak_double_slab",e.StrippedWarpedStem="minecraft:stripped_warped_stem",e.DaylightDetector="minecraft:daylight_detector",e.SmoothSandstoneStairs="minecraft:smooth_sandstone_stairs",e.JunglePressurePlate="minecraft:jungle_pressure_plate",e.HardWhiteStainedGlass="minecraft:hard_white_stained_glass",e.DoubleCutCopperSlab="minecraft:double_cut_copper_slab",e.BirchButton="minecraft:birch_button",e.CrimsonPlanks="minecraft:crimson_planks",e.Sandstone="minecraft:sandstone",e.BlackstoneWall="minecraft:blackstone_wall",e.LightWeightedPressurePlate="minecraft:light_weighted_pressure_plate",e.PolishedBlackstone="minecraft:polished_blackstone",e.Bamboo="minecraft:bamboo",e.RedNetherBrickSlab="minecraft:red_nether_brick_slab",e.IronOre="minecraft:iron_ore",e.WaxedWeatheredChiseledCopper="minecraft:waxed_weathered_chiseled_copper",e.Element17="minecraft:element_17",e.StickyPistonArmCollision="minecraft:sticky_piston_arm_collision",e.Element51="minecraft:element_51",e.GrayStainedGlass="minecraft:gray_stained_glass",e.ExposedCutCopperSlab="minecraft:exposed_cut_copper_slab",e.Element52="minecraft:element_52",e.WarpedStairs="minecraft:warped_stairs",e.Bedrock="minecraft:bedrock",e.SmithingTable="minecraft:smithing_table",e.LightBlock10="minecraft:light_block_10",e.TuffBrickSlab="minecraft:tuff_brick_slab",e.RoseBush="minecraft:rose_bush",e.GreenCarpet="minecraft:green_carpet",e.PurpleCandleCake="minecraft:purple_candle_cake",e.PrismarineBrickSlab="minecraft:prismarine_brick_slab",e.CyanConcrete="minecraft:cyan_concrete",e.NetheriteBlock="minecraft:netherite_block",e.RedstoneBlock="minecraft:redstone_block",e.PolishedBlackstoneWall="minecraft:polished_blackstone_wall",e.QuartzPillar="minecraft:quartz_pillar",e.WaxedExposedCutCopper="minecraft:waxed_exposed_cut_copper",e.GildedBlackstone="minecraft:gilded_blackstone",e.JungleHangingSign="minecraft:jungle_hanging_sign",e.BlueConcretePowder="minecraft:blue_concrete_powder",e.CherryWood="minecraft:cherry_wood",e.BirchSlab="minecraft:birch_slab",e.EndStone="minecraft:end_stone",e.CrimsonDoor="minecraft:crimson_door",e.JungleSlab="minecraft:jungle_slab",e.WaxedOxidizedCopper="minecraft:waxed_oxidized_copper",e.Glowstone="minecraft:glowstone",e.StonePressurePlate="minecraft:stone_pressure_plate",e.QuartzStairs="minecraft:quartz_stairs",e.WaxedExposedCutCopperStairs="minecraft:waxed_exposed_cut_copper_stairs",e.HardLimeStainedGlassPane="minecraft:hard_lime_stained_glass_pane",e.MudBrickSlab="minecraft:mud_brick_slab",e.CrackedDeepslateTiles="minecraft:cracked_deepslate_tiles",e.Farmland="minecraft:farmland",e.DeadBrainCoralWallFan="minecraft:dead_brain_coral_wall_fan",e.PinkCandle="minecraft:pink_candle",e.NormalStoneDoubleSlab="minecraft:normal_stone_double_slab",e.BrownCandle="minecraft:brown_candle",e.LightBlock12="minecraft:light_block_12",e.Rail="minecraft:rail",e.SoulLantern="minecraft:soul_lantern",e.Carrots="minecraft:carrots",e.AcaciaTrapdoor="minecraft:acacia_trapdoor",e.StoneBricks="minecraft:stone_bricks",e.MossyCobblestoneStairs="minecraft:mossy_cobblestone_stairs",e.HardMagentaStainedGlass="minecraft:hard_magenta_stained_glass",e.PinkTerracotta="minecraft:pink_terracotta",e.WaxedWeatheredCopperDoor="minecraft:waxed_weathered_copper_door",e.DarkPrismarine="minecraft:dark_prismarine",e.InfestedCobblestone="minecraft:infested_cobblestone",e.BrainCoralWallFan="minecraft:brain_coral_wall_fan",e.MangroveWood="minecraft:mangrove_wood",e.CraftingTable="minecraft:crafting_table",e.RedGlazedTerracotta="minecraft:red_glazed_terracotta",e.DarkOakFenceGate="minecraft:dark_oak_fence_gate",e.CherryButton="minecraft:cherry_button",e.CrimsonNylium="minecraft:crimson_nylium",e.WarpedDoubleSlab="minecraft:warped_double_slab",e.StructureVoid="minecraft:structure_void",e.BambooFenceGate="minecraft:bamboo_fence_gate",e.PurpleConcrete="minecraft:purple_concrete",e.WhiteStainedGlassPane="minecraft:white_stained_glass_pane",e.WaxedExposedCopperBulb="minecraft:waxed_exposed_copper_bulb",e.BubbleCoral="minecraft:bubble_coral",e.CoalOre="minecraft:coal_ore",e.PolishedBlackstoneBrickSlab="minecraft:polished_blackstone_brick_slab",e.NormalStoneSlab="minecraft:normal_stone_slab",e.PurpleCandle="minecraft:purple_candle",e.Snow="minecraft:snow",e.CalibratedSculkSensor="minecraft:calibrated_sculk_sensor",e.YellowConcretePowder="minecraft:yellow_concrete_powder",e.OakSlab="minecraft:oak_slab",e.Sand="minecraft:sand",e.MangroveStandingSign="minecraft:mangrove_standing_sign",e.Slime="minecraft:slime",e.Element117="minecraft:element_117",e.JungleStairs="minecraft:jungle_stairs",e.MossyStoneBrickDoubleSlab="minecraft:mossy_stone_brick_double_slab",e.CutRedSandstoneDoubleSlab="minecraft:cut_red_sandstone_double_slab",e.AzaleaLeaves="minecraft:azalea_leaves",e.BambooDoubleSlab="minecraft:bamboo_double_slab",e.ChiseledPolishedBlackstone="minecraft:chiseled_polished_blackstone",e.SmoothStoneSlab="minecraft:smooth_stone_slab",e.InfestedChiseledStoneBricks="minecraft:infested_chiseled_stone_bricks",e.BrownConcretePowder="minecraft:brown_concrete_powder",e.PinkConcretePowder="minecraft:pink_concrete_powder",e.CrackedDeepslateBricks="minecraft:cracked_deepslate_bricks",e.DeadTubeCoral="minecraft:dead_tube_coral",e.AcaciaDoor="minecraft:acacia_door",e.OrangeShulkerBox="minecraft:orange_shulker_box",e.NetherWartBlock="minecraft:nether_wart_block",e.LightBlueGlazedTerracotta="minecraft:light_blue_glazed_terracotta",e.PrismarineSlab="minecraft:prismarine_slab",e.PrismarineDoubleSlab="minecraft:prismarine_double_slab",e.LightBlock11="minecraft:light_block_11",e.CherryDoor="minecraft:cherry_door",e.WeatheredCutCopperStairs="minecraft:weathered_cut_copper_stairs",e.AcaciaLog="minecraft:acacia_log",e.FlowingLava="minecraft:flowing_lava",e.WhiteTerracotta="minecraft:white_terracotta",e.CrimsonTrapdoor="minecraft:crimson_trapdoor",e.BlueShulkerBox="minecraft:blue_shulker_box",e.Basalt="minecraft:basalt",e.WaxedWeatheredCopperTrapdoor="minecraft:waxed_weathered_copper_trapdoor",e.HardCyanStainedGlass="minecraft:hard_cyan_stained_glass",e.PolishedDiorite="minecraft:polished_diorite",e.Element13="minecraft:element_13",e.CyanGlazedTerracotta="minecraft:cyan_glazed_terracotta",e.LitRedstoneLamp="minecraft:lit_redstone_lamp",e.HardPurpleStainedGlass="minecraft:hard_purple_stained_glass",e.YellowCandleCake="minecraft:yellow_candle_cake",e.StickyPiston="minecraft:sticky_piston",e.MediumAmethystBud="minecraft:medium_amethyst_bud",e.BrownShulkerBox="minecraft:brown_shulker_box",e.PinkShulkerBox="minecraft:pink_shulker_box",e.LightBlueCandle="minecraft:light_blue_candle",e.DeepslateTileStairs="minecraft:deepslate_tile_stairs",e.SculkSensor="minecraft:sculk_sensor",e.CopperBulb="minecraft:copper_bulb",e.Element6="minecraft:element_6",e.Element97="minecraft:element_97",e.DioriteStairs="minecraft:diorite_stairs",e.SmoothStoneDoubleSlab="minecraft:smooth_stone_double_slab",e.SpruceLeaves="minecraft:spruce_leaves",e.RedStainedGlassPane="minecraft:red_stained_glass_pane",e.FrogSpawn="minecraft:frog_spawn",e.Element111="minecraft:element_111",e.CrimsonFenceGate="minecraft:crimson_fence_gate",e.RedCarpet="minecraft:red_carpet",e.SmoothSandstoneDoubleSlab="minecraft:smooth_sandstone_double_slab",e.RedShulkerBox="minecraft:red_shulker_box",e.DirtWithRoots="minecraft:dirt_with_roots",e.StrippedCherryLog="minecraft:stripped_cherry_log",e.HornCoralWallFan="minecraft:horn_coral_wall_fan",e.CopperDoor="minecraft:copper_door",e.CrimsonButton="minecraft:crimson_button",e.MagentaConcretePowder="minecraft:magenta_concrete_powder",e.PrismarineStairs="minecraft:prismarine_stairs",e.IronDoor="minecraft:iron_door",e.MangroveTrapdoor="minecraft:mangrove_trapdoor",e.DaylightDetectorInverted="minecraft:daylight_detector_inverted",e.JunglePlanks="minecraft:jungle_planks",e.ChorusFlower="minecraft:chorus_flower",e.TorchflowerCrop="minecraft:torchflower_crop",e.CrackedNetherBricks="minecraft:cracked_nether_bricks",e.Pumpkin="minecraft:pumpkin",e.SmoothStone="minecraft:smooth_stone",e.GraniteSlab="minecraft:granite_slab",e.LimeConcrete="minecraft:lime_concrete",e.WaxedWeatheredCutCopperSlab="minecraft:waxed_weathered_cut_copper_slab",e.RedMushroom="minecraft:red_mushroom",e.HardYellowStainedGlass="minecraft:hard_yellow_stained_glass",e.MagentaTerracotta="minecraft:magenta_terracotta",e.BlackCarpet="minecraft:black_carpet",e.ExposedCutCopperStairs="minecraft:exposed_cut_copper_stairs",e.MangroveStairs="minecraft:mangrove_stairs",e.PolishedDioriteSlab="minecraft:polished_diorite_slab",e.RedSandstoneStairs="minecraft:red_sandstone_stairs",e.LightBlueConcrete="minecraft:light_blue_concrete",e.MangroveFenceGate="minecraft:mangrove_fence_gate",e.BubbleColumn="minecraft:bubble_column",e.Sunflower="minecraft:sunflower",e.Allow="minecraft:allow",e.GrayConcretePowder="minecraft:gray_concrete_powder",e.BambooHangingSign="minecraft:bamboo_hanging_sign",e.WitherRose="minecraft:wither_rose",e.CopperBlock="minecraft:copper_block",e.BirchDoubleSlab="minecraft:birch_double_slab",e.WaxedWeatheredDoubleCutCopperSlab="minecraft:waxed_weathered_double_cut_copper_slab",e.PolishedBlackstoneBricks="minecraft:polished_blackstone_bricks",e.CutCopper="minecraft:cut_copper",e.FrostedIce="minecraft:frosted_ice",e.SpruceDoor="minecraft:spruce_door",e.ChiseledSandstone="minecraft:chiseled_sandstone",e.ChippedAnvil="minecraft:chipped_anvil",e.WarpedTrapdoor="minecraft:warped_trapdoor",e.OrangeConcretePowder="minecraft:orange_concrete_powder",e.FlowingWater="minecraft:flowing_water",e.BrickBlock="minecraft:brick_block",e.HardGlass="minecraft:hard_glass",e.CaveVines="minecraft:cave_vines",e.MagentaStainedGlassPane="minecraft:magenta_stained_glass_pane",e.Element62="minecraft:element_62",e.LightBlueCarpet="minecraft:light_blue_carpet",e.OakHangingSign="minecraft:oak_hanging_sign",e.StrippedDarkOakWood="minecraft:stripped_dark_oak_wood",e.WhiteStainedGlass="minecraft:white_stained_glass",e.OakWood="minecraft:oak_wood",e.WaxedExposedDoubleCutCopperSlab="minecraft:waxed_exposed_double_cut_copper_slab",e.WaxedOxidizedCopperTrapdoor="minecraft:waxed_oxidized_copper_trapdoor",e.Jukebox="minecraft:jukebox",e.StrippedCherryWood="minecraft:stripped_cherry_wood",e.AcaciaPressurePlate="minecraft:acacia_pressure_plate",e.SmoothRedSandstoneSlab="minecraft:smooth_red_sandstone_slab",e.Jigsaw="minecraft:jigsaw",e.BorderBlock="minecraft:border_block",e.Shroomlight="minecraft:shroomlight",e.YellowCandle="minecraft:yellow_candle",e.DarkOakStairs="minecraft:dark_oak_stairs",e.DeepslateTileWall="minecraft:deepslate_tile_wall",e.GlassPane="minecraft:glass_pane",e.ChiseledDeepslate="minecraft:chiseled_deepslate",e.CutCopperSlab="minecraft:cut_copper_slab",e.InfestedStoneBricks="minecraft:infested_stone_bricks",e.BambooTrapdoor="minecraft:bamboo_trapdoor",e.OxidizedChiseledCopper="minecraft:oxidized_chiseled_copper",e.DarkOakTrapdoor="minecraft:dark_oak_trapdoor",e.MangroveWallSign="minecraft:mangrove_wall_sign",e.Beetroot="minecraft:beetroot",e.RawCopperBlock="minecraft:raw_copper_block",e.HornCoralBlock="minecraft:horn_coral_block",e.Skull="minecraft:skull",e.LightGrayCandleCake="minecraft:light_gray_candle_cake",e.Element95="minecraft:element_95",e.WhiteCandle="minecraft:white_candle",e.GoldenRail="minecraft:golden_rail",e.LitFurnace="minecraft:lit_furnace",e.CyanWool="minecraft:cyan_wool",e.PetrifiedOakDoubleSlab="minecraft:petrified_oak_double_slab",e.StructureBlock="minecraft:structure_block",e.TintedGlass="minecraft:tinted_glass",e.DeprecatedAnvil="minecraft:deprecated_anvil",e.GrayShulkerBox="minecraft:gray_shulker_box",e.FireCoralWallFan="minecraft:fire_coral_wall_fan",e.JungleFenceGate="minecraft:jungle_fence_gate",e.ExposedCopperGrate="minecraft:exposed_copper_grate",e.WaxedCopperGrate="minecraft:waxed_copper_grate",e.DeadBrainCoral="minecraft:dead_brain_coral",e.JungleTrapdoor="minecraft:jungle_trapdoor",e.SpruceWallSign="minecraft:spruce_wall_sign",e.CoalBlock="minecraft:coal_block",e.WarpedFenceGate="minecraft:warped_fence_gate",e.Composter="minecraft:composter",e.Element44="minecraft:element_44",e.WaxedDoubleCutCopperSlab="minecraft:waxed_double_cut_copper_slab",e.WaxedExposedCopperDoor="minecraft:waxed_exposed_copper_door",e.BlueGlazedTerracotta="minecraft:blue_glazed_terracotta",e.BlueWool="minecraft:blue_wool",e.Clay="minecraft:clay",e.WeepingVines="minecraft:weeping_vines",e.ChorusPlant="minecraft:chorus_plant",e.MudBrickStairs="minecraft:mud_brick_stairs",e.SmoothRedSandstoneStairs="minecraft:smooth_red_sandstone_stairs",e.Element100="minecraft:element_100",e.Element103="minecraft:element_103",e.Element105="minecraft:element_105",e.CrimsonPressurePlate="minecraft:crimson_pressure_plate",e.Element106="minecraft:element_106",e.Element107="minecraft:element_107",e.HardGrayStainedGlassPane="minecraft:hard_gray_stained_glass_pane",e.Element108="minecraft:element_108",e.Element109="minecraft:element_109",e.LightGrayShulkerBox="minecraft:light_gray_shulker_box",e.Element112="minecraft:element_112",e.Element110="minecraft:element_110",e.Element116="minecraft:element_116",e.Element114="minecraft:element_114",e.WhiteGlazedTerracotta="minecraft:white_glazed_terracotta",e.StrippedWarpedHyphae="minecraft:stripped_warped_hyphae",e.Element50="minecraft:element_50",e.PumpkinStem="minecraft:pumpkin_stem",e.Lever="minecraft:lever",e.MovingBlock="minecraft:moving_block",e.TrappedChest="minecraft:trapped_chest",e.LightGrayConcretePowder="minecraft:light_gray_concrete_powder",e.BrainCoralBlock="minecraft:brain_coral_block",e.StandingSign="minecraft:standing_sign",e.PurpleConcretePowder="minecraft:purple_concrete_powder",e.BambooPlanks="minecraft:bamboo_planks",e.CommandBlock="minecraft:command_block",e.TwistingVines="minecraft:twisting_vines",e.AcaciaDoubleSlab="minecraft:acacia_double_slab",e.PolishedAndesiteDoubleSlab="minecraft:polished_andesite_double_slab",e.Magma="minecraft:magma",e.Dirt="minecraft:dirt",e.Reeds="minecraft:reeds",e.Deny="minecraft:deny",e.BeeNest="minecraft:bee_nest",e.Campfire="minecraft:campfire",e.SoulSoil="minecraft:soul_soil",e.Element8="minecraft:element_8",e.Element28="minecraft:element_28",e.DarkOakPressurePlate="minecraft:dark_oak_pressure_plate",e.SoulSand="minecraft:soul_sand",e.CobbledDeepslateDoubleSlab="minecraft:cobbled_deepslate_double_slab",e.SpruceHangingSign="minecraft:spruce_hanging_sign",e.ReinforcedDeepslate="minecraft:reinforced_deepslate",e.EndRod="minecraft:end_rod",e.FletchingTable="minecraft:fletching_table",e.CherryLeaves="minecraft:cherry_leaves",e.BlackGlazedTerracotta="minecraft:black_glazed_terracotta",e.StrippedAcaciaLog="minecraft:stripped_acacia_log",e.SnifferEgg="minecraft:sniffer_egg",e.WarpedFence="minecraft:warped_fence",e.CaveVinesBodyWithBerries="minecraft:cave_vines_body_with_berries",e.CherryStandingSign="minecraft:cherry_standing_sign",e.MangroveHangingSign="minecraft:mangrove_hanging_sign",e.WaxedExposedCopperTrapdoor="minecraft:waxed_exposed_copper_trapdoor",e.MossyStoneBrickStairs="minecraft:mossy_stone_brick_stairs",e.CrimsonStem="minecraft:crimson_stem",e.ColoredTorchRg="minecraft:colored_torch_rg",e.TuffBrickDoubleSlab="minecraft:tuff_brick_double_slab",e.Vault="minecraft:vault",e.AzaleaLeavesFlowered="minecraft:azalea_leaves_flowered",e.Element18="minecraft:element_18",e.CrimsonSlab="minecraft:crimson_slab",e.WarpedHyphae="minecraft:warped_hyphae",e.OxeyeDaisy="minecraft:oxeye_daisy",e.BambooButton="minecraft:bamboo_button",e.WarpedWartBlock="minecraft:warped_wart_block",e.TuffStairs="minecraft:tuff_stairs",e.YellowCarpet="minecraft:yellow_carpet",e.BlackStainedGlass="minecraft:black_stained_glass",e.WaxedOxidizedCopperDoor="minecraft:waxed_oxidized_copper_door",e.GrassBlock="minecraft:grass_block",e.TripwireHook="minecraft:tripwire_hook",e.HardBlackStainedGlass="minecraft:hard_black_stained_glass",e.StrippedBirchLog="minecraft:stripped_birch_log",e.RedTulip="minecraft:red_tulip",e.CutSandstone="minecraft:cut_sandstone",e.LimeWool="minecraft:lime_wool",e.BlueCandleCake="minecraft:blue_candle_cake",e.LargeFern="minecraft:large_fern",e.SweetBerryBush="minecraft:sweet_berry_bush",e.PolishedBlackstoneSlab="minecraft:polished_blackstone_slab",e.BlackShulkerBox="minecraft:black_shulker_box",e.JungleSapling="minecraft:jungle_sapling",e.BlueConcrete="minecraft:blue_concrete",e.JungleStandingSign="minecraft:jungle_standing_sign",e.Web="minecraft:web",e.WeatheredCutCopperSlab="minecraft:weathered_cut_copper_slab",e.Cocoa="minecraft:cocoa",e.DarkOakLeaves="minecraft:dark_oak_leaves",e.OrangeTerracotta="minecraft:orange_terracotta",e.Fire="minecraft:fire",e.PurpurDoubleSlab="minecraft:purpur_double_slab",e.ExposedChiseledCopper="minecraft:exposed_chiseled_copper",e.InfestedStone="minecraft:infested_stone",e.EndPortalFrame="minecraft:end_portal_frame",e.Prismarine="minecraft:prismarine",e.MagentaCandleCake="minecraft:magenta_candle_cake",e.DeepslateGoldOre="minecraft:deepslate_gold_ore",e.HardOrangeStainedGlass="minecraft:hard_orange_stained_glass",e.Glass="minecraft:glass",e.MossBlock="minecraft:moss_block",e.NetherBrickDoubleSlab="minecraft:nether_brick_double_slab",e.ExposedCutCopper="minecraft:exposed_cut_copper",e.PrismarineBrickDoubleSlab="minecraft:prismarine_brick_double_slab",e.Bookshelf="minecraft:bookshelf",e.WaxedWeatheredCutCopperStairs="minecraft:waxed_weathered_cut_copper_stairs",e.MangroveRoots="minecraft:mangrove_roots",e.AcaciaStairs="minecraft:acacia_stairs",e.PolishedAndesiteStairs="minecraft:polished_andesite_stairs",e.CherrySlab="minecraft:cherry_slab",e.SmoothRedSandstoneDoubleSlab="minecraft:smooth_red_sandstone_double_slab",e.LitBlastFurnace="minecraft:lit_blast_furnace",e.Element11="minecraft:element_11",e.Sculk="minecraft:sculk",e.TuffBrickStairs="minecraft:tuff_brick_stairs",e.ChemistryTable="minecraft:chemistry_table",e.DeadFireCoral="minecraft:dead_fire_coral",e.StoneBrickSlab="minecraft:stone_brick_slab",e.StrippedSpruceLog="minecraft:stripped_spruce_log",e.WaxedOxidizedCopperBulb="minecraft:waxed_oxidized_copper_bulb",e.DeepslateBrickStairs="minecraft:deepslate_brick_stairs",e.WarpedNylium="minecraft:warped_nylium",e.DeepslateEmeraldOre="minecraft:deepslate_emerald_ore",e.StrippedCrimsonStem="minecraft:stripped_crimson_stem",e.AcaciaSapling="minecraft:acacia_sapling",e.StonecutterBlock="minecraft:stonecutter_block",e.AndesiteSlab="minecraft:andesite_slab",e.CyanShulkerBox="minecraft:cyan_shulker_box",e.UnpoweredComparator="minecraft:unpowered_comparator",e.LimeCandle="minecraft:lime_candle",e.Target="minecraft:target",e.WoodenButton="minecraft:wooden_button",e.MangroveDoor="minecraft:mangrove_door",e.EndStoneBrickDoubleSlab="minecraft:end_stone_brick_double_slab",e.WeatheredCopperDoor="minecraft:weathered_copper_door",e.PearlescentFroglight="minecraft:pearlescent_froglight",e.TallGrass="minecraft:tall_grass",e.LightBlock15="minecraft:light_block_15",e.Element64="minecraft:element_64",e.NetherSprouts="minecraft:nether_sprouts",e.Element92="minecraft:element_92",e.CyanStainedGlassPane="minecraft:cyan_stained_glass_pane",e.DeadHornCoralBlock="minecraft:dead_horn_coral_block",e.Element12="minecraft:element_12",e.DeadHornCoralFan="minecraft:dead_horn_coral_fan",e.Furnace="minecraft:furnace",e.WarpedSlab="minecraft:warped_slab",e.Netherrack="minecraft:netherrack",e.WarpedStem="minecraft:warped_stem",e.Chain="minecraft:chain",e.HornCoralFan="minecraft:horn_coral_fan",e.GreenShulkerBox="minecraft:green_shulker_box",e.BrickStairs="minecraft:brick_stairs",e.PurpleCarpet="minecraft:purple_carpet",e.FireCoralFan="minecraft:fire_coral_fan",e.Element69="minecraft:element_69",e.SpruceTrapdoor="minecraft:spruce_trapdoor",e.PurpleGlazedTerracotta="minecraft:purple_glazed_terracotta",e.ChainCommandBlock="minecraft:chain_command_block",e.SpruceFenceGate="minecraft:spruce_fence_gate",e.RedNetherBrickStairs="minecraft:red_nether_brick_stairs",e.GreenGlazedTerracotta="minecraft:green_glazed_terracotta",e.DeepslateRedstoneOre="minecraft:deepslate_redstone_ore",e.DeadBrainCoralBlock="minecraft:dead_brain_coral_block",e.MangroveFence="minecraft:mangrove_fence",e.BirchTrapdoor="minecraft:birch_trapdoor",e.TuffBricks="minecraft:tuff_bricks",e.Mud="minecraft:mud",e.Ice="minecraft:ice",e.Air="minecraft:air",e.Bed="minecraft:bed",e.LightBlueWool="minecraft:light_blue_wool",e.BlackConcrete="minecraft:black_concrete",e.Tnt="minecraft:tnt",e.DeadTubeCoralFan="minecraft:dead_tube_coral_fan",e.PolishedDioriteStairs="minecraft:polished_diorite_stairs",e.Element83="minecraft:element_83",e.OrangeConcrete="minecraft:orange_concrete",e.Netherreactor="minecraft:netherreactor",e.LimeCarpet="minecraft:lime_carpet",e.DeadFireCoralFan="minecraft:dead_fire_coral_fan",e.DecoratedPot="minecraft:decorated_pot",e.GraniteDoubleSlab="minecraft:granite_double_slab",e.EnchantingTable="minecraft:enchanting_table",e.BubbleCoralWallFan="minecraft:bubble_coral_wall_fan",e.OrangeTulip="minecraft:orange_tulip",e.Azalea="minecraft:azalea",e.Bell="minecraft:bell",e.MudBricks="minecraft:mud_bricks",e.BirchWallSign="minecraft:birch_wall_sign",e.BambooWallSign="minecraft:bamboo_wall_sign",e.AcaciaWood="minecraft:acacia_wood",e.Hopper="minecraft:hopper",e.HardRedStainedGlass="minecraft:hard_red_stained_glass",e.PrismarineBricks="minecraft:prismarine_bricks",e.Lectern="minecraft:lectern",e.AcaciaButton="minecraft:acacia_button",e.StandingBanner="minecraft:standing_banner",e.SeaLantern="minecraft:sea_lantern",e.WaxedOxidizedDoubleCutCopperSlab="minecraft:waxed_oxidized_double_cut_copper_slab",e.LightBlueShulkerBox="minecraft:light_blue_shulker_box",e.MangrovePropagule="minecraft:mangrove_propagule",e.PolishedDioriteDoubleSlab="minecraft:polished_diorite_double_slab",e.MossyCobblestoneDoubleSlab="minecraft:mossy_cobblestone_double_slab",e.BirchStairs="minecraft:birch_stairs",e.SpruceSlab="minecraft:spruce_slab",e.BlackstoneStairs="minecraft:blackstone_stairs",e.BlueIce="minecraft:blue_ice",e.HardRedStainedGlassPane="minecraft:hard_red_stained_glass_pane",e.Lantern="minecraft:lantern",e.DarkOakFence="minecraft:dark_oak_fence",e.BirchDoor="minecraft:birch_door",e.DeepslateLapisOre="minecraft:deepslate_lapis_ore",e.CrimsonHangingSign="minecraft:crimson_hanging_sign",e.DeepslateCoalOre="minecraft:deepslate_coal_ore",e.WeatheredCutCopper="minecraft:weathered_cut_copper",e.BambooStandingSign="minecraft:bamboo_standing_sign",e.StrippedMangroveLog="minecraft:stripped_mangrove_log",e.PolishedTuff="minecraft:polished_tuff",e.MagentaStainedGlass="minecraft:magenta_stained_glass",e.WeatheredCopperBulb="minecraft:weathered_copper_bulb",e.HardWhiteStainedGlassPane="minecraft:hard_white_stained_glass_pane",e.HardCyanStainedGlassPane="minecraft:hard_cyan_stained_glass_pane",e.ChiseledNetherBricks="minecraft:chiseled_nether_bricks",e.WarpedButton="minecraft:warped_button",e.RedConcretePowder="minecraft:red_concrete_powder",e.DeadBubbleCoral="minecraft:dead_bubble_coral",e.CherrySapling="minecraft:cherry_sapling",e.CherryLog="minecraft:cherry_log",e.PolishedTuffStairs="minecraft:polished_tuff_stairs",e.DragonEgg="minecraft:dragon_egg",e.NetherBrick="minecraft:nether_brick",e.DeepslateIronOre="minecraft:deepslate_iron_ore",e.Element3="minecraft:element_3",e.Element2="minecraft:element_2",e.Element5="minecraft:element_5",e.Element4="minecraft:element_4",e.Element7="minecraft:element_7",e.Element9="minecraft:element_9",e.Camera="minecraft:camera",e.WaxedCutCopper="minecraft:waxed_cut_copper",e.Element47="minecraft:element_47",e.CobbledDeepslateSlab="minecraft:cobbled_deepslate_slab",e.Lilac="minecraft:lilac",e.CrimsonStandingSign="minecraft:crimson_standing_sign",e.EmeraldOre="minecraft:emerald_ore",e.BrownMushroomBlock="minecraft:brown_mushroom_block",e.PetrifiedOakSlab="minecraft:petrified_oak_slab",e.CarvedPumpkin="minecraft:carved_pumpkin",e.Dropper="minecraft:dropper",e.Candle="minecraft:candle",e.PolishedAndesiteSlab="minecraft:polished_andesite_slab",e.AcaciaSlab="minecraft:acacia_slab",e.CobbledDeepslateWall="minecraft:cobbled_deepslate_wall",e.PointedDripstone="minecraft:pointed_dripstone",e.CutRedSandstoneSlab="minecraft:cut_red_sandstone_slab",e.ChiseledTuffBricks="minecraft:chiseled_tuff_bricks",e.ChemicalHeat="minecraft:chemical_heat",e.TripWire="minecraft:trip_wire",e.CaveVinesHeadWithBerries="minecraft:cave_vines_head_with_berries",e.ChiseledRedSandstone="minecraft:chiseled_red_sandstone",e.BrickSlab="minecraft:brick_slab",e.BrewingStand="minecraft:brewing_stand",e.BambooSapling="minecraft:bamboo_sapling",e.SmoothQuartzSlab="minecraft:smooth_quartz_slab",e.WhiteCandleCake="minecraft:white_candle_cake",e.EndPortal="minecraft:end_portal",e.JungleDoubleSlab="minecraft:jungle_double_slab",e.SpruceWood="minecraft:spruce_wood",e.Blackstone="minecraft:blackstone",e.LitDeepslateRedstoneOre="minecraft:lit_deepslate_redstone_ore",e.Element10="minecraft:element_10",e.Element14="minecraft:element_14",e.Element15="minecraft:element_15",e.Element36="minecraft:element_36",e.Element37="minecraft:element_37",e.Element34="minecraft:element_34",e.Element35="minecraft:element_35",e.Element32="minecraft:element_32",e.Element33="minecraft:element_33",e.Element31="minecraft:element_31",e.Element38="minecraft:element_38",e.Element29="minecraft:element_29",e.Element21="minecraft:element_21",e.Element20="minecraft:element_20",e.Element23="minecraft:element_23",e.Element22="minecraft:element_22",e.Element25="minecraft:element_25",e.Element24="minecraft:element_24",e.Element27="minecraft:element_27",e.Element26="minecraft:element_26",e.Element59="minecraft:element_59",e.Element54="minecraft:element_54",e.Element55="minecraft:element_55",e.Element56="minecraft:element_56",e.Element57="minecraft:element_57",e.Element53="minecraft:element_53",e.Element49="minecraft:element_49",e.Element48="minecraft:element_48",e.Element45="minecraft:element_45",e.Element43="minecraft:element_43",e.Element42="minecraft:element_42",e.Element41="minecraft:element_41",e.Element40="minecraft:element_40",e.Element72="minecraft:element_72",e.Element70="minecraft:element_70",e.Element71="minecraft:element_71",e.Element76="minecraft:element_76",e.Element75="minecraft:element_75",e.Element78="minecraft:element_78",e.Element79="minecraft:element_79",e.Element65="minecraft:element_65",e.Element67="minecraft:element_67",e.PolishedDeepslateWall="minecraft:polished_deepslate_wall",e.Element66="minecraft:element_66",e.Element61="minecraft:element_61",e.Element60="minecraft:element_60",e.Element63="minecraft:element_63",e.Element98="minecraft:element_98",e.Element90="minecraft:element_90",e.Element91="minecraft:element_91",e.Element94="minecraft:element_94",e.Element96="minecraft:element_96",e.Element88="minecraft:element_88",e.Element82="minecraft:element_82",e.Element81="minecraft:element_81",e.Element80="minecraft:element_80",e.Element87="minecraft:element_87",e.Element86="minecraft:element_86",e.Element84="minecraft:element_84",e.LitSmoker="minecraft:lit_smoker",e.SmoothQuartzStairs="minecraft:smooth_quartz_stairs",e.LightGrayCarpet="minecraft:light_gray_carpet",e.PurpurBlock="minecraft:purpur_block",e.CherryWallSign="minecraft:cherry_wall_sign",e.CyanCandle="minecraft:cyan_candle",e.RepeatingCommandBlock="minecraft:repeating_command_block",e.CrimsonFungus="minecraft:crimson_fungus",e.CherryPlanks="minecraft:cherry_planks",e.PolishedDeepslate="minecraft:polished_deepslate",e.TuffDoubleSlab="minecraft:tuff_double_slab",e.PurpurStairs="minecraft:purpur_stairs",e.TubeCoral="minecraft:tube_coral",e.WaxedCopperDoor="minecraft:waxed_copper_door",e.Portal="minecraft:portal",e.Peony="minecraft:peony",e.Crafter="minecraft:crafter",e.SprucePlanks="minecraft:spruce_planks",e.AmethystCluster="minecraft:amethyst_cluster",e.WaxedChiseledCopper="minecraft:waxed_chiseled_copper",e.WaxedCutCopperSlab="minecraft:waxed_cut_copper_slab",e.DriedKelpBlock="minecraft:dried_kelp_block",e.HardLightGrayStainedGlass="minecraft:hard_light_gray_stained_glass",e.CrimsonFence="minecraft:crimson_fence",e.ChiseledTuff="minecraft:chiseled_tuff",e.LimeConcretePowder="minecraft:lime_concrete_powder",e.BirchFence="minecraft:birch_fence",e.TurtleEgg="minecraft:turtle_egg",e.BrownTerracotta="minecraft:brown_terracotta",e.CobblestoneDoubleSlab="minecraft:cobblestone_double_slab",e.DeepslateDiamondOre="minecraft:deepslate_diamond_ore",e.LightGrayWool="minecraft:light_gray_wool",e.SoulCampfire="minecraft:soul_campfire",e.WoodenPressurePlate="minecraft:wooden_pressure_plate",e.WaxedOxidizedCopperGrate="minecraft:waxed_oxidized_copper_grate",e.DamagedAnvil="minecraft:damaged_anvil",e.WhiteConcrete="minecraft:white_concrete",e.AcaciaFence="minecraft:acacia_fence",e.GrassPath="minecraft:grass_path",e.OrangeCandleCake="minecraft:orange_candle_cake",e.WeatheredCopper="minecraft:weathered_copper",e.LimeTerracotta="minecraft:lime_terracotta",e.CherryFenceGate="minecraft:cherry_fence_gate",e.GrayGlazedTerracotta="minecraft:gray_glazed_terracotta",e.Lodestone="minecraft:lodestone",e.BambooMosaic="minecraft:bamboo_mosaic",e.PurpleWool="minecraft:purple_wool",e.IronBlock="minecraft:iron_block",e.CartographyTable="minecraft:cartography_table",e.Dandelion="minecraft:dandelion",e}({});var _=function(e){return e.Balloon="minecraft:balloon",e.FallingBlock="minecraft:falling_block",e.Vindicator="minecraft:vindicator",e.VillagerV2="minecraft:villager_v2",e.IceBomb="minecraft:ice_bomb",e.Cat="minecraft:cat",e.Bee="minecraft:bee",e.WanderingTrader="minecraft:wandering_trader",e.Wolf="minecraft:wolf",e.Rabbit="minecraft:rabbit",e.Sniffer="minecraft:sniffer",e.Tadpole="minecraft:tadpole",e.WindChargeProjectile="minecraft:wind_charge_projectile",e.Sheep="minecraft:sheep",e.Witch="minecraft:witch",e.Zoglin="minecraft:zoglin",e.Skeleton="minecraft:skeleton",e.Cow="minecraft:cow",e.Ravager="minecraft:ravager",e.Mooshroom="minecraft:mooshroom",e.Allay="minecraft:allay",e.IronGolem="minecraft:iron_golem",e.Dolphin="minecraft:dolphin",e.Breeze="minecraft:breeze",e.TraderLlama="minecraft:trader_llama",e.Turtle="minecraft:turtle",e.Tropicalfish="minecraft:tropicalfish",e.PolarBear="minecraft:polar_bear",e.Chicken="minecraft:chicken",e.Panda="minecraft:panda",e.Slime="minecraft:slime",e.Pillager="minecraft:pillager",e.Mule="minecraft:mule",e.ZombieVillager="minecraft:zombie_villager",e.Arrow="minecraft:arrow",e.Llama="minecraft:llama",e.Horse="minecraft:horse",e.Donkey="minecraft:donkey",e.Bogged="minecraft:bogged",e.Camel="minecraft:camel",e.BreezeWindChargeProjectile="minecraft:breeze_wind_charge_projectile",e.ZombieHorse="minecraft:zombie_horse",e.Zombie="minecraft:zombie",e.Villager="minecraft:villager",e.Strider="minecraft:strider",e.OminousItemSpawner="minecraft:ominous_item_spawner",e.Warden="minecraft:warden",e.Agent="minecraft:agent",e.Stray="minecraft:stray",e.Spider="minecraft:spider",e.Player="minecraft:player",e.SmallFireball="minecraft:small_fireball",e.SkeletonHorse="minecraft:skeleton_horse",e.Husk="minecraft:husk",e.Hoglin="minecraft:hoglin",e.EnderCrystal="minecraft:ender_crystal",e.Silverfish="minecraft:silverfish",e.Armadillo="minecraft:armadillo",e.Piglin="minecraft:piglin",e.Guardian="minecraft:guardian",e.Wither="minecraft:wither",e.Vex="minecraft:vex",e.Pig="minecraft:pig",e.Parrot="minecraft:parrot",e.Ocelot="minecraft:ocelot",e.Blaze="minecraft:blaze",e.Goat="minecraft:goat",e.Frog="minecraft:frog",e.Fox="minecraft:fox",e.CaveSpider="minecraft:cave_spider",e.WitherSkeleton="minecraft:wither_skeleton",e.Squid="minecraft:squid",e.Shulker="minecraft:shulker",e.Salmon="minecraft:salmon",e.Creeper="minecraft:creeper",e.Pufferfish="minecraft:pufferfish",e.PiglinBrute="minecraft:piglin_brute",e.Phantom="minecraft:phantom",e.Npc="minecraft:npc",e.MagmaCube="minecraft:magma_cube",e.LlamaSpit="minecraft:llama_spit",e.GlowSquid="minecraft:glow_squid",e.EnderDragon="minecraft:ender_dragon",e.Ghast="minecraft:ghast",e.Cod="minecraft:cod",e.EvocationIllager="minecraft:evocation_illager",e.Endermite="minecraft:endermite",e.Enderman="minecraft:enderman",e.ElderGuardian="minecraft:elder_guardian",e.Drowned="minecraft:drowned",e.Bat="minecraft:bat",e.Axolotl="minecraft:axolotl",e.XpOrb="minecraft:xp_orb",e.ZombieVillagerV2="minecraft:zombie_villager_v2",e.ZombiePigman="minecraft:zombie_pigman",e.SnowGolem="minecraft:snow_golem",e.Fireball="minecraft:fireball",e.ChestBoat="minecraft:chest_boat",e.Boat="minecraft:boat",e.ShulkerBullet="minecraft:shulker_bullet",e.XpBottle="minecraft:xp_bottle",e.Tnt="minecraft:tnt",e.SplashPotion="minecraft:splash_potion",e.LingeringPotion="minecraft:lingering_potion",e.WitherSkullDangerous="minecraft:wither_skull_dangerous",e.WitherSkull="minecraft:wither_skull",e.ThrownTrident="minecraft:thrown_trident",e.Snowball="minecraft:snowball",e.FishingHook="minecraft:fishing_hook",e.EnderPearl="minecraft:ender_pearl",e.Egg="minecraft:egg",e.DragonFireball="minecraft:dragon_fireball",e.ArmorStand="minecraft:armor_stand",e.LightningBolt="minecraft:lightning_bolt",e.TripodCamera="minecraft:tripod_camera",e.TntMinecart="minecraft:tnt_minecart",e.Minecart="minecraft:minecart",e.HopperMinecart="minecraft:hopper_minecart",e.FireworksRocket="minecraft:fireworks_rocket",e.EyeOfEnderSignal="minecraft:eye_of_ender_signal",e.CommandBlockMinecart="minecraft:command_block_minecart",e.ChestMinecart="minecraft:chest_minecart",e.AreaEffectCloud="minecraft:area_effect_cloud",e.Item="minecraft:item",e}({});var A=function(e){return e.OrangeCandle="minecraft:orange_candle",e.ColoredTorchBp="minecraft:colored_torch_bp",e.TropicalFishBucket="minecraft:tropical_fish_bucket",e.LightBlock14="minecraft:light_block_14",e.AcaciaFenceGate="minecraft:acacia_fence_gate",e.CyanDye="minecraft:cyan_dye",e.Scaffolding="minecraft:scaffolding",e.SculkCatalyst="minecraft:sculk_catalyst",e.Honeycomb="minecraft:honeycomb",e.BirchFenceGate="minecraft:birch_fence_gate",e.Shears="minecraft:shears",e.BlueConcrete="minecraft:blue_concrete",e.FieldMasonedBannerPattern="minecraft:field_masoned_banner_pattern",e.WaxedCutCopper="minecraft:waxed_cut_copper",e.CamelSpawnEgg="minecraft:camel_spawn_egg",e.StoneBrickSlab="minecraft:stone_brick_slab",e.GoldIngot="minecraft:gold_ingot",e.SprucePlanks="minecraft:spruce_planks",e.RoseBush="minecraft:rose_bush",e.TuffBrickSlab="minecraft:tuff_brick_slab",e.WoodenPickaxe="minecraft:wooden_pickaxe",e.LightBlock10="minecraft:light_block_10",e.Cookie="minecraft:cookie",e.BlueStainedGlassPane="minecraft:blue_stained_glass_pane",e.CutCopperStairs="minecraft:cut_copper_stairs",e.WhiteWool="minecraft:white_wool",e.WaxedCopper="minecraft:waxed_copper",e.WoodenDoor="minecraft:wooden_door",e.OakSign="minecraft:oak_sign",e.YellowCandle="minecraft:yellow_candle",e.Shroomlight="minecraft:shroomlight",e.MilkBucket="minecraft:milk_bucket",e.RedSandstoneStairs="minecraft:red_sandstone_stairs",e.PolishedDioriteSlab="minecraft:polished_diorite_slab",e.DarkOakPlanks="minecraft:dark_oak_planks",e.JungleLeaves="minecraft:jungle_leaves",e.SuspiciousSand="minecraft:suspicious_sand",e.AncientDebris="minecraft:ancient_debris",e.SpruceTrapdoor="minecraft:spruce_trapdoor",e.PurpleGlazedTerracotta="minecraft:purple_glazed_terracotta",e.MusicDisc11="minecraft:music_disc_11",e.IronBlock="minecraft:iron_block",e.RedNetherBrick="minecraft:red_nether_brick",e.Redstone="minecraft:redstone",e.BoneMeal="minecraft:bone_meal",e.WarpedPressurePlate="minecraft:warped_pressure_plate",e.StraySpawnEgg="minecraft:stray_spawn_egg",e.InfestedChiseledStoneBricks="minecraft:infested_chiseled_stone_bricks",e.PrismarineStairs="minecraft:prismarine_stairs",e.IronDoor="minecraft:iron_door",e.DarkPrismarineStairs="minecraft:dark_prismarine_stairs",e.RedSandstoneSlab="minecraft:red_sandstone_slab",e.SculkShrieker="minecraft:sculk_shrieker",e.BambooMosaicStairs="minecraft:bamboo_mosaic_stairs",e.EndBricks="minecraft:end_bricks",e.WaxedOxidizedCopper="minecraft:waxed_oxidized_copper",e.MangrovePlanks="minecraft:mangrove_planks",e.WaxedWeatheredCopperDoor="minecraft:waxed_weathered_copper_door",e.PinkTerracotta="minecraft:pink_terracotta",e.BlazeRod="minecraft:blaze_rod",e.BrownTerracotta="minecraft:brown_terracotta",e.CarvedPumpkin="minecraft:carved_pumpkin",e.BlazeSpawnEgg="minecraft:blaze_spawn_egg",e.Balloon="minecraft:balloon",e.OakPlanks="minecraft:oak_planks",e.DarkOakLog="minecraft:dark_oak_log",e.RedstoneOre="minecraft:redstone_ore",e.AxolotlBucket="minecraft:axolotl_bucket",e.Hopper="minecraft:hopper",e.PiglinBruteSpawnEgg="minecraft:piglin_brute_spawn_egg",e.SeaPickle="minecraft:sea_pickle",e.Lead="minecraft:lead",e.BirchPlanks="minecraft:birch_planks",e.EndBrickStairs="minecraft:end_brick_stairs",e.TubeCoralBlock="minecraft:tube_coral_block",e.WaxedExposedCopperGrate="minecraft:waxed_exposed_copper_grate",e.AcaciaPlanks="minecraft:acacia_planks",e.WaxedExposedCutCopperSlab="minecraft:waxed_exposed_cut_copper_slab",e.DeadHornCoral="minecraft:dead_horn_coral",e.FireCoralBlock="minecraft:fire_coral_block",e.Barrel="minecraft:barrel",e.QuartzSlab="minecraft:quartz_slab",e.BigDripleaf="minecraft:big_dripleaf",e.CherryStairs="minecraft:cherry_stairs",e.FishingRod="minecraft:fishing_rod",e.NameTag="minecraft:name_tag",e.JungleFence="minecraft:jungle_fence",e.Mycelium="minecraft:mycelium",e.GhastSpawnEgg="minecraft:ghast_spawn_egg",e.DeepslateRedstoneOre="minecraft:deepslate_redstone_ore",e.YellowStainedGlassPane="minecraft:yellow_stained_glass_pane",e.DarkOakSlab="minecraft:dark_oak_slab",e.SmoothQuartzStairs="minecraft:smooth_quartz_stairs",e.FenceGate="minecraft:fence_gate",e.RottenFlesh="minecraft:rotten_flesh",e.LightGrayStainedGlassPane="minecraft:light_gray_stained_glass_pane",e.EyeArmorTrimSmithingTemplate="minecraft:eye_armor_trim_smithing_template",e.BlackstoneSlab="minecraft:blackstone_slab",e.GoldenPickaxe="minecraft:golden_pickaxe",e.Chest="minecraft:chest",e.LightBlueDye="minecraft:light_blue_dye",e.PolishedBlackstoneBrickWall="minecraft:polished_blackstone_brick_wall",e.StoneStairs="minecraft:stone_stairs",e.Beacon="minecraft:beacon",e.Furnace="minecraft:furnace",e.WarpedSlab="minecraft:warped_slab",e.LightGrayStainedGlass="minecraft:light_gray_stained_glass",e.OxidizedCopperTrapdoor="minecraft:oxidized_copper_trapdoor",e.DetectorRail="minecraft:detector_rail",e.Gravel="minecraft:gravel",e.HoglinSpawnEgg="minecraft:hoglin_spawn_egg",e.LightBlueConcretePowder="minecraft:light_blue_concrete_powder",e.JungleWood="minecraft:jungle_wood",e.HeavyCore="minecraft:heavy_core",e.SuspiciousGravel="minecraft:suspicious_gravel",e.Bleach="minecraft:bleach",e.RedStainedGlass="minecraft:red_stained_glass",e.PurpleShulkerBox="minecraft:purple_shulker_box",e.IronTrapdoor="minecraft:iron_trapdoor",e.MangroveButton="minecraft:mangrove_button",e.PurpleConcretePowder="minecraft:purple_concrete_powder",e.BambooPlanks="minecraft:bamboo_planks",e.ChorusFlower="minecraft:chorus_flower",e.JunglePlanks="minecraft:jungle_planks",e.JungleSign="minecraft:jungle_sign",e.WindCharge="minecraft:wind_charge",e.GlisteringMelonSlice="minecraft:glistering_melon_slice",e.Carrot="minecraft:carrot",e.TrialSpawner="minecraft:trial_spawner",e.StrippedJungleWood="minecraft:stripped_jungle_wood",e.IronNugget="minecraft:iron_nugget",e.BoneBlock="minecraft:bone_block",e.WarpedHangingSign="minecraft:warped_hanging_sign",e.NormalStoneStairs="minecraft:normal_stone_stairs",e.LightBlueStainedGlass="minecraft:light_blue_stained_glass",e.Fern="minecraft:fern",e.PackedMud="minecraft:packed_mud",e.PolishedGranite="minecraft:polished_granite",e.IronBars="minecraft:iron_bars",e.OxidizedCutCopper="minecraft:oxidized_cut_copper",e.GlassBottle="minecraft:glass_bottle",e.SmallDripleafBlock="minecraft:small_dripleaf_block",e.WarpedRoots="minecraft:warped_roots",e.MagentaWool="minecraft:magenta_wool",e.HardGreenStainedGlassPane="minecraft:hard_green_stained_glass_pane",e.IronBoots="minecraft:iron_boots",e.YellowStainedGlass="minecraft:yellow_stained_glass",e.RabbitSpawnEgg="minecraft:rabbit_spawn_egg",e.HornCoral="minecraft:horn_coral",e.WhiteConcretePowder="minecraft:white_concrete_powder",e.CherryPlanks="minecraft:cherry_planks",e.GraniteSlab="minecraft:granite_slab",e.SoulSoil="minecraft:soul_soil",e.DarkOakPressurePlate="minecraft:dark_oak_pressure_plate",e.GraniteStairs="minecraft:granite_stairs",e.StrippedWarpedStem="minecraft:stripped_warped_stem",e.FriendPotterySherd="minecraft:friend_pottery_sherd",e.DaylightDetector="minecraft:daylight_detector",e.SmoothSandstoneStairs="minecraft:smooth_sandstone_stairs",e.RepeatingCommandBlock="minecraft:repeating_command_block",e.DrownedSpawnEgg="minecraft:drowned_spawn_egg",e.QuartzBricks="minecraft:quartz_bricks",e.MangroveLog="minecraft:mangrove_log",e.BambooMosaic="minecraft:bamboo_mosaic",e.Trapdoor="minecraft:trapdoor",e.PearlescentFroglight="minecraft:pearlescent_froglight",e.OrangeDye="minecraft:orange_dye",e.BirchButton="minecraft:birch_button",e.CrimsonPlanks="minecraft:crimson_planks",e.Netherrack="minecraft:netherrack",e.WarpedStem="minecraft:warped_stem",e.WarpedPlanks="minecraft:warped_planks",e.PigSpawnEgg="minecraft:pig_spawn_egg",e.FoxSpawnEgg="minecraft:fox_spawn_egg",e.PhantomMembrane="minecraft:phantom_membrane",e.BambooRaft="minecraft:bamboo_raft",e.GlowSquidSpawnEgg="minecraft:glow_squid_spawn_egg",e.EnderDragonSpawnEgg="minecraft:ender_dragon_spawn_egg",e.RedDye="minecraft:red_dye",e.OrangeStainedGlass="minecraft:orange_stained_glass",e.CobblestoneWall="minecraft:cobblestone_wall",e.MagentaConcrete="minecraft:magenta_concrete",e.Crossbow="minecraft:crossbow",e.ExposedCopper="minecraft:exposed_copper",e.RaiserArmorTrimSmithingTemplate="minecraft:raiser_armor_trim_smithing_template",e.OrangeCarpet="minecraft:orange_carpet",e.CherryFence="minecraft:cherry_fence",e.CrimsonTrapdoor="minecraft:crimson_trapdoor",e.BlueShulkerBox="minecraft:blue_shulker_box",e.BirchBoat="minecraft:birch_boat",e.WhiteTerracotta="minecraft:white_terracotta",e.Mud="minecraft:mud",e.BlueDye="minecraft:blue_dye",e.OakLeaves="minecraft:oak_leaves",e.FloweringAzalea="minecraft:flowering_azalea",e.DeepslateBrickSlab="minecraft:deepslate_brick_slab",e.BlackStainedGlassPane="minecraft:black_stained_glass_pane",e.NetherBrickFence="minecraft:nether_brick_fence",e.NetheriteHoe="minecraft:netherite_hoe",e.GoldenCarrot="minecraft:golden_carrot",e.BlackstoneWall="minecraft:blackstone_wall",e.WeatheredCutCopper="minecraft:weathered_cut_copper",e.MusicDiscMellohi="minecraft:music_disc_mellohi",e.DiamondBoots="minecraft:diamond_boots",e.MangroveBoat="minecraft:mangrove_boat",e.TubeCoralFan="minecraft:tube_coral_fan",e.CutRedSandstone="minecraft:cut_red_sandstone",e.PolishedBlackstoneButton="minecraft:polished_blackstone_button",e.StrippedBirchWood="minecraft:stripped_birch_wood",e.SmoothSandstone="minecraft:smooth_sandstone",e.ArcherPotterySherd="minecraft:archer_pottery_sherd",e.RedstoneBlock="minecraft:redstone_block",e.PolishedBlackstoneWall="minecraft:polished_blackstone_wall",e.GoldenApple="minecraft:golden_apple",e.MangroveFence="minecraft:mangrove_fence",e.CookedMutton="minecraft:cooked_mutton",e.PurpleCandle="minecraft:purple_candle",e.NormalStoneSlab="minecraft:normal_stone_slab",e.GoldenAxe="minecraft:golden_axe",e.Mace="minecraft:mace",e.CherryLeaves="minecraft:cherry_leaves",e.PointedDripstone="minecraft:pointed_dripstone",e.CobbledDeepslateWall="minecraft:cobbled_deepslate_wall",e.WoodenShovel="minecraft:wooden_shovel",e.DarkOakTrapdoor="minecraft:dark_oak_trapdoor",e.DeepslateTileWall="minecraft:deepslate_tile_wall",e.Cod="minecraft:cod",e.DarkOakFenceGate="minecraft:dark_oak_fence_gate",e.Lever="minecraft:lever",e.HeartOfTheSea="minecraft:heart_of_the_sea",e.PolishedDeepslateWall="minecraft:polished_deepslate_wall",e.Cake="minecraft:cake",e.BlueStainedGlass="minecraft:blue_stained_glass",e.MossyCobblestone="minecraft:mossy_cobblestone",e.HostArmorTrimSmithingTemplate="minecraft:host_armor_trim_smithing_template",e.BirchTrapdoor="minecraft:birch_trapdoor",e.Cauldron="minecraft:cauldron",e.StrippedSpruceWood="minecraft:stripped_spruce_wood",e.DeepslateBrickWall="minecraft:deepslate_brick_wall",e.GrayStainedGlass="minecraft:gray_stained_glass",e.BambooFenceGate="minecraft:bamboo_fence_gate",e.PurpleConcrete="minecraft:purple_concrete",e.WoodenHoe="minecraft:wooden_hoe",e.EndermiteSpawnEgg="minecraft:endermite_spawn_egg",e.CherryFenceGate="minecraft:cherry_fence_gate",e.BeetrootSoup="minecraft:beetroot_soup",e.HardRedStainedGlassPane="minecraft:hard_red_stained_glass_pane",e.OxidizedCopperGrate="minecraft:oxidized_copper_grate",e.JungleLog="minecraft:jungle_log",e.BlackGlazedTerracotta="minecraft:black_glazed_terracotta",e.RabbitStew="minecraft:rabbit_stew",e.CherryChestBoat="minecraft:cherry_chest_boat",e.CrimsonSlab="minecraft:crimson_slab",e.BreezeRod="minecraft:breeze_rod",e.MudBrickWall="minecraft:mud_brick_wall",e.MusicDiscCreator="minecraft:music_disc_creator",e.PolishedGraniteStairs="minecraft:polished_granite_stairs",e.RedMushroomBlock="minecraft:red_mushroom_block",e.Bowl="minecraft:bowl",e.WarpedDoor="minecraft:warped_door",e.OxidizedCutCopperStairs="minecraft:oxidized_cut_copper_stairs",e.FrogSpawnEgg="minecraft:frog_spawn_egg",e.IronHorseArmor="minecraft:iron_horse_armor",e.Pumpkin="minecraft:pumpkin",e.BirchLog="minecraft:birch_log",e.SnoutArmorTrimSmithingTemplate="minecraft:snout_armor_trim_smithing_template",e.CobbledDeepslate="minecraft:cobbled_deepslate",e.LightBlueCarpet="minecraft:light_blue_carpet",e.WeatheredCopper="minecraft:weathered_copper",e.BambooStairs="minecraft:bamboo_stairs",e.CrackedStoneBricks="minecraft:cracked_stone_bricks",e.WhiteDye="minecraft:white_dye",e.CreeperBannerPattern="minecraft:creeper_banner_pattern",e.PolishedDeepslate="minecraft:polished_deepslate",e.DarkOakDoor="minecraft:dark_oak_door",e.SmoothSandstoneSlab="minecraft:smooth_sandstone_slab",e.GrayCarpet="minecraft:gray_carpet",e.Wheat="minecraft:wheat",e.Grindstone="minecraft:grindstone",e.OakFence="minecraft:oak_fence",e.LightBlueConcrete="minecraft:light_blue_concrete",e.MangroveFenceGate="minecraft:mangrove_fence_gate",e.JungleFenceGate="minecraft:jungle_fence_gate",e.DeepslateEmeraldOre="minecraft:deepslate_emerald_ore",e.StrippedCrimsonStem="minecraft:stripped_crimson_stem",e.SpruceFence="minecraft:spruce_fence",e.LightBlueStainedGlassPane="minecraft:light_blue_stained_glass_pane",e.MagmaCream="minecraft:magma_cream",e.ElderGuardianSpawnEgg="minecraft:elder_guardian_spawn_egg",e.Saddle="minecraft:saddle",e.RawGoldBlock="minecraft:raw_gold_block",e.CarrotOnAStick="minecraft:carrot_on_a_stick",e.PolishedBlackstoneSlab="minecraft:polished_blackstone_slab",e.WhiteStainedGlass="minecraft:white_stained_glass",e.Slime="minecraft:slime",e.TuffWall="minecraft:tuff_wall",e.PolishedBlackstoneStairs="minecraft:polished_blackstone_stairs",e.TurtleEgg="minecraft:turtle_egg",e.BirchFence="minecraft:birch_fence",e.TntMinecart="minecraft:tnt_minecart",e.CopperOre="minecraft:copper_ore",e.WarpedFungus="minecraft:warped_fungus",e.GreenStainedGlassPane="minecraft:green_stained_glass_pane",e.GoldenLeggings="minecraft:golden_leggings",e.GrayStainedGlassPane="minecraft:gray_stained_glass_pane",e.EndStoneBrickSlab="minecraft:end_stone_brick_slab",e.WritableBook="minecraft:writable_book",e.AcaciaFence="minecraft:acacia_fence",e.ArmsUpPotterySherd="minecraft:arms_up_pottery_sherd",e.DarkOakFence="minecraft:dark_oak_fence",e.WaxedWeatheredChiseledCopper="minecraft:waxed_weathered_chiseled_copper",e.IronOre="minecraft:iron_ore",e.RedNetherBrickSlab="minecraft:red_nether_brick_slab",e.BeetrootSeeds="minecraft:beetroot_seeds",e.Noteblock="minecraft:noteblock",e.IceBomb="minecraft:ice_bomb",e.JungleStairs="minecraft:jungle_stairs",e.BirchSapling="minecraft:birch_sapling",e.HardBrownStainedGlassPane="minecraft:hard_brown_stained_glass_pane",e.Torchflower="minecraft:torchflower",e.LightBlock13="minecraft:light_block_13",e.AcaciaHangingSign="minecraft:acacia_hanging_sign",e.PiglinBannerPattern="minecraft:piglin_banner_pattern",e.IronGolemSpawnEgg="minecraft:iron_golem_spawn_egg",e.DarkPrismarineSlab="minecraft:dark_prismarine_slab",e.PrismarineBricksStairs="minecraft:prismarine_bricks_stairs",e.BambooFence="minecraft:bamboo_fence",e.BambooMosaicSlab="minecraft:bamboo_mosaic_slab",e.CrimsonFence="minecraft:crimson_fence",e.RedNetherBrickStairs="minecraft:red_nether_brick_stairs",e.CrimsonDoor="minecraft:crimson_door",e.Deny="minecraft:deny",e.SmoothRedSandstoneStairs="minecraft:smooth_red_sandstone_stairs",e.Composter="minecraft:composter",e.ExposedCutCopperSlab="minecraft:exposed_cut_copper_slab",e.WarpedStairs="minecraft:warped_stairs",e.EchoShard="minecraft:echo_shard",e.SpruceFenceGate="minecraft:spruce_fence_gate",e.WarpedFence="minecraft:warped_fence",e.StrippedJungleLog="minecraft:stripped_jungle_log",e.SentryArmorTrimSmithingTemplate="minecraft:sentry_armor_trim_smithing_template",e.CherrySign="minecraft:cherry_sign",e.EnchantedGoldenApple="minecraft:enchanted_golden_apple",e.MossyCobblestoneStairs="minecraft:mossy_cobblestone_stairs",e.AcaciaDoor="minecraft:acacia_door",e.NetherWartBlock="minecraft:nether_wart_block",e.LightBlueGlazedTerracotta="minecraft:light_blue_glazed_terracotta",e.BlueOrchid="minecraft:blue_orchid",e.LilyOfTheValley="minecraft:lily_of_the_valley",e.SmoothRedSandstone="minecraft:smooth_red_sandstone",e.DeepslateCopperOre="minecraft:deepslate_copper_ore",e.StoneBrickStairs="minecraft:stone_brick_stairs",e.TuffStairs="minecraft:tuff_stairs",e.SugarCane="minecraft:sugar_cane",e.CrimsonFenceGate="minecraft:crimson_fence_gate",e.DiamondChestplate="minecraft:diamond_chestplate",e.NetherGoldOre="minecraft:nether_gold_ore",e.MangroveStairs="minecraft:mangrove_stairs",e.WarpedFenceGate="minecraft:warped_fence_gate",e.Basalt="minecraft:basalt",e.OakStairs="minecraft:oak_stairs",e.JungleDoor="minecraft:jungle_door",e.Diorite="minecraft:diorite",e.CoarseDirt="minecraft:coarse_dirt",e.SpruceStairs="minecraft:spruce_stairs",e.Allow="minecraft:allow",e.GrayConcretePowder="minecraft:gray_concrete_powder",e.BirchStairs="minecraft:birch_stairs",e.DarkOakHangingSign="minecraft:dark_oak_hanging_sign",e.GreenConcrete="minecraft:green_concrete",e.StrippedCrimsonHyphae="minecraft:stripped_crimson_hyphae",e.PolishedAndesiteStairs="minecraft:polished_andesite_stairs",e.AcaciaStairs="minecraft:acacia_stairs",e.IronAxe="minecraft:iron_axe",e.BirchLeaves="minecraft:birch_leaves",e.SilverGlazedTerracotta="minecraft:silver_glazed_terracotta",e.VerdantFroglight="minecraft:verdant_froglight",e.WaxedWeatheredCopperGrate="minecraft:waxed_weathered_copper_grate",e.WaxedWeatheredCopperBulb="minecraft:waxed_weathered_copper_bulb",e.MossyCobblestoneSlab="minecraft:mossy_cobblestone_slab",e.MagentaGlazedTerracotta="minecraft:magenta_glazed_terracotta",e.DarkOakStairs="minecraft:dark_oak_stairs",e.PinkDye="minecraft:pink_dye",e.BrownDye="minecraft:brown_dye",e.BlackDye="minecraft:black_dye",e.CrimsonNylium="minecraft:crimson_nylium",e.SquidSpawnEgg="minecraft:squid_spawn_egg",e.WaxedExposedCopperTrapdoor="minecraft:waxed_exposed_copper_trapdoor",e.BambooChestRaft="minecraft:bamboo_chest_raft",e.MossyStoneBrickStairs="minecraft:mossy_stone_brick_stairs",e.CookedSalmon="minecraft:cooked_salmon",e.CowSpawnEgg="minecraft:cow_spawn_egg",e.AmethystBlock="minecraft:amethyst_block",e.Target="minecraft:target",e.ScrapePotterySherd="minecraft:scrape_pottery_sherd",e.Emerald="minecraft:emerald",e.CobbledDeepslateSlab="minecraft:cobbled_deepslate_slab",e.MushroomStew="minecraft:mushroom_stew",e.GrassBlock="minecraft:grass_block",e.LimeGlazedTerracotta="minecraft:lime_glazed_terracotta",e.DiamondSword="minecraft:diamond_sword",e.PandaSpawnEgg="minecraft:panda_spawn_egg",e.AcaciaSign="minecraft:acacia_sign",e.SandstoneStairs="minecraft:sandstone_stairs",e.DioriteStairs="minecraft:diorite_stairs",e.Arrow="minecraft:arrow",e.PolishedDioriteStairs="minecraft:polished_diorite_stairs",e.Sponge="minecraft:sponge",e.AndesiteStairs="minecraft:andesite_stairs",e.BlackStainedGlass="minecraft:black_stained_glass",e.LightGrayDye="minecraft:light_gray_dye",e.LightBlueShulkerBox="minecraft:light_blue_shulker_box",e.Diamond="minecraft:diamond",e.SeaLantern="minecraft:sea_lantern",e.MossyStoneBrickSlab="minecraft:mossy_stone_brick_slab",e.DeadHornCoralFan="minecraft:dead_horn_coral_fan",e.DeadHornCoralBlock="minecraft:dead_horn_coral_block",e.Lectern="minecraft:lectern",e.PrismarineBricks="minecraft:prismarine_bricks",e.GreenStainedGlass="minecraft:green_stained_glass",e.CocoaBeans="minecraft:cocoa_beans",e.MusicDiscWait="minecraft:music_disc_wait",e.HeartbreakPotterySherd="minecraft:heartbreak_pottery_sherd",e.JungleHangingSign="minecraft:jungle_hanging_sign",e.BlueConcretePowder="minecraft:blue_concrete_powder",e.NetheriteIngot="minecraft:netherite_ingot",e.GildedBlackstone="minecraft:gilded_blackstone",e.PoppedChorusFruit="minecraft:popped_chorus_fruit",e.BrickStairs="minecraft:brick_stairs",e.WaxedCutCopperStairs="minecraft:waxed_cut_copper_stairs",e.Cornflower="minecraft:cornflower",e.SalmonBucket="minecraft:salmon_bucket",e.CyanStainedGlass="minecraft:cyan_stained_glass",e.CyanCarpet="minecraft:cyan_carpet",e.Netherbrick="minecraft:netherbrick",e.CobblestoneSlab="minecraft:cobblestone_slab",e.HardPurpleStainedGlassPane="minecraft:hard_purple_stained_glass_pane",e.GreenTerracotta="minecraft:green_terracotta",e.WaxedCopperTrapdoor="minecraft:waxed_copper_trapdoor",e.NetherBrickStairs="minecraft:nether_brick_stairs",e.GreenGlazedTerracotta="minecraft:green_glazed_terracotta",e.HangingRoots="minecraft:hanging_roots",e.BlueTerracotta="minecraft:blue_terracotta",e.ExposedCopperTrapdoor="minecraft:exposed_copper_trapdoor",e.BirchDoor="minecraft:birch_door",e.BirchPressurePlate="minecraft:birch_pressure_plate",e.ZombieVillagerSpawnEgg="minecraft:zombie_villager_spawn_egg",e.SpireArmorTrimSmithingTemplate="minecraft:spire_armor_trim_smithing_template",e.ExposedCutCopper="minecraft:exposed_cut_copper",e.MusicDiscRelic="minecraft:music_disc_relic",e.WaxedExposedCutCopperStairs="minecraft:waxed_exposed_cut_copper_stairs",e.SpruceSign="minecraft:spruce_sign",e.QuartzStairs="minecraft:quartz_stairs",e.PurpurStairs="minecraft:purpur_stairs",e.CopperIngot="minecraft:copper_ingot",e.BrownConcretePowder="minecraft:brown_concrete_powder",e.FlowArmorTrimSmithingTemplate="minecraft:flow_armor_trim_smithing_template",e.CrackedDeepslateBricks="minecraft:cracked_deepslate_bricks",e.PinkConcretePowder="minecraft:pink_concrete_powder",e.LightGrayWool="minecraft:light_gray_wool",e.RedWool="minecraft:red_wool",e.MelonBlock="minecraft:melon_block",e.BambooPressurePlate="minecraft:bamboo_pressure_plate",e.Dropper="minecraft:dropper",e.WardArmorTrimSmithingTemplate="minecraft:ward_armor_trim_smithing_template",e.ExposedCopperGrate="minecraft:exposed_copper_grate",e.Cobblestone="minecraft:cobblestone",e.DarkOakSign="minecraft:dark_oak_sign",e.MossCarpet="minecraft:moss_carpet",e.CrimsonStairs="minecraft:crimson_stairs",e.Calcite="minecraft:calcite",e.StriderSpawnEgg="minecraft:strider_spawn_egg",e.GrayTerracotta="minecraft:gray_terracotta",e.LapisLazuli="minecraft:lapis_lazuli",e.BlackstoneStairs="minecraft:blackstone_stairs",e.Book="minecraft:book",e.DeadBubbleCoralFan="minecraft:dead_bubble_coral_fan",e.PolishedBlackstoneBrickStairs="minecraft:polished_blackstone_brick_stairs",e.AcaciaWood="minecraft:acacia_wood",e.OchreFroglight="minecraft:ochre_froglight",e.Brush="minecraft:brush",e.ExposedCutCopperStairs="minecraft:exposed_cut_copper_stairs",e.EnderPearl="minecraft:ender_pearl",e.ChiseledNetherBricks="minecraft:chiseled_nether_bricks",e.HardLimeStainedGlass="minecraft:hard_lime_stained_glass",e.PolishedDeepslateStairs="minecraft:polished_deepslate_stairs",e.BirchHangingSign="minecraft:birch_hanging_sign",e.PurpleDye="minecraft:purple_dye",e.PolishedTuffWall="minecraft:polished_tuff_wall",e.WeatheredCutCopperStairs="minecraft:weathered_cut_copper_stairs",e.MusicDisc5="minecraft:music_disc_5",e.BambooTrapdoor="minecraft:bamboo_trapdoor",e.CopperDoor="minecraft:copper_door",e.NetheritePickaxe="minecraft:netherite_pickaxe",e.ExposedCopperBulb="minecraft:exposed_copper_bulb",e.DiamondBlock="minecraft:diamond_block",e.PitcherPod="minecraft:pitcher_pod",e.IronHoe="minecraft:iron_hoe",e.WaxedCopperBulb="minecraft:waxed_copper_bulb",e.SculkVein="minecraft:sculk_vein",e.BrownStainedGlassPane="minecraft:brown_stained_glass_pane",e.Andesite="minecraft:andesite",e.PinkStainedGlassPane="minecraft:pink_stained_glass_pane",e.CodSpawnEgg="minecraft:cod_spawn_egg",e.NetheriteBlock="minecraft:netherite_block",e.Coal="minecraft:coal",e.WaxedWeatheredCutCopperStairs="minecraft:waxed_weathered_cut_copper_stairs",e.LightBlock5="minecraft:light_block_5",e.WaxedOxidizedCutCopperStairs="minecraft:waxed_oxidized_cut_copper_stairs",e.InkSac="minecraft:ink_sac",e.NetheriteScrap="minecraft:netherite_scrap",e.TuffBrickStairs="minecraft:tuff_brick_stairs",e.LightGrayTerracotta="minecraft:light_gray_terracotta",e.BurnPotterySherd="minecraft:burn_pottery_sherd",e.RavagerSpawnEgg="minecraft:ravager_spawn_egg",e.Bone="minecraft:bone",e.CobbledDeepslateStairs="minecraft:cobbled_deepslate_stairs",e.ShulkerSpawnEgg="minecraft:shulker_spawn_egg",e.DeepslateTileStairs="minecraft:deepslate_tile_stairs",e.YellowTerracotta="minecraft:yellow_terracotta",e.BrownGlazedTerracotta="minecraft:brown_glazed_terracotta",e.SlimeSpawnEgg="minecraft:slime_spawn_egg",e.PillagerSpawnEgg="minecraft:pillager_spawn_egg",e.Observer="minecraft:observer",e.PinkGlazedTerracotta="minecraft:pink_glazed_terracotta",e.Compass="minecraft:compass",e.HardLightGrayStainedGlass="minecraft:hard_light_gray_stained_glass",e.DeepslateBrickStairs="minecraft:deepslate_brick_stairs",e.WaxedOxidizedCopperBulb="minecraft:waxed_oxidized_copper_bulb",e.EnchantedBook="minecraft:enchanted_book",e.CutSandstone="minecraft:cut_sandstone",e.RedTulip="minecraft:red_tulip",e.MudBrickStairs="minecraft:mud_brick_stairs",e.HardMagentaStainedGlass="minecraft:hard_magenta_stained_glass",e.FlintAndSteel="minecraft:flint_and_steel",e.OminousBottle="minecraft:ominous_bottle",e.CopperBulb="minecraft:copper_bulb",e.CreeperSpawnEgg="minecraft:creeper_spawn_egg",e.SalmonSpawnEgg="minecraft:salmon_spawn_egg",e.SpruceDoor="minecraft:spruce_door",e.ChiseledSandstone="minecraft:chiseled_sandstone",e.FrostedIce="minecraft:frosted_ice",e.CutCopperSlab="minecraft:cut_copper_slab",e.QuartzOre="minecraft:quartz_ore",e.CalibratedSculkSensor="minecraft:calibrated_sculk_sensor",e.Snow="minecraft:snow",e.MangroveDoor="minecraft:mangrove_door",e.BrownWool="minecraft:brown_wool",e.PinkWool="minecraft:pink_wool",e.GoldBlock="minecraft:gold_block",e.StrippedOakLog="minecraft:stripped_oak_log",e.BlueIce="minecraft:blue_ice",e.CherryDoor="minecraft:cherry_door",e.JungleTrapdoor="minecraft:jungle_trapdoor",e.SkullBannerPattern="minecraft:skull_banner_pattern",e.BlackConcretePowder="minecraft:black_concrete_powder",e.BambooDoor="minecraft:bamboo_door",e.Vine="minecraft:vine",e.WaxedOxidizedChiseledCopper="minecraft:waxed_oxidized_chiseled_copper",e.PolarBearSpawnEgg="minecraft:polar_bear_spawn_egg",e.Farmland="minecraft:farmland",e.AcaciaSapling="minecraft:acacia_sapling",e.HardBlueStainedGlassPane="minecraft:hard_blue_stained_glass_pane",e.YellowShulkerBox="minecraft:yellow_shulker_box",e.ChiseledCopper="minecraft:chiseled_copper",e.WaxedWeatheredCopper="minecraft:waxed_weathered_copper",e.OxidizedCopperDoor="minecraft:oxidized_copper_door",e.ChiseledQuartzBlock="minecraft:chiseled_quartz_block",e.DeepslateBricks="minecraft:deepslate_bricks",e.BambooBlock="minecraft:bamboo_block",e.NetheriteUpgradeSmithingTemplate="minecraft:netherite_upgrade_smithing_template",e.NetheriteHelmet="minecraft:netherite_helmet",e.GusterPotterySherd="minecraft:guster_pottery_sherd",e.Lantern="minecraft:lantern",e.NetheriteSword="minecraft:netherite_sword",e.ChainCommandBlock="minecraft:chain_command_block",e.AcaciaTrapdoor="minecraft:acacia_trapdoor",e.BakedPotato="minecraft:baked_potato",e.MangroveTrapdoor="minecraft:mangrove_trapdoor",e.CherryTrapdoor="minecraft:cherry_trapdoor",e.GlowstoneDust="minecraft:glowstone_dust",e.Blackstone="minecraft:blackstone",e.WarpedWartBlock="minecraft:warped_wart_block",e.LlamaSpawnEgg="minecraft:llama_spawn_egg",e.WarpedTrapdoor="minecraft:warped_trapdoor",e.EndRod="minecraft:end_rod",e.FletchingTable="minecraft:fletching_table",e.CoastArmorTrimSmithingTemplate="minecraft:coast_armor_trim_smithing_template",e.ChemicalHeat="minecraft:chemical_heat",e.StrippedDarkOakLog="minecraft:stripped_dark_oak_log",e.RedConcrete="minecraft:red_concrete",e.CrimsonHyphae="minecraft:crimson_hyphae",e.BlackTerracotta="minecraft:black_terracotta",e.DriedKelpBlock="minecraft:dried_kelp_block",e.ChippedAnvil="minecraft:chipped_anvil",e.ExplorerPotterySherd="minecraft:explorer_pottery_sherd",e.Porkchop="minecraft:porkchop",e.FlowerPot="minecraft:flower_pot",e.UnderwaterTorch="minecraft:underwater_torch",e.RespawnAnchor="minecraft:respawn_anchor",e.NetheriteBoots="minecraft:netherite_boots",e.MangroveLeaves="minecraft:mangrove_leaves",e.RawCopperBlock="minecraft:raw_copper_block",e.Beetroot="minecraft:beetroot",e.WardenSpawnEgg="minecraft:warden_spawn_egg",e.HardCyanStainedGlass="minecraft:hard_cyan_stained_glass",e.WaxedWeatheredCopperTrapdoor="minecraft:waxed_weathered_copper_trapdoor",e.PolishedDiorite="minecraft:polished_diorite",e.CyanGlazedTerracotta="minecraft:cyan_glazed_terracotta",e.PinkShulkerBox="minecraft:pink_shulker_box",e.PackedIce="minecraft:packed_ice",e.SmoothQuartz="minecraft:smooth_quartz",e.PurpleTerracotta="minecraft:purple_terracotta",e.Bed="minecraft:bed",e.WaxedExposedCopper="minecraft:waxed_exposed_copper",e.StrippedAcaciaWood="minecraft:stripped_acacia_wood",e.WaxedOxidizedCopperGrate="minecraft:waxed_oxidized_copper_grate",e.ChainmailHelmet="minecraft:chainmail_helmet",e.OxidizedChiseledCopper="minecraft:oxidized_chiseled_copper",e.HardMagentaStainedGlassPane="minecraft:hard_magenta_stained_glass_pane",e.PinkStainedGlass="minecraft:pink_stained_glass",e.MusicDiscStal="minecraft:music_disc_stal",e.BrownStainedGlass="minecraft:brown_stained_glass",e.CoalBlock="minecraft:coal_block",e.Vault="minecraft:vault",e.AzaleaLeavesFlowered="minecraft:azalea_leaves_flowered",e.StructureVoid="minecraft:structure_void",e.ChainmailChestplate="minecraft:chainmail_chestplate",e.RecoveryCompass="minecraft:recovery_compass",e.MudBricks="minecraft:mud_bricks",e.Peony="minecraft:peony",e.CrackedPolishedBlackstoneBricks="minecraft:cracked_polished_blackstone_bricks",e.Allium="minecraft:allium",e.AcaciaChestBoat="minecraft:acacia_chest_boat",e.OakWood="minecraft:oak_wood",e.WaxedOxidizedCopperTrapdoor="minecraft:waxed_oxidized_copper_trapdoor",e.SkeletonHorseSpawnEgg="minecraft:skeleton_horse_spawn_egg",e.LightBlueWool="minecraft:light_blue_wool",e.ClayBall="minecraft:clay_ball",e.BlackConcrete="minecraft:black_concrete",e.ShortGrass="minecraft:short_grass",e.LapisBlock="minecraft:lapis_block",e.BreezeSpawnEgg="minecraft:breeze_spawn_egg",e.LimeConcrete="minecraft:lime_concrete",e.WaxedWeatheredCutCopperSlab="minecraft:waxed_weathered_cut_copper_slab",e.SmoothQuartzSlab="minecraft:smooth_quartz_slab",e.TorchflowerSeeds="minecraft:torchflower_seeds",e.HayBlock="minecraft:hay_block",e.PolishedBlackstoneBrickSlab="minecraft:polished_blackstone_brick_slab",e.StrippedBambooBlock="minecraft:stripped_bamboo_block",e.ChiseledStoneBricks="minecraft:chiseled_stone_bricks",e.Ladder="minecraft:ladder",e.IronChestplate="minecraft:iron_chestplate",e.DiamondHelmet="minecraft:diamond_helmet",e.WaxedOxidizedCutCopperSlab="minecraft:waxed_oxidized_cut_copper_slab",e.PrismarineCrystals="minecraft:prismarine_crystals",e.Banner="minecraft:banner",e.PumpkinSeeds="minecraft:pumpkin_seeds",e.WhiteConcrete="minecraft:white_concrete",e.HardGrayStainedGlass="minecraft:hard_gray_stained_glass",e.SlimeBall="minecraft:slime_ball",e.TubeCoral="minecraft:tube_coral",e.Stick="minecraft:stick",e.Egg="minecraft:egg",e.NetherSprouts="minecraft:nether_sprouts",e.WeatheredCopperDoor="minecraft:weathered_copper_door",e.MusicDiscBlocks="minecraft:music_disc_blocks",e.BrickBlock="minecraft:brick_block",e.RedstoneLamp="minecraft:redstone_lamp",e.CherrySlab="minecraft:cherry_slab",e.CutCopper="minecraft:cut_copper",e.Bamboo="minecraft:bamboo",e.CyanConcrete="minecraft:cyan_concrete",e.PrismarineBrickSlab="minecraft:prismarine_brick_slab",e.Smoker="minecraft:smoker",e.Frame="minecraft:frame",e.BrewerPotterySherd="minecraft:brewer_pottery_sherd",e.RedSand="minecraft:red_sand",e.PinkCarpet="minecraft:pink_carpet",e.GreenDye="minecraft:green_dye",e.GusterBannerPattern="minecraft:guster_banner_pattern",e.BrownCarpet="minecraft:brown_carpet",e.LightGrayConcrete="minecraft:light_gray_concrete",e.WeatheredCopperGrate="minecraft:weathered_copper_grate",e.WeatheredCopperTrapdoor="minecraft:weathered_copper_trapdoor",e.ChorusPlant="minecraft:chorus_plant",e.PurpleWool="minecraft:purple_wool",e.WaxedOxidizedCutCopper="minecraft:waxed_oxidized_cut_copper",e.GrayConcrete="minecraft:gray_concrete",e.WaxedOxidizedCopperDoor="minecraft:waxed_oxidized_copper_door",e.FermentedSpiderEye="minecraft:fermented_spider_eye",e.SpiderEye="minecraft:spider_eye",e.MagentaConcretePowder="minecraft:magenta_concrete_powder",e.LimeStainedGlassPane="minecraft:lime_stained_glass_pane",e.OrangeConcrete="minecraft:orange_concrete",e.TraderLlamaSpawnEgg="minecraft:trader_llama_spawn_egg",e.GhastTear="minecraft:ghast_tear",e.PinkConcrete="minecraft:pink_concrete",e.LitPumpkin="minecraft:lit_pumpkin",e.BrownConcrete="minecraft:brown_concrete",e.Compound="minecraft:compound",e.MudBrickSlab="minecraft:mud_brick_slab",e.Tuff="minecraft:tuff",e.ExposedCopperDoor="minecraft:exposed_copper_door",e.GrayGlazedTerracotta="minecraft:gray_glazed_terracotta",e.SnortPotterySherd="minecraft:snort_pottery_sherd",e.StoneButton="minecraft:stone_button",e.SpruceSapling="minecraft:spruce_sapling",e.LightBlock8="minecraft:light_block_8",e.WaxedCutCopperSlab="minecraft:waxed_cut_copper_slab",e.Feather="minecraft:feather",e.Clay="minecraft:clay",e.WolfSpawnEgg="minecraft:wolf_spawn_egg",e.CyanStainedGlassPane="minecraft:cyan_stained_glass_pane",e.VillagerSpawnEgg="minecraft:villager_spawn_egg",e.LimeDye="minecraft:lime_dye",e.CrimsonFungus="minecraft:crimson_fungus",e.Trident="minecraft:trident",e.HardenedClay="minecraft:hardened_clay",e.GoatHorn="minecraft:goat_horn",e.Crafter="minecraft:crafter",e.SheepSpawnEgg="minecraft:sheep_spawn_egg",e.MusicDiscPigstep="minecraft:music_disc_pigstep",e.Azalea="minecraft:azalea",e.FireCharge="minecraft:fire_charge",e.AcaciaBoat="minecraft:acacia_boat",e.CyanWool="minecraft:cyan_wool",e.DeepslateDiamondOre="minecraft:deepslate_diamond_ore",e.WhiteCandle="minecraft:white_candle",e.Clock="minecraft:clock",e.RedCarpet="minecraft:red_carpet",e.LightGrayCarpet="minecraft:light_gray_carpet",e.PurpurBlock="minecraft:purpur_block",e.DriedKelp="minecraft:dried_kelp",e.CookedBeef="minecraft:cooked_beef",e.CherryHangingSign="minecraft:cherry_hanging_sign",e.PolishedBlackstone="minecraft:polished_blackstone",e.CrimsonPressurePlate="minecraft:crimson_pressure_plate",e.Charcoal="minecraft:charcoal",e.LightGrayShulkerBox="minecraft:light_gray_shulker_box",e.HorseSpawnEgg="minecraft:horse_spawn_egg",e.NautilusShell="minecraft:nautilus_shell",e.Bow="minecraft:bow",e.String="minecraft:string",e.FrogSpawn="minecraft:frog_spawn",e.RedStainedGlassPane="minecraft:red_stained_glass_pane",e.RedCandle="minecraft:red_candle",e.GlowLichen="minecraft:glow_lichen",e.CopperTrapdoor="minecraft:copper_trapdoor",e.LeatherHelmet="minecraft:leather_helmet",e.WitherRose="minecraft:wither_rose",e.DarkOakChestBoat="minecraft:dark_oak_chest_boat",e.CopperBlock="minecraft:copper_block",e.SplashPotion="minecraft:splash_potion",e.Cactus="minecraft:cactus",e.TurtleScute="minecraft:turtle_scute",e.GlowFrame="minecraft:glow_frame",e.AcaciaSlab="minecraft:acacia_slab",e.PolishedAndesiteSlab="minecraft:polished_andesite_slab",e.Glass="minecraft:glass",e.MossBlock="minecraft:moss_block",e.GoldOre="minecraft:gold_ore",e.SkeletonSpawnEgg="minecraft:skeleton_spawn_egg",e.CutSandstoneSlab="minecraft:cut_sandstone_slab",e.EndCrystal="minecraft:end_crystal",e.PurpleCarpet="minecraft:purple_carpet",e.FireCoralFan="minecraft:fire_coral_fan",e.GreenConcretePowder="minecraft:green_concrete_powder",e.LimeStainedGlass="minecraft:lime_stained_glass",e.PolishedAndesite="minecraft:polished_andesite",e.PurpleStainedGlass="minecraft:purple_stained_glass",e.OakBoat="minecraft:oak_boat",e.MagentaStainedGlass="minecraft:magenta_stained_glass",e.WeatheredCopperBulb="minecraft:weathered_copper_bulb",e.LightWeightedPressurePlate="minecraft:light_weighted_pressure_plate",e.RapidFertilizer="minecraft:rapid_fertilizer",e.HoneyBlock="minecraft:honey_block",e.StructureBlock="minecraft:structure_block",e.TintedGlass="minecraft:tinted_glass",e.BuddingAmethyst="minecraft:budding_amethyst",e.PinkTulip="minecraft:pink_tulip",e.OakHangingSign="minecraft:oak_hanging_sign",e.SpruceSlab="minecraft:spruce_slab",e.GlassPane="minecraft:glass_pane",e.ShelterPotterySherd="minecraft:shelter_pottery_sherd",e.InfestedDeepslate="minecraft:infested_deepslate",e.Podzol="minecraft:podzol",e.ActivatorRail="minecraft:activator_rail",e.WhiteStainedGlassPane="minecraft:white_stained_glass_pane",e.LightBlock12="minecraft:light_block_12",e.BrownCandle="minecraft:brown_candle",e.PolishedDeepslateSlab="minecraft:polished_deepslate_slab",e.Deepslate="minecraft:deepslate",e.StrippedOakWood="minecraft:stripped_oak_wood",e.OxidizedCopper="minecraft:oxidized_copper",e.IronShovel="minecraft:iron_shovel",e.StoneBricks="minecraft:stone_bricks",e.NetherWart="minecraft:nether_wart",e.OrangeStainedGlassPane="minecraft:orange_stained_glass_pane",e.GoatSpawnEgg="minecraft:goat_spawn_egg",e.StrippedMangroveWood="minecraft:stripped_mangrove_wood",e.Campfire="minecraft:campfire",e.OrangeConcretePowder="minecraft:orange_concrete_powder",e.FlowPotterySherd="minecraft:flow_pottery_sherd",e.GreenCandle="minecraft:green_candle",e.PurpleStainedGlassPane="minecraft:purple_stained_glass_pane",e.Jigsaw="minecraft:jigsaw",e.AcaciaPressurePlate="minecraft:acacia_pressure_plate",e.SmoothRedSandstoneSlab="minecraft:smooth_red_sandstone_slab",e.ChiseledPolishedBlackstone="minecraft:chiseled_polished_blackstone",e.SmoothStoneSlab="minecraft:smooth_stone_slab",e.AzaleaLeaves="minecraft:azalea_leaves",e.MagentaStainedGlassPane="minecraft:magenta_stained_glass_pane",e.WoodenAxe="minecraft:wooden_axe",e.CyanCandle="minecraft:cyan_candle",e.PrizePotterySherd="minecraft:prize_pottery_sherd",e.WhiteCarpet="minecraft:white_carpet",e.OakChestBoat="minecraft:oak_chest_boat",e.BirchWood="minecraft:birch_wood",e.GlowInkSac="minecraft:glow_ink_sac",e.HardCyanStainedGlassPane="minecraft:hard_cyan_stained_glass_pane",e.EmeraldOre="minecraft:emerald_ore",e.SmoothStone="minecraft:smooth_stone",e.HardLightBlueStainedGlass="minecraft:hard_light_blue_stained_glass",e.YellowConcretePowder="minecraft:yellow_concrete_powder",e.OakSlab="minecraft:oak_slab",e.GoldenHorseArmor="minecraft:golden_horse_armor",e.CherryWood="minecraft:cherry_wood",e.BirchSlab="minecraft:birch_slab",e.JungleSlab="minecraft:jungle_slab",e.MagentaDye="minecraft:magenta_dye",e.MangroveSlab="minecraft:mangrove_slab",e.WaterBucket="minecraft:water_bucket",e.HardBlueStainedGlass="minecraft:hard_blue_stained_glass",e.PolishedGraniteSlab="minecraft:polished_granite_slab",e.LapisOre="minecraft:lapis_ore",e.LightBlock9="minecraft:light_block_9",e.Beehive="minecraft:beehive",e.OxidizedCutCopperSlab="minecraft:oxidized_cut_copper_slab",e.SculkSensor="minecraft:sculk_sensor",e.BambooSlab="minecraft:bamboo_slab",e.PoisonousPotato="minecraft:poisonous_potato",e.PrismarineSlab="minecraft:prismarine_slab",e.SandstoneSlab="minecraft:sandstone_slab",e.WolfArmor="minecraft:wolf_armor",e.HardOrangeStainedGlass="minecraft:hard_orange_stained_glass",e.LimeConcretePowder="minecraft:lime_concrete_powder",e.GreenCarpet="minecraft:green_carpet",e.SpruceButton="minecraft:spruce_button",e.CherryPressurePlate="minecraft:cherry_pressure_plate",e.CutRedSandstoneSlab="minecraft:cut_red_sandstone_slab",e.DioriteSlab="minecraft:diorite_slab",e.Medicine="minecraft:medicine",e.AndesiteSlab="minecraft:andesite_slab",e.HornCoralFan="minecraft:horn_coral_fan",e.BrickSlab="minecraft:brick_slab",e.NetherBrickSlab="minecraft:nether_brick_slab",e.DripstoneBlock="minecraft:dripstone_block",e.Gunpowder="minecraft:gunpowder",e.PurpurSlab="minecraft:purpur_slab",e.MagentaCarpet="minecraft:magenta_carpet",e.GlowBerries="minecraft:glow_berries",e.Bread="minecraft:bread",e.WeatheredCutCopperSlab="minecraft:weathered_cut_copper_slab",e.StoneSword="minecraft:stone_sword",e.Leather="minecraft:leather",e.MangroveRoots="minecraft:mangrove_roots",e.CommandBlockMinecart="minecraft:command_block_minecart",e.WaxedExposedCutCopper="minecraft:waxed_exposed_cut_copper",e.SpruceLeaves="minecraft:spruce_leaves",e.StrippedCherryLog="minecraft:stripped_cherry_log",e.DeepslateTileSlab="minecraft:deepslate_tile_slab",e.PolishedTuffStairs="minecraft:polished_tuff_stairs",e.GoldNugget="minecraft:gold_nugget",e.CrackedNetherBricks="minecraft:cracked_nether_bricks",e.BatSpawnEgg="minecraft:bat_spawn_egg",e.DonkeySpawnEgg="minecraft:donkey_spawn_egg",e.RabbitHide="minecraft:rabbit_hide",e.RibArmorTrimSmithingTemplate="minecraft:rib_armor_trim_smithing_template",e.InfestedCobblestone="minecraft:infested_cobblestone",e.DarkPrismarine="minecraft:dark_prismarine",e.HardLightBlueStainedGlassPane="minecraft:hard_light_blue_stained_glass_pane",e.MossyStoneBricks="minecraft:mossy_stone_bricks",e.PolishedBlackstoneBricks="minecraft:polished_blackstone_bricks",e.TropicalFishSpawnEgg="minecraft:tropical_fish_spawn_egg",e.MobSpawner="minecraft:mob_spawner",e.CopperGrate="minecraft:copper_grate",e.DeepslateTiles="minecraft:deepslate_tiles",e.CrackedDeepslateTiles="minecraft:cracked_deepslate_tiles",e.OrangeGlazedTerracotta="minecraft:orange_glazed_terracotta",e.ChiseledDeepslate="minecraft:chiseled_deepslate",e.EmeraldBlock="minecraft:emerald_block",e.VexSpawnEgg="minecraft:vex_spawn_egg",e.Obsidian="minecraft:obsidian",e.Kelp="minecraft:kelp",e.MelonSlice="minecraft:melon_slice",e.ChiseledRedSandstone="minecraft:chiseled_red_sandstone",e.DeadBubbleCoral="minecraft:dead_bubble_coral",e.DarkOakWood="minecraft:dark_oak_wood",e.TuffBrickWall="minecraft:tuff_brick_wall",e.QuartzPillar="minecraft:quartz_pillar",e.PolishedTuffSlab="minecraft:polished_tuff_slab",e.WaxedCopperDoor="minecraft:waxed_copper_door",e.WaxedCopperGrate="minecraft:waxed_copper_grate",e.DeadBrainCoral="minecraft:dead_brain_coral",e.SmoothBasalt="minecraft:smooth_basalt",e.YellowGlazedTerracotta="minecraft:yellow_glazed_terracotta",e.JunglePressurePlate="minecraft:jungle_pressure_plate",e.CatSpawnEgg="minecraft:cat_spawn_egg",e.HowlPotterySherd="minecraft:howl_pottery_sherd",e.WaxedExposedCopperDoor="minecraft:waxed_exposed_copper_door",e.LightBlueTerracotta="minecraft:light_blue_terracotta",e.WaxedWeatheredCutCopper="minecraft:waxed_weathered_cut_copper",e.OakLog="minecraft:oak_log",e.DolphinSpawnEgg="minecraft:dolphin_spawn_egg",e.InfestedStone="minecraft:infested_stone",e.ExposedChiseledCopper="minecraft:exposed_chiseled_copper",e.WeatheredChiseledCopper="minecraft:weathered_chiseled_copper",e.CherrySapling="minecraft:cherry_sapling",e.WaxedChiseledCopper="minecraft:waxed_chiseled_copper",e.CookedRabbit="minecraft:cooked_rabbit",e.Flint="minecraft:flint",e.TrialKey="minecraft:trial_key",e.WaxedExposedChiseledCopper="minecraft:waxed_exposed_chiseled_copper",e.EnderChest="minecraft:ender_chest",e.DeepslateCoalOre="minecraft:deepslate_coal_ore",e.OxidizedCopperBulb="minecraft:oxidized_copper_bulb",e.DragonEgg="minecraft:dragon_egg",e.WaxedExposedCopperBulb="minecraft:waxed_exposed_copper_bulb",e.PinkPetals="minecraft:pink_petals",e.BeeSpawnEgg="minecraft:bee_spawn_egg",e.BrainCoral="minecraft:brain_coral",e.Dispenser="minecraft:dispenser",e.RawIronBlock="minecraft:raw_iron_block",e.CrimsonRoots="minecraft:crimson_roots",e.SpruceWood="minecraft:spruce_wood",e.TadpoleSpawnEgg="minecraft:tadpole_spawn_egg",e.TurtleSpawnEgg="minecraft:turtle_spawn_egg",e.HoneycombBlock="minecraft:honeycomb_block",e.JungleSapling="minecraft:jungle_sapling",e.EnderEye="minecraft:ender_eye",e.NetherBrick="minecraft:nether_brick",e.CherryButton="minecraft:cherry_button",e.Lodestone="minecraft:lodestone",e.GrayWool="minecraft:gray_wool",e.StoneShovel="minecraft:stone_shovel",e.BlackWool="minecraft:black_wool",e.StrippedBirchLog="minecraft:stripped_birch_log",e.Potato="minecraft:potato",e.OrangeWool="minecraft:orange_wool",e.YellowWool="minecraft:yellow_wool",e.LimeWool="minecraft:lime_wool",e.SkullPotterySherd="minecraft:skull_pottery_sherd",e.GreenWool="minecraft:green_wool",e.MagentaTerracotta="minecraft:magenta_terracotta",e.BlackCarpet="minecraft:black_carpet",e.BlueWool="minecraft:blue_wool",e.HardGlassPane="minecraft:hard_glass_pane",e.GrayDye="minecraft:gray_dye",e.Jukebox="minecraft:jukebox",e.Shield="minecraft:shield",e.HardBlackStainedGlass="minecraft:hard_black_stained_glass",e.YellowCarpet="minecraft:yellow_carpet",e.LimeCarpet="minecraft:lime_carpet",e.GoldenSword="minecraft:golden_sword",e.Sunflower="minecraft:sunflower",e.MusicDiscFar="minecraft:music_disc_far",e.BlueCarpet="minecraft:blue_carpet",e.LightGrayConcretePowder="minecraft:light_gray_concrete_powder",e.RedConcretePowder="minecraft:red_concrete_powder",e.DarkOakLeaves="minecraft:dark_oak_leaves",e.BrainCoralFan="minecraft:brain_coral_fan",e.Elytra="minecraft:elytra",e.CyanConcretePowder="minecraft:cyan_concrete_powder",e.YellowConcrete="minecraft:yellow_concrete",e.NetheriteChestplate="minecraft:netherite_chestplate",e.DeadTubeCoralBlock="minecraft:dead_tube_coral_block",e.HardLightGrayStainedGlassPane="minecraft:hard_light_gray_stained_glass_pane",e.RedTerracotta="minecraft:red_terracotta",e.OrangeTerracotta="minecraft:orange_terracotta",e.LimeTerracotta="minecraft:lime_terracotta",e.TwistingVines="minecraft:twisting_vines",e.CommandBlock="minecraft:command_block",e.CyanTerracotta="minecraft:cyan_terracotta",e.StoneAxe="minecraft:stone_axe",e.Dandelion="minecraft:dandelion",e.WarpedNylium="minecraft:warped_nylium",e.HornCoralBlock="minecraft:horn_coral_block",e.WhiteGlazedTerracotta="minecraft:white_glazed_terracotta",e.RedGlazedTerracotta="minecraft:red_glazed_terracotta",e.BlueGlazedTerracotta="minecraft:blue_glazed_terracotta",e.BoggedSpawnEgg="minecraft:bogged_spawn_egg",e.Brick="minecraft:brick",e.LargeAmethystBud="minecraft:large_amethyst_bud",e.CartographyTable="minecraft:cartography_table",e.WayfinderArmorTrimSmithingTemplate="minecraft:wayfinder_armor_trim_smithing_template",e.BlueCandle="minecraft:blue_candle",e.PolishedBasalt="minecraft:polished_basalt",e.GrassPath="minecraft:grass_path",e.ColoredTorchRg="minecraft:colored_torch_rg",e.CrimsonStem="minecraft:crimson_stem",e.StrippedSpruceLog="minecraft:stripped_spruce_log",e.OrangeTulip="minecraft:orange_tulip",e.DiamondOre="minecraft:diamond_ore",e.CaveSpiderSpawnEgg="minecraft:cave_spider_spawn_egg",e.BubbleCoral="minecraft:bubble_coral",e.CoalOre="minecraft:coal_ore",e.EmptyMap="minecraft:empty_map",e.JungleBoat="minecraft:jungle_boat",e.Poppy="minecraft:poppy",e.ShulkerShell="minecraft:shulker_shell",e.DeepslateIronOre="minecraft:deepslate_iron_ore",e.DeepslateGoldOre="minecraft:deepslate_gold_ore",e.DeepslateLapisOre="minecraft:deepslate_lapis_ore",e.Granite="minecraft:granite",e.PetrifiedOakSlab="minecraft:petrified_oak_slab",e.NetheriteLeggings="minecraft:netherite_leggings",e.StrippedAcaciaLog="minecraft:stripped_acacia_log",e.LightBlock1="minecraft:light_block_1",e.SpruceLog="minecraft:spruce_log",e.ChestMinecart="minecraft:chest_minecart",e.AcaciaLog="minecraft:acacia_log",e.WarpedHyphae="minecraft:warped_hyphae",e.OxeyeDaisy="minecraft:oxeye_daisy",e.PitcherPlant="minecraft:pitcher_plant",e.MangroveSign="minecraft:mangrove_sign",e.MagmaCubeSpawnEgg="minecraft:magma_cube_spawn_egg",e.MangroveWood="minecraft:mangrove_wood",e.ZombiePigmanSpawnEgg="minecraft:zombie_pigman_spawn_egg",e.PolishedTuff="minecraft:polished_tuff",e.StrippedMangroveLog="minecraft:stripped_mangrove_log",e.CherryLog="minecraft:cherry_log",e.DeadFireCoralFan="minecraft:dead_fire_coral_fan",e.IronLeggings="minecraft:iron_leggings",e.Pufferfish="minecraft:pufferfish",e.AmethystShard="minecraft:amethyst_shard",e.StrippedDarkOakWood="minecraft:stripped_dark_oak_wood",e.StrippedCherryWood="minecraft:stripped_cherry_wood",e.StrippedWarpedHyphae="minecraft:stripped_warped_hyphae",e.Barrier="minecraft:barrier",e.AcaciaLeaves="minecraft:acacia_leaves",e.MangrovePropagule="minecraft:mangrove_propagule",e.StickyPiston="minecraft:sticky_piston",e.OakSapling="minecraft:oak_sapling",e.WhiteTulip="minecraft:white_tulip",e.DarkOakSapling="minecraft:dark_oak_sapling",e.SuspiciousStew="minecraft:suspicious_stew",e.BeeNest="minecraft:bee_nest",e.TadpoleBucket="minecraft:tadpole_bucket",e.WheatSeeds="minecraft:wheat_seeds",e.MelonSeeds="minecraft:melon_seeds",e.SoulSand="minecraft:soul_sand",e.Sugar="minecraft:sugar",e.SpruceChestBoat="minecraft:spruce_chest_boat",e.CherryBoat="minecraft:cherry_boat",e.MangroveChestBoat="minecraft:mangrove_chest_boat",e.CookedCod="minecraft:cooked_cod",e.SmallAmethystBud="minecraft:small_amethyst_bud",e.Apple="minecraft:apple",e.SweetBerries="minecraft:sweet_berries",e.LargeFern="minecraft:large_fern",e.TallGrass="minecraft:tall_grass",e.PufferfishSpawnEgg="minecraft:pufferfish_spawn_egg",e.LeatherLeggings="minecraft:leather_leggings",e.BubbleCoralFan="minecraft:bubble_coral_fan",e.FireCoral="minecraft:fire_coral",e.DeadFireCoral="minecraft:dead_fire_coral",e.CryingObsidian="minecraft:crying_obsidian",e.Lilac="minecraft:lilac",e.DeadTubeCoral="minecraft:dead_tube_coral",e.DeadBrainCoralFan="minecraft:dead_brain_coral_fan",e.DeadTubeCoralFan="minecraft:dead_tube_coral_fan",e.LingeringPotion="minecraft:lingering_potion",e.AzureBluet="minecraft:azure_bluet",e.YellowDye="minecraft:yellow_dye",e.WanderingTraderSpawnEgg="minecraft:wandering_trader_spawn_egg",e.DeadBrainCoralBlock="minecraft:dead_brain_coral_block",e.WeepingVines="minecraft:weeping_vines",e.Waterlily="minecraft:waterlily",e.LightBlueCandle="minecraft:light_blue_candle",e.Seagrass="minecraft:seagrass",e.DiamondPickaxe="minecraft:diamond_pickaxe",e.Deadbush="minecraft:deadbush",e.JungleButton="minecraft:jungle_button",e.Ice="minecraft:ice",e.CyanShulkerBox="minecraft:cyan_shulker_box",e.HardPinkStainedGlassPane="minecraft:hard_pink_stained_glass_pane",e.SnowLayer="minecraft:snow_layer",e.LightBlock0="minecraft:light_block_0",e.DarkOakBoat="minecraft:dark_oak_boat",e.DirtWithRoots="minecraft:dirt_with_roots",e.MuddyMangroveRoots="minecraft:muddy_mangrove_roots",e.TropicalFish="minecraft:tropical_fish",e.SporeBlossom="minecraft:spore_blossom",e.HardYellowStainedGlass="minecraft:hard_yellow_stained_glass",e.AmethystCluster="minecraft:amethyst_cluster",e.MediumAmethystBud="minecraft:medium_amethyst_bud",e.WoodenPressurePlate="minecraft:wooden_pressure_plate",e.HuskSpawnEgg="minecraft:husk_spawn_egg",e.IronSword="minecraft:iron_sword",e.TuffSlab="minecraft:tuff_slab",e.ChiseledTuff="minecraft:chiseled_tuff",e.JungleChestBoat="minecraft:jungle_chest_boat",e.TuffBricks="minecraft:tuff_bricks",e.ChiseledTuffBricks="minecraft:chiseled_tuff_bricks",e.Chicken="minecraft:chicken",e.StoneHoe="minecraft:stone_hoe",e.Beef="minecraft:beef",e.ArmadilloScute="minecraft:armadillo_scute",e.ChainmailBoots="minecraft:chainmail_boots",e.Mutton="minecraft:mutton",e.Rabbit="minecraft:rabbit",e.DiamondHorseArmor="minecraft:diamond_horse_armor",e.Salmon="minecraft:salmon",e.BoltArmorTrimSmithingTemplate="minecraft:bolt_armor_trim_smithing_template",e.BrownMushroom="minecraft:brown_mushroom",e.RedMushroom="minecraft:red_mushroom",e.BrownMushroomBlock="minecraft:brown_mushroom_block",e.Web="minecraft:web",e.EndPortalFrame="minecraft:end_portal_frame",e.ArmorStand="minecraft:armor_stand",e.InfestedStoneBricks="minecraft:infested_stone_bricks",e.InfestedMossyStoneBricks="minecraft:infested_mossy_stone_bricks",e.InfestedCrackedStoneBricks="minecraft:infested_cracked_stone_bricks",e.SnifferEgg="minecraft:sniffer_egg",e.ChainmailLeggings="minecraft:chainmail_leggings",e.ChickenSpawnEgg="minecraft:chicken_spawn_egg",e.OcelotSpawnEgg="minecraft:ocelot_spawn_egg",e.ReinforcedDeepslate="minecraft:reinforced_deepslate",e.MooshroomSpawnEgg="minecraft:mooshroom_spawn_egg",e.ParrotSpawnEgg="minecraft:parrot_spawn_egg",e.MuleSpawnEgg="minecraft:mule_spawn_egg",e.HardOrangeStainedGlassPane="minecraft:hard_orange_stained_glass_pane",e.ZombieHorseSpawnEgg="minecraft:zombie_horse_spawn_egg",e.EndermanSpawnEgg="minecraft:enderman_spawn_egg",e.SilverfishSpawnEgg="minecraft:silverfish_spawn_egg",e.WitherSkeletonSpawnEgg="minecraft:wither_skeleton_spawn_egg",e.CookedPorkchop="minecraft:cooked_porkchop",e.MusicDiscOtherside="minecraft:music_disc_otherside",e.LeatherBoots="minecraft:leather_boots",e.SpiderSpawnEgg="minecraft:spider_spawn_egg",e.Sculk="minecraft:sculk",e.ZombieSpawnEgg="minecraft:zombie_spawn_egg",e.MusicDiscPrecipice="minecraft:music_disc_precipice",e.WitchSpawnEgg="minecraft:witch_spawn_egg",e.GuardianSpawnEgg="minecraft:guardian_spawn_egg",e.DamagedAnvil="minecraft:damaged_anvil",e.PiglinSpawnEgg="minecraft:piglin_spawn_egg",e.ZoglinSpawnEgg="minecraft:zoglin_spawn_egg",e.Loom="minecraft:loom",e.AxolotlSpawnEgg="minecraft:axolotl_spawn_egg",e.AllaySpawnEgg="minecraft:allay_spawn_egg",e.NetheriteAxe="minecraft:netherite_axe",e.VindicatorSpawnEgg="minecraft:vindicator_spawn_egg",e.EvokerSpawnEgg="minecraft:evoker_spawn_egg",e.PhantomSpawnEgg="minecraft:phantom_spawn_egg",e.SnowGolemSpawnEgg="minecraft:snow_golem_spawn_egg",e.SnifferSpawnEgg="minecraft:sniffer_spawn_egg",e.ArmadilloSpawnEgg="minecraft:armadillo_spawn_egg",e.MusicDisc13="minecraft:music_disc_13",e.Bedrock="minecraft:bedrock",e.Dirt="minecraft:dirt",e.Magma="minecraft:magma",e.EndStone="minecraft:end_stone",e.ChorusFruit="minecraft:chorus_fruit",e.BrainCoralBlock="minecraft:brain_coral_block",e.BubbleCoralBlock="minecraft:bubble_coral_block",e.DeadBubbleCoralBlock="minecraft:dead_bubble_coral_block",e.DeadFireCoralBlock="minecraft:dead_fire_coral_block",e.IronHelmet="minecraft:iron_helmet",e.GoldenHelmet="minecraft:golden_helmet",e.LeatherChestplate="minecraft:leather_chestplate",e.GoldenChestplate="minecraft:golden_chestplate",e.MangroveHangingSign="minecraft:mangrove_hanging_sign",e.DiamondLeggings="minecraft:diamond_leggings",e.WoodenButton="minecraft:wooden_button",e.GoldenBoots="minecraft:golden_boots",e.WoodenSword="minecraft:wooden_sword",e.DiamondAxe="minecraft:diamond_axe",e.StonePickaxe="minecraft:stone_pickaxe",e.IronPickaxe="minecraft:iron_pickaxe",e.BambooSign="minecraft:bamboo_sign",e.PinkCandle="minecraft:pink_candle",e.GoldenShovel="minecraft:golden_shovel",e.DiamondShovel="minecraft:diamond_shovel",e.NetheriteShovel="minecraft:netherite_shovel",e.GoldenHoe="minecraft:golden_hoe",e.DiamondHoe="minecraft:diamond_hoe",e.BrownShulkerBox="minecraft:brown_shulker_box",e.CookedChicken="minecraft:cooked_chicken",e.PumpkinPie="minecraft:pumpkin_pie",e.WarpedFungusOnAStick="minecraft:warped_fungus_on_a_stick",e.Snowball="minecraft:snowball",e.LeatherHorseArmor="minecraft:leather_horse_armor",e.TurtleHelmet="minecraft:turtle_helmet",e.TotemOfUndying="minecraft:totem_of_undying",e.ExperienceBottle="minecraft:experience_bottle",e.Potion="minecraft:potion",e.MusicDiscCat="minecraft:music_disc_cat",e.Spyglass="minecraft:spyglass",e.Torch="minecraft:torch",e.SoulTorch="minecraft:soul_torch",e.Rail="minecraft:rail",e.SoulLantern="minecraft:soul_lantern",e.Candle="minecraft:candle",e.MagentaCandle="minecraft:magenta_candle",e.LimeCandle="minecraft:lime_candle",e.GrayCandle="minecraft:gray_candle",e.HardPinkStainedGlass="minecraft:hard_pink_stained_glass",e.LightGrayCandle="minecraft:light_gray_candle",e.PowderSnowBucket="minecraft:powder_snow_bucket",e.BlackCandle="minecraft:black_candle",e.SheafPotterySherd="minecraft:sheaf_pottery_sherd",e.CraftingTable="minecraft:crafting_table",e.SmithingTable="minecraft:smithing_table",e.MusicDiscStrad="minecraft:music_disc_strad",e.SoulCampfire="minecraft:soul_campfire",e.BlastFurnace="minecraft:blast_furnace",e.ChemistryTable="minecraft:chemistry_table",e.BrewingStand="minecraft:brewing_stand",e.EnchantingTable="minecraft:enchanting_table",e.Bookshelf="minecraft:bookshelf",e.ChiseledBookshelf="minecraft:chiseled_bookshelf",e.TrappedChest="minecraft:trapped_chest",e.RabbitFoot="minecraft:rabbit_foot",e.UndyedShulkerBox="minecraft:undyed_shulker_box",e.WhiteShulkerBox="minecraft:white_shulker_box",e.GrayShulkerBox="minecraft:gray_shulker_box",e.BlackShulkerBox="minecraft:black_shulker_box",e.RedShulkerBox="minecraft:red_shulker_box",e.OrangeShulkerBox="minecraft:orange_shulker_box",e.HardBlackStainedGlassPane="minecraft:hard_black_stained_glass_pane",e.LimeShulkerBox="minecraft:lime_shulker_box",e.GreenShulkerBox="minecraft:green_shulker_box",e.Quartz="minecraft:quartz",e.MagentaShulkerBox="minecraft:magenta_shulker_box",e.MusicDiscChirp="minecraft:music_disc_chirp",e.MusicDiscMall="minecraft:music_disc_mall",e.MusicDiscWard="minecraft:music_disc_ward",e.LightningRod="minecraft:lightning_rod",e.MusicDiscCreatorMusicBox="minecraft:music_disc_creator_music_box",e.DangerPotterySherd="minecraft:danger_pottery_sherd",e.DiscFragment5="minecraft:disc_fragment_5",e.Glowstone="minecraft:glowstone",e.BirchSign="minecraft:birch_sign",e.CrimsonSign="minecraft:crimson_sign",e.WarpedSign="minecraft:warped_sign",e.FireworkStar="minecraft:firework_star",e.SpruceHangingSign="minecraft:spruce_hanging_sign",e.BambooHangingSign="minecraft:bamboo_hanging_sign",e.CrimsonHangingSign="minecraft:crimson_hanging_sign",e.HardGrayStainedGlassPane="minecraft:hard_gray_stained_glass_pane",e.Painting="minecraft:painting",e.HoneyBottle="minecraft:honey_bottle",e.LavaBucket="minecraft:lava_bucket",e.CodBucket="minecraft:cod_bucket",e.WitherSpawnEgg="minecraft:wither_spawn_egg",e.PufferfishBucket="minecraft:pufferfish_bucket",e.Skull="minecraft:skull",e.HeartPotterySherd="minecraft:heart_pottery_sherd",e.Bell="minecraft:bell",e.Anvil="minecraft:anvil",e.Conduit="minecraft:conduit",e.StonecutterBlock="minecraft:stonecutter_block",e.RawIron="minecraft:raw_iron",e.RawGold="minecraft:raw_gold",e.HardGlass="minecraft:hard_glass",e.RawCopper="minecraft:raw_copper",e.IronIngot="minecraft:iron_ingot",e.PrismarineShard="minecraft:prismarine_shard",e.BlazePowder="minecraft:blaze_powder",e.DragonBreath="minecraft:dragon_breath",e.HardGreenStainedGlass="minecraft:hard_green_stained_glass",e.NetherStar="minecraft:nether_star",e.Paper="minecraft:paper",e.LightBlock4="minecraft:light_block_4",e.Tnt="minecraft:tnt",e.HardWhiteStainedGlass="minecraft:hard_white_stained_glass",e.HardPurpleStainedGlass="minecraft:hard_purple_stained_glass",e.HardBrownStainedGlass="minecraft:hard_brown_stained_glass",e.HardRedStainedGlass="minecraft:hard_red_stained_glass",e.HardWhiteStainedGlassPane="minecraft:hard_white_stained_glass_pane",e.HardYellowStainedGlassPane="minecraft:hard_yellow_stained_glass_pane",e.HardLimeStainedGlassPane="minecraft:hard_lime_stained_glass_pane",e.GlowStick="minecraft:glow_stick",e.BambooButton="minecraft:bamboo_button",e.Sparkler="minecraft:sparkler",e.SpruceBoat="minecraft:spruce_boat",e.LodestoneCompass="minecraft:lodestone_compass",e.Air="minecraft:air",e.FireworkRocket="minecraft:firework_rocket",e.BirchChestBoat="minecraft:birch_chest_boat",e.GoldenRail="minecraft:golden_rail",e.Minecart="minecraft:minecart",e.HopperMinecart="minecraft:hopper_minecart",e.RedstoneTorch="minecraft:redstone_torch",e.AcaciaButton="minecraft:acacia_button",e.DarkOakButton="minecraft:dark_oak_button",e.CrimsonButton="minecraft:crimson_button",e.WarpedButton="minecraft:warped_button",e.TripwireHook="minecraft:tripwire_hook",e.SprucePressurePlate="minecraft:spruce_pressure_plate",e.MangrovePressurePlate="minecraft:mangrove_pressure_plate",e.StonePressurePlate="minecraft:stone_pressure_plate",e.HeavyWeightedPressurePlate="minecraft:heavy_weighted_pressure_plate",e.PolishedBlackstonePressurePlate="minecraft:polished_blackstone_pressure_plate",e.Repeater="minecraft:repeater",e.Comparator="minecraft:comparator",e.Piston="minecraft:piston",e.FlowerBannerPattern="minecraft:flower_banner_pattern",e.MojangBannerPattern="minecraft:mojang_banner_pattern",e.BordureIndentedBannerPattern="minecraft:bordure_indented_banner_pattern",e.GlobeBannerPattern="minecraft:globe_banner_pattern",e.WildArmorTrimSmithingTemplate="minecraft:wild_armor_trim_smithing_template",e.FlowBannerPattern="minecraft:flow_banner_pattern",e.AnglerPotterySherd="minecraft:angler_pottery_sherd",e.BladePotterySherd="minecraft:blade_pottery_sherd",e.MinerPotterySherd="minecraft:miner_pottery_sherd",e.MournerPotterySherd="minecraft:mourner_pottery_sherd",e.PlentyPotterySherd="minecraft:plenty_pottery_sherd",e.VexArmorTrimSmithingTemplate="minecraft:vex_armor_trim_smithing_template",e.DuneArmorTrimSmithingTemplate="minecraft:dune_armor_trim_smithing_template",e.ShaperArmorTrimSmithingTemplate="minecraft:shaper_armor_trim_smithing_template",e.SilenceArmorTrimSmithingTemplate="minecraft:silence_armor_trim_smithing_template",e.TideArmorTrimSmithingTemplate="minecraft:tide_armor_trim_smithing_template",e.Chain="minecraft:chain",e.DecoratedPot="minecraft:decorated_pot",e.OminousTrialKey="minecraft:ominous_trial_key",e.LightBlock15="minecraft:light_block_15",e.FilledMap="minecraft:filled_map",e.BorderBlock="minecraft:border_block",e.LightBlock2="minecraft:light_block_2",e.LightBlock3="minecraft:light_block_3",e.LightBlock6="minecraft:light_block_6",e.LightBlock7="minecraft:light_block_7",e.LightBlock11="minecraft:light_block_11",e.Stone="minecraft:stone",e.Sand="minecraft:sand",e.RedSandstone="minecraft:red_sandstone",e.Sandstone="minecraft:sandstone",e.QuartzBlock="minecraft:quartz_block",e.Prismarine="minecraft:prismarine",e.Bucket="minecraft:bucket",e.Bundle="minecraft:bundle",e.BlueBundle="minecraft:blue_bundle",e.BlackBundle="minecraft:black_bundle",e.BrownBundle="minecraft:brown_bundle",e.CyanBundle="minecraft:cyan_bundle",e.GrayBundle="minecraft:gray_bundle",e.GreenBundle="minecraft:green_bundle",e.LightBlueBundle="minecraft:light_blue_bundle",e.LightGrayBundle="minecraft:light_gray_bundle",e.LimeBundle="minecraft:lime_bundle",e.MagentaBundle="minecraft:magenta_bundle",e.OrangeBundle="minecraft:orange_bundle",e.PinkBundle="minecraft:pink_bundle",e.PurpleBundle="minecraft:purple_bundle",e.RedBundle="minecraft:red_bundle",e.WhiteBundle="minecraft:white_bundle",e.YellowBundle="minecraft:yellow_bundle",e}({});var Rt=function(e){return e.Construction="construction",e.Equipment="equipment",e.Items="items",e.Nature="nature",e.None="none",e}(Rt||{});var Es=function(e){return e.Anvil="itemGroup.name.anvil",e.Arrow="itemGroup.name.arrow",e.Axe="itemGroup.name.axe",e.Banner="itemGroup.name.banner",e.BannerPattern="itemGroup.name.banner_pattern",e.Bed="itemGroup.name.bed",e.Boat="itemGroup.name.boat",e.Boots="itemGroup.name.boots",e.Buttons="itemGroup.name.buttons",e.Candles="itemGroup.name.candles",e.Chalkboard="itemGroup.name.chalkboard",e.Chest="itemGroup.name.chest",e.Chestboat="itemGroup.name.chestboat",e.Chestplate="itemGroup.name.chestplate",e.Concrete="itemGroup.name.concrete",e.ConcretePowder="itemGroup.name.concretePowder",e.CookedFood="itemGroup.name.cookedFood",e.Copper="itemGroup.name.copper",e.Coral="itemGroup.name.coral",e.CoralDecorations="itemGroup.name.coral_decorations",e.Crop="itemGroup.name.crop",e.Door="itemGroup.name.door",e.Dye="itemGroup.name.dye",e.EnchantedBook="itemGroup.name.enchantedBook",e.Fence="itemGroup.name.fence",e.FenceGate="itemGroup.name.fenceGate",e.Firework="itemGroup.name.firework",e.FireworkStars="itemGroup.name.fireworkStars",e.Flower="itemGroup.name.flower",e.Glass="itemGroup.name.glass",e.GlassPane="itemGroup.name.glassPane",e.GlazedTerracotta="itemGroup.name.glazedTerracotta",e.GoatHorn="itemGroup.name.goatHorn",e.Grass="itemGroup.name.grass",e.HangingSign="itemGroup.name.hanging_sign",e.Helmet="itemGroup.name.helmet",e.Hoe="itemGroup.name.hoe",e.HorseArmor="itemGroup.name.horseArmor",e.Leaves="itemGroup.name.leaves",e.Leggings="itemGroup.name.leggings",e.LingeringPotion="itemGroup.name.lingeringPotion",e.Log="itemGroup.name.log",e.Minecart="itemGroup.name.minecart",e.MiscFood="itemGroup.name.miscFood",e.MobEgg="itemGroup.name.mobEgg",e.MonsterStoneEgg="itemGroup.name.monsterStoneEgg",e.Mushroom="itemGroup.name.mushroom",e.NetherWartBlock="itemGroup.name.netherWartBlock",e.Ore="itemGroup.name.ore",e.Permission="itemGroup.name.permission",e.Pickaxe="itemGroup.name.pickaxe",e.Planks="itemGroup.name.planks",e.Potion="itemGroup.name.potion",e.PotterySherds="itemGroup.name.potterySherds",e.PressurePlate="itemGroup.name.pressurePlate",e.Rail="itemGroup.name.rail",e.RawFood="itemGroup.name.rawFood",e.Record="itemGroup.name.record",e.Sandstone="itemGroup.name.sandstone",e.Sapling="itemGroup.name.sapling",e.Sculk="itemGroup.name.sculk",e.Seed="itemGroup.name.seed",e.Shovel="itemGroup.name.shovel",e.ShulkerBox="itemGroup.name.shulkerBox",e.Sign="itemGroup.name.sign",e.Skull="itemGroup.name.skull",e.Slab="itemGroup.name.slab",e.SmithingTemplates="itemGroup.name.smithing_templates",e.SplashPotion="itemGroup.name.splashPotion",e.StainedClay="itemGroup.name.stainedClay",e.Stairs="itemGroup.name.stairs",e.Stone="itemGroup.name.stone",e.StoneBrick="itemGroup.name.stoneBrick",e.Sword="itemGroup.name.sword",e.Trapdoor="itemGroup.name.trapdoor",e.Walls="itemGroup.name.walls",e.Wood="itemGroup.name.wood",e.Wool="itemGroup.name.wool",e.WoolCarpet="itemGroup.name.woolCarpet",e}(Es||{});var we=function(e){return e[e.None=0]="None",e[e.Wooden=1]="Wooden",e[e.Stone=2]="Stone",e[e.Iron=3]="Iron",e[e.Gold=4]="Gold",e[e.Diamond=5]="Diamond",e[e.Netherite=6]="Netherite",e}(we||{});var et=function(e){return e[e.None=0]="None",e[e.Axe=1]="Axe",e[e.Hoe=2]="Hoe",e[e.Shovel=3]="Shovel",e[e.Sword=4]="Sword",e[e.Pickaxe=5]="Pickaxe",e}(et||{});var Re=function(e){return e[e.None=0]="None",e[e.Sword=1]="Sword",e[e.Shovel=2]="Shovel",e[e.Pickaxe=3]="Pickaxe",e[e.Axe=4]="Axe",e[e.Hoe=5]="Hoe",e[e.Shears=6]="Shears",e}(Re||{});var N=function(e){return e[e.Click=0]="Click",e[e.Break=1]="Break",e[e.Place=2]="Place",e[e.Use=3]="Use",e}(N||{});import{ItemUseOnEntityInventoryTransactionType as za}from"@serenityjs/protocol";var Fe=function(e){return e[e.Interact=za.Interact]="Interact",e[e.Attack=za.Attack]="Attack",e}(Fe||{});var v=function(e){return e[e.North=3]="North",e[e.East=0]="East",e[e.South=2]="South",e[e.West=1]="West",e}(v||{});var f=function(e){return e[e.WorldInitialize=0]="WorldInitialize",e[e.WorldTick=1]="WorldTick",e[e.ChunkReady=2]="ChunkReady",e[e.HealthChanged=3]="HealthChanged",e[e.EntitySpawned=4]="EntitySpawned",e[e.EntityDespawned=5]="EntityDespawned",e[e.EntityDie=6]="EntityDie",e[e.EntityFlagUpdate=7]="EntityFlagUpdate",e[e.EntityDimensionChange=8]="EntityDimensionChange",e[e.EntityMetadataUpdate=9]="EntityMetadataUpdate",e[e.EntityAttributeUpdate=10]="EntityAttributeUpdate",e[e.EntityHit=11]="EntityHit",e[e.EntityHurt=12]="EntityHurt",e[e.EffectAdd=13]="EffectAdd",e[e.EffectRemove=14]="EffectRemove",e[e.PlayerJoin=15]="PlayerJoin",e[e.PlayerLeave=16]="PlayerLeave",e[e.PlayerChat=17]="PlayerChat",e[e.PlayerPlaceBlock=18]="PlayerPlaceBlock",e[e.PlayerBreakBlock=19]="PlayerBreakBlock",e[e.PlayerDropItem=20]="PlayerDropItem",e[e.PlayerGamemodeChange=21]="PlayerGamemodeChange",e[e.PlayerAbilityUpdate=22]="PlayerAbilityUpdate",e[e.PlayerStartUsingItem=23]="PlayerStartUsingItem",e[e.PlayerStopUsingItem=24]="PlayerStopUsingItem",e[e.PlayerUseItem=25]="PlayerUseItem",e[e.PlayerStartEmoting=26]="PlayerStartEmoting",e[e.PlayerStopEmoting=27]="PlayerStopEmoting",e[e.PlayerInteractWithBlock=28]="PlayerInteractWithBlock",e[e.PlayerInteractWithEntity=29]="PlayerInteractWithEntity",e[e.PlayerOpenedContainer=30]="PlayerOpenedContainer",e[e.BlockUpdate=31]="BlockUpdate",e}(f||{});var tt=function(e){return e[e.Start=1e3]="Start",e[e.Stop=1001]="Stop",e}(tt||{});var qs={compression:!1,encryption:!1},Oa=class extends As{static{c(this,"Network")}serenity;raknet;properties;logger=new Ls("Network",Os.Blue);connections=new Map;handlers=new Set;constructor(t,a){super(),this.serenity=t,this.properties=t.properties,this.raknet=new zs(this.properties.address,this.properties.port,1e3,400),this.raknet.on("encapsulated",this.onEncapsulated.bind(this)),this.raknet.on("connect",this.onConnect.bind(this)),this.raknet.on("disconnect",this.onDisconnect.bind(this));for(let r of a||[])this.registerHandler(r)}registerHandler(t){this.handlers.add(t)}unregisterHandler(t){this.handlers.delete(t)}onConnect(t){if(this.connections.has(t))return t.disconnect();let a={...qs};this.connections.set(t,a),this.logger.debug(`Connection established with ${t.rinfo.address}:${t.rinfo.port}`)}onDisconnect(t){if(!this.connections.has(t))return;let a=new La;a.reason=Ns.Disconnected,a.hideDisconnectScreen=!0;let r=Buffer.from([254,ee.None,...$t.frame(a.serialize())]);this.onEncapsulated(t,r),this.connections.delete(t),this.serenity.players.delete(t),this.logger.debug(`Connection disconnected with ${t.rinfo.address}:${t.rinfo.port}`)}onEncapsulated(t,...a){let r=this.connections.get(t);if(!r)throw new Error("Received data from a connection that is not a registered connection.");for(let n of a){if(n[0]!==254)throw new Error("Invalid packet header");let s=(r.encryption,n.subarray(1)),o=s[0],i=ee[o]?s.readUint8():ee.NotPresent;i!==ee.NotPresent&&(s=s.subarray(1));let l=i===ee.None||i===ee.NotPresent?s:i===ee.Zlib?this.inflateZlib(s):i===ee.Snappy?this.inflateSnappy(s):s,m=$t.unframe(l);if(m.length>this.properties.packetsPerFrame)return this.logger.warn(`Received too many packets from "${t.rinfo.address}:${t.rinfo.port}", disconnecting the session.`),t.disconnect();for(let u of m){let p=Rs(u),h=$s[p];if(!h){this.logger.debug(`No packet serializer/deserializer found for packet id ${p}.`);continue}try{let d=new h(u).deserialize(),b={bound:Ie.Server,connection:t,packet:d},S=this.emit(p,b),D=this.emit("all",b);if(!S||!D){this.logger.debug(`Packet received with id ${p} was cancelled by an external listener.`);continue}let j=Array.from(this.handlers).filter(I=>I.packet===p);if(j.length===0){this.logger.debug(`No handlers found for packet ${Fs[p]}, with id ${p}`);continue}for(let I of j)if(I.packet===p)try{new I(this.serenity).handle(d,t)}catch(Wa){this.logger.error(`Failed to handle packet with id ${p}`,Wa)}}catch(d){this.logger.error(`Failed to deserialize packet with id ${p}`,d)}}}}inflateZlib(t){return Ms(t)}inflateSnappy(t){throw new Error("Not implemented")}send(t,a=Ft.Normal,...r){let n=this.connections.get(t);if(!n)throw new Error("Attempted to send packets to a connection that is not a registered connection.");let s=[];for(let p of r){let h={bound:Ie.Client,connection:t,packet:p},d=this.emit(p.getId(),h),b=this.emit("all",h);if(!d||!b){this.logger.debug(`Packet sent with id ${p.getId()} was cancelled by an external listener.`);continue}try{s.push(p.serialize())}catch(S){this.logger.error(`Failed to serialize packet with id ${p.getId()}`,S)}}let o=$t.frame(...s),i=o.byteLength>this.properties.compressionThreshold&&n.compression?Buffer.concat([Buffer.from([this.properties.compressionMethod]),this.deflateZlib(o)]):n.compression?Buffer.concat([Buffer.from([ee.None]),o]):o,l=(n.encryption,i),m=Buffer.concat([Buffer.from([254]),l]),u=new Ws;return u.reliability=Gs.Reliable,u.orderChannel=0,u.payload=m,t.sendFrame(u,a)}sendNormal(t,...a){this.send(t,Ft.Normal,...a)}sendImmediate(t,...a){this.send(t,Ft.Immediate,...a)}deflateZlib(t){return Ds(t)}setCompression(t,a){let r=this.connections.get(t);r&&(r.compression=a)}setEncryption(t,a){let r=this.connections.get(t);r&&(r.encryption=a)}disconnectConnection(t,a,r){let n=new La;n.message=new Hs(a,""),n.reason=r,n.hideDisconnectScreen=!1,this.sendImmediate(t,n)}};var y=class{static{c(this,"NetworkHandler")}static packet;serenity;network;constructor(t){this.serenity=t,this.network=t.network}handle(t,a){throw new Error("NetworkHandler.handle() is not implemented!")}};import{Packet as Us}from"@serenityjs/protocol";var Ha=class extends y{static{c(this,"AnimateHandler")}static packet=Us.Animate;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();r.dimension.broadcastExcept(r,t)}};import{Packet as Vs}from"@serenityjs/protocol";var Na=class extends y{static{c(this,"ContainerCloseHandler")}static packet=Vs.ContainerClose;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();r.openedContainer&&r.openedContainer.close(r)}};import{Packet as js}from"@serenityjs/protocol";var g=class{static{c(this,"EventSignal")}static identifier;identifier=this.constructor.identifier;world;constructor(t){this.world=t}emit(){let t=this.world.emit(this.identifier,this),a=this.world.serenity.emit(this.identifier,this);return t&&a}};var qt=class extends g{static{c(this,"WorldInitializeSignal")}static identifier=f.WorldInitialize};var Ra=class extends g{static{c(this,"WorldTickSignal")}static identifier=f.WorldTick;currentTick;deltaTick;world;constructor(t,a,r){super(r),this.currentTick=t,this.deltaTick=a,this.world=r}};var at=class extends g{static{c(this,"ChunkReadySignal")}static identifier=f.ChunkReady;chunk;dimension;constructor(t,a){super(t.world),this.dimension=t,this.chunk=a}};var Fa=class extends g{static{c(this,"EntitySpawnedSignal")}static identifier=f.EntitySpawned;entity;dimension;constructor(t,a){super(t.dimension.world),this.entity=t,this.dimension=a}};var $a=class extends g{static{c(this,"EntityDespawnedSignal")}static identifier=f.EntityDespawned;entity;dimension;constructor(t,a){super(t.dimension.world),this.entity=t,this.dimension=a}};var qa=class extends g{static{c(this,"EntityFlagUpdateSignal")}identifier=f.EntityFlagUpdate;entity;flag;value;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.flag=a,this.value=r}};var Ua=class extends g{static{c(this,"EntityMetadataUpdateSignal")}identifier=f.EntityMetadataUpdate;entity;key;dataItem;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.key=a,this.dataItem=r}};var Va=class extends g{static{c(this,"EntityAttributeUpdateSignal")}static identifier=f.EntityAttributeUpdate;entity;attribute;value;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.attribute=a,this.value=r}};var ja=class extends g{static{c(this,"PlayerJoinSignal")}static identifier=f.PlayerJoin;player;constructor(t){super(t.dimension.world),this.player=t}};var Ja=class extends g{static{c(this,"PlayerLeaveSignal")}static identifier=f.PlayerLeave;player;reason;message;constructor(t,a,r){super(t.dimension.world),this.player=t,this.reason=a,this.message=r}};var Ya=class extends g{static{c(this,"PlayerChatSignal")}static identifier=f.PlayerChat;player;message;constructor(t,a){super(t.dimension.world),this.player=t,this.message=a}};var rt=class extends g{static{c(this,"BlockUpdateSignal")}static identifier=f.BlockUpdate;block;dimension;constructor(t){super(t.dimension.world),this.block=t,this.dimension=t.dimension}};var Ka=class extends rt{static{c(this,"PlayerPlaceBlockSignal")}static identifier=f.PlayerPlaceBlock;face;faceLocation;permutationBeingPlaced;player;constructor(t,a,r,n,s){super(t),this.player=a,this.permutationBeingPlaced=r,this.face=n,this.faceLocation=s}};var Za=class extends rt{static{c(this,"PlayerBreakBlockSignal")}static identifier=f.PlayerBreakBlock;player;itemStack;constructor(t,a,r){super(t),this.player=a,this.itemStack=r}};var Qa=class extends g{static{c(this,"PlayerDropItemSignal")}static identifier=f.PlayerDropItem;player;itemStack;amount;constructor(t,a,r){super(t.dimension.world),this.player=t,this.itemStack=a,this.amount=r}};var Xa=class extends g{static{c(this,"PlayerAbilityUpdateSignal")}static identifier=f.PlayerAbilityUpdate;player;ability;value;constructor(t,a,r){super(t.getWorld()),this.player=t,this.ability=a,this.value=r}};var Ba=class extends g{static{c(this,"PlayerStartUsingItemSignal")}static identifier=f.PlayerStartUsingItem;player;itemStack;useMethod;constructor(t,a,r){super(t.dimension.world),this.player=t,this.itemStack=a,this.useMethod=r}};var Ia=class extends g{static{c(this,"PlayerStopUsingItemSignal")}static identifier=f.PlayerStopUsingItem;player;itemStack;constructor(t,a){super(t.dimension.world),this.player=t,this.itemStack=a}};var fe=class extends g{static{c(this,"PlayerUseItemSignal")}static identifier=f.PlayerUseItem;player;itemStack;useMethod;constructor(t,a,r){super(t.dimension.world),this.player=t,this.itemStack=a,this.useMethod=r}};var er=class extends g{static{c(this,"PlayerStartEmotingSignal")}identifier=f.PlayerStartEmoting;player;emote;tickLength;constructor(t,a,r){super(t.getWorld()),this.player=t,this.emote=a,this.tickLength=r}};var tr=class extends g{static{c(this,"PlayerStopEmotingSignal")}identifier=f.PlayerStopEmoting;player;emote;constructor(t,a){super(t.getWorld()),this.player=t,this.emote=a}};var ar=class extends g{static{c(this,"EffectAddSignal")}static identifier=f.EffectAdd;entity;effect;constructor(t,a){super(t.getWorld()),this.entity=t,this.effect=a}};var rr=class extends g{static{c(this,"EffectRemoveSignal")}static identifier=f.EffectRemove;entity;effect;constructor(t,a){super(t.getWorld()),this.entity=t,this.effect=a}};var nr=class extends g{static{c(this,"PlayerGamemodeChangeSignal")}static identifier=f.PlayerGamemodeChange;player;fromGamemode;toGamemode;constructor(t,a,r){super(t.getWorld()),this.player=t,this.fromGamemode=a,this.toGamemode=r}};var nt=class extends g{static{c(this,"EntityDimensionChangeSignal")}static identifier=f.EntityDimensionChange;entity;fromDimension;toDimension;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.fromDimension=a,this.toDimension=r}};var sr=class extends g{static{c(this,"PlayerInteractWithBlockSignal")}static identifier=f.PlayerInteractWithBlock;source;block;beforeItemStack;itemStack;constructor(t,a,r,n){super(t.getWorld()),this.source=t,this.block=a,this.beforeItemStack=r,this.itemStack=n}};var or=class extends g{static{c(this,"PlayerInteractWithEntitySignal")}static identifier=f.PlayerInteractWithEntity;source;target;itemStack;beforeItemStack;constructor(t,a,r,n){super(t.getWorld()),this.source=t,this.target=a,this.beforeItemStack=r,this.itemStack=n}};var st=class extends g{static{c(this,"PlayerOpenedContainerSignal")}identifier=f.PlayerOpenedContainer;player;container;constructor(t,a){super(t.getWorld()),this.player=t,this.container=a}};var ir=class extends g{static{c(this,"EntityHitSignal")}static identifier=f.EntityHit;hitEntity;damagingEntity;constructor(t,a){super(t.getWorld()),this.damagingEntity=t,this.hitEntity=a}};var cr=class extends g{static{c(this,"EntityHurtSignal")}static identifier=f.EntityHurt;hurtEntity;damagingEntity;damage;cause;constructor(t,a,r,n){super(t.getWorld()),this.hurtEntity=t,this.damagingEntity=n,this.damage=a,this.cause=r}};var lr=class extends g{static{c(this,"EntityHealthChangedSignal")}static identifier=f.HealthChanged;entity;fromHealth;toHealth;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.fromHealth=a,this.toHealth=r}};var mr=class extends g{static{c(this,"EntityDieSignal")}static identifier=f.EntityDie;entity;damagingEntity;damageCause;constructor(t,a,r){super(t.getWorld()),this.entity=t,this.damagingEntity=a,this.damageCause=r}};var pr=class extends y{static{c(this,"DisconnectHandler")}static packet=js.Disconnect;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();new Ja(r,t.reason,t.message.message??"").emit(),r.despawn();let n=r.dimension;n.world.provider.writePlayer(r.getDataEntry(),n),n.world.logger.info(`\xA78[\xA79${r.username}\xA78] Event:\xA7r Player left the server.`)}};import{BlockPosition as Jm,ComplexInventoryTransaction as Lt,Gamemode as Ym,InventorySourceType as Sa,ItemUseInventoryTransactionType as ka,LevelSoundEvent as Km,LevelSoundEventPacket as Zm,Packet as Qm}from"@serenityjs/protocol";import{ENTITY_TYPES as Ys}from"@serenityjs/data";import{CompoundTag as Js}from"@serenityjs/nbt";var R=class ot{static{c(this,"EntityType")}static types=new Map;static network=0;identifier;network=++ot.network;components;constructor(t,a){this.identifier=t,this.components=a??[]}register(t){if(this.components.includes(t.identifier))throw new Error(`Component ${t.identifier} is already registered to entity type ${this.identifier}`);this.components.push(t.identifier)}unregister(t){if(this.components.includes(t.identifier))this.components.splice(this.components.indexOf(t.identifier),1);else throw new Error(`Component ${t.identifier} is not registered to entity type ${this.identifier}`)}static get(t){return ot.types.get(t)}static getAll(){return[...ot.types.values()]}static toNbt(t){let a=new Js;return a.createStringTag("bid",""),a.createByteTag("hasspawnegg",1),a.createStringTag("id",t.identifier),a.createIntTag("rid",t.network),a.createByteTag("summonable",1),a}};for(let e of Ys){let t=new R(e.identifier,e.components);R.types.set(e.identifier,t)}var ur=class extends R{static{c(this,"CustomEntityType")}constructor(t){super(t)}};import{ActorFlag as ya,ContainerName as Gt,MoveActorDeltaPacket as xm,MoveDeltaFlags as Qn,Rotation as Cm,SetActorMotionPacket as Pm,Vector3f as Ye}from"@serenityjs/protocol";import{BinaryStream as Er}from"@serenityjs/binarystream";import{CREATIVE_CONTENT as No,ITEM_TYPES as Ro,ITEMDATA as Fo,TOOL_TYPES as $o}from"@serenityjs/data";import{CreativeItems as qo,ItemData as Uo}from"@serenityjs/protocol";import{BLOCK_TYPES as to,BLOCK_PERMUTATIONS as ao,BLOCK_DROPS as ro,BLOCK_METADATA as no}from"@serenityjs/data";var Ks={loggable:!1,air:!1,liquid:!1,solid:!1,hardness:0,friction:0,color:"",components:[],tags:[],drops:[],permutations:[]},H=class Ut{static{c(this,"BlockType")}static types=new Map;identifier;custom;loggable;air;liquid;solid;hardness;friction;color;components=[];tags=[];drops=[];permutations=[];constructor(t,a){this.identifier=t,this.custom=!1;let r={...Ks,...a};this.loggable=r.loggable,this.air=r.air,this.liquid=r.liquid,this.solid=r.solid,this.hardness=r.hardness,this.friction=r.friction,this.color=r.color,this.components=[...r.components,...this.components],this.tags=[...r.tags,...this.tags],this.drops=[...r.drops,...this.drops],this.permutations=[...r.permutations,...this.permutations]}getPermutation(t){for(let a of this.permutations)if(!t||a.matches(t))return a;return this.permutations[0]}static get(t){let a=Ut.types.get(t);return a||this.get(C.Air)}static getAll(){return[...Ut.types.values()]}};import{ByteTag as Is,CompoundTag as fr,IntTag as eo,StringTag as gr}from"@serenityjs/nbt";import{BinaryStream as Zs}from"@serenityjs/binarystream";import{ByteTag as Qs,CompoundTag as Vt,IntTag as Xs,StringTag as hr}from"@serenityjs/nbt";var Bs=2166136261;function dr(e,t){let a=Object.keys(t),r=Object.values(t),n=new Vt("",{});n.addTag(new hr("name",e));let s=new Vt("states",{});for(let[l,m]of a.entries()){let u=r[l];switch(typeof u){case"number":{s.addTag(new Xs(m,u));break}case"string":{s.addTag(new hr(m,u));break}case"boolean":{s.addTag(new Qs(m,u?1:0));break}}}n.addTag(s);let o=new Zs;Vt.write(o,n);let i=Bs;for(let l of o.getBuffer())i^=l&255,i+=(i<<1)+(i<<4)+(i<<7)+(i<<8)+(i<<24),i=i|0;return i}c(dr,"hash");var W=class it{static{c(this,"BlockPermutation")}static permutations=new Map;network;index;state;type;constructor(t,a,r){this.network=t,this.state=a,this.type=r,this.index=r.permutations.length}matches(t){for(let a in t)if(this.state[a]!==t[a])return!1;return!0}static resolve(t,a){let r=H.types.get(t);if(!r)return this.resolve(C.Air);let n=r.permutations.find(s=>{for(let o in a){let i=s.state[o],m=(i===!0||i===!1)&&(a[o]===0||a[o]===1)?a[o]===1:a[o];if(i!==m)return!1}return!0});return n||r.permutations[0]}static create(t,a){let r=dr(t.identifier,a??{}),n=new it(r,a??{},t);return it.permutations.set(n.network,n),t.permutations.push(n),n}static toNbt(t){let a=new fr("",{}),r=new gr("name",t.type.identifier),n=new fr("states",{}),s=Object.keys(t.state),o=Object.values(t.state);for(let[i,l]of s.entries()){let m=o[i];switch(typeof m){case"number":{n.addTag(new eo(l,m));break}case"string":{n.addTag(new gr(l,m));break}case"boolean":{n.addTag(new Is(l,m?1:0));break}}}return a.addTag(r),a.addTag(n),a}static fromNbt(t){let a=t.getTag("name"),n=t.getTag("states").valueOf();return it.resolve(a.value,n)}};var jt=class{static{c(this,"ItemDrop")}type;min;max;probability;constructor(t,a,r,n){this.type=t,this.min=a,this.max=r,this.probability=n}roll(){return Math.random()>this.probability?0:Math.floor(Math.random()*(this.max-this.min+1))+this.min}};for(let e of to){if(H.types.has(e.identifier))throw new Error(`Block type ${e.identifier} is already registered`);let t=ro.find(n=>n.identifier===e.identifier),a=no.find(n=>n.identifier===e.identifier)??{hardness:0,friction:0,mapColor:""},r=new H(e.identifier,{loggable:e.loggable,air:e.air,liquid:e.liquid,solid:e.solid,hardness:a.hardness,friction:a.friction,color:a.mapColor,components:e.components,tags:e.tags});if(t)for(let n of t?.drops??[]){let{identifier:s,min:o,max:i,chance:l}=n,m=new jt(s,o,i,l);r.drops.push(m)}else r.drops.push(new jt(e.identifier,1,1,1));H.types.set(e.identifier,r)}for(let e of ao){let t=H.types.get(e.identifier);if(!t)throw new Error(`Block type ${e.identifier} does not exist`);let a=new W(e.hash,e.state,t);t.permutations.push(a),W.permutations.set(e.hash,a)}import{CompoundTag as so}from"@serenityjs/nbt";import{BlockProperty as oo}from"@serenityjs/protocol";var ct=class Jt extends H{static{c(this,"CustomBlockType")}static networkId=1e4;custom=!0;networkId=++Jt.networkId;constructor(t,a){super(t,a)}static toNbt(t){let a=new so;return a.createCompoundTag("vanilla_block_data").createIntTag("block_id",t.networkId),a.createCompoundTag("menu_category").createStringTag("category",Rt.Nature),a.createIntTag("molangVersion",0),a}static toBlockProperty(t){return new oo(t.identifier,Jt.toNbt(t))}};var lt={};Be(lt,{BlockCardinalDirectionTrait:()=>wo,BlockDirectionTrait:()=>So,BlockInventoryTrait:()=>mo,BlockOpenBitTrait:()=>_o,BlockTrait:()=>G,BlockUpperBitTrait:()=>yo,BlockUpsideDownBitTrait:()=>uo,BlockWeirdoDirectionTrait:()=>po,VerticalHalfTrait:()=>bo});var Se=class{static{c(this,"Trait")}static identifier;static types;identifier=this.constructor.identifier;constructor(){return this}clone(...t){throw new Error(`${this.identifier}.clone() is not implemented`)}};var G=class extends Se{static{c(this,"BlockTrait")}static types=[];block;constructor(t){super(),this.block=t,t.addTrait(this)}};import{AbilityIndex as io,BlockEventPacket as _r,BlockEventType as yr,BlockPosition as br,ContainerId as co,ContainerType as lo,LevelSoundEvent as wr,LevelSoundEventPacket as Sr,Vector3f as kr}from"@serenityjs/protocol";var mo=class extends G{static{c(this,"BlockInventoryTrait")}static identifier="inventory";static types=[C.Chest];opened=!1;container;containerType;containerId;inventorySize;constructor(t){switch(super(t),t.getType().identifier){default:{this.containerType=lo.Container,this.containerId=co.None,this.inventorySize=27;break}}if(this.container=new xr(t,this.containerType,this.containerId,this.inventorySize),t.components.has("inventory")){let a=t.components.get("inventory");for(let[r,n]of a.items){let s=new k(n.identifier,{amount:n.amount,auxillary:n.auxillary,world:t.dimension.world,entry:n});this.container.setItem(r,s)}}}onInteract(t){t.isSneaking||!t.abilities.get(io.OpenContainers)||this.container.show(t)}onBreak(){for(let t of this.container.storage){if(!t)continue;let{x:a,y:r,z:n}=this.block.position;this.block.dimension.spawnItem(t,new kr(a+.5,r+.5,n+.5)).setMotion(new kr(0,.1,0))}}onContainerUpdate(t){if(t!==this.container)return;let a={size:this.inventorySize,items:[]};for(let r=0;r<this.inventorySize;r++){let n=this.container.getItem(r);if(n===null)continue;let s=n.getDataEntry();a.items.push([r,s])}this.block.components.set("inventory",a)}onTick(){if(this.container.occupants.size>0&&!this.opened){this.opened=!0;let t=new _r;t.position=this.block.position,t.type=yr.ChangeState,t.data=1;let a=new Sr;switch(a.position=br.toVector3f(this.block.position),a.data=this.block.permutation.network,a.actorIdentifier="",a.isBabyMob=!1,a.isGlobal=!1,this.block.getType().identifier){default:{a.event=-1;break}case C.Chest:case C.TrappedChest:{a.event=wr.ChestOpen;break}}this.block.dimension.broadcast(t,a)}if(this.container.occupants.size===0&&this.opened){this.opened=!1;let t=new _r;t.position=this.block.position,t.type=yr.ChangeState,t.data=0;let a=new Sr;switch(a.position=br.toVector3f(this.block.position),a.data=this.block.permutation.network,a.actorIdentifier="",a.isBabyMob=!1,a.isGlobal=!1,this.block.getType().identifier){default:{a.event=-1;break}case C.Chest:case C.TrappedChest:{a.event=wr.ChestClosed;break}}this.block.dimension.broadcast(t,a)}}};var po=class extends G{static{c(this,"BlockWeirdoDirectionTrait")}static identifier="weirdo_direction";onPlace(t){let a=t.getCardinalDirection();this.setDirection(a)}setDirection(t){let a=this.block.getType(),n={...this.block.permutation.state,weirdo_direction:t},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};var uo=class extends G{static{c(this,"BlockUpsideDownBitTrait")}static identifier="upside_down_bit";onPlace(t,a){if(a.y===1)return this.setUpsideDown(!1);if(a.y===0)return this.setUpsideDown(!0);let r=a.y>.5;return this.setUpsideDown(r)}setUpsideDown(t){let a=this.block.getType(),n={...this.block.permutation.state,upside_down_bit:t},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};import{AbilityIndex as ho,BlockPosition as fo,LevelSoundEvent as ke,LevelSoundEventPacket as go}from"@serenityjs/protocol";var _o=class extends G{static{c(this,"BlockOpenBitTrait")}static identifier="open_bit";onInteract(t){if(!t.abilities.get(ho.DoorsAndSwitches))return!1;let r=this.block.permutation.state.open_bit;return this.setBit(!r),t.isSneaking}setBit(t,a=!1){let r=this.block.getType(),n=this.block.permutation.state;if(typeof n.upper_block_bit=="boolean"){let i=n.upper_block_bit,l=i?this.block:this.block.above(),m=i?this.block.below():this.block,p={...l.permutation.state,open_bit:t},h=r.getPermutation(p);h&&l.setPermutation(h);let b={...m.permutation.state,open_bit:t},S=r.getPermutation(b);S&&m.setPermutation(S)}else{let i={...n,open_bit:t},l=r.getPermutation(i);l&&this.block.setPermutation(l)}if(a)return;let s=this.block.getType().identifier,o=new go;o.data=this.block.permutation.network,o.event=t?ke.DoorOpen:ke.DoorClose,o.position=fo.toVector3f(this.block.position),o.actorIdentifier="",o.isBabyMob=!1,o.isGlobal=!0,s.includes("trapdoor")&&(o.event=t?ke.TrapdoorOpen:ke.TrapdoorClose),s.includes("fence_gate")&&(o.event=t?ke.FenceGateOpen:ke.FenceGateClose),this.block.dimension.broadcast(o)}};var yo=class extends G{static{c(this,"BlockUpperBitTrait")}static identifier="upper_block_bit";onPlace(){let t=this.block.above(),r={...this.block.permutation.state,upper_block_bit:!0},n=this.block.getType().getPermutation(r);t.setPermutation(n)}};var bo=class extends G{static{c(this,"VerticalHalfTrait")}static identifier="minecraft:vertical_half";onPlace(t,a){a.y>.5&&a.y<.99&&this.setVerticalHalf(!0)}onInteract(t){let a=t.getHeldItem();return!a||!a.type.block||a.type.block!==this.block.getType()}setVerticalHalf(t){let a=this.block.getType(),n={...this.block.permutation.state,"minecraft:vertical_half":t?"top":"bottom"},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};var wo=class extends G{static{c(this,"BlockCardinalDirectionTrait")}static identifier="minecraft:cardinal_direction";onPlace(t){switch(t.getCardinalDirection()){case v.North:this.setDirection(v.South);break;case v.South:this.setDirection(v.North);break;case v.East:this.setDirection(v.West);break;case v.West:this.setDirection(v.East);break}}setDirection(t){let a=this.block.getType(),n={...this.block.permutation.state,"minecraft:cardinal_direction":v[t].toLowerCase()},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};var So=class extends G{static{c(this,"BlockDirectionTrait")}static identifier="direction";onPlace(t){switch(t.getCardinalDirection()){case v.North:this.setDirection(v.South);break;case v.South:this.setDirection(v.North);break;case v.East:this.setDirection(v.West);break;case v.West:this.setDirection(v.East);break}}setDirection(t){let a=this.block.getType(),n={...this.block.permutation.state,direction:t},s=a.getPermutation(n);s&&this.block.setPermutation(s)}};var Cr=class{static{c(this,"BlockPalette")}types=H.types;permutations=W.permutations;traits=new Map;registry=new Map;constructor(){for(let t of Yt)this.registerTrait(t)}getAllTypes(){return[...this.types.values()]}getAllCustomTypes(){return this.getAllTypes().filter(t=>t instanceof ct)}getAllPermutations(){return[...this.permutations.values()]}resolveType(t){return this.types.get(t)}resolvePermutation(t,a){let r=this.resolveType(t);if(!r)return this.resolvePermutation(C.Air);let n=r.permutations.find(s=>{for(let o in a){let i=s.state[o],m=(i===!0||i===!1)&&(a[o]===0||a[o]===1)?a[o]===1:a[o];if(i!==m)return!1}return!0});return n||r.permutations[0]}registerType(t){if(this.types.has(t.identifier))return!1;this.types.set(t.identifier,t),xe.options.push(t.identifier);for(let a of t.permutations)this.registerPermutation(a);return!0}registerPermutation(t){return this.permutations.has(t.network)?!1:(this.permutations.set(t.network,t),!0)}getRegistry(t){return this.registry.get(t)||[]}registerTrait(t){if(this.traits.has(t.identifier))return!1;this.traits.set(t.identifier,t);for(let a of t.types){this.registry.has(a)||this.registry.set(a,[]);let r=this.registry.get(a);r&&(r.push(t),this.registry.set(a,r))}return!0}removeTrait(t){if(!this.traits.has(t))return!1;let a=this.traits.get(t);if(!a)return!1;for(let r of a.types){let n=this.registry.get(r);n&&this.registry.set(r,n.filter(s=>s.identifier!==t))}return this.traits.delete(t),!0}getAllTraits(){return[...this.traits.values()]}getTrait(t){return this.traits.get(t)??null}};import{BlockFace as Ce,BlockPosition as Kt,Gamemode as Co,LevelEvent as Po,LevelEventPacket as vo,UpdateBlockFlagsType as To,UpdateBlockLayerType as Eo,UpdateBlockPacket as Do,Vector3f as vr}from"@serenityjs/protocol";import{CompoundTag as ko}from"@serenityjs/nbt";import{BlockActorDataPacket as xo}from"@serenityjs/protocol";var Pr=class extends Map{static{c(this,"NbtMap")}block;constructor(t){super(),this.block=t}add(t){return super.set(t.name,t),this.update(),this}set(t,a){return super.set(t,a),this.update(),this}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}update(){let t=new xo;t.position=this.block.position,t.nbt=new ko;for(let[a,r]of this)t.nbt.setTag(a,r);this.block.dimension.broadcast(t)}};var mt=class{static{c(this,"Block")}serenity;dimension;position;components=new Map;traits=new Map;nbt=new Pr(this);permutation;constructor(t,a,r,n){this.serenity=t.world.serenity,this.dimension=t,this.position=a,this.permutation=r,n?.entry&&this.loadDataEntry(this.dimension.world,n.entry)}isAir(){return this.permutation.type.air}isLiquid(){return this.permutation.type.liquid}isSolid(){return this.permutation.type.solid}getChunk(){let t=this.position.x>>4,a=this.position.z>>4;return this.dimension.getChunk(t,a)}getPermutation(){return this.permutation}setPermutation(t,a){this.permutation.type!==t.type&&(this.traits.clear(),this.components.clear()),t.type.air&&this.dimension.blocks.delete(Kt.hash(this.position)),this.getChunk().setPermutation(this.position,t),a&&this.loadDataEntry(this.getWorld(),a);let n=this.getWorld().blockPalette.getRegistry(t.type.identifier);for(let o of t.type.components){let i=this.getWorld().blockPalette.getTrait(o);i&&n.push(i)}for(let o of Object.keys(t.state))for(let i of this.getWorld().blockPalette.getAllTraits())i.identifier===o&&n.push(i);for(let o of n)this.addTrait(o);let s=new Do;if(s.networkBlockId=t.network,s.position=this.position,s.flags=To.Network,s.layer=Eo.Normal,this.dimension.broadcast(s),this.permutation=t,(this.components.size>0||this.traits.size>0)&&!this.isAir()){let o=Kt.hash(this.position);this.dimension.blocks.set(o,this)}}setType(t){this.setPermutation(t.getPermutation())}getType(){return this.permutation.type}getWorld(){return this.dimension.world}hasComponent(t){return this.components.has(t)}getComponent(t){return this.components.get(t)}removeComponent(t){this.components.delete(t)}addComponent(t,a){this.components.set(t,a)}setComponent(t,a){this.components.set(t,a)}hasTrait(t){return this.traits.has(typeof t=="string"?t:t.identifier)}getTrait(t){return this.traits.get(typeof t=="string"?t:t.identifier)}removeTrait(t){this.traits.get(typeof t=="string"?t:t.identifier)?.onRemove?.(),this.traits.delete(typeof t=="string"?t:t.identifier)}addTrait(t){if(this.traits.has(t.identifier))return this.traits.get(t.identifier);this.getWorld().blockPalette.traits.has(t.identifier)||this.getWorld().logger.warn(`Trait "\xA7c${t.identifier}\xA7r" was added to block "\xA7d${this.getType().identifier}\xA7r:\xA7d${JSON.stringify(this.position)}\xA7r" in dimension "\xA7a${this.dimension.identifier}\xA7r" but does not exist in the palette. This may result in a deserilization error.`);try{if(t instanceof G)return this.traits.set(t.identifier,t),t.onAdd?.(),t;{let a=new t(this);return this.traits.set(a.identifier,a),a.onAdd?.(),a}}catch(a){return this.serenity.logger.error(`Failed to add trait "${t.identifier}" to block "${this.getType().identifier}:${JSON.stringify(this.position)}" in dimension "${this.dimension.identifier}"`,a),null}}getToolType(){return Re.None}isToolCompatible(t){return this.getType().hardness<0?!1:(this.getToolType()===Re.None,!0)}getBreakTime(t){let r=this.getType().hardness;return!t&&this.getToolType()===Re.None||t&&this.isToolCompatible(t)?r*=1.5:r*=5,Math.ceil(r*20)}getItemStack(t){let r=this.getWorld().itemPalette.resolveType(this.getType());return new k(r,t)}above(t){return this.dimension.getBlock({...this.position,y:this.position.y+(t??1)})}below(t){return this.dimension.getBlock({...this.position,y:this.position.y-(t??1)})}north(t){return this.dimension.getBlock({...this.position,z:this.position.z-(t??1)})}south(t){return this.dimension.getBlock({...this.position,z:this.position.z+(t??1)})}east(t){return this.dimension.getBlock({...this.position,x:this.position.x+(t??1)})}west(t){return this.dimension.getBlock({...this.position,x:this.position.x-(t??1)})}face(t){switch(t){case Ce.Top:return this.above();case Ce.Bottom:return this.below();case Ce.North:return this.north();case Ce.South:return this.south();case Ce.East:return this.east();case Ce.West:return this.west()}}interact(t){if(!new sr(t,this,t.getHeldItem(),null).emit())return!1;for(let r of this.traits.values())if(r.onInteract?.(t)===!1)return!1;return!0}destroy(t){let a=!1;for(let n of this.traits.values()){let s=n.onBreak?.(t);s!==void 0&&(a=!s)}if(a)return!1;if(t){if(t.gamemode===Co.Survival){let{x:s,y:o,z:i}=this.position;for(let l of this.getType().drops){if(l.type===C.Air)continue;let m=l.roll();if(m<=0)continue;let u=new k(l.type,{amount:m,world:this.dimension.world}),p=this.dimension.spawnItem(u,new vr(s+.5,o+.5,i+.5)),h=new vr(Math.random()*.1-.05,p.velocity.y,Math.random()*.1-.05);p.addMotion(h)}}let n=new vo;n.event=Po.ParticlesDestroyBlock,n.position=Kt.toVector3f(this.position),n.data=this.permutation.network,this.dimension.broadcast(n)}let r=W.resolve(C.Air);return this.setPermutation(r),!0}getDataEntry(){let{x:t,y:a,z:r}=this.position;return{identifier:this.getType().identifier,permutation:this.permutation.network,position:[t,a,r],traits:[...this.traits.keys()],components:[...this.components.entries()]}}loadDataEntry(t,a,r=!0){r&&(this.traits.clear(),this.components.clear());for(let[n,s]of a.components)this.components.has(n)||this.components.set(n,s);for(let n of a.traits){let s=t.blockPalette.traits.get(n);if(!s){t.logger.error(`Failed to load trait "${n}" for block "${this.getType().identifier}:${this.position.x},${this.position.y},${this.position.z}" as it does not exist in the palette`);continue}this.addTrait(s)}}};import{ContainerOpenPacket as zo,ContainerType as Lo}from"@serenityjs/protocol";import{ContainerClosePacket as Mo,ContainerType as Ao,FullContainerName as Tr,InventoryContentPacket as Wo,InventorySlotPacket as Go,NetworkItemStackDescriptor as pt}from"@serenityjs/protocol";var Pe=class{static{c(this,"Container")}type;identifier;size;storage;occupants=new Set;emptySlotsCount;constructor(t,a,r){this.type=t,this.identifier=a,this.size=r,this.storage=Array.from({length:r},()=>null),this.emptySlotsCount=r}calculateEmptySlotCount(){return this.storage.filter(t=>t===null).length}getItem(t){return this.storage[t]??null}setItem(t,a){this.storage[t]=a,a.amount===0&&this.clearSlot(t),a.container=this,this.emptySlotsCount=this.calculateEmptySlotCount(),this.update()}addItem(t){let a=this.storage.findIndex(n=>!n||n.amount>=t.maxAmount?!1:t.equals(n)),r=t.amount>=t.maxAmount;if(a>-1&&!r&&t.stackable){let n=this.storage[a],s=Math.min(t.maxAmount-n.amount,t.amount);n.increment(s),t.decrement(s)}else{let n=this.storage.indexOf(null);if(n===-1)return;if(t.amount>t.maxAmount){let s=new k(t.type,{...t,amount:t.maxAmount});return this.setItem(n,s),t.decrement(t.maxAmount),this.addItem(t)}this.setItem(n,t)}}removeItem(t,a){let r=this.getItem(t);if(!r)return null;let n=Math.min(a,r.amount);return r.decrement(n),r.amount===0&&(this.storage[t]=null),this.emptySlotsCount=this.calculateEmptySlotCount(),r}takeItem(t,a){let r=this.getItem(t);if(r===null)return null;let n=Math.min(a,r.amount);r.decrement(n),r.amount===0&&this.clearSlot(t),this.emptySlotsCount=this.calculateEmptySlotCount();let s=new k(r.type,{...r,amount:n});for(let[o,i]of r.components)s.components.set(o,i);for(let o of r.traits.values())o.clone(s);this.update();for(let o of r.nbt.values())s.nbt.add(o);return s}swapItems(t,a,r){let n=r??this,s=this.getItem(t),o=n.getItem(a);this.clearSlot(t),n.clearSlot(a),s&&n.setItem(a,s),o&&this.setItem(t,o)}clearSlot(t){if(this.storage[t]=null,this.emptySlotsCount=this.calculateEmptySlotCount(),this.occupants.size===0)return;let a=new Go;a.containerId=this.identifier,a.slot=t,a.item=new pt(0),a.fullContainerName=new Tr(0,0),a.storageItem=new pt(0);for(let r of this.occupants)r.send(a)}clear(){for(let t=0;t<this.size;t++)this.clearSlot(t)}update(t){let a=new Wo;if(a.containerId=this.identifier,a.fullContainerName=new Tr(0,0),a.storageItem=new pt(0),a.items=this.storage.map(r=>r?k.toNetworkStack(r):new pt(0)),t)t.send(a);else for(let r of this.occupants)r.send(a)}show(t){t.openedContainer&&t.openedContainer.close(t),this.occupants.add(t),t.openedContainer=this;for(let a of this.storage)if(a)for(let r of a.traits.values())r.onContainerOpen?.(t)}close(t){if(!this.occupants.has(t))throw new Error("Player is not viewing the container.");let a=new Mo;a.identifier=this.identifier,a.type=Ao.None,a.serverInitiated=!1,t.send(a),t.openedContainer=null,this.occupants.delete(t);for(let r of this.storage)if(r)for(let n of r.traits.values())n.onContainerClose?.(t)}};var xr=class extends Pe{static{c(this,"BlockContainer")}block;constructor(t,a,r,n){super(a,r,n),this.block=t}setItem(t,a){super.setItem(t,a),a.world||(a.world=this.block.getWorld()),a.initialize()}update(t){super.update(t);for(let a of this.block.traits.values())try{a.onContainerUpdate?.(this)}catch(r){let{x:n,y:s,z:o}=this.block.position;this.block.getWorld().logger.error(`Failed to trigger onContainerUpdate trait event for block "${this.block.getType().identifier}:${n},${s},${o}" in dimension "${this.block.dimension.identifier}"`,r),this.block.traits.delete(a.identifier)}}show(t){if(!new st(t,this).emit())return;super.show(t);let r=new zo;r.identifier=this.identifier,r.type=this.type,r.position=this.block.position,r.uniqueId=this.type===Lo.Container?-1n:t.uniqueId,t.send(r),this.update()}};var Yt=Array();for(let e in lt){let t=lt[e];Yt.push(t)}var Oo={stackable:!0,maxAmount:64,tool:et.None,tier:we.None,tags:[],block:null},z=class $e{static{c(this,"ItemType")}static types=new Map;identifier;network;stackable;maxAmount;tool;tier;tags;block;constructor(t,a,r){this.identifier=t,this.network=a;let n={...Oo,...r};this.stackable=n.stackable,this.maxAmount=n.maxAmount,this.tool=n.tool,this.tier=n.tier,this.tags=n.tags,this.block=n.block}isTool(){return this.tool!==et.None&&this.tier!==we.None}static get(t){return $e.types.get(t)}static getByNetwork(t){return[...$e.types.values()].find(a=>a.network===t)??null}static getAll(){return[...$e.types.values()]}static resolve(t){return[...$e.types.values()].find(a=>a.block===t)??null}static toItemData(t){return{name:t.identifier,networkId:t.network,componentBased:!1}}static toNetworkInstance(t,a=1){return{network:t.network,metadata:0,networkBlockId:t.block?.getPermutation().network??0,stackSize:a,extras:{canDestroy:[],canPlaceOn:[],nbt:null}}}};import{CompoundTag as Ho}from"@serenityjs/nbt";var oe=class ut{static{c(this,"CreativeItem")}static items=new Map;type;metadata;nbt;constructor(t,a,r){this.type=t,this.metadata=a,this.nbt=r??new Ho("",{})}static register(t,a){let r=ut.items.size;ut.items.set(r,new ut(t,a))}};var Vo=new Er(Fo),jo=Uo.read(Vo);for(let e of jo){let t=Ro.find(i=>i.identifier===e.name),a=$o.find(i=>i.types.includes(e.name)),r=a?.types.indexOf(e.name),n=r===void 0?we.None:r+1,s=H.types.get(e.name)??null,o=new z(e.name,e.networkId,{stackable:t?.stackable,maxAmount:t?.maxAmount,tool:a?.network,tier:n,tags:t?.tags,block:s});z.types.set(o.identifier,o)}var Jo=new Er(No),Yo=qo.read(Jo);for(let[e,t]of Yo.entries()){let a=[...z.types.values()].find(s=>s.network===t.network);if(!a)continue;let r=t.metadata??0,n=t.extras?.nbt;t.metadata=r,oe.items.set(e,new oe(a,r,n))}var Hb=class Dr extends z{static{c(this,"CustomItemType")}static networkId=2e4;custom=!0;constructor(t,a){super(t,++Dr.networkId,a),oe.register(this,0)}};var ve=class Mr{static{c(this,"Enum")}static enums=new Map;static identifier;static type;static symbol;static default=new Mr;optional=!0;result;constructor(...t){}validate(t=!1){if(t)throw new Error("Expected value after previous argument.");return!1}static extract(t){throw new Error("Enum.extract() has not been implemented.")}};var ie=class extends ve{static{c(this,"ValidEnum")}static type=16};var ce=class qe extends ie{static{c(this,"StringEnum")}static identifier="string";static symbol=this.type<<16|56;static options=[];static strict=!0;result;constructor(t){super(),this.result=t}validate(t){if(this.result===null){if(t)throw new TypeError('Expected type "string" after previous argument.');return!1}return!0}static extract(t){let a=t.peek();return a?(a=t.next(),+a>=0||+a<=0?new qe(null):a==="true"||a==="false"?new qe(null):new qe(a)):new qe(null)}};var le=class Te extends ie{static{c(this,"IntegerEnum")}static identifier="integer";static symbol=this.type<<16|1;result;constructor(t){super(),this.result=t}validate(t){if(this.result===null){if(t)throw new TypeError('Expected type "integer" after previous argument.');return!1}return!0}static extract(t){let a=t.peek();return a?(a=t.next(),a==="true"?new Te(1):a==="false"?new Te(0):+a>=0||+a<=0?new Te(+a):new Te(null)):new Te(null)}};var T=class q extends ie{static{c(this,"TargetEnum")}static identifier="target";static symbol=this.type<<16|10;result;constructor(t){super(),this.result=t}validate(t=!1){if(t&&!this.result)throw new Error("No targets matched the selector.");return!!this.result}static extract(t){let a=t.next();if(!a)return new q(null);if(+a>=0||+a<=0)return new q(null);if(a==="true"||a==="false")return new q(null);let r=t.state.origin instanceof E?t.state.origin.dimension:t.state.origin;if(!a.startsWith("@")&&!r.getPlayers().some(n=>n.username===a))return new q(null);if(a.startsWith("@")){let n=a.slice(1)[0],s=a.slice(2);if(s.length>0&&(!s.startsWith("[")||!s.endsWith("]")))throw new Error("Invalid query.");let o=s.length>0?s.slice(1,-1).split(",").flatMap(i=>{let[l,m]=i.split("=");return{key:l,value:m}}):[];switch(n){case"a":{let i=r.getPlayers().filter(l=>{if(o.length===0)return!0;for(let{key:m,value:u}of o)switch(m){case"name":{let p=u,h=p.startsWith("!");if(h&&(p=p.slice(1)),h?l.username===p:l.username!==p)return!1;break}case"tag":{let p=u,h=p.startsWith("!");if(h&&(p=p.slice(1)),h?l.hasTag(p):!l.hasTag(p))return!1;break}default:throw new TypeError(`Invalid query key "${m}"`)}return!0});return new q(i)}case"e":{let i=r.getEntities().filter(l=>{if(o.length===0)return!0;for(let{key:m,value:u}of o)switch(m){case"name":{if(l.hasTrait(ht)){let p=u,h=p.startsWith("!");h&&(p=p.slice(1));let d=l.getTrait(ht);if(h?d.getNameTag()===p:d.getNameTag()!==p)return!1}else return!1;break}case"type":{let p=u,h=p.startsWith("!");h&&(p=p.slice(1));let d=p.includes(":")?u:`minecraft:${u}`;if(h?l.type.identifier===d:l.type.identifier!==d)return;break}case"tag":{let p=u,h=p.startsWith("!");if(h&&(p=p.slice(1)),h?l.hasTag(p):!l.hasTag(p))return!1;break}default:throw new TypeError(`Invalid query key "${m}"`)}return!0});return new q(i)}case"p":{if(t.state.origin instanceof J)return new q([t.state.origin]);throw new TypeError("Nearest player is not available in this context.")}case"r":{let i=r.getPlayers().filter(m=>{if(o.length===0)return!0;for(let{key:u,value:p}of o)switch(u){case"name":{let h=p,d=h.startsWith("!");if(d&&(h=h.slice(1)),d?m.username===h:m.username!==h)return!1;break}case"tag":{let h=p,d=h.startsWith("!");if(d&&(h=h.slice(1)),d?m.hasTag(h):!m.hasTag(h))return!1;break}default:throw new TypeError(`Invalid query key "${u}"`)}return!0}),l=i[Math.floor(Math.random()*i.length)];return new q([l])}case"s":{if(t.state.origin instanceof E)return new q([t.state.origin]);throw new TypeError("Source player is not available in this context.")}}}else{let n=r.getPlayers().filter(s=>s.username===a);if(n.length===0)throw new Error(`Player "${a}" was not found in the current dimension.`);return new q(n)}return new q(null)}};import{Vector3f as Ar}from"@serenityjs/protocol";var Z=class te extends ie{static name="position";static symbol=this.type<<16|64;result;constructor(t){super(),this.result=t}validate(t){if(!this.result&&t)throw new Error("Uxpected input to be formatted as a position.");return!!this.result}static extract(t){let a=t.next();if(!a)return new te(null);if(Number.isNaN(+a)&&!a.startsWith("~"))return new te(null);let r=t.next();if(!r)return new te(null);if(Number.isNaN(+r)&&!r.startsWith("~"))return new te(null);let n=t.next();if(!n)return new te(null);if(Number.isNaN(+n)&&!n.startsWith("~"))return new te(null);let s=a.startsWith("~")?+a.slice(1):0,o=r.startsWith("~")?+r.slice(1):0,i=n.startsWith("~")?+n.slice(1):0;if(t.state.origin instanceof E){let l=t.state.origin,{x:m,y:u,z:p}=l.position,h=a==="~"?m:a.startsWith("~")?m+s:+a,d=r==="~"?u:r.startsWith("~")?u+o:+r,b=n==="~"?p:n.startsWith("~")?p+i:+n,S=new Ar(h,d,b);return new te(S)}else{let l=a==="~"?0:a.startsWith("~")?s:+a,m=r==="~"?0:r.startsWith("~")?o:+r,u=n==="~"?0:n.startsWith("~")?i:+n,p=new Ar(l,m,u);return new te(p)}}};var dt=class extends ve{static{c(this,"SoftEnum")}static type=1040};var L=class extends dt{static{c(this,"CustomEnum")}static identifier;static symbol=this.type<<16|56;static options=[];static strict=!0;result;options;constructor(t,a){super(),this.result=t,this.options=a}validate(t=!1){if(t&&this.result===null)throw new TypeError(`Expected one of "${this.options.join(", ")}" after previous argument.`);if(this.result===null)return!1;if(!this.options.includes(this.result)&&t)throw new TypeError(`Expected one of "${this.options.join(", ")}" after previous argument.`);return this.options.includes(this.result)}static extract(t){let a=t.peek();return a?(a=t.next(),+a>=0||+a<=0?new this(null,this.options):a==="true"||a==="false"?new this(null,this.options):new this(a,this.options)):new this(null,this.options)}};var Wr=class ge extends L{static{c(this,"BooleanEnum")}static identifier="boolean";static options=["true","false"];static strict=!0;result;constructor(t){super(t?.toString()??"false",ge.options),this.result=t}validate(t){if(this.result===!0||this.result===!1)return!0;if(t)throw new TypeError(`Expected one of: ${ge.options.join(", ")}`);return!1}static extract(t){let a=t.peek();return a?(a=t.next(),a==="true"?new ge(!0):a==="false"?new ge(!1):new ge(null)):new ge(null)}};var Gr=class extends L{static{c(this,"GamemodeEnum")}static identifier="gamemode";static options=["s","c","a","sp","survival","creative","adventure","spectator"]};import{AbilityIndex as Ko}from"@serenityjs/protocol";var Zo=Object.values(Ko).filter(e=>typeof e=="string"),zr=class extends L{static name="ability";static options=Zo};var Qo=H.getAll().map(e=>e.identifier.startsWith("minecraft:")?e.identifier.slice(10):e.identifier),xe=class extends L{static{c(this,"BlockEnum")}static identifier="blocks";static options=Qo};var Xo=R.getAll().map(e=>e.identifier.startsWith("minecraft:")?e.identifier.slice(10):e.identifier),Ue=class extends L{static{c(this,"EntityEnum")}static identifier="entities";static options=Xo};var Bo=z.getAll().map(e=>e.identifier.startsWith("minecraft:")?e.identifier.slice(10):e.identifier),Ee=class extends L{static{c(this,"ItemEnum")}static identifier="items";static options=Bo};var Lr=class extends L{static{c(this,"TagEnum")}static identifier="tag_operation";static options=["add","remove","list"]};var ft=class extends L{static{c(this,"WorldEnum")}static identifier="worlds";static options=[]};var Or=class{static{c(this,"Command")}name;description;registry;callback;constructor(t,a,r,n){this.name=t,this.description=a,this.registry=r,this.callback=n}};import{AvailableCommandsPacket as ei}from"@serenityjs/protocol";import{CommandPermissionLevel as Io}from"@serenityjs/protocol";var Hr=class{static{c(this,"CommandRegistry")}overloads=new Map;debug=!1;permissionLevel=Io.Normal;overload(t,a){return a?this.overloads.set(t,a):this.overloads.set(t,()=>{}),this}};var Nr=class{static{c(this,"Commands")}commands=new Map;getAll(){return[...this.commands.values()]}get(t){return t.startsWith("/")&&(t=t.slice(1)),t=t.split(" ")[0],this.commands.get(t)}register(t,a,r,n){let s=new Hr,o=n??r;(n?r:()=>{})(s);let l=new Or(t,a,s,o);return this.commands.set(t,l),l}unregister(t){this.commands.delete(t)}serialize(){let t=new ei;return t.dynamicEnums=[],t.commands=this.getAll().map(a=>({name:a.name,description:a.description,permissionLevel:a.registry.permissionLevel,subcommands:[],flags:a.registry.debug?1:0,alias:-1,overloads:[...a.registry.overloads.keys()].map(r=>({chaining:!1,parameters:Object.entries(r).map(([s,o])=>{let i=Array.isArray(o)?o[0]:o,l=i.type===dt.type&&i.options.length>0?68157440|t.dynamicEnums.push({name:i.name,values:i.options})-1:i.symbol,m=Array.isArray(o)?o[1]:!1;return s=m?s+"?":s,{symbol:l,name:s,optional:m,options:0}})}))})),t.chainedSubcommandValues=[],t.subcommands=[],t.enumConstraints=[],t.enumValues=[],t.enums=[],t.postFixes=[],t}};var Zt=class{static{c(this,"CommandArgumentPointer")}arguments;state;offset=0;constructor(t,a){this.state=t,this.arguments=a}peek(){return this.arguments[this.offset]||null}next(){return this.arguments[this.offset++]||null}},De=class{static{c(this,"CommandExecutionState")}split;command;origin;constructor(t,a,r){this.split=this.parse(a);let n=this.split.shift();this.command=t.find(s=>s.name===n),this.origin=r}execute(){if(!this.command)throw new TypeError("Unknown command executed. Please make sure the command exists, and that you have permission to use it.");let t={origin:this.origin};for(let[a,r]of this.command.registry.overloads){let n={origin:this.origin},s=new Zt(this,this.split);for(let o in a){let i=a[o];if(i)if(Array.isArray(i)){let[l,m]=i;if(!m&&s.offset>=s.arguments.length)throw new TypeError(`Argument ${o} is required.`);let u=l.extract(s);u&&(u.optional=m),n[o]=u??l.default}else{let l=i.extract(s);l&&(l.optional=!1),n[o]=l??i.default}}if(Object.assign(t,n),!(s.offset<s.arguments.length)&&Object.keys(n).length===Object.keys(a).length+1){for(let[o,i]of Object.entries(n)){if(!(i instanceof ve))continue;let l=i.result;i.optional&&l==null||i.validate(!0)}return r(n)??{}}}return this.command.callback(t)??{}}parse(t){let a=/"([^"]+)"|(\S+)/g,r=[],n=null;for(;n=a.exec(t);)r.push(n[1]||n[2]);return r}};import{Gamemode as gt,CommandPermissionLevel as ti}from"@serenityjs/protocol";var ai=c(e=>{e.commands.register("gamemode","Sets a player's gamemode",t=>{t.permissionLevel=ti.Operator,t.overload({gamemode:Gr,target:[T,!0]},a=>{let r=a.target.validate()?a.target.result:[a.origin instanceof J?a.origin:null];if(!r||r.length===0)throw new Error("No targets matched the selector.");let n=a.gamemode.result,s=[];for(let o of r)if(!(!o||!(o instanceof J))){switch(n){case"s":case"survival":{o.gamemode=gt.Survival;break}case"c":case"creative":{o.gamemode=gt.Creative;break}case"a":case"adventure":{o.gamemode=gt.Adventure;break}case"sp":case"spectator":{o.gamemode=gt.Spectator;break}default:throw new TypeError("Invalid gamemode specified!")}s.push(`\xA7aSuccessfully updated \xA72${o.username}'s\xA7a gamemode!\xA7r`)}return{message:s.join(`
|
|
2
|
+
`)}})},()=>{})},"register"),Rr=ai;import{AbilityIndex as ri,CommandPermissionLevel as ni}from"@serenityjs/protocol";var si=c(e=>{e.commands.register("ability","Update an ability for a specified player.",t=>{t.permissionLevel=ni.Operator,t.overload({target:T,ability:zr,enabled:Wr},a=>{let r=a.target.result,n=a.ability.result,s=ri[n],o=a.enabled.result,i=[];for(let l of r){if(!l.isPlayer()){i.push(`\xA77Entity \xA7c${l.uniqueId}\xA77 is not a player.`);continue}l.abilities.set(s,o),i.push(`\xA77Updated ability \xA7a${n}\xA77 to \xA7c${o}\xA77 for \xA7c${l.uniqueId}\xA77`)}return{message:i.join(`
|
|
3
|
+
`)}})},()=>{})},"register"),Fr=si;import{CommandPermissionLevel as oi}from"@serenityjs/protocol";var ii=c(e=>{e.commands.register("clear","Clears items from player inventory.",t=>{t.permissionLevel=oi.Operator,t.overload({target:T,item:[Ee,!0],metadata:[le,!0],amount:[le,!0]},a=>{let r=a.target.result,n=a.item?.result,s=n?`${n.includes(":")?"":"minecraft:"}${n}`:void 0,o=a.metadata?.result??0,i=a.amount?.result,l=0;if(r.length===0)return{message:"No targets matched selector"};for(let m of r){if(!m.hasTrait(w))continue;let{container:u}=m.getTrait(w);if(!n){u.clear();continue}for(let[p,h]of Object.entries(u.storage)){if(!h||h.type.identifier!==s&&h.auxillary!==o)continue;let d=h.amount,b=d-(i??1);if(b<0?(u.clearSlot(Number.parseInt(p)),l+=d):(h.setAmount(Math.max(b,0)),l+=Math.min(i??1,d)),l>=(i??1))break}}return{message:`Cleared the inventory of ${r.length} entities`}})},()=>{})},"register"),$r=ii;import{CommandPermissionLevel as ci}from"@serenityjs/protocol";var li=c(e=>{e.commands.register("fill","Fill a region with a specific block",t=>{t.permissionLevel=ci.Operator,t.overload({from:Z,to:Z,block:xe},a=>{let r=a.block.result,n=r.includes(":")?r:`minecraft:${r}`,s=a.from.result?.floor(),o=a.to.result?.floor(),i=a.origin instanceof E?a.origin.dimension:a.origin,l=e.blockPalette.resolveType(n);i.fill(s,o,l.getPermutation())})},()=>{})},"register"),qr=li;import{CommandPermissionLevel as mi}from"@serenityjs/protocol";var pi=c(e=>{e.commands.register("give","Gives an item to a player",t=>{t.permissionLevel=mi.Operator,t.overload({target:T,item:Ee,amount:[le,!0],metadata:[le,!0]},a=>{let r=a.target.result,n=a.item.result,s=n.includes(":")?n:`minecraft:${n}`,o=a.amount?.result??1,i=a.metadata?.result??0;for(let l of r){if(!l.isPlayer())continue;let m=new k(s,{amount:o,auxillary:i,world:l.getWorld()}),{container:u}=l.getTrait(w);u.addItem(m)}return{message:`Successfully gave x${o} ${s} to ${r.length} players.`}})},()=>{})},"register"),Ur=pi;import{DisconnectReason as ui,CommandPermissionLevel as hi}from"@serenityjs/protocol";var di=c(e=>{e.commands.register("kick","Kicks a player from the server",t=>{t.permissionLevel=hi.Operator,t.overload({target:T,reason:[ce,!0]},a=>{let r=a.target.result,n=a.reason?.result??"Kicked by an operator.";if(r.length===0)throw new Error("No targets matched the selector.");for(let s of r)s instanceof J&&s.disconnect(n,ui.Kicked)})},()=>{})},"register"),Vr=di;import{CommandPermissionLevel as fi}from"@serenityjs/protocol";var gi=c(e=>{e.commands.register("setblock","Sets a block at the specified location",t=>{t.permissionLevel=fi.Operator,t.overload({position:Z,block:xe},a=>{let r=a.block.result,n=r.includes(":")?r:`minecraft:${r}`,s=a.position.result?.floor(),i=(a.origin instanceof E?a.origin.dimension:a.origin).getBlock(s),l=e.blockPalette.resolveType(n);return i.setType(l),{message:`\xA7aSuccessfully set block at \xA72${s.x}\xA7a, \xA72${s.y}\xA7a, \xA72${s.z}\xA7a to \xA72${l.identifier}\xA7a.\xA7r`}})},()=>{})},"register"),jr=gi;import{CommandPermissionLevel as _i}from"@serenityjs/protocol";var yi=c(e=>{e.commands.register("tag","Interact with the tags of a specified entity.",t=>{t.permissionLevel=_i.Operator,t.overload({target:T,operation:Lr,tag:[ce,!0]},a=>{let r=a.target.result,n=a.operation.result,s=[];for(let o of r)switch(n){case"add":{let i=a.tag.result;o.addTag(i)?s.push(`\xA77Added tag \xA7a${i}\xA77 to \xA7c${o.uniqueId}\xA77`):s.push(`\xA77Tag \xA7a${i}\xA77 already exists on \xA7c${o.uniqueId}\xA77`);break}case"remove":{let i=a.tag.result;o.removeTag(i)?s.push(`\xA77Removed tag \xA7a${i}\xA77 from \xA7c${o.uniqueId}\xA77`):s.push(`\xA77Tag \xA7a${i}\xA77 does not exist on \xA7c${o.uniqueId}\xA77`);break}case"list":{let i=o.getTags();i.length===0?s.push(`\xA7c${o.uniqueId}\xA77 has no tags.`):s.push(`\xA7c${o.uniqueId}\xA77 has the following tags: \xA7a${i.join("\xA77, \xA7a")}`);break}}return{message:s.join(`
|
|
4
|
+
`)}})},()=>{})},"register"),Jr=yi;import{CommandPermissionLevel as Rc}from"@serenityjs/protocol";import{Logger as kc,LoggerColors as xc}from"@serenityjs/logger";import{DimensionType as Cc,SetTimePacket as Pc,TextPacket as vc,TextPacketType as Tc}from"@serenityjs/protocol";import Ec from"@serenityjs/emitter";var yt={};Be(yt,{BlindnessEffect:()=>Ri,DarknessEffect:()=>qi,Effect:()=>x,FatalPoisonEffect:()=>nc,InstantDamageEffect:()=>zi,InstantHealthEffect:()=>Oi,InvisibilityEffect:()=>mc,NauseasEffect:()=>ji,NightVisionEffect:()=>Mi,PoisonEffect:()=>Ti,RegenerationEffect:()=>ki,SlownessEffect:()=>ic,SpeedEffect:()=>Ki,WaterBreathingEffect:()=>hc,WitherEffect:()=>Ii});import{Color as bi}from"@serenityjs/protocol";var x=class{static{c(this,"Effect")}static type;static instant=!1;color=new bi(255,255,255,255);duration;amplifier;showParticles;constructor(t,a,r){this.duration=Object.getPrototypeOf(this).instant?0:t,this.amplifier=a??0,this.showParticles=r??!0}toString(){return JSON.stringify({effectType:Object.getPrototypeOf(this).type,duration:this.duration,amplifier:this.amplifier,showParticles:this.showParticles})}isExpired(){return this.duration<=0}};import{Color as wi,EffectType as Si}from"@serenityjs/protocol";var ki=class extends x{static{c(this,"RegenerationEffect")}static type=Si.Regeneration;color=new wi(255,205,92,171);onTick(t){let a=t.getTrait(M);if(!a)return;let r=Math.max(50/2**(this.amplifier-1),1*2**(this.amplifier-5));Number(t.getWorld().currentTick)%r==0&&a.set(a.currentValue+1)}};import{EffectType as xi,Color as Ci,Gamemode as Pi,ActorDamageCause as vi}from"@serenityjs/protocol";var Ti=class extends x{static{c(this,"PoisonEffect")}static type=xi.Poison;static instant=!1;color=new Ci(255,78,147,49);onTick(t){let a=Math.floor(Math.max(25*Math.pow(.5,this.amplifier-1),12));if(a=Math.min(a,10),Number(t.dimension.world.currentTick)%a!=0||t.isPlayer()&&t.gamemode==Pi.Creative)return;let r=t.getTrait(M);r.currentValue<=1||r.applyDamage(1,void 0,vi.Magic)}};import{Color as Ei,EffectType as Di}from"@serenityjs/protocol";var Mi=class extends x{static{c(this,"NightVisionEffect")}static type=Di.NightVision;color=new Ei(255,31,31,161)};import{ActorDamageCause as Ai,EffectType as Wi,Gamemode as Gi}from"@serenityjs/protocol";var zi=class extends x{static{c(this,"InstantDamageEffect")}static type=Wi.InstantDamage;static instant=!0;onAdd(t){if(t.isPlayer()&&t.gamemode==Gi.Creative)return;let a=t.getTrait(M);a&&a.applyDamage(3*2**this.amplifier,void 0,Ai.Magic)}};import{EffectType as Li}from"@serenityjs/protocol";var Oi=class extends x{static{c(this,"InstantHealthEffect")}static type=Li.InstantHealth;static instant=!0;onAdd(t){let a=t.getTrait(M),r=a.currentValue;r>=a.effectiveMax||a.set(Math.min(a.effectiveMax,r+2*2**this.amplifier))}};import{Color as Hi,EffectType as Ni}from"@serenityjs/protocol";var Ri=class extends x{static{c(this,"BlindnessEffect")}static type=Ni.Blindness;color=new Hi(255,31,31,35)};import{Color as Fi,EffectType as $i}from"@serenityjs/protocol";var qi=class extends x{static{c(this,"DarknessEffect")}static type=$i.Darkness;color=new Fi(255,41,39,33)};import{Color as Ui,EffectType as Vi}from"@serenityjs/protocol";var ji=class extends x{static{c(this,"NauseasEffect")}static type=Vi.Nausea;color=new Ui(255,85,29,74)};import{Color as Ji,EffectType as Yi}from"@serenityjs/protocol";var Ki=class extends x{static{c(this,"SpeedEffect")}static type=Yi.Speed;color=new Ji(255,124,175,198);onAdd(t){let a=t.getTrait(Q);a.set(a.currentValue*(1+.2*this.amplifier))}onRemove(t){let a=t.getTrait(Q);a.set(a.defaultValue)}};import{ActorDamageCause as Zi,Color as Qi,EffectType as Xi,Gamemode as Bi}from"@serenityjs/protocol";var Ii=class extends x{static{c(this,"WitherEffect")}static type=Xi.Wither;color=new Qi(255,53,42,39);onTick(t){let a=Math.max(40/Math.pow(2,this.amplifier-1),10);if(Number(t.dimension.world.currentTick)%a!=0||t.isPlayer()&&t.gamemode==Bi.Creative)return;t.getTrait(M).applyDamage(1,void 0,Zi.Magic)}};import{ActorDamageCause as ec,Color as tc,EffectType as ac,Gamemode as rc}from"@serenityjs/protocol";var nc=class extends x{static{c(this,"FatalPoisonEffect")}static type=ac.FatalPoison;color=new tc(255,78,147,49);onTick(t){let a=Math.floor(Math.max(25*Math.pow(.5,this.amplifier-1),12));if(a=Math.min(a,10),Number(t.dimension.world.currentTick)%a!=0||t.isPlayer()&&t.gamemode==rc.Creative)return;t.getTrait(M).applyDamage(1,void 0,ec.Magic)}};import{Color as sc,EffectType as oc}from"@serenityjs/protocol";var ic=class extends x{static{c(this,"SlownessEffect")}static type=oc.Slowness;color=new sc(255,90,108,129);onAdd(t){let a=t.getTrait(Q);a.set(a.currentValue*(1-.15*this.amplifier))}onRemove(t){let a=t.getTrait(Q);a.set(a.defaultValue)}};import{Color as cc,EffectType as lc}from"@serenityjs/protocol";var mc=class extends x{static{c(this,"InvisibilityEffect")}static type=lc.Invisibility;color=new cc(255,127,131,146);onAdd(t){t.getTrait(_t)?.setInvisibility(!0)}onRemove(t){t.getTrait(_t)?.setInvisibility(!1)}};import{Color as pc,EffectType as uc}from"@serenityjs/protocol";var hc=class extends x{static{c(this,"WaterBreathingEffect")}static type=uc.WaterBreathing;color=new pc(255,152,218,192)};var Yr=class{static{c(this,"EffectPallete")}effects=new Map;constructor(){for(let t of Qt)this.registerEffect(t)}registerEffect(t){this.effects.set(t.type,t)}getEffect(t){return this.effects.get(t)}getAllEffects(){return[...this.effects.values()]}removeEffect(t){this.effects.delete(t)}};var Qt=[];for(let e in yt){let t=yt[e];Qt.push(t)}import{BlockPosition as Kr,DimensionType as dc,TextPacket as fc,TextPacketType as gc,Vector3f as _c}from"@serenityjs/protocol";var bt=class{static{c(this,"TickSchedule")}scheduledTick;completeTick;callbacks=new Set;constructor(t,a){this.scheduledTick=BigInt(t);let n=(a instanceof Me?a.world:a).currentTick;this.completeTick=n+this.scheduledTick}execute(){for(let t of this.callbacks)t()}on(t){this.callbacks.add(t)}cancel(){this.callbacks.clear()}};var wt={identifier:"overworld",type:dc.Overworld,generator:"void",viewDistance:20,simulationDistance:10,spawnPosition:[0,32767,0]},Me=class{static{c(this,"Dimension")}serenity;properties=wt;identifier;type;world;generator;entities=new Map;blocks=new Map;get viewDistance(){return this.properties.viewDistance}set viewDistance(t){this.properties.viewDistance=t}get simulationDistance(){return this.properties.simulationDistance}set simulationDistance(t){this.properties.simulationDistance=t}get spawnPosition(){let t=_c.fromArray(this.properties.spawnPosition);if(t.y>=32767){let a=this.getTopmostBlock(t);a?t.y=a.position.y+3:t.y=0,this.spawnPosition=t}return t}set spawnPosition(t){this.properties.spawnPosition=[t.x,t.y,t.z]}constructor(t,a){this.serenity=t.serenity,this.world=t,this.properties={...wt,...a};let r=this.serenity.getGenerator(this.properties.generator);if(!r)throw new Error(`Failed to find generator "${this.properties.generator}" for dimension "${this.properties.identifier}"`);this.generator=new r(this,{seed:t.properties.seed}),this.identifier=this.properties.identifier,this.type=this.properties.type}indexOf(){return[...this.world.dimensions.values()].indexOf(this)}onTick(t){if(this.getPlayers().length===0)return;let a=this.getPlayers().map(r=>r.position);for(let r of this.entities.values())if(a.some(s=>s.distance(r.position)<=this.simulationDistance<<4)){for(let s of r.traits.values())try{s.onTick?.(t)}catch(o){this.world.logger.error(`Failed to tick entity trait "${s.identifier}" for entity "${r.type.identifier}:${r.uniqueId}" in dimension "${this.identifier}"`,o),r.traits.delete(s.identifier)}if(r.hasTrait(w)){let{container:s}=r.getTrait(w);for(let o of s.storage)if(o)for(let i of o.traits.values())try{i.onTick?.(t)}catch(l){this.world.logger.error(`Failed to tick item trait "${i.identifier}" for item "${o.type.identifier}" in dimension "${this.identifier}"`,l),o.traits.delete(i.identifier)}}}for(let r of this.blocks.values())if(a.some(s=>s.distance(r.position)<=this.simulationDistance))for(let s of r.traits.values())try{s.onTick?.(t)}catch(o){this.world.logger.error(`Failed to tick block trait "${s.identifier}" for block "${r.position.x}, ${r.position.y}, ${r.position.z}" in dimension "${this.identifier}"`,o),r.traits.delete(s.identifier)}}getWorld(){return this.world}getChunk(t,a){return this.world.provider.readChunk(t,a,this)}setChunk(t){for(let a of this.getPlayers()){let r=a.getTrait(_e);r.chunks.has(t.hash)&&r.send(t)}return this.world.provider.writeChunk(t,this)}getBlock(t){let a=Kr.from(t),r=Kr.hash(a),n=this.blocks.get(r);if(n)return n;{let s=a.x>>4,o=a.z>>4,l=this.getChunk(s,o).getPermutation(a),m=new mt(this,a,l),u=this.world.blockPalette.getRegistry(l.type.identifier);for(let p of l.type.components){let h=this.world.blockPalette.getTrait(p);h&&u.push(h)}for(let p of Object.keys(l.state))for(let h of this.world.blockPalette.getAllTraits())h.identifier===p&&u.push(h);for(let p of u)m.addTrait(p);return(m.components.size>0||m.traits.size>0)&&this.blocks.set(r,m),m}}getTopmostBlock(t){let r=this.getChunk(t.x>>4,t.z>>4).getTopmostLevel(t);return this.getBlock({...t,y:r})}getPermutation(t){let a=t,r=a.x>>4,n=a.z>>4;return this.getChunk(r,n).getPermutation({x:r,y:a.y,z:n})}sendMessage(t){let a=new fc;a.type=gc.Raw,a.needsTranslation=!1,a.source=null,a.message=t,a.parameters=null,a.xuid="",a.platformChatId="",a.filtered=t,this.broadcast(a)}getPlayers(){return[...this.entities.values()].filter(t=>t.isPlayer())}getEntity(t,a=!1){return a?[...this.entities.values()].find(r=>r.runtimeId===t)||null:this.entities.get(t)??null}getEntities(){return[...this.entities.values()]}fill(t,a,r){let n=Math.min(t.x,a.x),s=Math.min(t.y,a.y),o=Math.min(t.z,a.z),i=Math.max(t.x,a.x),l=Math.max(t.y,a.y),m=Math.max(t.z,a.z),u=new Set;for(let p=n;p<=i;p++)for(let h=s;h<=l;h++)for(let d=o;d<=m;d++){let b=this.getChunk(p>>4,d>>4);b.setPermutation({x:p,y:h,z:d},r),u.add(b),b.dirty=!0}for(let p of u)this.setChunk(p)}spawnEntity(t,a){let r=new E(this,t);return r.addTrait(Ae),r.addTrait(St),r.addTrait(Q),r.position.x=a.x,r.position.y=a.y,r.position.z=a.z,r.spawn()}spawnItem(t,a){let r=new E(this,_.Item);t.world||(t.world=this.world),r.position.x=a.x,r.position.y=a.y,r.position.z=a.z;let n=new Ve(r);return n.itemStack=t,r.addTrait(Ae),r.addTrait(St),r.addTrait(Q),r.spawn(),r}executeCommand(t){return t.startsWith("/")&&(t=t.slice(1)),new De(this.world.commands.getAll(),t,this).execute()}schedule(t){let a=new bt(t,this);return this.world.schedules.add(a),a}broadcast(...t){for(let a of this.getPlayers())a.send(...t)}broadcastImmediate(...t){for(let a of this.getPlayers())a.sendImmediate(...t)}broadcastExcept(t,...a){for(let r of this.entities.values())r.isPlayer()&&r!==t&&r.send(...a)}};import{RemoveObjectivePacket as yc,ScoreboardActionType as bc,SetDisplayObjectivePacket as wc,SetScorePacket as Sc}from"@serenityjs/protocol";import{ScoreboardActionType as Bt,SetScorePacket as It}from"@serenityjs/protocol";import{ScoreboardIdentityType as Xt}from"@serenityjs/protocol";var me=class Zr{static{c(this,"ScoreboardIdentity")}static IDENTIFIER=0n;identifier=Zr.IDENTIFIER++;type;displayName;entity=null;constructor(t,a){t instanceof E?(t.isPlayer()?(this.type=Xt.Player,this.displayName=t.username):(this.type=Xt.Entity,this.displayName=t.type.identifier),this.identifier=a||t.runtimeId,this.entity=t):(this.type=Xt.FakePlayer,this.displayName=t)}};var Qr=class{static{c(this,"ScoreboardObjective")}world;scoreboard;participants=new Map;objectiveName;displayName;constructor(t,a,r){this.world=t,this.scoreboard=t.scoreboard,this.objectiveName=a,this.displayName=r??a}hasParticipant(t){for(let[a]of this.participants)if(t instanceof me&&a===t||t instanceof E&&a.entity===t||typeof t=="string"&&a.displayName===t)return!0;return!1}getParticipant(t){for(let[a]of this.participants)if(t instanceof me&&a===t||t instanceof E&&a.entity===t||typeof t=="string"&&a.displayName===t)return a;return null}getParticipants(){return[...this.participants.keys()]}addParticipant(t,a=0){if(this.hasParticipant(t))throw new Error("Participant is already in the objective.");let r=t instanceof me?t:t instanceof E?t.scoreboardIdentity:new me(t);return this.participants.set(r,a),r}removeParticipant(t){let a=this.getParticipant(t);if(!a)return!1;this.participants.delete(a);let r=new It;return r.type=Bt.Remove,r.entries=[{scoreboardId:a.identifier,objectiveName:this.objectiveName,score:0,identityType:a.type,actorUniqueId:null,customName:null}],this.world.broadcast(r),!0}setScore(t,a){let r=this.getParticipant(t)??this.addParticipant(t);this.participants.set(r,a);let n=new It;n.type=Bt.Change,n.entries=[{scoreboardId:r.identifier,objectiveName:this.objectiveName,score:a,identityType:r.type,actorUniqueId:r.entity?.uniqueId??null,customName:r.displayName}],this.world.broadcast(n)}addScore(t,a){let r=this.getParticipant(t)??this.addParticipant(t),s=(this.participants.get(r)??0)+a;return this.setScore(r,s),s}getScore(t){let a=this.getParticipant(t);return a?this.participants.get(a):null}clearScores(){let t=new It;t.type=Bt.Remove,t.entries=[...this.participants.keys()].map(a=>({scoreboardId:a.identifier,objectiveName:this.objectiveName,score:0,identityType:a.type,actorUniqueId:null,customName:null})),this.world.broadcast(t),this.participants.clear()}};var Xr=class{static{c(this,"Scoreboard")}world;objectives=new Set;slots=new Map;constructor(t){this.world=t}getObjective(t){for(let a of this.objectives)if(a.objectiveName===t)return a}addObjective(t,a){if(this.getObjective(t))throw new Error(`Objective with name '${t}' already exists`);let r=new Qr(this.world,t,a);return this.objectives.add(r),r}removeObjective(t){if(typeof t=="string"){let a=this.getObjective(t);if(!a)throw new Error("Objective does not exist");this.objectives.delete(a)}else this.objectives.delete(t)}getObjectiveAtDisplaySlot(t){return this.slots.get(t)}setObjectiveAtDisplaySlot(t,a){let{objective:r,sortOrder:n,player:s}=a,o=new wc;o.displaySlot=t,o.objectiveName=r.objectiveName,o.displayName=r.displayName,o.criteriaName="dummy",o.sortOrder=n;let i=new Sc;return i.type=bc.Change,i.entries=[...r.participants].map(([l,m])=>({scoreboardId:l.identifier,objectiveName:r.objectiveName,score:m,identityType:l.type,actorUniqueId:l.entity?.uniqueId??null,customName:l.displayName})),s?s.send(o,i):this.world.broadcast(o,i),this.slots.set(t,r),r}clearObjectiveAtDisplaySlot(t,a){let r=this.slots.get(t);if(!r)return;let n=new yc;return n.objectiveName=r.objectiveName,a?.player?a.player.send(n):(this.world.broadcast(n),this.slots.delete(t)),r}};var Br={identifier:"default",seed:Math.floor(Math.random()*2**32),saveInterval:5,dimensions:[{identifier:"overworld",type:Cc.Overworld,generator:"superflat",viewDistance:20,simulationDistance:10,spawnPosition:[0,32767,0]}]},je=class extends Ec{static{c(this,"World")}serenity;properties=Br;identifier;provider;dimensions=new Map;logger;entityPalette=new an;effectPalette=new Yr;blockPalette=new Cr;itemPalette=new tn;commands=new Nr;schedules=new Set;scoreboard=new Xr(this);currentTick=0n;dayTime=0;constructor(t,a,r){super(),this.serenity=t,this.provider=a,this.properties={...Br,...r},this.identifier=this.properties.identifier,this.logger=new kc(this.identifier,xc.GreenBright);for(let n of[...Ir,...en])n(this);for(let n of this.properties.dimensions)this.createDimension(n)}onTick(t){if(!(this.getPlayers().length===0||!new Ra(this.currentTick,BigInt(t),this).emit())){++this.currentTick,this.dayTime=(this.dayTime+1)%24e3;for(let r of this.dimensions.values())try{r.onTick(t)}catch(n){this.logger.error(`Failed to tick dimension ${r.identifier}`,n)}if(this.currentTick%500n===0n){let r=new Pc;r.time=this.dayTime,this.broadcast(r)}if(this.schedules.size>0){for(let r of this.schedules)if(this.currentTick>=r.completeTick){try{r.execute()}catch(n){this.logger.error(`Failed to execute schedule for dimension at tick ${r.completeTick}`,n)}this.schedules.delete(r)}}this.currentTick%(BigInt(this.properties.saveInterval)*1200n)===0n&&this.provider.onSave()}}createDimension(t){let a={...wt,...t};if(this.dimensions.has(a.identifier))return this.logger.error(`Failed to create dimension with identifier ${a.identifier} as it already exists`),!1;let r=new Me(this,a);return this.dimensions.set(r.identifier,r),this.logger.debug(`Created dimension: ${r.identifier}`),r}sendMessage(t){let a=new vc;a.type=Tc.Raw,a.needsTranslation=!1,a.source=null,a.message=t,a.parameters=null,a.xuid="",a.platformChatId="",a.filtered=t,this.broadcast(a)}getDimension(t){return t===void 0?this.dimensions.values().next().value:this.dimensions.get(t)}getDimensions(){return[...this.dimensions.values()]}getPlayers(){return[...this.dimensions.values()].flatMap(t=>t.getPlayers())}getEntities(){return[...this.dimensions.values()].flatMap(t=>t.getEntities())}schedule(t){let a=new bt(t,this);return this.schedules.add(a),a}broadcast(...t){for(let a of this.getPlayers())a.send(...t)}broadcastImmediate(...t){for(let a of this.getPlayers())a.sendImmediate(...t)}broadcastExcept(t,...a){for(let r of this.getPlayers())r!==t&&r.send(...a)}};import{Endianness as kt}from"@serenityjs/binarystream";import{CompoundTag as rn}from"@serenityjs/nbt";var xt=class We{static{c(this,"BlockStorage")}static MAX_X=16;static MAX_Y=16;static MAX_Z=16;static MAX_SIZE=16*16*16;palette;blocks;air;constructor(t,a){let r=W.resolve(C.Air);this.air=r.network,this.palette=t??[this.air],this.blocks=a??Array.from({length:We.MAX_SIZE},()=>0)}isEmpty(){return this.palette.length===1&&this.palette[0]===this.air}getState(t,a,r){let n=We.getIndex(t,a,r),s=this.blocks[n]??0;return this.palette[s]??this.air}setState(t,a,r,n){let s=this.palette.indexOf(n);s===-1&&(s=this.palette.push(n)-1),this.blocks[We.getIndex(t,a,r)]=s}static getIndex(t,a,r){return(t&15)<<8|(r&15)<<4|a&15}static serialize(t,a,r=!1){let n=Math.ceil(Math.log2(t.palette.length));switch(n){case 0:{n=1;break}case 1:case 2:case 3:case 4:case 5:case 6:break;case 7:case 8:{n=8;break}default:{n=16;break}}a.writeByte(n<<1|1);let s=Math.floor(32/n),o=Math.ceil(4096/s);for(let i=0;i<o;i++){let l=0;for(let m=0;m<s;m++){let u=i*s+m;if(u>=4096)break;let p=t.blocks[u]??0,h=m*n;l|=p<<h}a.writeInt32(l,kt.Little)}r?a.writeInt32(t.palette.length,kt.Little):a.writeZigZag(t.palette.length);for(let i of t.palette)if(r){let l=W.permutations.get(i);if(!l)throw new Error(`Unknown permutation state: ${i}`);let m=W.toNbt(l);rn.write(a,m)}else a.writeZigZag(i)}static deserialize(t,a=!1){let r=t.readByte(),n=r>>1,s=(r&1)!==0,o=Math.floor(32/n),i=Math.ceil(4096/o),l=Array.from({length:i});for(let d=0;d<i;d++)l[d]=t.readInt32(kt.Little);let m=a?t.readInt32(kt.Little):t.readZigZag(),u=Array.from({length:m});for(let d=0;d<m;d++)if(a){let b=rn.read(t),S=W.fromNbt(b);if(!S)throw new Error(`Unknown permutation state: ${b.valueOf(!0)}`);u[d]=S.network}else u[d]=t.readZigZag();let p=Array.from({length:4096}),h=0;for(let d of l)for(let b=0;b<o&&h<4096;b++,h++){let S=d>>b*n&(1<<n)-1,D=h>>8&15,j=h&15,I=h>>4&15;p[We.getIndex(D,j,I)]=S}return new We(u,p)}};import{BinaryStream as Dc}from"@serenityjs/binarystream";var F=class e{static{c(this,"SubChunk")}version;layers;index=null;constructor(t,a){this.version=t??9,this.layers=a??[]}isEmpty(){for(let t of this.layers)if(!t.isEmpty())return!1;return!0}getLayer(t){if(!this.layers[t])for(let a=0;a<=t;a++)this.layers[a]||(this.layers[a]=new xt);return this.layers[t]}getState(t,a,r,n){return this.getLayer(n).getState(t,a,r)}setState(t,a,r,n,s){this.getLayer(s??0).setState(t,a,r,n)}static serialize(t,a,r=!1){if(a.writeUint8(t.version),a.writeUint8(t.layers.length),t.version===9){if(t.index===null)throw new Error("SubChunk index is null for format version 9");a.writeInt8(t.index)}for(let n of t.layers)xt.serialize(n,a,r)}static deserialize(t,a=!1){let r=t.readUint8(),n=t.readUint8(),s=null;r===9&&(s=t.readInt8());let o=[];for(let l=0;l<n;l++)o.push(xt.deserialize(t,a));let i=new e(r,o);return i.index=s,i}static from(t,a=!1){let r=new Dc(t);return e.deserialize(r,a)}};import{ChunkCoords as Mc,DimensionType as ea}from"@serenityjs/protocol";import{BinaryStream as nn}from"@serenityjs/binarystream";var O=class e{static{c(this,"Chunk")}static MAX_SUB_CHUNKS=24;type;x;z;hash;subchunks;cache=null;dirty=!1;ready=!0;constructor(t,a,r,n){this.x=t,this.z=a,this.type=r,this.hash=Mc.hash({x:t,z:a}),this.subchunks=n??Array.from({length:e.MAX_SUB_CHUNKS})}getPermutation(t){let{x:a,y:r,z:n}=t,s=this.type===ea.Overworld?r+64:r,i=this.getSubChunk(s>>4).getState(a&15,s&15,n&15,0);return W.permutations.get(i)}setPermutation(t,a,r=!0){let{x:n,y:s,z:o}=t,i=this.type===ea.Overworld?s+64:s,l=this.getSubChunk(i>>4),m=a.network;l.setState(n&15,i&15,o&15,m,0),r&&(this.dirty=!0),this.cache=null}getTopmostLevel(t){for(let a=t.y;a>=-64;a--){let r=this.getPermutation({...t,y:a});if(r.type.identifier!==C.Air&&r.type.solid)return a}return-64}getBottommostLevel(t){for(let a=0;a<=t.y;a++)if(this.getPermutation({...t,y:a}).type.identifier!==C.Air)return a;return 0}getSubChunk(t){if(t<0)return this.getSubChunk(0);if(t>=e.MAX_SUB_CHUNKS)return this.getSubChunk(e.MAX_SUB_CHUNKS-1);if(!this.subchunks[t])for(let a=0;a<=t;a++){if(this.subchunks[a])continue;let r=new F;r.index=this.type===ea.Overworld?a-4:a,this.subchunks[a]=r}return this.subchunks[t]}getSubChunkSendCount(){let t=0;for(let a=e.MAX_SUB_CHUNKS-1;a>=0;a--){let r=this.subchunks[a];if(!r||r.isEmpty())t++;else break}return e.MAX_SUB_CHUNKS-t}isEmpty(){for(let t of this.subchunks)if(!t||!t.isEmpty())return!1;return!0}static serialize(t,a=!1){if(t.cache)return t.cache;let r=new nn;for(let n=0;n<t.getSubChunkSendCount();n++){let s=t.subchunks[n];if(s)F.serialize(s,r,a);else{let o=new F;o.index=n,F.serialize(o,r,a)}}for(let n=0;n<24;n++)r.writeByte(0),r.writeVarInt(2);return r.writeByte(0),t.cache=r.getBuffer(),t.cache}static deserialize(t,a,r,n,s=!1){let o=new nn(n),i=Array.from({length:e.MAX_SUB_CHUNKS},()=>new F);for(let m=0;m<e.MAX_SUB_CHUNKS;++m){let u=o.binary[o.offset];if(u!==8&&u!==9)break;i[m]=F.deserialize(o,s)}for(let m=0;m<24;m++)o.readByte(),o.readVarInt();return o.readByte(),new e(a,r,t,i)}};var ta={path:"./worlds"},Ct=class{static{c(this,"WorldProvider")}static identifier;identifier=this.constructor.identifier;world;constructor(...t){return this}onStartup(){}onShutdown(){}onSave(){}readChunk(t,a,r){throw new Error(`${this.identifier}.readChunk() is not implemented!`)}writeChunk(t,a){throw new Error(`${this.identifier}.writeChunk() is not implemented!`)}readAvailableEntities(t){throw new Error(`${this.identifier}.getAvailableEntities() is not implemented!`)}writeAvailableEntities(t,a){throw new Error(`${this.identifier}.writeAvailableEntities() is not implemented!`)}readEntity(t,a){throw new Error(`${this.identifier}.readEntity() is not implemented!`)}writeEntity(t,a){throw new Error(`${this.identifier}.writeEntity() is not implemented!`)}readPlayer(t,a){throw new Error(`${this.identifier}.readPlayer() is not implemented!`)}writePlayer(t,a){throw new Error(`${this.identifier}.writePlayer() is not implemented!`)}readAvailableBlocks(t){throw new Error(`${this.identifier}.readAvailableBlocks() is not implemented!`)}writeAvailableBlocks(t,a){throw new Error(`${this.identifier}.writeAvailableBlocks() is not implemented!`)}readBlock(t,a){throw new Error(`${this.identifier}.readBlock() is not implemented!`)}writeBlock(t,a){throw new Error(`${this.identifier}.writeBlock() is not implemented!`)}readProperty(t){throw new Error(`${this.identifier}.readProperty() is not implemented!`)}writeProperty(t,a){throw new Error(`${this.identifier}.writeProperty() is not implemented!`)}static initialize(t,a){throw new Error(`${this.identifier}.initialize() is not implemented!`)}static create(t,a,r){throw new Error(`${this.identifier}.create() is not implemented!`)}};import{ChunkCoords as Pt}from"@serenityjs/protocol";var $P=class extends Ct{static{c(this,"InternalProvider")}static identifier="internal";chunks=new Map;entities=new Map;players=new Map;properties=new Map;readChunk(t,a,r){this.chunks.has(r)||this.chunks.set(r,new Map);let n=this.chunks.get(r);return n.has(Pt.hash({x:t,z:a}))||n.set(Pt.hash({x:t,z:a}),r.generator.apply(t,a)),n.get(Pt.hash({x:t,z:a}))}writeChunk(t,a){this.chunks.has(a)||this.chunks.set(a,new Map),this.chunks.get(a).set(Pt.hash({x:t.x,z:t.z}),t)}getAvailableEntities(t){return this.entities.has(t)||this.entities.set(t,new Map),[...this.entities.get(t)].map(([r])=>r)}readEntity(t,a){this.entities.has(a)||this.entities.set(a,new Map);let r=this.entities.get(a);if(!r.has(t))throw new Error(`Entity with unique id ${t} not found!`);return r.get(t)}writeEntity(t,a){this.entities.has(a)||this.entities.set(a,new Map),this.entities.get(a).set(t.uniqueId,t)}readPlayer(t,a){this.players.has(a)||this.players.set(a,new Map);let r=this.players.get(a);return r.has(t)?r.get(t):null}writePlayer(t,a){this.players.has(a)||this.players.set(a,new Map),this.players.get(a).set(t.uuid,t)}readProperty(t){for(let[a,r]of this.properties)if(a.equals(t))return r;throw new Error(`Property with key ${t.toString("hex")} not found!`)}writeProperty(t,a){this.properties.set(t,a)}static initialize(){}static create(t,a,r){let n=new this,s=new je(t,n,r);return n.world=s,s}};import{existsSync as vt,mkdirSync as aa,readdirSync as Ac,readFileSync as Wc,writeFileSync as ra}from"node:fs";import{resolve as X}from"node:path";import{BinaryStream as Y,Endianness as U}from"@serenityjs/binarystream";import{Leveldb as Gc}from"@serenityjs/leveldb";import{BlockPosition as Je,ChunkCoords as zc}from"@serenityjs/protocol";var av=class $ extends Ct{static{c(this,"LevelDBProvider")}static identifier="leveldb";path;db;chunks=new Map;constructor(t){super(),this.path=t,this.db=Gc.open(X(t,"db"))}onShutdown(){for(let t of this.world.dimensions.values())t.generator.worker?.terminate();this.onSave(),this.db.close()}onStartup(){for(let t of this.world.dimensions.values()){let a=this.readAvailableEntities(t),r=this.readAvailableBlocks(t);if(!(a.length===0&&r.length===0)){for(let n of a){let s=this.readEntity(n,t);new E(t,s.identifier,{uniqueId:n,entry:s}).spawn()}for(let n of r){let s=this.readBlock(n,t),o=t.world.blockPalette.getAllPermutations().find(l=>l.network===s.permutation);if(!o)continue;let i=new mt(t,new Je(...s.position),o,{entry:s});t.blocks.set(Je.hash(i.position),i)}}}}onSave(){let t=[...this.world.dimensions.values()].map(r=>r.properties),a=this.world.properties;a.dimensions=t,ra(X(this.path,"properties.json"),JSON.stringify(a,null,2));for(let[r,n]of this.chunks){for(let m of n.values())m.dirty&&this.writeChunk(m,r);let s=[...r.entities.values()],o=[];for(let m of s)m.isPlayer()?this.writePlayer(m.getDataEntry(),r):(this.writeEntity(m.getDataEntry(),r),o.push(m.uniqueId));this.writeAvailableEntities(r,o);let i=[...r.blocks.values()],l=[];for(let m of i)this.writeBlock(m.getDataEntry(),r),l.push(Je.hash(m.position));this.writeAvailableBlocks(r,l),this.world.logger.info(`Saved \xA7c${n.size}\xA7r chunks, \xA7c${s.length}\xA7r entities, and \xA7c${i.length}\xA7r blocks for dimension \xA7a${r.identifier}\xA7r.`)}}readChunk(t,a,r){this.chunks.has(r)||this.chunks.set(r,new Map);let n=this.chunks.get(r),s=zc.hash({x:t,z:a});if(n.has(s))return n.get(s);if(this.hasChunk(t,a,r)){let o=new Array;for(let l=-4;l<16;l++)o.push(this.readSubChunk(t,l,a,r));let i=new O(t,a,r.type,o);return n.set(s,i),i}else{let o=r.generator.apply(t,a);return n.set(s,o),o.ready&&new at(r,o).emit(),o}}writeChunk(t,a){if(!(t.isEmpty()||!t.dirty)){this.writeChunkVersion(t.x,t.z,a,40);for(let r=-4;r<16;r++){let n=t.getSubChunk(r+4);!n||n.isEmpty()||this.writeSubChunk(n,t.x,r,t.z,a)}t.dirty=!1}}writeChunkVersion(t,a,r,n){let s=$.buildChunkVersionKey(t,a,r.indexOf());this.db.put(s,Buffer.from([n]))}hasChunk(t,a,r){try{let n=$.buildChunkVersionKey(t,a,r.indexOf());return!!this.db.get(n)}catch{return!1}}readSubChunk(t,a,r,n){try{let s=$.buildSubChunkKey(t,a,r,n.indexOf()),o=F.from(this.db.get(s),!0);return o.index=a,o}catch{let s=new F;return s.index=a,s}}writeSubChunk(t,a,r,n,s){let o=$.buildSubChunkKey(a,r,n,s.indexOf());t.index=r;let i=new Y;F.serialize(t,i,!0),this.db.put(o,i.getBuffer())}readAvailableEntities(t){let a=new Array;try{let r=$.buildActorListKey(t),n=new Y(this.db.get(r));do a.push(n.readInt64(U.Little));while(!n.cursorAtEnd());return a}catch{return a}}writeAvailableEntities(t,a){let r=$.buildActorListKey(t),n=new Y;for(let s of a)n.writeInt64(s,U.Little);this.db.put(r,n.getBuffer())}readEntity(t,a){if(!this.readAvailableEntities(a).includes(t))throw new Error(`Entity with unique id ${t} not found!`);let n=$.buildActorDataKey(t),s=this.db.get(n);return JSON.parse(s.toString(),(i,l)=>typeof l=="string"&&l.endsWith("BigInt_t")?BigInt(l.slice(0,-8)):l==="Infinity_t"?1/0:l==="-Infinity_t"?-1/0:l==="NaN_t"?Number.NaN:l)}writeEntity(t,a){let r=this.readAvailableEntities(a);r.includes(t.uniqueId)||r.push(t.uniqueId);let n=JSON.stringify(t,(i,l)=>typeof l=="bigint"?l.toString()+"BigInt_t":l===1/0?"Infinity_t":l===-1/0?"-Infinity_t":Number.isNaN(l)?"NaN_t":l),s=Buffer.from(n),o=$.buildActorDataKey(t.uniqueId);this.db.put(o,s)}readPlayer(t,a){try{let r=`player_server_${t}_${a.identifier}`,n=this.db.get(Buffer.from(r));return JSON.parse(n.toString(),(o,i)=>typeof i=="string"&&i.endsWith("BigInt_t")?BigInt(i.slice(0,-8)):i==="Infinity_t"?1/0:i==="-Infinity_t"?-1/0:i==="NaN_t"?Number.NaN:i)}catch{return null}}writePlayer(t,a){let r=JSON.stringify(t,(o,i)=>typeof i=="bigint"?i.toString()+"BigInt_t":i===1/0?"Infinity_t":i===-1/0?"-Infinity_t":Number.isNaN(i)?"NaN_t":i),n=Buffer.from(r),s=`player_server_${t.uuid}_${a.identifier}`;this.db.put(Buffer.from(s),n)}readAvailableBlocks(t){let a=new Array;try{let r=$.buildBlockDataListKey(t),n=new Y(this.db.get(r));do{let s=n.readZigZong();a.push(s)}while(!n.cursorAtEnd());return a}catch{return a}}writeAvailableBlocks(t,a){let r=$.buildBlockDataListKey(t),n=new Y;for(let s of a)n.writeZigZong(s);this.db.put(r,n.getBuffer())}readBlock(t,a){let r=Je.unhash(t),n=$.buildBlockDataKey(r,a.indexOf()),s=this.db.get(n);return JSON.parse(s.toString())}writeBlock(t,a){let r=new Je(...t.position),n=JSON.stringify(t),s=Buffer.from(n),o=$.buildBlockDataKey(r,a.indexOf());this.db.put(o,s)}readProperty(t){return this.db.get(t)}writeProperty(t,a){return this.db.put(t,a)}static initialize(t,a){let r=X(a.path);vt(r)||aa(r);let n=Ac(r,{withFileTypes:!0}).filter(s=>s.isDirectory());if(n.length===0)return void t.registerWorld(this.create(t,a,{identifier:"default"}));for(let s of n){let o=X(r,s.name),i={identifier:s.name};vt(X(o,"properties.json"))&&(i=JSON.parse(Wc(X(o,"properties.json"),"utf-8")));let l=new je(t,new this(o),i);l.provider.world=l,new qt(l).emit(),ra(X(o,"properties.json"),JSON.stringify(l.properties,null,2));for(let m of l.dimensions.values()){let u=m.properties.spawnPosition[0]>>4,p=m.properties.spawnPosition[2]>>4,h=m.viewDistance,d=(h*2+1)**2;l.logger.info(`Preparing \xA7c${d}\xA7r chunks for dimension \xA7a${m.identifier}\xA7r.`);for(let b=-h;b<=h;b++)for(let S=-h;S<=h;S++){let D=l.provider.readChunk(u+b,p+S,m);D.ready&&(D.cache=O.serialize(D),D.dirty=!1)}l.logger.success(`Successfully pregenerated \xA7c${d}\xA7r chunks for for dimension \xA7a${m.identifier}\xA7r.`)}t.registerWorld(l)}}static create(t,a,r){let n=X(a.path);if(vt(n)||aa(n),!r?.identifier)throw new Error("A world identifier is required to create a new world.");let s=X(n,r.identifier);if(vt(s))throw new Error(`World with identifier ${r.identifier} already exists in the directory.`);aa(s);let o=new je(t,new this(s),r);o.provider.world=o,new qt(o).emit(),ra(X(s,"properties.json"),JSON.stringify(o.properties,null,2));for(let i of o.dimensions.values()){let l=i.properties.spawnPosition[0]>>4,m=i.properties.spawnPosition[2]>>4,u=i.viewDistance,p=(u*2+1)**2;o.logger.info(`Preparing \xA7c${p}\xA7r chunks for dimension \xA7a${i.identifier}\xA7r.`);for(let h=-u;h<=u;h++)for(let d=-u;d<=u;d++){let b=o.provider.readChunk(l+h,m+d,i);b.ready&&(b.cache=O.serialize(b),b.dirty=!1)}o.logger.success(`Successfully pregenerated \xA7c${p}\xA7r chunks for for dimension \xA7a${i.identifier}\xA7r.`)}return o}static buildSubChunkKey(t,a,r,n){let s=new Y;return s.writeInt32(t,U.Little),s.writeInt32(r,U.Little),n!==0&&s.writeInt32(n,U.Little),s.writeByte(47),s.writeByte(a),s.getBuffer()}static buildChunkVersionKey(t,a,r){let n=new Y;return n.writeInt32(t,U.Little),n.writeInt32(a,U.Little),r!==0&&n.writeInt32(r,U.Little),n.writeByte(44),n.getBuffer()}static buildActorListKey(t){let a=new Y;return a.writeInt32(1684629360),t.indexOf()!==0&&a.writeInt32(t.indexOf(),U.Little),a.getBuffer()}static buildActorDataKey(t){let a=new Y;return a.writeBuffer(Buffer.from("actorprefix","ascii")),a.writeInt64(t,U.Little),a.getBuffer()}static buildBlockDataListKey(t){let a=new Y;return a.writeInt32(422726034283),t.indexOf()!==0&&a.writeInt32(t.indexOf(),U.Little),a.getBuffer()}static buildBlockDataKey(t,a){let r=new Y;return r.writeZigZag(t.x),r.writeZigZag(t.y),r.writeZigZag(t.z),a!==0&&r.writeInt32(a,U.Little),r.writeByte(45),r.getBuffer()}};var sn={seed:Math.floor(Math.random()*2147483647)},Tt=class{static{c(this,"TerrainGenerator")}static identifier;static _worker=null;identifier=this.constructor.identifier;dimension;world;properties=sn;queue=new Map;worker;constructor(t,a){this.dimension=t,this.world=t.world,this.properties={...sn,...a},this.identifier=this.constructor.identifier,this.worker=this.constructor._worker?.initialize(this.properties)??null,this.worker?.on("message",r=>{r.identifier===this.identifier&&this.process(r)})}apply(t,a){throw new Error(`${this.identifier}.apply() is not implemented!`)}handoff(t){if(!this.worker)throw new Error("Worker is not available.");this.queue.set(t.hash,t);let{x:a,z:r}=t,n=this.dimension.type;this.worker.postMessage({cx:a,cz:r,type:n})}process(t){let a=this.queue.get(t.hash);if(a){for(let r of t.subchunks){if(!r)continue;let n=a.getSubChunk(t.subchunks.indexOf(r));for(let s of r.layers){let o=n.getLayer(r.layers.indexOf(s));for(let[i,l]of s.blocks.entries())o.blocks[i]=l;for(let[i,l]of s.palette.entries())o.palette[i]=l}}a.ready=!0,new at(this.dimension,a).emit(),this.queue.delete(t.hash)}}};import{isMainThread as Lc}from"node:worker_threads";var on=class{static{c(this,"TerrainWorker")}static path=__filename;properties;generator;constructor(t,a){if(Lc)throw new Error("Worker can only be initialized in a worker thread");this.properties=a,this.generator=t}apply(t,a,r){throw new Error(`${this.generator.identifier}.apply() is not implemented!`)}static initialize(t){throw new Error(`${this.name}.initialize() is not implemented!`)}};import{isMainThread as cn,parentPort as ln,workerData as Oc,Worker as Hc}from"node:worker_threads";function mn(e){return function(t){if(e._worker=t,t.initialize=a=>{if(!cn)throw new Error("Worker can only be initialized in a worker thread");return new Hc(t.path,{workerData:a})},!cn){let a=new t(e,Oc);ln?.on("message",r=>{let n=a.apply(r.cx,r.cz,r.type);ln?.postMessage({identifier:e.identifier,...n})})}}}c(mn,"Worker");var na=class extends Tt{static{c(this,"VoidGenerator")}static identifier="void";apply(t,a){let r=new O(t,a,this.dimension.type);return t===0&&a===0&&r.setPermutation({x:0,y:0,z:0},W.resolve(C.Bedrock)),r}};var Et=class extends Tt{static{c(this,"SuperflatGenerator")}static identifier="superflat";apply(t,a){let r=new O(t,a,this.dimension.type);return r.ready=!1,this.handoff(r),r}};function Nc(e,t,a,r){var n=arguments.length,s=n<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,a):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(e,t,a,r);else for(var i=e.length-1;i>=0;i--)(o=e[i])&&(s=(n<3?o(s):n>3?o(t,a,s):o(t,a))||s);return n>3&&s&&Object.defineProperty(t,a,s),s}c(Nc,"_ts_decorate");var pn=class extends on{static{c(this,"SuperflatWorker")}static path=__filename;bedrock=W.resolve(C.Bedrock);dirt=W.resolve(C.Dirt);grass=W.resolve(C.GrassBlock);apply(t,a,r){let n=new O(t,a,r);for(let s=0;s<16;s++)for(let o=0;o<16;o++)for(let i=-64;i<-60;i++){let l={x:s,y:i,z:o};i===-64?n.setPermutation(l,this.bedrock,!1):i===-63||i===-62?n.setPermutation(l,this.dirt,!1):n.setPermutation(l,this.grass,!1)}return n}};pn=Nc([mn(Et)],pn);var Fc=c(e=>{e.commands.register("tp","Teleports an entity to a specified location",t=>{t.permissionLevel=Rc.Operator,t.overload({position:Z},a=>{let r=a.origin;if(r instanceof Me)return{message:"This command can only be executed by entities"};let n=a.position.result;r.teleport(n)}),t.overload({target:T,destination:T},a=>{let r=a.target.result,n=a.destination.result;if(n.length>1)throw new Error("Destination must be a single entity");let s=n[0].position;for(let o of r)o.teleport(s)}),t.overload({target:T,position:Z},a=>{let r=a.target.result,n=a.position.result;for(let s of r)s.teleport(n)})},()=>{})},"register"),un=Fc;import{CommandPermissionLevel as $c}from"@serenityjs/protocol";var qc=c(e=>{e.commands.register("transfer","Transfer a player to a different server",t=>{t.permissionLevel=$c.Operator,t.overload({target:T,address:ce,port:le},a=>{let r=a.target.result;if(r.length===0)throw new Error("No targets matched the selector.");let n=[],s=a.address.result,o=a.port.result;for(let i of r){if(!i.isPlayer()){n.push(`\xA7cEntity \xA74${i.uniqueId}\xA7c is not a player.\xA7r`);continue}i.transfer(s,o),n.push(`\xA7aTransferred \xA72${i.username}\xA7a to \xA72${s}:${o}\xA7a.\xA7r`)}return{message:n.join(`
|
|
5
|
+
`)}})},()=>{})},"register"),hn=qc;import{CommandPermissionLevel as Uc,Vector3f as dn}from"@serenityjs/protocol";var Vc=c(e=>{e.commands.register("summon","Summons an entity at a specified location",t=>{t.permissionLevel=Uc.Operator,t.overload({entity:Ue},a=>{if(!(a.origin instanceof E))throw new Error("You can't use this command in this context, try adding a position argument.");let r=a.entity.result.includes(":")?a.entity.result:`minecraft:${a.entity.result}`,{x:n,y:s,z:o}=a.origin.position.floor();return a.origin.dimension.spawnEntity(r,new dn(n,s,o)),{message:`Successfully summoned entity at ${n}, ${s}, ${o}!`}}),t.overload({entity:Ue,position:Z},a=>{let r=a.entity.result.includes(":")?a.entity.result:`minecraft:${a.entity.result}`,{x:n,y:s,z:o}=a.position.result;(a.origin instanceof E?a.origin.dimension:a.origin).spawnEntity(r,new dn(n,s,o))})},()=>{})},"register"),fn=Vc;import{ActorDamageCause as jc,CommandPermissionLevel as Jc,Gamemode as sa}from"@serenityjs/protocol";var Yc=new Set([sa.Creative,sa.CreativeSpectator,sa.Spectator]),Kc=c(e=>{e.commands.register("kill","Kills entities (players, mobs, etc.).",t=>{t.permissionLevel=Jc.Operator,t.overload({target:T},a=>{a.target.validate(!0);let r=a.target.result;if(r.length===0)throw new Error("No targets matched the selector.");let n=[];for(let s of r){if(s instanceof J&&Yc.has(s.gamemode)){n.push(`\xA7cPlayer \xA74${s.username}\xA7c is in a gamemode that cannot be killed.\xA7r`);continue}s.kill(void 0,jc.None),n.push(`\xA7aKilled \xA72${s.isPlayer()?s.username:s.uniqueId}\xA7a.`)}return{message:n.join(`
|
|
6
|
+
`)}})},()=>{})},"register"),gn=Kc;import{CommandPermissionLevel as Zc}from"@serenityjs/protocol";var Qc=c(e=>{e.commands.register("stop","Stops the server",t=>{t.permissionLevel=Zc.Operator},()=>{e.serenity.stop()})},"register"),_n=Qc;import{CommandPermissionLevel as Xc}from"@serenityjs/protocol";var Bc=c(e=>{e.commands.register("world","Change the current world of an entity",t=>{t.permissionLevel=Xc.Operator,t.overload({target:T,world:ft,dimension:[ce,!0]},a=>{let r=a.origin.getWorld().serenity,n=a.target.result;if(n.length===0)throw new Error("No targets matched the selector.");let s=r.getWorld(a.world.result);if(!s)throw new Error("World does not exist.");let o=a.dimension.result?s.getDimension(a.dimension.result):s.getDimension();if(!o)throw new Error("Dimension does not exist in specified world.");let i=[];for(let l of n)l.teleport(l.position,o),i.push(`\xA7aSuccessfully changed the world of \xA72${l.isPlayer()?l.username:l.uniqueId}\xA7a to \xA72${s.properties.identifier}\xA7a in dimension \xA72${o.properties.identifier}\xA7a.\xA7r`);return{message:i.join(`
|
|
7
|
+
`)}})},()=>{})},"register"),yn=Bc;import{CommandPermissionLevel as Ic}from"@serenityjs/protocol";var el=c(e=>{e.commands.register("op","Set the operator status of a player",t=>{t.permissionLevel=Ic.Operator,t.overload({target:T},a=>{let r=a.target.result;if(r.length===0)throw new Error("No targets matched the selector.");let n=[];for(let s of r){if(!s.isPlayer()){n.push(`\xA7cEntity \xA74${s.uniqueId}\xA7c is not a player.\xA7r`);continue}if(s.isOp()){n.push(`\xA7cPlayer \xA74${s.username}\xA7c is already a server operator or has a higher permission level.\xA7r`);continue}s.op(),n.push(`\xA7aSuccessfully made \xA72${s.username}\xA7a a server operator.\xA7r`)}return{message:n.join(`
|
|
8
|
+
`)}})},()=>{})},"register"),bn=el;import{CommandPermissionLevel as tl}from"@serenityjs/protocol";var al=c(e=>{e.commands.register("deop","Remove the operator status of a player",t=>{t.permissionLevel=tl.Operator,t.overload({target:T},a=>{let r=a.target.result;if(r.length===0)throw new Error("No targets matched the selector.");let n=[];for(let s of r){if(!s.isPlayer()){n.push(`\xA7cEntity \xA74${s.uniqueId}\xA7c is not a player.\xA7r`);continue}if(!s.isOp()){n.push(`\xA7cPlayer \xA74${s.username}\xA7c is not a server operator.\xA7r`);continue}s.deop(),n.push(`\xA7aSuccessfully removed \xA72${s.username}\xA7a as a server operator.\xA7r`)}return{message:n.join(`
|
|
9
|
+
`)}})},()=>{})},"register"),wn=al;import{CommandPermissionLevel as rl}from"@serenityjs/protocol";var nl=c(e=>{e.commands.register("save","Save the current world's data to disk",t=>{t.permissionLevel=rl.Operator},()=>(e.provider.onSave(),{message:"World has been saved, check console for additional details."}))},"register"),Sn=nl;var Ir=[Rr,Fr,$r,qr,Ur,Vr,jr,Jr,un,hn,fn,gn,_n,yn,bn,wn,Sn];import{MINECRAFT_VERSION as sl,PROTOCOL_VERSION as ol}from"@serenityjs/protocol";var il=c(e=>{e.commands.register("about","Get information about the server",()=>({message:`\xA77This server is running \xA7uSerenityJS\xA77 for Minecraft Bedrock Edition. \xA78(v${sl}, proto-v${ol})\xA7r`}))},"register"),kn=il;var en=[kn];import{createInterface as cl}from"node:readline";import{stdin as oa,stdout as ll}from"node:process";var xn=class{static{c(this,"ConsoleInterface")}serenity;interface=cl({input:oa,output:ll,terminal:!0});constructor(t){this.serenity=t,oa.setRawMode(!0),oa.resume(),this.interface.on("line",this.onLine.bind(this)),this.interface.setPrompt("> ")}onLine(t){let a=t.startsWith("/")?t.slice(1):t,{command:r,flags:n}=this.parseFlags(a),s=n.find(([i])=>i==="dim"),o=n.find(([i])=>i==="world");if(o&&!s){let i=this.serenity.worlds.get(o[1]);if(!i){this.serenity.logger.error("The specified world does not exist");return}let l=i.getDimension();try{let m=l.executeCommand(r);if(!m.message)return;i.logger.info(`\xA7a${m.message}\xA7r`)}catch(m){let u=m;i.logger.error(u.message)}}else if(s&&!o){this.serenity.logger.error("You must specify a world flag when specifying a dimension flag");return}else if(s&&o){let i=this.serenity.worlds.get(o[1]);if(!i){this.serenity.logger.error("The specified world does not exist");return}let l=i.getDimension(s[1]);if(!l){this.serenity.logger.error("The specified dimension does not exist");return}try{let m=l.executeCommand(r);if(!m.message)return;i.logger.success(`${m.message}\xA7r`)}catch(m){let u=m;i.logger.error(u.message)}}else{let i=this.serenity.getWorld(),l=i.getDimension();try{let m=l.executeCommand(r);if(!m.message)return;i.logger.info(`\xA7a${m.message}\xA7r`)}catch(m){let u=m;i.logger.error(u.message)}}}parseFlags(t){let a=t.split("--").slice(1).map(n=>{let[s,o]=n.split("=");if(o?.endsWith(" ")){let i=o.indexOf(" ");o=o.slice(0,i)}return[s,o]});return{command:t.split("--")?.[0]?.trim()??t,flags:a}}};var tn=class{static{c(this,"ItemPalette")}types=z.types;creativeContent=oe.items;traits=new Map;registry=new Map;constructor(){for(let t of ia)this.registerTrait(t)}getAllTypes(){return[...this.types.values()]}getType(t){return this.types.get(t)}resolveType(t){return[...this.types.values()].find(a=>a.block===t)??null}registerType(t){return this.types.has(t.identifier)?!1:(this.types.set(t.identifier,t),Ee.options.push(t.identifier),!0)}getRegistry(t){return this.registry.get(t)??[]}getCreativeContent(){return[...this.creativeContent.values()]}getCreativeContentByIndex(t){return this.creativeContent.get(t)??null}registerCreativeContent(t,a=0){let r=this.creativeContent.size;this.creativeContent.set(r,new oe(t,a))}unregisterCreativeContent(t){this.creativeContent.delete(t)}clearCreativeContent(){this.creativeContent.clear()}registerTrait(t){if(this.traits.has(t.identifier))return!1;this.traits.set(t.identifier,t);for(let a of t.types){this.registry.has(a)||this.registry.set(a,[]);let r=this.registry.get(a);r&&(r.push(t),this.registry.set(a,r))}return!0}getAllTraits(){return[...this.traits.values()]}getTrait(t){return this.traits.get(t)??null}};var Dt={};Be(Dt,{ItemBundleTrait:()=>ye,ItemEnchantableTrait:()=>xl,ItemEquippableTrait:()=>bl,ItemTrait:()=>ae});var ae=class extends Se{static{c(this,"ItemTrait")}static types=[];item;constructor(t){super(),this.item=t,t.addTrait(this)}equals(t){return this.identifier===t.identifier}clone(t){let a=new this.constructor(t,this.identifier);for(let[r,n]of Object.entries(this))r!=="item"&&(a[r]=n);return a}};import{IntTag as la}from"@serenityjs/nbt";import{ContainerId as Tn,ContainerName as pl,ContainerType as ul,FullContainerName as hl,InventoryContentPacket as dl,NetworkItemStackDescriptor as fl}from"@serenityjs/protocol";import{CompoundTag as ca}from"@serenityjs/nbt";import{BinaryStream as Cn}from"@serenityjs/binarystream";var Pn=class extends Map{static{c(this,"ItemStackNbtMap")}itemStack;constructor(t){super(),this.itemStack=t}get(t){return super.get(t)}add(t){let a=super.set(t.name,t);return this.update(),a}set(t,a){let r=super.set(t,a);return this.update(),r}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}toCompound(){let t=new ca("");for(let[a,r]of this)t.addTag(r);return t}fromCompound(t){for(let a of t.getTags())this.set(a.name,a)}serialize(){let t=this.toCompound(),a=new Cn;return ca.write(a,t),a.getBuffer()}deserialize(t){let a=new Cn(t),r=ca.read(a);this.fromCompound(r)}update(){if(!this.itemStack.container)return;let t=this.itemStack.container.storage.indexOf(this.itemStack);this.itemStack.amount<=0?this.itemStack.container.clearSlot(t):this.itemStack.container.setItem(t,this.itemStack)}};var ml={amount:1,auxillary:0},k=class vn{static{c(this,"ItemStack")}type;components=new Map;traits=new Map;nbt=new Pn(this);stackable;maxAmount;world;container=null;amount;auxillary;constructor(t,a){this.type=t instanceof z?t:z.get(t);let r={...ml,...a};this.amount=r.amount,this.auxillary=r.auxillary,this.stackable=this.type.stackable,this.maxAmount=this.type.maxAmount,r.world&&(this.world=r.world,r.entry&&this.loadDataEntry(r.world,r.entry),this.initialize())}initialize(){let t=this.world.itemPalette.getRegistry(this.type.identifier);for(let a of t)this.hasTrait(a)||this.addTrait(a)}update(){if(!this.container)return;let t=this.container.storage.indexOf(this);this.amount<=0?this.container.clearSlot(t):this.container.setItem(t,this)}setAmount(t){this.amount=t,this.update()}decrement(t){this.setAmount(this.amount-(t??1))}increment(t){this.setAmount(this.amount+(t??1))}use(t,a){let r=!1;for(let n of this.traits.values()){a.canceled=r;try{let s=n.onUse?.(t,a);if(s===void 0)continue;r=!s}catch(s){t.getWorld().serenity.logger.error(`Failed to trigger onUse trait event for item "${this.type.identifier}" in dimension "${t.dimension.identifier}"`,s),this.traits.delete(n.identifier)}}return!r}hasTrait(t){return this.traits.has(typeof t=="string"?t:t.identifier)}getTrait(t){return this.traits.get(typeof t=="string"?t:t.identifier)}removeTrait(t){this.traits.get(typeof t=="string"?t:t.identifier)?.onRemove?.(),this.traits.delete(typeof t=="string"?t:t.identifier)}addTrait(t){if(this.traits.has(t.identifier))return this.getTrait(t.identifier);this.world&&!this.world.itemPalette.traits.has(t.identifier)&&this.world.logger.warn(`Trait "\xA7c${t.identifier}\xA7r" was added to itemstack "\xA7d${this.type.identifier}\xA7r" but does not exist in the palette. This may result in a deserilization error.`);try{if(t instanceof ae)return this.traits.set(t.identifier,t),t.onAdd?.(),t;{let a=new t(this);return this.traits.set(a.identifier,a),a.onAdd?.(),a}}catch(a){return this.world.logger.error(`Failed to add trait "${t.identifier}" to itemstack "${this.type.identifier}"`,a),null}}equals(t){if(this.type.identifier!==t.type.identifier||this.auxillary!==t.auxillary||this.components.size!==t.components.size||this.traits.size!==t.traits.size||this.nbt.size!==t.nbt.size)return!1;let a=JSON.stringify([...this.components.entries()]),r=JSON.stringify([...t.components.entries()]);if(a!==r)return!1;for(let[n,s]of this.traits){let o=t.traits.get(n);if(!o||!s.equals(o))return!1}for(let[n,s]of this.nbt){let o=t.nbt.get(n);if(!o)return!1;let i=s.valueOf(!0),l=o.valueOf(!0);if(i!==l)return!1}return!0}getDataEntry(){return{identifier:this.type.identifier,amount:this.amount,auxillary:this.auxillary,components:[...this.components.entries()],traits:[...this.traits.keys()],nbt:this.nbt.serialize().toString("base64")}}loadDataEntry(t,a,r=!0){if(a.identifier!==this.type.identifier)throw new Error("Failed to load itemstack entry as the type identifier does not match!");r&&(this.components.clear(),this.traits.clear()),this.amount=a.amount,this.auxillary=a.auxillary;for(let[n,s]of a.components)this.components.has(n)||this.components.set(n,s);for(let n of a.traits){let s=t.itemPalette.traits.get(n);if(!s){t.logger.error(`Failed to load trait "${n}" for itemstack "${this.type.identifier}" as it does not exist in the palette`);continue}this.addTrait(s)}this.nbt.deserialize(Buffer.from(a.nbt,"base64"))}static toNetworkInstance(t){let a=t.type.block?.permutations[t.auxillary];return{network:t.type.network,stackSize:t.amount,metadata:t.auxillary,networkBlockId:a?.network??0,extras:{nbt:t.nbt.toCompound(),canDestroy:[],canPlaceOn:[]}}}static toNetworkStack(t){return{...vn.toNetworkInstance(t),stackNetId:null}}static fromNetworkInstance(t){let a=z.getByNetwork(t.network);return a?new this(a.identifier,{amount:t.stackSize??1,auxillary:t.metadata??0}):null}};var ye=class extends ae{static{c(this,"ItemBundleTrait")}static identifier="dynamic_container";static types=[A.Bundle,A.BlueBundle,A.BlackBundle,A.BrownBundle,A.CyanBundle,A.GrayBundle,A.GreenBundle,A.LightBlueBundle,A.LightGrayBundle,A.LimeBundle,A.MagentaBundle,A.OrangeBundle,A.PinkBundle,A.PurpleBundle,A.RedBundle,A.WhiteBundle,A.YellowBundle];container;constructor(t){if(super(t),t.components.has("dynamic_container")){let a=t.components.get("dynamic_container"),r=new la("bundle_id",a);t.nbt.set("bundle_id",r)}else{let a=Math.abs(Date.now()>>4)+Math.floor(Math.random()*32);t.components.set("dynamic_container",a);let r=new la("bundle_id",a);t.nbt.set("bundle_id",r)}this.container=new Pe(ul.None,Tn.Registry,64)}get dynamicId(){return this.item.components.get("dynamic_container")??0}set dynamicId(t){this.item.components.set("dynamic_container",t);let a=new la("bundle_id",t);this.item.nbt.set("bundle_id",a)}onContainerOpen(t){this.container.occupants.add(t)}onContainerClose(t){this.container.occupants.delete(t)}onTick(){let t=this.item.world.currentTick;if(this.container.occupants.size===0||t%5n!==0n)return;let a=new dl;a.containerId=Tn.Registry,a.storageItem=k.toNetworkStack(this.item),a.fullContainerName=new hl(pl.Dynamic,this.dynamicId),a.items=[];let r=Array.from(this.container.storage);for(let n=0;n<this.container.size;n++){let s=r[n];s?a.items.push(k.toNetworkStack(s)):a.items.push(new fl(0))}for(let n of this.container.occupants)n.send(a)}};import{EquipmentSlot as gl,LevelSoundEvent as _l,LevelSoundEventPacket as yl}from"@serenityjs/protocol";var bl=class extends ae{static{c(this,"ItemEquippableTrait")}static identifier="equippable";slot=gl.Chest;static types=[A.DiamondChestplate];onUse(t,a){if(a.method!=N.Click||this.slot==null)return!1;let r=t.getTrait(Ge);if(!r)return!1;let n=t.getTrait(w),s=new yl;return s.event=_l.EquipGeneric,s.position=t.position,s.actorIdentifier=t.type.identifier,s.data=-1,s.isBabyMob=!1,s.isGlobal=!1,t.send(s),n.container.swapItems(n.selectedSlot,this.slot,r.container),!0}};import{CompoundTag as wl,ListTag as Sl,Tag as kl}from"@serenityjs/nbt";var xl=class extends ae{static{c(this,"ItemEnchantableTrait")}static identifier="enchantable";getEnchantments(){let t=this.item.nbt.get("ench"),a=new Map;if(t)for(let{value:r}of t.value)a.set(r.id.value,r.lvl.value);return a}getEnchantment(t){return this.getEnchantments().get(t)??null}hasEnchantment(t){return this.getEnchantment(t)!==null}addEnchantment(t,a){let r=this.item.nbt.get("ench");if(r){let n=new wl;n.createShortTag("id",t),n.createShortTag("lvl",a),r.push(n)}this.item.nbt.set("ench",r)}getNbt(){return this.item.nbt.get("ench")}onAdd(){if(!this.item.nbt.has("ench")){let t=new Sl("ench",[],kl.Compound);this.item.nbt.add(t)}}onRemove(){this.item.nbt.delete("ench")}};var ia=Array();for(let e in Dt){let t=Dt[e];ia.push(t)}var Wt={};Be(Wt,{EntityAirSupplyTrait:()=>im,EntityAttributeTrait:()=>K,EntityCollision:()=>rm,EntityEffectsTrait:()=>Oe,EntityEquipmentTrait:()=>Ge,EntityGravityTrait:()=>Ae,EntityHealthTrait:()=>M,EntityInventoryTrait:()=>w,EntityInvisibilityTrait:()=>_t,EntityItemStackTrait:()=>Ve,EntityMovementTrait:()=>Q,EntityNameTagTrait:()=>ht,EntityPhysicsTrait:()=>St,EntityTrait:()=>P,PlayerChunkRenderingTrait:()=>_e,PlayerCursorTrait:()=>ne,PlayerEntityRenderingTrait:()=>Yl,PlayerExhaustionTrait:()=>da,PlayerHungerTrait:()=>tm,PlayerListTrait:()=>Kl,PlayerSaturationTrait:()=>ha,PlayerTrait:()=>re});var P=class extends Se{static{c(this,"EntityTrait")}static types=[];entity;constructor(t){super(),this.entity=t,t.addTrait(this)}clone(t){let a=new this.constructor(t,this.identifier);for(let[r,n]of Object.entries(this))r!=="entity"&&(a[r]=n);return a}};import{Attribute as Cl}from"@serenityjs/protocol";var K=class extends P{static{c(this,"EntityAttributeTrait")}attribute;effectiveMin=0;effectiveMax=0;defaultValue=0;get currentValue(){return this.get()?.current??this.defaultValue}set currentValue(t){this.set(t)}get(){return this.entity.attributes.get(this.attribute)}increase(t){this.set(this.currentValue+t)}decrease(t){this.set(this.currentValue-t)}set(t){let a={attribute:this.attribute,current:t,effectiveMin:this.effectiveMin,effectiveMax:this.effectiveMax,defaultValue:this.defaultValue},r=new Cl(this.effectiveMin,this.effectiveMax,t,-1/0,1/0,this.defaultValue,this.attribute,[]);this.entity.components.set(this.identifier,a),this.entity.attributes.set(this.attribute,r)}onSpawn(){if(this.entity.components.has(this.identifier)){let t=this.entity.components.get(this.identifier);this.set(t.current)}else this.set(this.defaultValue)}};import{AttributeName as Pl,MoveActorDeltaPacket as vl,MoveDeltaFlags as En}from"@serenityjs/protocol";var Q=class extends K{static{c(this,"EntityMovementTrait")}static identifier="movement";static types=[_.Player];attribute=Pl.Movement;effectiveMin=0;effectiveMax=3402823466e29;defaultValue=.1;onTick(){if(!this.entity.isMoving)return;let t=new vl;t.runtimeId=this.entity.runtimeId,t.flags=En.All,t.x=this.entity.position.x,t.y=this.entity.position.y,t.z=this.entity.position.z,t.yaw=this.entity.rotation.yaw,t.headYaw=this.entity.rotation.headYaw,t.pitch=this.entity.rotation.pitch,!this.entity.isPlayer()&&!this.entity.isItem()&&(t.y-=.25),this.entity.onGround&&(t.flags|=En.OnGround),this.entity.isPlayer()?this.entity.dimension.broadcastExcept(this.entity,t):this.entity.dimension.broadcast(t)}};import{AbilityIndex as Dn,ActorDamageCause as Mn,ActorEventIds as Tl,ActorEventPacket as El,AttributeName as Dl,Gamemode as Ml,Vector3f as Al}from"@serenityjs/protocol";var M=class extends K{static{c(this,"EntityHealthTrait")}static identifier="health";static types=[_.Player];attribute=Dl.Health;effectiveMin=0;effectiveMax=20;defaultValue=20;applyDamage(t,a,r){if(!new cr(this.entity,t,r,a).emit())return;this.currentValue-=t;let s=new El;s.actorRuntimeId=this.entity.runtimeId,s.eventId=Tl.HURT_ANIMATION,s.eventData=r??Mn.None,this.entity.dimension.broadcast(s),this.currentValue<=0&&this.entity.kill(a,r)}set(t){new lr(this.entity,this.currentValue,t).emit()&&super.set(t)}onInteract(t,a){if(a!==Fe.Attack||!t.abilities.get(Dn.AttackPlayers)&&this.entity.isPlayer()||!t.abilities.get(Dn.AttackMobs)&&!this.entity.isPlayer()||this.entity.isPlayer()&&this.entity.gamemode===Ml.Creative)return;let{headYaw:r,pitch:n}=t.rotation,s=r*Math.PI/180,o=n*Math.PI/180,i=-Math.sin(s)*Math.cos(o)/3.75,l=.2,m=Math.cos(s)*Math.cos(o)/3.75;this.entity.setMotion(new Al(i,l,m)),this.applyDamage(1,t,Mn.EntityAttack)}};var re=class extends P{static{c(this,"PlayerTrait")}player=this.entity};import{ChunkCoords as pe,LevelChunkPacket as An,NetworkChunkPublisherUpdatePacket as Wl}from"@serenityjs/protocol";var _e=class extends re{static{c(this,"PlayerChunkRenderingTrait")}static identifier="chunk_rendering";static types=[_.Player];chunks=new Set;viewDistance=this.player.dimension.viewDistance;send(...t){let a=t.length,r=Math.ceil(a/8);for(let n=0;n<r;n++){let s=n*8,o=Math.min(s+8,a),l=t.slice(s,o).map(m=>{this.chunks.add(m.hash);let u=new An;return u.x=m.x,u.z=m.z,u.dimension=m.type,u.subChunkCount=m.getSubChunkSendCount(),u.cacheEnabled=!1,u.data=O.serialize(m),u});this.player.send(...l)}}sent(t){return this.chunks.has(t)}distance(t){let{x:a,z:r}=pe.unhash(t),n=this.player.position.x>>4,s=this.player.position.z>>4;return Math.hypot(a-n,r-s)}next(t){let a=this.player.position.x>>4,r=this.player.position.z>>4,n=t??this.viewDistance,s=[];for(let o=-n;o<=n;o++)for(let i=-n;i<=n;i++){let l=pe.hash({x:a+o,z:r+i});if(this.chunks.has(l))continue;Math.hypot(o,i)<=n+.5&&s.push(l)}return s}clear(t){let a=t?[t]:[...this.chunks].map(n=>pe.unhash(n)),r=new O(0,0,this.player.dimension.type);for(let n of a){let s=new An;s.x=n.x,s.z=n.z,s.dimension=this.player.dimension.type,s.subChunkCount=r.getSubChunkSendCount(),s.cacheEnabled=!1,s.data=O.serialize(r),this.player.send(s),this.chunks.delete(pe.hash(n))}}onTick(){if(!this.player.isAlive)return;let a=[...this.next(),...this.chunks].filter(r=>!this.chunks.has(r)).map(r=>pe.unhash(r));if(a.length>0){let r=a.map(n=>{if(this.chunks.has(pe.hash(n)))return null;let s=this.player.dimension.getChunk(n.x,n.z);return s.ready?s:null}).filter(n=>n!==null);this.send(...r)}else{for(let n of this.chunks)if(this.distance(n)>this.viewDistance+.5){let{x:o,z:i}=pe.unhash(n);this.clear({x:o,z:i})}let r=new Wl;r.radius=this.viewDistance<<4,r.coordinate=this.player.position.floor(),r.savedChunks=[...this.chunks].map(n=>pe.unhash(n)),this.player.send(r)}}onDespawn(){this.clear()}};import{AbilityLayerType as $l,AbilitySet as ql,AddEntityPacket as Ul,AddItemActorPacket as Vl,AddPlayerPacket as jl,NetworkItemStackDescriptor as Jl,PropertySyncData as Ln,RemoveEntityPacket as ma}from"@serenityjs/protocol";import{ContainerId as zl,ContainerType as Ll,MobEquipmentPacket as Ol,NetworkItemStackDescriptor as Hl}from"@serenityjs/protocol";import{ContainerOpenPacket as Gl}from"@serenityjs/protocol";var ze=class extends Pe{static{c(this,"EntityContainer")}entity;constructor(t,a,r,n){super(a,r,n),this.entity=t}setItem(t,a){super.setItem(t,a),a.world||(a.world=this.entity.getWorld()),a.initialize(),this.entity.isPlayer()&&this.update(this.entity)}clearSlot(t){super.clearSlot(t),this.entity.isPlayer()&&this.update(this.entity)}update(t){super.update(t);for(let a of this.entity.traits.values())try{a.onContainerUpdate?.(this)}catch(r){this.entity.getWorld().logger.error(`Failed to trigger onContainerUpdate trait event for entity "${this.entity.type.identifier}:${this.entity.uniqueId}" in dimension "${this.entity.dimension.identifier}"`,r),this.entity.traits.delete(a.identifier)}}show(t){if(!new st(t,this).emit())return;super.show(t);let r=new Gl;r.identifier=this.identifier,r.type=this.type,r.position=this.entity.position,r.uniqueId=this.entity.uniqueId,t.send(r),this.update()}};var w=class extends P{static{c(this,"EntityInventoryTrait")}static identifier="inventory";static types=[_.Player];container;containerType=Ll.Inventory;containerId=zl.Inventory;inventorySize=36;selectedSlot=0;constructor(t){super(t),this.container=new ze(t,this.containerType,this.containerId,this.inventorySize)}getHeldItem(){return this.container.getItem(this.selectedSlot)}setHeldItem(t){if(!this.entity.isPlayer())return;let a=new Ol,r=this.getHeldItem(),n=r?k.toNetworkStack(r):new Hl(0);a.runtimeEntityId=this.entity.runtimeId,a.containerId=this.containerId,a.selectedSlot=t,a.slot=t,a.item=n,this.selectedSlot=t,this.entity.send(a)}onSpawn(){if(this.entity.components.has("inventory")){let t=this.entity.components.get("inventory");for(let a of t.items){let r=a[0],n=a[1],s=new k(n.identifier,{amount:n.amount,auxillary:n.auxillary,world:this.entity.getWorld(),entry:n});this.container.setItem(r,s)}}this.entity.isPlayer()&&this.container.update(this.entity)}onDespawn(){let t={size:this.inventorySize,items:[]};for(let a=0;a<this.inventorySize;a++){let r=this.container.getItem(a);if(r===null)continue;let n=r.getDataEntry();t.items.push([a,n])}this.entity.components.set("inventory",t)}};import{ActorEventIds as Wn,ActorEventPacket as Gn,LevelSoundEvent as Nl,LevelSoundEventPacket as Rl,TakeItemActorPacket as Fl}from"@serenityjs/protocol";var Ve=class zn extends P{static{c(this,"EntityItemStackTrait")}static identifier="itemstack";birthTick;itemStack;lifeSpan=6e3;pickupTick=null;target=null;merging=!1;constructor(t){if(super(t),t.type.identifier!==_.Item)throw new Error("Entity must be an item");let a=t.components.get("itemstack");a?this.itemStack=new k(a.identifier,{entry:a}):this.itemStack=new k(A.Air),this.birthTick=t.dimension.world.currentTick}getLifeSpan(){return this.lifeSpan}setLifeSpan(t){this.lifeSpan=t}pickup(t){this.entity.teleport(t.position),this.target=t,this.pickupTick=this.entity.dimension.world.currentTick}increment(t){this.itemStack.increment(t);let a=new Gn;a.eventId=Wn.ITEM_ENTITY_MERGE,a.eventData=this.itemStack.amount,a.actorRuntimeId=this.entity.runtimeId,this.entity.dimension.broadcast(a)}decrement(t){this.itemStack.decrement(t);let a=new Gn;a.eventId=Wn.ITEM_ENTITY_MERGE,a.eventData=this.itemStack.amount,a.actorRuntimeId=this.entity.runtimeId,this.entity.dimension.broadcast(a)}onTick(){this.entity.components.set("itemstack",this.itemStack.getDataEntry());let t=this.entity.dimension.world.currentTick;if(this.entity.onGround&&this.entity.dimension.world.currentTick%25n===0n&&this.pickupTick===null){let n=this.entity.dimension.getEntities().filter(s=>s.isItem());for(let[s,o]of n.entries()){if(this.merging&&s!==n.length-1||(this.merging&&s===n.length-1&&(this.merging=!1),o===this.entity))continue;let i=o.position.subtract(this.entity.position);if(Math.abs(i.x)<=.9&&Math.abs(i.y)<=.9&&Math.abs(i.z)<=.9){let l=o.getTrait(zn),m=l.itemStack;if(m.amount>=m.maxAmount||!m.equals(this.itemStack))continue;this.increment(m.amount),l.entity.despawn(),this.merging=!0}}}if(this.target&&this.pickupTick&&t-this.pickupTick>=5n){let n=new Fl;n.itemRuntimeId=this.entity.runtimeId,n.targetRuntimeId=this.target.runtimeId;let s=new Rl;s.event=Nl.Pop,s.position=this.target.position,s.actorIdentifier=this.entity.type.identifier,s.data=-1,s.isBabyMob=!1,s.isGlobal=!1,this.target.send(s),this.target.dimension.broadcast(n),this.target.getTrait(w).container.addItem(this.itemStack),this.entity.despawn()}else if(this.target)return;if(t-this.birthTick<=10n||t%5n!==0n)return;let a=this.entity.dimension.getPlayers(),r=this.entity.position;for(let n of a){if(!n.isAlive)continue;let o=n.position.subtract(r);Math.abs(o.x)<=1&&Math.abs(o.y-1)<=1&&Math.abs(o.z)<=1&&(this.target=n,this.pickupTick=t)}t-this.birthTick>=BigInt(this.lifeSpan)&&this.entity.despawn()}};var Yl=class extends re{static{c(this,"PlayerEntityRenderingTrait")}static identifier="entity_rendering";static types=[_.Player];entities=new Set;onTick(){if(!this.player.isAlive)return;let t=this.player.getTrait(_e);if(!t)return;let a=t.viewDistance<<4,r=this.player.dimension.entities;for(let[n,s]of r){if(this.entities.has(n)||s===this.player||!s.isAlive||this.distance(s.position,this.player.position)>a)continue;if(this.entities.add(n),s.isPlayer()){let i=new jl,m=s.getTrait(w).getHeldItem();i.uuid=s.uuid,i.username=s.username,i.runtimeId=s.runtimeId,i.platformChatId="",i.position=s.position,i.velocity=s.velocity,i.pitch=s.rotation.pitch,i.yaw=s.rotation.yaw,i.headYaw=s.rotation.headYaw,i.heldItem=m===null?new Jl(0):k.toNetworkStack(m),i.gamemode=0,i.data=[...s.metadata.values()],i.properties=new Ln([],[]),i.uniqueEntityId=s.uniqueId,i.premissionLevel=s.permission,i.commandPermission=s.permission===2?1:0,i.abilities=[{type:$l.Base,abilities:[...s.abilities.entries()].map(([u,p])=>new ql(u,p)),walkSpeed:.1,flySpeed:.05}],i.links=[],i.deviceId="",i.deviceOS=0,this.player.send(i);continue}if(s.isItem()){let i=s.getTrait(Ve),l=new Vl;l.uniqueId=s.uniqueId,l.runtimeId=s.runtimeId,l.item=k.toNetworkStack(i.itemStack),l.position=s.position,l.velocity=s.velocity,l.data=[...s.metadata.values()],l.fromFishing=!1,this.player.send(l);continue}let o=new Ul;o.uniqueEntityId=s.uniqueId,o.runtimeId=s.runtimeId,o.identifier=s.type.identifier,o.position=s.position,o.velocity=s.velocity,o.pitch=s.rotation.pitch,o.yaw=s.rotation.yaw,o.headYaw=s.rotation.headYaw,o.bodyYaw=s.rotation.yaw,o.attributes=[],o.data=[...s.metadata.values()],o.properties=new Ln([],[]),o.links=[],this.player.send(o)}for(let n of this.entities)if(this.player.dimension.entities.has(n)){let s=this.player.dimension.entities.get(n);if(!s||this.distance(s.position,this.player.position)<=a)continue;let o=new ma;o.uniqueEntityId=n,this.player.send(o),this.entities.delete(n)}else{let s=new ma;s.uniqueEntityId=n,this.player.send(s),this.entities.delete(n)}}onDespawn(){this.clear()}clear(){for(let t of this.entities){let a=new ma;a.uniqueEntityId=t,this.player.send(a)}this.entities.clear()}distance(t,a){return Math.sqrt(Math.pow(t.x-a.x,2)+Math.pow(t.y-a.y,2)+Math.pow(t.z-a.z,2))}};import{PlayerListAction as pa,PlayerListPacket as ua,PlayerListRecord as On}from"@serenityjs/protocol";var Kl=class extends re{static{c(this,"PlayerListTrait")}static identifier="player_list";static types=[_.Player];players=new Set;clear(){let t=new ua;t.action=pa.Remove,t.records=[...this.players].map(a=>new On(a)),this.players.clear(),this.player.send(t)}onTick(){if(!this.player.isAlive||this.player.dimension.world.currentTick%20n!==0n)return;let a=this.player.dimension.world.getPlayers(),r=a.filter(i=>!this.players.has(i.uuid)&&i.isAlive),n=new ua;n.action=pa.Add,n.records=r.map(i=>({uniqueId:i.uniqueId,uuid:i.uuid,xuid:i.xuid,username:i.username,skin:i.skin,platformBuild:0,platformChatIdentifier:"",isHost:!1,isVisitor:!1,isTeacher:!1}));let s=[...this.players].filter(i=>!a.some(l=>l.uuid===i)),o=new ua;o.action=pa.Remove,o.records=s.map(i=>new On(i)),n.records.length>0&&this.player.send(n),o.records.length>0&&this.player.send(o);for(let i of r)this.players.add(i.uuid),i.metadata.update(),i.abilities.update(),i.abilities.update();for(let i of s)this.players.delete(i)}onDespawn(){this.clear()}};import{ContainerId as Zl,ContainerType as Ql}from"@serenityjs/protocol";var ne=class extends re{static{c(this,"PlayerCursorTrait")}static identifier="cursor";static types=[_.Player];container;containerType=Ql.Inventory;containerId=Zl.Ui;inventorySize=1;selectedSlot=0;constructor(t){super(t),this.container=new ze(t,this.containerType,this.containerId,this.inventorySize)}};import{AttributeName as Xl}from"@serenityjs/protocol";var ha=class extends K{static{c(this,"PlayerSaturationTrait")}static identifier="saturation";static types=[_.Player];attribute=Xl.PlayerSaturation;effectiveMax=20;defaultValue=20;effectiveMin=0};import{ActorDamageCause as Il,AttributeName as em,Gamemode as Hn}from"@serenityjs/protocol";import{AttributeName as Bl}from"@serenityjs/protocol";var da=class extends K{static{c(this,"PlayerExhaustionTrait")}static identifier="exhaustion";static types=[_.Player];attribute=Bl.PlayerExhaustion;effectiveMax=5;defaultValue=0;effectiveMin=0};var tm=class fa extends K{static{c(this,"PlayerHungerTrait")}static identifier="hunger";static types=[_.Player];starveableGamemodes=[Hn.Adventure,Hn.Survival];effectiveMax=20;effectiveMin=0;defaultValue=20;attribute=em.PlayerHunger;exhaustionTrait;saturationTrait;timer=0;constructor(t){super(t),t.isPlayer()||t.removeTrait(fa)}onTick(){if(!this.entity.isAlive||!this.entity.isPlayer()||!this.starveableGamemodes.includes(this.entity.gamemode))return;let t=this.entity.getTrait(M);this.timer++,this.timer>=80&&(this.timer=0),this.timer==0&&(this.currentValue>=18&&t.currentValue<t.effectiveMax?(t.set(t.currentValue+1),this.exhaust(6)):this.currentValue<=0&&t.applyDamage(1,void 0,Il.Starve))}onSpawn(){this.exhaustionTrait=this.entity.getTrait(da),this.saturationTrait=this.entity.getTrait(ha),(!this.exhaustionTrait||!this.saturationTrait)&&this.entity.removeTrait(fa)}exhaust(t){if(!(!this.saturationTrait||!this.exhaustionTrait))for(this.exhaustionTrait.increase(t);this.exhaustionTrait.currentValue>=4;){if(this.exhaustionTrait.decrease(4),this.saturationTrait.currentValue>0){this.saturationTrait.set(Math.max(0,this.saturationTrait.currentValue-1));continue}this.currentValue>0&&this.currentValue--}}isHungry(){return this.currentValue<this.effectiveMax}};import{ActorFlag as Nn}from"@serenityjs/protocol";var Ae=class extends P{static{c(this,"EntityGravityTrait")}static identifier="gravity";static types=[_.Player];onSpawn(){this.entity.flags.has(Nn.HasGravity)||this.entity.flags.set(Nn.HasGravity,!0)}};import{ActorDataId as Le,ActorDataType as Rn,ActorFlag as Mt,DataItem as Fn,Gamemode as am}from"@serenityjs/protocol";var rm=class extends P{static{c(this,"EntityCollision")}static identifier="collision";static types=[_.Player];height=1.7;width=.6;onSpawn(){this.entity.flags.has(Mt.HasCollision)||this.entity.flags.set(Mt.HasCollision,!0),this.entity.metadata.has(Le.Reserved054)||this.setHeight(this.height),this.entity.metadata.has(Le.Reserved053)||this.setWidth(this.width)}onGamemodeChange(){this.entity.isPlayer()&&(this.entity.gamemode===am.Spectator?this.entity.flags.set(Mt.HasCollision,!1):this.entity.flags.set(Mt.HasCollision,!0))}setHeight(t){let a=new Fn(Le.Reserved054,Rn.Float,t);this.entity.metadata.set(Le.Reserved054,a),this.height=t}setWidth(t){let a=new Fn(Le.Reserved053,Rn.Float,t);this.entity.metadata.set(Le.Reserved053,a),this.width=t}};import{ActorDamageCause as $n,ActorDataId as At,ActorDataType as nm,ActorFlag as ga,DataItem as sm,EffectType as om}from"@serenityjs/protocol";var im=class extends P{static{c(this,"EntityAirSupplyTrait")}static identifier="air_supply";static types=[_.Player];onTick(){if(!this.entity.isAlive||!this.entity.flags.get(ga.Breathing))return;let t=this.getAirSupplyTicks();if(!this.canBreathe()){if(this.setAirSupplyTicks(t-1),t>-20||(this.setAirSupplyTicks(0),!this.entity.hasTrait(M)))return;this.entity.getTrait(M).applyDamage(.5,void 0,this.entity.isSwimming?$n.Drowning:$n.Suffocation)}t>=300||this.setAirSupplyTicks(t+5)}canBreathe(){let t=this.entity.dimension.getBlock(this.entity.position.floor());return!t.isLiquid()&&!t.isSolid()||this.entity.hasEffect(om.WaterBreathing)}onSpawn(){this.entity.flags.has(ga.Breathing)||this.entity.flags.set(ga.Breathing,!0),this.entity.metadata.has(At.AirSupply)||this.setAirSupplyTicks(300)}getAirSupplyTicks(){let t=this.entity.metadata.get(At.AirSupply);return t?t.value:0}setAirSupplyTicks(t){let a=new sm(At.AirSupply,nm.Short,t);this.entity.metadata.set(At.AirSupply,a)}};import{ActorDataId as ue,ActorDataType as qn,ActorFlag as cm,DataItem as Un}from"@serenityjs/protocol";var ht=class extends P{static{c(this,"EntityNameTagTrait")}static identifier="nametag";static types=[_.Player];onSpawn(){if(!this.entity.metadata.has(ue.Name)){let t=this.entity.isPlayer()?this.entity.username:"";this.setNameTag(t)}this.entity.metadata.has(ue.NametagAlwaysShow)||(this.entity.isPlayer()?this.setVisibility(!0):this.setVisibility(!1))}setNameTag(t){let a=new Un(ue.Name,qn.String,t);this.entity.metadata.set(ue.Name,a)}getNameTag(){let t=this.entity.metadata.get(ue.Name);return t?t.value:""}getVisibility(){let t=this.entity.metadata.get(ue.NametagAlwaysShow);return t?t.value===1:!1}setVisibility(t){let a=new Un(ue.NametagAlwaysShow,qn.Byte,t?1:0);this.entity.metadata.set(ue.NametagAlwaysShow,a),this.entity.flags.set(cm.AlwaysShowName,t)}};var St=class extends P{static{c(this,"EntityPhysicsTrait")}static identifier="physics";gravity=.05;onTick(){if(this.entity.isAlive===!1)return;let t=this.entity.hasTrait(Ae),a=this.entity.dimension,r=this.entity.velocity,n=this.entity.position,s=.15,o=.15;if(r.isZero()?this.entity.isMoving=!1:this.entity.isMoving=!0,r.y!==0){let i=r.y<0?-1:1,l=Math.floor(n.x-s),m=Math.floor(n.y+r.y+o*i),u=Math.floor(n.z-s);if(a.getBlock({x:l,y:m,z:u}).isSolid()||Math.abs(r.y)<.01)this.entity.velocity.y=0;else{let h=a.getBlock({x:l,y:m-1,z:u});this.entity.velocity.y*=t?1-this.gravity:h.getType().friction,this.entity.position.y+=r.y}}if(r.z!==0){let i=r.z<0?-1:1,l=Math.floor(n.x+s),m=Math.floor(n.y+o),u=Math.floor(n.z+r.z+s*i);if(a.getBlock({x:l,y:m,z:u}).isSolid())this.entity.velocity.z=0,this.entity.velocity.z+=.16*-i;else if(Math.abs(r.z)<.01)this.entity.velocity.z=0;else{let d=a.getBlock({x:Math.floor(n.x),y:Math.floor(n.y+o),z:Math.floor(n.z)}).getType().friction;this.entity.velocity.z*=d,this.entity.position.z+=r.z}}if(r.x!==0){let i=r.x<0?-1:1,l=Math.floor(n.x+r.x+s*i),m=Math.floor(n.y+o),u=Math.floor(n.z+s);if(a.getBlock({x:l,y:m,z:u}).isSolid())this.entity.velocity.x=0,this.entity.velocity.x+=.16*-i;else if(Math.abs(r.x)<.01)this.entity.velocity.x=0;else{let d=a.getBlock({x:Math.floor(n.x),y:Math.floor(n.y+o),z:Math.floor(n.z)}).getType().friction;this.entity.velocity.x*=d,this.entity.position.x+=r.x}}if(t){let i=a.getBlock({x:Math.floor(n.x),y:Math.round(n.y+o-1),z:Math.floor(n.z)});i.isSolid()?(this.entity.velocity.y=0,this.entity.velocity.z!==0&&(this.entity.velocity.z*=i.getType().friction),this.entity.velocity.x!==0&&(this.entity.velocity.x*=i.getType().friction),this.entity.onGround=!0):(this.entity.velocity.y-=this.gravity,this.entity.onGround=!1)}}};import{LevelEvent as lm,LevelEventPacket as mm,MobEffectEvents as Vn,MobEffectPacket as jn,Vector3f as pm}from"@serenityjs/protocol";var Oe=class extends P{static{c(this,"EntityEffectsTrait")}static type=[_.Player];static identifier="effects";effects=new Map;onTick(){for(let[a,r]of this.effects){if(r.onTick?.(this.entity),!r.isExpired()){r.duration-=2;continue}this.remove(a)}let t=this.effects.size>1?8n:2n;if(this.entity.getWorld().currentTick%t==0n){let a=this.getParticleEffect();if(!a)return;let r=new mm;r.event=lm.ParticleLegacyEvent|34,r.data=a.color.toInt(),r.position=this.entity.position.subtract(new pm(0,1,0)),this.entity.dimension.broadcast(r)}}remove(t){if(!this.effects.has(t)||(new rr(this.entity,t).emit(),this.effects.get(t)?.onRemove?.(this.entity),this.effects.delete(t),!this.entity.isPlayer()))return;let r=new jn;r.runtimeId=this.entity.runtimeId,r.eventId=Vn.EffectRemove,r.effectId=t,r.particles=!1,r.amplifier=0,r.duration=0,r.inputTick=this.entity.getWorld().currentTick,this.entity.send(r)}has(t){return this.effects.has(t)}add(t,a,r){let n=r?.showParticles??!0,s=r?.amplifier??0,o=this.entity.getWorld().effectPalette.getEffect(t),i=this.effects.get(t);if(!i&&o?i=new o(a,s,n):i&&(i.duration=i.duration+a,i.amplifier=Math.max(i.amplifier,s??0),i.showParticles=n??!0),!i||!new ar(this.entity,i).emit()||(i.onAdd?.(this.entity),this.effects.set(t,i),!this.entity.isPlayer()))return;let m=new jn;m.runtimeId=this.entity.runtimeId,m.eventId=Vn.EffectAdd,m.effectId=t,m.particles=i.showParticles,m.amplifier=i.amplifier,m.duration=i.duration,m.inputTick=this.entity.getWorld().currentTick,this.entity.send(m)}getParticleEffect(){let t=[...this.effects.values()].filter(a=>a.showParticles);return t[Math.floor(Math.random()*t.length)]}onSpawn(){let t=this.entity.components.get("entity_effects")??[];for(let a of t){let{effectType:r,duration:n,amplifier:s,showParticles:o}=a,i=this.entity.getWorld().effectPalette.getEffect(r);if(!i)return;this.effects.set(r,new i(n,s,o))}}onDespawn(){this.entity.components.set("entity_effects",[...this.effects.values()].map(t=>t.toString()))}};import{ActorFlag as _a}from"@serenityjs/protocol";var _t=class extends P{static{c(this,"EntityInvisibilityTrait")}static identifier="visibility";static types=[_.Player];onSpawn(){this.entity.flags.has(_a.Invisible)||this.entity.flags.set(_a.Invisible,!1)}setInvisibility(t){this.entity.flags.set(_a.Invisible,t)}};import{ContainerId as um,ContainerType as hm}from"@serenityjs/protocol";var Ge=class extends P{static{c(this,"EntityEquipmentTrait")}static identifier="equipment";static types=[_.Player];container;constructor(t){super(t),this.container=new ze(t,hm.Armor,um.Armor,4)}setEquipment(t,a){this.container.setItem(t,a)}getEquipment(t){return this.container.getItem(t)}onSpawn(){if(!this.entity.components.has("equipment"))return;let t=this.entity.components.get("equipment");for(let a in t){let r=t[a],n=new k(r.identifier,{amount:r.amount,auxillary:r.auxillary,world:this.entity.getWorld(),entry:r});this.setEquipment(Number.parseInt(a),n)}}onDespawn(){let t={};for(let a of this.container.storage)a&&(t[this.container.storage.indexOf(a)]=a.getDataEntry());this.entity.components.set("equipment",t),console.dir(this.entity.components.get("equipment"),{depth:1/0,colors:!0})}};import{PropertySyncData as dm,SetActorDataPacket as fm}from"@serenityjs/protocol";var Jn=class extends Map{static{c(this,"MetadataMap")}entity;constructor(t){super(),this.entity=t}set(t,a){let r=new Ua(this.entity,t,a);if(!r.emit())return this;let n=super.set(t,r.dataItem);return this.update(),n}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}update(){let t=new fm;t.runtimeEntityId=this.entity.runtimeId,t.inputTick=this.entity.isPlayer()?this.entity.inputTick:this.entity.dimension.world.currentTick,t.data=[...this.entity.metadata.values()],t.properties=new dm([],[]);for(let[a,r]of this.entity.flags)t.setFlag(a,r);this.entity.dimension.broadcast(t)}};import{PropertySyncData as gm,SetActorDataPacket as _m}from"@serenityjs/protocol";var Yn=class extends Map{static{c(this,"ActorFlagMap")}entity;constructor(t){super(),this.entity=t}set(t,a){let r=new qa(this.entity,t,a);if(!r.emit())return this;let n=super.set(t,r.value);return this.update(),n}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}update(){let t=new _m;t.runtimeEntityId=this.entity.runtimeId,t.inputTick=this.entity.isPlayer()?this.entity.inputTick:this.entity.dimension.world.currentTick,t.data=[...this.entity.metadata.values()],t.properties=new gm([],[]);for(let[a,r]of this.entity.flags)t.setFlag(a,r);this.entity.dimension.broadcast(t)}};import{UpdateAttributesPacket as ym}from"@serenityjs/protocol";var Kn=class extends Map{static{c(this,"AttributeMap")}entity;constructor(t){super(),this.entity=t}set(t,a){let r=new Va(this.entity,t,a);if(!r.emit())return this;let n=super.set(t,r.value);return this.update(),n}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}update(){let t=new ym;t.runtimeActorId=this.entity.runtimeId,t.inputTick=this.entity.isPlayer()?this.entity.inputTick:this.entity.dimension.world.currentTick,t.attributes=[...this.entity.attributes.values()],this.entity.dimension.broadcast(t)}};import{AbilityLayerType as bm,AbilitySet as wm,SetPlayerGameTypePacket as Sm,UpdateAbilitiesPacket as km}from"@serenityjs/protocol";var Zn=class extends Map{static{c(this,"AbilityMap")}player;constructor(t){super(),this.player=t}set(t,a){let r=new Xa(this.player,t,a);if(!r.emit())return this;let n=super.set(t,r.value);return this.update(),n}delete(t){let a=super.delete(t);return this.update(),a}clear(){super.clear(),this.update()}superSet(t,a){return super.set(t,a)}update(){let t=new km;if(t.permissionLevel=this.player.permission,t.commandPermissionLevel=this.player.permission===2?1:0,t.entityUniqueId=this.player.uniqueId,t.abilities=[{type:bm.Base,abilities:[...this.player.abilities.entries()].map(([r,n])=>new wm(r,n)),walkSpeed:.1,flySpeed:.05}],this.player.dimension.broadcast(t),!this.player.isAlive)return;let a=new Sm;a.gamemode=this.player.gamemode,this.player.send(a)}};var E=class ba{static{c(this,"Entity")}static runtimeId=0n;serenity;type;runtimeId=++ba.runtimeId;uniqueId;position=new Ye(0,0,0);velocity=new Ye(0,0,0);rotation=new Cm(0,0,0);traits=new Map;components=new Map;metadata=new Jn(this);flags=new Yn(this);attributes=new Kn(this);tags=new Set;scoreboardIdentity;dimension;isAlive=!1;isMoving=!1;onGround=!1;constructor(t,a,r){this.serenity=t.world.serenity,this.dimension=t,a instanceof R?this.type=a:this.type=t.world.entityPalette.getType(a),this.uniqueId=r?.uniqueId?r.uniqueId:ba.createUniqueId(this.type.network,this.runtimeId),this.position.set(t.spawnPosition),this.scoreboardIdentity=new me(this),this.isPlayer()||(r?.entry&&this.loadDataEntry(this.dimension.world,r.entry),this.initialize())}initialize(){let t=this.dimension.world.entityPalette.getRegistryFor(this.type.identifier);for(let a of this.type.components){let r=a;a.includes(":")&&(r=a.split(":")[1]);let n=this.dimension.world.entityPalette.getTrait(r);n&&t.push(n)}for(let a of t)this.hasTrait(a)||this.addTrait(a)}isPlayer(){return this.type.identifier===_.Player}isItem(){return this.type.identifier===_.Item}get isSneaking(){return this.flags.get(ya.Sneaking)??!1}get isSprinting(){return this.flags.get(ya.Sprinting)??!1}get isSwimming(){return this.flags.get(ya.Swimming)??!1}addEffect(t,a,r){(this.getTrait(Oe)??this.addTrait(Oe)).add(t,a*40,r)}removeEffect(t){let a=this.getTrait(Oe);!a||!a.has(t)||a.remove(t)}hasEffect(t){return this.getTrait(Oe)?.has(t)??!1}hasTrait(t){return this.traits.has(typeof t=="string"?t:t.identifier)}getViewDirection(){let t=this.rotation.pitch*(Math.PI/180),a=-this.rotation.headYaw*(Math.PI/180);return new Ye(Math.sin(a)*Math.cos(t),-Math.sin(t),Math.cos(a)*Math.cos(t))}getTrait(t){return this.traits.get(typeof t=="string"?t:t.identifier)}removeTrait(t){this.traits.get(typeof t=="string"?t:t.identifier)?.onRemove?.(),this.traits.delete(typeof t=="string"?t:t.identifier)}addTrait(t){if(this.traits.has(t.identifier))return this.getTrait(t.identifier);this.getWorld().entityPalette.traits.has(t.identifier)||this.getWorld().logger.warn(`Trait "\xA7c${t.identifier}\xA7r" was added to entity "\xA7d${this.type.identifier}\xA7r:\xA7d${this.uniqueId}\xA7r" in dimension "\xA7a${this.dimension.identifier}\xA7r" but does not exist in the palette. This may result in a deserilization error.`);try{if(t instanceof P)return this.traits.set(t.identifier,t),t.onAdd?.(),t;{let a=new t(this);return this.traits.set(t.identifier,a),a.onAdd?.(),a}}catch(a){return this.serenity.logger.error(`Failed to add trait "${t.identifier}" to entity "${this.type.identifier}:${this.uniqueId}" in dimension "${this.dimension.identifier}"`,a),null}}getWorld(){return this.dimension.world}getChunk(){let t=this.position.x>>4,a=this.position.z>>4;return this.dimension.getChunk(t,a)}getHeldItem(){return this.hasTrait(w)?this.getTrait(w).getHeldItem():null}getCardinalDirection(){let t=(Math.floor(this.rotation.yaw)+360)%360;return t>=315||t<45?v.South:t>=45&&t<135?v.West:t>=135&&t<225?v.North:t>=225&&t<315?v.East:v.South}spawn(){if(!new Fa(this,this.dimension).emit())return this;this.dimension.entities.set(this.uniqueId,this),this.isAlive=!0;for(let a of this.traits.values())try{a.onSpawn?.()}catch(r){this.serenity.logger.error(`Failed to trigger onSpawn trait event for entity "${this.type.identifier}:${this.uniqueId}" in dimension "${this.dimension.identifier}"`,r),this.traits.delete(a.identifier)}return this.metadata.update(),this.attributes.update(),this}despawn(){if(!new $a(this,this.dimension).emit())return this;this.isAlive=!1,this.dimension.entities.delete(this.uniqueId);for(let a of this.traits.values())try{a.onDespawn?.()}catch(r){this.serenity.logger.error(`Failed to trigger onDespawn trait event for entity "${this.type.identifier}:${this.uniqueId}" in dimension "${this.dimension.identifier}"`,r),this.traits.delete(a.identifier)}return this}kill(t,a){if(new mr(this,t,a).emit(),this.isAlive=!1,this.hasTrait(w)){let{container:r,inventorySize:n}=this.getTrait(w);for(let s=0;s<n;s++){let o=r.getItem(s);o&&(this.dimension.spawnItem(o,this.position),r.clearSlot(s))}}if(this.hasTrait(M)){let r=this.getTrait(M);r.currentValue=r.effectiveMin}this.dimension.schedule(50).on(()=>{if(!this.isPlayer())this.despawn();else for(let r of this.traits.values())r.onDespawn?.()})}interact(t,a){if(a===Fe.Interact){if(!new or(t,this,t.getHeldItem(),null).emit())return}else if(!new ir(t,this).emit())return;for(let r of this.traits.values())try{r.onInteract?.(t,a)}catch(n){this.serenity.logger.error(`Failed to trigger onInteract trait event for entity "${this.type.identifier}:${this.uniqueId}" in dimension "${this.dimension.identifier}"`,n),this.traits.delete(r.identifier)}}getContainer(t,a){if(a){if(!this.hasTrait(w))return null;let{container:r}=this.getTrait(w);for(let n of r.storage)if(n&&n.hasTrait(ye)){let s=n.getTrait(ye);if(s.dynamicId===a)return s.container}}switch(t){default:return null;case Gt.Armor:{if(!this.hasTrait(Ge))throw new Error("The player does not have an equipment trait.");return this.getTrait(Ge).container}case Gt.Hotbar:case Gt.Inventory:case Gt.HotbarAndInventory:{if(!this.hasTrait(w))throw new Error("The entity does not have an inventory trait.");return this.getTrait(w).container}}}setMotion(t){this.velocity.x=t?.x??this.velocity.x,this.velocity.y=t?.y??this.velocity.y,this.velocity.z=t?.z??this.velocity.z,this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.position.z+=this.velocity.z,this.onGround=!1;let a=new Pm;a.runtimeId=this.runtimeId,a.motion=this.velocity,a.inputTick=this.isPlayer()?this.inputTick:this.dimension.world.currentTick,this.dimension.broadcast(a)}addMotion(t){this.velocity.x+=t.x,this.velocity.y+=t.y,this.velocity.z+=t.z,this.setMotion()}clearMotion(){this.velocity.x=0,this.velocity.y=0,this.velocity.z=0,this.setMotion()}applyImpulse(t){this.velocity.x+=t.x,this.velocity.y+=t.y,this.velocity.z+=t.z,this.setMotion()}teleport(t,a){if(this.position.x=t.x,this.position.y=t.y,this.position.z=t.z,a){if(!new nt(this,this.dimension,a).emit())return;this.despawn(),this.dimension=a,this.spawn()}else{let r=new xm;r.runtimeId=this.runtimeId,r.flags=Qn.All,r.x=this.position.x,r.y=this.position.y,r.z=this.position.z,r.yaw=this.rotation.yaw,r.headYaw=this.rotation.headYaw,r.pitch=this.rotation.pitch,this.onGround&&(r.flags|=Qn.OnGround),this.dimension.broadcast(r)}}getSelectedSlot(){if(!this.hasTrait(w))throw new Error("The entity does not have an inventory trait.");return this.getTrait(w).selectedSlot}dropItem(t,a,r){if(!this.hasTrait(w))return!1;let n=r.takeItem(t,a);if(!n)return!1;let{x:s,y:o,z:i}=this.position,{headYaw:l,pitch:m}=this.rotation,u=l*Math.PI/180,p=m*Math.PI/180,h=new Ye(-Math.sin(u)*Math.cos(p)/3/.5,-Math.sin(p)/2*.75,Math.cos(u)*Math.cos(p)/3/.5);return this.dimension.spawnItem(n,new Ye(s,o-.25,i)).addMotion(h),!0}hasTag(t){return this.tags.has(t)}getTags(){return[...this.tags]}addTag(t){return this.tags.has(t)?!1:(this.tags.add(t),!0)}removeTag(t){return this.tags.has(t)?(this.tags.delete(t),!0):!1}executeCommand(t){return t.startsWith("/")&&(t=t.slice(1)),new De(this.getWorld().commands.getAll(),t,this).execute()}getDataEntry(){return{uniqueId:this.uniqueId,identifier:this.type.identifier,position:this.position,rotation:this.rotation,components:[...this.components.entries()],traits:[...this.traits.keys()],metadata:[...this.metadata.entries()],flags:[...this.flags.entries()],attributes:[...this.attributes.entries()],scoreboardIdentity:this.scoreboardIdentity.identifier}}loadDataEntry(t,a,r=!0){if(a.uniqueId!==this.uniqueId)throw new Error("Failed to load entity entry as the unique id does not match the entity's unique id!");if(a.identifier!==this.type.identifier)throw new Error("Failed to load entity entry as the identifier does not match the entity's identifier!");this.position.set(a.position),this.rotation.set(a.rotation),this.scoreboardIdentity=new me(this,a.scoreboardIdentity),r&&(this.components.clear(),this.traits.clear());for(let[n,s]of a.components)this.components.has(n)||this.components.set(n,s);for(let n of a.traits){let s=t.entityPalette.traits.get(n);if(!s){t.logger.error(`Failed to load trait "${n}" for entity "${this.type.identifier}:${this.uniqueId}" as it does not exist in the palette`);continue}this.addTrait(s)}for(let[n,s]of a.metadata)this.metadata.has(n)||this.metadata.set(n,s);for(let[n,s]of a.flags)this.flags.has(n)||this.flags.set(n,s);for(let[n,s]of a.attributes)this.attributes.has(n)||this.attributes.set(n,s)}static createUniqueId(t,a){let r=BigInt(Math.abs(Date.now()>>4)&511);return BigInt(t<<19)|r<<10n|a}};import{AbilityIndex as He,ChangeDimensionPacket as Am,ContainerName as Bn,CreativeContentPacket as Wm,DefaultAbilityValues as Gm,DisconnectMessage as zm,DisconnectPacket as Lm,DisconnectReason as Om,Gamemode as Ke,MoveMode as Hm,MovePlayerPacket as Nm,PermissionLevel as Ze,SerializedSkin as Rm,SetPlayerGameTypePacket as Fm,TeleportCause as $m,TextPacket as qm,TextPacketType as Um,TransferPacket as Vm}from"@serenityjs/protocol";import{DeviceOS as vm,InputMode as Tm,InteractionMode as Em,MemoryTier as Dm,PlayMode as Mm}from"@serenityjs/protocol";var zt=class Xn{static{c(this,"Device")}identifier;model;os;maxViewDistance;memoryTier;inputMode=Tm.Unknown;interactionMode=Em.Classic;playMode=Mm.Normal;constructor(t,a,r,n,s){this.identifier=t,this.model=a,this.os=r,this.maxViewDistance=n,this.memoryTier=s}static empty(){return new Xn("","",vm.Undefined,0,Dm.Undetermined)}};var jm={username:"SerenityJS",xuid:"0000000000000000",uuid:"00000000-0000-0000-0000-000000000000",uniqueId:0n,device:zt.empty(),skin:Rm.empty()},J=class extends E{static{c(this,"Player")}connection;username;xuid;uuid;traits=new Map;abilities=new Zn(this);device;skin;inputTick=0n;permission;openedContainer=null;blockTarget=null;itemTarget=null;entityTarget=null;get gamemode(){return this.components.has("gamemode")||this.components.set("gamemode",Ke.Survival),this.components.get("gamemode")}set gamemode(t){if(!new nr(this,this.gamemode,t).emit())return;this.components.set("gamemode",t);for(let n of this.traits.values())n.onGamemodeChange?.(t);switch(t){case Ke.Survival:case Ke.Adventure:{this.abilities.set(He.MayFly,!1);break}case Ke.Creative:case Ke.Spectator:{this.abilities.set(He.MayFly,!0);break}}let r=new Fm;r.gamemode=t,this.send(r)}constructor(t,a,r){super(t,_.Player,r),this.connection=a;let n={...jm,...r};this.username=n.username,this.xuid=n.xuid,this.uuid=n.uuid,this.device=n.device,this.skin=n.skin,this.permission=this.serenity.permissions.get(this.uuid),r?.entry&&this.loadDataEntry(t.world,r.entry),this.initialize()}initialize(){let t=this.dimension.world.entityPalette.getRegistryFor(this.type.identifier);for(let a of t)this.hasTrait(a)||this.addTrait(a);for(let[a,r]of Object.entries(Gm))this.abilities.has(+a)||this.abilities.set(+a,r)}send(...t){this.serenity.network.sendNormal(this.connection,...t)}sendImmediate(...t){this.serenity.network.sendImmediate(this.connection,...t)}isOp(){return this.permission===Ze.Operator}op(){this.permission=Ze.Operator,this.serenity.permissions.set(this.uuid,Ze.Operator),this.abilities.set(He.OperatorCommands,!0),this.abilities.set(He.Teleport,!0)}deop(){this.permission=Ze.Member,this.serenity.permissions.set(this.uuid,Ze.Member),this.abilities.set(He.OperatorCommands,!1),this.abilities.set(He.Teleport,!1)}disconnect(t,a,r){let n=new Lm;n.message=new zm(t,t),n.reason=a??Om.Kicked,n.hideDisconnectScreen=r??!1,this.sendImmediate(n),this.despawn()}sendMessage(t){let a=new qm;a.type=Um.Raw,a.needsTranslation=!1,a.source=null,a.message=t,a.parameters=null,a.xuid="",a.platformChatId="",a.filtered="",this.send(a)}getContainer(t,a){let r=super.getContainer(t,a);if(r===null&&t===Bn.Dynamic){if(!this.hasTrait(ne))throw new Error("The player does not have a cursor trait.");let{container:n}=this.getTrait(ne);for(let s of n.storage)if(s&&s.hasTrait(ye)){let o=s.getTrait(ye);if(o.dynamicId===a)return o.container}}if(r!==null)return r;switch(t){default:return this.openedContainer;case Bn.Cursor:{if(!this.hasTrait(ne))throw new Error("The player does not have a cursor trait.");return this.getTrait(ne).container}}}spawn(){super.spawn(),this.abilities.update();let t=new Wm;t.items=this.getWorld().itemPalette.getCreativeContent().map(r=>({network:r.type.network,metadata:r.metadata,stackSize:1,networkBlockId:r.type.block?.permutations[r.metadata]?.network??0,extras:{canDestroy:[],canPlaceOn:[],nbt:r.nbt}}));let a=this.getWorld().commands.serialize();return a.commands=a.commands.filter(r=>r.permissionLevel<=this.permission),this.send(t,a),this}transfer(t,a,r=!1){let n=new Vm;n.address=t,n.port=a,n.reloadWorld=r,this.send(n)}teleport(t,a){if(this.position.x=t.x,this.position.y=t.y,this.position.z=t.z,a){if(!new nt(this,this.dimension,a).emit())return;if(this.despawn(),a.world!==this.dimension.world){this.getWorld().provider.writePlayer(this.getDataEntry(),this.dimension);let n=a.world.provider.readPlayer(this.uuid,a);n?this.loadDataEntry(a.world,n,!0):(this.components.clear(),this.traits.clear(),this.abilities.clear(),this.metadata.clear(),this.flags.clear()),this.initialize()}if(this.dimension.type!==a.type){let n=new Am;n.dimension=a.type,n.position=t,n.respawn=!0,n.hasLoadingScreen=!1,this.sendImmediate(n)}return this.dimension=a,this.spawn(),this.teleport(t)}else{let r=new Nm;r.runtimeId=this.runtimeId,r.position=t,r.pitch=this.rotation.pitch,r.yaw=this.rotation.yaw,r.headYaw=this.rotation.headYaw,r.mode=Hm.Teleport,r.onGround=this.onGround,r.riddenRuntimeId=0n,r.cause=new $m(4,0),r.inputTick=this.inputTick,this.send(r)}}getDataEntry(){return{username:this.username,xuid:this.xuid,uuid:this.uuid,uniqueId:this.uniqueId,identifier:this.type.identifier,position:this.position,rotation:this.rotation,components:[...this.components.entries()],traits:[...this.traits.keys()],metadata:[...this.metadata.entries()],flags:[...this.flags.entries()],attributes:[...this.attributes.entries()],abilities:[...this.abilities.entries()],scoreboardIdentity:this.scoreboardIdentity.identifier}}loadDataEntry(t,a,r=!0){if(a.username!==this.username)throw new Error("Failed to load player entry as the username does not match the player's username!");if(a.uuid!==this.uuid)throw new Error("Failed to load player entry as the uuid does not match the player's uuid!");if(a.xuid!==this.xuid)throw new Error("Failed to load player entry as the xuid does not match the player's xuid!");if(a.uniqueId!==this.uniqueId)throw new Error("Failed to load player entry as the unique id does not match the player's unique id!");if(a.identifier!==this.type.identifier)throw new Error("Failed to load player entry as the identifier does not match the player's identifier!");this.position.set(a.position),this.rotation.set(a.rotation),r&&(this.components.clear(),this.traits.clear(),this.abilities.clear());for(let[n,s]of a.components)this.components.has(n)||this.components.set(n,s);for(let n of a.traits){let s=t.entityPalette.traits.get(n);if(!s){t.logger.error(`Failed to load trait "${n}" for player "${this.username}:${this.uniqueId}" as it does not exist in the palette`);continue}this.addTrait(s)}for(let[n,s]of a.metadata)this.metadata.has(n)||this.metadata.set(n,s);for(let[n,s]of a.flags)this.flags.has(n)||this.flags.set(n,s);for(let[n,s]of a.attributes)this.attributes.has(n)||this.attributes.set(n,s);for(let[n,s]of a.abilities)this.abilities.has(n)||this.abilities.set(n,s)}};var an=class{static{c(this,"EntityPalette")}types=R.types;traits=new Map;registry=new Map;constructor(){for(let t of wa)this.registerTrait(t)}getAllTypes(){return[...this.types.values()]}getAllCustomTypes(){return this.getAllTypes().filter(t=>t instanceof ur)}getType(t){return this.types.get(t)}getTypeByUnique(t){let a=Number(t>>19n);for(let r of this.types.values())if(r.network===a)return r;return null}registerType(t){return this.types.has(t.identifier)?!1:(this.types.set(t.identifier,t),Ue.options.push(t.identifier),!0)}getRegistryFor(t){return this.registry.get(t)||[]}registerTrait(t){if(this.traits.has(t.identifier))return!1;this.traits.set(t.identifier,t);for(let a of t.types??[]){this.registry.has(a)||this.registry.set(a,[]);let r=this.registry.get(a);r&&(r.push(t),this.registry.set(a,r))}return!0}removeTrait(t){if(!this.traits.has(t))return!1;let a=this.traits.get(t);if(!a)return!1;for(let r of a.types??[]){let n=this.registry.get(r);n&&this.registry.set(r,n.filter(s=>s!==a))}return this.traits.delete(t),!0}getAllTraits(){return[...this.traits.values()]}getTrait(t){return this.traits.get(t)||null}};var wa=Array();for(let e in Wt){let t=Wt[e];wa.push(t)}var In=class extends y{static{c(this,"InventoryTransactionHandler")}static packet=Qm.InventoryTransaction;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();if(t.transaction)switch(t.transaction.type){case Lt.NormalTransaction:return this.handleNormalTransaction(r,t.transaction.actions);case Lt.ItemUseTransaction:{let n=t.transaction.itemUse;if(!n)throw new Error("ItemUse object missing from ItemUseTransaction");return this.handleItemUseTransaction(r,n)}case Lt.ItemUseOnEntityTransaction:{let n=t.transaction.itemUseOnEntity;if(!n)throw new Error("ItemUseOnEntity object missing from ItemUseOnEntityTransaction");return this.handleItemUseOnEntityTransaction(r,n)}case Lt.ItemReleaseTransaction:return console.log("TODO: Implement item release transaction")}}handleNormalTransaction(t,a){for(let r of a)switch(r.source.type){default:{this.serenity.logger.debug(`InventoryTransactionHandler: Unimplemented inventory source type: ${Sa[r.source.type]}`);break}case Sa.ContainerInventory:break;case Sa.WorldInteraction:{let n=r.newItem.stackSize??1,s=t.getTrait(w),o=s.container.getItem(r.slot);if(!new Qa(t,o,n).emit()){o.update();break}t.dropItem(s.selectedSlot,n,s.container);break}}}handleItemUseTransaction(t,a){let r=t.dimension;switch(a.type){case ka.Place:{let n=r.getBlock(a.blockPosition);if(!a.initialTransaction)return void n.interact(t);if(n.isAir()||!n.interact(t)||t.openedContainer||!t.itemTarget)return;let s=t.itemTarget;if(s.type.network!==a.item.network)return;let o=s.type.block;if(!o||o.identifier===C.Air)return;let i=n.face(a.face),l=i.getPermutation();if(!i.isAir())return;let m=o.permutations[s.auxillary]??o.getPermutation(),u=new Ka(i,t,m,a.face,a.clickPosition).emit();if(s.components.has("block_data")){let D=s.components.get("block_data");i.loadDataEntry(i.getWorld(),D),i.setPermutation(m,D)}else i.setPermutation(m);let p=!1;for(let D of i.traits.values()){let j=a.clickPosition,I=D.onPlace?.(t,j);I!==void 0&&(p=!I)}let h=N.Place,d=i,b=s.use(t,{method:h,targetBlock:d})&&new fe(t,s,h).emit(),S=new Zm;if(S.event=Km.Place,S.position=Jm.toVector3f(i.position),S.data=i.permutation.network,S.actorIdentifier="",S.isBabyMob=!1,S.isGlobal=!1,p||!u)return i.setPermutation(l);if(i.dimension.broadcast(S),b){if(t.gamemode===Ym.Survival)return s.decrement()}else return s.increment();break}case ka.Use:{if(t.itemTarget){let n=t.itemTarget;if(n.type.network!==a.item.network)return;let s=N.Use;n.use(t,{method:s}),new fe(t,n,s).emit()}else{let n=t.getHeldItem();if(n.type.network!==a.item.network)return;let s=N.Click;n.use(t,{method:s}),new fe(t,n,s).emit()}break}case ka.Destroy:console.log("TODO: Implement destroy item use transaction")}}handleItemUseOnEntityTransaction(t,a){let n=t.dimension.getEntity(a.actorRuntimeId,!0);if(!n)return;let s=a.type;if(n.interact(t,s),t.getHeldItem()){let o=t.getHeldItem(),i=a.type===0?N.Place:N.Use;o.use(t,{method:i,targetEntity:n}),new fe(t,o,i).emit()}}};import{ContainerName as Ot,Packet as Xm}from"@serenityjs/protocol";var es=class extends y{static{c(this,"ItemStackRequestHandler")}static packet=Xm.ItemStackRequest;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();for(let n of t.requests)for(let s of n.actions){if(s.takeOrPlace){let o=s.takeOrPlace,i=o.source.container,l=o.destination.container,m=o.source.slot,u=o.destination.slot,p=o.amount??1;if(i.identifier===Ot.CreativeOutput)break;let h=r.getContainer(i.identifier,i.dynamicIdentifier);if(!h)throw new Error(`Invalid source type: ${Ot[i.identifier]}`);let d=r.getContainer(l.identifier,l.dynamicIdentifier);if(!d)throw new Error(`Invalid destination type: ${Ot[l.identifier]}`);let b=h.getItem(m);if(!b)throw new Error("Invalid source item.");let S=d.getItem(u);if(p<=b.amount){let D=h.takeItem(m,p);if(!D)throw new Error("Invalid item.");if(S)S.increment(D.amount);else{d.setItem(u,D);let j=r.getTrait(ne);if(!j)throw new Error("Invalid cursor.");j.container.getItem(0)===null&&j.container.clearSlot(0)}}else throw new Error("Invalid count possible.")}if(s.drop){let o=s.drop,i=o.source,l=i.slot,m=o.amount,u=r.getContainer(i.container.identifier);if(!u)throw new Error(`Invalid container: ${i.container.identifier}`);r.dropItem(l,m,u)}if(s.swap){let o=s.swap,i=o.source.container,l=o.source.slot,m=o.destination.container,u=o.destination.slot,p=r.getContainer(i.identifier,i.dynamicIdentifier);if(!p)throw new Error(`Invalid source container: ${i.identifier}`);let h=r.getContainer(m.identifier,m.dynamicIdentifier);if(!h)throw new Error(`Invalid destination container: ${m.identifier}`);if(!p.getItem(l))throw new Error("Invalid source item.");if(!h.getItem(u))throw new Error("Invalid destination item.");p.swapItems(l,u,h)}if(s.destroyOrConsume){let i=s.destroyOrConsume.source;if(!i)continue;i.container.identifier===Ot.Cursor?r.getTrait(ne).container.clearSlot(0):r.getTrait(w).container.clearSlot(i.slot)}if(s.craftRecipe){let o=n.actions[1];if(!o.resultsDeprecated)throw new Error("Invalid item instance action.");let i=o.resultsDeprecated.resultants,l=n.actions.at(-1);if(!l.takeOrPlace)throw new Error("Invalid destination action.");let m=r.getContainer(l.takeOrPlace.destination.container.identifier);if(!m)throw new Error(`Invalid destination: ${l.takeOrPlace.destination.container.identifier}`);for(let u of i){let p=k.fromNetworkInstance(u);if(!p)throw new Error("Failed to convert network descriptor to item stack.");p.setAmount(p.amount*s.craftRecipe.amount),m.addItem(p)}}if(s.craftCreative){let o=n.actions[2];if(!o.takeOrPlace)throw new Error("Invalid destination.");let i=o.takeOrPlace.destination,l=o.takeOrPlace.amount,m=r.getContainer(i.container.identifier);if(!m)throw new Error(`Invalid container: ${i.container.identifier}`);let u=s.craftCreative,p=r.dimension.world,h=p.itemPalette.getCreativeContentByIndex(u.creativeIndex);if(!h)throw new Error(`Received invalid creative item: ${u.creativeIndex}`);let d=new k(h.type,{amount:l,world:p});m.setItem(i.slot,d)}}}};import{DisconnectReason as Qe,Packet as Bm,PlayStatus as Im,PlayStatusPacket as ep,ResourcePacksInfoPacket as tp,SerializedSkin as ap}from"@serenityjs/protocol";import{createDecoder as rp}from"fast-jwt";var ts=class as extends y{static{c(this,"LoginHandler")}static packet=Bm.Login;static decoder=rp();handle(t,a){let r=as.decode(t.tokens),n=r.identityData.XUID,s=r.identityData.identity,o=r.identityData.displayName;if(n.length<16)return this.network.disconnectConnection(a,"Failed to connect due to having an invalid xuid. Make sure you are connected to Xbox Live before joining the server.",Qe.InvalidTenant);this.serenity.getPlayerByXuid(n)&&this.serenity.getPlayerByXuid(n).disconnect("You have been disconnected from the server because you logged in from another location.",Qe.LoggedInOtherLocation);let i=this.serenity.getWorld();if(!i)return this.network.disconnectConnection(a,"There are no worlds registered within the server process.",Qe.WorldCorruption);let l=i.getDimension();if(!l)return this.network.disconnectConnection(a,"There are no dimensions registered within the world instance.",Qe.WorldCorruption);let m=new zt(r.clientData.DeviceId,r.clientData.DeviceModel,r.clientData.DeviceOS,r.clientData.MaxViewDistance,r.clientData.MemoryTier),u=i.provider.readPlayer(s,l),p=ap.from(r.clientData),h={username:o,xuid:n,uuid:s,device:m,skin:p};u&&(h.uniqueId=u.uniqueId,h.entry=u);let d=new J(l,a,h);if(this.serenity.players.set(a,d),!new ja(d).emit())return d.disconnect("Failed to join the server.",Qe.Kicked);let S=new ep;S.status=Im.LoginSuccess;let D=new tp;D.mustAccept=!1,D.hasAddons=!1,D.hasScripts=!1,D.packs=[],i.logger.info(`\xA78[\xA79${d.username}\xA78] Event:\xA7r Player joined the server.`),d.send(S,D)}static decode(t){let a=this.decoder(t.client),n=JSON.parse(t.identity).chain.map(i=>this.decoder(i)),s=n.find(i=>i.extraData!==void 0)?.extraData,o=n.find(i=>i.identityPublicKey!==void 0)?.identityPublicKey;return{clientData:a,identityData:s,publicKey:o}}};import{MobEquipmentPacket as np,NetworkItemStackDescriptor as sp,Packet as op}from"@serenityjs/protocol";var rs=class extends y{static{c(this,"MobEquipmentHandler")}static packet=op.MobEquipment;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.getTrait(w);n.selectedSlot=t.selectedSlot;let s=n.getHeldItem(),o=new np;o.runtimeEntityId=r.runtimeId,o.slot=t.selectedSlot,o.selectedSlot=t.selectedSlot,o.containerId=n.container.identifier,o.item=s===null?new sp(0):k.toNetworkStack(s),r.dimension.broadcastExcept(r,o)}};import{Packet as ip,PlayerActionType as Ht}from"@serenityjs/protocol";var ns=class extends y{static{c(this,"PlayerActionHandler")}static packet=ip.PlayerAction;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();switch(t.action){default:{this.serenity.logger.debug(`PlayerActionHandler: Unimplemented PlayerActionType: ${Ht[t.action]}`);break}case Ht.StartItemUseOn:{r.itemTarget=r.getHeldItem();break}case Ht.StopItemUseOn:{r.itemTarget=null;break}case Ht.CreativeDestroyBlock:break}}};import{AbilityIndex as Nt,ActorFlag as B,BlockPosition as Ne,Gamemode as ss,InputData as V,ItemStackRequestActionType as cp,LevelEvent as xa,LevelEventPacket as Ca,Packet as lp,PlayerActionType as Xe,UpdateBlockFlagsType as Pa,UpdateBlockLayerType as va,UpdateBlockPacket as Ta}from"@serenityjs/protocol";var os=class extends y{static{c(this,"PlayerAuthInputHandler")}static packet=lp.PlayerAuthInput;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();r.position.x=t.position.x,r.position.y=t.position.y,r.position.z=t.position.z,r.rotation.pitch=t.rotation.x,r.rotation.yaw=t.rotation.y,r.rotation.headYaw=t.headYaw,r.device.inputMode=t.inputMode,r.device.interactionMode=t.interactionMode,r.device.playMode=t.playMode;let n=r.position.floor(),s=r.dimension.getPermutation({...n,y:n.y-2});if(r.onGround=s.type.solid,r.inputTick=t.inputTick,r.isMoving=!0,t.blockActions)if(t.itemStackRequest){let o=t.itemStackRequest.actions.find(i=>i.action===cp.ScreenHUDMineBlock&&i.mineBlock);o&&this.handleBlockActions(r,t.blockActions.actions,o.mineBlock)}else this.handleBlockActions(r,t.blockActions.actions);this.handleActorActions(r,t.inputData.getFlags())}handleActorActions(t,a){for(let r of a)switch(r){case V.StartSneaking:case V.StopSneaking:{let n=t.flags.get(B.Sneaking)??!1;t.flags.set(B.Sneaking,!n);break}case V.StartSprinting:case V.StopSprinting:{let n=t.flags.get(B.Sprinting)??!1;t.flags.set(B.Sprinting,!n);break}case V.StartSwimming:case V.StopSwimming:{let n=t.flags.get(B.Swimming)??!1;t.flags.set(B.Swimming,!n);break}case V.StartCrawling:case V.StopCrawling:{let n=t.flags.get(B.Crawling)??!1;t.flags.set(B.Crawling,!n);break}case V.StartGliding:case V.StopGliding:{let n=t.flags.get(B.Gliding)??!1;t.flags.set(B.Gliding,!n);break}case V.StartFlying:case V.StopFlying:{let n=t.abilities.get(Nt.Flying)??!1,s=t.abilities.get(Nt.MayFly)??!1;!n&&!s?t.abilities.set(Nt.Flying,!1):t.abilities.set(Nt.Flying,!n);break}}}handleBlockActions(t,a,r){for(let n of a){let s=t.dimension;switch(n.type){default:{this.serenity.logger.debug(`PlayerAuthInputHandler: Unimplemented block action: ${Xe[n.type]}`);break}case Xe.ContinueDestroyBlock:case Xe.StartDestroyBlock:{if(t.gamemode===ss.Creative)continue;if(t.blockTarget){for(let h of s.getBlock(t.blockTarget).traits.values())h.onStopBreak?.(t);let p=new Ca;p.event=xa.StopBlockCracking,p.position=Ne.toVector3f(t.blockTarget),p.data=0,s.broadcast(p),t.blockTarget=null}let o=s.getBlock(n.position);if(o.isAir()){let p=o.permutation,h=new Ta;h.position=Ne.toVector3f(o.position),h.layer=va.Normal,h.flags=Pa.Network,h.networkBlockId=p.network,t.send(h);continue}let i=!1;for(let p of o.traits.values()){let h=p.onStartBreak?.(t);h!==void 0&&(i=!h)}if(i)continue;t.blockTarget=o.position;let l=t.getHeldItem(),m=o.getBreakTime(l),u=new Ca;if(u.event=xa.StartBlockCracking,u.position=Ne.toVector3f(o.position),u.data=65535/m,s.broadcast(u),l){let p=N.Break,h=!new Ba(t,l,p).emit();for(let d of l.traits.values()){let b=d.onStartUse?.(t,{method:p});b!==void 0&&(h=!b)}if(h)continue;t.itemTarget=l}break}case Xe.AbortDestroyBlock:{if(t.blockTarget){for(let i of s.getBlock(t.blockTarget).traits.values())i.onStopBreak?.(t);let o=new Ca;o.event=xa.StopBlockCracking,o.position=Ne.toVector3f(t.blockTarget),o.data=0,s.broadcast(o),t.blockTarget=null}if(t.itemTarget){new Ia(t,t.itemTarget).emit();for(let o of t.itemTarget.traits.values())o.onStopUse?.(t,{method:N.Break});t.itemTarget=null}break}case Xe.PredictDestroyBlock:{let o=s.getBlock(n.position),i=new Za(o,t,t.getHeldItem()).emit();if(!t.blockTarget&&t.gamemode!==ss.Creative||!i){let h=new Ta;h.position=Ne.toVector3f(o.position),h.layer=va.Normal,h.flags=Pa.Network,h.networkBlockId=o.permutation.network,t.send(h)}else if(!o.destroy(t)){let d=new Ta;d.position=Ne.toVector3f(o.position),d.layer=va.Normal,d.flags=Pa.Network,d.networkBlockId=o.permutation.network,t.send(d)}if(!r||!t.itemTarget)continue;let l=t.itemTarget,m=N.Use,u=r.predictedDurability,p=o;l.use(t,{method:m,predictedDurability:u,targetBlock:p}),new fe(t,l,m).emit();continue}}}}};import{Packet as mp,ChunkRadiusUpdatePacket as pp}from"@serenityjs/protocol";var is=class extends y{static{c(this,"RequestChunkRadiusHandler")}static packet=mp.RequestChunkRadius;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();let n=r.dimension.viewDistance,s=t.radius,o=r.getTrait(_e),i=s>n?n:s;o.viewDistance=i>r.device.maxViewDistance?r.device.maxViewDistance:i;let l=new pp;l.radius=o.viewDistance,r.sendImmediate(l)}};import{DisconnectReason as cs,NetworkSettingsPacket as up,Packet as hp,PROTOCOL_VERSION as ls}from"@serenityjs/protocol";var ms=class extends y{static{c(this,"RequestNetworkSettingsHandler")}static packet=hp.RequestNetworkSettings;handle(t,a){if(ls>t.protocol)return this.network.disconnectConnection(a,"Outdated client! Please use the latest version of Minecraft Bedrock.",cs.OutdatedClient);if(ls<t.protocol)return this.network.disconnectConnection(a,"Outdated server! Please wait for the server to be updated.",cs.OutdatedServer);let r=new up;r.compressionThreshold=this.serenity.properties.compressionThreshold,r.compressionMethod=this.serenity.properties.compressionMethod,r.clientThrottle=!1,r.clientThreshold=0,r.clientScalar=0,this.network.sendNormal(a,r),this.network.setCompression(a,!0)}};import{AvailableActorIdentifiersPacket as dp,Difficulty as fp,MINECRAFT_VERSION as ps,Packet as gp,PlayStatus as _p,PlayStatusPacket as yp,ResourcePackResponse as Ea,ResourcePackStackPacket as bp,StartGamePacket as wp}from"@serenityjs/protocol";import{CompoundTag as Sp,Tag as kp}from"@serenityjs/nbt";var us=class extends y{static{c(this,"ResourcePackClientResponseHandler")}static packet=gp.ResourcePackClientResponse;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension.world;switch(t.response){default:{this.serenity.logger.debug(`Unhandled ResourcePackClientResponse: ${Ea[t.response]}`);break}case Ea.HaveAllPacks:{let s=new bp;return s.mustAccept=!1,s.behaviorPacks=[],s.gameVersion=ps,s.experiments=[],s.experimentsPreviouslyToggled=!1,s.hasEditorPacks=!1,s.texturePacks=[],r.send(s)}case Ea.Completed:{let s=new wp;s.entityId=r.uniqueId,s.runtimeEntityId=r.runtimeId,s.playerGamemode=r.gamemode,s.playerPosition=r.position,s.pitch=r.rotation.pitch,s.yaw=r.rotation.yaw,s.seed=BigInt(r.dimension.generator.properties.seed),s.biomeType=0,s.biomeName="plains",s.dimension=r.dimension.type,s.generator=1,s.worldGamemode=0,s.hardcore=!1,s.difficulty=fp.Easy,s.spawnPosition=r.dimension.spawnPosition,s.achievementsDisabled=!0,s.editorWorldType=0,s.createdInEdior=!1,s.exportedFromEdior=!1,s.dayCycleStopTime=r.dimension.world.dayTime,s.eduOffer=0,s.eduFeatures=!0,s.eduProductUuid="",s.rainLevel=0,s.lightningLevel=0,s.confirmedPlatformLockedContent=!1,s.multiplayerGame=!0,s.broadcastToLan=!0,s.xblBroadcastMode=6,s.platformBroadcastMode=6,s.commandsEnabled=!0,s.texturePacksRequired=!1,s.gamerules=[{name:"commandblockoutput",editable:!0,type:1,value:!0},{name:"dodaylightcycle",editable:!0,type:1,value:!0},{name:"doentitydrops",editable:!0,type:1,value:!0},{name:"dofiretick",editable:!0,type:1,value:!0},{name:"recipesunlock",editable:!0,type:1,value:!0},{name:"dolimitedcrafting",editable:!0,type:1,value:!1},{name:"domobloot",editable:!0,type:1,value:!0},{name:"domobspawning",editable:!0,type:1,value:!0},{name:"dotiledrops",editable:!0,type:1,value:!0},{name:"doweathercycle",editable:!0,type:1,value:!0},{name:"drowningdamage",editable:!0,type:1,value:!0},{name:"falldamage",editable:!0,type:1,value:!0},{name:"firedamage",editable:!0,type:1,value:!0},{name:"keepinventory",editable:!0,type:1,value:!1},{name:"mobgriefing",editable:!0,type:1,value:!0},{name:"pvp",editable:!0,type:1,value:!0},{name:"showcoordinates",editable:!0,type:1,value:!0},{name:"naturalregeneration",editable:!0,type:1,value:!0},{name:"tntexplodes",editable:!0,type:1,value:!0},{name:"sendcommandfeedback",editable:!0,type:1,value:!0},{name:"maxcommandchainlength",editable:!0,type:2,value:65535},{name:"doinsomnia",editable:!0,type:1,value:!0},{name:"commandblocksenabled",editable:!0,type:1,value:!0},{name:"randomtickspeed",editable:!0,type:2,value:1},{name:"doimmediaterespawn",editable:!0,type:1,value:!1},{name:"showdeathmessages",editable:!0,type:1,value:!0},{name:"functioncommandlimit",editable:!0,type:2,value:1e4},{name:"spawnradius",editable:!0,type:2,value:10},{name:"showtags",editable:!0,type:1,value:!0},{name:"freezedamage",editable:!0,type:1,value:!0},{name:"respawnblocksexplode",editable:!0,type:1,value:!0},{name:"showbordereffect",editable:!0,type:1,value:!0},{name:"playerssleepingpercentage",editable:!0,type:2,value:100}],s.experiments=[],s.experimentsPreviouslyToggled=!1,s.bonusChest=!1,s.mapEnabled=!1,s.permissionLevel=r.permission,s.serverChunkTickRange=r.dimension.simulationDistance>>4,s.hasLockedBehaviorPack=!1,s.hasLockedResourcePack=!1,s.isFromLockedWorldTemplate=!1,s.useMsaGamertagsOnly=!1,s.isFromWorldTemplate=!1,s.isWorldTemplateOptionLocked=!1,s.onlySpawnV1Villagers=!1,s.personaDisabled=!1,s.customSkinsDisabled=!1,s.emoteChatMuted=!1,s.gameVersion=ps,s.limitedWorldWidth=16,s.limitedWorldLength=16,s.isNewNether=!1,s.eduResourceUriButtonName="",s.eduResourceUriLink="",s.experimentalGameplayOverride=!1,s.chatRestrictionLevel=0,s.disablePlayerInteractions=!1,s.serverIdentfier="SerenityJS",s.worldIdentifier=r.dimension.world.identifier,s.scenarioIdentifier="SerenityJS",s.levelId="SerenityJS",s.worldName=r.dimension.world.identifier,s.premiumWorldTemplateId="00000000-0000-0000-0000-000000000000",s.isTrial=!1,s.movementAuthority=1,s.rewindHistorySize=0,s.serverAuthoritativeBlockBreaking=!0,s.currentTick=r.dimension.world.currentTick,s.enchantmentSeed=0,s.blockProperties=n.blockPalette.getAllCustomTypes().map(m=>ct.toBlockProperty(m)),s.items=n.itemPalette.getAllTypes().map(m=>z.toItemData(m)),s.multiplayerCorrelationId="<raknet>a555-7ece-2f1c-8f69",s.serverAuthoritativeInventory=!0,s.engine="*",s.propertyData1=10,s.propertyData2=0,s.propertyData3=0,s.blockPaletteChecksum=0n,s.worldTemplateId="00000000000000000000000000000000",s.clientSideGeneration=!1,s.blockNetworkIdsAreHashes=!0,s.serverControlledSounds=!0;let o=new dp;o.data=new Sp;let i=n.entityPalette.getAllTypes().map(m=>R.toNbt(m));o.data.createListTag("idlist",kp.Compound,i);let l=new yp;l.status=_p.PlayerSpawn,r.sendImmediate(s,l,o)}}}};import{Packet as xp}from"@serenityjs/protocol";var hs=class extends y{static{c(this,"SetLocalPlayerAsInitializedHandler")}static packet=xp.SetLocalPlayerAsInitialized;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();r.spawn()}};import{Packet as Cp}from"@serenityjs/protocol";var ds=class extends y{static{c(this,"TextHandler")}static packet=Cp.Text;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();let n=new Ya(r,t.message);if(!n.emit())return;t.message=n.message;let s=!1;for(let o of r.traits.values()){let i=o.onChat?.(t.message);i!==void 0&&(s=!i)}s||(r.dimension.world.broadcast(t),r.dimension.world.logger.info(`\xA78[\xA79${r.username}\xA78] Chat:\xA7r ${t.message}`))}};import{Packet as Pp}from"@serenityjs/protocol";var fs=class extends y{static{c(this,"CommandRequestHandler")}static packet=Pp.CommandRequest;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension.world,s=t.command.startsWith("/")?t.command.slice(1):t.command,o=new De(n.commands.getAll(),s,r),i=!1;for(let l of r.traits.values()){let m=l.onCommand?.(o);m!==void 0&&(i=!m)}if(!i){if((o.command?.registry.permissionLevel??4)+1>r.permission)return r.sendMessage("\xA7cYou do not have permission to execute this command.");try{let l=o.execute();n.logger.info(`\xA78[\xA79${r.username}\xA78] Command:\xA7r ${t.command}`),l.message&&r.sendMessage(`\xA77${l.message}\xA7r`)}catch(l){l instanceof TypeError?r.sendMessage(`\xA7cType Error: ${l.message}\xA7r`):r.sendMessage(`\xA7cSyntax Error: ${l.message}\xA7r`)}}}};import{InteractAction as Da,Packet as vp}from"@serenityjs/protocol";var gs=class extends y{static{c(this,"InteractHandler")}static packet=vp.Interact;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension;switch(t.action){default:return n.world.logger.debug(`InteractHandler: Unimplemented action ${[Da[t.action]]}`);case Da.InteractUpdate:{if(t.actorRuntimeId===0n)return void(r.entityTarget=null);let s=n.getEntity(t.actorRuntimeId,!0);return s?void(r.entityTarget=s):void 0}case Da.OpenInventory:{let s=n.getEntity(t.actorRuntimeId,!0);if(!s||!s.hasTrait(w))return console.log("Entity does not have an inventory trait");let{container:o}=s.getTrait(w);return o.show(r)}}}};import{Packet as Tp,PlayStatus as Ep,PlayStatusPacket as Dp}from"@serenityjs/protocol";var _s=class extends y{static{c(this,"RespawnHandler")}static packet=Tp.Respawn;handle(t,a){let r=this.serenity.players.get(a);if(!r)return a.disconnect();let n=new Dp;n.status=Ep.PlayerSpawn,r.sendImmediate(n);let s=r.getTrait(M);s.currentValue=s.defaultValue,r.spawn()}};import{ModalFormCanceledReason as Op,Packet as Hp}from"@serenityjs/protocol";import{ClientboundCloseFormPacket as Mp,ModalFormRequestPacket as Ap,ServerSettingsResponsePacket as Wp}from"@serenityjs/protocol";var se=class be{static{c(this,"Form")}static pending=new Map;static formId=0;formId=++be.formId;type;show(t,a){be.pending.has(this.formId)||be.pending.set(this.formId,new Map);let r=be.pending.get(this.formId);if(!r)return this;let n=JSON.stringify(this),s=new Ap;return s.id=this.formId,s.payload=n,t.send(s),r.set(t.uniqueId,{player:t,result:a}),this}close(t){let a=new Mp;t.send(a)}update(){if(!be.pending.has(this.formId))return;let t=be.pending.get(this.formId);if(!t)return;let a=new Wp;a.formId=this.formId,a.payload=JSON.stringify(this);for(let{player:r}of t.values())r.send(a)}};import{ModalFormType as Gp}from"@serenityjs/protocol";var Mz=class extends se{static{c(this,"MessageForm")}type=Gp.Message;title;content;button1;button2};import{ModalFormType as zp}from"@serenityjs/protocol";var Oz=class extends se{static{c(this,"ActionForm")}type=zp.Action;title;content;buttons=[];button(t,a){return this.buttons.push({text:t,image:a}),this}};import{ModalFormType as Lp}from"@serenityjs/protocol";var qz=class extends se{static{c(this,"ModalForm")}type=Lp.Modal;title;content=[];dropdown(t,a,r=0){return this.content.push({type:"dropdown",text:t,options:a,default:r}),this}input(t,a="",r=""){return this.content.push({type:"input",text:t,placeholder:a,default:r}),this}label(t){return this.content.push({type:"label",text:t}),this}slider(t,a,r,n=1,s=a){return this.content.push({type:"slider",text:t,min:a,max:r,step:n,default:s}),this}stepSlider(t,a,r=0){return this.content.push({type:"step_slider",text:t,steps:a,default:r}),this}toggle(t,a=!1){return this.content.push({type:"toggle",text:t,default:a}),this}};var ys=class extends y{static{c(this,"ModalFormResponseHandler")}static packet=Hp.ModalFormResponse;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=se.pending.get(t.id);if(!n)throw new Error(`Failed to fetch form with id ${t.id}, broadcasted to ${r.username}`);let s=n.get(r.uniqueId);if(!s)throw new Error(`Failed to fetch participant with id ${r.uniqueId}, broadcasted to ${r.username}`);if(t.canceled)s.result(null,new Error(`Form was canceled by the player. Reason: ${Op[t.reason]}`));else{let o=JSON.parse(t.data);s.result(o,null)}n.delete(r.uniqueId),n.size===0&&se.pending.delete(t.id)}};import{Packet as Np,PermissionFlag as he,AbilityIndex as de}from"@serenityjs/protocol";var bs=class extends y{static{c(this,"RequestPermissionsHandler")}static packet=Np.RequestPermissions;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension.getEntity(t.actorUniqueId);if(!n||!n.isPlayer())throw new Error("Invalid target player");let s=t.getFlag(he.Build),o=t.getFlag(he.Mine),i=t.getFlag(he.DoorsAndSwitches),l=t.getFlag(he.OpenContainers),m=t.getFlag(he.AttackPlayers),u=t.getFlag(he.AttackMobs),p=t.getFlag(he.OperatorCommands),h=t.getFlag(he.Teleport);n.abilities.superSet(de.Build,s),n.abilities.superSet(de.Mine,o),n.abilities.superSet(de.DoorsAndSwitches,i),n.abilities.superSet(de.OpenContainers,l),n.abilities.superSet(de.AttackPlayers,m),n.abilities.superSet(de.AttackMobs,u),n.abilities.superSet(de.OperatorCommands,p),n.abilities.superSet(de.Teleport,h),n.abilities.update()}};import{Gamemode as Rp,Packet as Fp}from"@serenityjs/protocol";var ws=class extends y{static{c(this,"BlockPickRequestHandler")}static packet=Fp.BlockPickRequest;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let{x:n,y:s,z:o,addData:i}=t,m=r.dimension.getBlock({x:n,y:s,z:o});for(let d of m.traits.values())d.onPick?.(r,i);if(r.gamemode!==Rp.Creative)return;let u=m.getItemStack({amount:1,auxillary:i?m.permutation.index:0});if(i){let d=m.getDataEntry();u.components.set("block_data",d)}let{container:p,selectedSlot:h}=r.getTrait(w);p.setItem(h,u)}};import{ActorFlag as Ss,Packet as $p}from"@serenityjs/protocol";var ks=class extends y{static{c(this,"EmoteHandler")}static packet=$p.Emote;handle(t,a){let r=this.serenity.getPlayerByConnection(a);if(!r)return a.disconnect();let n=r.dimension;new er(r,t.emoteId,t.tickLength).emit()&&(r.flags.set(Ss.Emoting,!0),n.schedule(t.tickLength).on(()=>{new tr(r,t.emoteId).emit(),r.flags.set(Ss.Emoting,!1)}),n.broadcastExcept(r,t))}};var xs=[ms,ts,us,os,hs,pr,Na,rs,es,is,Ha,In,ns,ds,fs,gs,_s,ys,bs,ws,ks];import{existsSync as qp,readFileSync as Up,writeFileSync as Cs}from"node:fs";import{resolve as Ma}from"node:path";import{PermissionLevel as Vp}from"@serenityjs/protocol";var jp={path:null,permissions:[]},Aa=class Ps extends Map{static{c(this,"Permissions")}serenity;path=null;constructor(t,a){super(),this.serenity=t;let r={...jp,...a};for(let n of r.permissions)this.set(n.uuid,n.level);r.path&&(this.path=r.path)}get(t){return super.get(t)??Vp.Member}set(t,a){if(super.set(t,a),this.path){let r=Array.from(this.entries()).map(([n,s])=>({uuid:n,level:s}));Cs(this.path,JSON.stringify(r,null,2))}return this}static fromPath(t,a){qp(Ma(a))||Cs(Ma(a),JSON.stringify([]));let r=JSON.parse(Up(Ma(a),"utf-8"));return new Ps(t,{path:a,permissions:r})}};var Ts={port:19132,address:"0.0.0.0",motd:"SerenityJS",compressionMethod:Jp.Zlib,compressionThreshold:256,packetsPerFrame:64,permissions:[],defaultGenerator:na,debugLogging:!1},sL=class extends Xp{static{c(this,"Serenity")}properties=Ts;network;worlds=new Map;providers=new Map;generators=new Map;logger=new vs("Serenity",Zp.Magenta);players=new Map;console=new xn(this);permissions;alive=!0;ticks=[];tps=0;constructor(t){super(),this.properties={...Ts,...t},vs.DEBUG=this.properties.debugLogging,this.network=new Oa(this,xs),this.network.raknet.message=this.properties.motd,this.registerGenerator(na),this.registerGenerator(Et),this.permissions=typeof this.properties.permissions=="string"?Aa.fromPath(this,this.properties.permissions):new Aa(this,{permissions:this.properties.permissions})}start(){this.network.raknet.start(!1);let t=process.hrtime(),a=20,r=c(()=>{if(!this.alive)return;let[n,s]=process.hrtime(t),o=n+s/1e9;if(o>=1/Qp)for(let i of this.network.raknet.connections.values())i.tick();if(o>=1/a){t=process.hrtime();let i=o*1e3;this.ticks.push(Date.now());let l=Date.now()-1e3;this.ticks=this.ticks.filter(m=>m>l),this.tps=this.ticks.length;for(let m of this.worlds.values())m.onTick(Math.floor(i))}setImmediate(r)},"tick");r(),this.emit(tt.Start,0),this.logger.info(`\xA7aServer is now running at \xA72${this.properties.address}\xA7a:\xA72${this.properties.port}\xA7a.\xA7r \xA78(v${Yp}, proto-v${Kp})\xA7r`)}stop(){this.console.interface.close(),this.emit(tt.Stop,0);for(let t of this.players.values())t.getWorld().provider.writePlayer(t.getDataEntry(),t.dimension),t.disconnect("Server closed.");for(let t of this.worlds.values())t.provider.onShutdown();this.alive=!1,process.nextTick(()=>this.network.raknet.stop()),this.logger.info("\xA7cServer has been stopped.\xA7r")}setMotd(t){this.network.raknet.message=t}registerProvider(t,a){if(this.providers.has(t))return this.logger.error(`Provider already registered: ${t.identifier}`),!1;try{return t.initialize(this,{...ta,...a}),this.providers.set(t,{...ta,...a}),this.logger.debug(`Registered provider: ${t.identifier}`),!0}catch(r){return this.logger.error(`Failed to register provider: ${t.identifier}`,r),!1}}registerGenerator(t){return this.generators.has(t.identifier)?(this.logger.error(`Generator already registered: ${t.identifier}`),!1):(this.generators.set(t.identifier,t),this.logger.debug(`Registered generator: ${t.identifier}`),!0)}getGenerator(t){return this.generators.get(t)??null}createWorld(t,a){let r=this.providers.get(t);if(!r)return this.logger.error(`Failed to create world, as the given provider is not registered: ${t.identifier}`),!1;let n=t.create(this,r,a);return this.registerWorld(n),n}getWorld(t){return t?this.worlds.get(t)??null:this.worlds.values().next().value??null}getWorlds(){return[...this.worlds.values()]}registerWorld(t){return this.worlds.has(t.identifier)?(this.logger.error(`World already registered: ${t.identifier}`),!1):(this.worlds.set(t.identifier,t),this.logger.debug(`Registered world: ${t.identifier}`),t.provider.onStartup(),ft.options.push(t.identifier),!0)}getDimension(t,a){return t.dimensions.get(a)??null}getDimensions(t){return[...t.dimensions.values()]}getPlayerByConnection(t){return this.players.get(t)??null}getPlayerByXuid(t){return[...this.players.values()].find(a=>a.xuid===t)??null}getPlayerByUsername(t){return[...this.players.values()].find(a=>a.username===t)??null}getPlayerByUuid(t){return[...this.players.values()].find(a=>a.uuid===t)??null}getPlayers(){return[...this.players.values()]}};var VL=class{static{c(this,"LootPool")}entries=[];rolls=1;constructor(t,a){this.entries=t,this.rolls=a}roll(){let t=[],a=this.entries.map(({weight:r})=>r).reduce((r,n)=>n+r);for(let r=0;r<this.rolls;r++){let n=Math.random()*a,s=0;for(let{weight:o,itemStack:i,function:l}of this.entries)if(s+=o,n<s){t.push(l?.(i)??i);break}}return t}addEntry(t){return this.entries.push(t),this}removeEntry(t){return this.entries.splice(this.entries.indexOf(t),1),this}};var KL=class{static{c(this,"LootTable")}pools=new Set;constructor(t){this.pools=new Set(t)}addPool(t){return this.pools.add(t),this}removePool(t){return this.pools.delete(t),this}getLoot(){let t=[];for(let a of this.pools)t.push(...a.roll());return t}};export{zr as AbilityEnum,Zn as AbilityMap,Oz as ActionForm,Yn as ActorFlagMap,Ir as AdminCommands,Kn as AttributeMap,mt as Block,wo as BlockCardinalDirectionTrait,xr as BlockContainer,So as BlockDirectionTrait,xe as BlockEnum,C as BlockIdentifier,mo as BlockInventoryTrait,_o as BlockOpenBitTrait,Cr as BlockPalette,W as BlockPermutation,xt as BlockStorage,Re as BlockToolType,G as BlockTrait,Yt as BlockTraits,H as BlockType,rt as BlockUpdateSignal,yo as BlockUpperBitTrait,uo as BlockUpsideDownBitTrait,po as BlockWeirdoDirectionTrait,Wr as BooleanEnum,v as CardinalDirection,O as Chunk,at as ChunkReadySignal,Or as Command,Zt as CommandArgumentPointer,De as CommandExecutionState,Hr as CommandRegistry,Nr as Commands,en as CommonCommands,xn as ConsoleInterface,Pe as Container,oe as CreativeItem,ct as CustomBlockType,ur as CustomEntityType,L as CustomEnum,Hb as CustomItemType,wt as DefaultDimensionProperties,ml as DefaultItemStackProperties,ta as DefaultWorldProviderProperties,zt as Device,Me as Dimension,ar as EffectAddSignal,rr as EffectRemoveSignal,E as Entity,im as EntityAirSupplyTrait,K as EntityAttributeTrait,Va as EntityAttributeUpdateSignal,rm as EntityCollision,ze as EntityContainer,$a as EntityDespawnedSignal,mr as EntityDieSignal,nt as EntityDimensionChangeSignal,Oe as EntityEffectsTrait,Ue as EntityEnum,Ge as EntityEquipmentTrait,qa as EntityFlagUpdateSignal,Ae as EntityGravityTrait,lr as EntityHealthChangedSignal,M as EntityHealthTrait,ir as EntityHitSignal,cr as EntityHurtSignal,_ as EntityIdentifier,Fe as EntityInteractMethod,w as EntityInventoryTrait,_t as EntityInvisibilityTrait,Ve as EntityItemStackTrait,Ua as EntityMetadataUpdateSignal,Q as EntityMovementTrait,ht as EntityNameTagTrait,an as EntityPalette,St as EntityPhysicsTrait,Fa as EntitySpawnedSignal,P as EntityTrait,wa as EntityTraits,R as EntityType,ve as Enum,g as EventSignal,se as Form,Gr as GamemodeEnum,xs as Handlers,le as IntegerEnum,$P as InternalProvider,ye as ItemBundleTrait,Rt as ItemCategory,jt as ItemDrop,xl as ItemEnchantableTrait,Ee as ItemEnum,bl as ItemEquippableTrait,Es as ItemGroup,A as ItemIdentifier,tn as ItemPalette,k as ItemStack,we as ItemToolTier,et as ItemToolType,ae as ItemTrait,ia as ItemTraits,z as ItemType,N as ItemUseMethod,av as LevelDBProvider,VL as LootPool,KL as LootTable,Mz as MessageForm,Jn as MetadataMap,qz as ModalForm,Oa as Network,Ie as NetworkBound,y as NetworkHandler,J as Player,Xa as PlayerAbilityUpdateSignal,Za as PlayerBreakBlockSignal,Ya as PlayerChatSignal,_e as PlayerChunkRenderingTrait,ne as PlayerCursorTrait,Qa as PlayerDropItemSignal,Yl as PlayerEntityRenderingTrait,da as PlayerExhaustionTrait,nr as PlayerGamemodeChangeSignal,tm as PlayerHungerTrait,sr as PlayerInteractWithBlockSignal,or as PlayerInteractWithEntitySignal,ja as PlayerJoinSignal,Ja as PlayerLeaveSignal,Kl as PlayerListTrait,st as PlayerOpenedContainerSignal,Ka as PlayerPlaceBlockSignal,ha as PlayerSaturationTrait,er as PlayerStartEmotingSignal,Ba as PlayerStartUsingItemSignal,tr as PlayerStopEmotingSignal,Ia as PlayerStopUsingItemSignal,re as PlayerTrait,fe as PlayerUseItemSignal,Z as PositionEnum,sL as Serenity,tt as ServerEvent,dt as SoftEnum,ce as StringEnum,F as SubChunk,Et as SuperflatGenerator,pn as SuperflatWorker,Lr as TagEnum,T as TargetEnum,Tt as TerrainGenerator,on as TerrainWorker,bt as TickSchedule,ie as ValidEnum,bo as VerticalHalfTrait,na as VoidGenerator,mn as Worker,je as World,ft as WorldEnum,f as WorldEvent,qt as WorldInitializeSignal,Ct as WorldProvider,Ra as WorldTickSignal,dr as hash};
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NlcmVuaXR5LnRzIiwgIi4uL3NyYy9uZXR3b3JrL25ldHdvcmsudHMiLCAiLi4vc3JjL2VudW1zL25ldHdvcmstYm91bmQudHMiLCAiLi4vc3JjL2VudW1zL2Jsb2NrLWlkZW50aWZpZXIudHMiLCAiLi4vc3JjL2VudW1zL2VudGl0eS1pZGVudGlmaWVyLnRzIiwgIi4uL3NyYy9lbnVtcy9pdGVtLWlkZW50aWZpZXIudHMiLCAiLi4vc3JjL2VudW1zL2l0ZW0tY2F0ZWdvcnkudHMiLCAiLi4vc3JjL2VudW1zL2l0ZW0tZ3JvdXAudHMiLCAiLi4vc3JjL2VudW1zL3Rvb2wtdGllci50cyIsICIuLi9zcmMvZW51bXMvdG9vbC10eXBlLnRzIiwgIi4uL3NyYy9lbnVtcy9ibG9jay10b29sLXR5cGUudHMiLCAiLi4vc3JjL2VudW1zL2l0ZW0tdXNlLW1ldGhvZC50cyIsICIuLi9zcmMvZW51bXMvZW50aXR5LWludGVyYWN0LW1ldGhvZC50cyIsICIuLi9zcmMvZW51bXMvY2FyZGluYWwtZGlyZWN0aW9uLnRzIiwgIi4uL3NyYy9lbnVtcy93b3JsZC1ldmVudC50cyIsICIuLi9zcmMvZW51bXMvc2VydmVyLWV2ZW50LnRzIiwgIi4uL3NyYy9uZXR3b3JrL2hhbmRsZXIudHMiLCAiLi4vc3JjL2hhbmRsZXJzL2FuaW1hdGUudHMiLCAiLi4vc3JjL2hhbmRsZXJzL2NvbnRhaW5lci1jbG9zZS50cyIsICIuLi9zcmMvaGFuZGxlcnMvZGlzY29ubmVjdC50cyIsICIuLi9zcmMvZXZlbnRzL2V2ZW50LXNpZ25hbC50cyIsICIuLi9zcmMvZXZlbnRzL3dvcmxkLWluaXRpYWxpemUudHMiLCAiLi4vc3JjL2V2ZW50cy93b3JsZC10aWNrLnRzIiwgIi4uL3NyYy9ldmVudHMvY2h1bmstcmVhZHkudHMiLCAiLi4vc3JjL2V2ZW50cy9lbnRpdHktc3Bhd25lZC50cyIsICIuLi9zcmMvZXZlbnRzL2VudGl0eS1kZXNwYXduZWQudHMiLCAiLi4vc3JjL2V2ZW50cy9lbnRpdHktZmxhZy11cGRhdGUudHMiLCAiLi4vc3JjL2V2ZW50cy9lbnRpdHktbWV0YWRhdGEtdXBkYXRlLnRzIiwgIi4uL3NyYy9ldmVudHMvZW50aXR5LWF0dHJpYnV0ZS11cGRhdGUudHMiLCAiLi4vc3JjL2V2ZW50cy9wbGF5ZXItam9pbi50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1sZWF2ZS50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1jaGF0LnRzIiwgIi4uL3NyYy9ldmVudHMvYmxvY2stdXBkYXRlLnRzIiwgIi4uL3NyYy9ldmVudHMvcGxheWVyLXBsYWNlLWJsb2NrLnRzIiwgIi4uL3NyYy9ldmVudHMvcGxheWVyLWJyZWFrLWJsb2NrLnRzIiwgIi4uL3NyYy9ldmVudHMvcGxheWVyLWRyb3AtaXRlbS50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1hYmlsaXR5LXVwZGF0ZS50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1zdGFydC11c2luZy1pdGVtLnRzIiwgIi4uL3NyYy9ldmVudHMvcGxheWVyLXN0b3AtdXNpbmctaXRlbS50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci11c2UtaXRlbS50cyIsICIuLi9zcmMvZXZlbnRzL3BsYXllci1zdGFydC1lbW90aW5nLnRzIiwgIi4uL3NyYy9ldmVudHMvcGxheWVyLXN0b3AtZW1vdGluZy50cyIsICIuLi9zcmMvZXZlbnRzL2VmZmVjdC1hZGQudHMiLCAiLi4vc3JjL2V2ZW50cy9lZmZlY3QtcmVtb3ZlLnRzIiwgIi4uL3NyYy9ldmVudHMvZ2FtZW1vZGUtY2hhbmdlLnRzIiwgIi4uL3NyYy9ldmVudHMvZW50aXR5LWRpbWVuc2lvbi1jaGFuZ2UudHMiLCAiLi4vc3JjL2V2ZW50cy9wbGF5ZXItYmxvY2staW50ZXJhY3QudHMiLCAiLi4vc3JjL2V2ZW50cy9wbGF5ZXItZW50aXR5LWludGVyYWN0LnRzIiwgIi4uL3NyYy9ldmVudHMvcGxheWVyLW9wZW5lZC1jb250YWluZXIudHMiLCAiLi4vc3JjL2V2ZW50cy9lbnRpdHktaGl0LnRzIiwgIi4uL3NyYy9ldmVudHMvZW50aXR5LWh1cnQudHMiLCAiLi4vc3JjL2V2ZW50cy9lbnRpdHktaGVhbHRoLWNoYW5nZWQudHMiLCAiLi4vc3JjL2V2ZW50cy9lbnRpdHktZGllLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9pbnZlbnRvcnktdHJhbnNhY3Rpb24udHMiLCAiLi4vc3JjL2VudGl0eS9pZGVudGl0eS9yZWdpc3RyeS50cyIsICIuLi9zcmMvZW50aXR5L2lkZW50aXR5L3R5cGUudHMiLCAiLi4vc3JjL2VudGl0eS9pZGVudGl0eS9jdXN0b20udHMiLCAiLi4vc3JjL2VudGl0eS9lbnRpdHkudHMiLCAiLi4vc3JjL2l0ZW0vaWRlbnRpdHkvcmVnaXN0cnkudHMiLCAiLi4vc3JjL2Jsb2NrL2lkZW50aXR5L3JlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ibG9jay9pZGVudGl0eS90eXBlLnRzIiwgIi4uL3NyYy9ibG9jay9pZGVudGl0eS9wZXJtdXRhdGlvbi50cyIsICIuLi9zcmMvYmxvY2svaWRlbnRpdHkvaGFzaC50cyIsICIuLi9zcmMvYmxvY2svaWRlbnRpdHkvZHJvcHMudHMiLCAiLi4vc3JjL2Jsb2NrL2lkZW50aXR5L2N1c3RvbS50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL2luZGV4LnRzIiwgIi4uL3NyYy90cmFpdC50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL3RyYWl0LnRzIiwgIi4uL3NyYy9ibG9jay90cmFpdHMvaW52ZW50b3J5LnRzIiwgIi4uL3NyYy9ibG9jay90cmFpdHMvd2VpcmRvLWRpcmVjdGlvbi50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL3Vwc2lkZS1kb3duLWJpdC50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL29wZW4tYml0LnRzIiwgIi4uL3NyYy9ibG9jay90cmFpdHMvdXBwZXItYmxvY2stYml0LnRzIiwgIi4uL3NyYy9ibG9jay90cmFpdHMvdmVydGljYWwtaGFsZi50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL2NhcmRpbmFsX2RpcmVjdGlvbi50cyIsICIuLi9zcmMvYmxvY2svdHJhaXRzL2RpcmVjdGlvbi50cyIsICIuLi9zcmMvYmxvY2svcGFsZXR0ZS50cyIsICIuLi9zcmMvYmxvY2svYmxvY2sudHMiLCAiLi4vc3JjL2Jsb2NrL21hcHMvbmJ0LW1hcC50cyIsICIuLi9zcmMvYmxvY2svY29udGFpbmVyLnRzIiwgIi4uL3NyYy9jb250YWluZXIudHMiLCAiLi4vc3JjL2Jsb2NrL2luZGV4LnRzIiwgIi4uL3NyYy9pdGVtL2lkZW50aXR5L3R5cGUudHMiLCAiLi4vc3JjL2l0ZW0vaWRlbnRpdHkvY3JlYXRpdmUudHMiLCAiLi4vc3JjL2l0ZW0vaWRlbnRpdHkvY3VzdG9tLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy9lbnVtLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy92YWxpZC92YWxpZC50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvdmFsaWQvc3RyaW5nLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy92YWxpZC9pbnRlZ2VyLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy92YWxpZC90YXJnZXQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL3ZhbGlkL3Bvc2l0aW9uLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtcy9jdXN0b20vc29mdC50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvY3VzdG9tL2N1c3RvbS50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvY3VzdG9tL2Jvb2xlYW4udHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL2N1c3RvbS9nYW1lbW9kZS50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvY3VzdG9tL2FiaWxpdHkudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL2N1c3RvbS9ibG9jay50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvY3VzdG9tL2VudGl0eS50cyIsICIuLi9zcmMvY29tbWFuZHMvZW51bXMvY3VzdG9tL2l0ZW0udHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL2N1c3RvbS90YWcudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW1zL2N1c3RvbS93b3JsZC50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbWFuZC50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbWFuZHMudHMiLCAiLi4vc3JjL2NvbW1hbmRzL3JlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9leGVjdXRpb24tc3RhdGUudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL2dhbWVtb2RlLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9hZG1pbi9hYmlsaXR5LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9hZG1pbi9jbGVhci50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vZmlsbC50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vZ2l2ZS50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4va2ljay50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vc2V0YmxvY2sudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL3RhZy50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vdHAudHMiLCAiLi4vc3JjL3dvcmxkL3dvcmxkLnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy9pbmRleC50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvZWZmZWN0LnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy9yZWdlbmVyYXRpb24udHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL3BvaXNvbi50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvbmlnaHQtdmlzaW9uLnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy9pbnN0YW50LWRhbWFnZS50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvaW5zdGFudC1oZWFsdGgudHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL2JsaW5kbmVzcy50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvZGFya25lc3MudHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL25hdXNlYXMudHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL3NwZWVkLnRzIiwgIi4uL3NyYy9lZmZlY3QvZWZmZWN0cy93aXRoZXIudHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL2ZhdGFsLXBvaXNvbi50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvc2xvd25lc3MudHMiLCAiLi4vc3JjL2VmZmVjdC9lZmZlY3RzL2ludmlzaWJpbGl0eS50cyIsICIuLi9zcmMvZWZmZWN0L2VmZmVjdHMvd2F0ZXItYnJlYXRoaW5nLnRzIiwgIi4uL3NyYy9lZmZlY3QvcGFsbGV0ZS50cyIsICIuLi9zcmMvZWZmZWN0L2luZGV4LnRzIiwgIi4uL3NyYy93b3JsZC9kaW1lbnNpb24udHMiLCAiLi4vc3JjL3dvcmxkL3NjaGVkdWxlLnRzIiwgIi4uL3NyYy93b3JsZC9zY29yZWJvYXJkL3Njb3JlYm9hcmQudHMiLCAiLi4vc3JjL3dvcmxkL3Njb3JlYm9hcmQvb2JqZWN0aXZlLnRzIiwgIi4uL3NyYy93b3JsZC9zY29yZWJvYXJkL2lkZW50aXR5LnRzIiwgIi4uL3NyYy93b3JsZC9jaHVuay9ibG9jay1zdG9yYWdlLnRzIiwgIi4uL3NyYy93b3JsZC9jaHVuay9zdWItY2h1bmsudHMiLCAiLi4vc3JjL3dvcmxkL2NodW5rL2NodW5rLnRzIiwgIi4uL3NyYy93b3JsZC9wcm92aWRlci9wcm92aWRlci50cyIsICIuLi9zcmMvd29ybGQvcHJvdmlkZXIvaW50ZXJuYWwudHMiLCAiLi4vc3JjL3dvcmxkL3Byb3ZpZGVyL2xldmVsZGIudHMiLCAiLi4vc3JjL3dvcmxkL2dlbmVyYXRvci9nZW5lcmF0b3IudHMiLCAiLi4vc3JjL3dvcmxkL2dlbmVyYXRvci93b3JrZXIvd29ya2VyLnRzIiwgIi4uL3NyYy93b3JsZC9nZW5lcmF0b3Ivd29ya2VyL2RlY29yYXRvci50cyIsICIuLi9zcmMvd29ybGQvZ2VuZXJhdG9yL3ZvaWQudHMiLCAiLi4vc3JjL3dvcmxkL2dlbmVyYXRvci9zdXBlcmZsYXQvZ2VuZXJhdG9yLnRzIiwgIi4uL3NyYy93b3JsZC9nZW5lcmF0b3Ivc3VwZXJmbGF0L3dvcmtlci50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vdHJhbnNmZXIudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL3N1bW1vbi50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4va2lsbC50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vc3RvcC50cyIsICIuLi9zcmMvY29tbWFuZHMvYWRtaW4vd29ybGQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2FkbWluL29wLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9hZG1pbi9kZW9wLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9hZG1pbi9zYXZlLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9hZG1pbi9pbmRleC50cyIsICIuLi9zcmMvY29tbWFuZHMvY29tbW9uL2Fib3V0LnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tb24vaW5kZXgudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbnNvbGUudHMiLCAiLi4vc3JjL2l0ZW0vcGFsZXR0ZS50cyIsICIuLi9zcmMvaXRlbS90cmFpdHMvaW5kZXgudHMiLCAiLi4vc3JjL2l0ZW0vdHJhaXRzL3RyYWl0LnRzIiwgIi4uL3NyYy9pdGVtL3RyYWl0cy9idW5kbGUudHMiLCAiLi4vc3JjL2l0ZW0vbWFwcy9uYnQtbWFwLnRzIiwgIi4uL3NyYy9pdGVtL3N0YWNrLnRzIiwgIi4uL3NyYy9pdGVtL3RyYWl0cy9lcXVpcHBhYmxlLnRzIiwgIi4uL3NyYy9pdGVtL3RyYWl0cy9lbmNoYW50YWJsZS50cyIsICIuLi9zcmMvaXRlbS9pbmRleC50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9pbmRleC50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy90cmFpdC50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9hdHRyaWJ1dGUvYXR0cmlidXRlLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL2F0dHJpYnV0ZS9tb3ZlbWVudC50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9hdHRyaWJ1dGUvaGVhbHRoLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL3BsYXllci90cmFpdC50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9wbGF5ZXIvY2h1bmstcmVuZGVyaW5nLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL3BsYXllci9lbnRpdHktcmVuZGVyaW5nLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL2ludmVudG9yeS50cyIsICIuLi9zcmMvZW50aXR5L2NvbnRhaW5lci50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9pdGVtLXN0YWNrLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL3BsYXllci9wbGF5ZXItbGlzdC50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9wbGF5ZXIvY3Vyc29yLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL3BsYXllci9zYXR1cmF0aW9uLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL3BsYXllci9odW5nZXIudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvcGxheWVyL2V4aGF1c3Rpb24udHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvZ3Jhdml0eS50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9jb2xsaXNpb24udHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvYWlyLXN1cHBseS50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy9uYW1ldGFnLnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL3BoeXNpY3MudHMiLCAiLi4vc3JjL2VudGl0eS90cmFpdHMvZWZmZWN0cy50cyIsICIuLi9zcmMvZW50aXR5L3RyYWl0cy92aXNpYmlsaXR5LnRzIiwgIi4uL3NyYy9lbnRpdHkvdHJhaXRzL2VxdWlwbWVudC50cyIsICIuLi9zcmMvZW50aXR5L21hcHMvbWV0YWRhdGEtbWFwLnRzIiwgIi4uL3NyYy9lbnRpdHkvbWFwcy9hY3Rvci1mbGFnLW1hcC50cyIsICIuLi9zcmMvZW50aXR5L21hcHMvYXR0cmlidXRlLW1hcC50cyIsICIuLi9zcmMvZW50aXR5L21hcHMvYWJpbGl0eS1tYXAudHMiLCAiLi4vc3JjL2VudGl0eS9wbGF5ZXIudHMiLCAiLi4vc3JjL2VudGl0eS9kZXZpY2UudHMiLCAiLi4vc3JjL2VudGl0eS9wYWxldHRlLnRzIiwgIi4uL3NyYy9lbnRpdHkvaW5kZXgudHMiLCAiLi4vc3JjL2hhbmRsZXJzL2l0ZW0tc3RhY2stcmVxdWVzdC50cyIsICIuLi9zcmMvaGFuZGxlcnMvbG9naW4udHMiLCAiLi4vc3JjL2hhbmRsZXJzL21vYi1lcXVpcG1lbnQudHMiLCAiLi4vc3JjL2hhbmRsZXJzL3BsYXllci1hY3Rpb24udHMiLCAiLi4vc3JjL2hhbmRsZXJzL3BsYXllci1hdXRoLWlucHV0LnRzIiwgIi4uL3NyYy9oYW5kbGVycy9yZXF1ZXN0LWNodW5rLXJhZGl1cy50cyIsICIuLi9zcmMvaGFuZGxlcnMvcmVxdWVzdC1uZXR3b3JrLXNldHRpbmdzLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9yZXNvdXJjZS1wYWNrLXJlc3BvbnNlLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9zZXQtbG9jYWwtcGxheWVyLWFzLWluaXRpYWxpemVkLnRzIiwgIi4uL3NyYy9oYW5kbGVycy90ZXh0LnRzIiwgIi4uL3NyYy9oYW5kbGVycy9jb21tYW5kLXJlcXVlc3QudHMiLCAiLi4vc3JjL2hhbmRsZXJzL2ludGVyYWN0LnRzIiwgIi4uL3NyYy9oYW5kbGVycy9yZXNwYXduLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9tb2RhbC1mb3JtLXJlc3BvbnNlLnRzIiwgIi4uL3NyYy9mb3Jtcy9mb3JtLnRzIiwgIi4uL3NyYy9mb3Jtcy9tZXNzYWdlLnRzIiwgIi4uL3NyYy9mb3Jtcy9hY3Rpb24udHMiLCAiLi4vc3JjL2Zvcm1zL21vZGFsLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9yZXF1ZXN0LXBlcm1pc3Npb25zLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9ibG9jay1waWNrLXJlcXVlc3QudHMiLCAiLi4vc3JjL2hhbmRsZXJzL2Vtb3RlLnRzIiwgIi4uL3NyYy9oYW5kbGVycy9pbmRleC50cyIsICIuLi9zcmMvcGVybWlzc2lvbnMvcGVybWlzc2lvbnMudHMiLCAiLi4vc3JjL2xvb3QvcG9vbC50cyIsICIuLi9zcmMvbG9vdC90YWJsZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHtcbiAgQ29tcHJlc3Npb25NZXRob2QsXG4gIE1JTkVDUkFGVF9WRVJTSU9OLFxuICBQUk9UT0NPTF9WRVJTSU9OXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uLCBSQUtORVRfVFBTIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuaW1wb3J0IEVtaXR0ZXIgZnJvbSBcIkBzZXJlbml0eWpzL2VtaXR0ZXJcIjtcblxuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gXCIuL25ldHdvcmtcIjtcbmltcG9ydCB7IEhhbmRsZXJzIH0gZnJvbSBcIi4vaGFuZGxlcnNcIjtcbmltcG9ydCB7XG4gIERlZmF1bHRXb3JsZFByb3ZpZGVyUHJvcGVydGllcyxcbiAgRGltZW5zaW9uLFxuICBTdXBlcmZsYXRHZW5lcmF0b3IsXG4gIHR5cGUgVGVycmFpbkdlbmVyYXRvcixcbiAgVm9pZEdlbmVyYXRvcixcbiAgV29ybGQsXG4gIHR5cGUgV29ybGRQcm92aWRlclxufSBmcm9tIFwiLi93b3JsZFwiO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4vZW50aXR5XCI7XG5pbXBvcnQgeyBDb25zb2xlSW50ZXJmYWNlLCBXb3JsZEVudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbnMgfSBmcm9tIFwiLi9wZXJtaXNzaW9uc1wiO1xuaW1wb3J0IHsgU2VydmVyRXZlbnQgfSBmcm9tIFwiLi9lbnVtc1wiO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFNlcnZlckV2ZW50cyxcbiAgU2VydmVyUHJvcGVydGllcyxcbiAgV29ybGRFdmVudFNpZ25hbHMsXG4gIFdvcmxkUHJvcGVydGllcyxcbiAgV29ybGRQcm92aWRlclByb3BlcnRpZXNcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgRGVmYXVsdFNlcnZlclByb3BlcnRpZXM6IFNlcnZlclByb3BlcnRpZXMgPSB7XG4gIHBvcnQ6IDE5MTMyLFxuICBhZGRyZXNzOiBcIjAuMC4wLjBcIixcbiAgbW90ZDogXCJTZXJlbml0eUpTXCIsXG4gIGNvbXByZXNzaW9uTWV0aG9kOiBDb21wcmVzc2lvbk1ldGhvZC5abGliLFxuICBjb21wcmVzc2lvblRocmVzaG9sZDogMjU2LFxuICBwYWNrZXRzUGVyRnJhbWU6IDY0LFxuICBwZXJtaXNzaW9uczogW10sXG4gIGRlZmF1bHRHZW5lcmF0b3I6IFZvaWRHZW5lcmF0b3IsXG4gIGRlYnVnTG9nZ2luZzogZmFsc2Vcbn07XG5cbmNsYXNzIFNlcmVuaXR5IGV4dGVuZHMgRW1pdHRlcjxXb3JsZEV2ZW50U2lnbmFscyAmIFNlcnZlckV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgYmVpbmcgdXNlZCBmb3IgdGhlIHNlcnZlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BlcnRpZXM6IFNlcnZlclByb3BlcnRpZXMgPSBEZWZhdWx0U2VydmVyUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgaGFuZGxlciBmb3IgdGhlIHNlcnZlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcms6IE5ldHdvcms7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZHMgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRlZCBvbiB0aGUgc2VydmVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ybGRzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmxkPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBwcm92aWRlcnMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm92aWRlcnMgPSBuZXcgTWFwPFxuICAgIHR5cGVvZiBXb3JsZFByb3ZpZGVyLFxuICAgIFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzXG4gID4oKTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgdGVycmFpbiBnZW5lcmF0b3JzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgc2VydmVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2VuZXJhdG9ycyA9IG5ldyBNYXA8c3RyaW5nLCB0eXBlb2YgVGVycmFpbkdlbmVyYXRvcj4oKTtcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHNlcnZlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJTZXJlbml0eVwiLCBMb2dnZXJDb2xvcnMuTWFnZW50YSk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcnMgPSBuZXcgTWFwPENvbm5lY3Rpb24sIFBsYXllcj4oKTtcblxuICAvKipcbiAgICogVGhlIGNvbnNvbGUgY29tbWFuZCBpbnRlcmZhY2UgZm9yIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25zb2xlID0gbmV3IENvbnNvbGVJbnRlcmZhY2UodGhpcyk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHBlcm1pc3Npb25zOiBQZXJtaXNzaW9ucztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc2VydmVyIGlzIGN1cnJlbnRseSBydW5uaW5nIG9yIG5vdFxuICAgKi9cbiAgcHVibGljIGFsaXZlID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIHRpY2tzIHRoYXQgaGF2ZSBiZWVuIHJlY29yZGVkIGJ5IHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyB0aWNrczogQXJyYXk8bnVtYmVyPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB0aWNrcyBwZXIgc2Vjb25kIG9mIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyB0cHMgPSAwO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHNlcmVuaXR5IHNlcnZlciB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllc1xuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzPzogUGFydGlhbDxTZXJ2ZXJQcm9wZXJ0aWVzPikge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHByb3BlcnRpZXMgdG8gdGhlIHNlcnZlciB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7IC4uLkRlZmF1bHRTZXJ2ZXJQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICAvLyBTZXQgdGhlIGVuYWJsZWQgdmFsdWUgZm9yIGRlYnVnIGxvZ2dpbmdcbiAgICBMb2dnZXIuREVCVUcgPSB0aGlzLnByb3BlcnRpZXMuZGVidWdMb2dnaW5nO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG5ldHdvcmsgaGFuZGxlciBmb3IgdGhlIHNlcnZlclxuICAgIHRoaXMubmV0d29yayA9IG5ldyBOZXR3b3JrKHRoaXMsIEhhbmRsZXJzKTtcblxuICAgIC8vIFNldCB0aGUgbW90ZCBmb3IgdGhlIHNlcnZlclxuICAgIHRoaXMubmV0d29yay5yYWtuZXQubWVzc2FnZSA9IHRoaXMucHJvcGVydGllcy5tb3RkO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGRlZmF1bHQgdGVycmFpbiBnZW5lcmF0b3JzXG4gICAgdGhpcy5yZWdpc3RlckdlbmVyYXRvcihWb2lkR2VuZXJhdG9yKTtcbiAgICB0aGlzLnJlZ2lzdGVyR2VuZXJhdG9yKFN1cGVyZmxhdEdlbmVyYXRvcik7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHBlcm1pc3Npb25zIG1hcCBmb3IgdGhlIHNlcnZlclxuICAgIHRoaXMucGVybWlzc2lvbnMgPVxuICAgICAgdHlwZW9mIHRoaXMucHJvcGVydGllcy5wZXJtaXNzaW9ucyA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IFBlcm1pc3Npb25zLmZyb21QYXRoKHRoaXMsIHRoaXMucHJvcGVydGllcy5wZXJtaXNzaW9ucylcbiAgICAgICAgOiBuZXcgUGVybWlzc2lvbnModGhpcywgeyBwZXJtaXNzaW9uczogdGhpcy5wcm9wZXJ0aWVzLnBlcm1pc3Npb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgc2VydmVyIGFuZCBiZWdpbnMgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHRoZSByYWtuZXQgc2VydmVyXG4gICAgdGhpcy5uZXR3b3JrLnJha25ldC5zdGFydChmYWxzZSk7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBsYXN0IHRpY2sgdmFyaWFibGVcbiAgICBsZXQgbGFzdFRpY2sgPSBwcm9jZXNzLmhydGltZSgpO1xuXG4gICAgY29uc3QgVFBTID0gMjA7XG5cbiAgICAvLyBDcmVhdGUgYSB0aWNraW5nIGxvb3AgdGhhdCB3aWxsIHJ1biBldmVyeSA1MG1zXG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzZXJ2ZXIgaXMgc3RpbGwgYWxpdmVcbiAgICAgIGlmICghdGhpcy5hbGl2ZSkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZVxuICAgICAgY29uc3QgW3NlY29uZHMsIG5hbm9zZWNvbmRzXSA9IHByb2Nlc3MuaHJ0aW1lKGxhc3RUaWNrKTtcbiAgICAgIGNvbnN0IGRlbHRhID0gc2Vjb25kcyArIG5hbm9zZWNvbmRzIC8gMWU5O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc2VydmVyIHNob3VsZCB0aWNrIHRoZSByYWtuZXQgY29ubmVjdGlvbnNcbiAgICAgIGlmIChkZWx0YSA+PSAxIC8gUkFLTkVUX1RQUykge1xuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBjb25uZWN0aW9ucyBhbmQgdGljayB0aGUgY29ubmVjdGlvblxuICAgICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5uZXR3b3JrLnJha25ldC5jb25uZWN0aW9ucy52YWx1ZXMoKSlcbiAgICAgICAgICBjb25uZWN0aW9uLnRpY2soKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlcnZlciBzaG91bGQgdGlja1xuICAgICAgaWYgKGRlbHRhID49IDEgLyBUUFMpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBsYXN0IHRpY2sgdG8gdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICBsYXN0VGljayA9IHByb2Nlc3MuaHJ0aW1lKCk7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZWx0YSB0aW1lXG4gICAgICAgIGNvbnN0IGRlbHRhVGljayA9IGRlbHRhICogMTAwMDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHNlcnZlciB0cHNcbiAgICAgICAgdGhpcy50aWNrcy5wdXNoKERhdGUubm93KCkpO1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSBEYXRlLm5vdygpIC0gMTAwMDtcbiAgICAgICAgdGhpcy50aWNrcyA9IHRoaXMudGlja3MuZmlsdGVyKCh0aWNrKSA9PiB0aWNrID4gdGhyZXNob2xkKTtcbiAgICAgICAgdGhpcy50cHMgPSB0aGlzLnRpY2tzLmxlbmd0aDtcblxuICAgICAgICAvLyBUaWNrIGFsbCB0aGUgd29ybGRzXG4gICAgICAgIGZvciAoY29uc3Qgd29ybGQgb2YgdGhpcy53b3JsZHMudmFsdWVzKCkpXG4gICAgICAgICAgd29ybGQub25UaWNrKE1hdGguZmxvb3IoZGVsdGFUaWNrKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNjaGVkdWxlIHRoZSBuZXh0IHRpY2tcbiAgICAgIHNldEltbWVkaWF0ZSh0aWNrKTtcbiAgICB9O1xuXG4gICAgLy8gU3RhcnQgdGhlIHRpY2tpbmcgbG9vcFxuICAgIHRpY2soKTtcblxuICAgIC8vIEVtaXQgdGhlIHNlcnZlciBzdGFydHVwIGV2ZW50XG4gICAgdGhpcy5lbWl0KFNlcnZlckV2ZW50LlN0YXJ0LCAwIGFzIG5ldmVyKTtcblxuICAgIC8vIExvZyB0aGF0IHRoZSBzZXJ2ZXIgaXMgbm93IHJ1bm5pbmdcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYMKnYVNlcnZlciBpcyBub3cgcnVubmluZyBhdCDCpzIke3RoaXMucHJvcGVydGllcy5hZGRyZXNzfcKnYTrCpzIke3RoaXMucHJvcGVydGllcy5wb3J0fcKnYS7Cp3Igwqc4KHYke01JTkVDUkFGVF9WRVJTSU9OfSwgcHJvdG8tdiR7UFJPVE9DT0xfVkVSU0lPTn0pwqdyYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHNlcnZlciBhbmQgY2xvc2VzIGFsbCBjb25uZWN0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gQ2xvc2UgdGhlIGNvbnNvbGUgaW50ZXJmYWNlXG4gICAgdGhpcy5jb25zb2xlLmludGVyZmFjZS5jbG9zZSgpO1xuXG4gICAgLy8gRW1pdCB0aGUgc2VydmVyIHNodXRkb3duIGV2ZW50XG4gICAgdGhpcy5lbWl0KFNlcnZlckV2ZW50LlN0b3AsIDAgYXMgbmV2ZXIpO1xuXG4gICAgLy8gRGlzY29ubmVjdCBhbGwgcGxheWVyc1xuICAgIGZvciAoY29uc3QgcGxheWVyIG9mIHRoaXMucGxheWVycy52YWx1ZXMoKSkge1xuICAgICAgLy8gV3JpdGUgdGhlIHBsYXllciBkYXRhIHRvIHRoZSB3b3JsZCBwcm92aWRlclxuICAgICAgcGxheWVyXG4gICAgICAgIC5nZXRXb3JsZCgpXG4gICAgICAgIC5wcm92aWRlci53cml0ZVBsYXllcihwbGF5ZXIuZ2V0RGF0YUVudHJ5KCksIHBsYXllci5kaW1lbnNpb24pO1xuXG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgc2VydmVyXG4gICAgICBwbGF5ZXIuZGlzY29ubmVjdChcIlNlcnZlciBjbG9zZWQuXCIpO1xuICAgIH1cblxuICAgIC8vIFNodXRkb3duIGFsbCB3b3JsZCBwcm92aWRlcnNcbiAgICBmb3IgKGNvbnN0IHdvcmxkIG9mIHRoaXMud29ybGRzLnZhbHVlcygpKSB3b3JsZC5wcm92aWRlci5vblNodXRkb3duKCk7XG5cbiAgICAvLyBTZXQgdGhlIHNlcnZlciB0byBub3QgYmUgYWxpdmVcbiAgICB0aGlzLmFsaXZlID0gZmFsc2U7XG5cbiAgICAvLyBTdG9wIHRoZSByYWtuZXQgc2VydmVyXG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB0aGlzLm5ldHdvcmsucmFrbmV0LnN0b3AoKSk7XG5cbiAgICAvLyBMb2cgdGhhdCB0aGUgc2VydmVyIGhhcyBiZWVuIHN0b3BwZWRcbiAgICB0aGlzLmxvZ2dlci5pbmZvKGDCp2NTZXJ2ZXIgaGFzIGJlZW4gc3RvcHBlZC7Cp3JgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBtZXNzYWdlIG9mIHRoZSBkYXkgZm9yIHRoZSBzZXJ2ZXJcbiAgICogQHBhcmFtIG1vdGQgVGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNb3RkKG1vdGQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubmV0d29yay5yYWtuZXQubWVzc2FnZSA9IG1vdGQ7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgcHJvdmlkZXIgd2l0aCB0aGUgc2VydmVyXG4gICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gdXNlIGZvciB0aGUgcHJvdmlkZXJcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcHJvdmlkZXIgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIG9yIG5vdFxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyUHJvdmlkZXIoXG4gICAgcHJvdmlkZXI6IHR5cGVvZiBXb3JsZFByb3ZpZGVyLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzPlxuICApOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgaWYgKHRoaXMucHJvdmlkZXJzLmhhcyhwcm92aWRlcikpIHtcbiAgICAgIC8vIExvZyB0aGF0IHRoZSBwcm92aWRlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBQcm92aWRlciBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7cHJvdmlkZXIuaWRlbnRpZmllcn1gKTtcblxuICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZSBwcm92aWRlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIHByb3ZpZGVyLCBjYXRjaCBhbnkgZXJyb3JzXG4gICAgdHJ5IHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHByb3ZpZGVyXG4gICAgICBwcm92aWRlci5pbml0aWFsaXplKHRoaXMsIHtcbiAgICAgICAgLi4uRGVmYXVsdFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzLFxuICAgICAgICAuLi5wcm9wZXJ0aWVzXG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIHRoZSBwcm92aWRlciB0byB0aGUgcmVnaXN0ZXJlZCBwcm92aWRlcnNcbiAgICAgIHRoaXMucHJvdmlkZXJzLnNldChwcm92aWRlciwge1xuICAgICAgICAuLi5EZWZhdWx0V29ybGRQcm92aWRlclByb3BlcnRpZXMsXG4gICAgICAgIC4uLnByb3BlcnRpZXNcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2cgdGhhdCB0aGUgcHJvdmlkZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZFxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFJlZ2lzdGVyZWQgcHJvdmlkZXI6ICR7cHJvdmlkZXIuaWRlbnRpZmllcn1gKTtcblxuICAgICAgLy8gQWRkIHRoZSBwcm92aWRlciB0byB0aGUgc2VydmVyXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlZ2lzdGVyIHByb3ZpZGVyOiAke3Byb3ZpZGVyLmlkZW50aWZpZXJ9YCxcbiAgICAgICAgcmVhc29uXG4gICAgICApO1xuXG4gICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIHByb3ZpZGVyIGZhaWxlZCB0byByZWdpc3RlclxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckdlbmVyYXRvcihnZW5lcmF0b3I6IHR5cGVvZiBUZXJyYWluR2VuZXJhdG9yKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGdlbmVyYXRvciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICBpZiAodGhpcy5nZW5lcmF0b3JzLmhhcyhnZW5lcmF0b3IuaWRlbnRpZmllcikpIHtcbiAgICAgIC8vIExvZyB0aGF0IHRoZSBnZW5lcmF0b3IgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEdlbmVyYXRvciBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7Z2VuZXJhdG9yLmlkZW50aWZpZXJ9YFxuICAgICAgKTtcblxuICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZSBnZW5lcmF0b3IgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBnZW5lcmF0b3IgdG8gdGhlIHJlZ2lzdGVyZWQgZ2VuZXJhdG9yc1xuICAgIHRoaXMuZ2VuZXJhdG9ycy5zZXQoZ2VuZXJhdG9yLmlkZW50aWZpZXIsIGdlbmVyYXRvcik7XG5cbiAgICAvLyBMb2cgdGhhdCB0aGUgZ2VuZXJhdG9yIGhhcyBiZWVuIHJlZ2lzdGVyZWRcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgUmVnaXN0ZXJlZCBnZW5lcmF0b3I6ICR7Z2VuZXJhdG9yLmlkZW50aWZpZXJ9YCk7XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2VuZXJhdG9yIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldEdlbmVyYXRvcihpZGVudGlmaWVyOiBzdHJpbmcpOiB0eXBlb2YgVGVycmFpbkdlbmVyYXRvciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRvcnMuZ2V0KGlkZW50aWZpZXIpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB3b3JsZCB1c2luZyB0aGUgc3BlY2lmaWVkIHByb3ZpZGVyXG4gICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdG8gdXNlIGZvciB0aGUgd29ybGRcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gdXNlIGZvciB0aGUgd29ybGRcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgd29ybGQsIGlmIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSwgZmFsc2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVXb3JsZChcbiAgICBwcm92aWRlcjogdHlwZW9mIFdvcmxkUHJvdmlkZXIsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8V29ybGRQcm9wZXJ0aWVzPlxuICApOiBXb3JsZCB8IGZhbHNlIHtcbiAgICAvLyBHZXQgdGhlIHByb3ZpZGVyIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVnaXN0ZXJlZCBwcm92aWRlcnNcbiAgICBjb25zdCBwcm92aWRlclByb3BlcnRpZXMgPSB0aGlzLnByb3ZpZGVycy5nZXQocHJvdmlkZXIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWRcbiAgICBpZiAoIXByb3ZpZGVyUHJvcGVydGllcykge1xuICAgICAgLy8gTG9nIHRoYXQgdGhlIHByb3ZpZGVyIGlzIG5vdCByZWdpc3RlcmVkXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgd29ybGQsIGFzIHRoZSBnaXZlbiBwcm92aWRlciBpcyBub3QgcmVnaXN0ZXJlZDogJHtwcm92aWRlci5pZGVudGlmaWVyfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgcHJvdmlkZXIgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgd29ybGQgdXNpbmcgdGhlIHByb3ZpZGVyXG4gICAgY29uc3Qgd29ybGQgPSBwcm92aWRlci5jcmVhdGUodGhpcywgcHJvdmlkZXJQcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSB3b3JsZCB3aXRoIHRoZSBzZXJ2ZXJcbiAgICB0aGlzLnJlZ2lzdGVyV29ybGQod29ybGQpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjcmVhdGVkIHdvcmxkXG4gICAgcmV0dXJuIHdvcmxkO1xuICB9XG5cbiAgcHVibGljIGdldFdvcmxkKCk6IFdvcmxkO1xuICBwdWJsaWMgZ2V0V29ybGQoaWRlbnRpZmllcjogc3RyaW5nKTogV29ybGQgfCBudWxsO1xuICBwdWJsaWMgZ2V0V29ybGQoaWRlbnRpZmllcj86IHN0cmluZyk6IFdvcmxkIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGlkZW50aWZpZXIgaXMgbm90IHByb3ZpZGVkXG4gICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICAvLyBHZXQgdGhlIGZpcnN0IHdvcmxkIGZyb20gdGhlIHdvcmxkcyBtYXBcbiAgICAgIHJldHVybiB0aGlzLndvcmxkcy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHdvcmxkIGZyb20gdGhlIHdvcmxkcyBtYXBcbiAgICByZXR1cm4gdGhpcy53b3JsZHMuZ2V0KGlkZW50aWZpZXIpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgdGhlIHdvcmxkcyB0aGF0IGFyZSBjdXJyZW50bHkgbG9hZGVkIG9uIHRoZSBzZXJ2ZXJcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2Ygd29ybGRzXG4gICAqL1xuICBwdWJsaWMgZ2V0V29ybGRzKCk6IEFycmF5PFdvcmxkPiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmxkcy52YWx1ZXMoKV07XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJXb3JsZCh3b3JsZDogV29ybGQpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgd29ybGQgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgaWYgKHRoaXMud29ybGRzLmhhcyh3b3JsZC5pZGVudGlmaWVyKSkge1xuICAgICAgLy8gTG9nIHRoYXQgdGhlIHdvcmxkIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYFdvcmxkIGFscmVhZHkgcmVnaXN0ZXJlZDogJHt3b3JsZC5pZGVudGlmaWVyfWApO1xuXG4gICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIHdvcmxkIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgd29ybGQgdG8gdGhlIHJlZ2lzdGVyZWQgd29ybGRzXG4gICAgdGhpcy53b3JsZHMuc2V0KHdvcmxkLmlkZW50aWZpZXIsIHdvcmxkKTtcblxuICAgIC8vIExvZyB0aGF0IHRoZSB3b3JsZCBoYXMgYmVlbiByZWdpc3RlcmVkXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFJlZ2lzdGVyZWQgd29ybGQ6ICR7d29ybGQuaWRlbnRpZmllcn1gKTtcblxuICAgIC8vIENhbGwgdGhlIG9uU3RhcnR1cCBtZXRob2Qgb2YgdGhlIHdvcmxkIHByb3ZpZGVyXG4gICAgd29ybGQucHJvdmlkZXIub25TdGFydHVwKCk7XG5cbiAgICAvLyBBZGQgdGhlIHdvcmxkIHRvIHRoZSB3b3JsZHMgZW51bVxuICAgIFdvcmxkRW51bS5vcHRpb25zLnB1c2god29ybGQuaWRlbnRpZmllcik7XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgd29ybGQgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGRpbWVuc2lvbiBmcm9tIGEgd29ybGQgYnkgaXRzIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHdvcmxkIFRoZSB3b3JsZCB0byBnZXQgdGhlIGRpbWVuc2lvbiBmcm9tXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkaW1lbnNpb25cbiAgICogQHJldHVybnMgVGhlIGRpbWVuc2lvbiwgaWYgZm91bmQ7IG90aGVyd2lzZSwgbnVsbFxuICAgKi9cbiAgcHVibGljIGdldERpbWVuc2lvbih3b3JsZDogV29ybGQsIGlkZW50aWZpZXI6IHN0cmluZyk6IERpbWVuc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB3b3JsZC5kaW1lbnNpb25zLmdldChpZGVudGlmaWVyKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSBkaW1lbnNpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBsb2FkZWQgaW4gYSB3b3JsZFxuICAgKiBAcGFyYW0gd29ybGQgVGhlIHdvcmxkIHRvIGdldCB0aGUgZGltZW5zaW9ucyBmcm9tXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGRpbWVuc2lvbnNcbiAgICovXG4gIHB1YmxpYyBnZXREaW1lbnNpb25zKHdvcmxkOiBXb3JsZCk6IEFycmF5PERpbWVuc2lvbj4ge1xuICAgIHJldHVybiBbLi4ud29ybGQuZGltZW5zaW9ucy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHBsYXllciBieSB0aGVpciByYWtuZXQgY29ubmVjdGlvblxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byBnZXQgdGhlIHBsYXllciBmcm9tXG4gICAqIEByZXR1cm5zIFRoZSBwbGF5ZXIsIGlmIGZvdW5kOyBvdGhlcndpc2UsIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IFBsYXllciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBsYXllcnMuZ2V0KGNvbm5lY3Rpb24pID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHBsYXllciBieSB0aGVpciB4dWlkXG4gICAqIEBwYXJhbSB4dWlkIFRoZSB4dWlkIHRvIGdldCB0aGUgcGxheWVyIGZyb21cbiAgICogQHJldHVybnMgVGhlIHBsYXllciwgaWYgZm91bmQ7IG90aGVyd2lzZSwgbnVsbFxuICAgKi9cbiAgcHVibGljIGdldFBsYXllckJ5WHVpZCh4dWlkOiBzdHJpbmcpOiBQbGF5ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gKFxuICAgICAgWy4uLnRoaXMucGxheWVycy52YWx1ZXMoKV0uZmluZCgocGxheWVyKSA9PiBwbGF5ZXIueHVpZCA9PT0geHVpZCkgPz8gbnVsbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHBsYXllciBieSB0aGVpciB1c2VybmFtZVxuICAgKiBAcGFyYW0gdXNlcm5hbWUgVGhlIHVzZXJuYW1lIHRvIGdldCB0aGUgcGxheWVyIGZyb21cbiAgICogQHJldHVybnMgVGhlIHBsYXllciwgaWYgZm91bmQ7IG90aGVyd2lzZSwgbnVsbFxuICAgKi9cbiAgcHVibGljIGdldFBsYXllckJ5VXNlcm5hbWUodXNlcm5hbWU6IHN0cmluZyk6IFBsYXllciB8IG51bGwge1xuICAgIHJldHVybiAoXG4gICAgICBbLi4udGhpcy5wbGF5ZXJzLnZhbHVlcygpXS5maW5kKFxuICAgICAgICAocGxheWVyKSA9PiBwbGF5ZXIudXNlcm5hbWUgPT09IHVzZXJuYW1lXG4gICAgICApID8/IG51bGxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBwbGF5ZXIgYnkgdGhlaXIgdXVpZFxuICAgKiBAcGFyYW0gdXVpZCBUaGUgdXVpZCB0byBnZXQgdGhlIHBsYXllciBmcm9tXG4gICAqIEByZXR1cm5zIFRoZSBwbGF5ZXIsIGlmIGZvdW5kOyBvdGhlcndpc2UsIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXRQbGF5ZXJCeVV1aWQodXVpZDogc3RyaW5nKTogUGxheWVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIChcbiAgICAgIFsuLi50aGlzLnBsYXllcnMudmFsdWVzKCldLmZpbmQoKHBsYXllcikgPT4gcGxheWVyLnV1aWQgPT09IHV1aWQpID8/IG51bGxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSBwbGF5ZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlclxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBwbGF5ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0UGxheWVycygpOiBBcnJheTxQbGF5ZXI+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMucGxheWVycy52YWx1ZXMoKV07XG4gIH1cbn1cblxuZXhwb3J0IHsgU2VyZW5pdHkgfTtcbiIsICJpbXBvcnQgeyBkZWZsYXRlUmF3U3luYywgaW5mbGF0ZVJhd1N5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5cbmltcG9ydCB7IEVtaXR0ZXIgfSBmcm9tIFwiQHNlcmVuaXR5anMvZW1pdHRlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25uZWN0aW9uLFxuICBGcmFtZSxcbiAgUHJpb3JpdHksXG4gIFJlbGlhYmlsaXR5LFxuICBTZXJ2ZXJcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICBDb21wcmVzc2lvbk1ldGhvZCxcbiAgdHlwZSBEYXRhUGFja2V0LFxuICBEaXNjb25uZWN0TWVzc2FnZSxcbiAgRGlzY29ubmVjdFBhY2tldCxcbiAgRGlzY29ubmVjdFJlYXNvbixcbiAgRnJhbWVyLFxuICBnZXRQYWNrZXRJZCxcbiAgUGFja2V0LFxuICBQYWNrZXRzXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrQm91bmQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VyZW5pdHkgfSBmcm9tIFwiLi4vc2VyZW5pdHlcIjtcbmltcG9ydCB0eXBlIHsgTmV0d29ya0V2ZW50cywgU2VydmVyUHJvcGVydGllcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbnRlcmZhY2UgQ29ubmVjdGlvblByb3BlcnRpZXMge1xuICBjb21wcmVzc2lvbjogYm9vbGVhbjtcbiAgZW5jcnlwdGlvbjogYm9vbGVhbjtcbn1cblxuY29uc3QgRGVmYXVsdFByb3BlcnRpZXM6IENvbm5lY3Rpb25Qcm9wZXJ0aWVzID0ge1xuICBjb21wcmVzc2lvbjogZmFsc2UsXG4gIGVuY3J5cHRpb246IGZhbHNlXG59O1xuXG5jbGFzcyBOZXR3b3JrIGV4dGVuZHMgRW1pdHRlcjxOZXR3b3JrRXZlbnRzPiB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2UgdGhhdCBpcyBiZWluZyB1c2VkIHRvIGhhbmRsZSBpbmNvbWluZyBwYWNrZXRzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcmFrbmV0IGluc3RhbmNlIHRoYXQgaXMgYmVpbmcgdXNlZCB0byBoYW5kbGUgaW5jb21pbmcgcGFja2V0c1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJha25ldDogU2VydmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyB0aGF0IGFyZSBiZWluZyB1c2VkIGZvciB0aGUgbmV0d29ya1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BlcnRpZXM6IFNlcnZlclByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgdGhhdCBpcyBiZWluZyB1c2VkIHRvIGxvZyBuZXR3b3JrIGV2ZW50c1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJOZXR3b3JrXCIsIExvZ2dlckNvbG9ycy5CbHVlKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgY29ubmVjdGlvbnMgdGhhdCBhcmUgYmVpbmcgaGFuZGxlZCBieSB0aGUgbmV0d29ya1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25zID0gbmV3IE1hcDxDb25uZWN0aW9uLCBDb25uZWN0aW9uUHJvcGVydGllcz4oKTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMgdGhhdCBhcmUgYmVpbmcgdXNlZCB0byBoYW5kbGUgaW5jb21pbmcgcGFja2V0c1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXJzID0gbmV3IFNldDx0eXBlb2YgTmV0d29ya0hhbmRsZXI+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbmV0d29yayBoYW5kbGVyIGZvciBhIHJha25ldCBzZXJ2ZXJcbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBpbnN0YW5jZSB0byBoYW5kbGUgaW5jb21pbmcgcGFja2V0cyB3aXRoXG4gICAqIEBwYXJhbSBoYW5kbGVycyBUaGUgaGFuZGxlcnMgdG8gcmVnaXN0ZXIgdG8gdGhlIG5ldHdvcmtcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgaGFuZGxlcnM/OiBBcnJheTx0eXBlb2YgTmV0d29ya0hhbmRsZXI+XG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHNlcmVuaXR5IGluc3RhbmNlIHRvIHRoZSBuZXR3b3JrXG4gICAgdGhpcy5zZXJlbml0eSA9IHNlcmVuaXR5O1xuXG4gICAgLy8gQXNzaWduIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBuZXR3b3JrIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHNlcmVuaXR5LnByb3BlcnRpZXM7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgcmFrbmV0IHNlcnZlciBmb3IgdGhlIG5ldHdvcmsgaGFuZGxlclxuICAgIHRoaXMucmFrbmV0ID0gbmV3IFNlcnZlcihcbiAgICAgIHRoaXMucHJvcGVydGllcy5hZGRyZXNzLFxuICAgICAgdGhpcy5wcm9wZXJ0aWVzLnBvcnQsXG4gICAgICAxMDAwLFxuICAgICAgNDAwXG4gICAgKTtcblxuICAgIC8vIEJpbmQgdGhlIGluY29taW5nIHBhY2tldHMgdG8gdGhlIGluY29taW5nIG1ldGhvZFxuICAgIHRoaXMucmFrbmV0Lm9uKFwiZW5jYXBzdWxhdGVkXCIsIHRoaXMub25FbmNhcHN1bGF0ZWQuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBCaW5kIHRoZSBpbmNvbWluZyBjb25uZWN0aW9ucyB0byB0aGUgY29ubmVjdCBtZXRob2RcbiAgICB0aGlzLnJha25ldC5vbihcImNvbm5lY3RcIiwgdGhpcy5vbkNvbm5lY3QuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBCaW5kIHRoZSBpbmNvbWluZyBkaXNjb25uZWN0aW9ucyB0byB0aGUgZGlzY29ubmVjdCBtZXRob2RcbiAgICB0aGlzLnJha25ldC5vbihcImRpc2Nvbm5lY3RcIiwgdGhpcy5vbkRpc2Nvbm5lY3QuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgaGFuZGxlcnMgdG8gdGhlIG5ldHdvcmtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMgfHwgW10pIHRoaXMucmVnaXN0ZXJIYW5kbGVyKGhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBoYW5kbGVyIHRvIHRoZSBuZXR3b3JrXG4gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIHJlZ2lzdGVyIHRvIHRoZSBuZXR3b3JrXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJIYW5kbGVyKGhhbmRsZXI6IHR5cGVvZiBOZXR3b3JrSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgaGFuZGxlciBmcm9tIHRoZSBuZXR3b3JrXG4gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIHRvIHVucmVnaXN0ZXIgZnJvbSB0aGUgbmV0d29ya1xuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJIYW5kbGVyKGhhbmRsZXI6IHR5cGVvZiBOZXR3b3JrSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYWxsIGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhlIHJha25ldCBzZXJ2ZXJcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdGhhdCBpcyBiZWluZyBlc3RhYmxpc2hlZFxuICAgKi9cbiAgcHVibGljIG9uQ29ubmVjdChjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb24pKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY29ubmVjdGlvbiBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgY29uc3Qgb2JqZWN0ID0geyAuLi5EZWZhdWx0UHJvcGVydGllcyB9IGFzIENvbm5lY3Rpb25Qcm9wZXJ0aWVzO1xuXG4gICAgLy8gQWRkIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBjb25uZWN0aW9ucyBtYXBcbiAgICB0aGlzLmNvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uLCBvYmplY3QpO1xuXG4gICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSB0aGF0IGEgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZFxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYENvbm5lY3Rpb24gZXN0YWJsaXNoZWQgd2l0aCAke2Nvbm5lY3Rpb24ucmluZm8uYWRkcmVzc306JHtjb25uZWN0aW9uLnJpbmZvLnBvcnR9YFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhbGwgZGlzY29ubmVjdGlvbnMgZnJvbSB0aGUgcmFrbmV0IHNlcnZlclxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0aGF0IGlzIGJlaW5nIGRpc2Nvbm5lY3RlZFxuICAgKi9cbiAgcHVibGljIG9uRGlzY29ubmVjdChjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW4gdGhlIGNvbm5lY3Rpb25zIG1hcFxuICAgIGlmICghdGhpcy5jb25uZWN0aW9ucy5oYXMoY29ubmVjdGlvbikpIHJldHVybjtcblxuICAgIC8vIENyZWF0ZSBhIGR1bW15IGRpc2Nvbm5lY3QgcGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IERpc2Nvbm5lY3RQYWNrZXQoKTtcbiAgICBwYWNrZXQucmVhc29uID0gRGlzY29ubmVjdFJlYXNvbi5EaXNjb25uZWN0ZWQ7XG4gICAgcGFja2V0LmhpZGVEaXNjb25uZWN0U2NyZWVuID0gdHJ1ZTtcblxuICAgIC8vIFRoZW4gd2Ugd2lsbCBjcmVhdGUgYSBkdW1teSBwYXlsb2FkLlxuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuZnJvbShbXG4gICAgICAweGZlLFxuICAgICAgQ29tcHJlc3Npb25NZXRob2QuTm9uZSxcbiAgICAgIC4uLkZyYW1lci5mcmFtZShwYWNrZXQuc2VyaWFsaXplKCkpXG4gICAgXSk7XG5cbiAgICAvLyBGaW5hbGx5IHdlIHdpbGwgY2FsbCB0aGUgb25FbmNhcHN1bGF0ZWQgbWV0aG9kIHdpdGggdGhlIGR1bW15IHBheWxvYWQuXG4gICAgdGhpcy5vbkVuY2Fwc3VsYXRlZChjb25uZWN0aW9uLCBwYXlsb2FkKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBjb25uZWN0aW9ucyBtYXBcbiAgICB0aGlzLmNvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBwbGF5ZXJzIG1hcFxuICAgIHRoaXMuc2VyZW5pdHkucGxheWVycy5kZWxldGUoY29ubmVjdGlvbik7XG5cbiAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIHRoYXQgYSBjb25uZWN0aW9uIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZFxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYENvbm5lY3Rpb24gZGlzY29ubmVjdGVkIHdpdGggJHtjb25uZWN0aW9uLnJpbmZvLmFkZHJlc3N9OiR7Y29ubmVjdGlvbi5yaW5mby5wb3J0fWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYWxsIGluY29taW5nIHBhY2tldCB0cmFmZmljIGZyb20gdGhlIHJha25ldCBzZXJ2ZXJcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIHJha25ldCBjb25uZWN0aW9uIHRoZSBkYXRhIGlzIGNvbWluZyBmcm9tXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIGJ1ZmZlcnMgdGhhdCBhcmUgYmVpbmcgc2VudCBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25FbmNhcHN1bGF0ZWQoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgLi4uZGF0YTogQXJyYXk8QnVmZmVyPik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgY29ubmVjdGlvbiBvYmplY3QgZnJvbSB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb24pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGluIHRoZSBjb25uZWN0aW9ucyBtYXBcbiAgICBpZiAoIXByb3BlcnRpZXMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiUmVjZWl2ZWQgZGF0YSBmcm9tIGEgY29ubmVjdGlvbiB0aGF0IGlzIG5vdCBhIHJlZ2lzdGVyZWQgY29ubmVjdGlvbi5cIlxuICAgICAgKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRhdGEgYnVmZmVycyB0aGF0IGFyZSBiZWluZyBzZW50XG4gICAgZm9yIChjb25zdCBidWZmZXIgb2YgZGF0YSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IGJ5dGUgaXMgYSBoZWFkZXIgZm9yIGEgbWluZWNyYWZ0IHBhY2tldFxuICAgICAgaWYgKGJ1ZmZlclswXSAhPT0gMHhmZSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWNrZXQgaGVhZGVyXCIpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBlbmNyeXB0ZWQuXG4gICAgICAvLyBOT1RFOiBFbmNyeXB0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIFNvIHdlIHdpbGwganVzdCBoYW5kbGUgdGhlIHBhY2tldCBhcyBpZiBpdCB3YXMgbm90IGVuY3J5cHRlZC5cbiAgICAgIC8vIFRPRE86IEltcGxlbWVudCBlbmNyeXB0aW9uIGZvciB0aGUgY29ubmVjdGlvbi5cbiAgICAgIGxldCBkZWNyeXB0ZWQgPSBwcm9wZXJ0aWVzLmVuY3J5cHRpb25cbiAgICAgICAgPyBidWZmZXIuc3ViYXJyYXkoMSlcbiAgICAgICAgOiBidWZmZXIuc3ViYXJyYXkoMSk7XG5cbiAgICAgIC8vIEdldCB0aGUgY29tcHJlc3Npb24gYnl0ZSBmcm9tIHRoZSBkZWNyeXB0ZWQgYnVmZmVyLlxuICAgICAgY29uc3QgY29tcHJlc3Npb24gPSBkZWNyeXB0ZWRbMF0gYXMgbnVtYmVyO1xuXG4gICAgICAvLyBTb21lIHBhY2tldHMgaGF2ZSBhIGJ5dGUgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uXG4gICAgICAvLyBSZWFkIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gZnJvbSB0aGUgYnVmZmVyLlxuICAgICAgY29uc3QgYWxnb3JpdGhtOiBDb21wcmVzc2lvbk1ldGhvZCA9IENvbXByZXNzaW9uTWV0aG9kW2NvbXByZXNzaW9uXVxuICAgICAgICA/IGRlY3J5cHRlZC5yZWFkVWludDgoKVxuICAgICAgICA6IENvbXByZXNzaW9uTWV0aG9kLk5vdFByZXNlbnQ7XG5cbiAgICAgIGlmIChhbGdvcml0aG0gIT09IENvbXByZXNzaW9uTWV0aG9kLk5vdFByZXNlbnQpXG4gICAgICAgIGRlY3J5cHRlZCA9IGRlY3J5cHRlZC5zdWJhcnJheSgxKTtcblxuICAgICAgLy8gSW5mbGF0ZSB0aGUgYnVmZmVyIGJhc2VkIG9uIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uXG4gICAgICBjb25zdCBpbmZsYXRlZCA9XG4gICAgICAgIGFsZ29yaXRobSA9PT0gQ29tcHJlc3Npb25NZXRob2QuTm9uZVxuICAgICAgICAgID8gZGVjcnlwdGVkXG4gICAgICAgICAgOiBhbGdvcml0aG0gPT09IENvbXByZXNzaW9uTWV0aG9kLk5vdFByZXNlbnRcbiAgICAgICAgICAgID8gZGVjcnlwdGVkXG4gICAgICAgICAgICA6IGFsZ29yaXRobSA9PT0gQ29tcHJlc3Npb25NZXRob2QuWmxpYlxuICAgICAgICAgICAgICA/IHRoaXMuaW5mbGF0ZVpsaWIoZGVjcnlwdGVkKVxuICAgICAgICAgICAgICA6IGFsZ29yaXRobSA9PT0gQ29tcHJlc3Npb25NZXRob2QuU25hcHB5XG4gICAgICAgICAgICAgICAgPyB0aGlzLmluZmxhdGVTbmFwcHkoZGVjcnlwdGVkKVxuICAgICAgICAgICAgICAgIDogZGVjcnlwdGVkO1xuXG4gICAgICAvLyBVbmZyYW1lIHRoZSBpbmZsYXRlZCBidWZmZXIuXG4gICAgICAvLyBCdWZmZXJzIGNhbiBjb250YWlucyBtdWx0aXBsZSBwYWNrZXRzLCBzbyB3ZSBuZWVkIHRvIHVuZnJhbWUgdGhlbS5cbiAgICAgIGNvbnN0IGZyYW1lcyA9IEZyYW1lci51bmZyYW1lKGluZmxhdGVkKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lcyBhbW91bnQgaXMgZ3JlYXRlciB0aGFuIHRoZSBwYWNrZXRzIHBlciBmcmFtZS5cbiAgICAgIC8vIElmIHNvLCB3ZSB3aWxsIGxvZyBhIHdhcm5pbmcgYW5kIGRpc2Nvbm5lY3QgdGhlIHNlc3Npb24uXG4gICAgICAvLyBUaGlzIGNvdWxkIGJlIGFuIGF0dGVtcHQgdG8gY3Jhc2ggdGhlIHNlcnZlciwgb3Igc29tZSBvdGhlciBtYWxpY2lvdXMgaW50ZW50LlxuICAgICAgaWYgKGZyYW1lcy5sZW5ndGggPiB0aGlzLnByb3BlcnRpZXMucGFja2V0c1BlckZyYW1lKSB7XG4gICAgICAgIC8vIExvZyBhIHdhcm5pbmcgaWYgdG9vIG1hbnkgcGFja2V0cyB3ZXJlIHNlbnQgYXQgb25jZS5cbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgUmVjZWl2ZWQgdG9vIG1hbnkgcGFja2V0cyBmcm9tIFwiJHtjb25uZWN0aW9uLnJpbmZvLmFkZHJlc3N9OiR7Y29ubmVjdGlvbi5yaW5mby5wb3J0fVwiLCBkaXNjb25uZWN0aW5nIHRoZSBzZXNzaW9uLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSBzZXNzaW9uIGlmIHRvbyBtYW55IHBhY2tldHMgd2VyZSBzZW50IGF0IG9uY2UuXG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZnJhbWVzIHRoYXQgd2VyZSB1bmZyYW1lZC5cbiAgICAgIC8vIEFuZCBwYXNzIHRoZSBwYWNrZXRzIHRvIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzLlxuICAgICAgZm9yIChjb25zdCBmcmFtZSBvZiBmcmFtZXMpIHtcbiAgICAgICAgLy8gUmVhZCB0aGUgcGFja2V0IGlkIGZyb20gdGhlIGZyYW1lLlxuICAgICAgICBjb25zdCBwYWNrZXRJZCA9IGdldFBhY2tldElkKGZyYW1lKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHBhY2tldCBmcm9tIHRoZSBwYWNrZXQgaWQuXG4gICAgICAgIGNvbnN0IHBhY2tldFR5cGUgPSBQYWNrZXRzW3BhY2tldElkXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm8gcGFja2V0IHdhcyBmb3VuZCBmb3IgdGhlIHBhY2tldCBpZC5cbiAgICAgICAgaWYgKCFwYWNrZXRUeXBlKSB7XG4gICAgICAgICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSBpZiBubyBwYWNrZXQgd2FzIGZvdW5kIGZvciB0aGUgcGFja2V0IGlkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYE5vIHBhY2tldCBzZXJpYWxpemVyL2Rlc2VyaWFsaXplciBmb3VuZCBmb3IgcGFja2V0IGlkICR7cGFja2V0SWR9LmBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2tpcCB0aGUgcGFja2V0IGlmIG5vIHBhY2tldCB3YXMgZm91bmQgZm9yIHRoZSBwYWNrZXQgaWQuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGRlc2VyaWFsaXplIHRoZSBwYWNrZXQgZnJvbSB0aGUgZnJhbWUuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRGVzZXJpYWxpemUgdGhlIHBhY2tldCBmcm9tIHRoZSBmcmFtZS5cbiAgICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgcGFja2V0VHlwZShmcmFtZSkuZGVzZXJpYWxpemUoKTtcblxuICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgcGFja2V0IGV2ZW50IGZvciB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy5cbiAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIGJvdW5kOiBOZXR3b3JrQm91bmQuU2VydmVyLFxuICAgICAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgICAgIHBhY2tldFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBFbWl0IHRoZSBwYWNrZXQgZXZlbnQgdG8gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMuXG4gICAgICAgICAgY29uc3QgbmV0d29yayA9IHRoaXMuZW1pdChwYWNrZXRJZCwgZXZlbnQpO1xuICAgICAgICAgIGNvbnN0IGFsbCA9IHRoaXMuZW1pdChcImFsbFwiLCBldmVudCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IHdhcyBjYW5jZWxsZWQgYnkgYW4gZXh0ZXJuYWwgbGlzdGVuZXIuXG4gICAgICAgICAgLy8gSWYgc28sIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzIHdpbGwgbm90IGJlIGNhbGxlZC5cbiAgICAgICAgICBpZiAoIW5ldHdvcmsgfHwgIWFsbCkge1xuICAgICAgICAgICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSBpZiB0aGUgcGFja2V0IHdhcyBjYW5jZWxsZWQgYnkgYW4gZXh0ZXJuYWwgbGlzdGVuZXIuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFBhY2tldCByZWNlaXZlZCB3aXRoIGlkICR7cGFja2V0SWR9IHdhcyBjYW5jZWxsZWQgYnkgYW4gZXh0ZXJuYWwgbGlzdGVuZXIuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGFja2V0IGlmIGl0IHdhcyBjYW5jZWxsZWQgYnkgYW4gZXh0ZXJuYWwgbGlzdGVuZXIuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgaGFuZGxlcnMgdGhhdCBoYXZlIGEgcGFja2V0IHRoYXQgbWF0Y2hlcyB0aGUgcGFja2V0IGlkLlxuICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gQXJyYXkuZnJvbSh0aGlzLmhhbmRsZXJzKS5maWx0ZXIoKGhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLnBhY2tldCA9PT0gcGFja2V0SWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBubyBoYW5kbGVycyB3ZXJlIGZvdW5kIGZvciB0aGUgcGFja2V0IGlkLlxuICAgICAgICAgIGlmIChoYW5kbGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIERlYnVnIGxvZyB0aGF0IG5vIGhhbmRsZXJzIHdlcmUgZm91bmQgZm9yIHRoZSBwYWNrZXQgaWQuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYE5vIGhhbmRsZXJzIGZvdW5kIGZvciBwYWNrZXQgJHtQYWNrZXRbcGFja2V0SWRdfSwgd2l0aCBpZCAke3BhY2tldElkfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBhY2tldCBpZiBubyBoYW5kbGVycyB3ZXJlIGZvdW5kIGZvciB0aGUgcGFja2V0IGlkLlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy5cbiAgICAgICAgICAvLyBBbmQgY2FsbCB0aGUgaGFuZGxlIG1ldGhvZCBmb3IgZWFjaCBoYW5kbGVyLlxuICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGhhbmRsZXIgaGFzIGEgcGFja2V0IHRoYXQgbWF0Y2hlcyB0aGUgcGFja2V0IGlkLlxuICAgICAgICAgICAgaWYgKGhhbmRsZXIucGFja2V0ID09PSBwYWNrZXRJZCkge1xuICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGhhbmRsZSB0aGUgcGFja2V0IHdpdGggdGhlIGhhbmRsZXIuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBoYW5kbGVyIHdpdGggdGhlIHNlcmVuaXR5IGluc3RhbmNlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGhhbmRsZXIodGhpcy5zZXJlbml0eSk7XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBoYW5kbGUgbWV0aG9kIGZvciB0aGUgaGFuZGxlci5cbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5oYW5kbGUocGFja2V0LCBjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9nIHRoZSBoYW5kbGluZyBlcnJvciBpZiB0aGUgcGFja2V0IGNvdWxkIG5vdCBiZSBoYW5kbGVkLlxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBoYW5kbGUgcGFja2V0IHdpdGggaWQgJHtwYWNrZXRJZH1gLFxuICAgICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgLy8gTG9nIHRoZSBkZXNlcmlhbGl6YXRpb24gZXJyb3IgaWYgdGhlIHBhY2tldCBjb3VsZCBub3QgYmUgZGVzZXJpYWxpemVkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBkZXNlcmlhbGl6ZSBwYWNrZXQgd2l0aCBpZCAke3BhY2tldElkfWAsXG4gICAgICAgICAgICByZWFzb25cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluZmxhdGVzIGEgemxpYiBjb21wcmVzc2VkIGJ1ZmZlclxuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSB6bGliIGNvbXByZXNzZWQgYnVmZmVyIHRvIGluZmxhdGVcbiAgICogQHJldHVybnMgVGhlIGluZmxhdGVkIGJ1ZmZlclxuICAgKi9cbiAgcHVibGljIGluZmxhdGVabGliKGJ1ZmZlcjogQnVmZmVyKTogQnVmZmVyIHtcbiAgICByZXR1cm4gaW5mbGF0ZVJhd1N5bmMoYnVmZmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmZsYXRlcyBhIHNuYXBweSBjb21wcmVzc2VkIGJ1ZmZlclxuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBzbmFwcHkgY29tcHJlc3NlZCBidWZmZXIgdG8gaW5mbGF0ZVxuICAgKiBAcmV0dXJucyBUaGUgaW5mbGF0ZWQgYnVmZmVyXG4gICAqL1xuICBwdWJsaWMgaW5mbGF0ZVNuYXBweShfYnVmZmVyOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgYmF0Y2ggb2YgcGFja2V0cyB0byBhIGNvbm5lY3Rpb24gd2l0aCBhIHNwZWNpZmllZCBwcmlvcml0eVxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byBzZW5kIHRoZSBwYWNrZXRzIHRvXG4gICAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIHBhY2tldHMgYmVpbmcgc2VudFxuICAgKiBAcGFyYW0gcGFja2V0cyBUaGUgcGFja2V0cyB0byBzZW5kIHRvIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgc2VuZChcbiAgICBjb25uZWN0aW9uOiBDb25uZWN0aW9uLFxuICAgIHByaW9yaXR5ID0gUHJpb3JpdHkuTm9ybWFsLFxuICAgIC4uLnBhY2tldHM6IEFycmF5PERhdGFQYWNrZXQ+XG4gICk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgY29ubmVjdGlvbiBvYmplY3QgZnJvbSB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb24pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGluIHRoZSBjb25uZWN0aW9ucyBtYXBcbiAgICBpZiAoIXByb3BlcnRpZXMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQXR0ZW1wdGVkIHRvIHNlbmQgcGFja2V0cyB0byBhIGNvbm5lY3Rpb24gdGhhdCBpcyBub3QgYSByZWdpc3RlcmVkIGNvbm5lY3Rpb24uXCJcbiAgICAgICk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBkYXRhIGJ1ZmZlcnMgdG8gc2VuZCB0byB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IGRhdGE6IEFycmF5PEJ1ZmZlcj4gPSBbXTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBhY2tldHMgdGhhdCBhcmUgYmVpbmcgc2VudCwgYW5kIGF0dGVtcHQgdG8gc2VyaWFsaXplIHRoZW1cbiAgICAvLyBXZSB3aWxsIGFsc28gZW1pdCB0aGUgcGFja2V0IGV2ZW50IHRvIHRocm91Z2ggdGhlIG5ldHdvcmsgZXZlbnQgZW1pdHRlclxuICAgIGZvciAoY29uc3QgcGFja2V0IG9mIHBhY2tldHMpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBwYWNrZXQgZXZlbnQgZm9yIHRoZSBwYWNrZXRcbiAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICBib3VuZDogTmV0d29ya0JvdW5kLkNsaWVudCxcbiAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgcGFja2V0XG4gICAgICB9O1xuXG4gICAgICAvLyBFbWl0IHRoZSBwYWNrZXQgZXZlbnQgdG8gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSB0aGlzLmVtaXQocGFja2V0LmdldElkKCkgYXMgUGFja2V0LCBldmVudCk7XG4gICAgICBjb25zdCBhbGwgPSB0aGlzLmVtaXQoXCJhbGxcIiwgZXZlbnQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IHdhcyBjYW5jZWxsZWQgYnkgYW4gZXh0ZXJuYWwgbGlzdGVuZXJcbiAgICAgIC8vIElmIHNvLCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycyB3aWxsIG5vdCBiZSBjYWxsZWRcbiAgICAgIGlmICghbmV0d29yayB8fCAhYWxsKSB7XG4gICAgICAgIC8vIExvZyBhIGRlYnVnIG1lc3NhZ2UgaWYgdGhlIHBhY2tldCB3YXMgY2FuY2VsbGVkIGJ5IGFuIGV4dGVybmFsIGxpc3RlbmVyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBQYWNrZXQgc2VudCB3aXRoIGlkICR7cGFja2V0LmdldElkKCl9IHdhcyBjYW5jZWxsZWQgYnkgYW4gZXh0ZXJuYWwgbGlzdGVuZXIuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBhY2tldCBpZiBpdCB3YXMgY2FuY2VsbGVkIGJ5IGFuIGV4dGVybmFsIGxpc3RlbmVyXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRlbXB0IHRvIHNlcmlhbGl6ZSB0aGUgcGFja2V0XG4gICAgICB0cnkge1xuICAgICAgICAvLyBTZXJpYWxpemUgdGhlIHBhY2tldCBhbmQgYWRkIGl0IHRvIHRoZSBkYXRhIGJ1ZmZlcnNcbiAgICAgICAgZGF0YS5wdXNoKHBhY2tldC5zZXJpYWxpemUoKSk7XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBzZXJpYWxpemF0aW9uIGVycm9yIGlmIHRoZSBwYWNrZXQgY291bGQgbm90IGJlIHNlcmlhbGl6ZWRcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBzZXJpYWxpemUgcGFja2V0IHdpdGggaWQgJHtwYWNrZXQuZ2V0SWQoKX1gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZyYW1lIHRoZSBkYXRhIGJ1ZmZlcnMgaW50byBhIHNpbmd1bGFyIGJ1ZmZlclxuICAgIGNvbnN0IGZyYW1lZCA9IEZyYW1lci5mcmFtZSguLi5kYXRhKTtcblxuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgZnJhbWVkIGJ1ZmZlciwgd2Ugd2lsbCBjb21wcmVzcyBpdFxuICAgIGNvbnN0IGRlZmxhdGVkID1cbiAgICAgIGZyYW1lZC5ieXRlTGVuZ3RoID4gdGhpcy5wcm9wZXJ0aWVzLmNvbXByZXNzaW9uVGhyZXNob2xkICYmXG4gICAgICBwcm9wZXJ0aWVzLmNvbXByZXNzaW9uXG4gICAgICAgID8gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShbdGhpcy5wcm9wZXJ0aWVzLmNvbXByZXNzaW9uTWV0aG9kXSksXG4gICAgICAgICAgICB0aGlzLmRlZmxhdGVabGliKGZyYW1lZClcbiAgICAgICAgICBdKVxuICAgICAgICA6IHByb3BlcnRpZXMuY29tcHJlc3Npb25cbiAgICAgICAgICA/IEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFtDb21wcmVzc2lvbk1ldGhvZC5Ob25lXSksIGZyYW1lZF0pXG4gICAgICAgICAgOiBmcmFtZWQ7XG5cbiAgICAvLyBXZSB3aWxsIHRoZW4gY2hlY2sgaWYgZW5jcnlwdGlvbiBpcyBlbmFibGVkIGZvciB0aGUgc2Vzc2lvbi5cbiAgICAvLyBJZiBzbywgd2Ugd2lsbCBlbmNyeXB0IHRoZSBkZWZsYXRlZCBwYXlsb2FkLlxuICAgIC8vIElmIG5vdCwgd2Ugd2lsbCBqdXN0IHVzZSB0aGUgZGVmbGF0ZWQgcGF5bG9hZC5cbiAgICAvLyBOT1RFOiBFbmNyeXB0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIFNvIHdlIHdpbGwganVzdCB1c2UgdGhlIGRlZmxhdGVkIHBheWxvYWQgZm9yIG5vdy5cbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgZW5jcnlwdGlvbiBmb3IgdGhlIHNlc3Npb24uXG4gICAgY29uc3QgZW5jcnlwdGVkID0gcHJvcGVydGllcy5lbmNyeXB0aW9uID8gZGVmbGF0ZWQgOiBkZWZsYXRlZDtcblxuICAgIC8vIFdlIHdpbGwgdGhlbiBjb25zdHJ1Y3QgdGhlIGZpbmFsIHBheWxvYWQgd2l0aCB0aGUgZ2FtZSBoZWFkZXIgYW5kIHRoZSBlbmNyeXB0ZWQgY29tcHJlc3NlZCBwYXlsb2FkLlxuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbMHhmZV0pLCBlbmNyeXB0ZWRdKTtcblxuICAgIC8vIEZpbmFsbHkgd2Ugd2lsbCBhc3NlbWJsZSBhIG5ldyBmcmFtZSB3aXRoIHRoZSBwYXlsb2FkLlxuICAgIC8vIFRoZSBmcmFtZSBjb250YWlucyB0aGUgcmVsaWFiaWxpdHkgYW5kIHByaW9yaXR5IG9mIHRoZSBwYWNrZXQuXG4gICAgLy8gQXMgd2VsbCBhcyB0aGUgcGF5bG9hZCBpdHNlbGYuXG4gICAgY29uc3QgZnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICBmcmFtZS5yZWxpYWJpbGl0eSA9IFJlbGlhYmlsaXR5LlJlbGlhYmxlO1xuICAgIGZyYW1lLm9yZGVyQ2hhbm5lbCA9IDA7XG4gICAgZnJhbWUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICAvLyBBbmQgc2VuZCB0aGUgZnJhbWUgdG8gdGhlIHNlc3Npb24uXG4gICAgcmV0dXJuIGNvbm5lY3Rpb24uc2VuZEZyYW1lKGZyYW1lLCBwcmlvcml0eSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBiYXRjaCBvZiBwYWNrZXRzIHRvIGEgY29ubmVjdGlvbiB3aXRoIG5vcm1hbCBwcmlvcml0eVxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byBzZW5kIHRoZSBwYWNrZXRzIHRvIHdpdGggbm9ybWFsIHByaW9yaXR5XG4gICAqIEBwYXJhbSBwYWNrZXRzIFRoZSBwYWNrZXRzIHRvIHNlbmQgdG8gdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzZW5kTm9ybWFsKFxuICAgIGNvbm5lY3Rpb246IENvbm5lY3Rpb24sXG4gICAgLi4ucGFja2V0czogQXJyYXk8RGF0YVBhY2tldD5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zZW5kKGNvbm5lY3Rpb24sIFByaW9yaXR5Lk5vcm1hbCwgLi4ucGFja2V0cyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBiYXRjaCBvZiBwYWNrZXRzIHRvIGEgY29ubmVjdGlvbiB3aXRoIGltbWVkaWF0ZSBwcmlvcml0eVxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byBzZW5kIHRoZSBwYWNrZXRzIHRvIGltbWVkaWF0ZWx5XG4gICAqIEBwYXJhbSBwYWNrZXRzIFRoZSBwYWNrZXRzIHRvIHNlbmQgdG8gdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzZW5kSW1tZWRpYXRlKFxuICAgIGNvbm5lY3Rpb246IENvbm5lY3Rpb24sXG4gICAgLi4ucGFja2V0czogQXJyYXk8RGF0YVBhY2tldD5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zZW5kKGNvbm5lY3Rpb24sIFByaW9yaXR5LkltbWVkaWF0ZSwgLi4ucGFja2V0cyk7XG4gIH1cblxuICAvKipcbiAgICogRGVmbGF0ZXMgYSBidWZmZXIgdXNpbmcgdGhlIHpsaWIgY29tcHJlc3Npb24gYWxnb3JpdGhtXG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciB0byBkZWZsYXRlXG4gICAqIEByZXR1cm5zIFRoZSBkZWZsYXRlZCBidWZmZXJcbiAgICovXG4gIHB1YmxpYyBkZWZsYXRlWmxpYihidWZmZXI6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIGRlZmxhdGVSYXdTeW5jKGJ1ZmZlcik7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29tcHJlc3Npb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgY29ubmVjdGlvbiBvYmplY3QgZnJvbSB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuY29ubmVjdGlvbnMuZ2V0KGNvbm5lY3Rpb24pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGluIHRoZSBjb25uZWN0aW9ucyBtYXBcbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybjtcblxuICAgIC8vIFNldCB0aGUgY29tcHJlc3Npb24gcHJvcGVydHkgZm9yIHRoZSBjb25uZWN0aW9uXG4gICAgcHJvcGVydGllcy5jb21wcmVzc2lvbiA9IGVuYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0RW5jcnlwdGlvbihjb25uZWN0aW9uOiBDb25uZWN0aW9uLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBjb25uZWN0aW9uIG9iamVjdCBmcm9tIHRoZSBjb25uZWN0aW9ucyBtYXBcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgaW4gdGhlIGNvbm5lY3Rpb25zIG1hcFxuICAgIGlmICghcHJvcGVydGllcykgcmV0dXJuO1xuXG4gICAgLy8gU2V0IHRoZSBlbmNyeXB0aW9uIHByb3BlcnR5IGZvciB0aGUgY29ubmVjdGlvblxuICAgIHByb3BlcnRpZXMuZW5jcnlwdGlvbiA9IGVuYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgZGlzY29ubmVjdENvbm5lY3Rpb24oXG4gICAgY29ubmVjdGlvbjogQ29ubmVjdGlvbixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcmVhc29uOiBEaXNjb25uZWN0UmVhc29uXG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBEaXNjb25uZWN0UGFja2V0IHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCByZWFzb25cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgRGlzY29ubmVjdFBhY2tldCgpO1xuXG4gICAgLy8gQXNzaWduIHRoZSBtZXNzYWdlIGFuZCByZWFzb24gdG8gdGhlIHBhY2tldFxuICAgIHBhY2tldC5tZXNzYWdlID0gbmV3IERpc2Nvbm5lY3RNZXNzYWdlKG1lc3NhZ2UsIFN0cmluZygpKTtcbiAgICBwYWNrZXQucmVhc29uID0gcmVhc29uO1xuICAgIHBhY2tldC5oaWRlRGlzY29ubmVjdFNjcmVlbiA9IGZhbHNlO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBjb25uZWN0aW9uXG4gICAgdGhpcy5zZW5kSW1tZWRpYXRlKGNvbm5lY3Rpb24sIHBhY2tldCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTmV0d29yayB9O1xuIiwgImVudW0gTmV0d29ya0JvdW5kIHtcbiAgU2VydmVyID0gMCxcbiAgQ2xpZW50ID0gMVxufVxuXG5leHBvcnQgeyBOZXR3b3JrQm91bmQgfTtcbiIsICJleHBvcnQgZW51bSBCbG9ja0lkZW50aWZpZXIge1xuICBQaW5rVHVsaXAgPSBcIm1pbmVjcmFmdDpwaW5rX3R1bGlwXCIsXG4gIEJ1ZGRpbmdBbWV0aHlzdCA9IFwibWluZWNyYWZ0OmJ1ZGRpbmdfYW1ldGh5c3RcIixcbiAgTGlnaHRCbHVlQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBHcmF2ZWwgPSBcIm1pbmVjcmFmdDpncmF2ZWxcIixcbiAgRGV0ZWN0b3JSYWlsID0gXCJtaW5lY3JhZnQ6ZGV0ZWN0b3JfcmFpbFwiLFxuICBDeWFuVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmN5YW5fdGVycmFjb3R0YVwiLFxuICBIYXJkUGlua1N0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfcGlua19zdGFpbmVkX2dsYXNzXCIsXG4gIExpZ2h0R3JheUNhbmRsZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FuZGxlXCIsXG4gIE5ldGhlckdvbGRPcmUgPSBcIm1pbmVjcmFmdDpuZXRoZXJfZ29sZF9vcmVcIixcbiAgUG9saXNoZWRCYXNhbHQgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9iYXNhbHRcIixcbiAgQmx1ZUNhbmRsZSA9IFwibWluZWNyYWZ0OmJsdWVfY2FuZGxlXCIsXG4gIERhcmtPYWtXb29kID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfd29vZFwiLFxuICBUdWZmQnJpY2tXYWxsID0gXCJtaW5lY3JhZnQ6dHVmZl9icmlja193YWxsXCIsXG4gIEFjYWNpYVdhbGxTaWduID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3dhbGxfc2lnblwiLFxuICBCYW1ib29QcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3ByZXNzdXJlX3BsYXRlXCIsXG4gIE1lbG9uQmxvY2sgPSBcIm1pbmVjcmFmdDptZWxvbl9ibG9ja1wiLFxuICBSZWRXb29sID0gXCJtaW5lY3JhZnQ6cmVkX3dvb2xcIixcbiAgR29sZE9yZSA9IFwibWluZWNyYWZ0OmdvbGRfb3JlXCIsXG4gIEJpcmNoU3RhbmRpbmdTaWduID0gXCJtaW5lY3JhZnQ6YmlyY2hfc3RhbmRpbmdfc2lnblwiLFxuICBFbGVtZW50OTMgPSBcIm1pbmVjcmFmdDplbGVtZW50XzkzXCIsXG4gIFdheGVkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgQ29ybmZsb3dlciA9IFwibWluZWNyYWZ0OmNvcm5mbG93ZXJcIixcbiAgUmVkTmV0aGVyQnJpY2sgPSBcIm1pbmVjcmFmdDpyZWRfbmV0aGVyX2JyaWNrXCIsXG4gIE94aWRpemVkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgV2FycGVkRG9vciA9IFwibWluZWNyYWZ0OndhcnBlZF9kb29yXCIsXG4gIFBvbGlzaGVkR3Jhbml0ZVN0YWlycyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2dyYW5pdGVfc3RhaXJzXCIsXG4gIFJlZE11c2hyb29tQmxvY2sgPSBcIm1pbmVjcmFmdDpyZWRfbXVzaHJvb21fYmxvY2tcIixcbiAgRWxlbWVudDMwID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8zMFwiLFxuICBEZWFkQnViYmxlQ29yYWxXYWxsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF9idWJibGVfY29yYWxfd2FsbF9mYW5cIixcbiAgQmx1ZUNhcnBldCA9IFwibWluZWNyYWZ0OmJsdWVfY2FycGV0XCIsXG4gIEJhbWJvb0Jsb2NrID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2Jsb2NrXCIsXG4gIERlZXBzbGF0ZUJyaWNrcyA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja3NcIixcbiAgV2F4ZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9jb3BwZXJcIixcbiAgV2hpdGVXb29sID0gXCJtaW5lY3JhZnQ6d2hpdGVfd29vbFwiLFxuICBXb29kZW5Eb29yID0gXCJtaW5lY3JhZnQ6d29vZGVuX2Rvb3JcIixcbiAgUGlzdG9uQXJtQ29sbGlzaW9uID0gXCJtaW5lY3JhZnQ6cGlzdG9uX2FybV9jb2xsaXNpb25cIixcbiAgUmVkU2FuZHN0b25lU2xhYiA9IFwibWluZWNyYWZ0OnJlZF9zYW5kc3RvbmVfc2xhYlwiLFxuICBEYXJrUHJpc21hcmluZVN0YWlycyA9IFwibWluZWNyYWZ0OmRhcmtfcHJpc21hcmluZV9zdGFpcnNcIixcbiAgRW5kQnJpY2tzID0gXCJtaW5lY3JhZnQ6ZW5kX2JyaWNrc1wiLFxuICBTY3Vsa1Nocmlla2VyID0gXCJtaW5lY3JhZnQ6c2N1bGtfc2hyaWVrZXJcIixcbiAgQmFtYm9vTW9zYWljU3RhaXJzID0gXCJtaW5lY3JhZnQ6YmFtYm9vX21vc2FpY19zdGFpcnNcIixcbiAgVmluZSA9IFwibWluZWNyYWZ0OnZpbmVcIixcbiAgV2F4ZWRPeGlkaXplZENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIFdoaXRlVHVsaXAgPSBcIm1pbmVjcmFmdDp3aGl0ZV90dWxpcFwiLFxuICBHcmFuaXRlID0gXCJtaW5lY3JhZnQ6Z3Jhbml0ZVwiLFxuICBQb2xpc2hlZFR1ZmZTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfdHVmZl9zbGFiXCIsXG4gIEJyb3duTXVzaHJvb20gPSBcIm1pbmVjcmFmdDpicm93bl9tdXNocm9vbVwiLFxuICBDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDpjdXRfY29wcGVyX3N0YWlyc1wiLFxuICBCbHVlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmJsdWVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEVsZW1lbnQwID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8wXCIsXG4gIEV4cG9zZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJfZG9vclwiLFxuICBCbGFja3N0b25lRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmJsYWNrc3RvbmVfZG91YmxlX3NsYWJcIixcbiAgU3BydWNlU3RhbmRpbmdTaWduID0gXCJtaW5lY3JhZnQ6c3BydWNlX3N0YW5kaW5nX3NpZ25cIixcbiAgRWxlbWVudDExOCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTE4XCIsXG4gIEZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OmZlbmNlX2dhdGVcIixcbiAgRGVlcHNsYXRlVGlsZVNsYWIgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfdGlsZV9zbGFiXCIsXG4gIFBvd2RlclNub3cgPSBcIm1pbmVjcmFmdDpwb3dkZXJfc25vd1wiLFxuICBNYWdlbnRhQ2FuZGxlID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9jYW5kbGVcIixcbiAgRGVlcHNsYXRlVGlsZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfdGlsZV9kb3VibGVfc2xhYlwiLFxuICBDYWxjaXRlID0gXCJtaW5lY3JhZnQ6Y2FsY2l0ZVwiLFxuICBHcmF5VGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmdyYXlfdGVycmFjb3R0YVwiLFxuICBDeWFuQ2FycGV0ID0gXCJtaW5lY3JhZnQ6Y3lhbl9jYXJwZXRcIixcbiAgQ3lhblN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmN5YW5fc3RhaW5lZF9nbGFzc1wiLFxuICBEYXJrT2FrQnV0dG9uID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfYnV0dG9uXCIsXG4gIERlZXBzbGF0ZUNvcHBlck9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9jb3BwZXJfb3JlXCIsXG4gIFN0b25lQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDpzdG9uZV9icmlja19zdGFpcnNcIixcbiAgV2F4ZWRPeGlkaXplZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3YXhlZF9veGlkaXplZF9jdXRfY29wcGVyX3NsYWJcIixcbiAgV2FycGVkV2FsbFNpZ24gPSBcIm1pbmVjcmFmdDp3YXJwZWRfd2FsbF9zaWduXCIsXG4gIExhZGRlciA9IFwibWluZWNyYWZ0OmxhZGRlclwiLFxuICBDaGlzZWxlZFN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfc3RvbmVfYnJpY2tzXCIsXG4gIFNwcnVjZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfcHJlc3N1cmVfcGxhdGVcIixcbiAgRGlhbW9uZE9yZSA9IFwibWluZWNyYWZ0OmRpYW1vbmRfb3JlXCIsXG4gIFdheGVkT3hpZGl6ZWRDdXRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9veGlkaXplZF9jdXRfY29wcGVyXCIsXG4gIERlYWRIb3JuQ29yYWxXYWxsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF9ob3JuX2NvcmFsX3dhbGxfZmFuXCIsXG4gIEdyYXlDb25jcmV0ZSA9IFwibWluZWNyYWZ0OmdyYXlfY29uY3JldGVcIixcbiAgRWxlbWVudDczID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF83M1wiLFxuICBDb2JibGVzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpjb2JibGVzdG9uZV9zbGFiXCIsXG4gIEdyZWVuVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmdyZWVuX3RlcnJhY290dGFcIixcbiAgSGFyZFB1cnBsZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX3B1cnBsZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgV2F4ZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OndheGVkX2NvcHBlcl90cmFwZG9vclwiLFxuICBOZXRoZXJCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0Om5ldGhlcl9icmlja19zdGFpcnNcIixcbiAgSGFyZEJsdWVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9ibHVlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBZZWxsb3dTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6eWVsbG93X3NodWxrZXJfYm94XCIsXG4gIENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfY29wcGVyXCIsXG4gIEdyYW5pdGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpncmFuaXRlX3N0YWlyc1wiLFxuICBHcmF5V29vbCA9IFwibWluZWNyYWZ0OmdyYXlfd29vbFwiLFxuICBHcmVlbkNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6Z3JlZW5fY29uY3JldGVfcG93ZGVyXCIsXG4gIExpbWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpsaW1lX3N0YWluZWRfZ2xhc3NcIixcbiAgT3hpZGl6ZWRDb3BwZXJCdWxiID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVyX2J1bGJcIixcbiAgQ29iYmxlZERlZXBzbGF0ZVN0YWlycyA9IFwibWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3N0YWlyc1wiLFxuICBXYXhlZEV4cG9zZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2NvcHBlclwiLFxuICBTdHJpcHBlZEFjYWNpYVdvb2QgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9hY2FjaWFfd29vZFwiLFxuICBFbGVtZW50MTYgPSBcIm1pbmVjcmFmdDplbGVtZW50XzE2XCIsXG4gIEp1bmdsZUJ1dHRvbiA9IFwibWluZWNyYWZ0Omp1bmdsZV9idXR0b25cIixcbiAgRGVhZEJ1YmJsZUNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF9idWJibGVfY29yYWxfZmFuXCIsXG4gIFBvd2VyZWRSZXBlYXRlciA9IFwibWluZWNyYWZ0OnBvd2VyZWRfcmVwZWF0ZXJcIixcbiAgU3BydWNlU3RhaXJzID0gXCJtaW5lY3JhZnQ6c3BydWNlX3N0YWlyc1wiLFxuICBMb29tID0gXCJtaW5lY3JhZnQ6bG9vbVwiLFxuICBIYXJkR3JlZW5TdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9ncmVlbl9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgRWxlbWVudDEwNCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTA0XCIsXG4gIFllbGxvd1N0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OnllbGxvd19zdGFpbmVkX2dsYXNzXCIsXG4gIE94aWRpemVkRG91YmxlQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0Om94aWRpemVkX2RvdWJsZV9jdXRfY29wcGVyX3NsYWJcIixcbiAgSnVuZ2xlRG9vciA9IFwibWluZWNyYWZ0Omp1bmdsZV9kb29yXCIsXG4gIERpb3JpdGUgPSBcIm1pbmVjcmFmdDpkaW9yaXRlXCIsXG4gIERhcmtvYWtXYWxsU2lnbiA9IFwibWluZWNyYWZ0OmRhcmtvYWtfd2FsbF9zaWduXCIsXG4gIEluZm9VcGRhdGUyID0gXCJtaW5lY3JhZnQ6aW5mb191cGRhdGUyXCIsXG4gIERyaXBzdG9uZUJsb2NrID0gXCJtaW5lY3JhZnQ6ZHJpcHN0b25lX2Jsb2NrXCIsXG4gIEdyYXlDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6Z3JheV9jYW5kbGVfY2FrZVwiLFxuICBFeHBvc2VkQ29wcGVyVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2NvcHBlcl90cmFwZG9vclwiLFxuICBCbHVlVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmJsdWVfdGVycmFjb3R0YVwiLFxuICBIYW5naW5nUm9vdHMgPSBcIm1pbmVjcmFmdDpoYW5naW5nX3Jvb3RzXCIsXG4gIFNtb290aFNhbmRzdG9uZSA9IFwibWluZWNyYWZ0OnNtb290aF9zYW5kc3RvbmVcIixcbiAgUG9saXNoZWRCbGFja3N0b25lQnV0dG9uID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9idXR0b25cIixcbiAgU3RyaXBwZWRCaXJjaFdvb2QgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9iaXJjaF93b29kXCIsXG4gIFJlZENhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDpyZWRfY2FuZGxlX2Nha2VcIixcbiAgTW9zc3lTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0Om1vc3N5X3N0b25lX2JyaWNrc1wiLFxuICBIYXJkTGlnaHRCbHVlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfbGlnaHRfYmx1ZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgQ2hlcnJ5UHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmNoZXJyeV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBIYXJkQnJvd25TdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2Jyb3duX3N0YWluZWRfZ2xhc3NcIixcbiAgQ2hlcnJ5SGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpjaGVycnlfaGFuZ2luZ19zaWduXCIsXG4gIFllbGxvd1dvb2wgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfd29vbFwiLFxuICBCbGFja0NhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDpibGFja19jYW5kbGVfY2FrZVwiLFxuICBDcmltc29uV2FsbFNpZ24gPSBcIm1pbmVjcmFmdDpjcmltc29uX3dhbGxfc2lnblwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfc3RhaXJzXCIsXG4gIExpZ2h0QmxvY2sxID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMVwiLFxuICBFbGVtZW50NDYgPSBcIm1pbmVjcmFmdDplbGVtZW50XzQ2XCIsXG4gIFNtb290aFNhbmRzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc2FuZHN0b25lX3NsYWJcIixcbiAgR3JheUNhcnBldCA9IFwibWluZWNyYWZ0OmdyYXlfY2FycGV0XCIsXG4gIERhcmtPYWtEb29yID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfZG9vclwiLFxuICBXaGVhdCA9IFwibWluZWNyYWZ0OndoZWF0XCIsXG4gIEdyaW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpncmluZHN0b25lXCIsXG4gIE9ha0ZlbmNlID0gXCJtaW5lY3JhZnQ6b2FrX2ZlbmNlXCIsXG4gIFllbGxvd1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIERhcmtPYWtTbGFiID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfc2xhYlwiLFxuICBQb2xpc2hlZEdyYW5pdGVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZ3Jhbml0ZV9kb3VibGVfc2xhYlwiLFxuICBIb25leWNvbWJCbG9jayA9IFwibWluZWNyYWZ0OmhvbmV5Y29tYl9ibG9ja1wiLFxuICBFbmRHYXRld2F5ID0gXCJtaW5lY3JhZnQ6ZW5kX2dhdGV3YXlcIixcbiAgQXp1cmVCbHVldCA9IFwibWluZWNyYWZ0OmF6dXJlX2JsdWV0XCIsXG4gIFN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6c3RvbmVfc3RhaXJzXCIsXG4gIEJlYWNvbiA9IFwibWluZWNyYWZ0OmJlYWNvblwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVCcmlja1dhbGwgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrX3dhbGxcIixcbiAgU25vd0xheWVyID0gXCJtaW5lY3JhZnQ6c25vd19sYXllclwiLFxuICBIYXJkUGlua1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX3Bpbmtfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEJyaWNrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmJyaWNrX2RvdWJsZV9zbGFiXCIsXG4gIFdoaXRlQ2FycGV0ID0gXCJtaW5lY3JhZnQ6d2hpdGVfY2FycGV0XCIsXG4gIEJsYWNrQ2FuZGxlID0gXCJtaW5lY3JhZnQ6YmxhY2tfY2FuZGxlXCIsXG4gIENhY3R1cyA9IFwibWluZWNyYWZ0OmNhY3R1c1wiLFxuICBHbG93RnJhbWUgPSBcIm1pbmVjcmFmdDpnbG93X2ZyYW1lXCIsXG4gIE11ZEJyaWNrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0Om11ZF9icmlja19kb3VibGVfc2xhYlwiLFxuICBCYW1ib29Nb3NhaWNTbGFiID0gXCJtaW5lY3JhZnQ6YmFtYm9vX21vc2FpY19zbGFiXCIsXG4gIEJhbWJvb0ZlbmNlID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2ZlbmNlXCIsXG4gIERhcmtQcmlzbWFyaW5lU2xhYiA9IFwibWluZWNyYWZ0OmRhcmtfcHJpc21hcmluZV9zbGFiXCIsXG4gIFByaXNtYXJpbmVCcmlja3NTdGFpcnMgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX2JyaWNrc19zdGFpcnNcIixcbiAgTXljZWxpdW0gPSBcIm1pbmVjcmFmdDpteWNlbGl1bVwiLFxuICBEaW9yaXRlU2xhYiA9IFwibWluZWNyYWZ0OmRpb3JpdGVfc2xhYlwiLFxuICBSZWRDb25jcmV0ZSA9IFwibWluZWNyYWZ0OnJlZF9jb25jcmV0ZVwiLFxuICBDcmltc29uSHlwaGFlID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9oeXBoYWVcIixcbiAgQmxhY2tUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6YmxhY2tfdGVycmFjb3R0YVwiLFxuICBTdHJpcHBlZERhcmtPYWtMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9kYXJrX29ha19sb2dcIixcbiAgSGFyZE9yYW5nZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX29yYW5nZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgT3hpZGl6ZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl9ncmF0ZVwiLFxuICBKdW5nbGVMb2cgPSBcIm1pbmVjcmFmdDpqdW5nbGVfbG9nXCIsXG4gIEJ1YmJsZUNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6YnViYmxlX2NvcmFsX2ZhblwiLFxuICBCYW1ib29TbGFiID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3NsYWJcIixcbiAgTGl0UmVkc3RvbmVPcmUgPSBcIm1pbmVjcmFmdDpsaXRfcmVkc3RvbmVfb3JlXCIsXG4gIE5ldGhlcldhcnQgPSBcIm1pbmVjcmFmdDpuZXRoZXJfd2FydFwiLFxuICBPcmFuZ2VTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6b3JhbmdlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBTdHJpcHBlZE1hbmdyb3ZlV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX21hbmdyb3ZlX3dvb2RcIixcbiAgQ3V0UmVkU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6Y3V0X3JlZF9zYW5kc3RvbmVcIixcbiAgTGltZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpsaW1lX3NodWxrZXJfYm94XCIsXG4gIEhhcmRCbGFja1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2JsYWNrX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBTbW9vdGhSZWRTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpzbW9vdGhfcmVkX3NhbmRzdG9uZVwiLFxuICBMaWx5T2ZUaGVWYWxsZXkgPSBcIm1pbmVjcmFmdDpsaWx5X29mX3RoZV92YWxsZXlcIixcbiAgQmx1ZU9yY2hpZCA9IFwibWluZWNyYWZ0OmJsdWVfb3JjaGlkXCIsXG4gIExpbWVHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6bGltZV9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBUcmFwZG9vciA9IFwibWluZWNyYWZ0OnRyYXBkb29yXCIsXG4gIEhhcmRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2dsYXNzX3BhbmVcIixcbiAgRGVhZEJyYWluQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpkZWFkX2JyYWluX2NvcmFsX2ZhblwiLFxuICBBY2FjaWFTdGFuZGluZ1NpZ24gPSBcIm1pbmVjcmFmdDphY2FjaWFfc3RhbmRpbmdfc2lnblwiLFxuICBVbmR5ZWRTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6dW5keWVkX3NodWxrZXJfYm94XCIsXG4gIFF1YXJ0ek9yZSA9IFwibWluZWNyYWZ0OnF1YXJ0el9vcmVcIixcbiAgSW5mb1VwZGF0ZSA9IFwibWluZWNyYWZ0OmluZm9fdXBkYXRlXCIsXG4gIFNlYWdyYXNzID0gXCJtaW5lY3JhZnQ6c2VhZ3Jhc3NcIixcbiAgVHViZUNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6dHViZV9jb3JhbF9mYW5cIixcbiAgVW5rbm93biA9IFwibWluZWNyYWZ0OnVua25vd25cIixcbiAgQ2hlcnJ5U3RhaXJzID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3N0YWlyc1wiLFxuICBCYXJyZWwgPSBcIm1pbmVjcmFmdDpiYXJyZWxcIixcbiAgQmlnRHJpcGxlYWYgPSBcIm1pbmVjcmFmdDpiaWdfZHJpcGxlYWZcIixcbiAgUXVhcnR6U2xhYiA9IFwibWluZWNyYWZ0OnF1YXJ0el9zbGFiXCIsXG4gIEZpcmVDb3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6ZmlyZV9jb3JhbF9ibG9ja1wiLFxuICBXYXhlZEV4cG9zZWRDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jdXRfY29wcGVyX3NsYWJcIixcbiAgRGVhZEhvcm5Db3JhbCA9IFwibWluZWNyYWZ0OmRlYWRfaG9ybl9jb3JhbFwiLFxuICBJbmZlc3RlZE1vc3N5U3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9tb3NzeV9zdG9uZV9icmlja3NcIixcbiAgRWxlbWVudDY4ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF82OFwiLFxuICBSZWRzdG9uZUxhbXAgPSBcIm1pbmVjcmFmdDpyZWRzdG9uZV9sYW1wXCIsXG4gIE1vc3N5Q29iYmxlc3RvbmUgPSBcIm1pbmVjcmFmdDptb3NzeV9jb2JibGVzdG9uZVwiLFxuICBFbGVtZW50MTEzID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMTNcIixcbiAgQmx1ZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmJsdWVfc3RhaW5lZF9nbGFzc1wiLFxuICBDYWtlID0gXCJtaW5lY3JhZnQ6Y2FrZVwiLFxuICBEYXJrT2FrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2RvdWJsZV9zbGFiXCIsXG4gIFN0cmlwcGVkQ3JpbXNvbkh5cGhhZSA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2NyaW1zb25faHlwaGFlXCIsXG4gIERhcmtPYWtIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2hhbmdpbmdfc2lnblwiLFxuICBHcmVlbkNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6Z3JlZW5fY29uY3JldGVcIixcbiAgRGVlcHNsYXRlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlXCIsXG4gIFN0cmlwcGVkT2FrV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX29ha193b29kXCIsXG4gIFB1cnB1clNsYWIgPSBcIm1pbmVjcmFmdDpwdXJwdXJfc2xhYlwiLFxuICBNYWdlbnRhQ2FycGV0ID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9jYXJwZXRcIixcbiAgUGl0Y2hlckNyb3AgPSBcIm1pbmVjcmFmdDpwaXRjaGVyX2Nyb3BcIixcbiAgQnJvd25Xb29sID0gXCJtaW5lY3JhZnQ6YnJvd25fd29vbFwiLFxuICBQaW5rV29vbCA9IFwibWluZWNyYWZ0OnBpbmtfd29vbFwiLFxuICBXYXJwZWRTdGFuZGluZ1NpZ24gPSBcIm1pbmVjcmFmdDp3YXJwZWRfc3RhbmRpbmdfc2lnblwiLFxuICBEZWFkYnVzaCA9IFwibWluZWNyYWZ0OmRlYWRidXNoXCIsXG4gIEVuZGVyQ2hlc3QgPSBcIm1pbmVjcmFmdDplbmRlcl9jaGVzdFwiLFxuICBXYXhlZEV4cG9zZWRDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIFR1ZmZTbGFiID0gXCJtaW5lY3JhZnQ6dHVmZl9zbGFiXCIsXG4gIFJlZHN0b25lV2lyZSA9IFwibWluZWNyYWZ0OnJlZHN0b25lX3dpcmVcIixcbiAgV2FycGVkUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OndhcnBlZF9wcmVzc3VyZV9wbGF0ZVwiLFxuICBHcmVlbkNhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDpncmVlbl9jYW5kbGVfY2FrZVwiLFxuICBEaWFtb25kQmxvY2sgPSBcIm1pbmVjcmFmdDpkaWFtb25kX2Jsb2NrXCIsXG4gIEV4cG9zZWRDb3BwZXJCdWxiID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJfYnVsYlwiLFxuICBFbGVtZW50NTggPSBcIm1pbmVjcmFmdDplbGVtZW50XzU4XCIsXG4gIEJhbWJvb01vc2FpY0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpiYW1ib29fbW9zYWljX2RvdWJsZV9zbGFiXCIsXG4gIERhcmtQcmlzbWFyaW5lRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmRhcmtfcHJpc21hcmluZV9kb3VibGVfc2xhYlwiLFxuICBDcnlpbmdPYnNpZGlhbiA9IFwibWluZWNyYWZ0OmNyeWluZ19vYnNpZGlhblwiLFxuICBPYWtTdGFpcnMgPSBcIm1pbmVjcmFmdDpvYWtfc3RhaXJzXCIsXG4gIEhhcmRHcmF5U3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9ncmF5X3N0YWluZWRfZ2xhc3NcIixcbiAgT2FrTG9nID0gXCJtaW5lY3JhZnQ6b2FrX2xvZ1wiLFxuICBXYXhlZFdlYXRoZXJlZEN1dENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyXCIsXG4gIEFuZGVzaXRlID0gXCJtaW5lY3JhZnQ6YW5kZXNpdGVcIixcbiAgQnJvd25TdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6YnJvd25fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFNjdWxrVmVpbiA9IFwibWluZWNyYWZ0OnNjdWxrX3ZlaW5cIixcbiAgUGlua1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpwaW5rX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBFeHBvc2VkRG91YmxlQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OmV4cG9zZWRfZG91YmxlX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6Y2FuZGxlX2Nha2VcIixcbiAgTWFnZW50YVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDptYWdlbnRhX3NodWxrZXJfYm94XCIsXG4gIFB1cnBsZVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpwdXJwbGVfdGVycmFjb3R0YVwiLFxuICBTbW9vdGhRdWFydHogPSBcIm1pbmVjcmFmdDpzbW9vdGhfcXVhcnR6XCIsXG4gIFBhY2tlZEljZSA9IFwibWluZWNyYWZ0OnBhY2tlZF9pY2VcIixcbiAgSXJvbkJhcnMgPSBcIm1pbmVjcmFmdDppcm9uX2JhcnNcIixcbiAgT3hpZGl6ZWRDdXRDb3BwZXIgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jdXRfY29wcGVyXCIsXG4gIFBvbGlzaGVkR3Jhbml0ZSA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2dyYW5pdGVcIixcbiAgRWxlbWVudDM5ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8zOVwiLFxuICBMaWdodEJsdWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX3N0YWluZWRfZ2xhc3NcIixcbiAgRmVybiA9IFwibWluZWNyYWZ0OmZlcm5cIixcbiAgUGFja2VkTXVkID0gXCJtaW5lY3JhZnQ6cGFja2VkX211ZFwiLFxuICBMaWdodEJsdWVDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jYW5kbGVfY2FrZVwiLFxuICBFbGVtZW50MSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMVwiLFxuICBQb3BweSA9IFwibWluZWNyYWZ0OnBvcHB5XCIsXG4gIE1vc3NDYXJwZXQgPSBcIm1pbmVjcmFmdDptb3NzX2NhcnBldFwiLFxuICBDcmltc29uU3RhaXJzID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9zdGFpcnNcIixcbiAgR3JlZW5TdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6Z3JlZW5fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFdhcnBlZEZ1bmd1cyA9IFwibWluZWNyYWZ0OndhcnBlZF9mdW5ndXNcIixcbiAgRWxlbWVudDEwMiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTAyXCIsXG4gIFN0b25lQnJpY2tEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6c3RvbmVfYnJpY2tfZG91YmxlX3NsYWJcIixcbiAgQ29wcGVyT3JlID0gXCJtaW5lY3JhZnQ6Y29wcGVyX29yZVwiLFxuICBHcmF5Q2FuZGxlID0gXCJtaW5lY3JhZnQ6Z3JheV9jYW5kbGVcIixcbiAgUG9saXNoZWREZWVwc2xhdGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlX3NsYWJcIixcbiAgQmFtYm9vRG9vciA9IFwibWluZWNyYWZ0OmJhbWJvb19kb29yXCIsXG4gIEJsYWNrQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpibGFja19jb25jcmV0ZV9wb3dkZXJcIixcbiAgTWVsb25TdGVtID0gXCJtaW5lY3JhZnQ6bWVsb25fc3RlbVwiLFxuICBBbWV0aHlzdEJsb2NrID0gXCJtaW5lY3JhZnQ6YW1ldGh5c3RfYmxvY2tcIixcbiAgR29sZEJsb2NrID0gXCJtaW5lY3JhZnQ6Z29sZF9ibG9ja1wiLFxuICBTdHJpcHBlZE9ha0xvZyA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX29ha19sb2dcIixcbiAgRmxvd2VyUG90ID0gXCJtaW5lY3JhZnQ6Zmxvd2VyX3BvdFwiLFxuICBDaGlzZWxlZEJvb2tzaGVsZiA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX2Jvb2tzaGVsZlwiLFxuICBKdW5nbGVGZW5jZSA9IFwibWluZWNyYWZ0Omp1bmdsZV9mZW5jZVwiLFxuICBTcHJ1Y2VMb2cgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfbG9nXCIsXG4gIFBvbGlzaGVkRGVlcHNsYXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlX3N0YWlyc1wiLFxuICBIYXJkTGltZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfbGltZV9zdGFpbmVkX2dsYXNzXCIsXG4gIFNob3J0R3Jhc3MgPSBcIm1pbmVjcmFmdDpzaG9ydF9ncmFzc1wiLFxuICBMYXBpc0Jsb2NrID0gXCJtaW5lY3JhZnQ6bGFwaXNfYmxvY2tcIixcbiAgV2VhdGhlcmVkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIENvYXJzZURpcnQgPSBcIm1pbmVjcmFmdDpjb2Fyc2VfZGlydFwiLFxuICBTbWFsbEFtZXRoeXN0QnVkID0gXCJtaW5lY3JhZnQ6c21hbGxfYW1ldGh5c3RfYnVkXCIsXG4gIEFjdGl2YXRvclJhaWwgPSBcIm1pbmVjcmFmdDphY3RpdmF0b3JfcmFpbFwiLFxuICBQb2R6b2wgPSBcIm1pbmVjcmFmdDpwb2R6b2xcIixcbiAgTWFuZ3JvdmVCdXR0b24gPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9idXR0b25cIixcbiAgSXJvblRyYXBkb29yID0gXCJtaW5lY3JhZnQ6aXJvbl90cmFwZG9vclwiLFxuICBQb3RhdG9lcyA9IFwibWluZWNyYWZ0OnBvdGF0b2VzXCIsXG4gIExhcmdlQW1ldGh5c3RCdWQgPSBcIm1pbmVjcmFmdDpsYXJnZV9hbWV0aHlzdF9idWRcIixcbiAgTXVkZHlNYW5ncm92ZVJvb3RzID0gXCJtaW5lY3JhZnQ6bXVkZHlfbWFuZ3JvdmVfcm9vdHNcIixcbiAgSGFyZExpZ2h0Qmx1ZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfbGlnaHRfYmx1ZV9zdGFpbmVkX2dsYXNzXCIsXG4gIFRyaWFsU3Bhd25lciA9IFwibWluZWNyYWZ0OnRyaWFsX3NwYXduZXJcIixcbiAgU3RyaXBwZWRKdW5nbGVXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfanVuZ2xlX3dvb2RcIixcbiAgRGVhZFR1YmVDb3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFsX2Jsb2NrXCIsXG4gIE5vdGVibG9jayA9IFwibWluZWNyYWZ0Om5vdGVibG9ja1wiLFxuICBUdWZmID0gXCJtaW5lY3JhZnQ6dHVmZlwiLFxuICBSZXNlcnZlZDYgPSBcIm1pbmVjcmFmdDpyZXNlcnZlZDZcIixcbiAgU291bFRvcmNoID0gXCJtaW5lY3JhZnQ6c291bF90b3JjaFwiLFxuICBRdWFydHpCcmlja3MgPSBcIm1pbmVjcmFmdDpxdWFydHpfYnJpY2tzXCIsXG4gIE1hbmdyb3ZlTG9nID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfbG9nXCIsXG4gIFNhbmRzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpzYW5kc3RvbmVfc2xhYlwiLFxuICBXaGl0ZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDp3aGl0ZV9zaHVsa2VyX2JveFwiLFxuICBCaXJjaFdvb2QgPSBcIm1pbmVjcmFmdDpiaXJjaF93b29kXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX3ByZXNzdXJlX3BsYXRlXCIsXG4gIE1vc3N5U3RvbmVCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDptb3NzeV9zdG9uZV9icmlja19zbGFiXCIsXG4gIFJhd0dvbGRCbG9jayA9IFwibWluZWNyYWZ0OnJhd19nb2xkX2Jsb2NrXCIsXG4gIEFsbGl1bSA9IFwibWluZWNyYWZ0OmFsbGl1bVwiLFxuICBDcmFja2VkUG9saXNoZWRCbGFja3N0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y3JhY2tlZF9wb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrc1wiLFxuICBNb2JTcGF3bmVyID0gXCJtaW5lY3JhZnQ6bW9iX3NwYXduZXJcIixcbiAgQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDpjb3BwZXJfZ3JhdGVcIixcbiAgV2VhdGhlcmVkRG91YmxlQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9kb3VibGVfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIERlZXBzbGF0ZVRpbGVzID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVzXCIsXG4gIEJsYWNrV29vbCA9IFwibWluZWNyYWZ0OmJsYWNrX3dvb2xcIixcbiAgTGF2YSA9IFwibWluZWNyYWZ0OmxhdmFcIixcbiAgTGlnaHRCbG9jazE0ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMTRcIixcbiAgQWNhY2lhRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2ZlbmNlX2dhdGVcIixcbiAgQ3lhbkNhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDpjeWFuX2NhbmRsZV9jYWtlXCIsXG4gIE9yYW5nZUNhbmRsZSA9IFwibWluZWNyYWZ0Om9yYW5nZV9jYW5kbGVcIixcbiAgQ29sb3JlZFRvcmNoQnAgPSBcIm1pbmVjcmFmdDpjb2xvcmVkX3RvcmNoX2JwXCIsXG4gIFNjYWZmb2xkaW5nID0gXCJtaW5lY3JhZnQ6c2NhZmZvbGRpbmdcIixcbiAgUG93ZXJlZENvbXBhcmF0b3IgPSBcIm1pbmVjcmFmdDpwb3dlcmVkX2NvbXBhcmF0b3JcIixcbiAgTGlnaHRCbG9jazggPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja184XCIsXG4gIFNwcnVjZVNhcGxpbmcgPSBcIm1pbmVjcmFmdDpzcHJ1Y2Vfc2FwbGluZ1wiLFxuICBDdXRTYW5kc3RvbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6Y3V0X3NhbmRzdG9uZV9kb3VibGVfc2xhYlwiLFxuICBCbGFzdEZ1cm5hY2UgPSBcIm1pbmVjcmFmdDpibGFzdF9mdXJuYWNlXCIsXG4gIEN1dFNhbmRzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpjdXRfc2FuZHN0b25lX3NsYWJcIixcbiAgU3BydWNlRmVuY2UgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfZmVuY2VcIixcbiAgSGFyZFllbGxvd1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX3llbGxvd19zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgSGFyZEdyZWVuU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9ncmVlbl9zdGFpbmVkX2dsYXNzXCIsXG4gIERhcmtPYWtTYXBsaW5nID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfc2FwbGluZ1wiLFxuICBTYW5kc3RvbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6c2FuZHN0b25lX2RvdWJsZV9zbGFiXCIsXG4gIFBpbmtQZXRhbHMgPSBcIm1pbmVjcmFmdDpwaW5rX3BldGFsc1wiLFxuICBTb3VsRmlyZSA9IFwibWluZWNyYWZ0OnNvdWxfZmlyZVwiLFxuICBQaW5rQ2FycGV0ID0gXCJtaW5lY3JhZnQ6cGlua19jYXJwZXRcIixcbiAgTWFuZ3JvdmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfZG91YmxlX3NsYWJcIixcbiAgQnJvd25DYXJwZXQgPSBcIm1pbmVjcmFmdDpicm93bl9jYXJwZXRcIixcbiAgR3JlZW5DYW5kbGUgPSBcIm1pbmVjcmFmdDpncmVlbl9jYW5kbGVcIixcbiAgUHVycGxlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OnB1cnBsZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgU21vb3RoUXVhcnR6RG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnNtb290aF9xdWFydHpfZG91YmxlX3NsYWJcIixcbiAgT3hpZGl6ZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl90cmFwZG9vclwiLFxuICBMaWdodEdyYXlTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X3N0YWluZWRfZ2xhc3NcIixcbiAgQnJhaW5Db3JhbCA9IFwibWluZWNyYWZ0OmJyYWluX2NvcmFsXCIsXG4gIE9ic2lkaWFuID0gXCJtaW5lY3JhZnQ6b2JzaWRpYW5cIixcbiAgQ2hlc3QgPSBcIm1pbmVjcmFmdDpjaGVzdFwiLFxuICBEZWFkQnViYmxlQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmRlYWRfYnViYmxlX2NvcmFsX2Jsb2NrXCIsXG4gIExpZ2h0R3JheVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBCbGFja3N0b25lU2xhYiA9IFwibWluZWNyYWZ0OmJsYWNrc3RvbmVfc2xhYlwiLFxuICBTdHJpcHBlZFNwcnVjZVdvb2QgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9zcHJ1Y2Vfd29vZFwiLFxuICBDYXVsZHJvbiA9IFwibWluZWNyYWZ0OmNhdWxkcm9uXCIsXG4gIEdsb3dpbmdvYnNpZGlhbiA9IFwibWluZWNyYWZ0Omdsb3dpbmdvYnNpZGlhblwiLFxuICBEZWVwc2xhdGVCcmlja1dhbGwgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfYnJpY2tfd2FsbFwiLFxuICBEYXJrb2FrU3RhbmRpbmdTaWduID0gXCJtaW5lY3JhZnQ6ZGFya29ha19zdGFuZGluZ19zaWduXCIsXG4gIFdheGVkRXhwb3NlZENvcHBlckdyYXRlID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfZ3JhdGVcIixcbiAgVHViZUNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDp0dWJlX2NvcmFsX2Jsb2NrXCIsXG4gIEFjYWNpYVBsYW5rcyA9IFwibWluZWNyYWZ0OmFjYWNpYV9wbGFua3NcIixcbiAgRWxlbWVudDg1ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF84NVwiLFxuICBKdW5nbGVXYWxsU2lnbiA9IFwibWluZWNyYWZ0Omp1bmdsZV93YWxsX3NpZ25cIixcbiAgRW5kQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDplbmRfYnJpY2tfc3RhaXJzXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX2RvdWJsZV9zbGFiXCIsXG4gIE9yYW5nZUNhcnBldCA9IFwibWluZWNyYWZ0Om9yYW5nZV9jYXJwZXRcIixcbiAgRXhwb3NlZENvcHBlciA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyXCIsXG4gIFBvbGlzaGVkRGVlcHNsYXRlRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV9kb3VibGVfc2xhYlwiLFxuICBOZXRoZXJCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpuZXRoZXJfYnJpY2tfc2xhYlwiLFxuICBIZWF2eVdlaWdodGVkUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmhlYXZ5X3dlaWdodGVkX3ByZXNzdXJlX3BsYXRlXCIsXG4gIEVsZW1lbnQ4OSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfODlcIixcbiAgU3RvbmVCdXR0b24gPSBcIm1pbmVjcmFmdDpzdG9uZV9idXR0b25cIixcbiAgU3RvbmUgPSBcIm1pbmVjcmFmdDpzdG9uZVwiLFxuICBSZWROZXRoZXJCcmlja0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpyZWRfbmV0aGVyX2JyaWNrX2RvdWJsZV9zbGFiXCIsXG4gIFBpdGNoZXJQbGFudCA9IFwibWluZWNyYWZ0OnBpdGNoZXJfcGxhbnRcIixcbiAgRWxlbWVudDEwMSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTAxXCIsXG4gIFdheGVkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OndheGVkX2NvcHBlcl9idWxiXCIsXG4gIEFuZGVzaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6YW5kZXNpdGVfc3RhaXJzXCIsXG4gIFNwb25nZSA9IFwibWluZWNyYWZ0OnNwb25nZVwiLFxuICBCb25lQmxvY2sgPSBcIm1pbmVjcmFmdDpib25lX2Jsb2NrXCIsXG4gIE5vcm1hbFN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6bm9ybWFsX3N0b25lX3N0YWlyc1wiLFxuICBXYXJwZWRIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0OndhcnBlZF9oYW5naW5nX3NpZ25cIixcbiAgR3JlZW5TdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpncmVlbl9zdGFpbmVkX2dsYXNzXCIsXG4gIERpb3JpdGVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6ZGlvcml0ZV9kb3VibGVfc2xhYlwiLFxuICBHcmF5U3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmdyYXlfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEVuZFN0b25lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6ZW5kX3N0b25lX2JyaWNrX3NsYWJcIixcbiAgRnJhbWUgPSBcIm1pbmVjcmFmdDpmcmFtZVwiLFxuICBTbW9rZXIgPSBcIm1pbmVjcmFmdDpzbW9rZXJcIixcbiAgSGFyZGVuZWRDbGF5ID0gXCJtaW5lY3JhZnQ6aGFyZGVuZWRfY2xheVwiLFxuICBCaXJjaEhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6YmlyY2hfaGFuZ2luZ19zaWduXCIsXG4gIFBvbGlzaGVkVHVmZldhbGwgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF90dWZmX3dhbGxcIixcbiAgVW5saXRSZWRzdG9uZVRvcmNoID0gXCJtaW5lY3JhZnQ6dW5saXRfcmVkc3RvbmVfdG9yY2hcIixcbiAgU3RyaXBwZWRKdW5nbGVMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9qdW5nbGVfbG9nXCIsXG4gIExhcGlzT3JlID0gXCJtaW5lY3JhZnQ6bGFwaXNfb3JlXCIsXG4gIEhhcmRCbHVlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9ibHVlX3N0YWluZWRfZ2xhc3NcIixcbiAgUG9saXNoZWRHcmFuaXRlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2dyYW5pdGVfc2xhYlwiLFxuICBMaWdodEJsb2NrOSA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzlcIixcbiAgT3hpZGl6ZWRDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIEJlZWhpdmUgPSBcIm1pbmVjcmFmdDpiZWVoaXZlXCIsXG4gIExpbWVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6bGltZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgTGlnaHRCbG9jazcgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja183XCIsXG4gIENoZXJyeURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpjaGVycnlfZG91YmxlX3NsYWJcIixcbiAgTGlnaHRCbG9jazYgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja182XCIsXG4gIExpZ2h0QmxvY2s1ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfNVwiLFxuICBXYXhlZE94aWRpemVkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgTGlnaHRCbG9jazQgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja180XCIsXG4gIFdhcnBlZFJvb3RzID0gXCJtaW5lY3JhZnQ6d2FycGVkX3Jvb3RzXCIsXG4gIFNtYWxsRHJpcGxlYWZCbG9jayA9IFwibWluZWNyYWZ0OnNtYWxsX2RyaXBsZWFmX2Jsb2NrXCIsXG4gIEdyZWVuV29vbCA9IFwibWluZWNyYWZ0OmdyZWVuX3dvb2xcIixcbiAgTGltZUNhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDpsaW1lX2NhbmRsZV9jYWtlXCIsXG4gIE1hbmdyb3ZlTGVhdmVzID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfbGVhdmVzXCIsXG4gIExpZ2h0QmxvY2szID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfM1wiLFxuICBBY2FjaWFMZWF2ZXMgPSBcIm1pbmVjcmFmdDphY2FjaWFfbGVhdmVzXCIsXG4gIEJhcnJpZXIgPSBcIm1pbmVjcmFmdDpiYXJyaWVyXCIsXG4gIFJhd0lyb25CbG9jayA9IFwibWluZWNyYWZ0OnJhd19pcm9uX2Jsb2NrXCIsXG4gIERpc3BlbnNlciA9IFwibWluZWNyYWZ0OmRpc3BlbnNlclwiLFxuICBDcmltc29uUm9vdHMgPSBcIm1pbmVjcmFmdDpjcmltc29uX3Jvb3RzXCIsXG4gIExpZ2h0QmxvY2syID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMlwiLFxuICBMaWdodEJsb2NrMCA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzBcIixcbiAgU3RvbmVjdXR0ZXIgPSBcIm1pbmVjcmFmdDpzdG9uZWN1dHRlclwiLFxuICBBbmRlc2l0ZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDphbmRlc2l0ZV9kb3VibGVfc2xhYlwiLFxuICBVbnBvd2VyZWRSZXBlYXRlciA9IFwibWluZWNyYWZ0OnVucG93ZXJlZF9yZXBlYXRlclwiLFxuICBPYWtTYXBsaW5nID0gXCJtaW5lY3JhZnQ6b2FrX3NhcGxpbmdcIixcbiAgTGlnaHRHcmF5VGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfdGVycmFjb3R0YVwiLFxuICBQaW5rU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6cGlua19zdGFpbmVkX2dsYXNzXCIsXG4gIEhhcmRNYWdlbnRhU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfbWFnZW50YV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgQnJvd25TdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpicm93bl9zdGFpbmVkX2dsYXNzXCIsXG4gIEZpcmVDb3JhbCA9IFwibWluZWNyYWZ0OmZpcmVfY29yYWxcIixcbiAgQ29iYmxlZERlZXBzbGF0ZSA9IFwibWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlXCIsXG4gIEVsZW1lbnQ5OSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfOTlcIixcbiAgQmlyY2hMb2cgPSBcIm1pbmVjcmFmdDpiaXJjaF9sb2dcIixcbiAgT3JhbmdlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6b3JhbmdlX3N0YWluZWRfZ2xhc3NcIixcbiAgT3JhbmdlV29vbCA9IFwibWluZWNyYWZ0Om9yYW5nZV93b29sXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZUJyaWNrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfZG91YmxlX3NsYWJcIixcbiAgQnViYmxlQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmJ1YmJsZV9jb3JhbF9ibG9ja1wiLFxuICBDcmltc29uRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmNyaW1zb25fZG91YmxlX3NsYWJcIixcbiAgS2VscCA9IFwibWluZWNyYWZ0OmtlbHBcIixcbiAgVW5kZXJ3YXRlclRvcmNoID0gXCJtaW5lY3JhZnQ6dW5kZXJ3YXRlcl90b3JjaFwiLFxuICBSZXNwYXduQW5jaG9yID0gXCJtaW5lY3JhZnQ6cmVzcGF3bl9hbmNob3JcIixcbiAgRGVhZEZpcmVDb3JhbFdhbGxGYW4gPSBcIm1pbmVjcmFmdDpkZWFkX2ZpcmVfY29yYWxfd2FsbF9mYW5cIixcbiAgTGlnaHRHcmF5Q29uY3JldGUgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X2NvbmNyZXRlXCIsXG4gIEJpcmNoUGxhbmtzID0gXCJtaW5lY3JhZnQ6YmlyY2hfcGxhbmtzXCIsXG4gIFNlYVBpY2tsZSA9IFwibWluZWNyYWZ0OnNlYV9waWNrbGVcIixcbiAgUmVkU2FuZHN0b25lRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnJlZF9zYW5kc3RvbmVfZG91YmxlX3NsYWJcIixcbiAgRWxlbWVudDc0ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF83NFwiLFxuICBSZWRTYW5kID0gXCJtaW5lY3JhZnQ6cmVkX3NhbmRcIixcbiAgSGF5QmxvY2sgPSBcIm1pbmVjcmFmdDpoYXlfYmxvY2tcIixcbiAgU3VzcGljaW91c0dyYXZlbCA9IFwibWluZWNyYWZ0OnN1c3BpY2lvdXNfZ3JhdmVsXCIsXG4gIEhlYXZ5Q29yZSA9IFwibWluZWNyYWZ0OmhlYXZ5X2NvcmVcIixcbiAgSnVuZ2xlV29vZCA9IFwibWluZWNyYWZ0Omp1bmdsZV93b29kXCIsXG4gIFJlZFN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OnJlZF9zdGFpbmVkX2dsYXNzXCIsXG4gIFB1cnBsZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpwdXJwbGVfc2h1bGtlcl9ib3hcIixcbiAgUG9saXNoZWRUdWZmRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmZfZG91YmxlX3NsYWJcIixcbiAgT3hpZGl6ZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVyX2Rvb3JcIixcbiAgV2F4ZWRXZWF0aGVyZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY29wcGVyXCIsXG4gIENoaXNlbGVkUXVhcnR6QmxvY2sgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9xdWFydHpfYmxvY2tcIixcbiAgSW5mZXN0ZWRDcmFja2VkU3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9jcmFja2VkX3N0b25lX2JyaWNrc1wiLFxuICBMaWdodEJsdWVUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV90ZXJyYWNvdHRhXCIsXG4gIERlZXBzbGF0ZUJyaWNrU2xhYiA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja19zbGFiXCIsXG4gIEZsb3dlcmluZ0F6YWxlYSA9IFwibWluZWNyYWZ0OmZsb3dlcmluZ19hemFsZWFcIixcbiAgSW52aXNpYmxlQmVkcm9jayA9IFwibWluZWNyYWZ0OmludmlzaWJsZV9iZWRyb2NrXCIsXG4gIE9ha0xlYXZlcyA9IFwibWluZWNyYWZ0Om9ha19sZWF2ZXNcIixcbiAgQnJhaW5Db3JhbEZhbiA9IFwibWluZWNyYWZ0OmJyYWluX2NvcmFsX2ZhblwiLFxuICBCYW1ib29TdGFpcnMgPSBcIm1pbmVjcmFmdDpiYW1ib29fc3RhaXJzXCIsXG4gIFRvcmNoID0gXCJtaW5lY3JhZnQ6dG9yY2hcIixcbiAgR2xvd0xpY2hlbiA9IFwibWluZWNyYWZ0Omdsb3dfbGljaGVuXCIsXG4gIENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6Y29wcGVyX3RyYXBkb29yXCIsXG4gIFJlZENhbmRsZSA9IFwibWluZWNyYWZ0OnJlZF9jYW5kbGVcIixcbiAgTXVkQnJpY2tXYWxsID0gXCJtaW5lY3JhZnQ6bXVkX2JyaWNrX3dhbGxcIixcbiAgSG9uZXlCbG9jayA9IFwibWluZWNyYWZ0OmhvbmV5X2Jsb2NrXCIsXG4gIENoZXJyeVRyYXBkb29yID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3RyYXBkb29yXCIsXG4gIEJyb3duQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpicm93bl9jb25jcmV0ZVwiLFxuICBMaXRQdW1wa2luID0gXCJtaW5lY3JhZnQ6bGl0X3B1bXBraW5cIixcbiAgUGlua0NvbmNyZXRlID0gXCJtaW5lY3JhZnQ6cGlua19jb25jcmV0ZVwiLFxuICBZZWxsb3dHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6eWVsbG93X2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIFNtb290aEJhc2FsdCA9IFwibWluZWNyYWZ0OnNtb290aF9iYXNhbHRcIixcbiAgV2FycGVkUGxhbmtzID0gXCJtaW5lY3JhZnQ6d2FycGVkX3BsYW5rc1wiLFxuICBQaXN0b24gPSBcIm1pbmVjcmFmdDpwaXN0b25cIixcbiAgQ2hlcnJ5RmVuY2UgPSBcIm1pbmVjcmFmdDpjaGVycnlfZmVuY2VcIixcbiAgTWFuZ3JvdmVQbGFua3MgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9wbGFua3NcIixcbiAgSGFyZExpZ2h0R3JheVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2xpZ2h0X2dyYXlfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFJlZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpyZWRfdGVycmFjb3R0YVwiLFxuICBXYXRlciA9IFwibWluZWNyYWZ0OndhdGVyXCIsXG4gIFdlYXRoZXJlZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl90cmFwZG9vclwiLFxuICBFbGVtZW50NzcgPSBcIm1pbmVjcmFmdDplbGVtZW50Xzc3XCIsXG4gIFdlYXRoZXJlZENvcHBlckdyYXRlID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl9ncmF0ZVwiLFxuICBTcHJ1Y2VCdXR0b24gPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfYnV0dG9uXCIsXG4gIFdhbGxCYW5uZXIgPSBcIm1pbmVjcmFmdDp3YWxsX2Jhbm5lclwiLFxuICBEZWFkRmlyZUNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpkZWFkX2ZpcmVfY29yYWxfYmxvY2tcIixcbiAgTWFnZW50YVdvb2wgPSBcIm1pbmVjcmFmdDptYWdlbnRhX3dvb2xcIixcbiAgV2F4ZWRXZWF0aGVyZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfZ3JhdGVcIixcbiAgV2F4ZWRXZWF0aGVyZWRDb3BwZXJCdWxiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcl9idWxiXCIsXG4gIFZlcmRhbnRGcm9nbGlnaHQgPSBcIm1pbmVjcmFmdDp2ZXJkYW50X2Zyb2dsaWdodFwiLFxuICBNb3NzeUNvYmJsZXN0b25lU2xhYiA9IFwibWluZWNyYWZ0Om1vc3N5X2NvYmJsZXN0b25lX3NsYWJcIixcbiAgTWFnZW50YUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIFBvbGlzaGVkQW5kZXNpdGUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9hbmRlc2l0ZVwiLFxuICBQdXJwbGVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpwdXJwbGVfc3RhaW5lZF9nbGFzc1wiLFxuICBRdWFydHpEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6cXVhcnR6X2RvdWJsZV9zbGFiXCIsXG4gIE1hbmdyb3ZlU2xhYiA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3NsYWJcIixcbiAgV2FsbFNpZ24gPSBcIm1pbmVjcmFmdDp3YWxsX3NpZ25cIixcbiAgSW5mZXN0ZWREZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9kZWVwc2xhdGVcIixcbiAgT3JhbmdlR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0Om9yYW5nZV9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBCaXJjaFNhcGxpbmcgPSBcIm1pbmVjcmFmdDpiaXJjaF9zYXBsaW5nXCIsXG4gIENsaWVudFJlcXVlc3RQbGFjZWhvbGRlckJsb2NrID0gXCJtaW5lY3JhZnQ6Y2xpZW50X3JlcXVlc3RfcGxhY2Vob2xkZXJfYmxvY2tcIixcbiAgSGFyZEJyb3duU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfYnJvd25fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFRvcmNoZmxvd2VyID0gXCJtaW5lY3JhZnQ6dG9yY2hmbG93ZXJcIixcbiAgU3BvcmVCbG9zc29tID0gXCJtaW5lY3JhZnQ6c3BvcmVfYmxvc3NvbVwiLFxuICBXYXRlcmxpbHkgPSBcIm1pbmVjcmFmdDp3YXRlcmxpbHlcIixcbiAgRW1lcmFsZEJsb2NrID0gXCJtaW5lY3JhZnQ6ZW1lcmFsZF9ibG9ja1wiLFxuICBDb25kdWl0ID0gXCJtaW5lY3JhZnQ6Y29uZHVpdFwiLFxuICBBbnZpbCA9IFwibWluZWNyYWZ0OmFudmlsXCIsXG4gIFN1c3BpY2lvdXNTYW5kID0gXCJtaW5lY3JhZnQ6c3VzcGljaW91c19zYW5kXCIsXG4gIEFuY2llbnREZWJyaXMgPSBcIm1pbmVjcmFmdDphbmNpZW50X2RlYnJpc1wiLFxuICBEYXJrT2FrUGxhbmtzID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfcGxhbmtzXCIsXG4gIEp1bmdsZUxlYXZlcyA9IFwibWluZWNyYWZ0Omp1bmdsZV9sZWF2ZXNcIixcbiAgTGlnaHRuaW5nUm9kID0gXCJtaW5lY3JhZnQ6bGlnaHRuaW5nX3JvZFwiLFxuICBOZXRoZXJCcmlja0ZlbmNlID0gXCJtaW5lY3JhZnQ6bmV0aGVyX2JyaWNrX2ZlbmNlXCIsXG4gIEJsYWNrU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmJsYWNrX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBNYWdlbnRhQ29uY3JldGUgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2NvbmNyZXRlXCIsXG4gIENvYmJsZXN0b25lV2FsbCA9IFwibWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGxcIixcbiAgTGlnaHRCbHVlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIERlZXBzbGF0ZUJyaWNrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9icmlja19kb3VibGVfc2xhYlwiLFxuICBUdWJlQ29yYWxXYWxsRmFuID0gXCJtaW5lY3JhZnQ6dHViZV9jb3JhbF93YWxsX2ZhblwiLFxuICBTcHJ1Y2VEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6c3BydWNlX2RvdWJsZV9zbGFiXCIsXG4gIFJlZFNhbmRzdG9uZSA9IFwibWluZWNyYWZ0OnJlZF9zYW5kc3RvbmVcIixcbiAgRGFya09ha0xvZyA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2xvZ1wiLFxuICBPYWtQbGFua3MgPSBcIm1pbmVjcmFmdDpvYWtfcGxhbmtzXCIsXG4gIFJlZHN0b25lT3JlID0gXCJtaW5lY3JhZnQ6cmVkc3RvbmVfb3JlXCIsXG4gIEFjYWNpYUhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2hhbmdpbmdfc2lnblwiLFxuICBMaWdodEJsb2NrMTMgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18xM1wiLFxuICBPY2hyZUZyb2dsaWdodCA9IFwibWluZWNyYWZ0Om9jaHJlX2Zyb2dsaWdodFwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX3N0YWlyc1wiLFxuICBUdWZmV2FsbCA9IFwibWluZWNyYWZ0OnR1ZmZfd2FsbFwiLFxuICBNYW5ncm92ZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBPYnNlcnZlciA9IFwibWluZWNyYWZ0Om9ic2VydmVyXCIsXG4gIFBpbmtHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6cGlua19nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBZZWxsb3dUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6eWVsbG93X3RlcnJhY290dGFcIixcbiAgQnJvd25HbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6YnJvd25fZ2xhemVkX3RlcnJhY290dGFcIixcbiAgQnJvd25DYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6YnJvd25fY2FuZGxlX2Nha2VcIixcbiAgUGlua0NhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDpwaW5rX2NhbmRsZV9jYWtlXCIsXG4gIFF1YXJ0ekJsb2NrID0gXCJtaW5lY3JhZnQ6cXVhcnR6X2Jsb2NrXCIsXG4gIFJlZHN0b25lVG9yY2ggPSBcIm1pbmVjcmFmdDpyZWRzdG9uZV90b3JjaFwiLFxuICBCaXJjaExlYXZlcyA9IFwibWluZWNyYWZ0OmJpcmNoX2xlYXZlc1wiLFxuICBTaWx2ZXJHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6c2lsdmVyX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIEN5YW5Db25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmN5YW5fY29uY3JldGVfcG93ZGVyXCIsXG4gIE94aWRpemVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVyXCIsXG4gIEJpcmNoUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmJpcmNoX3ByZXNzdXJlX3BsYXRlXCIsXG4gIEVsZW1lbnQxOSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTlcIixcbiAgU2FuZHN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6c2FuZHN0b25lX3N0YWlyc1wiLFxuICBTdHJpcHBlZEJhbWJvb0Jsb2NrID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYmFtYm9vX2Jsb2NrXCIsXG4gIENyYWNrZWRTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OmNyYWNrZWRfc3RvbmVfYnJpY2tzXCIsXG4gIERlYWRUdWJlQ29yYWxXYWxsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFsX3dhbGxfZmFuXCIsXG4gIEJpcmNoRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6YmlyY2hfZmVuY2VfZ2F0ZVwiLFxuICBTY3Vsa0NhdGFseXN0ID0gXCJtaW5lY3JhZnQ6c2N1bGtfY2F0YWx5c3RcIixcbiAgRWxlbWVudDExNSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTE1XCIsXG4gIENvYmJsZXN0b25lID0gXCJtaW5lY3JhZnQ6Y29iYmxlc3RvbmVcIixcbiAgSG9ybkNvcmFsID0gXCJtaW5lY3JhZnQ6aG9ybl9jb3JhbFwiLFxuICBXaGl0ZUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6d2hpdGVfY29uY3JldGVfcG93ZGVyXCIsXG4gIFllbGxvd0NvbmNyZXRlID0gXCJtaW5lY3JhZnQ6eWVsbG93X2NvbmNyZXRlXCIsXG4gIE9ha0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpvYWtfZG91YmxlX3NsYWJcIixcbiAgU3RyaXBwZWRXYXJwZWRTdGVtID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfd2FycGVkX3N0ZW1cIixcbiAgRGF5bGlnaHREZXRlY3RvciA9IFwibWluZWNyYWZ0OmRheWxpZ2h0X2RldGVjdG9yXCIsXG4gIFNtb290aFNhbmRzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OnNtb290aF9zYW5kc3RvbmVfc3RhaXJzXCIsXG4gIEp1bmdsZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpqdW5nbGVfcHJlc3N1cmVfcGxhdGVcIixcbiAgSGFyZFdoaXRlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF93aGl0ZV9zdGFpbmVkX2dsYXNzXCIsXG4gIERvdWJsZUN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDpkb3VibGVfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIEJpcmNoQnV0dG9uID0gXCJtaW5lY3JhZnQ6YmlyY2hfYnV0dG9uXCIsXG4gIENyaW1zb25QbGFua3MgPSBcIm1pbmVjcmFmdDpjcmltc29uX3BsYW5rc1wiLFxuICBTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpzYW5kc3RvbmVcIixcbiAgQmxhY2tzdG9uZVdhbGwgPSBcIm1pbmVjcmFmdDpibGFja3N0b25lX3dhbGxcIixcbiAgTGlnaHRXZWlnaHRlZFByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpsaWdodF93ZWlnaHRlZF9wcmVzc3VyZV9wbGF0ZVwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lXCIsXG4gIEJhbWJvbyA9IFwibWluZWNyYWZ0OmJhbWJvb1wiLFxuICBSZWROZXRoZXJCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpyZWRfbmV0aGVyX2JyaWNrX3NsYWJcIixcbiAgSXJvbk9yZSA9IFwibWluZWNyYWZ0Omlyb25fb3JlXCIsXG4gIFdheGVkV2VhdGhlcmVkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIEVsZW1lbnQxNyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTdcIixcbiAgU3RpY2t5UGlzdG9uQXJtQ29sbGlzaW9uID0gXCJtaW5lY3JhZnQ6c3RpY2t5X3Bpc3Rvbl9hcm1fY29sbGlzaW9uXCIsXG4gIEVsZW1lbnQ1MSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNTFcIixcbiAgR3JheVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmdyYXlfc3RhaW5lZF9nbGFzc1wiLFxuICBFeHBvc2VkQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIEVsZW1lbnQ1MiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNTJcIixcbiAgV2FycGVkU3RhaXJzID0gXCJtaW5lY3JhZnQ6d2FycGVkX3N0YWlyc1wiLFxuICBCZWRyb2NrID0gXCJtaW5lY3JhZnQ6YmVkcm9ja1wiLFxuICBTbWl0aGluZ1RhYmxlID0gXCJtaW5lY3JhZnQ6c21pdGhpbmdfdGFibGVcIixcbiAgTGlnaHRCbG9jazEwID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMTBcIixcbiAgVHVmZkJyaWNrU2xhYiA9IFwibWluZWNyYWZ0OnR1ZmZfYnJpY2tfc2xhYlwiLFxuICBSb3NlQnVzaCA9IFwibWluZWNyYWZ0OnJvc2VfYnVzaFwiLFxuICBHcmVlbkNhcnBldCA9IFwibWluZWNyYWZ0OmdyZWVuX2NhcnBldFwiLFxuICBQdXJwbGVDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6cHVycGxlX2NhbmRsZV9jYWtlXCIsXG4gIFByaXNtYXJpbmVCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX2JyaWNrX3NsYWJcIixcbiAgQ3lhbkNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6Y3lhbl9jb25jcmV0ZVwiLFxuICBOZXRoZXJpdGVCbG9jayA9IFwibWluZWNyYWZ0Om5ldGhlcml0ZV9ibG9ja1wiLFxuICBSZWRzdG9uZUJsb2NrID0gXCJtaW5lY3JhZnQ6cmVkc3RvbmVfYmxvY2tcIixcbiAgUG9saXNoZWRCbGFja3N0b25lV2FsbCA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfd2FsbFwiLFxuICBRdWFydHpQaWxsYXIgPSBcIm1pbmVjcmFmdDpxdWFydHpfcGlsbGFyXCIsXG4gIFdheGVkRXhwb3NlZEN1dENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlclwiLFxuICBHaWxkZWRCbGFja3N0b25lID0gXCJtaW5lY3JhZnQ6Z2lsZGVkX2JsYWNrc3RvbmVcIixcbiAgSnVuZ2xlSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpqdW5nbGVfaGFuZ2luZ19zaWduXCIsXG4gIEJsdWVDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmJsdWVfY29uY3JldGVfcG93ZGVyXCIsXG4gIENoZXJyeVdvb2QgPSBcIm1pbmVjcmFmdDpjaGVycnlfd29vZFwiLFxuICBCaXJjaFNsYWIgPSBcIm1pbmVjcmFmdDpiaXJjaF9zbGFiXCIsXG4gIEVuZFN0b25lID0gXCJtaW5lY3JhZnQ6ZW5kX3N0b25lXCIsXG4gIENyaW1zb25Eb29yID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9kb29yXCIsXG4gIEp1bmdsZVNsYWIgPSBcIm1pbmVjcmFmdDpqdW5nbGVfc2xhYlwiLFxuICBXYXhlZE94aWRpemVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyXCIsXG4gIEdsb3dzdG9uZSA9IFwibWluZWNyYWZ0Omdsb3dzdG9uZVwiLFxuICBTdG9uZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpzdG9uZV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBRdWFydHpTdGFpcnMgPSBcIm1pbmVjcmFmdDpxdWFydHpfc3RhaXJzXCIsXG4gIFdheGVkRXhwb3NlZEN1dENvcHBlclN0YWlycyA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgSGFyZExpbWVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9saW1lX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBNdWRCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDptdWRfYnJpY2tfc2xhYlwiLFxuICBDcmFja2VkRGVlcHNsYXRlVGlsZXMgPSBcIm1pbmVjcmFmdDpjcmFja2VkX2RlZXBzbGF0ZV90aWxlc1wiLFxuICBGYXJtbGFuZCA9IFwibWluZWNyYWZ0OmZhcm1sYW5kXCIsXG4gIERlYWRCcmFpbkNvcmFsV2FsbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfYnJhaW5fY29yYWxfd2FsbF9mYW5cIixcbiAgUGlua0NhbmRsZSA9IFwibWluZWNyYWZ0OnBpbmtfY2FuZGxlXCIsXG4gIE5vcm1hbFN0b25lRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0Om5vcm1hbF9zdG9uZV9kb3VibGVfc2xhYlwiLFxuICBCcm93bkNhbmRsZSA9IFwibWluZWNyYWZ0OmJyb3duX2NhbmRsZVwiLFxuICBMaWdodEJsb2NrMTIgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18xMlwiLFxuICBSYWlsID0gXCJtaW5lY3JhZnQ6cmFpbFwiLFxuICBTb3VsTGFudGVybiA9IFwibWluZWNyYWZ0OnNvdWxfbGFudGVyblwiLFxuICBDYXJyb3RzID0gXCJtaW5lY3JhZnQ6Y2Fycm90c1wiLFxuICBBY2FjaWFUcmFwZG9vciA9IFwibWluZWNyYWZ0OmFjYWNpYV90cmFwZG9vclwiLFxuICBTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OnN0b25lX2JyaWNrc1wiLFxuICBNb3NzeUNvYmJsZXN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6bW9zc3lfY29iYmxlc3RvbmVfc3RhaXJzXCIsXG4gIEhhcmRNYWdlbnRhU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9tYWdlbnRhX3N0YWluZWRfZ2xhc3NcIixcbiAgUGlua1RlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpwaW5rX3RlcnJhY290dGFcIixcbiAgV2F4ZWRXZWF0aGVyZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcl9kb29yXCIsXG4gIERhcmtQcmlzbWFyaW5lID0gXCJtaW5lY3JhZnQ6ZGFya19wcmlzbWFyaW5lXCIsXG4gIEluZmVzdGVkQ29iYmxlc3RvbmUgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9jb2JibGVzdG9uZVwiLFxuICBCcmFpbkNvcmFsV2FsbEZhbiA9IFwibWluZWNyYWZ0OmJyYWluX2NvcmFsX3dhbGxfZmFuXCIsXG4gIE1hbmdyb3ZlV29vZCA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3dvb2RcIixcbiAgQ3JhZnRpbmdUYWJsZSA9IFwibWluZWNyYWZ0OmNyYWZ0aW5nX3RhYmxlXCIsXG4gIFJlZEdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpyZWRfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgRGFya09ha0ZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2ZlbmNlX2dhdGVcIixcbiAgQ2hlcnJ5QnV0dG9uID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2J1dHRvblwiLFxuICBDcmltc29uTnlsaXVtID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9ueWxpdW1cIixcbiAgV2FycGVkRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OndhcnBlZF9kb3VibGVfc2xhYlwiLFxuICBTdHJ1Y3R1cmVWb2lkID0gXCJtaW5lY3JhZnQ6c3RydWN0dXJlX3ZvaWRcIixcbiAgQmFtYm9vRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2ZlbmNlX2dhdGVcIixcbiAgUHVycGxlQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpwdXJwbGVfY29uY3JldGVcIixcbiAgV2hpdGVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6d2hpdGVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFdheGVkRXhwb3NlZENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2NvcHBlcl9idWxiXCIsXG4gIEJ1YmJsZUNvcmFsID0gXCJtaW5lY3JhZnQ6YnViYmxlX2NvcmFsXCIsXG4gIENvYWxPcmUgPSBcIm1pbmVjcmFmdDpjb2FsX29yZVwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrX3NsYWJcIixcbiAgTm9ybWFsU3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6bm9ybWFsX3N0b25lX3NsYWJcIixcbiAgUHVycGxlQ2FuZGxlID0gXCJtaW5lY3JhZnQ6cHVycGxlX2NhbmRsZVwiLFxuICBTbm93ID0gXCJtaW5lY3JhZnQ6c25vd1wiLFxuICBDYWxpYnJhdGVkU2N1bGtTZW5zb3IgPSBcIm1pbmVjcmFmdDpjYWxpYnJhdGVkX3NjdWxrX3NlbnNvclwiLFxuICBZZWxsb3dDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OnllbGxvd19jb25jcmV0ZV9wb3dkZXJcIixcbiAgT2FrU2xhYiA9IFwibWluZWNyYWZ0Om9ha19zbGFiXCIsXG4gIFNhbmQgPSBcIm1pbmVjcmFmdDpzYW5kXCIsXG4gIE1hbmdyb3ZlU3RhbmRpbmdTaWduID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfc3RhbmRpbmdfc2lnblwiLFxuICBTbGltZSA9IFwibWluZWNyYWZ0OnNsaW1lXCIsXG4gIEVsZW1lbnQxMTcgPSBcIm1pbmVjcmFmdDplbGVtZW50XzExN1wiLFxuICBKdW5nbGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpqdW5nbGVfc3RhaXJzXCIsXG4gIE1vc3N5U3RvbmVCcmlja0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDptb3NzeV9zdG9uZV9icmlja19kb3VibGVfc2xhYlwiLFxuICBDdXRSZWRTYW5kc3RvbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6Y3V0X3JlZF9zYW5kc3RvbmVfZG91YmxlX3NsYWJcIixcbiAgQXphbGVhTGVhdmVzID0gXCJtaW5lY3JhZnQ6YXphbGVhX2xlYXZlc1wiLFxuICBCYW1ib29Eb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2RvdWJsZV9zbGFiXCIsXG4gIENoaXNlbGVkUG9saXNoZWRCbGFja3N0b25lID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfcG9saXNoZWRfYmxhY2tzdG9uZVwiLFxuICBTbW9vdGhTdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc3RvbmVfc2xhYlwiLFxuICBJbmZlc3RlZENoaXNlbGVkU3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9jaGlzZWxlZF9zdG9uZV9icmlja3NcIixcbiAgQnJvd25Db25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmJyb3duX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBQaW5rQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpwaW5rX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBDcmFja2VkRGVlcHNsYXRlQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y3JhY2tlZF9kZWVwc2xhdGVfYnJpY2tzXCIsXG4gIERlYWRUdWJlQ29yYWwgPSBcIm1pbmVjcmFmdDpkZWFkX3R1YmVfY29yYWxcIixcbiAgQWNhY2lhRG9vciA9IFwibWluZWNyYWZ0OmFjYWNpYV9kb29yXCIsXG4gIE9yYW5nZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpvcmFuZ2Vfc2h1bGtlcl9ib3hcIixcbiAgTmV0aGVyV2FydEJsb2NrID0gXCJtaW5lY3JhZnQ6bmV0aGVyX3dhcnRfYmxvY2tcIixcbiAgTGlnaHRCbHVlR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgUHJpc21hcmluZVNsYWIgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX3NsYWJcIixcbiAgUHJpc21hcmluZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX2RvdWJsZV9zbGFiXCIsXG4gIExpZ2h0QmxvY2sxMSA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzExXCIsXG4gIENoZXJyeURvb3IgPSBcIm1pbmVjcmFmdDpjaGVycnlfZG9vclwiLFxuICBXZWF0aGVyZWRDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgQWNhY2lhTG9nID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2xvZ1wiLFxuICBGbG93aW5nTGF2YSA9IFwibWluZWNyYWZ0OmZsb3dpbmdfbGF2YVwiLFxuICBXaGl0ZVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDp3aGl0ZV90ZXJyYWNvdHRhXCIsXG4gIENyaW1zb25UcmFwZG9vciA9IFwibWluZWNyYWZ0OmNyaW1zb25fdHJhcGRvb3JcIixcbiAgQmx1ZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpibHVlX3NodWxrZXJfYm94XCIsXG4gIEJhc2FsdCA9IFwibWluZWNyYWZ0OmJhc2FsdFwiLFxuICBXYXhlZFdlYXRoZXJlZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcl90cmFwZG9vclwiLFxuICBIYXJkQ3lhblN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfY3lhbl9zdGFpbmVkX2dsYXNzXCIsXG4gIFBvbGlzaGVkRGlvcml0ZSA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2Rpb3JpdGVcIixcbiAgRWxlbWVudDEzID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xM1wiLFxuICBDeWFuR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmN5YW5fZ2xhemVkX3RlcnJhY290dGFcIixcbiAgTGl0UmVkc3RvbmVMYW1wID0gXCJtaW5lY3JhZnQ6bGl0X3JlZHN0b25lX2xhbXBcIixcbiAgSGFyZFB1cnBsZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfcHVycGxlX3N0YWluZWRfZ2xhc3NcIixcbiAgWWVsbG93Q2FuZGxlQ2FrZSA9IFwibWluZWNyYWZ0OnllbGxvd19jYW5kbGVfY2FrZVwiLFxuICBTdGlja3lQaXN0b24gPSBcIm1pbmVjcmFmdDpzdGlja3lfcGlzdG9uXCIsXG4gIE1lZGl1bUFtZXRoeXN0QnVkID0gXCJtaW5lY3JhZnQ6bWVkaXVtX2FtZXRoeXN0X2J1ZFwiLFxuICBCcm93blNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpicm93bl9zaHVsa2VyX2JveFwiLFxuICBQaW5rU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OnBpbmtfc2h1bGtlcl9ib3hcIixcbiAgTGlnaHRCbHVlQ2FuZGxlID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jYW5kbGVcIixcbiAgRGVlcHNsYXRlVGlsZVN0YWlycyA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlX3N0YWlyc1wiLFxuICBTY3Vsa1NlbnNvciA9IFwibWluZWNyYWZ0OnNjdWxrX3NlbnNvclwiLFxuICBDb3BwZXJCdWxiID0gXCJtaW5lY3JhZnQ6Y29wcGVyX2J1bGJcIixcbiAgRWxlbWVudDYgPSBcIm1pbmVjcmFmdDplbGVtZW50XzZcIixcbiAgRWxlbWVudDk3ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF85N1wiLFxuICBEaW9yaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZGlvcml0ZV9zdGFpcnNcIixcbiAgU21vb3RoU3RvbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6c21vb3RoX3N0b25lX2RvdWJsZV9zbGFiXCIsXG4gIFNwcnVjZUxlYXZlcyA9IFwibWluZWNyYWZ0OnNwcnVjZV9sZWF2ZXNcIixcbiAgUmVkU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OnJlZF9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgRnJvZ1NwYXduID0gXCJtaW5lY3JhZnQ6ZnJvZ19zcGF3blwiLFxuICBFbGVtZW50MTExID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMTFcIixcbiAgQ3JpbXNvbkZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OmNyaW1zb25fZmVuY2VfZ2F0ZVwiLFxuICBSZWRDYXJwZXQgPSBcIm1pbmVjcmFmdDpyZWRfY2FycGV0XCIsXG4gIFNtb290aFNhbmRzdG9uZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc2FuZHN0b25lX2RvdWJsZV9zbGFiXCIsXG4gIFJlZFNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpyZWRfc2h1bGtlcl9ib3hcIixcbiAgRGlydFdpdGhSb290cyA9IFwibWluZWNyYWZ0OmRpcnRfd2l0aF9yb290c1wiLFxuICBTdHJpcHBlZENoZXJyeUxvZyA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2NoZXJyeV9sb2dcIixcbiAgSG9ybkNvcmFsV2FsbEZhbiA9IFwibWluZWNyYWZ0Omhvcm5fY29yYWxfd2FsbF9mYW5cIixcbiAgQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OmNvcHBlcl9kb29yXCIsXG4gIENyaW1zb25CdXR0b24gPSBcIm1pbmVjcmFmdDpjcmltc29uX2J1dHRvblwiLFxuICBNYWdlbnRhQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBQcmlzbWFyaW5lU3RhaXJzID0gXCJtaW5lY3JhZnQ6cHJpc21hcmluZV9zdGFpcnNcIixcbiAgSXJvbkRvb3IgPSBcIm1pbmVjcmFmdDppcm9uX2Rvb3JcIixcbiAgTWFuZ3JvdmVUcmFwZG9vciA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3RyYXBkb29yXCIsXG4gIERheWxpZ2h0RGV0ZWN0b3JJbnZlcnRlZCA9IFwibWluZWNyYWZ0OmRheWxpZ2h0X2RldGVjdG9yX2ludmVydGVkXCIsXG4gIEp1bmdsZVBsYW5rcyA9IFwibWluZWNyYWZ0Omp1bmdsZV9wbGFua3NcIixcbiAgQ2hvcnVzRmxvd2VyID0gXCJtaW5lY3JhZnQ6Y2hvcnVzX2Zsb3dlclwiLFxuICBUb3JjaGZsb3dlckNyb3AgPSBcIm1pbmVjcmFmdDp0b3JjaGZsb3dlcl9jcm9wXCIsXG4gIENyYWNrZWROZXRoZXJCcmlja3MgPSBcIm1pbmVjcmFmdDpjcmFja2VkX25ldGhlcl9icmlja3NcIixcbiAgUHVtcGtpbiA9IFwibWluZWNyYWZ0OnB1bXBraW5cIixcbiAgU21vb3RoU3RvbmUgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc3RvbmVcIixcbiAgR3Jhbml0ZVNsYWIgPSBcIm1pbmVjcmFmdDpncmFuaXRlX3NsYWJcIixcbiAgTGltZUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6bGltZV9jb25jcmV0ZVwiLFxuICBXYXhlZFdlYXRoZXJlZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIFJlZE11c2hyb29tID0gXCJtaW5lY3JhZnQ6cmVkX211c2hyb29tXCIsXG4gIEhhcmRZZWxsb3dTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX3llbGxvd19zdGFpbmVkX2dsYXNzXCIsXG4gIE1hZ2VudGFUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6bWFnZW50YV90ZXJyYWNvdHRhXCIsXG4gIEJsYWNrQ2FycGV0ID0gXCJtaW5lY3JhZnQ6YmxhY2tfY2FycGV0XCIsXG4gIEV4cG9zZWRDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIE1hbmdyb3ZlU3RhaXJzID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfc3RhaXJzXCIsXG4gIFBvbGlzaGVkRGlvcml0ZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kaW9yaXRlX3NsYWJcIixcbiAgUmVkU2FuZHN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6cmVkX3NhbmRzdG9uZV9zdGFpcnNcIixcbiAgTGlnaHRCbHVlQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX2NvbmNyZXRlXCIsXG4gIE1hbmdyb3ZlRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfZmVuY2VfZ2F0ZVwiLFxuICBCdWJibGVDb2x1bW4gPSBcIm1pbmVjcmFmdDpidWJibGVfY29sdW1uXCIsXG4gIFN1bmZsb3dlciA9IFwibWluZWNyYWZ0OnN1bmZsb3dlclwiLFxuICBBbGxvdyA9IFwibWluZWNyYWZ0OmFsbG93XCIsXG4gIEdyYXlDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmdyYXlfY29uY3JldGVfcG93ZGVyXCIsXG4gIEJhbWJvb0hhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2hhbmdpbmdfc2lnblwiLFxuICBXaXRoZXJSb3NlID0gXCJtaW5lY3JhZnQ6d2l0aGVyX3Jvc2VcIixcbiAgQ29wcGVyQmxvY2sgPSBcIm1pbmVjcmFmdDpjb3BwZXJfYmxvY2tcIixcbiAgQmlyY2hEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6YmlyY2hfZG91YmxlX3NsYWJcIixcbiAgV2F4ZWRXZWF0aGVyZWREb3VibGVDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2RvdWJsZV9jdXRfY29wcGVyX3NsYWJcIixcbiAgUG9saXNoZWRCbGFja3N0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9icmlja3NcIixcbiAgQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6Y3V0X2NvcHBlclwiLFxuICBGcm9zdGVkSWNlID0gXCJtaW5lY3JhZnQ6ZnJvc3RlZF9pY2VcIixcbiAgU3BydWNlRG9vciA9IFwibWluZWNyYWZ0OnNwcnVjZV9kb29yXCIsXG4gIENoaXNlbGVkU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfc2FuZHN0b25lXCIsXG4gIENoaXBwZWRBbnZpbCA9IFwibWluZWNyYWZ0OmNoaXBwZWRfYW52aWxcIixcbiAgV2FycGVkVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDp3YXJwZWRfdHJhcGRvb3JcIixcbiAgT3JhbmdlQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfY29uY3JldGVfcG93ZGVyXCIsXG4gIEZsb3dpbmdXYXRlciA9IFwibWluZWNyYWZ0OmZsb3dpbmdfd2F0ZXJcIixcbiAgQnJpY2tCbG9jayA9IFwibWluZWNyYWZ0OmJyaWNrX2Jsb2NrXCIsXG4gIEhhcmRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfZ2xhc3NcIixcbiAgQ2F2ZVZpbmVzID0gXCJtaW5lY3JhZnQ6Y2F2ZV92aW5lc1wiLFxuICBNYWdlbnRhU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEVsZW1lbnQ2MiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNjJcIixcbiAgTGlnaHRCbHVlQ2FycGV0ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jYXJwZXRcIixcbiAgT2FrSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpvYWtfaGFuZ2luZ19zaWduXCIsXG4gIFN0cmlwcGVkRGFya09ha1dvb2QgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9kYXJrX29ha193b29kXCIsXG4gIFdoaXRlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6d2hpdGVfc3RhaW5lZF9nbGFzc1wiLFxuICBPYWtXb29kID0gXCJtaW5lY3JhZnQ6b2FrX3dvb2RcIixcbiAgV2F4ZWRFeHBvc2VkRG91YmxlQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfZG91YmxlX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBXYXhlZE94aWRpemVkQ29wcGVyVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDp3YXhlZF9veGlkaXplZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgSnVrZWJveCA9IFwibWluZWNyYWZ0Omp1a2Vib3hcIixcbiAgU3RyaXBwZWRDaGVycnlXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfY2hlcnJ5X3dvb2RcIixcbiAgQWNhY2lhUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmFjYWNpYV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBTbW9vdGhSZWRTYW5kc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmVfc2xhYlwiLFxuICBKaWdzYXcgPSBcIm1pbmVjcmFmdDpqaWdzYXdcIixcbiAgQm9yZGVyQmxvY2sgPSBcIm1pbmVjcmFmdDpib3JkZXJfYmxvY2tcIixcbiAgU2hyb29tbGlnaHQgPSBcIm1pbmVjcmFmdDpzaHJvb21saWdodFwiLFxuICBZZWxsb3dDYW5kbGUgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfY2FuZGxlXCIsXG4gIERhcmtPYWtTdGFpcnMgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19zdGFpcnNcIixcbiAgRGVlcHNsYXRlVGlsZVdhbGwgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfdGlsZV93YWxsXCIsXG4gIEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmdsYXNzX3BhbmVcIixcbiAgQ2hpc2VsZWREZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9kZWVwc2xhdGVcIixcbiAgQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OmN1dF9jb3BwZXJfc2xhYlwiLFxuICBJbmZlc3RlZFN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfc3RvbmVfYnJpY2tzXCIsXG4gIEJhbWJvb1RyYXBkb29yID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3RyYXBkb29yXCIsXG4gIE94aWRpemVkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jaGlzZWxlZF9jb3BwZXJcIixcbiAgRGFya09ha1RyYXBkb29yID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfdHJhcGRvb3JcIixcbiAgTWFuZ3JvdmVXYWxsU2lnbiA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3dhbGxfc2lnblwiLFxuICBCZWV0cm9vdCA9IFwibWluZWNyYWZ0OmJlZXRyb290XCIsXG4gIFJhd0NvcHBlckJsb2NrID0gXCJtaW5lY3JhZnQ6cmF3X2NvcHBlcl9ibG9ja1wiLFxuICBIb3JuQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0Omhvcm5fY29yYWxfYmxvY2tcIixcbiAgU2t1bGwgPSBcIm1pbmVjcmFmdDpza3VsbFwiLFxuICBMaWdodEdyYXlDYW5kbGVDYWtlID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9jYW5kbGVfY2FrZVwiLFxuICBFbGVtZW50OTUgPSBcIm1pbmVjcmFmdDplbGVtZW50Xzk1XCIsXG4gIFdoaXRlQ2FuZGxlID0gXCJtaW5lY3JhZnQ6d2hpdGVfY2FuZGxlXCIsXG4gIEdvbGRlblJhaWwgPSBcIm1pbmVjcmFmdDpnb2xkZW5fcmFpbFwiLFxuICBMaXRGdXJuYWNlID0gXCJtaW5lY3JhZnQ6bGl0X2Z1cm5hY2VcIixcbiAgQ3lhbldvb2wgPSBcIm1pbmVjcmFmdDpjeWFuX3dvb2xcIixcbiAgUGV0cmlmaWVkT2FrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnBldHJpZmllZF9vYWtfZG91YmxlX3NsYWJcIixcbiAgU3RydWN0dXJlQmxvY2sgPSBcIm1pbmVjcmFmdDpzdHJ1Y3R1cmVfYmxvY2tcIixcbiAgVGludGVkR2xhc3MgPSBcIm1pbmVjcmFmdDp0aW50ZWRfZ2xhc3NcIixcbiAgRGVwcmVjYXRlZEFudmlsID0gXCJtaW5lY3JhZnQ6ZGVwcmVjYXRlZF9hbnZpbFwiLFxuICBHcmF5U2h1bGtlckJveCA9IFwibWluZWNyYWZ0OmdyYXlfc2h1bGtlcl9ib3hcIixcbiAgRmlyZUNvcmFsV2FsbEZhbiA9IFwibWluZWNyYWZ0OmZpcmVfY29yYWxfd2FsbF9mYW5cIixcbiAgSnVuZ2xlRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2ZlbmNlX2dhdGVcIixcbiAgRXhwb3NlZENvcHBlckdyYXRlID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJfZ3JhdGVcIixcbiAgV2F4ZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndheGVkX2NvcHBlcl9ncmF0ZVwiLFxuICBEZWFkQnJhaW5Db3JhbCA9IFwibWluZWNyYWZ0OmRlYWRfYnJhaW5fY29yYWxcIixcbiAgSnVuZ2xlVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpqdW5nbGVfdHJhcGRvb3JcIixcbiAgU3BydWNlV2FsbFNpZ24gPSBcIm1pbmVjcmFmdDpzcHJ1Y2Vfd2FsbF9zaWduXCIsXG4gIENvYWxCbG9jayA9IFwibWluZWNyYWZ0OmNvYWxfYmxvY2tcIixcbiAgV2FycGVkRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6d2FycGVkX2ZlbmNlX2dhdGVcIixcbiAgQ29tcG9zdGVyID0gXCJtaW5lY3JhZnQ6Y29tcG9zdGVyXCIsXG4gIEVsZW1lbnQ0NCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNDRcIixcbiAgV2F4ZWREb3VibGVDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZG91YmxlX2N1dF9jb3BwZXJfc2xhYlwiLFxuICBXYXhlZEV4cG9zZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfZG9vclwiLFxuICBCbHVlR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmJsdWVfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgQmx1ZVdvb2wgPSBcIm1pbmVjcmFmdDpibHVlX3dvb2xcIixcbiAgQ2xheSA9IFwibWluZWNyYWZ0OmNsYXlcIixcbiAgV2VlcGluZ1ZpbmVzID0gXCJtaW5lY3JhZnQ6d2VlcGluZ192aW5lc1wiLFxuICBDaG9ydXNQbGFudCA9IFwibWluZWNyYWZ0OmNob3J1c19wbGFudFwiLFxuICBNdWRCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0Om11ZF9icmlja19zdGFpcnNcIixcbiAgU21vb3RoUmVkU2FuZHN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmVfc3RhaXJzXCIsXG4gIEVsZW1lbnQxMDAgPSBcIm1pbmVjcmFmdDplbGVtZW50XzEwMFwiLFxuICBFbGVtZW50MTAzID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMDNcIixcbiAgRWxlbWVudDEwNSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTA1XCIsXG4gIENyaW1zb25QcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9wcmVzc3VyZV9wbGF0ZVwiLFxuICBFbGVtZW50MTA2ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMDZcIixcbiAgRWxlbWVudDEwNyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTA3XCIsXG4gIEhhcmRHcmF5U3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfZ3JheV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgRWxlbWVudDEwOCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTA4XCIsXG4gIEVsZW1lbnQxMDkgPSBcIm1pbmVjcmFmdDplbGVtZW50XzEwOVwiLFxuICBMaWdodEdyYXlTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9zaHVsa2VyX2JveFwiLFxuICBFbGVtZW50MTEyID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMTJcIixcbiAgRWxlbWVudDExMCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTEwXCIsXG4gIEVsZW1lbnQxMTYgPSBcIm1pbmVjcmFmdDplbGVtZW50XzExNlwiLFxuICBFbGVtZW50MTE0ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMTRcIixcbiAgV2hpdGVHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6d2hpdGVfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgU3RyaXBwZWRXYXJwZWRIeXBoYWUgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF93YXJwZWRfaHlwaGFlXCIsXG4gIEVsZW1lbnQ1MCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNTBcIixcbiAgUHVtcGtpblN0ZW0gPSBcIm1pbmVjcmFmdDpwdW1wa2luX3N0ZW1cIixcbiAgTGV2ZXIgPSBcIm1pbmVjcmFmdDpsZXZlclwiLFxuICBNb3ZpbmdCbG9jayA9IFwibWluZWNyYWZ0Om1vdmluZ19ibG9ja1wiLFxuICBUcmFwcGVkQ2hlc3QgPSBcIm1pbmVjcmFmdDp0cmFwcGVkX2NoZXN0XCIsXG4gIExpZ2h0R3JheUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgQnJhaW5Db3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6YnJhaW5fY29yYWxfYmxvY2tcIixcbiAgU3RhbmRpbmdTaWduID0gXCJtaW5lY3JhZnQ6c3RhbmRpbmdfc2lnblwiLFxuICBQdXJwbGVDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OnB1cnBsZV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgQmFtYm9vUGxhbmtzID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3BsYW5rc1wiLFxuICBDb21tYW5kQmxvY2sgPSBcIm1pbmVjcmFmdDpjb21tYW5kX2Jsb2NrXCIsXG4gIFR3aXN0aW5nVmluZXMgPSBcIm1pbmVjcmFmdDp0d2lzdGluZ192aW5lc1wiLFxuICBBY2FjaWFEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2RvdWJsZV9zbGFiXCIsXG4gIFBvbGlzaGVkQW5kZXNpdGVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGVfZG91YmxlX3NsYWJcIixcbiAgTWFnbWEgPSBcIm1pbmVjcmFmdDptYWdtYVwiLFxuICBEaXJ0ID0gXCJtaW5lY3JhZnQ6ZGlydFwiLFxuICBSZWVkcyA9IFwibWluZWNyYWZ0OnJlZWRzXCIsXG4gIERlbnkgPSBcIm1pbmVjcmFmdDpkZW55XCIsXG4gIEJlZU5lc3QgPSBcIm1pbmVjcmFmdDpiZWVfbmVzdFwiLFxuICBDYW1wZmlyZSA9IFwibWluZWNyYWZ0OmNhbXBmaXJlXCIsXG4gIFNvdWxTb2lsID0gXCJtaW5lY3JhZnQ6c291bF9zb2lsXCIsXG4gIEVsZW1lbnQ4ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF84XCIsXG4gIEVsZW1lbnQyOCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMjhcIixcbiAgRGFya09ha1ByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19wcmVzc3VyZV9wbGF0ZVwiLFxuICBTb3VsU2FuZCA9IFwibWluZWNyYWZ0OnNvdWxfc2FuZFwiLFxuICBDb2JibGVkRGVlcHNsYXRlRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX2RvdWJsZV9zbGFiXCIsXG4gIFNwcnVjZUhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6c3BydWNlX2hhbmdpbmdfc2lnblwiLFxuICBSZWluZm9yY2VkRGVlcHNsYXRlID0gXCJtaW5lY3JhZnQ6cmVpbmZvcmNlZF9kZWVwc2xhdGVcIixcbiAgRW5kUm9kID0gXCJtaW5lY3JhZnQ6ZW5kX3JvZFwiLFxuICBGbGV0Y2hpbmdUYWJsZSA9IFwibWluZWNyYWZ0OmZsZXRjaGluZ190YWJsZVwiLFxuICBDaGVycnlMZWF2ZXMgPSBcIm1pbmVjcmFmdDpjaGVycnlfbGVhdmVzXCIsXG4gIEJsYWNrR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmJsYWNrX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIFN0cmlwcGVkQWNhY2lhTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYWNhY2lhX2xvZ1wiLFxuICBTbmlmZmVyRWdnID0gXCJtaW5lY3JhZnQ6c25pZmZlcl9lZ2dcIixcbiAgV2FycGVkRmVuY2UgPSBcIm1pbmVjcmFmdDp3YXJwZWRfZmVuY2VcIixcbiAgQ2F2ZVZpbmVzQm9keVdpdGhCZXJyaWVzID0gXCJtaW5lY3JhZnQ6Y2F2ZV92aW5lc19ib2R5X3dpdGhfYmVycmllc1wiLFxuICBDaGVycnlTdGFuZGluZ1NpZ24gPSBcIm1pbmVjcmFmdDpjaGVycnlfc3RhbmRpbmdfc2lnblwiLFxuICBNYW5ncm92ZUhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfaGFuZ2luZ19zaWduXCIsXG4gIFdheGVkRXhwb3NlZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfdHJhcGRvb3JcIixcbiAgTW9zc3lTdG9uZUJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tfc3RhaXJzXCIsXG4gIENyaW1zb25TdGVtID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9zdGVtXCIsXG4gIENvbG9yZWRUb3JjaFJnID0gXCJtaW5lY3JhZnQ6Y29sb3JlZF90b3JjaF9yZ1wiLFxuICBUdWZmQnJpY2tEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6dHVmZl9icmlja19kb3VibGVfc2xhYlwiLFxuICBWYXVsdCA9IFwibWluZWNyYWZ0OnZhdWx0XCIsXG4gIEF6YWxlYUxlYXZlc0Zsb3dlcmVkID0gXCJtaW5lY3JhZnQ6YXphbGVhX2xlYXZlc19mbG93ZXJlZFwiLFxuICBFbGVtZW50MTggPSBcIm1pbmVjcmFmdDplbGVtZW50XzE4XCIsXG4gIENyaW1zb25TbGFiID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9zbGFiXCIsXG4gIFdhcnBlZEh5cGhhZSA9IFwibWluZWNyYWZ0OndhcnBlZF9oeXBoYWVcIixcbiAgT3hleWVEYWlzeSA9IFwibWluZWNyYWZ0Om94ZXllX2RhaXN5XCIsXG4gIEJhbWJvb0J1dHRvbiA9IFwibWluZWNyYWZ0OmJhbWJvb19idXR0b25cIixcbiAgV2FycGVkV2FydEJsb2NrID0gXCJtaW5lY3JhZnQ6d2FycGVkX3dhcnRfYmxvY2tcIixcbiAgVHVmZlN0YWlycyA9IFwibWluZWNyYWZ0OnR1ZmZfc3RhaXJzXCIsXG4gIFllbGxvd0NhcnBldCA9IFwibWluZWNyYWZ0OnllbGxvd19jYXJwZXRcIixcbiAgQmxhY2tTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpibGFja19zdGFpbmVkX2dsYXNzXCIsXG4gIFdheGVkT3hpZGl6ZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX2Rvb3JcIixcbiAgR3Jhc3NCbG9jayA9IFwibWluZWNyYWZ0OmdyYXNzX2Jsb2NrXCIsXG4gIFRyaXB3aXJlSG9vayA9IFwibWluZWNyYWZ0OnRyaXB3aXJlX2hvb2tcIixcbiAgSGFyZEJsYWNrU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9ibGFja19zdGFpbmVkX2dsYXNzXCIsXG4gIFN0cmlwcGVkQmlyY2hMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9iaXJjaF9sb2dcIixcbiAgUmVkVHVsaXAgPSBcIm1pbmVjcmFmdDpyZWRfdHVsaXBcIixcbiAgQ3V0U2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6Y3V0X3NhbmRzdG9uZVwiLFxuICBMaW1lV29vbCA9IFwibWluZWNyYWZ0OmxpbWVfd29vbFwiLFxuICBCbHVlQ2FuZGxlQ2FrZSA9IFwibWluZWNyYWZ0OmJsdWVfY2FuZGxlX2Nha2VcIixcbiAgTGFyZ2VGZXJuID0gXCJtaW5lY3JhZnQ6bGFyZ2VfZmVyblwiLFxuICBTd2VldEJlcnJ5QnVzaCA9IFwibWluZWNyYWZ0OnN3ZWV0X2JlcnJ5X2J1c2hcIixcbiAgUG9saXNoZWRCbGFja3N0b25lU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfc2xhYlwiLFxuICBCbGFja1NodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpibGFja19zaHVsa2VyX2JveFwiLFxuICBKdW5nbGVTYXBsaW5nID0gXCJtaW5lY3JhZnQ6anVuZ2xlX3NhcGxpbmdcIixcbiAgQmx1ZUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6Ymx1ZV9jb25jcmV0ZVwiLFxuICBKdW5nbGVTdGFuZGluZ1NpZ24gPSBcIm1pbmVjcmFmdDpqdW5nbGVfc3RhbmRpbmdfc2lnblwiLFxuICBXZWIgPSBcIm1pbmVjcmFmdDp3ZWJcIixcbiAgV2VhdGhlcmVkQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyX3NsYWJcIixcbiAgQ29jb2EgPSBcIm1pbmVjcmFmdDpjb2NvYVwiLFxuICBEYXJrT2FrTGVhdmVzID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfbGVhdmVzXCIsXG4gIE9yYW5nZVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfdGVycmFjb3R0YVwiLFxuICBGaXJlID0gXCJtaW5lY3JhZnQ6ZmlyZVwiLFxuICBQdXJwdXJEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6cHVycHVyX2RvdWJsZV9zbGFiXCIsXG4gIEV4cG9zZWRDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIEluZmVzdGVkU3RvbmUgPSBcIm1pbmVjcmFmdDppbmZlc3RlZF9zdG9uZVwiLFxuICBFbmRQb3J0YWxGcmFtZSA9IFwibWluZWNyYWZ0OmVuZF9wb3J0YWxfZnJhbWVcIixcbiAgUHJpc21hcmluZSA9IFwibWluZWNyYWZ0OnByaXNtYXJpbmVcIixcbiAgTWFnZW50YUNhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2NhbmRsZV9jYWtlXCIsXG4gIERlZXBzbGF0ZUdvbGRPcmUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfZ29sZF9vcmVcIixcbiAgSGFyZE9yYW5nZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfb3JhbmdlX3N0YWluZWRfZ2xhc3NcIixcbiAgR2xhc3MgPSBcIm1pbmVjcmFmdDpnbGFzc1wiLFxuICBNb3NzQmxvY2sgPSBcIm1pbmVjcmFmdDptb3NzX2Jsb2NrXCIsXG4gIE5ldGhlckJyaWNrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0Om5ldGhlcl9icmlja19kb3VibGVfc2xhYlwiLFxuICBFeHBvc2VkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jdXRfY29wcGVyXCIsXG4gIFByaXNtYXJpbmVCcmlja0RvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX2JyaWNrX2RvdWJsZV9zbGFiXCIsXG4gIEJvb2tzaGVsZiA9IFwibWluZWNyYWZ0OmJvb2tzaGVsZlwiLFxuICBXYXhlZFdlYXRoZXJlZEN1dENvcHBlclN0YWlycyA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyX3N0YWlyc1wiLFxuICBNYW5ncm92ZVJvb3RzID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfcm9vdHNcIixcbiAgQWNhY2lhU3RhaXJzID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3N0YWlyc1wiLFxuICBQb2xpc2hlZEFuZGVzaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGVfc3RhaXJzXCIsXG4gIENoZXJyeVNsYWIgPSBcIm1pbmVjcmFmdDpjaGVycnlfc2xhYlwiLFxuICBTbW9vdGhSZWRTYW5kc3RvbmVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmVfZG91YmxlX3NsYWJcIixcbiAgTGl0Qmxhc3RGdXJuYWNlID0gXCJtaW5lY3JhZnQ6bGl0X2JsYXN0X2Z1cm5hY2VcIixcbiAgRWxlbWVudDExID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMVwiLFxuICBTY3VsayA9IFwibWluZWNyYWZ0OnNjdWxrXCIsXG4gIFR1ZmZCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0OnR1ZmZfYnJpY2tfc3RhaXJzXCIsXG4gIENoZW1pc3RyeVRhYmxlID0gXCJtaW5lY3JhZnQ6Y2hlbWlzdHJ5X3RhYmxlXCIsXG4gIERlYWRGaXJlQ29yYWwgPSBcIm1pbmVjcmFmdDpkZWFkX2ZpcmVfY29yYWxcIixcbiAgU3RvbmVCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpzdG9uZV9icmlja19zbGFiXCIsXG4gIFN0cmlwcGVkU3BydWNlTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfc3BydWNlX2xvZ1wiLFxuICBXYXhlZE94aWRpemVkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl9idWxiXCIsXG4gIERlZXBzbGF0ZUJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrX3N0YWlyc1wiLFxuICBXYXJwZWROeWxpdW0gPSBcIm1pbmVjcmFmdDp3YXJwZWRfbnlsaXVtXCIsXG4gIERlZXBzbGF0ZUVtZXJhbGRPcmUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfZW1lcmFsZF9vcmVcIixcbiAgU3RyaXBwZWRDcmltc29uU3RlbSA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2NyaW1zb25fc3RlbVwiLFxuICBBY2FjaWFTYXBsaW5nID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3NhcGxpbmdcIixcbiAgU3RvbmVjdXR0ZXJCbG9jayA9IFwibWluZWNyYWZ0OnN0b25lY3V0dGVyX2Jsb2NrXCIsXG4gIEFuZGVzaXRlU2xhYiA9IFwibWluZWNyYWZ0OmFuZGVzaXRlX3NsYWJcIixcbiAgQ3lhblNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpjeWFuX3NodWxrZXJfYm94XCIsXG4gIFVucG93ZXJlZENvbXBhcmF0b3IgPSBcIm1pbmVjcmFmdDp1bnBvd2VyZWRfY29tcGFyYXRvclwiLFxuICBMaW1lQ2FuZGxlID0gXCJtaW5lY3JhZnQ6bGltZV9jYW5kbGVcIixcbiAgVGFyZ2V0ID0gXCJtaW5lY3JhZnQ6dGFyZ2V0XCIsXG4gIFdvb2RlbkJ1dHRvbiA9IFwibWluZWNyYWZ0Ondvb2Rlbl9idXR0b25cIixcbiAgTWFuZ3JvdmVEb29yID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfZG9vclwiLFxuICBFbmRTdG9uZUJyaWNrRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OmVuZF9zdG9uZV9icmlja19kb3VibGVfc2xhYlwiLFxuICBXZWF0aGVyZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl9kb29yXCIsXG4gIFBlYXJsZXNjZW50RnJvZ2xpZ2h0ID0gXCJtaW5lY3JhZnQ6cGVhcmxlc2NlbnRfZnJvZ2xpZ2h0XCIsXG4gIFRhbGxHcmFzcyA9IFwibWluZWNyYWZ0OnRhbGxfZ3Jhc3NcIixcbiAgTGlnaHRCbG9jazE1ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMTVcIixcbiAgRWxlbWVudDY0ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF82NFwiLFxuICBOZXRoZXJTcHJvdXRzID0gXCJtaW5lY3JhZnQ6bmV0aGVyX3Nwcm91dHNcIixcbiAgRWxlbWVudDkyID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF85MlwiLFxuICBDeWFuU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmN5YW5fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIERlYWRIb3JuQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmRlYWRfaG9ybl9jb3JhbF9ibG9ja1wiLFxuICBFbGVtZW50MTIgPSBcIm1pbmVjcmFmdDplbGVtZW50XzEyXCIsXG4gIERlYWRIb3JuQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpkZWFkX2hvcm5fY29yYWxfZmFuXCIsXG4gIEZ1cm5hY2UgPSBcIm1pbmVjcmFmdDpmdXJuYWNlXCIsXG4gIFdhcnBlZFNsYWIgPSBcIm1pbmVjcmFmdDp3YXJwZWRfc2xhYlwiLFxuICBOZXRoZXJyYWNrID0gXCJtaW5lY3JhZnQ6bmV0aGVycmFja1wiLFxuICBXYXJwZWRTdGVtID0gXCJtaW5lY3JhZnQ6d2FycGVkX3N0ZW1cIixcbiAgQ2hhaW4gPSBcIm1pbmVjcmFmdDpjaGFpblwiLFxuICBIb3JuQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpob3JuX2NvcmFsX2ZhblwiLFxuICBHcmVlblNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpncmVlbl9zaHVsa2VyX2JveFwiLFxuICBCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0OmJyaWNrX3N0YWlyc1wiLFxuICBQdXJwbGVDYXJwZXQgPSBcIm1pbmVjcmFmdDpwdXJwbGVfY2FycGV0XCIsXG4gIEZpcmVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OmZpcmVfY29yYWxfZmFuXCIsXG4gIEVsZW1lbnQ2OSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNjlcIixcbiAgU3BydWNlVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfdHJhcGRvb3JcIixcbiAgUHVycGxlR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnB1cnBsZV9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBDaGFpbkNvbW1hbmRCbG9jayA9IFwibWluZWNyYWZ0OmNoYWluX2NvbW1hbmRfYmxvY2tcIixcbiAgU3BydWNlRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6c3BydWNlX2ZlbmNlX2dhdGVcIixcbiAgUmVkTmV0aGVyQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDpyZWRfbmV0aGVyX2JyaWNrX3N0YWlyc1wiLFxuICBHcmVlbkdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpncmVlbl9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBEZWVwc2xhdGVSZWRzdG9uZU9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9yZWRzdG9uZV9vcmVcIixcbiAgRGVhZEJyYWluQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmRlYWRfYnJhaW5fY29yYWxfYmxvY2tcIixcbiAgTWFuZ3JvdmVGZW5jZSA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2ZlbmNlXCIsXG4gIEJpcmNoVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpiaXJjaF90cmFwZG9vclwiLFxuICBUdWZmQnJpY2tzID0gXCJtaW5lY3JhZnQ6dHVmZl9icmlja3NcIixcbiAgTXVkID0gXCJtaW5lY3JhZnQ6bXVkXCIsXG4gIEljZSA9IFwibWluZWNyYWZ0OmljZVwiLFxuICBBaXIgPSBcIm1pbmVjcmFmdDphaXJcIixcbiAgQmVkID0gXCJtaW5lY3JhZnQ6YmVkXCIsXG4gIExpZ2h0Qmx1ZVdvb2wgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX3dvb2xcIixcbiAgQmxhY2tDb25jcmV0ZSA9IFwibWluZWNyYWZ0OmJsYWNrX2NvbmNyZXRlXCIsXG4gIFRudCA9IFwibWluZWNyYWZ0OnRudFwiLFxuICBEZWFkVHViZUNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFsX2ZhblwiLFxuICBQb2xpc2hlZERpb3JpdGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kaW9yaXRlX3N0YWlyc1wiLFxuICBFbGVtZW50ODMgPSBcIm1pbmVjcmFmdDplbGVtZW50XzgzXCIsXG4gIE9yYW5nZUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6b3JhbmdlX2NvbmNyZXRlXCIsXG4gIE5ldGhlcnJlYWN0b3IgPSBcIm1pbmVjcmFmdDpuZXRoZXJyZWFjdG9yXCIsXG4gIExpbWVDYXJwZXQgPSBcIm1pbmVjcmFmdDpsaW1lX2NhcnBldFwiLFxuICBEZWFkRmlyZUNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF9maXJlX2NvcmFsX2ZhblwiLFxuICBEZWNvcmF0ZWRQb3QgPSBcIm1pbmVjcmFmdDpkZWNvcmF0ZWRfcG90XCIsXG4gIEdyYW5pdGVEb3VibGVTbGFiID0gXCJtaW5lY3JhZnQ6Z3Jhbml0ZV9kb3VibGVfc2xhYlwiLFxuICBFbmNoYW50aW5nVGFibGUgPSBcIm1pbmVjcmFmdDplbmNoYW50aW5nX3RhYmxlXCIsXG4gIEJ1YmJsZUNvcmFsV2FsbEZhbiA9IFwibWluZWNyYWZ0OmJ1YmJsZV9jb3JhbF93YWxsX2ZhblwiLFxuICBPcmFuZ2VUdWxpcCA9IFwibWluZWNyYWZ0Om9yYW5nZV90dWxpcFwiLFxuICBBemFsZWEgPSBcIm1pbmVjcmFmdDphemFsZWFcIixcbiAgQmVsbCA9IFwibWluZWNyYWZ0OmJlbGxcIixcbiAgTXVkQnJpY2tzID0gXCJtaW5lY3JhZnQ6bXVkX2JyaWNrc1wiLFxuICBCaXJjaFdhbGxTaWduID0gXCJtaW5lY3JhZnQ6YmlyY2hfd2FsbF9zaWduXCIsXG4gIEJhbWJvb1dhbGxTaWduID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3dhbGxfc2lnblwiLFxuICBBY2FjaWFXb29kID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3dvb2RcIixcbiAgSG9wcGVyID0gXCJtaW5lY3JhZnQ6aG9wcGVyXCIsXG4gIEhhcmRSZWRTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX3JlZF9zdGFpbmVkX2dsYXNzXCIsXG4gIFByaXNtYXJpbmVCcmlja3MgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX2JyaWNrc1wiLFxuICBMZWN0ZXJuID0gXCJtaW5lY3JhZnQ6bGVjdGVyblwiLFxuICBBY2FjaWFCdXR0b24gPSBcIm1pbmVjcmFmdDphY2FjaWFfYnV0dG9uXCIsXG4gIFN0YW5kaW5nQmFubmVyID0gXCJtaW5lY3JhZnQ6c3RhbmRpbmdfYmFubmVyXCIsXG4gIFNlYUxhbnRlcm4gPSBcIm1pbmVjcmFmdDpzZWFfbGFudGVyblwiLFxuICBXYXhlZE94aWRpemVkRG91YmxlQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2RvdWJsZV9jdXRfY29wcGVyX3NsYWJcIixcbiAgTGlnaHRCbHVlU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfc2h1bGtlcl9ib3hcIixcbiAgTWFuZ3JvdmVQcm9wYWd1bGUgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9wcm9wYWd1bGVcIixcbiAgUG9saXNoZWREaW9yaXRlRG91YmxlU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2Rpb3JpdGVfZG91YmxlX3NsYWJcIixcbiAgTW9zc3lDb2JibGVzdG9uZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDptb3NzeV9jb2JibGVzdG9uZV9kb3VibGVfc2xhYlwiLFxuICBCaXJjaFN0YWlycyA9IFwibWluZWNyYWZ0OmJpcmNoX3N0YWlyc1wiLFxuICBTcHJ1Y2VTbGFiID0gXCJtaW5lY3JhZnQ6c3BydWNlX3NsYWJcIixcbiAgQmxhY2tzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OmJsYWNrc3RvbmVfc3RhaXJzXCIsXG4gIEJsdWVJY2UgPSBcIm1pbmVjcmFmdDpibHVlX2ljZVwiLFxuICBIYXJkUmVkU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfcmVkX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBMYW50ZXJuID0gXCJtaW5lY3JhZnQ6bGFudGVyblwiLFxuICBEYXJrT2FrRmVuY2UgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19mZW5jZVwiLFxuICBCaXJjaERvb3IgPSBcIm1pbmVjcmFmdDpiaXJjaF9kb29yXCIsXG4gIERlZXBzbGF0ZUxhcGlzT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2xhcGlzX29yZVwiLFxuICBDcmltc29uSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpjcmltc29uX2hhbmdpbmdfc2lnblwiLFxuICBEZWVwc2xhdGVDb2FsT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2NvYWxfb3JlXCIsXG4gIFdlYXRoZXJlZEN1dENvcHBlciA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyXCIsXG4gIEJhbWJvb1N0YW5kaW5nU2lnbiA9IFwibWluZWNyYWZ0OmJhbWJvb19zdGFuZGluZ19zaWduXCIsXG4gIFN0cmlwcGVkTWFuZ3JvdmVMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9tYW5ncm92ZV9sb2dcIixcbiAgUG9saXNoZWRUdWZmID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfdHVmZlwiLFxuICBNYWdlbnRhU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9zdGFpbmVkX2dsYXNzXCIsXG4gIFdlYXRoZXJlZENvcHBlckJ1bGIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY29wcGVyX2J1bGJcIixcbiAgSGFyZFdoaXRlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfd2hpdGVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEhhcmRDeWFuU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfY3lhbl9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgQ2hpc2VsZWROZXRoZXJCcmlja3MgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9uZXRoZXJfYnJpY2tzXCIsXG4gIFdhcnBlZEJ1dHRvbiA9IFwibWluZWNyYWZ0OndhcnBlZF9idXR0b25cIixcbiAgUmVkQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpyZWRfY29uY3JldGVfcG93ZGVyXCIsXG4gIERlYWRCdWJibGVDb3JhbCA9IFwibWluZWNyYWZ0OmRlYWRfYnViYmxlX2NvcmFsXCIsXG4gIENoZXJyeVNhcGxpbmcgPSBcIm1pbmVjcmFmdDpjaGVycnlfc2FwbGluZ1wiLFxuICBDaGVycnlMb2cgPSBcIm1pbmVjcmFmdDpjaGVycnlfbG9nXCIsXG4gIFBvbGlzaGVkVHVmZlN0YWlycyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmZfc3RhaXJzXCIsXG4gIERyYWdvbkVnZyA9IFwibWluZWNyYWZ0OmRyYWdvbl9lZ2dcIixcbiAgTmV0aGVyQnJpY2sgPSBcIm1pbmVjcmFmdDpuZXRoZXJfYnJpY2tcIixcbiAgRGVlcHNsYXRlSXJvbk9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9pcm9uX29yZVwiLFxuICBFbGVtZW50MyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfM1wiLFxuICBFbGVtZW50MiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMlwiLFxuICBFbGVtZW50NSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNVwiLFxuICBFbGVtZW50NCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNFwiLFxuICBFbGVtZW50NyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfN1wiLFxuICBFbGVtZW50OSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfOVwiLFxuICBDYW1lcmEgPSBcIm1pbmVjcmFmdDpjYW1lcmFcIixcbiAgV2F4ZWRDdXRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9jdXRfY29wcGVyXCIsXG4gIEVsZW1lbnQ0NyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNDdcIixcbiAgQ29iYmxlZERlZXBzbGF0ZVNsYWIgPSBcIm1pbmVjcmFmdDpjb2JibGVkX2RlZXBzbGF0ZV9zbGFiXCIsXG4gIExpbGFjID0gXCJtaW5lY3JhZnQ6bGlsYWNcIixcbiAgQ3JpbXNvblN0YW5kaW5nU2lnbiA9IFwibWluZWNyYWZ0OmNyaW1zb25fc3RhbmRpbmdfc2lnblwiLFxuICBFbWVyYWxkT3JlID0gXCJtaW5lY3JhZnQ6ZW1lcmFsZF9vcmVcIixcbiAgQnJvd25NdXNocm9vbUJsb2NrID0gXCJtaW5lY3JhZnQ6YnJvd25fbXVzaHJvb21fYmxvY2tcIixcbiAgUGV0cmlmaWVkT2FrU2xhYiA9IFwibWluZWNyYWZ0OnBldHJpZmllZF9vYWtfc2xhYlwiLFxuICBDYXJ2ZWRQdW1wa2luID0gXCJtaW5lY3JhZnQ6Y2FydmVkX3B1bXBraW5cIixcbiAgRHJvcHBlciA9IFwibWluZWNyYWZ0OmRyb3BwZXJcIixcbiAgQ2FuZGxlID0gXCJtaW5lY3JhZnQ6Y2FuZGxlXCIsXG4gIFBvbGlzaGVkQW5kZXNpdGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGVfc2xhYlwiLFxuICBBY2FjaWFTbGFiID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3NsYWJcIixcbiAgQ29iYmxlZERlZXBzbGF0ZVdhbGwgPSBcIm1pbmVjcmFmdDpjb2JibGVkX2RlZXBzbGF0ZV93YWxsXCIsXG4gIFBvaW50ZWREcmlwc3RvbmUgPSBcIm1pbmVjcmFmdDpwb2ludGVkX2RyaXBzdG9uZVwiLFxuICBDdXRSZWRTYW5kc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6Y3V0X3JlZF9zYW5kc3RvbmVfc2xhYlwiLFxuICBDaGlzZWxlZFR1ZmZCcmlja3MgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF90dWZmX2JyaWNrc1wiLFxuICBDaGVtaWNhbEhlYXQgPSBcIm1pbmVjcmFmdDpjaGVtaWNhbF9oZWF0XCIsXG4gIFRyaXBXaXJlID0gXCJtaW5lY3JhZnQ6dHJpcF93aXJlXCIsXG4gIENhdmVWaW5lc0hlYWRXaXRoQmVycmllcyA9IFwibWluZWNyYWZ0OmNhdmVfdmluZXNfaGVhZF93aXRoX2JlcnJpZXNcIixcbiAgQ2hpc2VsZWRSZWRTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9yZWRfc2FuZHN0b25lXCIsXG4gIEJyaWNrU2xhYiA9IFwibWluZWNyYWZ0OmJyaWNrX3NsYWJcIixcbiAgQnJld2luZ1N0YW5kID0gXCJtaW5lY3JhZnQ6YnJld2luZ19zdGFuZFwiLFxuICBCYW1ib29TYXBsaW5nID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3NhcGxpbmdcIixcbiAgU21vb3RoUXVhcnR6U2xhYiA9IFwibWluZWNyYWZ0OnNtb290aF9xdWFydHpfc2xhYlwiLFxuICBXaGl0ZUNhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDp3aGl0ZV9jYW5kbGVfY2FrZVwiLFxuICBFbmRQb3J0YWwgPSBcIm1pbmVjcmFmdDplbmRfcG9ydGFsXCIsXG4gIEp1bmdsZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpqdW5nbGVfZG91YmxlX3NsYWJcIixcbiAgU3BydWNlV29vZCA9IFwibWluZWNyYWZ0OnNwcnVjZV93b29kXCIsXG4gIEJsYWNrc3RvbmUgPSBcIm1pbmVjcmFmdDpibGFja3N0b25lXCIsXG4gIExpdERlZXBzbGF0ZVJlZHN0b25lT3JlID0gXCJtaW5lY3JhZnQ6bGl0X2RlZXBzbGF0ZV9yZWRzdG9uZV9vcmVcIixcbiAgRWxlbWVudDEwID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8xMFwiLFxuICBFbGVtZW50MTQgPSBcIm1pbmVjcmFmdDplbGVtZW50XzE0XCIsXG4gIEVsZW1lbnQxNSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMTVcIixcbiAgRWxlbWVudDM2ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8zNlwiLFxuICBFbGVtZW50MzcgPSBcIm1pbmVjcmFmdDplbGVtZW50XzM3XCIsXG4gIEVsZW1lbnQzNCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMzRcIixcbiAgRWxlbWVudDM1ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8zNVwiLFxuICBFbGVtZW50MzIgPSBcIm1pbmVjcmFmdDplbGVtZW50XzMyXCIsXG4gIEVsZW1lbnQzMyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMzNcIixcbiAgRWxlbWVudDMxID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8zMVwiLFxuICBFbGVtZW50MzggPSBcIm1pbmVjcmFmdDplbGVtZW50XzM4XCIsXG4gIEVsZW1lbnQyOSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMjlcIixcbiAgRWxlbWVudDIxID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8yMVwiLFxuICBFbGVtZW50MjAgPSBcIm1pbmVjcmFmdDplbGVtZW50XzIwXCIsXG4gIEVsZW1lbnQyMyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMjNcIixcbiAgRWxlbWVudDIyID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8yMlwiLFxuICBFbGVtZW50MjUgPSBcIm1pbmVjcmFmdDplbGVtZW50XzI1XCIsXG4gIEVsZW1lbnQyNCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfMjRcIixcbiAgRWxlbWVudDI3ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF8yN1wiLFxuICBFbGVtZW50MjYgPSBcIm1pbmVjcmFmdDplbGVtZW50XzI2XCIsXG4gIEVsZW1lbnQ1OSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNTlcIixcbiAgRWxlbWVudDU0ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF81NFwiLFxuICBFbGVtZW50NTUgPSBcIm1pbmVjcmFmdDplbGVtZW50XzU1XCIsXG4gIEVsZW1lbnQ1NiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNTZcIixcbiAgRWxlbWVudDU3ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF81N1wiLFxuICBFbGVtZW50NTMgPSBcIm1pbmVjcmFmdDplbGVtZW50XzUzXCIsXG4gIEVsZW1lbnQ0OSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNDlcIixcbiAgRWxlbWVudDQ4ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF80OFwiLFxuICBFbGVtZW50NDUgPSBcIm1pbmVjcmFmdDplbGVtZW50XzQ1XCIsXG4gIEVsZW1lbnQ0MyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNDNcIixcbiAgRWxlbWVudDQyID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF80MlwiLFxuICBFbGVtZW50NDEgPSBcIm1pbmVjcmFmdDplbGVtZW50XzQxXCIsXG4gIEVsZW1lbnQ0MCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNDBcIixcbiAgRWxlbWVudDcyID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF83MlwiLFxuICBFbGVtZW50NzAgPSBcIm1pbmVjcmFmdDplbGVtZW50XzcwXCIsXG4gIEVsZW1lbnQ3MSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNzFcIixcbiAgRWxlbWVudDc2ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF83NlwiLFxuICBFbGVtZW50NzUgPSBcIm1pbmVjcmFmdDplbGVtZW50Xzc1XCIsXG4gIEVsZW1lbnQ3OCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNzhcIixcbiAgRWxlbWVudDc5ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF83OVwiLFxuICBFbGVtZW50NjUgPSBcIm1pbmVjcmFmdDplbGVtZW50XzY1XCIsXG4gIEVsZW1lbnQ2NyA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNjdcIixcbiAgUG9saXNoZWREZWVwc2xhdGVXYWxsID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlX3dhbGxcIixcbiAgRWxlbWVudDY2ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF82NlwiLFxuICBFbGVtZW50NjEgPSBcIm1pbmVjcmFmdDplbGVtZW50XzYxXCIsXG4gIEVsZW1lbnQ2MCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfNjBcIixcbiAgRWxlbWVudDYzID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF82M1wiLFxuICBFbGVtZW50OTggPSBcIm1pbmVjcmFmdDplbGVtZW50Xzk4XCIsXG4gIEVsZW1lbnQ5MCA9IFwibWluZWNyYWZ0OmVsZW1lbnRfOTBcIixcbiAgRWxlbWVudDkxID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF85MVwiLFxuICBFbGVtZW50OTQgPSBcIm1pbmVjcmFmdDplbGVtZW50Xzk0XCIsXG4gIEVsZW1lbnQ5NiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfOTZcIixcbiAgRWxlbWVudDg4ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF84OFwiLFxuICBFbGVtZW50ODIgPSBcIm1pbmVjcmFmdDplbGVtZW50XzgyXCIsXG4gIEVsZW1lbnQ4MSA9IFwibWluZWNyYWZ0OmVsZW1lbnRfODFcIixcbiAgRWxlbWVudDgwID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF84MFwiLFxuICBFbGVtZW50ODcgPSBcIm1pbmVjcmFmdDplbGVtZW50Xzg3XCIsXG4gIEVsZW1lbnQ4NiA9IFwibWluZWNyYWZ0OmVsZW1lbnRfODZcIixcbiAgRWxlbWVudDg0ID0gXCJtaW5lY3JhZnQ6ZWxlbWVudF84NFwiLFxuICBMaXRTbW9rZXIgPSBcIm1pbmVjcmFmdDpsaXRfc21va2VyXCIsXG4gIFNtb290aFF1YXJ0elN0YWlycyA9IFwibWluZWNyYWZ0OnNtb290aF9xdWFydHpfc3RhaXJzXCIsXG4gIExpZ2h0R3JheUNhcnBldCA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FycGV0XCIsXG4gIFB1cnB1ckJsb2NrID0gXCJtaW5lY3JhZnQ6cHVycHVyX2Jsb2NrXCIsXG4gIENoZXJyeVdhbGxTaWduID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3dhbGxfc2lnblwiLFxuICBDeWFuQ2FuZGxlID0gXCJtaW5lY3JhZnQ6Y3lhbl9jYW5kbGVcIixcbiAgUmVwZWF0aW5nQ29tbWFuZEJsb2NrID0gXCJtaW5lY3JhZnQ6cmVwZWF0aW5nX2NvbW1hbmRfYmxvY2tcIixcbiAgQ3JpbXNvbkZ1bmd1cyA9IFwibWluZWNyYWZ0OmNyaW1zb25fZnVuZ3VzXCIsXG4gIENoZXJyeVBsYW5rcyA9IFwibWluZWNyYWZ0OmNoZXJyeV9wbGFua3NcIixcbiAgUG9saXNoZWREZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kZWVwc2xhdGVcIixcbiAgVHVmZkRvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDp0dWZmX2RvdWJsZV9zbGFiXCIsXG4gIFB1cnB1clN0YWlycyA9IFwibWluZWNyYWZ0OnB1cnB1cl9zdGFpcnNcIixcbiAgVHViZUNvcmFsID0gXCJtaW5lY3JhZnQ6dHViZV9jb3JhbFwiLFxuICBXYXhlZENvcHBlckRvb3IgPSBcIm1pbmVjcmFmdDp3YXhlZF9jb3BwZXJfZG9vclwiLFxuICBQb3J0YWwgPSBcIm1pbmVjcmFmdDpwb3J0YWxcIixcbiAgUGVvbnkgPSBcIm1pbmVjcmFmdDpwZW9ueVwiLFxuICBDcmFmdGVyID0gXCJtaW5lY3JhZnQ6Y3JhZnRlclwiLFxuICBTcHJ1Y2VQbGFua3MgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfcGxhbmtzXCIsXG4gIEFtZXRoeXN0Q2x1c3RlciA9IFwibWluZWNyYWZ0OmFtZXRoeXN0X2NsdXN0ZXJcIixcbiAgV2F4ZWRDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBXYXhlZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3YXhlZF9jdXRfY29wcGVyX3NsYWJcIixcbiAgRHJpZWRLZWxwQmxvY2sgPSBcIm1pbmVjcmFmdDpkcmllZF9rZWxwX2Jsb2NrXCIsXG4gIEhhcmRMaWdodEdyYXlTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2xpZ2h0X2dyYXlfc3RhaW5lZF9nbGFzc1wiLFxuICBDcmltc29uRmVuY2UgPSBcIm1pbmVjcmFmdDpjcmltc29uX2ZlbmNlXCIsXG4gIENoaXNlbGVkVHVmZiA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX3R1ZmZcIixcbiAgTGltZUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6bGltZV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgQmlyY2hGZW5jZSA9IFwibWluZWNyYWZ0OmJpcmNoX2ZlbmNlXCIsXG4gIFR1cnRsZUVnZyA9IFwibWluZWNyYWZ0OnR1cnRsZV9lZ2dcIixcbiAgQnJvd25UZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6YnJvd25fdGVycmFjb3R0YVwiLFxuICBDb2JibGVzdG9uZURvdWJsZVNsYWIgPSBcIm1pbmVjcmFmdDpjb2JibGVzdG9uZV9kb3VibGVfc2xhYlwiLFxuICBEZWVwc2xhdGVEaWFtb25kT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2RpYW1vbmRfb3JlXCIsXG4gIExpZ2h0R3JheVdvb2wgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X3dvb2xcIixcbiAgU291bENhbXBmaXJlID0gXCJtaW5lY3JhZnQ6c291bF9jYW1wZmlyZVwiLFxuICBXb29kZW5QcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6d29vZGVuX3ByZXNzdXJlX3BsYXRlXCIsXG4gIFdheGVkT3hpZGl6ZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndheGVkX294aWRpemVkX2NvcHBlcl9ncmF0ZVwiLFxuICBEYW1hZ2VkQW52aWwgPSBcIm1pbmVjcmFmdDpkYW1hZ2VkX2FudmlsXCIsXG4gIFdoaXRlQ29uY3JldGUgPSBcIm1pbmVjcmFmdDp3aGl0ZV9jb25jcmV0ZVwiLFxuICBBY2FjaWFGZW5jZSA9IFwibWluZWNyYWZ0OmFjYWNpYV9mZW5jZVwiLFxuICBHcmFzc1BhdGggPSBcIm1pbmVjcmFmdDpncmFzc19wYXRoXCIsXG4gIE9yYW5nZUNhbmRsZUNha2UgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfY2FuZGxlX2Nha2VcIixcbiAgV2VhdGhlcmVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlclwiLFxuICBMaW1lVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmxpbWVfdGVycmFjb3R0YVwiLFxuICBDaGVycnlGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpjaGVycnlfZmVuY2VfZ2F0ZVwiLFxuICBHcmF5R2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmdyYXlfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgTG9kZXN0b25lID0gXCJtaW5lY3JhZnQ6bG9kZXN0b25lXCIsXG4gIEJhbWJvb01vc2FpYyA9IFwibWluZWNyYWZ0OmJhbWJvb19tb3NhaWNcIixcbiAgUHVycGxlV29vbCA9IFwibWluZWNyYWZ0OnB1cnBsZV93b29sXCIsXG4gIElyb25CbG9jayA9IFwibWluZWNyYWZ0Omlyb25fYmxvY2tcIixcbiAgQ2FydG9ncmFwaHlUYWJsZSA9IFwibWluZWNyYWZ0OmNhcnRvZ3JhcGh5X3RhYmxlXCIsXG4gIERhbmRlbGlvbiA9IFwibWluZWNyYWZ0OmRhbmRlbGlvblwiXG59XG4iLCAiZXhwb3J0IGVudW0gRW50aXR5SWRlbnRpZmllciB7XG4gIEJhbGxvb24gPSBcIm1pbmVjcmFmdDpiYWxsb29uXCIsXG4gIEZhbGxpbmdCbG9jayA9IFwibWluZWNyYWZ0OmZhbGxpbmdfYmxvY2tcIixcbiAgVmluZGljYXRvciA9IFwibWluZWNyYWZ0OnZpbmRpY2F0b3JcIixcbiAgVmlsbGFnZXJWMiA9IFwibWluZWNyYWZ0OnZpbGxhZ2VyX3YyXCIsXG4gIEljZUJvbWIgPSBcIm1pbmVjcmFmdDppY2VfYm9tYlwiLFxuICBDYXQgPSBcIm1pbmVjcmFmdDpjYXRcIixcbiAgQmVlID0gXCJtaW5lY3JhZnQ6YmVlXCIsXG4gIFdhbmRlcmluZ1RyYWRlciA9IFwibWluZWNyYWZ0OndhbmRlcmluZ190cmFkZXJcIixcbiAgV29sZiA9IFwibWluZWNyYWZ0OndvbGZcIixcbiAgUmFiYml0ID0gXCJtaW5lY3JhZnQ6cmFiYml0XCIsXG4gIFNuaWZmZXIgPSBcIm1pbmVjcmFmdDpzbmlmZmVyXCIsXG4gIFRhZHBvbGUgPSBcIm1pbmVjcmFmdDp0YWRwb2xlXCIsXG4gIFdpbmRDaGFyZ2VQcm9qZWN0aWxlID0gXCJtaW5lY3JhZnQ6d2luZF9jaGFyZ2VfcHJvamVjdGlsZVwiLFxuICBTaGVlcCA9IFwibWluZWNyYWZ0OnNoZWVwXCIsXG4gIFdpdGNoID0gXCJtaW5lY3JhZnQ6d2l0Y2hcIixcbiAgWm9nbGluID0gXCJtaW5lY3JhZnQ6em9nbGluXCIsXG4gIFNrZWxldG9uID0gXCJtaW5lY3JhZnQ6c2tlbGV0b25cIixcbiAgQ293ID0gXCJtaW5lY3JhZnQ6Y293XCIsXG4gIFJhdmFnZXIgPSBcIm1pbmVjcmFmdDpyYXZhZ2VyXCIsXG4gIE1vb3Nocm9vbSA9IFwibWluZWNyYWZ0Om1vb3Nocm9vbVwiLFxuICBBbGxheSA9IFwibWluZWNyYWZ0OmFsbGF5XCIsXG4gIElyb25Hb2xlbSA9IFwibWluZWNyYWZ0Omlyb25fZ29sZW1cIixcbiAgRG9scGhpbiA9IFwibWluZWNyYWZ0OmRvbHBoaW5cIixcbiAgQnJlZXplID0gXCJtaW5lY3JhZnQ6YnJlZXplXCIsXG4gIFRyYWRlckxsYW1hID0gXCJtaW5lY3JhZnQ6dHJhZGVyX2xsYW1hXCIsXG4gIFR1cnRsZSA9IFwibWluZWNyYWZ0OnR1cnRsZVwiLFxuICBUcm9waWNhbGZpc2ggPSBcIm1pbmVjcmFmdDp0cm9waWNhbGZpc2hcIixcbiAgUG9sYXJCZWFyID0gXCJtaW5lY3JhZnQ6cG9sYXJfYmVhclwiLFxuICBDaGlja2VuID0gXCJtaW5lY3JhZnQ6Y2hpY2tlblwiLFxuICBQYW5kYSA9IFwibWluZWNyYWZ0OnBhbmRhXCIsXG4gIFNsaW1lID0gXCJtaW5lY3JhZnQ6c2xpbWVcIixcbiAgUGlsbGFnZXIgPSBcIm1pbmVjcmFmdDpwaWxsYWdlclwiLFxuICBNdWxlID0gXCJtaW5lY3JhZnQ6bXVsZVwiLFxuICBab21iaWVWaWxsYWdlciA9IFwibWluZWNyYWZ0OnpvbWJpZV92aWxsYWdlclwiLFxuICBBcnJvdyA9IFwibWluZWNyYWZ0OmFycm93XCIsXG4gIExsYW1hID0gXCJtaW5lY3JhZnQ6bGxhbWFcIixcbiAgSG9yc2UgPSBcIm1pbmVjcmFmdDpob3JzZVwiLFxuICBEb25rZXkgPSBcIm1pbmVjcmFmdDpkb25rZXlcIixcbiAgQm9nZ2VkID0gXCJtaW5lY3JhZnQ6Ym9nZ2VkXCIsXG4gIENhbWVsID0gXCJtaW5lY3JhZnQ6Y2FtZWxcIixcbiAgQnJlZXplV2luZENoYXJnZVByb2plY3RpbGUgPSBcIm1pbmVjcmFmdDpicmVlemVfd2luZF9jaGFyZ2VfcHJvamVjdGlsZVwiLFxuICBab21iaWVIb3JzZSA9IFwibWluZWNyYWZ0OnpvbWJpZV9ob3JzZVwiLFxuICBab21iaWUgPSBcIm1pbmVjcmFmdDp6b21iaWVcIixcbiAgVmlsbGFnZXIgPSBcIm1pbmVjcmFmdDp2aWxsYWdlclwiLFxuICBTdHJpZGVyID0gXCJtaW5lY3JhZnQ6c3RyaWRlclwiLFxuICBPbWlub3VzSXRlbVNwYXduZXIgPSBcIm1pbmVjcmFmdDpvbWlub3VzX2l0ZW1fc3Bhd25lclwiLFxuICBXYXJkZW4gPSBcIm1pbmVjcmFmdDp3YXJkZW5cIixcbiAgQWdlbnQgPSBcIm1pbmVjcmFmdDphZ2VudFwiLFxuICBTdHJheSA9IFwibWluZWNyYWZ0OnN0cmF5XCIsXG4gIFNwaWRlciA9IFwibWluZWNyYWZ0OnNwaWRlclwiLFxuICBQbGF5ZXIgPSBcIm1pbmVjcmFmdDpwbGF5ZXJcIixcbiAgU21hbGxGaXJlYmFsbCA9IFwibWluZWNyYWZ0OnNtYWxsX2ZpcmViYWxsXCIsXG4gIFNrZWxldG9uSG9yc2UgPSBcIm1pbmVjcmFmdDpza2VsZXRvbl9ob3JzZVwiLFxuICBIdXNrID0gXCJtaW5lY3JhZnQ6aHVza1wiLFxuICBIb2dsaW4gPSBcIm1pbmVjcmFmdDpob2dsaW5cIixcbiAgRW5kZXJDcnlzdGFsID0gXCJtaW5lY3JhZnQ6ZW5kZXJfY3J5c3RhbFwiLFxuICBTaWx2ZXJmaXNoID0gXCJtaW5lY3JhZnQ6c2lsdmVyZmlzaFwiLFxuICBBcm1hZGlsbG8gPSBcIm1pbmVjcmFmdDphcm1hZGlsbG9cIixcbiAgUGlnbGluID0gXCJtaW5lY3JhZnQ6cGlnbGluXCIsXG4gIEd1YXJkaWFuID0gXCJtaW5lY3JhZnQ6Z3VhcmRpYW5cIixcbiAgV2l0aGVyID0gXCJtaW5lY3JhZnQ6d2l0aGVyXCIsXG4gIFZleCA9IFwibWluZWNyYWZ0OnZleFwiLFxuICBQaWcgPSBcIm1pbmVjcmFmdDpwaWdcIixcbiAgUGFycm90ID0gXCJtaW5lY3JhZnQ6cGFycm90XCIsXG4gIE9jZWxvdCA9IFwibWluZWNyYWZ0Om9jZWxvdFwiLFxuICBCbGF6ZSA9IFwibWluZWNyYWZ0OmJsYXplXCIsXG4gIEdvYXQgPSBcIm1pbmVjcmFmdDpnb2F0XCIsXG4gIEZyb2cgPSBcIm1pbmVjcmFmdDpmcm9nXCIsXG4gIEZveCA9IFwibWluZWNyYWZ0OmZveFwiLFxuICBDYXZlU3BpZGVyID0gXCJtaW5lY3JhZnQ6Y2F2ZV9zcGlkZXJcIixcbiAgV2l0aGVyU2tlbGV0b24gPSBcIm1pbmVjcmFmdDp3aXRoZXJfc2tlbGV0b25cIixcbiAgU3F1aWQgPSBcIm1pbmVjcmFmdDpzcXVpZFwiLFxuICBTaHVsa2VyID0gXCJtaW5lY3JhZnQ6c2h1bGtlclwiLFxuICBTYWxtb24gPSBcIm1pbmVjcmFmdDpzYWxtb25cIixcbiAgQ3JlZXBlciA9IFwibWluZWNyYWZ0OmNyZWVwZXJcIixcbiAgUHVmZmVyZmlzaCA9IFwibWluZWNyYWZ0OnB1ZmZlcmZpc2hcIixcbiAgUGlnbGluQnJ1dGUgPSBcIm1pbmVjcmFmdDpwaWdsaW5fYnJ1dGVcIixcbiAgUGhhbnRvbSA9IFwibWluZWNyYWZ0OnBoYW50b21cIixcbiAgTnBjID0gXCJtaW5lY3JhZnQ6bnBjXCIsXG4gIE1hZ21hQ3ViZSA9IFwibWluZWNyYWZ0Om1hZ21hX2N1YmVcIixcbiAgTGxhbWFTcGl0ID0gXCJtaW5lY3JhZnQ6bGxhbWFfc3BpdFwiLFxuICBHbG93U3F1aWQgPSBcIm1pbmVjcmFmdDpnbG93X3NxdWlkXCIsXG4gIEVuZGVyRHJhZ29uID0gXCJtaW5lY3JhZnQ6ZW5kZXJfZHJhZ29uXCIsXG4gIEdoYXN0ID0gXCJtaW5lY3JhZnQ6Z2hhc3RcIixcbiAgQ29kID0gXCJtaW5lY3JhZnQ6Y29kXCIsXG4gIEV2b2NhdGlvbklsbGFnZXIgPSBcIm1pbmVjcmFmdDpldm9jYXRpb25faWxsYWdlclwiLFxuICBFbmRlcm1pdGUgPSBcIm1pbmVjcmFmdDplbmRlcm1pdGVcIixcbiAgRW5kZXJtYW4gPSBcIm1pbmVjcmFmdDplbmRlcm1hblwiLFxuICBFbGRlckd1YXJkaWFuID0gXCJtaW5lY3JhZnQ6ZWxkZXJfZ3VhcmRpYW5cIixcbiAgRHJvd25lZCA9IFwibWluZWNyYWZ0OmRyb3duZWRcIixcbiAgQmF0ID0gXCJtaW5lY3JhZnQ6YmF0XCIsXG4gIEF4b2xvdGwgPSBcIm1pbmVjcmFmdDpheG9sb3RsXCIsXG4gIFhwT3JiID0gXCJtaW5lY3JhZnQ6eHBfb3JiXCIsXG4gIFpvbWJpZVZpbGxhZ2VyVjIgPSBcIm1pbmVjcmFmdDp6b21iaWVfdmlsbGFnZXJfdjJcIixcbiAgWm9tYmllUGlnbWFuID0gXCJtaW5lY3JhZnQ6em9tYmllX3BpZ21hblwiLFxuICBTbm93R29sZW0gPSBcIm1pbmVjcmFmdDpzbm93X2dvbGVtXCIsXG4gIEZpcmViYWxsID0gXCJtaW5lY3JhZnQ6ZmlyZWJhbGxcIixcbiAgQ2hlc3RCb2F0ID0gXCJtaW5lY3JhZnQ6Y2hlc3RfYm9hdFwiLFxuICBCb2F0ID0gXCJtaW5lY3JhZnQ6Ym9hdFwiLFxuICBTaHVsa2VyQnVsbGV0ID0gXCJtaW5lY3JhZnQ6c2h1bGtlcl9idWxsZXRcIixcbiAgWHBCb3R0bGUgPSBcIm1pbmVjcmFmdDp4cF9ib3R0bGVcIixcbiAgVG50ID0gXCJtaW5lY3JhZnQ6dG50XCIsXG4gIFNwbGFzaFBvdGlvbiA9IFwibWluZWNyYWZ0OnNwbGFzaF9wb3Rpb25cIixcbiAgTGluZ2VyaW5nUG90aW9uID0gXCJtaW5lY3JhZnQ6bGluZ2VyaW5nX3BvdGlvblwiLFxuICBXaXRoZXJTa3VsbERhbmdlcm91cyA9IFwibWluZWNyYWZ0OndpdGhlcl9za3VsbF9kYW5nZXJvdXNcIixcbiAgV2l0aGVyU2t1bGwgPSBcIm1pbmVjcmFmdDp3aXRoZXJfc2t1bGxcIixcbiAgVGhyb3duVHJpZGVudCA9IFwibWluZWNyYWZ0OnRocm93bl90cmlkZW50XCIsXG4gIFNub3diYWxsID0gXCJtaW5lY3JhZnQ6c25vd2JhbGxcIixcbiAgRmlzaGluZ0hvb2sgPSBcIm1pbmVjcmFmdDpmaXNoaW5nX2hvb2tcIixcbiAgRW5kZXJQZWFybCA9IFwibWluZWNyYWZ0OmVuZGVyX3BlYXJsXCIsXG4gIEVnZyA9IFwibWluZWNyYWZ0OmVnZ1wiLFxuICBEcmFnb25GaXJlYmFsbCA9IFwibWluZWNyYWZ0OmRyYWdvbl9maXJlYmFsbFwiLFxuICBBcm1vclN0YW5kID0gXCJtaW5lY3JhZnQ6YXJtb3Jfc3RhbmRcIixcbiAgTGlnaHRuaW5nQm9sdCA9IFwibWluZWNyYWZ0OmxpZ2h0bmluZ19ib2x0XCIsXG4gIFRyaXBvZENhbWVyYSA9IFwibWluZWNyYWZ0OnRyaXBvZF9jYW1lcmFcIixcbiAgVG50TWluZWNhcnQgPSBcIm1pbmVjcmFmdDp0bnRfbWluZWNhcnRcIixcbiAgTWluZWNhcnQgPSBcIm1pbmVjcmFmdDptaW5lY2FydFwiLFxuICBIb3BwZXJNaW5lY2FydCA9IFwibWluZWNyYWZ0OmhvcHBlcl9taW5lY2FydFwiLFxuICBGaXJld29ya3NSb2NrZXQgPSBcIm1pbmVjcmFmdDpmaXJld29ya3Nfcm9ja2V0XCIsXG4gIEV5ZU9mRW5kZXJTaWduYWwgPSBcIm1pbmVjcmFmdDpleWVfb2ZfZW5kZXJfc2lnbmFsXCIsXG4gIENvbW1hbmRCbG9ja01pbmVjYXJ0ID0gXCJtaW5lY3JhZnQ6Y29tbWFuZF9ibG9ja19taW5lY2FydFwiLFxuICBDaGVzdE1pbmVjYXJ0ID0gXCJtaW5lY3JhZnQ6Y2hlc3RfbWluZWNhcnRcIixcbiAgQXJlYUVmZmVjdENsb3VkID0gXCJtaW5lY3JhZnQ6YXJlYV9lZmZlY3RfY2xvdWRcIixcbiAgSXRlbSA9IFwibWluZWNyYWZ0Oml0ZW1cIlxufVxuIiwgImV4cG9ydCBlbnVtIEl0ZW1JZGVudGlmaWVyIHtcbiAgT3JhbmdlQ2FuZGxlID0gXCJtaW5lY3JhZnQ6b3JhbmdlX2NhbmRsZVwiLFxuICBDb2xvcmVkVG9yY2hCcCA9IFwibWluZWNyYWZ0OmNvbG9yZWRfdG9yY2hfYnBcIixcbiAgVHJvcGljYWxGaXNoQnVja2V0ID0gXCJtaW5lY3JhZnQ6dHJvcGljYWxfZmlzaF9idWNrZXRcIixcbiAgTGlnaHRCbG9jazE0ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfMTRcIixcbiAgQWNhY2lhRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2ZlbmNlX2dhdGVcIixcbiAgQ3lhbkR5ZSA9IFwibWluZWNyYWZ0OmN5YW5fZHllXCIsXG4gIFNjYWZmb2xkaW5nID0gXCJtaW5lY3JhZnQ6c2NhZmZvbGRpbmdcIixcbiAgU2N1bGtDYXRhbHlzdCA9IFwibWluZWNyYWZ0OnNjdWxrX2NhdGFseXN0XCIsXG4gIEhvbmV5Y29tYiA9IFwibWluZWNyYWZ0OmhvbmV5Y29tYlwiLFxuICBCaXJjaEZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OmJpcmNoX2ZlbmNlX2dhdGVcIixcbiAgU2hlYXJzID0gXCJtaW5lY3JhZnQ6c2hlYXJzXCIsXG4gIEJsdWVDb25jcmV0ZSA9IFwibWluZWNyYWZ0OmJsdWVfY29uY3JldGVcIixcbiAgRmllbGRNYXNvbmVkQmFubmVyUGF0dGVybiA9IFwibWluZWNyYWZ0OmZpZWxkX21hc29uZWRfYmFubmVyX3BhdHRlcm5cIixcbiAgV2F4ZWRDdXRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9jdXRfY29wcGVyXCIsXG4gIENhbWVsU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpjYW1lbF9zcGF3bl9lZ2dcIixcbiAgU3RvbmVCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpzdG9uZV9icmlja19zbGFiXCIsXG4gIEdvbGRJbmdvdCA9IFwibWluZWNyYWZ0OmdvbGRfaW5nb3RcIixcbiAgU3BydWNlUGxhbmtzID0gXCJtaW5lY3JhZnQ6c3BydWNlX3BsYW5rc1wiLFxuICBSb3NlQnVzaCA9IFwibWluZWNyYWZ0OnJvc2VfYnVzaFwiLFxuICBUdWZmQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6dHVmZl9icmlja19zbGFiXCIsXG4gIFdvb2RlblBpY2theGUgPSBcIm1pbmVjcmFmdDp3b29kZW5fcGlja2F4ZVwiLFxuICBMaWdodEJsb2NrMTAgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18xMFwiLFxuICBDb29raWUgPSBcIm1pbmVjcmFmdDpjb29raWVcIixcbiAgQmx1ZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpibHVlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDpjdXRfY29wcGVyX3N0YWlyc1wiLFxuICBXaGl0ZVdvb2wgPSBcIm1pbmVjcmFmdDp3aGl0ZV93b29sXCIsXG4gIFdheGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY29wcGVyXCIsXG4gIFdvb2RlbkRvb3IgPSBcIm1pbmVjcmFmdDp3b29kZW5fZG9vclwiLFxuICBPYWtTaWduID0gXCJtaW5lY3JhZnQ6b2FrX3NpZ25cIixcbiAgWWVsbG93Q2FuZGxlID0gXCJtaW5lY3JhZnQ6eWVsbG93X2NhbmRsZVwiLFxuICBTaHJvb21saWdodCA9IFwibWluZWNyYWZ0OnNocm9vbWxpZ2h0XCIsXG4gIE1pbGtCdWNrZXQgPSBcIm1pbmVjcmFmdDptaWxrX2J1Y2tldFwiLFxuICBSZWRTYW5kc3RvbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpyZWRfc2FuZHN0b25lX3N0YWlyc1wiLFxuICBQb2xpc2hlZERpb3JpdGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGlvcml0ZV9zbGFiXCIsXG4gIERhcmtPYWtQbGFua3MgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19wbGFua3NcIixcbiAgSnVuZ2xlTGVhdmVzID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2xlYXZlc1wiLFxuICBTdXNwaWNpb3VzU2FuZCA9IFwibWluZWNyYWZ0OnN1c3BpY2lvdXNfc2FuZFwiLFxuICBBbmNpZW50RGVicmlzID0gXCJtaW5lY3JhZnQ6YW5jaWVudF9kZWJyaXNcIixcbiAgU3BydWNlVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfdHJhcGRvb3JcIixcbiAgUHVycGxlR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnB1cnBsZV9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBNdXNpY0Rpc2MxMSA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2NfMTFcIixcbiAgSXJvbkJsb2NrID0gXCJtaW5lY3JhZnQ6aXJvbl9ibG9ja1wiLFxuICBSZWROZXRoZXJCcmljayA9IFwibWluZWNyYWZ0OnJlZF9uZXRoZXJfYnJpY2tcIixcbiAgUmVkc3RvbmUgPSBcIm1pbmVjcmFmdDpyZWRzdG9uZVwiLFxuICBCb25lTWVhbCA9IFwibWluZWNyYWZ0OmJvbmVfbWVhbFwiLFxuICBXYXJwZWRQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6d2FycGVkX3ByZXNzdXJlX3BsYXRlXCIsXG4gIFN0cmF5U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpzdHJheV9zcGF3bl9lZ2dcIixcbiAgSW5mZXN0ZWRDaGlzZWxlZFN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfY2hpc2VsZWRfc3RvbmVfYnJpY2tzXCIsXG4gIFByaXNtYXJpbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX3N0YWlyc1wiLFxuICBJcm9uRG9vciA9IFwibWluZWNyYWZ0Omlyb25fZG9vclwiLFxuICBEYXJrUHJpc21hcmluZVN0YWlycyA9IFwibWluZWNyYWZ0OmRhcmtfcHJpc21hcmluZV9zdGFpcnNcIixcbiAgUmVkU2FuZHN0b25lU2xhYiA9IFwibWluZWNyYWZ0OnJlZF9zYW5kc3RvbmVfc2xhYlwiLFxuICBTY3Vsa1Nocmlla2VyID0gXCJtaW5lY3JhZnQ6c2N1bGtfc2hyaWVrZXJcIixcbiAgQmFtYm9vTW9zYWljU3RhaXJzID0gXCJtaW5lY3JhZnQ6YmFtYm9vX21vc2FpY19zdGFpcnNcIixcbiAgRW5kQnJpY2tzID0gXCJtaW5lY3JhZnQ6ZW5kX2JyaWNrc1wiLFxuICBXYXhlZE94aWRpemVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyXCIsXG4gIE1hbmdyb3ZlUGxhbmtzID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfcGxhbmtzXCIsXG4gIFdheGVkV2VhdGhlcmVkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfZG9vclwiLFxuICBQaW5rVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnBpbmtfdGVycmFjb3R0YVwiLFxuICBCbGF6ZVJvZCA9IFwibWluZWNyYWZ0OmJsYXplX3JvZFwiLFxuICBCcm93blRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpicm93bl90ZXJyYWNvdHRhXCIsXG4gIENhcnZlZFB1bXBraW4gPSBcIm1pbmVjcmFmdDpjYXJ2ZWRfcHVtcGtpblwiLFxuICBCbGF6ZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6YmxhemVfc3Bhd25fZWdnXCIsXG4gIEJhbGxvb24gPSBcIm1pbmVjcmFmdDpiYWxsb29uXCIsXG4gIE9ha1BsYW5rcyA9IFwibWluZWNyYWZ0Om9ha19wbGFua3NcIixcbiAgRGFya09ha0xvZyA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2xvZ1wiLFxuICBSZWRzdG9uZU9yZSA9IFwibWluZWNyYWZ0OnJlZHN0b25lX29yZVwiLFxuICBBeG9sb3RsQnVja2V0ID0gXCJtaW5lY3JhZnQ6YXhvbG90bF9idWNrZXRcIixcbiAgSG9wcGVyID0gXCJtaW5lY3JhZnQ6aG9wcGVyXCIsXG4gIFBpZ2xpbkJydXRlU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpwaWdsaW5fYnJ1dGVfc3Bhd25fZWdnXCIsXG4gIFNlYVBpY2tsZSA9IFwibWluZWNyYWZ0OnNlYV9waWNrbGVcIixcbiAgTGVhZCA9IFwibWluZWNyYWZ0OmxlYWRcIixcbiAgQmlyY2hQbGFua3MgPSBcIm1pbmVjcmFmdDpiaXJjaF9wbGFua3NcIixcbiAgRW5kQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDplbmRfYnJpY2tfc3RhaXJzXCIsXG4gIFR1YmVDb3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6dHViZV9jb3JhbF9ibG9ja1wiLFxuICBXYXhlZEV4cG9zZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyX2dyYXRlXCIsXG4gIEFjYWNpYVBsYW5rcyA9IFwibWluZWNyYWZ0OmFjYWNpYV9wbGFua3NcIixcbiAgV2F4ZWRFeHBvc2VkQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIERlYWRIb3JuQ29yYWwgPSBcIm1pbmVjcmFmdDpkZWFkX2hvcm5fY29yYWxcIixcbiAgRmlyZUNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpmaXJlX2NvcmFsX2Jsb2NrXCIsXG4gIEJhcnJlbCA9IFwibWluZWNyYWZ0OmJhcnJlbFwiLFxuICBRdWFydHpTbGFiID0gXCJtaW5lY3JhZnQ6cXVhcnR6X3NsYWJcIixcbiAgQmlnRHJpcGxlYWYgPSBcIm1pbmVjcmFmdDpiaWdfZHJpcGxlYWZcIixcbiAgQ2hlcnJ5U3RhaXJzID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3N0YWlyc1wiLFxuICBGaXNoaW5nUm9kID0gXCJtaW5lY3JhZnQ6ZmlzaGluZ19yb2RcIixcbiAgTmFtZVRhZyA9IFwibWluZWNyYWZ0Om5hbWVfdGFnXCIsXG4gIEp1bmdsZUZlbmNlID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2ZlbmNlXCIsXG4gIE15Y2VsaXVtID0gXCJtaW5lY3JhZnQ6bXljZWxpdW1cIixcbiAgR2hhc3RTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmdoYXN0X3NwYXduX2VnZ1wiLFxuICBEZWVwc2xhdGVSZWRzdG9uZU9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9yZWRzdG9uZV9vcmVcIixcbiAgWWVsbG93U3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OnllbGxvd19zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgRGFya09ha1NsYWIgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19zbGFiXCIsXG4gIFNtb290aFF1YXJ0elN0YWlycyA9IFwibWluZWNyYWZ0OnNtb290aF9xdWFydHpfc3RhaXJzXCIsXG4gIEZlbmNlR2F0ZSA9IFwibWluZWNyYWZ0OmZlbmNlX2dhdGVcIixcbiAgUm90dGVuRmxlc2ggPSBcIm1pbmVjcmFmdDpyb3R0ZW5fZmxlc2hcIixcbiAgTGlnaHRHcmF5U3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEV5ZUFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDpleWVfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBCbGFja3N0b25lU2xhYiA9IFwibWluZWNyYWZ0OmJsYWNrc3RvbmVfc2xhYlwiLFxuICBHb2xkZW5QaWNrYXhlID0gXCJtaW5lY3JhZnQ6Z29sZGVuX3BpY2theGVcIixcbiAgQ2hlc3QgPSBcIm1pbmVjcmFmdDpjaGVzdFwiLFxuICBMaWdodEJsdWVEeWUgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX2R5ZVwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVCcmlja1dhbGwgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrX3dhbGxcIixcbiAgU3RvbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpzdG9uZV9zdGFpcnNcIixcbiAgQmVhY29uID0gXCJtaW5lY3JhZnQ6YmVhY29uXCIsXG4gIEZ1cm5hY2UgPSBcIm1pbmVjcmFmdDpmdXJuYWNlXCIsXG4gIFdhcnBlZFNsYWIgPSBcIm1pbmVjcmFmdDp3YXJwZWRfc2xhYlwiLFxuICBMaWdodEdyYXlTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X3N0YWluZWRfZ2xhc3NcIixcbiAgT3hpZGl6ZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl90cmFwZG9vclwiLFxuICBEZXRlY3RvclJhaWwgPSBcIm1pbmVjcmFmdDpkZXRlY3Rvcl9yYWlsXCIsXG4gIEdyYXZlbCA9IFwibWluZWNyYWZ0OmdyYXZlbFwiLFxuICBIb2dsaW5TcGF3bkVnZyA9IFwibWluZWNyYWZ0OmhvZ2xpbl9zcGF3bl9lZ2dcIixcbiAgTGlnaHRCbHVlQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBKdW5nbGVXb29kID0gXCJtaW5lY3JhZnQ6anVuZ2xlX3dvb2RcIixcbiAgSGVhdnlDb3JlID0gXCJtaW5lY3JhZnQ6aGVhdnlfY29yZVwiLFxuICBTdXNwaWNpb3VzR3JhdmVsID0gXCJtaW5lY3JhZnQ6c3VzcGljaW91c19ncmF2ZWxcIixcbiAgQmxlYWNoID0gXCJtaW5lY3JhZnQ6YmxlYWNoXCIsXG4gIFJlZFN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OnJlZF9zdGFpbmVkX2dsYXNzXCIsXG4gIFB1cnBsZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpwdXJwbGVfc2h1bGtlcl9ib3hcIixcbiAgSXJvblRyYXBkb29yID0gXCJtaW5lY3JhZnQ6aXJvbl90cmFwZG9vclwiLFxuICBNYW5ncm92ZUJ1dHRvbiA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2J1dHRvblwiLFxuICBQdXJwbGVDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OnB1cnBsZV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgQmFtYm9vUGxhbmtzID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3BsYW5rc1wiLFxuICBDaG9ydXNGbG93ZXIgPSBcIm1pbmVjcmFmdDpjaG9ydXNfZmxvd2VyXCIsXG4gIEp1bmdsZVBsYW5rcyA9IFwibWluZWNyYWZ0Omp1bmdsZV9wbGFua3NcIixcbiAgSnVuZ2xlU2lnbiA9IFwibWluZWNyYWZ0Omp1bmdsZV9zaWduXCIsXG4gIFdpbmRDaGFyZ2UgPSBcIm1pbmVjcmFmdDp3aW5kX2NoYXJnZVwiLFxuICBHbGlzdGVyaW5nTWVsb25TbGljZSA9IFwibWluZWNyYWZ0OmdsaXN0ZXJpbmdfbWVsb25fc2xpY2VcIixcbiAgQ2Fycm90ID0gXCJtaW5lY3JhZnQ6Y2Fycm90XCIsXG4gIFRyaWFsU3Bhd25lciA9IFwibWluZWNyYWZ0OnRyaWFsX3NwYXduZXJcIixcbiAgU3RyaXBwZWRKdW5nbGVXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfanVuZ2xlX3dvb2RcIixcbiAgSXJvbk51Z2dldCA9IFwibWluZWNyYWZ0Omlyb25fbnVnZ2V0XCIsXG4gIEJvbmVCbG9jayA9IFwibWluZWNyYWZ0OmJvbmVfYmxvY2tcIixcbiAgV2FycGVkSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDp3YXJwZWRfaGFuZ2luZ19zaWduXCIsXG4gIE5vcm1hbFN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6bm9ybWFsX3N0b25lX3N0YWlyc1wiLFxuICBMaWdodEJsdWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX3N0YWluZWRfZ2xhc3NcIixcbiAgRmVybiA9IFwibWluZWNyYWZ0OmZlcm5cIixcbiAgUGFja2VkTXVkID0gXCJtaW5lY3JhZnQ6cGFja2VkX211ZFwiLFxuICBQb2xpc2hlZEdyYW5pdGUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ncmFuaXRlXCIsXG4gIElyb25CYXJzID0gXCJtaW5lY3JhZnQ6aXJvbl9iYXJzXCIsXG4gIE94aWRpemVkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY3V0X2NvcHBlclwiLFxuICBHbGFzc0JvdHRsZSA9IFwibWluZWNyYWZ0OmdsYXNzX2JvdHRsZVwiLFxuICBTbWFsbERyaXBsZWFmQmxvY2sgPSBcIm1pbmVjcmFmdDpzbWFsbF9kcmlwbGVhZl9ibG9ja1wiLFxuICBXYXJwZWRSb290cyA9IFwibWluZWNyYWZ0OndhcnBlZF9yb290c1wiLFxuICBNYWdlbnRhV29vbCA9IFwibWluZWNyYWZ0Om1hZ2VudGFfd29vbFwiLFxuICBIYXJkR3JlZW5TdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9ncmVlbl9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgSXJvbkJvb3RzID0gXCJtaW5lY3JhZnQ6aXJvbl9ib290c1wiLFxuICBZZWxsb3dTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfc3RhaW5lZF9nbGFzc1wiLFxuICBSYWJiaXRTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnJhYmJpdF9zcGF3bl9lZ2dcIixcbiAgSG9ybkNvcmFsID0gXCJtaW5lY3JhZnQ6aG9ybl9jb3JhbFwiLFxuICBXaGl0ZUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6d2hpdGVfY29uY3JldGVfcG93ZGVyXCIsXG4gIENoZXJyeVBsYW5rcyA9IFwibWluZWNyYWZ0OmNoZXJyeV9wbGFua3NcIixcbiAgR3Jhbml0ZVNsYWIgPSBcIm1pbmVjcmFmdDpncmFuaXRlX3NsYWJcIixcbiAgU291bFNvaWwgPSBcIm1pbmVjcmFmdDpzb3VsX3NvaWxcIixcbiAgRGFya09ha1ByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19wcmVzc3VyZV9wbGF0ZVwiLFxuICBHcmFuaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6Z3Jhbml0ZV9zdGFpcnNcIixcbiAgU3RyaXBwZWRXYXJwZWRTdGVtID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfd2FycGVkX3N0ZW1cIixcbiAgRnJpZW5kUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6ZnJpZW5kX3BvdHRlcnlfc2hlcmRcIixcbiAgRGF5bGlnaHREZXRlY3RvciA9IFwibWluZWNyYWZ0OmRheWxpZ2h0X2RldGVjdG9yXCIsXG4gIFNtb290aFNhbmRzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OnNtb290aF9zYW5kc3RvbmVfc3RhaXJzXCIsXG4gIFJlcGVhdGluZ0NvbW1hbmRCbG9jayA9IFwibWluZWNyYWZ0OnJlcGVhdGluZ19jb21tYW5kX2Jsb2NrXCIsXG4gIERyb3duZWRTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmRyb3duZWRfc3Bhd25fZWdnXCIsXG4gIFF1YXJ0ekJyaWNrcyA9IFwibWluZWNyYWZ0OnF1YXJ0el9icmlja3NcIixcbiAgTWFuZ3JvdmVMb2cgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9sb2dcIixcbiAgQmFtYm9vTW9zYWljID0gXCJtaW5lY3JhZnQ6YmFtYm9vX21vc2FpY1wiLFxuICBUcmFwZG9vciA9IFwibWluZWNyYWZ0OnRyYXBkb29yXCIsXG4gIFBlYXJsZXNjZW50RnJvZ2xpZ2h0ID0gXCJtaW5lY3JhZnQ6cGVhcmxlc2NlbnRfZnJvZ2xpZ2h0XCIsXG4gIE9yYW5nZUR5ZSA9IFwibWluZWNyYWZ0Om9yYW5nZV9keWVcIixcbiAgQmlyY2hCdXR0b24gPSBcIm1pbmVjcmFmdDpiaXJjaF9idXR0b25cIixcbiAgQ3JpbXNvblBsYW5rcyA9IFwibWluZWNyYWZ0OmNyaW1zb25fcGxhbmtzXCIsXG4gIE5ldGhlcnJhY2sgPSBcIm1pbmVjcmFmdDpuZXRoZXJyYWNrXCIsXG4gIFdhcnBlZFN0ZW0gPSBcIm1pbmVjcmFmdDp3YXJwZWRfc3RlbVwiLFxuICBXYXJwZWRQbGFua3MgPSBcIm1pbmVjcmFmdDp3YXJwZWRfcGxhbmtzXCIsXG4gIFBpZ1NwYXduRWdnID0gXCJtaW5lY3JhZnQ6cGlnX3NwYXduX2VnZ1wiLFxuICBGb3hTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmZveF9zcGF3bl9lZ2dcIixcbiAgUGhhbnRvbU1lbWJyYW5lID0gXCJtaW5lY3JhZnQ6cGhhbnRvbV9tZW1icmFuZVwiLFxuICBCYW1ib29SYWZ0ID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3JhZnRcIixcbiAgR2xvd1NxdWlkU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpnbG93X3NxdWlkX3NwYXduX2VnZ1wiLFxuICBFbmRlckRyYWdvblNwYXduRWdnID0gXCJtaW5lY3JhZnQ6ZW5kZXJfZHJhZ29uX3NwYXduX2VnZ1wiLFxuICBSZWREeWUgPSBcIm1pbmVjcmFmdDpyZWRfZHllXCIsXG4gIE9yYW5nZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0Om9yYW5nZV9zdGFpbmVkX2dsYXNzXCIsXG4gIENvYmJsZXN0b25lV2FsbCA9IFwibWluZWNyYWZ0OmNvYmJsZXN0b25lX3dhbGxcIixcbiAgTWFnZW50YUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6bWFnZW50YV9jb25jcmV0ZVwiLFxuICBDcm9zc2JvdyA9IFwibWluZWNyYWZ0OmNyb3NzYm93XCIsXG4gIEV4cG9zZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2NvcHBlclwiLFxuICBSYWlzZXJBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6cmFpc2VyX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgT3JhbmdlQ2FycGV0ID0gXCJtaW5lY3JhZnQ6b3JhbmdlX2NhcnBldFwiLFxuICBDaGVycnlGZW5jZSA9IFwibWluZWNyYWZ0OmNoZXJyeV9mZW5jZVwiLFxuICBDcmltc29uVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpjcmltc29uX3RyYXBkb29yXCIsXG4gIEJsdWVTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6Ymx1ZV9zaHVsa2VyX2JveFwiLFxuICBCaXJjaEJvYXQgPSBcIm1pbmVjcmFmdDpiaXJjaF9ib2F0XCIsXG4gIFdoaXRlVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OndoaXRlX3RlcnJhY290dGFcIixcbiAgTXVkID0gXCJtaW5lY3JhZnQ6bXVkXCIsXG4gIEJsdWVEeWUgPSBcIm1pbmVjcmFmdDpibHVlX2R5ZVwiLFxuICBPYWtMZWF2ZXMgPSBcIm1pbmVjcmFmdDpvYWtfbGVhdmVzXCIsXG4gIEZsb3dlcmluZ0F6YWxlYSA9IFwibWluZWNyYWZ0OmZsb3dlcmluZ19hemFsZWFcIixcbiAgRGVlcHNsYXRlQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrX3NsYWJcIixcbiAgQmxhY2tTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6YmxhY2tfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIE5ldGhlckJyaWNrRmVuY2UgPSBcIm1pbmVjcmFmdDpuZXRoZXJfYnJpY2tfZmVuY2VcIixcbiAgTmV0aGVyaXRlSG9lID0gXCJtaW5lY3JhZnQ6bmV0aGVyaXRlX2hvZVwiLFxuICBHb2xkZW5DYXJyb3QgPSBcIm1pbmVjcmFmdDpnb2xkZW5fY2Fycm90XCIsXG4gIEJsYWNrc3RvbmVXYWxsID0gXCJtaW5lY3JhZnQ6YmxhY2tzdG9uZV93YWxsXCIsXG4gIFdlYXRoZXJlZEN1dENvcHBlciA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyXCIsXG4gIE11c2ljRGlzY01lbGxvaGkgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX21lbGxvaGlcIixcbiAgRGlhbW9uZEJvb3RzID0gXCJtaW5lY3JhZnQ6ZGlhbW9uZF9ib290c1wiLFxuICBNYW5ncm92ZUJvYXQgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9ib2F0XCIsXG4gIFR1YmVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OnR1YmVfY29yYWxfZmFuXCIsXG4gIEN1dFJlZFNhbmRzdG9uZSA9IFwibWluZWNyYWZ0OmN1dF9yZWRfc2FuZHN0b25lXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZUJ1dHRvbiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnV0dG9uXCIsXG4gIFN0cmlwcGVkQmlyY2hXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYmlyY2hfd29vZFwiLFxuICBTbW9vdGhTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc2FuZHN0b25lXCIsXG4gIEFyY2hlclBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmFyY2hlcl9wb3R0ZXJ5X3NoZXJkXCIsXG4gIFJlZHN0b25lQmxvY2sgPSBcIm1pbmVjcmFmdDpyZWRzdG9uZV9ibG9ja1wiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVXYWxsID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV93YWxsXCIsXG4gIEdvbGRlbkFwcGxlID0gXCJtaW5lY3JhZnQ6Z29sZGVuX2FwcGxlXCIsXG4gIE1hbmdyb3ZlRmVuY2UgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9mZW5jZVwiLFxuICBDb29rZWRNdXR0b24gPSBcIm1pbmVjcmFmdDpjb29rZWRfbXV0dG9uXCIsXG4gIFB1cnBsZUNhbmRsZSA9IFwibWluZWNyYWZ0OnB1cnBsZV9jYW5kbGVcIixcbiAgTm9ybWFsU3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6bm9ybWFsX3N0b25lX3NsYWJcIixcbiAgR29sZGVuQXhlID0gXCJtaW5lY3JhZnQ6Z29sZGVuX2F4ZVwiLFxuICBNYWNlID0gXCJtaW5lY3JhZnQ6bWFjZVwiLFxuICBDaGVycnlMZWF2ZXMgPSBcIm1pbmVjcmFmdDpjaGVycnlfbGVhdmVzXCIsXG4gIFBvaW50ZWREcmlwc3RvbmUgPSBcIm1pbmVjcmFmdDpwb2ludGVkX2RyaXBzdG9uZVwiLFxuICBDb2JibGVkRGVlcHNsYXRlV2FsbCA9IFwibWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3dhbGxcIixcbiAgV29vZGVuU2hvdmVsID0gXCJtaW5lY3JhZnQ6d29vZGVuX3Nob3ZlbFwiLFxuICBEYXJrT2FrVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpkYXJrX29ha190cmFwZG9vclwiLFxuICBEZWVwc2xhdGVUaWxlV2FsbCA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV90aWxlX3dhbGxcIixcbiAgQ29kID0gXCJtaW5lY3JhZnQ6Y29kXCIsXG4gIERhcmtPYWtGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19mZW5jZV9nYXRlXCIsXG4gIExldmVyID0gXCJtaW5lY3JhZnQ6bGV2ZXJcIixcbiAgSGVhcnRPZlRoZVNlYSA9IFwibWluZWNyYWZ0OmhlYXJ0X29mX3RoZV9zZWFcIixcbiAgUG9saXNoZWREZWVwc2xhdGVXYWxsID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlX3dhbGxcIixcbiAgQ2FrZSA9IFwibWluZWNyYWZ0OmNha2VcIixcbiAgQmx1ZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmJsdWVfc3RhaW5lZF9nbGFzc1wiLFxuICBNb3NzeUNvYmJsZXN0b25lID0gXCJtaW5lY3JhZnQ6bW9zc3lfY29iYmxlc3RvbmVcIixcbiAgSG9zdEFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDpob3N0X2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgQmlyY2hUcmFwZG9vciA9IFwibWluZWNyYWZ0OmJpcmNoX3RyYXBkb29yXCIsXG4gIENhdWxkcm9uID0gXCJtaW5lY3JhZnQ6Y2F1bGRyb25cIixcbiAgU3RyaXBwZWRTcHJ1Y2VXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfc3BydWNlX3dvb2RcIixcbiAgRGVlcHNsYXRlQnJpY2tXYWxsID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrX3dhbGxcIixcbiAgR3JheVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmdyYXlfc3RhaW5lZF9nbGFzc1wiLFxuICBCYW1ib29GZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpiYW1ib29fZmVuY2VfZ2F0ZVwiLFxuICBQdXJwbGVDb25jcmV0ZSA9IFwibWluZWNyYWZ0OnB1cnBsZV9jb25jcmV0ZVwiLFxuICBXb29kZW5Ib2UgPSBcIm1pbmVjcmFmdDp3b29kZW5faG9lXCIsXG4gIEVuZGVybWl0ZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6ZW5kZXJtaXRlX3NwYXduX2VnZ1wiLFxuICBDaGVycnlGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpjaGVycnlfZmVuY2VfZ2F0ZVwiLFxuICBCZWV0cm9vdFNvdXAgPSBcIm1pbmVjcmFmdDpiZWV0cm9vdF9zb3VwXCIsXG4gIEhhcmRSZWRTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9yZWRfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIE94aWRpemVkQ29wcGVyR3JhdGUgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jb3BwZXJfZ3JhdGVcIixcbiAgSnVuZ2xlTG9nID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2xvZ1wiLFxuICBCbGFja0dsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpibGFja19nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBSYWJiaXRTdGV3ID0gXCJtaW5lY3JhZnQ6cmFiYml0X3N0ZXdcIixcbiAgQ2hlcnJ5Q2hlc3RCb2F0ID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2NoZXN0X2JvYXRcIixcbiAgQ3JpbXNvblNsYWIgPSBcIm1pbmVjcmFmdDpjcmltc29uX3NsYWJcIixcbiAgQnJlZXplUm9kID0gXCJtaW5lY3JhZnQ6YnJlZXplX3JvZFwiLFxuICBNdWRCcmlja1dhbGwgPSBcIm1pbmVjcmFmdDptdWRfYnJpY2tfd2FsbFwiLFxuICBNdXNpY0Rpc2NDcmVhdG9yID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19jcmVhdG9yXCIsXG4gIFBvbGlzaGVkR3Jhbml0ZVN0YWlycyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2dyYW5pdGVfc3RhaXJzXCIsXG4gIFJlZE11c2hyb29tQmxvY2sgPSBcIm1pbmVjcmFmdDpyZWRfbXVzaHJvb21fYmxvY2tcIixcbiAgQm93bCA9IFwibWluZWNyYWZ0OmJvd2xcIixcbiAgV2FycGVkRG9vciA9IFwibWluZWNyYWZ0OndhcnBlZF9kb29yXCIsXG4gIE94aWRpemVkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6b3hpZGl6ZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgRnJvZ1NwYXduRWdnID0gXCJtaW5lY3JhZnQ6ZnJvZ19zcGF3bl9lZ2dcIixcbiAgSXJvbkhvcnNlQXJtb3IgPSBcIm1pbmVjcmFmdDppcm9uX2hvcnNlX2FybW9yXCIsXG4gIFB1bXBraW4gPSBcIm1pbmVjcmFmdDpwdW1wa2luXCIsXG4gIEJpcmNoTG9nID0gXCJtaW5lY3JhZnQ6YmlyY2hfbG9nXCIsXG4gIFNub3V0QXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OnNub3V0X2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgQ29iYmxlZERlZXBzbGF0ZSA9IFwibWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlXCIsXG4gIExpZ2h0Qmx1ZUNhcnBldCA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FycGV0XCIsXG4gIFdlYXRoZXJlZENvcHBlciA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJcIixcbiAgQmFtYm9vU3RhaXJzID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3N0YWlyc1wiLFxuICBDcmFja2VkU3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDpjcmFja2VkX3N0b25lX2JyaWNrc1wiLFxuICBXaGl0ZUR5ZSA9IFwibWluZWNyYWZ0OndoaXRlX2R5ZVwiLFxuICBDcmVlcGVyQmFubmVyUGF0dGVybiA9IFwibWluZWNyYWZ0OmNyZWVwZXJfYmFubmVyX3BhdHRlcm5cIixcbiAgUG9saXNoZWREZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kZWVwc2xhdGVcIixcbiAgRGFya09ha0Rvb3IgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19kb29yXCIsXG4gIFNtb290aFNhbmRzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc2FuZHN0b25lX3NsYWJcIixcbiAgR3JheUNhcnBldCA9IFwibWluZWNyYWZ0OmdyYXlfY2FycGV0XCIsXG4gIFdoZWF0ID0gXCJtaW5lY3JhZnQ6d2hlYXRcIixcbiAgR3JpbmRzdG9uZSA9IFwibWluZWNyYWZ0OmdyaW5kc3RvbmVcIixcbiAgT2FrRmVuY2UgPSBcIm1pbmVjcmFmdDpvYWtfZmVuY2VcIixcbiAgTGlnaHRCbHVlQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX2NvbmNyZXRlXCIsXG4gIE1hbmdyb3ZlRmVuY2VHYXRlID0gXCJtaW5lY3JhZnQ6bWFuZ3JvdmVfZmVuY2VfZ2F0ZVwiLFxuICBKdW5nbGVGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpqdW5nbGVfZmVuY2VfZ2F0ZVwiLFxuICBEZWVwc2xhdGVFbWVyYWxkT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2VtZXJhbGRfb3JlXCIsXG4gIFN0cmlwcGVkQ3JpbXNvblN0ZW0gPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9jcmltc29uX3N0ZW1cIixcbiAgU3BydWNlRmVuY2UgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfZmVuY2VcIixcbiAgTGlnaHRCbHVlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIE1hZ21hQ3JlYW0gPSBcIm1pbmVjcmFmdDptYWdtYV9jcmVhbVwiLFxuICBFbGRlckd1YXJkaWFuU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDplbGRlcl9ndWFyZGlhbl9zcGF3bl9lZ2dcIixcbiAgU2FkZGxlID0gXCJtaW5lY3JhZnQ6c2FkZGxlXCIsXG4gIFJhd0dvbGRCbG9jayA9IFwibWluZWNyYWZ0OnJhd19nb2xkX2Jsb2NrXCIsXG4gIENhcnJvdE9uQVN0aWNrID0gXCJtaW5lY3JhZnQ6Y2Fycm90X29uX2Ffc3RpY2tcIixcbiAgUG9saXNoZWRCbGFja3N0b25lU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfc2xhYlwiLFxuICBXaGl0ZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OndoaXRlX3N0YWluZWRfZ2xhc3NcIixcbiAgU2xpbWUgPSBcIm1pbmVjcmFmdDpzbGltZVwiLFxuICBUdWZmV2FsbCA9IFwibWluZWNyYWZ0OnR1ZmZfd2FsbFwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX3N0YWlyc1wiLFxuICBUdXJ0bGVFZ2cgPSBcIm1pbmVjcmFmdDp0dXJ0bGVfZWdnXCIsXG4gIEJpcmNoRmVuY2UgPSBcIm1pbmVjcmFmdDpiaXJjaF9mZW5jZVwiLFxuICBUbnRNaW5lY2FydCA9IFwibWluZWNyYWZ0OnRudF9taW5lY2FydFwiLFxuICBDb3BwZXJPcmUgPSBcIm1pbmVjcmFmdDpjb3BwZXJfb3JlXCIsXG4gIFdhcnBlZEZ1bmd1cyA9IFwibWluZWNyYWZ0OndhcnBlZF9mdW5ndXNcIixcbiAgR3JlZW5TdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6Z3JlZW5fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEdvbGRlbkxlZ2dpbmdzID0gXCJtaW5lY3JhZnQ6Z29sZGVuX2xlZ2dpbmdzXCIsXG4gIEdyYXlTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6Z3JheV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgRW5kU3RvbmVCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDplbmRfc3RvbmVfYnJpY2tfc2xhYlwiLFxuICBXcml0YWJsZUJvb2sgPSBcIm1pbmVjcmFmdDp3cml0YWJsZV9ib29rXCIsXG4gIEFjYWNpYUZlbmNlID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2ZlbmNlXCIsXG4gIEFybXNVcFBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmFybXNfdXBfcG90dGVyeV9zaGVyZFwiLFxuICBEYXJrT2FrRmVuY2UgPSBcIm1pbmVjcmFmdDpkYXJrX29ha19mZW5jZVwiLFxuICBXYXhlZFdlYXRoZXJlZENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBJcm9uT3JlID0gXCJtaW5lY3JhZnQ6aXJvbl9vcmVcIixcbiAgUmVkTmV0aGVyQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja19zbGFiXCIsXG4gIEJlZXRyb290U2VlZHMgPSBcIm1pbmVjcmFmdDpiZWV0cm9vdF9zZWVkc1wiLFxuICBOb3RlYmxvY2sgPSBcIm1pbmVjcmFmdDpub3RlYmxvY2tcIixcbiAgSWNlQm9tYiA9IFwibWluZWNyYWZ0OmljZV9ib21iXCIsXG4gIEp1bmdsZVN0YWlycyA9IFwibWluZWNyYWZ0Omp1bmdsZV9zdGFpcnNcIixcbiAgQmlyY2hTYXBsaW5nID0gXCJtaW5lY3JhZnQ6YmlyY2hfc2FwbGluZ1wiLFxuICBIYXJkQnJvd25TdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9icm93bl9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgVG9yY2hmbG93ZXIgPSBcIm1pbmVjcmFmdDp0b3JjaGZsb3dlclwiLFxuICBMaWdodEJsb2NrMTMgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18xM1wiLFxuICBBY2FjaWFIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0OmFjYWNpYV9oYW5naW5nX3NpZ25cIixcbiAgUGlnbGluQmFubmVyUGF0dGVybiA9IFwibWluZWNyYWZ0OnBpZ2xpbl9iYW5uZXJfcGF0dGVyblwiLFxuICBJcm9uR29sZW1TcGF3bkVnZyA9IFwibWluZWNyYWZ0Omlyb25fZ29sZW1fc3Bhd25fZWdnXCIsXG4gIERhcmtQcmlzbWFyaW5lU2xhYiA9IFwibWluZWNyYWZ0OmRhcmtfcHJpc21hcmluZV9zbGFiXCIsXG4gIFByaXNtYXJpbmVCcmlja3NTdGFpcnMgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX2JyaWNrc19zdGFpcnNcIixcbiAgQmFtYm9vRmVuY2UgPSBcIm1pbmVjcmFmdDpiYW1ib29fZmVuY2VcIixcbiAgQmFtYm9vTW9zYWljU2xhYiA9IFwibWluZWNyYWZ0OmJhbWJvb19tb3NhaWNfc2xhYlwiLFxuICBDcmltc29uRmVuY2UgPSBcIm1pbmVjcmFmdDpjcmltc29uX2ZlbmNlXCIsXG4gIFJlZE5ldGhlckJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja19zdGFpcnNcIixcbiAgQ3JpbXNvbkRvb3IgPSBcIm1pbmVjcmFmdDpjcmltc29uX2Rvb3JcIixcbiAgRGVueSA9IFwibWluZWNyYWZ0OmRlbnlcIixcbiAgU21vb3RoUmVkU2FuZHN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmVfc3RhaXJzXCIsXG4gIENvbXBvc3RlciA9IFwibWluZWNyYWZ0OmNvbXBvc3RlclwiLFxuICBFeHBvc2VkQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIFdhcnBlZFN0YWlycyA9IFwibWluZWNyYWZ0OndhcnBlZF9zdGFpcnNcIixcbiAgRWNob1NoYXJkID0gXCJtaW5lY3JhZnQ6ZWNob19zaGFyZFwiLFxuICBTcHJ1Y2VGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfZmVuY2VfZ2F0ZVwiLFxuICBXYXJwZWRGZW5jZSA9IFwibWluZWNyYWZ0OndhcnBlZF9mZW5jZVwiLFxuICBTdHJpcHBlZEp1bmdsZUxvZyA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2p1bmdsZV9sb2dcIixcbiAgU2VudHJ5QXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OnNlbnRyeV9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIENoZXJyeVNpZ24gPSBcIm1pbmVjcmFmdDpjaGVycnlfc2lnblwiLFxuICBFbmNoYW50ZWRHb2xkZW5BcHBsZSA9IFwibWluZWNyYWZ0OmVuY2hhbnRlZF9nb2xkZW5fYXBwbGVcIixcbiAgTW9zc3lDb2JibGVzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0Om1vc3N5X2NvYmJsZXN0b25lX3N0YWlyc1wiLFxuICBBY2FjaWFEb29yID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2Rvb3JcIixcbiAgTmV0aGVyV2FydEJsb2NrID0gXCJtaW5lY3JhZnQ6bmV0aGVyX3dhcnRfYmxvY2tcIixcbiAgTGlnaHRCbHVlR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmxpZ2h0X2JsdWVfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgQmx1ZU9yY2hpZCA9IFwibWluZWNyYWZ0OmJsdWVfb3JjaGlkXCIsXG4gIExpbHlPZlRoZVZhbGxleSA9IFwibWluZWNyYWZ0OmxpbHlfb2ZfdGhlX3ZhbGxleVwiLFxuICBTbW9vdGhSZWRTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpzbW9vdGhfcmVkX3NhbmRzdG9uZVwiLFxuICBEZWVwc2xhdGVDb3BwZXJPcmUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfY29wcGVyX29yZVwiLFxuICBTdG9uZUJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6c3RvbmVfYnJpY2tfc3RhaXJzXCIsXG4gIFR1ZmZTdGFpcnMgPSBcIm1pbmVjcmFmdDp0dWZmX3N0YWlyc1wiLFxuICBTdWdhckNhbmUgPSBcIm1pbmVjcmFmdDpzdWdhcl9jYW5lXCIsXG4gIENyaW1zb25GZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDpjcmltc29uX2ZlbmNlX2dhdGVcIixcbiAgRGlhbW9uZENoZXN0cGxhdGUgPSBcIm1pbmVjcmFmdDpkaWFtb25kX2NoZXN0cGxhdGVcIixcbiAgTmV0aGVyR29sZE9yZSA9IFwibWluZWNyYWZ0Om5ldGhlcl9nb2xkX29yZVwiLFxuICBNYW5ncm92ZVN0YWlycyA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3N0YWlyc1wiLFxuICBXYXJwZWRGZW5jZUdhdGUgPSBcIm1pbmVjcmFmdDp3YXJwZWRfZmVuY2VfZ2F0ZVwiLFxuICBCYXNhbHQgPSBcIm1pbmVjcmFmdDpiYXNhbHRcIixcbiAgT2FrU3RhaXJzID0gXCJtaW5lY3JhZnQ6b2FrX3N0YWlyc1wiLFxuICBKdW5nbGVEb29yID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2Rvb3JcIixcbiAgRGlvcml0ZSA9IFwibWluZWNyYWZ0OmRpb3JpdGVcIixcbiAgQ29hcnNlRGlydCA9IFwibWluZWNyYWZ0OmNvYXJzZV9kaXJ0XCIsXG4gIFNwcnVjZVN0YWlycyA9IFwibWluZWNyYWZ0OnNwcnVjZV9zdGFpcnNcIixcbiAgQWxsb3cgPSBcIm1pbmVjcmFmdDphbGxvd1wiLFxuICBHcmF5Q29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpncmF5X2NvbmNyZXRlX3Bvd2RlclwiLFxuICBCaXJjaFN0YWlycyA9IFwibWluZWNyYWZ0OmJpcmNoX3N0YWlyc1wiLFxuICBEYXJrT2FrSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpkYXJrX29ha19oYW5naW5nX3NpZ25cIixcbiAgR3JlZW5Db25jcmV0ZSA9IFwibWluZWNyYWZ0OmdyZWVuX2NvbmNyZXRlXCIsXG4gIFN0cmlwcGVkQ3JpbXNvbkh5cGhhZSA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2NyaW1zb25faHlwaGFlXCIsXG4gIFBvbGlzaGVkQW5kZXNpdGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9hbmRlc2l0ZV9zdGFpcnNcIixcbiAgQWNhY2lhU3RhaXJzID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3N0YWlyc1wiLFxuICBJcm9uQXhlID0gXCJtaW5lY3JhZnQ6aXJvbl9heGVcIixcbiAgQmlyY2hMZWF2ZXMgPSBcIm1pbmVjcmFmdDpiaXJjaF9sZWF2ZXNcIixcbiAgU2lsdmVyR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnNpbHZlcl9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBWZXJkYW50RnJvZ2xpZ2h0ID0gXCJtaW5lY3JhZnQ6dmVyZGFudF9mcm9nbGlnaHRcIixcbiAgV2F4ZWRXZWF0aGVyZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jb3BwZXJfZ3JhdGVcIixcbiAgV2F4ZWRXZWF0aGVyZWRDb3BwZXJCdWxiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcl9idWxiXCIsXG4gIE1vc3N5Q29iYmxlc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6bW9zc3lfY29iYmxlc3RvbmVfc2xhYlwiLFxuICBNYWdlbnRhR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgRGFya09ha1N0YWlycyA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX3N0YWlyc1wiLFxuICBQaW5rRHllID0gXCJtaW5lY3JhZnQ6cGlua19keWVcIixcbiAgQnJvd25EeWUgPSBcIm1pbmVjcmFmdDpicm93bl9keWVcIixcbiAgQmxhY2tEeWUgPSBcIm1pbmVjcmFmdDpibGFja19keWVcIixcbiAgQ3JpbXNvbk55bGl1bSA9IFwibWluZWNyYWZ0OmNyaW1zb25fbnlsaXVtXCIsXG4gIFNxdWlkU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpzcXVpZF9zcGF3bl9lZ2dcIixcbiAgV2F4ZWRFeHBvc2VkQ29wcGVyVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2NvcHBlcl90cmFwZG9vclwiLFxuICBCYW1ib29DaGVzdFJhZnQgPSBcIm1pbmVjcmFmdDpiYW1ib29fY2hlc3RfcmFmdFwiLFxuICBNb3NzeVN0b25lQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDptb3NzeV9zdG9uZV9icmlja19zdGFpcnNcIixcbiAgQ29va2VkU2FsbW9uID0gXCJtaW5lY3JhZnQ6Y29va2VkX3NhbG1vblwiLFxuICBDb3dTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmNvd19zcGF3bl9lZ2dcIixcbiAgQW1ldGh5c3RCbG9jayA9IFwibWluZWNyYWZ0OmFtZXRoeXN0X2Jsb2NrXCIsXG4gIFRhcmdldCA9IFwibWluZWNyYWZ0OnRhcmdldFwiLFxuICBTY3JhcGVQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpzY3JhcGVfcG90dGVyeV9zaGVyZFwiLFxuICBFbWVyYWxkID0gXCJtaW5lY3JhZnQ6ZW1lcmFsZFwiLFxuICBDb2JibGVkRGVlcHNsYXRlU2xhYiA9IFwibWluZWNyYWZ0OmNvYmJsZWRfZGVlcHNsYXRlX3NsYWJcIixcbiAgTXVzaHJvb21TdGV3ID0gXCJtaW5lY3JhZnQ6bXVzaHJvb21fc3Rld1wiLFxuICBHcmFzc0Jsb2NrID0gXCJtaW5lY3JhZnQ6Z3Jhc3NfYmxvY2tcIixcbiAgTGltZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpsaW1lX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIERpYW1vbmRTd29yZCA9IFwibWluZWNyYWZ0OmRpYW1vbmRfc3dvcmRcIixcbiAgUGFuZGFTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnBhbmRhX3NwYXduX2VnZ1wiLFxuICBBY2FjaWFTaWduID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3NpZ25cIixcbiAgU2FuZHN0b25lU3RhaXJzID0gXCJtaW5lY3JhZnQ6c2FuZHN0b25lX3N0YWlyc1wiLFxuICBEaW9yaXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6ZGlvcml0ZV9zdGFpcnNcIixcbiAgQXJyb3cgPSBcIm1pbmVjcmFmdDphcnJvd1wiLFxuICBQb2xpc2hlZERpb3JpdGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kaW9yaXRlX3N0YWlyc1wiLFxuICBTcG9uZ2UgPSBcIm1pbmVjcmFmdDpzcG9uZ2VcIixcbiAgQW5kZXNpdGVTdGFpcnMgPSBcIm1pbmVjcmFmdDphbmRlc2l0ZV9zdGFpcnNcIixcbiAgQmxhY2tTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpibGFja19zdGFpbmVkX2dsYXNzXCIsXG4gIExpZ2h0R3JheUR5ZSA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfZHllXCIsXG4gIExpZ2h0Qmx1ZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX3NodWxrZXJfYm94XCIsXG4gIERpYW1vbmQgPSBcIm1pbmVjcmFmdDpkaWFtb25kXCIsXG4gIFNlYUxhbnRlcm4gPSBcIm1pbmVjcmFmdDpzZWFfbGFudGVyblwiLFxuICBNb3NzeVN0b25lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tfc2xhYlwiLFxuICBEZWFkSG9ybkNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF9ob3JuX2NvcmFsX2ZhblwiLFxuICBEZWFkSG9ybkNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpkZWFkX2hvcm5fY29yYWxfYmxvY2tcIixcbiAgTGVjdGVybiA9IFwibWluZWNyYWZ0OmxlY3Rlcm5cIixcbiAgUHJpc21hcmluZUJyaWNrcyA9IFwibWluZWNyYWZ0OnByaXNtYXJpbmVfYnJpY2tzXCIsXG4gIEdyZWVuU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6Z3JlZW5fc3RhaW5lZF9nbGFzc1wiLFxuICBDb2NvYUJlYW5zID0gXCJtaW5lY3JhZnQ6Y29jb2FfYmVhbnNcIixcbiAgTXVzaWNEaXNjV2FpdCA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2Nfd2FpdFwiLFxuICBIZWFydGJyZWFrUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6aGVhcnRicmVha19wb3R0ZXJ5X3NoZXJkXCIsXG4gIEp1bmdsZUhhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6anVuZ2xlX2hhbmdpbmdfc2lnblwiLFxuICBCbHVlQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpibHVlX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBOZXRoZXJpdGVJbmdvdCA9IFwibWluZWNyYWZ0Om5ldGhlcml0ZV9pbmdvdFwiLFxuICBHaWxkZWRCbGFja3N0b25lID0gXCJtaW5lY3JhZnQ6Z2lsZGVkX2JsYWNrc3RvbmVcIixcbiAgUG9wcGVkQ2hvcnVzRnJ1aXQgPSBcIm1pbmVjcmFmdDpwb3BwZWRfY2hvcnVzX2ZydWl0XCIsXG4gIEJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6YnJpY2tfc3RhaXJzXCIsXG4gIFdheGVkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgQ29ybmZsb3dlciA9IFwibWluZWNyYWZ0OmNvcm5mbG93ZXJcIixcbiAgU2FsbW9uQnVja2V0ID0gXCJtaW5lY3JhZnQ6c2FsbW9uX2J1Y2tldFwiLFxuICBDeWFuU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6Y3lhbl9zdGFpbmVkX2dsYXNzXCIsXG4gIEN5YW5DYXJwZXQgPSBcIm1pbmVjcmFmdDpjeWFuX2NhcnBldFwiLFxuICBOZXRoZXJicmljayA9IFwibWluZWNyYWZ0Om5ldGhlcmJyaWNrXCIsXG4gIENvYmJsZXN0b25lU2xhYiA9IFwibWluZWNyYWZ0OmNvYmJsZXN0b25lX3NsYWJcIixcbiAgSGFyZFB1cnBsZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX3B1cnBsZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgR3JlZW5UZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6Z3JlZW5fdGVycmFjb3R0YVwiLFxuICBXYXhlZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY29wcGVyX3RyYXBkb29yXCIsXG4gIE5ldGhlckJyaWNrU3RhaXJzID0gXCJtaW5lY3JhZnQ6bmV0aGVyX2JyaWNrX3N0YWlyc1wiLFxuICBHcmVlbkdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpncmVlbl9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBIYW5naW5nUm9vdHMgPSBcIm1pbmVjcmFmdDpoYW5naW5nX3Jvb3RzXCIsXG4gIEJsdWVUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6Ymx1ZV90ZXJyYWNvdHRhXCIsXG4gIEV4cG9zZWRDb3BwZXJUcmFwZG9vciA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyX3RyYXBkb29yXCIsXG4gIEJpcmNoRG9vciA9IFwibWluZWNyYWZ0OmJpcmNoX2Rvb3JcIixcbiAgQmlyY2hQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6YmlyY2hfcHJlc3N1cmVfcGxhdGVcIixcbiAgWm9tYmllVmlsbGFnZXJTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnpvbWJpZV92aWxsYWdlcl9zcGF3bl9lZ2dcIixcbiAgU3BpcmVBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6c3BpcmVfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBFeHBvc2VkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jdXRfY29wcGVyXCIsXG4gIE11c2ljRGlzY1JlbGljID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19yZWxpY1wiLFxuICBXYXhlZEV4cG9zZWRDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDp3YXhlZF9leHBvc2VkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIFNwcnVjZVNpZ24gPSBcIm1pbmVjcmFmdDpzcHJ1Y2Vfc2lnblwiLFxuICBRdWFydHpTdGFpcnMgPSBcIm1pbmVjcmFmdDpxdWFydHpfc3RhaXJzXCIsXG4gIFB1cnB1clN0YWlycyA9IFwibWluZWNyYWZ0OnB1cnB1cl9zdGFpcnNcIixcbiAgQ29wcGVySW5nb3QgPSBcIm1pbmVjcmFmdDpjb3BwZXJfaW5nb3RcIixcbiAgQnJvd25Db25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmJyb3duX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBGbG93QXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OmZsb3dfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBDcmFja2VkRGVlcHNsYXRlQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y3JhY2tlZF9kZWVwc2xhdGVfYnJpY2tzXCIsXG4gIFBpbmtDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OnBpbmtfY29uY3JldGVfcG93ZGVyXCIsXG4gIExpZ2h0R3JheVdvb2wgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X3dvb2xcIixcbiAgUmVkV29vbCA9IFwibWluZWNyYWZ0OnJlZF93b29sXCIsXG4gIE1lbG9uQmxvY2sgPSBcIm1pbmVjcmFmdDptZWxvbl9ibG9ja1wiLFxuICBCYW1ib29QcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6YmFtYm9vX3ByZXNzdXJlX3BsYXRlXCIsXG4gIERyb3BwZXIgPSBcIm1pbmVjcmFmdDpkcm9wcGVyXCIsXG4gIFdhcmRBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6d2FyZF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIEV4cG9zZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyX2dyYXRlXCIsXG4gIENvYmJsZXN0b25lID0gXCJtaW5lY3JhZnQ6Y29iYmxlc3RvbmVcIixcbiAgRGFya09ha1NpZ24gPSBcIm1pbmVjcmFmdDpkYXJrX29ha19zaWduXCIsXG4gIE1vc3NDYXJwZXQgPSBcIm1pbmVjcmFmdDptb3NzX2NhcnBldFwiLFxuICBDcmltc29uU3RhaXJzID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9zdGFpcnNcIixcbiAgQ2FsY2l0ZSA9IFwibWluZWNyYWZ0OmNhbGNpdGVcIixcbiAgU3RyaWRlclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c3RyaWRlcl9zcGF3bl9lZ2dcIixcbiAgR3JheVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpncmF5X3RlcnJhY290dGFcIixcbiAgTGFwaXNMYXp1bGkgPSBcIm1pbmVjcmFmdDpsYXBpc19sYXp1bGlcIixcbiAgQmxhY2tzdG9uZVN0YWlycyA9IFwibWluZWNyYWZ0OmJsYWNrc3RvbmVfc3RhaXJzXCIsXG4gIEJvb2sgPSBcIm1pbmVjcmFmdDpib29rXCIsXG4gIERlYWRCdWJibGVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfYnViYmxlX2NvcmFsX2ZhblwiLFxuICBQb2xpc2hlZEJsYWNrc3RvbmVCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tfc3RhaXJzXCIsXG4gIEFjYWNpYVdvb2QgPSBcIm1pbmVjcmFmdDphY2FjaWFfd29vZFwiLFxuICBPY2hyZUZyb2dsaWdodCA9IFwibWluZWNyYWZ0Om9jaHJlX2Zyb2dsaWdodFwiLFxuICBCcnVzaCA9IFwibWluZWNyYWZ0OmJydXNoXCIsXG4gIEV4cG9zZWRDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIEVuZGVyUGVhcmwgPSBcIm1pbmVjcmFmdDplbmRlcl9wZWFybFwiLFxuICBDaGlzZWxlZE5ldGhlckJyaWNrcyA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX25ldGhlcl9icmlja3NcIixcbiAgSGFyZExpbWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2xpbWVfc3RhaW5lZF9nbGFzc1wiLFxuICBQb2xpc2hlZERlZXBzbGF0ZVN0YWlycyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2RlZXBzbGF0ZV9zdGFpcnNcIixcbiAgQmlyY2hIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0OmJpcmNoX2hhbmdpbmdfc2lnblwiLFxuICBQdXJwbGVEeWUgPSBcIm1pbmVjcmFmdDpwdXJwbGVfZHllXCIsXG4gIFBvbGlzaGVkVHVmZldhbGwgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF90dWZmX3dhbGxcIixcbiAgV2VhdGhlcmVkQ3V0Q29wcGVyU3RhaXJzID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2N1dF9jb3BwZXJfc3RhaXJzXCIsXG4gIE11c2ljRGlzYzUgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjXzVcIixcbiAgQmFtYm9vVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDpiYW1ib29fdHJhcGRvb3JcIixcbiAgQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0OmNvcHBlcl9kb29yXCIsXG4gIE5ldGhlcml0ZVBpY2theGUgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfcGlja2F4ZVwiLFxuICBFeHBvc2VkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OmV4cG9zZWRfY29wcGVyX2J1bGJcIixcbiAgRGlhbW9uZEJsb2NrID0gXCJtaW5lY3JhZnQ6ZGlhbW9uZF9ibG9ja1wiLFxuICBQaXRjaGVyUG9kID0gXCJtaW5lY3JhZnQ6cGl0Y2hlcl9wb2RcIixcbiAgSXJvbkhvZSA9IFwibWluZWNyYWZ0Omlyb25faG9lXCIsXG4gIFdheGVkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OndheGVkX2NvcHBlcl9idWxiXCIsXG4gIFNjdWxrVmVpbiA9IFwibWluZWNyYWZ0OnNjdWxrX3ZlaW5cIixcbiAgQnJvd25TdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6YnJvd25fc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEFuZGVzaXRlID0gXCJtaW5lY3JhZnQ6YW5kZXNpdGVcIixcbiAgUGlua1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpwaW5rX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBDb2RTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmNvZF9zcGF3bl9lZ2dcIixcbiAgTmV0aGVyaXRlQmxvY2sgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfYmxvY2tcIixcbiAgQ29hbCA9IFwibWluZWNyYWZ0OmNvYWxcIixcbiAgV2F4ZWRXZWF0aGVyZWRDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY3V0X2NvcHBlcl9zdGFpcnNcIixcbiAgTGlnaHRCbG9jazUgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja181XCIsXG4gIFdheGVkT3hpZGl6ZWRDdXRDb3BwZXJTdGFpcnMgPSBcIm1pbmVjcmFmdDp3YXhlZF9veGlkaXplZF9jdXRfY29wcGVyX3N0YWlyc1wiLFxuICBJbmtTYWMgPSBcIm1pbmVjcmFmdDppbmtfc2FjXCIsXG4gIE5ldGhlcml0ZVNjcmFwID0gXCJtaW5lY3JhZnQ6bmV0aGVyaXRlX3NjcmFwXCIsXG4gIFR1ZmZCcmlja1N0YWlycyA9IFwibWluZWNyYWZ0OnR1ZmZfYnJpY2tfc3RhaXJzXCIsXG4gIExpZ2h0R3JheVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X3RlcnJhY290dGFcIixcbiAgQnVyblBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmJ1cm5fcG90dGVyeV9zaGVyZFwiLFxuICBSYXZhZ2VyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpyYXZhZ2VyX3NwYXduX2VnZ1wiLFxuICBCb25lID0gXCJtaW5lY3JhZnQ6Ym9uZVwiLFxuICBDb2JibGVkRGVlcHNsYXRlU3RhaXJzID0gXCJtaW5lY3JhZnQ6Y29iYmxlZF9kZWVwc2xhdGVfc3RhaXJzXCIsXG4gIFNodWxrZXJTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnNodWxrZXJfc3Bhd25fZWdnXCIsXG4gIERlZXBzbGF0ZVRpbGVTdGFpcnMgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfdGlsZV9zdGFpcnNcIixcbiAgWWVsbG93VGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OnllbGxvd190ZXJyYWNvdHRhXCIsXG4gIEJyb3duR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmJyb3duX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIFNsaW1lU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpzbGltZV9zcGF3bl9lZ2dcIixcbiAgUGlsbGFnZXJTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnBpbGxhZ2VyX3NwYXduX2VnZ1wiLFxuICBPYnNlcnZlciA9IFwibWluZWNyYWZ0Om9ic2VydmVyXCIsXG4gIFBpbmtHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6cGlua19nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBDb21wYXNzID0gXCJtaW5lY3JhZnQ6Y29tcGFzc1wiLFxuICBIYXJkTGlnaHRHcmF5U3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9saWdodF9ncmF5X3N0YWluZWRfZ2xhc3NcIixcbiAgRGVlcHNsYXRlQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVfYnJpY2tfc3RhaXJzXCIsXG4gIFdheGVkT3hpZGl6ZWRDb3BwZXJCdWxiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX2J1bGJcIixcbiAgRW5jaGFudGVkQm9vayA9IFwibWluZWNyYWZ0OmVuY2hhbnRlZF9ib29rXCIsXG4gIEN1dFNhbmRzdG9uZSA9IFwibWluZWNyYWZ0OmN1dF9zYW5kc3RvbmVcIixcbiAgUmVkVHVsaXAgPSBcIm1pbmVjcmFmdDpyZWRfdHVsaXBcIixcbiAgTXVkQnJpY2tTdGFpcnMgPSBcIm1pbmVjcmFmdDptdWRfYnJpY2tfc3RhaXJzXCIsXG4gIEhhcmRNYWdlbnRhU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9tYWdlbnRhX3N0YWluZWRfZ2xhc3NcIixcbiAgRmxpbnRBbmRTdGVlbCA9IFwibWluZWNyYWZ0OmZsaW50X2FuZF9zdGVlbFwiLFxuICBPbWlub3VzQm90dGxlID0gXCJtaW5lY3JhZnQ6b21pbm91c19ib3R0bGVcIixcbiAgQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OmNvcHBlcl9idWxiXCIsXG4gIENyZWVwZXJTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmNyZWVwZXJfc3Bhd25fZWdnXCIsXG4gIFNhbG1vblNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c2FsbW9uX3NwYXduX2VnZ1wiLFxuICBTcHJ1Y2VEb29yID0gXCJtaW5lY3JhZnQ6c3BydWNlX2Rvb3JcIixcbiAgQ2hpc2VsZWRTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9zYW5kc3RvbmVcIixcbiAgRnJvc3RlZEljZSA9IFwibWluZWNyYWZ0OmZyb3N0ZWRfaWNlXCIsXG4gIEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDpjdXRfY29wcGVyX3NsYWJcIixcbiAgUXVhcnR6T3JlID0gXCJtaW5lY3JhZnQ6cXVhcnR6X29yZVwiLFxuICBDYWxpYnJhdGVkU2N1bGtTZW5zb3IgPSBcIm1pbmVjcmFmdDpjYWxpYnJhdGVkX3NjdWxrX3NlbnNvclwiLFxuICBTbm93ID0gXCJtaW5lY3JhZnQ6c25vd1wiLFxuICBNYW5ncm92ZURvb3IgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9kb29yXCIsXG4gIEJyb3duV29vbCA9IFwibWluZWNyYWZ0OmJyb3duX3dvb2xcIixcbiAgUGlua1dvb2wgPSBcIm1pbmVjcmFmdDpwaW5rX3dvb2xcIixcbiAgR29sZEJsb2NrID0gXCJtaW5lY3JhZnQ6Z29sZF9ibG9ja1wiLFxuICBTdHJpcHBlZE9ha0xvZyA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX29ha19sb2dcIixcbiAgQmx1ZUljZSA9IFwibWluZWNyYWZ0OmJsdWVfaWNlXCIsXG4gIENoZXJyeURvb3IgPSBcIm1pbmVjcmFmdDpjaGVycnlfZG9vclwiLFxuICBKdW5nbGVUcmFwZG9vciA9IFwibWluZWNyYWZ0Omp1bmdsZV90cmFwZG9vclwiLFxuICBTa3VsbEJhbm5lclBhdHRlcm4gPSBcIm1pbmVjcmFmdDpza3VsbF9iYW5uZXJfcGF0dGVyblwiLFxuICBCbGFja0NvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6YmxhY2tfY29uY3JldGVfcG93ZGVyXCIsXG4gIEJhbWJvb0Rvb3IgPSBcIm1pbmVjcmFmdDpiYW1ib29fZG9vclwiLFxuICBWaW5lID0gXCJtaW5lY3JhZnQ6dmluZVwiLFxuICBXYXhlZE94aWRpemVkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF9veGlkaXplZF9jaGlzZWxlZF9jb3BwZXJcIixcbiAgUG9sYXJCZWFyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpwb2xhcl9iZWFyX3NwYXduX2VnZ1wiLFxuICBGYXJtbGFuZCA9IFwibWluZWNyYWZ0OmZhcm1sYW5kXCIsXG4gIEFjYWNpYVNhcGxpbmcgPSBcIm1pbmVjcmFmdDphY2FjaWFfc2FwbGluZ1wiLFxuICBIYXJkQmx1ZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2JsdWVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFllbGxvd1NodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDp5ZWxsb3dfc2h1bGtlcl9ib3hcIixcbiAgQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9jb3BwZXJcIixcbiAgV2F4ZWRXZWF0aGVyZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3YXhlZF93ZWF0aGVyZWRfY29wcGVyXCIsXG4gIE94aWRpemVkQ29wcGVyRG9vciA9IFwibWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl9kb29yXCIsXG4gIENoaXNlbGVkUXVhcnR6QmxvY2sgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9xdWFydHpfYmxvY2tcIixcbiAgRGVlcHNsYXRlQnJpY2tzID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrc1wiLFxuICBCYW1ib29CbG9jayA9IFwibWluZWNyYWZ0OmJhbWJvb19ibG9ja1wiLFxuICBOZXRoZXJpdGVVcGdyYWRlU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0Om5ldGhlcml0ZV91cGdyYWRlX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIE5ldGhlcml0ZUhlbG1ldCA9IFwibWluZWNyYWZ0Om5ldGhlcml0ZV9oZWxtZXRcIixcbiAgR3VzdGVyUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6Z3VzdGVyX3BvdHRlcnlfc2hlcmRcIixcbiAgTGFudGVybiA9IFwibWluZWNyYWZ0OmxhbnRlcm5cIixcbiAgTmV0aGVyaXRlU3dvcmQgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfc3dvcmRcIixcbiAgQ2hhaW5Db21tYW5kQmxvY2sgPSBcIm1pbmVjcmFmdDpjaGFpbl9jb21tYW5kX2Jsb2NrXCIsXG4gIEFjYWNpYVRyYXBkb29yID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3RyYXBkb29yXCIsXG4gIEJha2VkUG90YXRvID0gXCJtaW5lY3JhZnQ6YmFrZWRfcG90YXRvXCIsXG4gIE1hbmdyb3ZlVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV90cmFwZG9vclwiLFxuICBDaGVycnlUcmFwZG9vciA9IFwibWluZWNyYWZ0OmNoZXJyeV90cmFwZG9vclwiLFxuICBHbG93c3RvbmVEdXN0ID0gXCJtaW5lY3JhZnQ6Z2xvd3N0b25lX2R1c3RcIixcbiAgQmxhY2tzdG9uZSA9IFwibWluZWNyYWZ0OmJsYWNrc3RvbmVcIixcbiAgV2FycGVkV2FydEJsb2NrID0gXCJtaW5lY3JhZnQ6d2FycGVkX3dhcnRfYmxvY2tcIixcbiAgTGxhbWFTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmxsYW1hX3NwYXduX2VnZ1wiLFxuICBXYXJwZWRUcmFwZG9vciA9IFwibWluZWNyYWZ0OndhcnBlZF90cmFwZG9vclwiLFxuICBFbmRSb2QgPSBcIm1pbmVjcmFmdDplbmRfcm9kXCIsXG4gIEZsZXRjaGluZ1RhYmxlID0gXCJtaW5lY3JhZnQ6ZmxldGNoaW5nX3RhYmxlXCIsXG4gIENvYXN0QXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OmNvYXN0X2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgQ2hlbWljYWxIZWF0ID0gXCJtaW5lY3JhZnQ6Y2hlbWljYWxfaGVhdFwiLFxuICBTdHJpcHBlZERhcmtPYWtMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9kYXJrX29ha19sb2dcIixcbiAgUmVkQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpyZWRfY29uY3JldGVcIixcbiAgQ3JpbXNvbkh5cGhhZSA9IFwibWluZWNyYWZ0OmNyaW1zb25faHlwaGFlXCIsXG4gIEJsYWNrVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OmJsYWNrX3RlcnJhY290dGFcIixcbiAgRHJpZWRLZWxwQmxvY2sgPSBcIm1pbmVjcmFmdDpkcmllZF9rZWxwX2Jsb2NrXCIsXG4gIENoaXBwZWRBbnZpbCA9IFwibWluZWNyYWZ0OmNoaXBwZWRfYW52aWxcIixcbiAgRXhwbG9yZXJQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpleHBsb3Jlcl9wb3R0ZXJ5X3NoZXJkXCIsXG4gIFBvcmtjaG9wID0gXCJtaW5lY3JhZnQ6cG9ya2Nob3BcIixcbiAgRmxvd2VyUG90ID0gXCJtaW5lY3JhZnQ6Zmxvd2VyX3BvdFwiLFxuICBVbmRlcndhdGVyVG9yY2ggPSBcIm1pbmVjcmFmdDp1bmRlcndhdGVyX3RvcmNoXCIsXG4gIFJlc3Bhd25BbmNob3IgPSBcIm1pbmVjcmFmdDpyZXNwYXduX2FuY2hvclwiLFxuICBOZXRoZXJpdGVCb290cyA9IFwibWluZWNyYWZ0Om5ldGhlcml0ZV9ib290c1wiLFxuICBNYW5ncm92ZUxlYXZlcyA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2xlYXZlc1wiLFxuICBSYXdDb3BwZXJCbG9jayA9IFwibWluZWNyYWZ0OnJhd19jb3BwZXJfYmxvY2tcIixcbiAgQmVldHJvb3QgPSBcIm1pbmVjcmFmdDpiZWV0cm9vdFwiLFxuICBXYXJkZW5TcGF3bkVnZyA9IFwibWluZWNyYWZ0OndhcmRlbl9zcGF3bl9lZ2dcIixcbiAgSGFyZEN5YW5TdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2N5YW5fc3RhaW5lZF9nbGFzc1wiLFxuICBXYXhlZFdlYXRoZXJlZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcl90cmFwZG9vclwiLFxuICBQb2xpc2hlZERpb3JpdGUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kaW9yaXRlXCIsXG4gIEN5YW5HbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6Y3lhbl9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBQaW5rU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OnBpbmtfc2h1bGtlcl9ib3hcIixcbiAgUGFja2VkSWNlID0gXCJtaW5lY3JhZnQ6cGFja2VkX2ljZVwiLFxuICBTbW9vdGhRdWFydHogPSBcIm1pbmVjcmFmdDpzbW9vdGhfcXVhcnR6XCIsXG4gIFB1cnBsZVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpwdXJwbGVfdGVycmFjb3R0YVwiLFxuICBCZWQgPSBcIm1pbmVjcmFmdDpiZWRcIixcbiAgV2F4ZWRFeHBvc2VkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJcIixcbiAgU3RyaXBwZWRBY2FjaWFXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYWNhY2lhX3dvb2RcIixcbiAgV2F4ZWRPeGlkaXplZENvcHBlckdyYXRlID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX2dyYXRlXCIsXG4gIENoYWlubWFpbEhlbG1ldCA9IFwibWluZWNyYWZ0OmNoYWlubWFpbF9oZWxtZXRcIixcbiAgT3hpZGl6ZWRDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0Om94aWRpemVkX2NoaXNlbGVkX2NvcHBlclwiLFxuICBIYXJkTWFnZW50YVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX21hZ2VudGFfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFBpbmtTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpwaW5rX3N0YWluZWRfZ2xhc3NcIixcbiAgTXVzaWNEaXNjU3RhbCA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2Nfc3RhbFwiLFxuICBCcm93blN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmJyb3duX3N0YWluZWRfZ2xhc3NcIixcbiAgQ29hbEJsb2NrID0gXCJtaW5lY3JhZnQ6Y29hbF9ibG9ja1wiLFxuICBWYXVsdCA9IFwibWluZWNyYWZ0OnZhdWx0XCIsXG4gIEF6YWxlYUxlYXZlc0Zsb3dlcmVkID0gXCJtaW5lY3JhZnQ6YXphbGVhX2xlYXZlc19mbG93ZXJlZFwiLFxuICBTdHJ1Y3R1cmVWb2lkID0gXCJtaW5lY3JhZnQ6c3RydWN0dXJlX3ZvaWRcIixcbiAgQ2hhaW5tYWlsQ2hlc3RwbGF0ZSA9IFwibWluZWNyYWZ0OmNoYWlubWFpbF9jaGVzdHBsYXRlXCIsXG4gIFJlY292ZXJ5Q29tcGFzcyA9IFwibWluZWNyYWZ0OnJlY292ZXJ5X2NvbXBhc3NcIixcbiAgTXVkQnJpY2tzID0gXCJtaW5lY3JhZnQ6bXVkX2JyaWNrc1wiLFxuICBQZW9ueSA9IFwibWluZWNyYWZ0OnBlb255XCIsXG4gIENyYWNrZWRQb2xpc2hlZEJsYWNrc3RvbmVCcmlja3MgPSBcIm1pbmVjcmFmdDpjcmFja2VkX3BvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tzXCIsXG4gIEFsbGl1bSA9IFwibWluZWNyYWZ0OmFsbGl1bVwiLFxuICBBY2FjaWFDaGVzdEJvYXQgPSBcIm1pbmVjcmFmdDphY2FjaWFfY2hlc3RfYm9hdFwiLFxuICBPYWtXb29kID0gXCJtaW5lY3JhZnQ6b2FrX3dvb2RcIixcbiAgV2F4ZWRPeGlkaXplZENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX3RyYXBkb29yXCIsXG4gIFNrZWxldG9uSG9yc2VTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnNrZWxldG9uX2hvcnNlX3NwYXduX2VnZ1wiLFxuICBMaWdodEJsdWVXb29sID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV93b29sXCIsXG4gIENsYXlCYWxsID0gXCJtaW5lY3JhZnQ6Y2xheV9iYWxsXCIsXG4gIEJsYWNrQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpibGFja19jb25jcmV0ZVwiLFxuICBTaG9ydEdyYXNzID0gXCJtaW5lY3JhZnQ6c2hvcnRfZ3Jhc3NcIixcbiAgTGFwaXNCbG9jayA9IFwibWluZWNyYWZ0OmxhcGlzX2Jsb2NrXCIsXG4gIEJyZWV6ZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6YnJlZXplX3NwYXduX2VnZ1wiLFxuICBMaW1lQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpsaW1lX2NvbmNyZXRlXCIsXG4gIFdheGVkV2VhdGhlcmVkQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndheGVkX3dlYXRoZXJlZF9jdXRfY29wcGVyX3NsYWJcIixcbiAgU21vb3RoUXVhcnR6U2xhYiA9IFwibWluZWNyYWZ0OnNtb290aF9xdWFydHpfc2xhYlwiLFxuICBUb3JjaGZsb3dlclNlZWRzID0gXCJtaW5lY3JhZnQ6dG9yY2hmbG93ZXJfc2VlZHNcIixcbiAgSGF5QmxvY2sgPSBcIm1pbmVjcmFmdDpoYXlfYmxvY2tcIixcbiAgUG9saXNoZWRCbGFja3N0b25lQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9icmlja19zbGFiXCIsXG4gIFN0cmlwcGVkQmFtYm9vQmxvY2sgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9iYW1ib29fYmxvY2tcIixcbiAgQ2hpc2VsZWRTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX3N0b25lX2JyaWNrc1wiLFxuICBMYWRkZXIgPSBcIm1pbmVjcmFmdDpsYWRkZXJcIixcbiAgSXJvbkNoZXN0cGxhdGUgPSBcIm1pbmVjcmFmdDppcm9uX2NoZXN0cGxhdGVcIixcbiAgRGlhbW9uZEhlbG1ldCA9IFwibWluZWNyYWZ0OmRpYW1vbmRfaGVsbWV0XCIsXG4gIFdheGVkT3hpZGl6ZWRDdXRDb3BwZXJTbGFiID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY3V0X2NvcHBlcl9zbGFiXCIsXG4gIFByaXNtYXJpbmVDcnlzdGFscyA9IFwibWluZWNyYWZ0OnByaXNtYXJpbmVfY3J5c3RhbHNcIixcbiAgQmFubmVyID0gXCJtaW5lY3JhZnQ6YmFubmVyXCIsXG4gIFB1bXBraW5TZWVkcyA9IFwibWluZWNyYWZ0OnB1bXBraW5fc2VlZHNcIixcbiAgV2hpdGVDb25jcmV0ZSA9IFwibWluZWNyYWZ0OndoaXRlX2NvbmNyZXRlXCIsXG4gIEhhcmRHcmF5U3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9ncmF5X3N0YWluZWRfZ2xhc3NcIixcbiAgU2xpbWVCYWxsID0gXCJtaW5lY3JhZnQ6c2xpbWVfYmFsbFwiLFxuICBUdWJlQ29yYWwgPSBcIm1pbmVjcmFmdDp0dWJlX2NvcmFsXCIsXG4gIFN0aWNrID0gXCJtaW5lY3JhZnQ6c3RpY2tcIixcbiAgRWdnID0gXCJtaW5lY3JhZnQ6ZWdnXCIsXG4gIE5ldGhlclNwcm91dHMgPSBcIm1pbmVjcmFmdDpuZXRoZXJfc3Byb3V0c1wiLFxuICBXZWF0aGVyZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl9kb29yXCIsXG4gIE11c2ljRGlzY0Jsb2NrcyA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2NfYmxvY2tzXCIsXG4gIEJyaWNrQmxvY2sgPSBcIm1pbmVjcmFmdDpicmlja19ibG9ja1wiLFxuICBSZWRzdG9uZUxhbXAgPSBcIm1pbmVjcmFmdDpyZWRzdG9uZV9sYW1wXCIsXG4gIENoZXJyeVNsYWIgPSBcIm1pbmVjcmFmdDpjaGVycnlfc2xhYlwiLFxuICBDdXRDb3BwZXIgPSBcIm1pbmVjcmFmdDpjdXRfY29wcGVyXCIsXG4gIEJhbWJvbyA9IFwibWluZWNyYWZ0OmJhbWJvb1wiLFxuICBDeWFuQ29uY3JldGUgPSBcIm1pbmVjcmFmdDpjeWFuX2NvbmNyZXRlXCIsXG4gIFByaXNtYXJpbmVCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX2JyaWNrX3NsYWJcIixcbiAgU21va2VyID0gXCJtaW5lY3JhZnQ6c21va2VyXCIsXG4gIEZyYW1lID0gXCJtaW5lY3JhZnQ6ZnJhbWVcIixcbiAgQnJld2VyUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6YnJld2VyX3BvdHRlcnlfc2hlcmRcIixcbiAgUmVkU2FuZCA9IFwibWluZWNyYWZ0OnJlZF9zYW5kXCIsXG4gIFBpbmtDYXJwZXQgPSBcIm1pbmVjcmFmdDpwaW5rX2NhcnBldFwiLFxuICBHcmVlbkR5ZSA9IFwibWluZWNyYWZ0OmdyZWVuX2R5ZVwiLFxuICBHdXN0ZXJCYW5uZXJQYXR0ZXJuID0gXCJtaW5lY3JhZnQ6Z3VzdGVyX2Jhbm5lcl9wYXR0ZXJuXCIsXG4gIEJyb3duQ2FycGV0ID0gXCJtaW5lY3JhZnQ6YnJvd25fY2FycGV0XCIsXG4gIExpZ2h0R3JheUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9jb25jcmV0ZVwiLFxuICBXZWF0aGVyZWRDb3BwZXJHcmF0ZSA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJfZ3JhdGVcIixcbiAgV2VhdGhlcmVkQ29wcGVyVHJhcGRvb3IgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY29wcGVyX3RyYXBkb29yXCIsXG4gIENob3J1c1BsYW50ID0gXCJtaW5lY3JhZnQ6Y2hvcnVzX3BsYW50XCIsXG4gIFB1cnBsZVdvb2wgPSBcIm1pbmVjcmFmdDpwdXJwbGVfd29vbFwiLFxuICBXYXhlZE94aWRpemVkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY3V0X2NvcHBlclwiLFxuICBHcmF5Q29uY3JldGUgPSBcIm1pbmVjcmFmdDpncmF5X2NvbmNyZXRlXCIsXG4gIFdheGVkT3hpZGl6ZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX2Rvb3JcIixcbiAgRmVybWVudGVkU3BpZGVyRXllID0gXCJtaW5lY3JhZnQ6ZmVybWVudGVkX3NwaWRlcl9leWVcIixcbiAgU3BpZGVyRXllID0gXCJtaW5lY3JhZnQ6c3BpZGVyX2V5ZVwiLFxuICBNYWdlbnRhQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDptYWdlbnRhX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBMaW1lU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmxpbWVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIE9yYW5nZUNvbmNyZXRlID0gXCJtaW5lY3JhZnQ6b3JhbmdlX2NvbmNyZXRlXCIsXG4gIFRyYWRlckxsYW1hU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDp0cmFkZXJfbGxhbWFfc3Bhd25fZWdnXCIsXG4gIEdoYXN0VGVhciA9IFwibWluZWNyYWZ0OmdoYXN0X3RlYXJcIixcbiAgUGlua0NvbmNyZXRlID0gXCJtaW5lY3JhZnQ6cGlua19jb25jcmV0ZVwiLFxuICBMaXRQdW1wa2luID0gXCJtaW5lY3JhZnQ6bGl0X3B1bXBraW5cIixcbiAgQnJvd25Db25jcmV0ZSA9IFwibWluZWNyYWZ0OmJyb3duX2NvbmNyZXRlXCIsXG4gIENvbXBvdW5kID0gXCJtaW5lY3JhZnQ6Y29tcG91bmRcIixcbiAgTXVkQnJpY2tTbGFiID0gXCJtaW5lY3JhZnQ6bXVkX2JyaWNrX3NsYWJcIixcbiAgVHVmZiA9IFwibWluZWNyYWZ0OnR1ZmZcIixcbiAgRXhwb3NlZENvcHBlckRvb3IgPSBcIm1pbmVjcmFmdDpleHBvc2VkX2NvcHBlcl9kb29yXCIsXG4gIEdyYXlHbGF6ZWRUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6Z3JheV9nbGF6ZWRfdGVycmFjb3R0YVwiLFxuICBTbm9ydFBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OnNub3J0X3BvdHRlcnlfc2hlcmRcIixcbiAgU3RvbmVCdXR0b24gPSBcIm1pbmVjcmFmdDpzdG9uZV9idXR0b25cIixcbiAgU3BydWNlU2FwbGluZyA9IFwibWluZWNyYWZ0OnNwcnVjZV9zYXBsaW5nXCIsXG4gIExpZ2h0QmxvY2s4ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfOFwiLFxuICBXYXhlZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDp3YXhlZF9jdXRfY29wcGVyX3NsYWJcIixcbiAgRmVhdGhlciA9IFwibWluZWNyYWZ0OmZlYXRoZXJcIixcbiAgQ2xheSA9IFwibWluZWNyYWZ0OmNsYXlcIixcbiAgV29sZlNwYXduRWdnID0gXCJtaW5lY3JhZnQ6d29sZl9zcGF3bl9lZ2dcIixcbiAgQ3lhblN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpjeWFuX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBWaWxsYWdlclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6dmlsbGFnZXJfc3Bhd25fZWdnXCIsXG4gIExpbWVEeWUgPSBcIm1pbmVjcmFmdDpsaW1lX2R5ZVwiLFxuICBDcmltc29uRnVuZ3VzID0gXCJtaW5lY3JhZnQ6Y3JpbXNvbl9mdW5ndXNcIixcbiAgVHJpZGVudCA9IFwibWluZWNyYWZ0OnRyaWRlbnRcIixcbiAgSGFyZGVuZWRDbGF5ID0gXCJtaW5lY3JhZnQ6aGFyZGVuZWRfY2xheVwiLFxuICBHb2F0SG9ybiA9IFwibWluZWNyYWZ0OmdvYXRfaG9yblwiLFxuICBDcmFmdGVyID0gXCJtaW5lY3JhZnQ6Y3JhZnRlclwiLFxuICBTaGVlcFNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c2hlZXBfc3Bhd25fZWdnXCIsXG4gIE11c2ljRGlzY1BpZ3N0ZXAgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX3BpZ3N0ZXBcIixcbiAgQXphbGVhID0gXCJtaW5lY3JhZnQ6YXphbGVhXCIsXG4gIEZpcmVDaGFyZ2UgPSBcIm1pbmVjcmFmdDpmaXJlX2NoYXJnZVwiLFxuICBBY2FjaWFCb2F0ID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2JvYXRcIixcbiAgQ3lhbldvb2wgPSBcIm1pbmVjcmFmdDpjeWFuX3dvb2xcIixcbiAgRGVlcHNsYXRlRGlhbW9uZE9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9kaWFtb25kX29yZVwiLFxuICBXaGl0ZUNhbmRsZSA9IFwibWluZWNyYWZ0OndoaXRlX2NhbmRsZVwiLFxuICBDbG9jayA9IFwibWluZWNyYWZ0OmNsb2NrXCIsXG4gIFJlZENhcnBldCA9IFwibWluZWNyYWZ0OnJlZF9jYXJwZXRcIixcbiAgTGlnaHRHcmF5Q2FycGV0ID0gXCJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9jYXJwZXRcIixcbiAgUHVycHVyQmxvY2sgPSBcIm1pbmVjcmFmdDpwdXJwdXJfYmxvY2tcIixcbiAgRHJpZWRLZWxwID0gXCJtaW5lY3JhZnQ6ZHJpZWRfa2VscFwiLFxuICBDb29rZWRCZWVmID0gXCJtaW5lY3JhZnQ6Y29va2VkX2JlZWZcIixcbiAgQ2hlcnJ5SGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpjaGVycnlfaGFuZ2luZ19zaWduXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZSA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVcIixcbiAgQ3JpbXNvblByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpjcmltc29uX3ByZXNzdXJlX3BsYXRlXCIsXG4gIENoYXJjb2FsID0gXCJtaW5lY3JhZnQ6Y2hhcmNvYWxcIixcbiAgTGlnaHRHcmF5U2h1bGtlckJveCA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfc2h1bGtlcl9ib3hcIixcbiAgSG9yc2VTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmhvcnNlX3NwYXduX2VnZ1wiLFxuICBOYXV0aWx1c1NoZWxsID0gXCJtaW5lY3JhZnQ6bmF1dGlsdXNfc2hlbGxcIixcbiAgQm93ID0gXCJtaW5lY3JhZnQ6Ym93XCIsXG4gIFN0cmluZyA9IFwibWluZWNyYWZ0OnN0cmluZ1wiLFxuICBGcm9nU3Bhd24gPSBcIm1pbmVjcmFmdDpmcm9nX3NwYXduXCIsXG4gIFJlZFN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpyZWRfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFJlZENhbmRsZSA9IFwibWluZWNyYWZ0OnJlZF9jYW5kbGVcIixcbiAgR2xvd0xpY2hlbiA9IFwibWluZWNyYWZ0Omdsb3dfbGljaGVuXCIsXG4gIENvcHBlclRyYXBkb29yID0gXCJtaW5lY3JhZnQ6Y29wcGVyX3RyYXBkb29yXCIsXG4gIExlYXRoZXJIZWxtZXQgPSBcIm1pbmVjcmFmdDpsZWF0aGVyX2hlbG1ldFwiLFxuICBXaXRoZXJSb3NlID0gXCJtaW5lY3JhZnQ6d2l0aGVyX3Jvc2VcIixcbiAgRGFya09ha0NoZXN0Qm9hdCA9IFwibWluZWNyYWZ0OmRhcmtfb2FrX2NoZXN0X2JvYXRcIixcbiAgQ29wcGVyQmxvY2sgPSBcIm1pbmVjcmFmdDpjb3BwZXJfYmxvY2tcIixcbiAgU3BsYXNoUG90aW9uID0gXCJtaW5lY3JhZnQ6c3BsYXNoX3BvdGlvblwiLFxuICBDYWN0dXMgPSBcIm1pbmVjcmFmdDpjYWN0dXNcIixcbiAgVHVydGxlU2N1dGUgPSBcIm1pbmVjcmFmdDp0dXJ0bGVfc2N1dGVcIixcbiAgR2xvd0ZyYW1lID0gXCJtaW5lY3JhZnQ6Z2xvd19mcmFtZVwiLFxuICBBY2FjaWFTbGFiID0gXCJtaW5lY3JhZnQ6YWNhY2lhX3NsYWJcIixcbiAgUG9saXNoZWRBbmRlc2l0ZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9hbmRlc2l0ZV9zbGFiXCIsXG4gIEdsYXNzID0gXCJtaW5lY3JhZnQ6Z2xhc3NcIixcbiAgTW9zc0Jsb2NrID0gXCJtaW5lY3JhZnQ6bW9zc19ibG9ja1wiLFxuICBHb2xkT3JlID0gXCJtaW5lY3JhZnQ6Z29sZF9vcmVcIixcbiAgU2tlbGV0b25TcGF3bkVnZyA9IFwibWluZWNyYWZ0OnNrZWxldG9uX3NwYXduX2VnZ1wiLFxuICBDdXRTYW5kc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6Y3V0X3NhbmRzdG9uZV9zbGFiXCIsXG4gIEVuZENyeXN0YWwgPSBcIm1pbmVjcmFmdDplbmRfY3J5c3RhbFwiLFxuICBQdXJwbGVDYXJwZXQgPSBcIm1pbmVjcmFmdDpwdXJwbGVfY2FycGV0XCIsXG4gIEZpcmVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OmZpcmVfY29yYWxfZmFuXCIsXG4gIEdyZWVuQ29uY3JldGVQb3dkZXIgPSBcIm1pbmVjcmFmdDpncmVlbl9jb25jcmV0ZV9wb3dkZXJcIixcbiAgTGltZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmxpbWVfc3RhaW5lZF9nbGFzc1wiLFxuICBQb2xpc2hlZEFuZGVzaXRlID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGVcIixcbiAgUHVycGxlU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6cHVycGxlX3N0YWluZWRfZ2xhc3NcIixcbiAgT2FrQm9hdCA9IFwibWluZWNyYWZ0Om9ha19ib2F0XCIsXG4gIE1hZ2VudGFTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDptYWdlbnRhX3N0YWluZWRfZ2xhc3NcIixcbiAgV2VhdGhlcmVkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jb3BwZXJfYnVsYlwiLFxuICBMaWdodFdlaWdodGVkUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmxpZ2h0X3dlaWdodGVkX3ByZXNzdXJlX3BsYXRlXCIsXG4gIFJhcGlkRmVydGlsaXplciA9IFwibWluZWNyYWZ0OnJhcGlkX2ZlcnRpbGl6ZXJcIixcbiAgSG9uZXlCbG9jayA9IFwibWluZWNyYWZ0OmhvbmV5X2Jsb2NrXCIsXG4gIFN0cnVjdHVyZUJsb2NrID0gXCJtaW5lY3JhZnQ6c3RydWN0dXJlX2Jsb2NrXCIsXG4gIFRpbnRlZEdsYXNzID0gXCJtaW5lY3JhZnQ6dGludGVkX2dsYXNzXCIsXG4gIEJ1ZGRpbmdBbWV0aHlzdCA9IFwibWluZWNyYWZ0OmJ1ZGRpbmdfYW1ldGh5c3RcIixcbiAgUGlua1R1bGlwID0gXCJtaW5lY3JhZnQ6cGlua190dWxpcFwiLFxuICBPYWtIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0Om9ha19oYW5naW5nX3NpZ25cIixcbiAgU3BydWNlU2xhYiA9IFwibWluZWNyYWZ0OnNwcnVjZV9zbGFiXCIsXG4gIEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmdsYXNzX3BhbmVcIixcbiAgU2hlbHRlclBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OnNoZWx0ZXJfcG90dGVyeV9zaGVyZFwiLFxuICBJbmZlc3RlZERlZXBzbGF0ZSA9IFwibWluZWNyYWZ0OmluZmVzdGVkX2RlZXBzbGF0ZVwiLFxuICBQb2R6b2wgPSBcIm1pbmVjcmFmdDpwb2R6b2xcIixcbiAgQWN0aXZhdG9yUmFpbCA9IFwibWluZWNyYWZ0OmFjdGl2YXRvcl9yYWlsXCIsXG4gIFdoaXRlU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OndoaXRlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBMaWdodEJsb2NrMTIgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18xMlwiLFxuICBCcm93bkNhbmRsZSA9IFwibWluZWNyYWZ0OmJyb3duX2NhbmRsZVwiLFxuICBQb2xpc2hlZERlZXBzbGF0ZVNsYWIgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9kZWVwc2xhdGVfc2xhYlwiLFxuICBEZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDpkZWVwc2xhdGVcIixcbiAgU3RyaXBwZWRPYWtXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfb2FrX3dvb2RcIixcbiAgT3hpZGl6ZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jb3BwZXJcIixcbiAgSXJvblNob3ZlbCA9IFwibWluZWNyYWZ0Omlyb25fc2hvdmVsXCIsXG4gIFN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6c3RvbmVfYnJpY2tzXCIsXG4gIE5ldGhlcldhcnQgPSBcIm1pbmVjcmFmdDpuZXRoZXJfd2FydFwiLFxuICBPcmFuZ2VTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6b3JhbmdlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBHb2F0U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpnb2F0X3NwYXduX2VnZ1wiLFxuICBTdHJpcHBlZE1hbmdyb3ZlV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX21hbmdyb3ZlX3dvb2RcIixcbiAgQ2FtcGZpcmUgPSBcIm1pbmVjcmFmdDpjYW1wZmlyZVwiLFxuICBPcmFuZ2VDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0Om9yYW5nZV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgRmxvd1BvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmZsb3dfcG90dGVyeV9zaGVyZFwiLFxuICBHcmVlbkNhbmRsZSA9IFwibWluZWNyYWZ0OmdyZWVuX2NhbmRsZVwiLFxuICBQdXJwbGVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6cHVycGxlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBKaWdzYXcgPSBcIm1pbmVjcmFmdDpqaWdzYXdcIixcbiAgQWNhY2lhUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmFjYWNpYV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBTbW9vdGhSZWRTYW5kc3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmVfc2xhYlwiLFxuICBDaGlzZWxlZFBvbGlzaGVkQmxhY2tzdG9uZSA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX3BvbGlzaGVkX2JsYWNrc3RvbmVcIixcbiAgU21vb3RoU3RvbmVTbGFiID0gXCJtaW5lY3JhZnQ6c21vb3RoX3N0b25lX3NsYWJcIixcbiAgQXphbGVhTGVhdmVzID0gXCJtaW5lY3JhZnQ6YXphbGVhX2xlYXZlc1wiLFxuICBNYWdlbnRhU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFdvb2RlbkF4ZSA9IFwibWluZWNyYWZ0Ondvb2Rlbl9heGVcIixcbiAgQ3lhbkNhbmRsZSA9IFwibWluZWNyYWZ0OmN5YW5fY2FuZGxlXCIsXG4gIFByaXplUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6cHJpemVfcG90dGVyeV9zaGVyZFwiLFxuICBXaGl0ZUNhcnBldCA9IFwibWluZWNyYWZ0OndoaXRlX2NhcnBldFwiLFxuICBPYWtDaGVzdEJvYXQgPSBcIm1pbmVjcmFmdDpvYWtfY2hlc3RfYm9hdFwiLFxuICBCaXJjaFdvb2QgPSBcIm1pbmVjcmFmdDpiaXJjaF93b29kXCIsXG4gIEdsb3dJbmtTYWMgPSBcIm1pbmVjcmFmdDpnbG93X2lua19zYWNcIixcbiAgSGFyZEN5YW5TdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9jeWFuX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBFbWVyYWxkT3JlID0gXCJtaW5lY3JhZnQ6ZW1lcmFsZF9vcmVcIixcbiAgU21vb3RoU3RvbmUgPSBcIm1pbmVjcmFmdDpzbW9vdGhfc3RvbmVcIixcbiAgSGFyZExpZ2h0Qmx1ZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfbGlnaHRfYmx1ZV9zdGFpbmVkX2dsYXNzXCIsXG4gIFllbGxvd0NvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6eWVsbG93X2NvbmNyZXRlX3Bvd2RlclwiLFxuICBPYWtTbGFiID0gXCJtaW5lY3JhZnQ6b2FrX3NsYWJcIixcbiAgR29sZGVuSG9yc2VBcm1vciA9IFwibWluZWNyYWZ0OmdvbGRlbl9ob3JzZV9hcm1vclwiLFxuICBDaGVycnlXb29kID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3dvb2RcIixcbiAgQmlyY2hTbGFiID0gXCJtaW5lY3JhZnQ6YmlyY2hfc2xhYlwiLFxuICBKdW5nbGVTbGFiID0gXCJtaW5lY3JhZnQ6anVuZ2xlX3NsYWJcIixcbiAgTWFnZW50YUR5ZSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfZHllXCIsXG4gIE1hbmdyb3ZlU2xhYiA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3NsYWJcIixcbiAgV2F0ZXJCdWNrZXQgPSBcIm1pbmVjcmFmdDp3YXRlcl9idWNrZXRcIixcbiAgSGFyZEJsdWVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2JsdWVfc3RhaW5lZF9nbGFzc1wiLFxuICBQb2xpc2hlZEdyYW5pdGVTbGFiID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfZ3Jhbml0ZV9zbGFiXCIsXG4gIExhcGlzT3JlID0gXCJtaW5lY3JhZnQ6bGFwaXNfb3JlXCIsXG4gIExpZ2h0QmxvY2s5ID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfOVwiLFxuICBCZWVoaXZlID0gXCJtaW5lY3JhZnQ6YmVlaGl2ZVwiLFxuICBPeGlkaXplZEN1dENvcHBlclNsYWIgPSBcIm1pbmVjcmFmdDpveGlkaXplZF9jdXRfY29wcGVyX3NsYWJcIixcbiAgU2N1bGtTZW5zb3IgPSBcIm1pbmVjcmFmdDpzY3Vsa19zZW5zb3JcIixcbiAgQmFtYm9vU2xhYiA9IFwibWluZWNyYWZ0OmJhbWJvb19zbGFiXCIsXG4gIFBvaXNvbm91c1BvdGF0byA9IFwibWluZWNyYWZ0OnBvaXNvbm91c19wb3RhdG9cIixcbiAgUHJpc21hcmluZVNsYWIgPSBcIm1pbmVjcmFmdDpwcmlzbWFyaW5lX3NsYWJcIixcbiAgU2FuZHN0b25lU2xhYiA9IFwibWluZWNyYWZ0OnNhbmRzdG9uZV9zbGFiXCIsXG4gIFdvbGZBcm1vciA9IFwibWluZWNyYWZ0OndvbGZfYXJtb3JcIixcbiAgSGFyZE9yYW5nZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfb3JhbmdlX3N0YWluZWRfZ2xhc3NcIixcbiAgTGltZUNvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6bGltZV9jb25jcmV0ZV9wb3dkZXJcIixcbiAgR3JlZW5DYXJwZXQgPSBcIm1pbmVjcmFmdDpncmVlbl9jYXJwZXRcIixcbiAgU3BydWNlQnV0dG9uID0gXCJtaW5lY3JhZnQ6c3BydWNlX2J1dHRvblwiLFxuICBDaGVycnlQcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X3ByZXNzdXJlX3BsYXRlXCIsXG4gIEN1dFJlZFNhbmRzdG9uZVNsYWIgPSBcIm1pbmVjcmFmdDpjdXRfcmVkX3NhbmRzdG9uZV9zbGFiXCIsXG4gIERpb3JpdGVTbGFiID0gXCJtaW5lY3JhZnQ6ZGlvcml0ZV9zbGFiXCIsXG4gIE1lZGljaW5lID0gXCJtaW5lY3JhZnQ6bWVkaWNpbmVcIixcbiAgQW5kZXNpdGVTbGFiID0gXCJtaW5lY3JhZnQ6YW5kZXNpdGVfc2xhYlwiLFxuICBIb3JuQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpob3JuX2NvcmFsX2ZhblwiLFxuICBCcmlja1NsYWIgPSBcIm1pbmVjcmFmdDpicmlja19zbGFiXCIsXG4gIE5ldGhlckJyaWNrU2xhYiA9IFwibWluZWNyYWZ0Om5ldGhlcl9icmlja19zbGFiXCIsXG4gIERyaXBzdG9uZUJsb2NrID0gXCJtaW5lY3JhZnQ6ZHJpcHN0b25lX2Jsb2NrXCIsXG4gIEd1bnBvd2RlciA9IFwibWluZWNyYWZ0Omd1bnBvd2RlclwiLFxuICBQdXJwdXJTbGFiID0gXCJtaW5lY3JhZnQ6cHVycHVyX3NsYWJcIixcbiAgTWFnZW50YUNhcnBldCA9IFwibWluZWNyYWZ0Om1hZ2VudGFfY2FycGV0XCIsXG4gIEdsb3dCZXJyaWVzID0gXCJtaW5lY3JhZnQ6Z2xvd19iZXJyaWVzXCIsXG4gIEJyZWFkID0gXCJtaW5lY3JhZnQ6YnJlYWRcIixcbiAgV2VhdGhlcmVkQ3V0Q29wcGVyU2xhYiA9IFwibWluZWNyYWZ0OndlYXRoZXJlZF9jdXRfY29wcGVyX3NsYWJcIixcbiAgU3RvbmVTd29yZCA9IFwibWluZWNyYWZ0OnN0b25lX3N3b3JkXCIsXG4gIExlYXRoZXIgPSBcIm1pbmVjcmFmdDpsZWF0aGVyXCIsXG4gIE1hbmdyb3ZlUm9vdHMgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9yb290c1wiLFxuICBDb21tYW5kQmxvY2tNaW5lY2FydCA9IFwibWluZWNyYWZ0OmNvbW1hbmRfYmxvY2tfbWluZWNhcnRcIixcbiAgV2F4ZWRFeHBvc2VkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jdXRfY29wcGVyXCIsXG4gIFNwcnVjZUxlYXZlcyA9IFwibWluZWNyYWZ0OnNwcnVjZV9sZWF2ZXNcIixcbiAgU3RyaXBwZWRDaGVycnlMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9jaGVycnlfbG9nXCIsXG4gIERlZXBzbGF0ZVRpbGVTbGFiID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVfc2xhYlwiLFxuICBQb2xpc2hlZFR1ZmZTdGFpcnMgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF90dWZmX3N0YWlyc1wiLFxuICBHb2xkTnVnZ2V0ID0gXCJtaW5lY3JhZnQ6Z29sZF9udWdnZXRcIixcbiAgQ3JhY2tlZE5ldGhlckJyaWNrcyA9IFwibWluZWNyYWZ0OmNyYWNrZWRfbmV0aGVyX2JyaWNrc1wiLFxuICBCYXRTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmJhdF9zcGF3bl9lZ2dcIixcbiAgRG9ua2V5U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpkb25rZXlfc3Bhd25fZWdnXCIsXG4gIFJhYmJpdEhpZGUgPSBcIm1pbmVjcmFmdDpyYWJiaXRfaGlkZVwiLFxuICBSaWJBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6cmliX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgSW5mZXN0ZWRDb2JibGVzdG9uZSA9IFwibWluZWNyYWZ0OmluZmVzdGVkX2NvYmJsZXN0b25lXCIsXG4gIERhcmtQcmlzbWFyaW5lID0gXCJtaW5lY3JhZnQ6ZGFya19wcmlzbWFyaW5lXCIsXG4gIEhhcmRMaWdodEJsdWVTdGFpbmVkR2xhc3NQYW5lID0gXCJtaW5lY3JhZnQ6aGFyZF9saWdodF9ibHVlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBNb3NzeVN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tzXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tzXCIsXG4gIFRyb3BpY2FsRmlzaFNwYXduRWdnID0gXCJtaW5lY3JhZnQ6dHJvcGljYWxfZmlzaF9zcGF3bl9lZ2dcIixcbiAgTW9iU3Bhd25lciA9IFwibWluZWNyYWZ0Om1vYl9zcGF3bmVyXCIsXG4gIENvcHBlckdyYXRlID0gXCJtaW5lY3JhZnQ6Y29wcGVyX2dyYXRlXCIsXG4gIERlZXBzbGF0ZVRpbGVzID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVzXCIsXG4gIENyYWNrZWREZWVwc2xhdGVUaWxlcyA9IFwibWluZWNyYWZ0OmNyYWNrZWRfZGVlcHNsYXRlX3RpbGVzXCIsXG4gIE9yYW5nZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpvcmFuZ2VfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgQ2hpc2VsZWREZWVwc2xhdGUgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9kZWVwc2xhdGVcIixcbiAgRW1lcmFsZEJsb2NrID0gXCJtaW5lY3JhZnQ6ZW1lcmFsZF9ibG9ja1wiLFxuICBWZXhTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnZleF9zcGF3bl9lZ2dcIixcbiAgT2JzaWRpYW4gPSBcIm1pbmVjcmFmdDpvYnNpZGlhblwiLFxuICBLZWxwID0gXCJtaW5lY3JhZnQ6a2VscFwiLFxuICBNZWxvblNsaWNlID0gXCJtaW5lY3JhZnQ6bWVsb25fc2xpY2VcIixcbiAgQ2hpc2VsZWRSZWRTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpjaGlzZWxlZF9yZWRfc2FuZHN0b25lXCIsXG4gIERlYWRCdWJibGVDb3JhbCA9IFwibWluZWNyYWZ0OmRlYWRfYnViYmxlX2NvcmFsXCIsXG4gIERhcmtPYWtXb29kID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfd29vZFwiLFxuICBUdWZmQnJpY2tXYWxsID0gXCJtaW5lY3JhZnQ6dHVmZl9icmlja193YWxsXCIsXG4gIFF1YXJ0elBpbGxhciA9IFwibWluZWNyYWZ0OnF1YXJ0el9waWxsYXJcIixcbiAgUG9saXNoZWRUdWZmU2xhYiA9IFwibWluZWNyYWZ0OnBvbGlzaGVkX3R1ZmZfc2xhYlwiLFxuICBXYXhlZENvcHBlckRvb3IgPSBcIm1pbmVjcmFmdDp3YXhlZF9jb3BwZXJfZG9vclwiLFxuICBXYXhlZENvcHBlckdyYXRlID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY29wcGVyX2dyYXRlXCIsXG4gIERlYWRCcmFpbkNvcmFsID0gXCJtaW5lY3JhZnQ6ZGVhZF9icmFpbl9jb3JhbFwiLFxuICBTbW9vdGhCYXNhbHQgPSBcIm1pbmVjcmFmdDpzbW9vdGhfYmFzYWx0XCIsXG4gIFllbGxvd0dsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgSnVuZ2xlUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0Omp1bmdsZV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBDYXRTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmNhdF9zcGF3bl9lZ2dcIixcbiAgSG93bFBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0Omhvd2xfcG90dGVyeV9zaGVyZFwiLFxuICBXYXhlZEV4cG9zZWRDb3BwZXJEb29yID0gXCJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfZG9vclwiLFxuICBMaWdodEJsdWVUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV90ZXJyYWNvdHRhXCIsXG4gIFdheGVkV2VhdGhlcmVkQ3V0Q29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2N1dF9jb3BwZXJcIixcbiAgT2FrTG9nID0gXCJtaW5lY3JhZnQ6b2FrX2xvZ1wiLFxuICBEb2xwaGluU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpkb2xwaGluX3NwYXduX2VnZ1wiLFxuICBJbmZlc3RlZFN0b25lID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfc3RvbmVcIixcbiAgRXhwb3NlZENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6ZXhwb3NlZF9jaGlzZWxlZF9jb3BwZXJcIixcbiAgV2VhdGhlcmVkQ2hpc2VsZWRDb3BwZXIgPSBcIm1pbmVjcmFmdDp3ZWF0aGVyZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIENoZXJyeVNhcGxpbmcgPSBcIm1pbmVjcmFmdDpjaGVycnlfc2FwbGluZ1wiLFxuICBXYXhlZENoaXNlbGVkQ29wcGVyID0gXCJtaW5lY3JhZnQ6d2F4ZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIENvb2tlZFJhYmJpdCA9IFwibWluZWNyYWZ0OmNvb2tlZF9yYWJiaXRcIixcbiAgRmxpbnQgPSBcIm1pbmVjcmFmdDpmbGludFwiLFxuICBUcmlhbEtleSA9IFwibWluZWNyYWZ0OnRyaWFsX2tleVwiLFxuICBXYXhlZEV4cG9zZWRDaGlzZWxlZENvcHBlciA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY2hpc2VsZWRfY29wcGVyXCIsXG4gIEVuZGVyQ2hlc3QgPSBcIm1pbmVjcmFmdDplbmRlcl9jaGVzdFwiLFxuICBEZWVwc2xhdGVDb2FsT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2NvYWxfb3JlXCIsXG4gIE94aWRpemVkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0Om94aWRpemVkX2NvcHBlcl9idWxiXCIsXG4gIERyYWdvbkVnZyA9IFwibWluZWNyYWZ0OmRyYWdvbl9lZ2dcIixcbiAgV2F4ZWRFeHBvc2VkQ29wcGVyQnVsYiA9IFwibWluZWNyYWZ0OndheGVkX2V4cG9zZWRfY29wcGVyX2J1bGJcIixcbiAgUGlua1BldGFscyA9IFwibWluZWNyYWZ0OnBpbmtfcGV0YWxzXCIsXG4gIEJlZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6YmVlX3NwYXduX2VnZ1wiLFxuICBCcmFpbkNvcmFsID0gXCJtaW5lY3JhZnQ6YnJhaW5fY29yYWxcIixcbiAgRGlzcGVuc2VyID0gXCJtaW5lY3JhZnQ6ZGlzcGVuc2VyXCIsXG4gIFJhd0lyb25CbG9jayA9IFwibWluZWNyYWZ0OnJhd19pcm9uX2Jsb2NrXCIsXG4gIENyaW1zb25Sb290cyA9IFwibWluZWNyYWZ0OmNyaW1zb25fcm9vdHNcIixcbiAgU3BydWNlV29vZCA9IFwibWluZWNyYWZ0OnNwcnVjZV93b29kXCIsXG4gIFRhZHBvbGVTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnRhZHBvbGVfc3Bhd25fZWdnXCIsXG4gIFR1cnRsZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6dHVydGxlX3NwYXduX2VnZ1wiLFxuICBIb25leWNvbWJCbG9jayA9IFwibWluZWNyYWZ0OmhvbmV5Y29tYl9ibG9ja1wiLFxuICBKdW5nbGVTYXBsaW5nID0gXCJtaW5lY3JhZnQ6anVuZ2xlX3NhcGxpbmdcIixcbiAgRW5kZXJFeWUgPSBcIm1pbmVjcmFmdDplbmRlcl9leWVcIixcbiAgTmV0aGVyQnJpY2sgPSBcIm1pbmVjcmFmdDpuZXRoZXJfYnJpY2tcIixcbiAgQ2hlcnJ5QnV0dG9uID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2J1dHRvblwiLFxuICBMb2Rlc3RvbmUgPSBcIm1pbmVjcmFmdDpsb2Rlc3RvbmVcIixcbiAgR3JheVdvb2wgPSBcIm1pbmVjcmFmdDpncmF5X3dvb2xcIixcbiAgU3RvbmVTaG92ZWwgPSBcIm1pbmVjcmFmdDpzdG9uZV9zaG92ZWxcIixcbiAgQmxhY2tXb29sID0gXCJtaW5lY3JhZnQ6YmxhY2tfd29vbFwiLFxuICBTdHJpcHBlZEJpcmNoTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYmlyY2hfbG9nXCIsXG4gIFBvdGF0byA9IFwibWluZWNyYWZ0OnBvdGF0b1wiLFxuICBPcmFuZ2VXb29sID0gXCJtaW5lY3JhZnQ6b3JhbmdlX3dvb2xcIixcbiAgWWVsbG93V29vbCA9IFwibWluZWNyYWZ0OnllbGxvd193b29sXCIsXG4gIExpbWVXb29sID0gXCJtaW5lY3JhZnQ6bGltZV93b29sXCIsXG4gIFNrdWxsUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6c2t1bGxfcG90dGVyeV9zaGVyZFwiLFxuICBHcmVlbldvb2wgPSBcIm1pbmVjcmFmdDpncmVlbl93b29sXCIsXG4gIE1hZ2VudGFUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6bWFnZW50YV90ZXJyYWNvdHRhXCIsXG4gIEJsYWNrQ2FycGV0ID0gXCJtaW5lY3JhZnQ6YmxhY2tfY2FycGV0XCIsXG4gIEJsdWVXb29sID0gXCJtaW5lY3JhZnQ6Ymx1ZV93b29sXCIsXG4gIEhhcmRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2dsYXNzX3BhbmVcIixcbiAgR3JheUR5ZSA9IFwibWluZWNyYWZ0OmdyYXlfZHllXCIsXG4gIEp1a2Vib3ggPSBcIm1pbmVjcmFmdDpqdWtlYm94XCIsXG4gIFNoaWVsZCA9IFwibWluZWNyYWZ0OnNoaWVsZFwiLFxuICBIYXJkQmxhY2tTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2JsYWNrX3N0YWluZWRfZ2xhc3NcIixcbiAgWWVsbG93Q2FycGV0ID0gXCJtaW5lY3JhZnQ6eWVsbG93X2NhcnBldFwiLFxuICBMaW1lQ2FycGV0ID0gXCJtaW5lY3JhZnQ6bGltZV9jYXJwZXRcIixcbiAgR29sZGVuU3dvcmQgPSBcIm1pbmVjcmFmdDpnb2xkZW5fc3dvcmRcIixcbiAgU3VuZmxvd2VyID0gXCJtaW5lY3JhZnQ6c3VuZmxvd2VyXCIsXG4gIE11c2ljRGlzY0ZhciA9IFwibWluZWNyYWZ0Om11c2ljX2Rpc2NfZmFyXCIsXG4gIEJsdWVDYXJwZXQgPSBcIm1pbmVjcmFmdDpibHVlX2NhcnBldFwiLFxuICBMaWdodEdyYXlDb25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmxpZ2h0X2dyYXlfY29uY3JldGVfcG93ZGVyXCIsXG4gIFJlZENvbmNyZXRlUG93ZGVyID0gXCJtaW5lY3JhZnQ6cmVkX2NvbmNyZXRlX3Bvd2RlclwiLFxuICBEYXJrT2FrTGVhdmVzID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfbGVhdmVzXCIsXG4gIEJyYWluQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpicmFpbl9jb3JhbF9mYW5cIixcbiAgRWx5dHJhID0gXCJtaW5lY3JhZnQ6ZWx5dHJhXCIsXG4gIEN5YW5Db25jcmV0ZVBvd2RlciA9IFwibWluZWNyYWZ0OmN5YW5fY29uY3JldGVfcG93ZGVyXCIsXG4gIFllbGxvd0NvbmNyZXRlID0gXCJtaW5lY3JhZnQ6eWVsbG93X2NvbmNyZXRlXCIsXG4gIE5ldGhlcml0ZUNoZXN0cGxhdGUgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfY2hlc3RwbGF0ZVwiLFxuICBEZWFkVHViZUNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpkZWFkX3R1YmVfY29yYWxfYmxvY2tcIixcbiAgSGFyZExpZ2h0R3JheVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2xpZ2h0X2dyYXlfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFJlZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpyZWRfdGVycmFjb3R0YVwiLFxuICBPcmFuZ2VUZXJyYWNvdHRhID0gXCJtaW5lY3JhZnQ6b3JhbmdlX3RlcnJhY290dGFcIixcbiAgTGltZVRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpsaW1lX3RlcnJhY290dGFcIixcbiAgVHdpc3RpbmdWaW5lcyA9IFwibWluZWNyYWZ0OnR3aXN0aW5nX3ZpbmVzXCIsXG4gIENvbW1hbmRCbG9jayA9IFwibWluZWNyYWZ0OmNvbW1hbmRfYmxvY2tcIixcbiAgQ3lhblRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpjeWFuX3RlcnJhY290dGFcIixcbiAgU3RvbmVBeGUgPSBcIm1pbmVjcmFmdDpzdG9uZV9heGVcIixcbiAgRGFuZGVsaW9uID0gXCJtaW5lY3JhZnQ6ZGFuZGVsaW9uXCIsXG4gIFdhcnBlZE55bGl1bSA9IFwibWluZWNyYWZ0OndhcnBlZF9ueWxpdW1cIixcbiAgSG9ybkNvcmFsQmxvY2sgPSBcIm1pbmVjcmFmdDpob3JuX2NvcmFsX2Jsb2NrXCIsXG4gIFdoaXRlR2xhemVkVGVycmFjb3R0YSA9IFwibWluZWNyYWZ0OndoaXRlX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIFJlZEdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpyZWRfZ2xhemVkX3RlcnJhY290dGFcIixcbiAgQmx1ZUdsYXplZFRlcnJhY290dGEgPSBcIm1pbmVjcmFmdDpibHVlX2dsYXplZF90ZXJyYWNvdHRhXCIsXG4gIEJvZ2dlZFNwYXduRWdnID0gXCJtaW5lY3JhZnQ6Ym9nZ2VkX3NwYXduX2VnZ1wiLFxuICBCcmljayA9IFwibWluZWNyYWZ0OmJyaWNrXCIsXG4gIExhcmdlQW1ldGh5c3RCdWQgPSBcIm1pbmVjcmFmdDpsYXJnZV9hbWV0aHlzdF9idWRcIixcbiAgQ2FydG9ncmFwaHlUYWJsZSA9IFwibWluZWNyYWZ0OmNhcnRvZ3JhcGh5X3RhYmxlXCIsXG4gIFdheWZpbmRlckFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDp3YXlmaW5kZXJfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBCbHVlQ2FuZGxlID0gXCJtaW5lY3JhZnQ6Ymx1ZV9jYW5kbGVcIixcbiAgUG9saXNoZWRCYXNhbHQgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9iYXNhbHRcIixcbiAgR3Jhc3NQYXRoID0gXCJtaW5lY3JhZnQ6Z3Jhc3NfcGF0aFwiLFxuICBDb2xvcmVkVG9yY2hSZyA9IFwibWluZWNyYWZ0OmNvbG9yZWRfdG9yY2hfcmdcIixcbiAgQ3JpbXNvblN0ZW0gPSBcIm1pbmVjcmFmdDpjcmltc29uX3N0ZW1cIixcbiAgU3RyaXBwZWRTcHJ1Y2VMb2cgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF9zcHJ1Y2VfbG9nXCIsXG4gIE9yYW5nZVR1bGlwID0gXCJtaW5lY3JhZnQ6b3JhbmdlX3R1bGlwXCIsXG4gIERpYW1vbmRPcmUgPSBcIm1pbmVjcmFmdDpkaWFtb25kX29yZVwiLFxuICBDYXZlU3BpZGVyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpjYXZlX3NwaWRlcl9zcGF3bl9lZ2dcIixcbiAgQnViYmxlQ29yYWwgPSBcIm1pbmVjcmFmdDpidWJibGVfY29yYWxcIixcbiAgQ29hbE9yZSA9IFwibWluZWNyYWZ0OmNvYWxfb3JlXCIsXG4gIEVtcHR5TWFwID0gXCJtaW5lY3JhZnQ6ZW1wdHlfbWFwXCIsXG4gIEp1bmdsZUJvYXQgPSBcIm1pbmVjcmFmdDpqdW5nbGVfYm9hdFwiLFxuICBQb3BweSA9IFwibWluZWNyYWZ0OnBvcHB5XCIsXG4gIFNodWxrZXJTaGVsbCA9IFwibWluZWNyYWZ0OnNodWxrZXJfc2hlbGxcIixcbiAgRGVlcHNsYXRlSXJvbk9yZSA9IFwibWluZWNyYWZ0OmRlZXBzbGF0ZV9pcm9uX29yZVwiLFxuICBEZWVwc2xhdGVHb2xkT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2dvbGRfb3JlXCIsXG4gIERlZXBzbGF0ZUxhcGlzT3JlID0gXCJtaW5lY3JhZnQ6ZGVlcHNsYXRlX2xhcGlzX29yZVwiLFxuICBHcmFuaXRlID0gXCJtaW5lY3JhZnQ6Z3Jhbml0ZVwiLFxuICBQZXRyaWZpZWRPYWtTbGFiID0gXCJtaW5lY3JhZnQ6cGV0cmlmaWVkX29ha19zbGFiXCIsXG4gIE5ldGhlcml0ZUxlZ2dpbmdzID0gXCJtaW5lY3JhZnQ6bmV0aGVyaXRlX2xlZ2dpbmdzXCIsXG4gIFN0cmlwcGVkQWNhY2lhTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfYWNhY2lhX2xvZ1wiLFxuICBMaWdodEJsb2NrMSA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzFcIixcbiAgU3BydWNlTG9nID0gXCJtaW5lY3JhZnQ6c3BydWNlX2xvZ1wiLFxuICBDaGVzdE1pbmVjYXJ0ID0gXCJtaW5lY3JhZnQ6Y2hlc3RfbWluZWNhcnRcIixcbiAgQWNhY2lhTG9nID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2xvZ1wiLFxuICBXYXJwZWRIeXBoYWUgPSBcIm1pbmVjcmFmdDp3YXJwZWRfaHlwaGFlXCIsXG4gIE94ZXllRGFpc3kgPSBcIm1pbmVjcmFmdDpveGV5ZV9kYWlzeVwiLFxuICBQaXRjaGVyUGxhbnQgPSBcIm1pbmVjcmFmdDpwaXRjaGVyX3BsYW50XCIsXG4gIE1hbmdyb3ZlU2lnbiA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX3NpZ25cIixcbiAgTWFnbWFDdWJlU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDptYWdtYV9jdWJlX3NwYXduX2VnZ1wiLFxuICBNYW5ncm92ZVdvb2QgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV93b29kXCIsXG4gIFpvbWJpZVBpZ21hblNwYXduRWdnID0gXCJtaW5lY3JhZnQ6em9tYmllX3BpZ21hbl9zcGF3bl9lZ2dcIixcbiAgUG9saXNoZWRUdWZmID0gXCJtaW5lY3JhZnQ6cG9saXNoZWRfdHVmZlwiLFxuICBTdHJpcHBlZE1hbmdyb3ZlTG9nID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfbWFuZ3JvdmVfbG9nXCIsXG4gIENoZXJyeUxvZyA9IFwibWluZWNyYWZ0OmNoZXJyeV9sb2dcIixcbiAgRGVhZEZpcmVDb3JhbEZhbiA9IFwibWluZWNyYWZ0OmRlYWRfZmlyZV9jb3JhbF9mYW5cIixcbiAgSXJvbkxlZ2dpbmdzID0gXCJtaW5lY3JhZnQ6aXJvbl9sZWdnaW5nc1wiLFxuICBQdWZmZXJmaXNoID0gXCJtaW5lY3JhZnQ6cHVmZmVyZmlzaFwiLFxuICBBbWV0aHlzdFNoYXJkID0gXCJtaW5lY3JhZnQ6YW1ldGh5c3Rfc2hhcmRcIixcbiAgU3RyaXBwZWREYXJrT2FrV29vZCA9IFwibWluZWNyYWZ0OnN0cmlwcGVkX2Rhcmtfb2FrX3dvb2RcIixcbiAgU3RyaXBwZWRDaGVycnlXb29kID0gXCJtaW5lY3JhZnQ6c3RyaXBwZWRfY2hlcnJ5X3dvb2RcIixcbiAgU3RyaXBwZWRXYXJwZWRIeXBoYWUgPSBcIm1pbmVjcmFmdDpzdHJpcHBlZF93YXJwZWRfaHlwaGFlXCIsXG4gIEJhcnJpZXIgPSBcIm1pbmVjcmFmdDpiYXJyaWVyXCIsXG4gIEFjYWNpYUxlYXZlcyA9IFwibWluZWNyYWZ0OmFjYWNpYV9sZWF2ZXNcIixcbiAgTWFuZ3JvdmVQcm9wYWd1bGUgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9wcm9wYWd1bGVcIixcbiAgU3RpY2t5UGlzdG9uID0gXCJtaW5lY3JhZnQ6c3RpY2t5X3Bpc3RvblwiLFxuICBPYWtTYXBsaW5nID0gXCJtaW5lY3JhZnQ6b2FrX3NhcGxpbmdcIixcbiAgV2hpdGVUdWxpcCA9IFwibWluZWNyYWZ0OndoaXRlX3R1bGlwXCIsXG4gIERhcmtPYWtTYXBsaW5nID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfc2FwbGluZ1wiLFxuICBTdXNwaWNpb3VzU3RldyA9IFwibWluZWNyYWZ0OnN1c3BpY2lvdXNfc3Rld1wiLFxuICBCZWVOZXN0ID0gXCJtaW5lY3JhZnQ6YmVlX25lc3RcIixcbiAgVGFkcG9sZUJ1Y2tldCA9IFwibWluZWNyYWZ0OnRhZHBvbGVfYnVja2V0XCIsXG4gIFdoZWF0U2VlZHMgPSBcIm1pbmVjcmFmdDp3aGVhdF9zZWVkc1wiLFxuICBNZWxvblNlZWRzID0gXCJtaW5lY3JhZnQ6bWVsb25fc2VlZHNcIixcbiAgU291bFNhbmQgPSBcIm1pbmVjcmFmdDpzb3VsX3NhbmRcIixcbiAgU3VnYXIgPSBcIm1pbmVjcmFmdDpzdWdhclwiLFxuICBTcHJ1Y2VDaGVzdEJvYXQgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfY2hlc3RfYm9hdFwiLFxuICBDaGVycnlCb2F0ID0gXCJtaW5lY3JhZnQ6Y2hlcnJ5X2JvYXRcIixcbiAgTWFuZ3JvdmVDaGVzdEJvYXQgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9jaGVzdF9ib2F0XCIsXG4gIENvb2tlZENvZCA9IFwibWluZWNyYWZ0OmNvb2tlZF9jb2RcIixcbiAgU21hbGxBbWV0aHlzdEJ1ZCA9IFwibWluZWNyYWZ0OnNtYWxsX2FtZXRoeXN0X2J1ZFwiLFxuICBBcHBsZSA9IFwibWluZWNyYWZ0OmFwcGxlXCIsXG4gIFN3ZWV0QmVycmllcyA9IFwibWluZWNyYWZ0OnN3ZWV0X2JlcnJpZXNcIixcbiAgTGFyZ2VGZXJuID0gXCJtaW5lY3JhZnQ6bGFyZ2VfZmVyblwiLFxuICBUYWxsR3Jhc3MgPSBcIm1pbmVjcmFmdDp0YWxsX2dyYXNzXCIsXG4gIFB1ZmZlcmZpc2hTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnB1ZmZlcmZpc2hfc3Bhd25fZWdnXCIsXG4gIExlYXRoZXJMZWdnaW5ncyA9IFwibWluZWNyYWZ0OmxlYXRoZXJfbGVnZ2luZ3NcIixcbiAgQnViYmxlQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpidWJibGVfY29yYWxfZmFuXCIsXG4gIEZpcmVDb3JhbCA9IFwibWluZWNyYWZ0OmZpcmVfY29yYWxcIixcbiAgRGVhZEZpcmVDb3JhbCA9IFwibWluZWNyYWZ0OmRlYWRfZmlyZV9jb3JhbFwiLFxuICBDcnlpbmdPYnNpZGlhbiA9IFwibWluZWNyYWZ0OmNyeWluZ19vYnNpZGlhblwiLFxuICBMaWxhYyA9IFwibWluZWNyYWZ0OmxpbGFjXCIsXG4gIERlYWRUdWJlQ29yYWwgPSBcIm1pbmVjcmFmdDpkZWFkX3R1YmVfY29yYWxcIixcbiAgRGVhZEJyYWluQ29yYWxGYW4gPSBcIm1pbmVjcmFmdDpkZWFkX2JyYWluX2NvcmFsX2ZhblwiLFxuICBEZWFkVHViZUNvcmFsRmFuID0gXCJtaW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFsX2ZhblwiLFxuICBMaW5nZXJpbmdQb3Rpb24gPSBcIm1pbmVjcmFmdDpsaW5nZXJpbmdfcG90aW9uXCIsXG4gIEF6dXJlQmx1ZXQgPSBcIm1pbmVjcmFmdDphenVyZV9ibHVldFwiLFxuICBZZWxsb3dEeWUgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfZHllXCIsXG4gIFdhbmRlcmluZ1RyYWRlclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6d2FuZGVyaW5nX3RyYWRlcl9zcGF3bl9lZ2dcIixcbiAgRGVhZEJyYWluQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmRlYWRfYnJhaW5fY29yYWxfYmxvY2tcIixcbiAgV2VlcGluZ1ZpbmVzID0gXCJtaW5lY3JhZnQ6d2VlcGluZ192aW5lc1wiLFxuICBXYXRlcmxpbHkgPSBcIm1pbmVjcmFmdDp3YXRlcmxpbHlcIixcbiAgTGlnaHRCbHVlQ2FuZGxlID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jYW5kbGVcIixcbiAgU2VhZ3Jhc3MgPSBcIm1pbmVjcmFmdDpzZWFncmFzc1wiLFxuICBEaWFtb25kUGlja2F4ZSA9IFwibWluZWNyYWZ0OmRpYW1vbmRfcGlja2F4ZVwiLFxuICBEZWFkYnVzaCA9IFwibWluZWNyYWZ0OmRlYWRidXNoXCIsXG4gIEp1bmdsZUJ1dHRvbiA9IFwibWluZWNyYWZ0Omp1bmdsZV9idXR0b25cIixcbiAgSWNlID0gXCJtaW5lY3JhZnQ6aWNlXCIsXG4gIEN5YW5TaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6Y3lhbl9zaHVsa2VyX2JveFwiLFxuICBIYXJkUGlua1N0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX3Bpbmtfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFNub3dMYXllciA9IFwibWluZWNyYWZ0OnNub3dfbGF5ZXJcIixcbiAgTGlnaHRCbG9jazAgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18wXCIsXG4gIERhcmtPYWtCb2F0ID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfYm9hdFwiLFxuICBEaXJ0V2l0aFJvb3RzID0gXCJtaW5lY3JhZnQ6ZGlydF93aXRoX3Jvb3RzXCIsXG4gIE11ZGR5TWFuZ3JvdmVSb290cyA9IFwibWluZWNyYWZ0Om11ZGR5X21hbmdyb3ZlX3Jvb3RzXCIsXG4gIFRyb3BpY2FsRmlzaCA9IFwibWluZWNyYWZ0OnRyb3BpY2FsX2Zpc2hcIixcbiAgU3BvcmVCbG9zc29tID0gXCJtaW5lY3JhZnQ6c3BvcmVfYmxvc3NvbVwiLFxuICBIYXJkWWVsbG93U3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF95ZWxsb3dfc3RhaW5lZF9nbGFzc1wiLFxuICBBbWV0aHlzdENsdXN0ZXIgPSBcIm1pbmVjcmFmdDphbWV0aHlzdF9jbHVzdGVyXCIsXG4gIE1lZGl1bUFtZXRoeXN0QnVkID0gXCJtaW5lY3JhZnQ6bWVkaXVtX2FtZXRoeXN0X2J1ZFwiLFxuICBXb29kZW5QcmVzc3VyZVBsYXRlID0gXCJtaW5lY3JhZnQ6d29vZGVuX3ByZXNzdXJlX3BsYXRlXCIsXG4gIEh1c2tTcGF3bkVnZyA9IFwibWluZWNyYWZ0Omh1c2tfc3Bhd25fZWdnXCIsXG4gIElyb25Td29yZCA9IFwibWluZWNyYWZ0Omlyb25fc3dvcmRcIixcbiAgVHVmZlNsYWIgPSBcIm1pbmVjcmFmdDp0dWZmX3NsYWJcIixcbiAgQ2hpc2VsZWRUdWZmID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfdHVmZlwiLFxuICBKdW5nbGVDaGVzdEJvYXQgPSBcIm1pbmVjcmFmdDpqdW5nbGVfY2hlc3RfYm9hdFwiLFxuICBUdWZmQnJpY2tzID0gXCJtaW5lY3JhZnQ6dHVmZl9icmlja3NcIixcbiAgQ2hpc2VsZWRUdWZmQnJpY2tzID0gXCJtaW5lY3JhZnQ6Y2hpc2VsZWRfdHVmZl9icmlja3NcIixcbiAgQ2hpY2tlbiA9IFwibWluZWNyYWZ0OmNoaWNrZW5cIixcbiAgU3RvbmVIb2UgPSBcIm1pbmVjcmFmdDpzdG9uZV9ob2VcIixcbiAgQmVlZiA9IFwibWluZWNyYWZ0OmJlZWZcIixcbiAgQXJtYWRpbGxvU2N1dGUgPSBcIm1pbmVjcmFmdDphcm1hZGlsbG9fc2N1dGVcIixcbiAgQ2hhaW5tYWlsQm9vdHMgPSBcIm1pbmVjcmFmdDpjaGFpbm1haWxfYm9vdHNcIixcbiAgTXV0dG9uID0gXCJtaW5lY3JhZnQ6bXV0dG9uXCIsXG4gIFJhYmJpdCA9IFwibWluZWNyYWZ0OnJhYmJpdFwiLFxuICBEaWFtb25kSG9yc2VBcm1vciA9IFwibWluZWNyYWZ0OmRpYW1vbmRfaG9yc2VfYXJtb3JcIixcbiAgU2FsbW9uID0gXCJtaW5lY3JhZnQ6c2FsbW9uXCIsXG4gIEJvbHRBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6Ym9sdF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlXCIsXG4gIEJyb3duTXVzaHJvb20gPSBcIm1pbmVjcmFmdDpicm93bl9tdXNocm9vbVwiLFxuICBSZWRNdXNocm9vbSA9IFwibWluZWNyYWZ0OnJlZF9tdXNocm9vbVwiLFxuICBCcm93bk11c2hyb29tQmxvY2sgPSBcIm1pbmVjcmFmdDpicm93bl9tdXNocm9vbV9ibG9ja1wiLFxuICBXZWIgPSBcIm1pbmVjcmFmdDp3ZWJcIixcbiAgRW5kUG9ydGFsRnJhbWUgPSBcIm1pbmVjcmFmdDplbmRfcG9ydGFsX2ZyYW1lXCIsXG4gIEFybW9yU3RhbmQgPSBcIm1pbmVjcmFmdDphcm1vcl9zdGFuZFwiLFxuICBJbmZlc3RlZFN0b25lQnJpY2tzID0gXCJtaW5lY3JhZnQ6aW5mZXN0ZWRfc3RvbmVfYnJpY2tzXCIsXG4gIEluZmVzdGVkTW9zc3lTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OmluZmVzdGVkX21vc3N5X3N0b25lX2JyaWNrc1wiLFxuICBJbmZlc3RlZENyYWNrZWRTdG9uZUJyaWNrcyA9IFwibWluZWNyYWZ0OmluZmVzdGVkX2NyYWNrZWRfc3RvbmVfYnJpY2tzXCIsXG4gIFNuaWZmZXJFZ2cgPSBcIm1pbmVjcmFmdDpzbmlmZmVyX2VnZ1wiLFxuICBDaGFpbm1haWxMZWdnaW5ncyA9IFwibWluZWNyYWZ0OmNoYWlubWFpbF9sZWdnaW5nc1wiLFxuICBDaGlja2VuU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpjaGlja2VuX3NwYXduX2VnZ1wiLFxuICBPY2Vsb3RTcGF3bkVnZyA9IFwibWluZWNyYWZ0Om9jZWxvdF9zcGF3bl9lZ2dcIixcbiAgUmVpbmZvcmNlZERlZXBzbGF0ZSA9IFwibWluZWNyYWZ0OnJlaW5mb3JjZWRfZGVlcHNsYXRlXCIsXG4gIE1vb3Nocm9vbVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6bW9vc2hyb29tX3NwYXduX2VnZ1wiLFxuICBQYXJyb3RTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnBhcnJvdF9zcGF3bl9lZ2dcIixcbiAgTXVsZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6bXVsZV9zcGF3bl9lZ2dcIixcbiAgSGFyZE9yYW5nZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX29yYW5nZV9zdGFpbmVkX2dsYXNzX3BhbmVcIixcbiAgWm9tYmllSG9yc2VTcGF3bkVnZyA9IFwibWluZWNyYWZ0OnpvbWJpZV9ob3JzZV9zcGF3bl9lZ2dcIixcbiAgRW5kZXJtYW5TcGF3bkVnZyA9IFwibWluZWNyYWZ0OmVuZGVybWFuX3NwYXduX2VnZ1wiLFxuICBTaWx2ZXJmaXNoU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpzaWx2ZXJmaXNoX3NwYXduX2VnZ1wiLFxuICBXaXRoZXJTa2VsZXRvblNwYXduRWdnID0gXCJtaW5lY3JhZnQ6d2l0aGVyX3NrZWxldG9uX3NwYXduX2VnZ1wiLFxuICBDb29rZWRQb3JrY2hvcCA9IFwibWluZWNyYWZ0OmNvb2tlZF9wb3JrY2hvcFwiLFxuICBNdXNpY0Rpc2NPdGhlcnNpZGUgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX290aGVyc2lkZVwiLFxuICBMZWF0aGVyQm9vdHMgPSBcIm1pbmVjcmFmdDpsZWF0aGVyX2Jvb3RzXCIsXG4gIFNwaWRlclNwYXduRWdnID0gXCJtaW5lY3JhZnQ6c3BpZGVyX3NwYXduX2VnZ1wiLFxuICBTY3VsayA9IFwibWluZWNyYWZ0OnNjdWxrXCIsXG4gIFpvbWJpZVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6em9tYmllX3NwYXduX2VnZ1wiLFxuICBNdXNpY0Rpc2NQcmVjaXBpY2UgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX3ByZWNpcGljZVwiLFxuICBXaXRjaFNwYXduRWdnID0gXCJtaW5lY3JhZnQ6d2l0Y2hfc3Bhd25fZWdnXCIsXG4gIEd1YXJkaWFuU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpndWFyZGlhbl9zcGF3bl9lZ2dcIixcbiAgRGFtYWdlZEFudmlsID0gXCJtaW5lY3JhZnQ6ZGFtYWdlZF9hbnZpbFwiLFxuICBQaWdsaW5TcGF3bkVnZyA9IFwibWluZWNyYWZ0OnBpZ2xpbl9zcGF3bl9lZ2dcIixcbiAgWm9nbGluU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDp6b2dsaW5fc3Bhd25fZWdnXCIsXG4gIExvb20gPSBcIm1pbmVjcmFmdDpsb29tXCIsXG4gIEF4b2xvdGxTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmF4b2xvdGxfc3Bhd25fZWdnXCIsXG4gIEFsbGF5U3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDphbGxheV9zcGF3bl9lZ2dcIixcbiAgTmV0aGVyaXRlQXhlID0gXCJtaW5lY3JhZnQ6bmV0aGVyaXRlX2F4ZVwiLFxuICBWaW5kaWNhdG9yU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDp2aW5kaWNhdG9yX3NwYXduX2VnZ1wiLFxuICBFdm9rZXJTcGF3bkVnZyA9IFwibWluZWNyYWZ0OmV2b2tlcl9zcGF3bl9lZ2dcIixcbiAgUGhhbnRvbVNwYXduRWdnID0gXCJtaW5lY3JhZnQ6cGhhbnRvbV9zcGF3bl9lZ2dcIixcbiAgU25vd0dvbGVtU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpzbm93X2dvbGVtX3NwYXduX2VnZ1wiLFxuICBTbmlmZmVyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDpzbmlmZmVyX3NwYXduX2VnZ1wiLFxuICBBcm1hZGlsbG9TcGF3bkVnZyA9IFwibWluZWNyYWZ0OmFybWFkaWxsb19zcGF3bl9lZ2dcIixcbiAgTXVzaWNEaXNjMTMgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjXzEzXCIsXG4gIEJlZHJvY2sgPSBcIm1pbmVjcmFmdDpiZWRyb2NrXCIsXG4gIERpcnQgPSBcIm1pbmVjcmFmdDpkaXJ0XCIsXG4gIE1hZ21hID0gXCJtaW5lY3JhZnQ6bWFnbWFcIixcbiAgRW5kU3RvbmUgPSBcIm1pbmVjcmFmdDplbmRfc3RvbmVcIixcbiAgQ2hvcnVzRnJ1aXQgPSBcIm1pbmVjcmFmdDpjaG9ydXNfZnJ1aXRcIixcbiAgQnJhaW5Db3JhbEJsb2NrID0gXCJtaW5lY3JhZnQ6YnJhaW5fY29yYWxfYmxvY2tcIixcbiAgQnViYmxlQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmJ1YmJsZV9jb3JhbF9ibG9ja1wiLFxuICBEZWFkQnViYmxlQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmRlYWRfYnViYmxlX2NvcmFsX2Jsb2NrXCIsXG4gIERlYWRGaXJlQ29yYWxCbG9jayA9IFwibWluZWNyYWZ0OmRlYWRfZmlyZV9jb3JhbF9ibG9ja1wiLFxuICBJcm9uSGVsbWV0ID0gXCJtaW5lY3JhZnQ6aXJvbl9oZWxtZXRcIixcbiAgR29sZGVuSGVsbWV0ID0gXCJtaW5lY3JhZnQ6Z29sZGVuX2hlbG1ldFwiLFxuICBMZWF0aGVyQ2hlc3RwbGF0ZSA9IFwibWluZWNyYWZ0OmxlYXRoZXJfY2hlc3RwbGF0ZVwiLFxuICBHb2xkZW5DaGVzdHBsYXRlID0gXCJtaW5lY3JhZnQ6Z29sZGVuX2NoZXN0cGxhdGVcIixcbiAgTWFuZ3JvdmVIYW5naW5nU2lnbiA9IFwibWluZWNyYWZ0Om1hbmdyb3ZlX2hhbmdpbmdfc2lnblwiLFxuICBEaWFtb25kTGVnZ2luZ3MgPSBcIm1pbmVjcmFmdDpkaWFtb25kX2xlZ2dpbmdzXCIsXG4gIFdvb2RlbkJ1dHRvbiA9IFwibWluZWNyYWZ0Ondvb2Rlbl9idXR0b25cIixcbiAgR29sZGVuQm9vdHMgPSBcIm1pbmVjcmFmdDpnb2xkZW5fYm9vdHNcIixcbiAgV29vZGVuU3dvcmQgPSBcIm1pbmVjcmFmdDp3b29kZW5fc3dvcmRcIixcbiAgRGlhbW9uZEF4ZSA9IFwibWluZWNyYWZ0OmRpYW1vbmRfYXhlXCIsXG4gIFN0b25lUGlja2F4ZSA9IFwibWluZWNyYWZ0OnN0b25lX3BpY2theGVcIixcbiAgSXJvblBpY2theGUgPSBcIm1pbmVjcmFmdDppcm9uX3BpY2theGVcIixcbiAgQmFtYm9vU2lnbiA9IFwibWluZWNyYWZ0OmJhbWJvb19zaWduXCIsXG4gIFBpbmtDYW5kbGUgPSBcIm1pbmVjcmFmdDpwaW5rX2NhbmRsZVwiLFxuICBHb2xkZW5TaG92ZWwgPSBcIm1pbmVjcmFmdDpnb2xkZW5fc2hvdmVsXCIsXG4gIERpYW1vbmRTaG92ZWwgPSBcIm1pbmVjcmFmdDpkaWFtb25kX3Nob3ZlbFwiLFxuICBOZXRoZXJpdGVTaG92ZWwgPSBcIm1pbmVjcmFmdDpuZXRoZXJpdGVfc2hvdmVsXCIsXG4gIEdvbGRlbkhvZSA9IFwibWluZWNyYWZ0OmdvbGRlbl9ob2VcIixcbiAgRGlhbW9uZEhvZSA9IFwibWluZWNyYWZ0OmRpYW1vbmRfaG9lXCIsXG4gIEJyb3duU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OmJyb3duX3NodWxrZXJfYm94XCIsXG4gIENvb2tlZENoaWNrZW4gPSBcIm1pbmVjcmFmdDpjb29rZWRfY2hpY2tlblwiLFxuICBQdW1wa2luUGllID0gXCJtaW5lY3JhZnQ6cHVtcGtpbl9waWVcIixcbiAgV2FycGVkRnVuZ3VzT25BU3RpY2sgPSBcIm1pbmVjcmFmdDp3YXJwZWRfZnVuZ3VzX29uX2Ffc3RpY2tcIixcbiAgU25vd2JhbGwgPSBcIm1pbmVjcmFmdDpzbm93YmFsbFwiLFxuICBMZWF0aGVySG9yc2VBcm1vciA9IFwibWluZWNyYWZ0OmxlYXRoZXJfaG9yc2VfYXJtb3JcIixcbiAgVHVydGxlSGVsbWV0ID0gXCJtaW5lY3JhZnQ6dHVydGxlX2hlbG1ldFwiLFxuICBUb3RlbU9mVW5keWluZyA9IFwibWluZWNyYWZ0OnRvdGVtX29mX3VuZHlpbmdcIixcbiAgRXhwZXJpZW5jZUJvdHRsZSA9IFwibWluZWNyYWZ0OmV4cGVyaWVuY2VfYm90dGxlXCIsXG4gIFBvdGlvbiA9IFwibWluZWNyYWZ0OnBvdGlvblwiLFxuICBNdXNpY0Rpc2NDYXQgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX2NhdFwiLFxuICBTcHlnbGFzcyA9IFwibWluZWNyYWZ0OnNweWdsYXNzXCIsXG4gIFRvcmNoID0gXCJtaW5lY3JhZnQ6dG9yY2hcIixcbiAgU291bFRvcmNoID0gXCJtaW5lY3JhZnQ6c291bF90b3JjaFwiLFxuICBSYWlsID0gXCJtaW5lY3JhZnQ6cmFpbFwiLFxuICBTb3VsTGFudGVybiA9IFwibWluZWNyYWZ0OnNvdWxfbGFudGVyblwiLFxuICBDYW5kbGUgPSBcIm1pbmVjcmFmdDpjYW5kbGVcIixcbiAgTWFnZW50YUNhbmRsZSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfY2FuZGxlXCIsXG4gIExpbWVDYW5kbGUgPSBcIm1pbmVjcmFmdDpsaW1lX2NhbmRsZVwiLFxuICBHcmF5Q2FuZGxlID0gXCJtaW5lY3JhZnQ6Z3JheV9jYW5kbGVcIixcbiAgSGFyZFBpbmtTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX3Bpbmtfc3RhaW5lZF9nbGFzc1wiLFxuICBMaWdodEdyYXlDYW5kbGUgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X2NhbmRsZVwiLFxuICBQb3dkZXJTbm93QnVja2V0ID0gXCJtaW5lY3JhZnQ6cG93ZGVyX3Nub3dfYnVja2V0XCIsXG4gIEJsYWNrQ2FuZGxlID0gXCJtaW5lY3JhZnQ6YmxhY2tfY2FuZGxlXCIsXG4gIFNoZWFmUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6c2hlYWZfcG90dGVyeV9zaGVyZFwiLFxuICBDcmFmdGluZ1RhYmxlID0gXCJtaW5lY3JhZnQ6Y3JhZnRpbmdfdGFibGVcIixcbiAgU21pdGhpbmdUYWJsZSA9IFwibWluZWNyYWZ0OnNtaXRoaW5nX3RhYmxlXCIsXG4gIE11c2ljRGlzY1N0cmFkID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19zdHJhZFwiLFxuICBTb3VsQ2FtcGZpcmUgPSBcIm1pbmVjcmFmdDpzb3VsX2NhbXBmaXJlXCIsXG4gIEJsYXN0RnVybmFjZSA9IFwibWluZWNyYWZ0OmJsYXN0X2Z1cm5hY2VcIixcbiAgQ2hlbWlzdHJ5VGFibGUgPSBcIm1pbmVjcmFmdDpjaGVtaXN0cnlfdGFibGVcIixcbiAgQnJld2luZ1N0YW5kID0gXCJtaW5lY3JhZnQ6YnJld2luZ19zdGFuZFwiLFxuICBFbmNoYW50aW5nVGFibGUgPSBcIm1pbmVjcmFmdDplbmNoYW50aW5nX3RhYmxlXCIsXG4gIEJvb2tzaGVsZiA9IFwibWluZWNyYWZ0OmJvb2tzaGVsZlwiLFxuICBDaGlzZWxlZEJvb2tzaGVsZiA9IFwibWluZWNyYWZ0OmNoaXNlbGVkX2Jvb2tzaGVsZlwiLFxuICBUcmFwcGVkQ2hlc3QgPSBcIm1pbmVjcmFmdDp0cmFwcGVkX2NoZXN0XCIsXG4gIFJhYmJpdEZvb3QgPSBcIm1pbmVjcmFmdDpyYWJiaXRfZm9vdFwiLFxuICBVbmR5ZWRTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6dW5keWVkX3NodWxrZXJfYm94XCIsXG4gIFdoaXRlU2h1bGtlckJveCA9IFwibWluZWNyYWZ0OndoaXRlX3NodWxrZXJfYm94XCIsXG4gIEdyYXlTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6Z3JheV9zaHVsa2VyX2JveFwiLFxuICBCbGFja1NodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpibGFja19zaHVsa2VyX2JveFwiLFxuICBSZWRTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6cmVkX3NodWxrZXJfYm94XCIsXG4gIE9yYW5nZVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpvcmFuZ2Vfc2h1bGtlcl9ib3hcIixcbiAgSGFyZEJsYWNrU3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfYmxhY2tfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIExpbWVTaHVsa2VyQm94ID0gXCJtaW5lY3JhZnQ6bGltZV9zaHVsa2VyX2JveFwiLFxuICBHcmVlblNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDpncmVlbl9zaHVsa2VyX2JveFwiLFxuICBRdWFydHogPSBcIm1pbmVjcmFmdDpxdWFydHpcIixcbiAgTWFnZW50YVNodWxrZXJCb3ggPSBcIm1pbmVjcmFmdDptYWdlbnRhX3NodWxrZXJfYm94XCIsXG4gIE11c2ljRGlzY0NoaXJwID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19jaGlycFwiLFxuICBNdXNpY0Rpc2NNYWxsID0gXCJtaW5lY3JhZnQ6bXVzaWNfZGlzY19tYWxsXCIsXG4gIE11c2ljRGlzY1dhcmQgPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX3dhcmRcIixcbiAgTGlnaHRuaW5nUm9kID0gXCJtaW5lY3JhZnQ6bGlnaHRuaW5nX3JvZFwiLFxuICBNdXNpY0Rpc2NDcmVhdG9yTXVzaWNCb3ggPSBcIm1pbmVjcmFmdDptdXNpY19kaXNjX2NyZWF0b3JfbXVzaWNfYm94XCIsXG4gIERhbmdlclBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OmRhbmdlcl9wb3R0ZXJ5X3NoZXJkXCIsXG4gIERpc2NGcmFnbWVudDUgPSBcIm1pbmVjcmFmdDpkaXNjX2ZyYWdtZW50XzVcIixcbiAgR2xvd3N0b25lID0gXCJtaW5lY3JhZnQ6Z2xvd3N0b25lXCIsXG4gIEJpcmNoU2lnbiA9IFwibWluZWNyYWZ0OmJpcmNoX3NpZ25cIixcbiAgQ3JpbXNvblNpZ24gPSBcIm1pbmVjcmFmdDpjcmltc29uX3NpZ25cIixcbiAgV2FycGVkU2lnbiA9IFwibWluZWNyYWZ0OndhcnBlZF9zaWduXCIsXG4gIEZpcmV3b3JrU3RhciA9IFwibWluZWNyYWZ0OmZpcmV3b3JrX3N0YXJcIixcbiAgU3BydWNlSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfaGFuZ2luZ19zaWduXCIsXG4gIEJhbWJvb0hhbmdpbmdTaWduID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2hhbmdpbmdfc2lnblwiLFxuICBDcmltc29uSGFuZ2luZ1NpZ24gPSBcIm1pbmVjcmFmdDpjcmltc29uX2hhbmdpbmdfc2lnblwiLFxuICBIYXJkR3JheVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2dyYXlfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIFBhaW50aW5nID0gXCJtaW5lY3JhZnQ6cGFpbnRpbmdcIixcbiAgSG9uZXlCb3R0bGUgPSBcIm1pbmVjcmFmdDpob25leV9ib3R0bGVcIixcbiAgTGF2YUJ1Y2tldCA9IFwibWluZWNyYWZ0OmxhdmFfYnVja2V0XCIsXG4gIENvZEJ1Y2tldCA9IFwibWluZWNyYWZ0OmNvZF9idWNrZXRcIixcbiAgV2l0aGVyU3Bhd25FZ2cgPSBcIm1pbmVjcmFmdDp3aXRoZXJfc3Bhd25fZWdnXCIsXG4gIFB1ZmZlcmZpc2hCdWNrZXQgPSBcIm1pbmVjcmFmdDpwdWZmZXJmaXNoX2J1Y2tldFwiLFxuICBTa3VsbCA9IFwibWluZWNyYWZ0OnNrdWxsXCIsXG4gIEhlYXJ0UG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6aGVhcnRfcG90dGVyeV9zaGVyZFwiLFxuICBCZWxsID0gXCJtaW5lY3JhZnQ6YmVsbFwiLFxuICBBbnZpbCA9IFwibWluZWNyYWZ0OmFudmlsXCIsXG4gIENvbmR1aXQgPSBcIm1pbmVjcmFmdDpjb25kdWl0XCIsXG4gIFN0b25lY3V0dGVyQmxvY2sgPSBcIm1pbmVjcmFmdDpzdG9uZWN1dHRlcl9ibG9ja1wiLFxuICBSYXdJcm9uID0gXCJtaW5lY3JhZnQ6cmF3X2lyb25cIixcbiAgUmF3R29sZCA9IFwibWluZWNyYWZ0OnJhd19nb2xkXCIsXG4gIEhhcmRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfZ2xhc3NcIixcbiAgUmF3Q29wcGVyID0gXCJtaW5lY3JhZnQ6cmF3X2NvcHBlclwiLFxuICBJcm9uSW5nb3QgPSBcIm1pbmVjcmFmdDppcm9uX2luZ290XCIsXG4gIFByaXNtYXJpbmVTaGFyZCA9IFwibWluZWNyYWZ0OnByaXNtYXJpbmVfc2hhcmRcIixcbiAgQmxhemVQb3dkZXIgPSBcIm1pbmVjcmFmdDpibGF6ZV9wb3dkZXJcIixcbiAgRHJhZ29uQnJlYXRoID0gXCJtaW5lY3JhZnQ6ZHJhZ29uX2JyZWF0aFwiLFxuICBIYXJkR3JlZW5TdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX2dyZWVuX3N0YWluZWRfZ2xhc3NcIixcbiAgTmV0aGVyU3RhciA9IFwibWluZWNyYWZ0Om5ldGhlcl9zdGFyXCIsXG4gIFBhcGVyID0gXCJtaW5lY3JhZnQ6cGFwZXJcIixcbiAgTGlnaHRCbG9jazQgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja180XCIsXG4gIFRudCA9IFwibWluZWNyYWZ0OnRudFwiLFxuICBIYXJkV2hpdGVTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX3doaXRlX3N0YWluZWRfZ2xhc3NcIixcbiAgSGFyZFB1cnBsZVN0YWluZWRHbGFzcyA9IFwibWluZWNyYWZ0OmhhcmRfcHVycGxlX3N0YWluZWRfZ2xhc3NcIixcbiAgSGFyZEJyb3duU3RhaW5lZEdsYXNzID0gXCJtaW5lY3JhZnQ6aGFyZF9icm93bl9zdGFpbmVkX2dsYXNzXCIsXG4gIEhhcmRSZWRTdGFpbmVkR2xhc3MgPSBcIm1pbmVjcmFmdDpoYXJkX3JlZF9zdGFpbmVkX2dsYXNzXCIsXG4gIEhhcmRXaGl0ZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX3doaXRlX3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBIYXJkWWVsbG93U3RhaW5lZEdsYXNzUGFuZSA9IFwibWluZWNyYWZ0OmhhcmRfeWVsbG93X3N0YWluZWRfZ2xhc3NfcGFuZVwiLFxuICBIYXJkTGltZVN0YWluZWRHbGFzc1BhbmUgPSBcIm1pbmVjcmFmdDpoYXJkX2xpbWVfc3RhaW5lZF9nbGFzc19wYW5lXCIsXG4gIEdsb3dTdGljayA9IFwibWluZWNyYWZ0Omdsb3dfc3RpY2tcIixcbiAgQmFtYm9vQnV0dG9uID0gXCJtaW5lY3JhZnQ6YmFtYm9vX2J1dHRvblwiLFxuICBTcGFya2xlciA9IFwibWluZWNyYWZ0OnNwYXJrbGVyXCIsXG4gIFNwcnVjZUJvYXQgPSBcIm1pbmVjcmFmdDpzcHJ1Y2VfYm9hdFwiLFxuICBMb2Rlc3RvbmVDb21wYXNzID0gXCJtaW5lY3JhZnQ6bG9kZXN0b25lX2NvbXBhc3NcIixcbiAgQWlyID0gXCJtaW5lY3JhZnQ6YWlyXCIsXG4gIEZpcmV3b3JrUm9ja2V0ID0gXCJtaW5lY3JhZnQ6ZmlyZXdvcmtfcm9ja2V0XCIsXG4gIEJpcmNoQ2hlc3RCb2F0ID0gXCJtaW5lY3JhZnQ6YmlyY2hfY2hlc3RfYm9hdFwiLFxuICBHb2xkZW5SYWlsID0gXCJtaW5lY3JhZnQ6Z29sZGVuX3JhaWxcIixcbiAgTWluZWNhcnQgPSBcIm1pbmVjcmFmdDptaW5lY2FydFwiLFxuICBIb3BwZXJNaW5lY2FydCA9IFwibWluZWNyYWZ0OmhvcHBlcl9taW5lY2FydFwiLFxuICBSZWRzdG9uZVRvcmNoID0gXCJtaW5lY3JhZnQ6cmVkc3RvbmVfdG9yY2hcIixcbiAgQWNhY2lhQnV0dG9uID0gXCJtaW5lY3JhZnQ6YWNhY2lhX2J1dHRvblwiLFxuICBEYXJrT2FrQnV0dG9uID0gXCJtaW5lY3JhZnQ6ZGFya19vYWtfYnV0dG9uXCIsXG4gIENyaW1zb25CdXR0b24gPSBcIm1pbmVjcmFmdDpjcmltc29uX2J1dHRvblwiLFxuICBXYXJwZWRCdXR0b24gPSBcIm1pbmVjcmFmdDp3YXJwZWRfYnV0dG9uXCIsXG4gIFRyaXB3aXJlSG9vayA9IFwibWluZWNyYWZ0OnRyaXB3aXJlX2hvb2tcIixcbiAgU3BydWNlUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OnNwcnVjZV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBNYW5ncm92ZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDptYW5ncm92ZV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBTdG9uZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpzdG9uZV9wcmVzc3VyZV9wbGF0ZVwiLFxuICBIZWF2eVdlaWdodGVkUHJlc3N1cmVQbGF0ZSA9IFwibWluZWNyYWZ0OmhlYXZ5X3dlaWdodGVkX3ByZXNzdXJlX3BsYXRlXCIsXG4gIFBvbGlzaGVkQmxhY2tzdG9uZVByZXNzdXJlUGxhdGUgPSBcIm1pbmVjcmFmdDpwb2xpc2hlZF9ibGFja3N0b25lX3ByZXNzdXJlX3BsYXRlXCIsXG4gIFJlcGVhdGVyID0gXCJtaW5lY3JhZnQ6cmVwZWF0ZXJcIixcbiAgQ29tcGFyYXRvciA9IFwibWluZWNyYWZ0OmNvbXBhcmF0b3JcIixcbiAgUGlzdG9uID0gXCJtaW5lY3JhZnQ6cGlzdG9uXCIsXG4gIEZsb3dlckJhbm5lclBhdHRlcm4gPSBcIm1pbmVjcmFmdDpmbG93ZXJfYmFubmVyX3BhdHRlcm5cIixcbiAgTW9qYW5nQmFubmVyUGF0dGVybiA9IFwibWluZWNyYWZ0Om1vamFuZ19iYW5uZXJfcGF0dGVyblwiLFxuICBCb3JkdXJlSW5kZW50ZWRCYW5uZXJQYXR0ZXJuID0gXCJtaW5lY3JhZnQ6Ym9yZHVyZV9pbmRlbnRlZF9iYW5uZXJfcGF0dGVyblwiLFxuICBHbG9iZUJhbm5lclBhdHRlcm4gPSBcIm1pbmVjcmFmdDpnbG9iZV9iYW5uZXJfcGF0dGVyblwiLFxuICBXaWxkQXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OndpbGRfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBGbG93QmFubmVyUGF0dGVybiA9IFwibWluZWNyYWZ0OmZsb3dfYmFubmVyX3BhdHRlcm5cIixcbiAgQW5nbGVyUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6YW5nbGVyX3BvdHRlcnlfc2hlcmRcIixcbiAgQmxhZGVQb3R0ZXJ5U2hlcmQgPSBcIm1pbmVjcmFmdDpibGFkZV9wb3R0ZXJ5X3NoZXJkXCIsXG4gIE1pbmVyUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6bWluZXJfcG90dGVyeV9zaGVyZFwiLFxuICBNb3VybmVyUG90dGVyeVNoZXJkID0gXCJtaW5lY3JhZnQ6bW91cm5lcl9wb3R0ZXJ5X3NoZXJkXCIsXG4gIFBsZW50eVBvdHRlcnlTaGVyZCA9IFwibWluZWNyYWZ0OnBsZW50eV9wb3R0ZXJ5X3NoZXJkXCIsXG4gIFZleEFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDp2ZXhfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBEdW5lQXJtb3JUcmltU21pdGhpbmdUZW1wbGF0ZSA9IFwibWluZWNyYWZ0OmR1bmVfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZVwiLFxuICBTaGFwZXJBcm1vclRyaW1TbWl0aGluZ1RlbXBsYXRlID0gXCJtaW5lY3JhZnQ6c2hhcGVyX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgU2lsZW5jZUFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDpzaWxlbmNlX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgVGlkZUFybW9yVHJpbVNtaXRoaW5nVGVtcGxhdGUgPSBcIm1pbmVjcmFmdDp0aWRlX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGVcIixcbiAgQ2hhaW4gPSBcIm1pbmVjcmFmdDpjaGFpblwiLFxuICBEZWNvcmF0ZWRQb3QgPSBcIm1pbmVjcmFmdDpkZWNvcmF0ZWRfcG90XCIsXG4gIE9taW5vdXNUcmlhbEtleSA9IFwibWluZWNyYWZ0Om9taW5vdXNfdHJpYWxfa2V5XCIsXG4gIExpZ2h0QmxvY2sxNSA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzE1XCIsXG4gIEZpbGxlZE1hcCA9IFwibWluZWNyYWZ0OmZpbGxlZF9tYXBcIixcbiAgQm9yZGVyQmxvY2sgPSBcIm1pbmVjcmFmdDpib3JkZXJfYmxvY2tcIixcbiAgTGlnaHRCbG9jazIgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja18yXCIsXG4gIExpZ2h0QmxvY2szID0gXCJtaW5lY3JhZnQ6bGlnaHRfYmxvY2tfM1wiLFxuICBMaWdodEJsb2NrNiA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzZcIixcbiAgTGlnaHRCbG9jazcgPSBcIm1pbmVjcmFmdDpsaWdodF9ibG9ja183XCIsXG4gIExpZ2h0QmxvY2sxMSA9IFwibWluZWNyYWZ0OmxpZ2h0X2Jsb2NrXzExXCIsXG4gIFN0b25lID0gXCJtaW5lY3JhZnQ6c3RvbmVcIixcbiAgU2FuZCA9IFwibWluZWNyYWZ0OnNhbmRcIixcbiAgUmVkU2FuZHN0b25lID0gXCJtaW5lY3JhZnQ6cmVkX3NhbmRzdG9uZVwiLFxuICBTYW5kc3RvbmUgPSBcIm1pbmVjcmFmdDpzYW5kc3RvbmVcIixcbiAgUXVhcnR6QmxvY2sgPSBcIm1pbmVjcmFmdDpxdWFydHpfYmxvY2tcIixcbiAgUHJpc21hcmluZSA9IFwibWluZWNyYWZ0OnByaXNtYXJpbmVcIixcbiAgQnVja2V0ID0gXCJtaW5lY3JhZnQ6YnVja2V0XCIsXG4gIEJ1bmRsZSA9IFwibWluZWNyYWZ0OmJ1bmRsZVwiLFxuICBCbHVlQnVuZGxlID0gXCJtaW5lY3JhZnQ6Ymx1ZV9idW5kbGVcIixcbiAgQmxhY2tCdW5kbGUgPSBcIm1pbmVjcmFmdDpibGFja19idW5kbGVcIixcbiAgQnJvd25CdW5kbGUgPSBcIm1pbmVjcmFmdDpicm93bl9idW5kbGVcIixcbiAgQ3lhbkJ1bmRsZSA9IFwibWluZWNyYWZ0OmN5YW5fYnVuZGxlXCIsXG4gIEdyYXlCdW5kbGUgPSBcIm1pbmVjcmFmdDpncmF5X2J1bmRsZVwiLFxuICBHcmVlbkJ1bmRsZSA9IFwibWluZWNyYWZ0OmdyZWVuX2J1bmRsZVwiLFxuICBMaWdodEJsdWVCdW5kbGUgPSBcIm1pbmVjcmFmdDpsaWdodF9ibHVlX2J1bmRsZVwiLFxuICBMaWdodEdyYXlCdW5kbGUgPSBcIm1pbmVjcmFmdDpsaWdodF9ncmF5X2J1bmRsZVwiLFxuICBMaW1lQnVuZGxlID0gXCJtaW5lY3JhZnQ6bGltZV9idW5kbGVcIixcbiAgTWFnZW50YUJ1bmRsZSA9IFwibWluZWNyYWZ0Om1hZ2VudGFfYnVuZGxlXCIsXG4gIE9yYW5nZUJ1bmRsZSA9IFwibWluZWNyYWZ0Om9yYW5nZV9idW5kbGVcIixcbiAgUGlua0J1bmRsZSA9IFwibWluZWNyYWZ0OnBpbmtfYnVuZGxlXCIsXG4gIFB1cnBsZUJ1bmRsZSA9IFwibWluZWNyYWZ0OnB1cnBsZV9idW5kbGVcIixcbiAgUmVkQnVuZGxlID0gXCJtaW5lY3JhZnQ6cmVkX2J1bmRsZVwiLFxuICBXaGl0ZUJ1bmRsZSA9IFwibWluZWNyYWZ0OndoaXRlX2J1bmRsZVwiLFxuICBZZWxsb3dCdW5kbGUgPSBcIm1pbmVjcmFmdDp5ZWxsb3dfYnVuZGxlXCJcbn1cbiIsICJlbnVtIEl0ZW1DYXRlZ29yeSB7XG4gIENvbnN0cnVjdGlvbiA9IFwiY29uc3RydWN0aW9uXCIsXG4gIEVxdWlwbWVudCA9IFwiZXF1aXBtZW50XCIsXG4gIEl0ZW1zID0gXCJpdGVtc1wiLFxuICBOYXR1cmUgPSBcIm5hdHVyZVwiLFxuICBOb25lID0gXCJub25lXCJcbn1cblxuZXhwb3J0IHsgSXRlbUNhdGVnb3J5IH07XG4iLCAiZW51bSBJdGVtR3JvdXAge1xuICBBbnZpbCA9IFwiaXRlbUdyb3VwLm5hbWUuYW52aWxcIixcbiAgQXJyb3cgPSBcIml0ZW1Hcm91cC5uYW1lLmFycm93XCIsXG4gIEF4ZSA9IFwiaXRlbUdyb3VwLm5hbWUuYXhlXCIsXG4gIEJhbm5lciA9IFwiaXRlbUdyb3VwLm5hbWUuYmFubmVyXCIsXG4gIEJhbm5lclBhdHRlcm4gPSBcIml0ZW1Hcm91cC5uYW1lLmJhbm5lcl9wYXR0ZXJuXCIsXG4gIEJlZCA9IFwiaXRlbUdyb3VwLm5hbWUuYmVkXCIsXG4gIEJvYXQgPSBcIml0ZW1Hcm91cC5uYW1lLmJvYXRcIixcbiAgQm9vdHMgPSBcIml0ZW1Hcm91cC5uYW1lLmJvb3RzXCIsXG4gIEJ1dHRvbnMgPSBcIml0ZW1Hcm91cC5uYW1lLmJ1dHRvbnNcIixcbiAgQ2FuZGxlcyA9IFwiaXRlbUdyb3VwLm5hbWUuY2FuZGxlc1wiLFxuICBDaGFsa2JvYXJkID0gXCJpdGVtR3JvdXAubmFtZS5jaGFsa2JvYXJkXCIsXG4gIENoZXN0ID0gXCJpdGVtR3JvdXAubmFtZS5jaGVzdFwiLFxuICBDaGVzdGJvYXQgPSBcIml0ZW1Hcm91cC5uYW1lLmNoZXN0Ym9hdFwiLFxuICBDaGVzdHBsYXRlID0gXCJpdGVtR3JvdXAubmFtZS5jaGVzdHBsYXRlXCIsXG4gIENvbmNyZXRlID0gXCJpdGVtR3JvdXAubmFtZS5jb25jcmV0ZVwiLFxuICBDb25jcmV0ZVBvd2RlciA9IFwiaXRlbUdyb3VwLm5hbWUuY29uY3JldGVQb3dkZXJcIixcbiAgQ29va2VkRm9vZCA9IFwiaXRlbUdyb3VwLm5hbWUuY29va2VkRm9vZFwiLFxuICBDb3BwZXIgPSBcIml0ZW1Hcm91cC5uYW1lLmNvcHBlclwiLFxuICBDb3JhbCA9IFwiaXRlbUdyb3VwLm5hbWUuY29yYWxcIixcbiAgQ29yYWxEZWNvcmF0aW9ucyA9IFwiaXRlbUdyb3VwLm5hbWUuY29yYWxfZGVjb3JhdGlvbnNcIixcbiAgQ3JvcCA9IFwiaXRlbUdyb3VwLm5hbWUuY3JvcFwiLFxuICBEb29yID0gXCJpdGVtR3JvdXAubmFtZS5kb29yXCIsXG4gIER5ZSA9IFwiaXRlbUdyb3VwLm5hbWUuZHllXCIsXG4gIEVuY2hhbnRlZEJvb2sgPSBcIml0ZW1Hcm91cC5uYW1lLmVuY2hhbnRlZEJvb2tcIixcbiAgRmVuY2UgPSBcIml0ZW1Hcm91cC5uYW1lLmZlbmNlXCIsXG4gIEZlbmNlR2F0ZSA9IFwiaXRlbUdyb3VwLm5hbWUuZmVuY2VHYXRlXCIsXG4gIEZpcmV3b3JrID0gXCJpdGVtR3JvdXAubmFtZS5maXJld29ya1wiLFxuICBGaXJld29ya1N0YXJzID0gXCJpdGVtR3JvdXAubmFtZS5maXJld29ya1N0YXJzXCIsXG4gIEZsb3dlciA9IFwiaXRlbUdyb3VwLm5hbWUuZmxvd2VyXCIsXG4gIEdsYXNzID0gXCJpdGVtR3JvdXAubmFtZS5nbGFzc1wiLFxuICBHbGFzc1BhbmUgPSBcIml0ZW1Hcm91cC5uYW1lLmdsYXNzUGFuZVwiLFxuICBHbGF6ZWRUZXJyYWNvdHRhID0gXCJpdGVtR3JvdXAubmFtZS5nbGF6ZWRUZXJyYWNvdHRhXCIsXG4gIEdvYXRIb3JuID0gXCJpdGVtR3JvdXAubmFtZS5nb2F0SG9yblwiLFxuICBHcmFzcyA9IFwiaXRlbUdyb3VwLm5hbWUuZ3Jhc3NcIixcbiAgSGFuZ2luZ1NpZ24gPSBcIml0ZW1Hcm91cC5uYW1lLmhhbmdpbmdfc2lnblwiLFxuICBIZWxtZXQgPSBcIml0ZW1Hcm91cC5uYW1lLmhlbG1ldFwiLFxuICBIb2UgPSBcIml0ZW1Hcm91cC5uYW1lLmhvZVwiLFxuICBIb3JzZUFybW9yID0gXCJpdGVtR3JvdXAubmFtZS5ob3JzZUFybW9yXCIsXG4gIExlYXZlcyA9IFwiaXRlbUdyb3VwLm5hbWUubGVhdmVzXCIsXG4gIExlZ2dpbmdzID0gXCJpdGVtR3JvdXAubmFtZS5sZWdnaW5nc1wiLFxuICBMaW5nZXJpbmdQb3Rpb24gPSBcIml0ZW1Hcm91cC5uYW1lLmxpbmdlcmluZ1BvdGlvblwiLFxuICBMb2cgPSBcIml0ZW1Hcm91cC5uYW1lLmxvZ1wiLFxuICBNaW5lY2FydCA9IFwiaXRlbUdyb3VwLm5hbWUubWluZWNhcnRcIixcbiAgTWlzY0Zvb2QgPSBcIml0ZW1Hcm91cC5uYW1lLm1pc2NGb29kXCIsXG4gIE1vYkVnZyA9IFwiaXRlbUdyb3VwLm5hbWUubW9iRWdnXCIsXG4gIE1vbnN0ZXJTdG9uZUVnZyA9IFwiaXRlbUdyb3VwLm5hbWUubW9uc3RlclN0b25lRWdnXCIsXG4gIE11c2hyb29tID0gXCJpdGVtR3JvdXAubmFtZS5tdXNocm9vbVwiLFxuICBOZXRoZXJXYXJ0QmxvY2sgPSBcIml0ZW1Hcm91cC5uYW1lLm5ldGhlcldhcnRCbG9ja1wiLFxuICBPcmUgPSBcIml0ZW1Hcm91cC5uYW1lLm9yZVwiLFxuICBQZXJtaXNzaW9uID0gXCJpdGVtR3JvdXAubmFtZS5wZXJtaXNzaW9uXCIsXG4gIFBpY2theGUgPSBcIml0ZW1Hcm91cC5uYW1lLnBpY2theGVcIixcbiAgUGxhbmtzID0gXCJpdGVtR3JvdXAubmFtZS5wbGFua3NcIixcbiAgUG90aW9uID0gXCJpdGVtR3JvdXAubmFtZS5wb3Rpb25cIixcbiAgUG90dGVyeVNoZXJkcyA9IFwiaXRlbUdyb3VwLm5hbWUucG90dGVyeVNoZXJkc1wiLFxuICBQcmVzc3VyZVBsYXRlID0gXCJpdGVtR3JvdXAubmFtZS5wcmVzc3VyZVBsYXRlXCIsXG4gIFJhaWwgPSBcIml0ZW1Hcm91cC5uYW1lLnJhaWxcIixcbiAgUmF3Rm9vZCA9IFwiaXRlbUdyb3VwLm5hbWUucmF3Rm9vZFwiLFxuICBSZWNvcmQgPSBcIml0ZW1Hcm91cC5uYW1lLnJlY29yZFwiLFxuICBTYW5kc3RvbmUgPSBcIml0ZW1Hcm91cC5uYW1lLnNhbmRzdG9uZVwiLFxuICBTYXBsaW5nID0gXCJpdGVtR3JvdXAubmFtZS5zYXBsaW5nXCIsXG4gIFNjdWxrID0gXCJpdGVtR3JvdXAubmFtZS5zY3Vsa1wiLFxuICBTZWVkID0gXCJpdGVtR3JvdXAubmFtZS5zZWVkXCIsXG4gIFNob3ZlbCA9IFwiaXRlbUdyb3VwLm5hbWUuc2hvdmVsXCIsXG4gIFNodWxrZXJCb3ggPSBcIml0ZW1Hcm91cC5uYW1lLnNodWxrZXJCb3hcIixcbiAgU2lnbiA9IFwiaXRlbUdyb3VwLm5hbWUuc2lnblwiLFxuICBTa3VsbCA9IFwiaXRlbUdyb3VwLm5hbWUuc2t1bGxcIixcbiAgU2xhYiA9IFwiaXRlbUdyb3VwLm5hbWUuc2xhYlwiLFxuICBTbWl0aGluZ1RlbXBsYXRlcyA9IFwiaXRlbUdyb3VwLm5hbWUuc21pdGhpbmdfdGVtcGxhdGVzXCIsXG4gIFNwbGFzaFBvdGlvbiA9IFwiaXRlbUdyb3VwLm5hbWUuc3BsYXNoUG90aW9uXCIsXG4gIFN0YWluZWRDbGF5ID0gXCJpdGVtR3JvdXAubmFtZS5zdGFpbmVkQ2xheVwiLFxuICBTdGFpcnMgPSBcIml0ZW1Hcm91cC5uYW1lLnN0YWlyc1wiLFxuICBTdG9uZSA9IFwiaXRlbUdyb3VwLm5hbWUuc3RvbmVcIixcbiAgU3RvbmVCcmljayA9IFwiaXRlbUdyb3VwLm5hbWUuc3RvbmVCcmlja1wiLFxuICBTd29yZCA9IFwiaXRlbUdyb3VwLm5hbWUuc3dvcmRcIixcbiAgVHJhcGRvb3IgPSBcIml0ZW1Hcm91cC5uYW1lLnRyYXBkb29yXCIsXG4gIFdhbGxzID0gXCJpdGVtR3JvdXAubmFtZS53YWxsc1wiLFxuICBXb29kID0gXCJpdGVtR3JvdXAubmFtZS53b29kXCIsXG4gIFdvb2wgPSBcIml0ZW1Hcm91cC5uYW1lLndvb2xcIixcbiAgV29vbENhcnBldCA9IFwiaXRlbUdyb3VwLm5hbWUud29vbENhcnBldFwiXG59XG5cbmV4cG9ydCB7IEl0ZW1Hcm91cCB9O1xuIiwgImVudW0gSXRlbVRvb2xUaWVyIHtcbiAgTm9uZSxcbiAgV29vZGVuLFxuICBTdG9uZSxcbiAgSXJvbixcbiAgR29sZCxcbiAgRGlhbW9uZCxcbiAgTmV0aGVyaXRlXG59XG5cbmV4cG9ydCB7IEl0ZW1Ub29sVGllciB9O1xuIiwgImVudW0gSXRlbVRvb2xUeXBlIHtcbiAgTm9uZSxcbiAgQXhlLFxuICBIb2UsXG4gIFNob3ZlbCxcbiAgU3dvcmQsXG4gIFBpY2theGVcbn1cblxuZXhwb3J0IHsgSXRlbVRvb2xUeXBlIH07XG4iLCAiZW51bSBCbG9ja1Rvb2xUeXBlIHtcbiAgTm9uZSxcbiAgU3dvcmQsXG4gIFNob3ZlbCxcbiAgUGlja2F4ZSxcbiAgQXhlLFxuICBIb2UsXG4gIFNoZWFyc1xufVxuXG5leHBvcnQgeyBCbG9ja1Rvb2xUeXBlIH07XG4iLCAiZW51bSBJdGVtVXNlTWV0aG9kIHtcbiAgQ2xpY2ssXG4gIEJyZWFrLFxuICBQbGFjZSxcbiAgVXNlXG59XG5cbmV4cG9ydCB7IEl0ZW1Vc2VNZXRob2QgfTtcbiIsICJpbXBvcnQgeyBJdGVtVXNlT25FbnRpdHlJbnZlbnRvcnlUcmFuc2FjdGlvblR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuZW51bSBFbnRpdHlJbnRlcmFjdE1ldGhvZCB7XG4gIEludGVyYWN0ID0gSXRlbVVzZU9uRW50aXR5SW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlLkludGVyYWN0LFxuICBBdHRhY2sgPSBJdGVtVXNlT25FbnRpdHlJbnZlbnRvcnlUcmFuc2FjdGlvblR5cGUuQXR0YWNrXG59XG5cbmV4cG9ydCB7IEVudGl0eUludGVyYWN0TWV0aG9kIH07XG4iLCAiZW51bSBDYXJkaW5hbERpcmVjdGlvbiB7XG4gIE5vcnRoID0gMyxcbiAgRWFzdCA9IDAsXG4gIFNvdXRoID0gMixcbiAgV2VzdCA9IDFcbn1cblxuZXhwb3J0IHsgQ2FyZGluYWxEaXJlY3Rpb24gfTtcbiIsICJlbnVtIFdvcmxkRXZlbnQge1xuICBXb3JsZEluaXRpYWxpemUsXG4gIFdvcmxkVGljayxcbiAgQ2h1bmtSZWFkeSxcbiAgSGVhbHRoQ2hhbmdlZCxcbiAgRW50aXR5U3Bhd25lZCxcbiAgRW50aXR5RGVzcGF3bmVkLFxuICBFbnRpdHlEaWUsXG4gIEVudGl0eUZsYWdVcGRhdGUsXG4gIEVudGl0eURpbWVuc2lvbkNoYW5nZSxcbiAgRW50aXR5TWV0YWRhdGFVcGRhdGUsXG4gIEVudGl0eUF0dHJpYnV0ZVVwZGF0ZSxcbiAgRW50aXR5SGl0LFxuICBFbnRpdHlIdXJ0LFxuICBFZmZlY3RBZGQsXG4gIEVmZmVjdFJlbW92ZSxcbiAgUGxheWVySm9pbixcbiAgUGxheWVyTGVhdmUsXG4gIFBsYXllckNoYXQsXG4gIFBsYXllclBsYWNlQmxvY2ssXG4gIFBsYXllckJyZWFrQmxvY2ssXG4gIFBsYXllckRyb3BJdGVtLFxuICBQbGF5ZXJHYW1lbW9kZUNoYW5nZSxcbiAgUGxheWVyQWJpbGl0eVVwZGF0ZSxcbiAgUGxheWVyU3RhcnRVc2luZ0l0ZW0sXG4gIFBsYXllclN0b3BVc2luZ0l0ZW0sXG4gIFBsYXllclVzZUl0ZW0sXG4gIFBsYXllclN0YXJ0RW1vdGluZyxcbiAgUGxheWVyU3RvcEVtb3RpbmcsXG4gIFBsYXllckludGVyYWN0V2l0aEJsb2NrLFxuICBQbGF5ZXJJbnRlcmFjdFdpdGhFbnRpdHksXG4gIFBsYXllck9wZW5lZENvbnRhaW5lcixcbiAgQmxvY2tVcGRhdGVcbn1cblxuZXhwb3J0IHsgV29ybGRFdmVudCB9O1xuIiwgImVudW0gU2VydmVyRXZlbnQge1xuICBTdGFydCA9IDEwMDAsXG4gIFN0b3Bcbn1cblxuZXhwb3J0IHsgU2VydmVyRXZlbnQgfTtcbiIsICJpbXBvcnQgdHlwZSB7IFNlcmVuaXR5IH0gZnJvbSBcIi4uL3NlcmVuaXR5XCI7XG5pbXBvcnQgdHlwZSB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5pbXBvcnQgdHlwZSB7IERhdGFQYWNrZXQsIFBhY2tldCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHR5cGUgeyBOZXR3b3JrIH0gZnJvbSBcIi5cIjtcblxuY2xhc3MgTmV0d29ya0hhbmRsZXIge1xuICAvKipcbiAgICogVGhlIHBhY2tldCB0aGF0IHRoZSBuZXR3b3JrIGhhbmRsZXIgaXMgbGlzdGVuaW5nIGZvci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0OiBQYWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSB0aGF0IHRoZSBuZXR3b3JrIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgbmV0d29yayBpbnN0YW5jZSB0aGF0IHRoZSBuZXR3b3JrIGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV0d29yazogTmV0d29yaztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBuZXR3b3JrIGhhbmRsZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHNlcmVuaXR5IGluc3RhbmNlLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IGluc3RhbmNlIHRoYXQgdGhlIG5ldHdvcmsgaGFuZGxlciBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJlbml0eTogU2VyZW5pdHkpIHtcbiAgICB0aGlzLnNlcmVuaXR5ID0gc2VyZW5pdHk7XG4gICAgdGhpcy5uZXR3b3JrID0gc2VyZW5pdHkubmV0d29yaztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgcGFja2V0IGFuIGluY29taW5nIHBhY2tldCBmcm9tIGEgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHBhY2tldCBUaGUgcGFja2V0IHRvIGhhbmRsZS5cbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIHJha25ldCBjb25uZWN0aW9uIHRoYXQgdGhlIHBhY2tldCBpcyBiZWluZyBzZW50IGZyb20uXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlKF9wYWNrZXQ6IERhdGFQYWNrZXQsIF9jb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTmV0d29ya0hhbmRsZXIuaGFuZGxlKCkgaXMgbm90IGltcGxlbWVudGVkIVwiKTtcbiAgfVxufVxuXG5leHBvcnQgeyBOZXR3b3JrSGFuZGxlciB9O1xuIiwgImltcG9ydCB7IEFuaW1hdGVQYWNrZXQsIFBhY2tldCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuXG5jbGFzcyBBbmltYXRlSGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuQW5pbWF0ZTtcblxuICBwdWJsaWMgaGFuZGxlKHBhY2tldDogQW5pbWF0ZVBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LnBsYXllcnMuZ2V0KGNvbm5lY3Rpb24pO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIGFuaW1hdGlvbiB0byBhbGwgcGxheWVyc1xuICAgIHBsYXllci5kaW1lbnNpb24uYnJvYWRjYXN0RXhjZXB0KHBsYXllciwgcGFja2V0KTtcbiAgfVxufVxuXG5leHBvcnQgeyBBbmltYXRlSGFuZGxlciB9O1xuIiwgImltcG9ydCB7IENvbnRhaW5lckNsb3NlUGFja2V0LCBQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcblxuY2xhc3MgQ29udGFpbmVyQ2xvc2VIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5Db250YWluZXJDbG9zZTtcblxuICBwdWJsaWMgaGFuZGxlKF86IENvbnRhaW5lckNsb3NlUGFja2V0LCBjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIgYnkgdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LmdldFBsYXllckJ5Q29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgYW4gb3BlbmVkIGNvbnRhaW5lclxuICAgIGlmICghcGxheWVyLm9wZW5lZENvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgLy8gQ2xvc2UgdGhlIGNvbnRhaW5lclxuICAgIHBsYXllci5vcGVuZWRDb250YWluZXIuY2xvc2UocGxheWVyKTtcbiAgfVxufVxuXG5leHBvcnQgeyBDb250YWluZXJDbG9zZUhhbmRsZXIgfTtcbiIsICJpbXBvcnQgeyBEaXNjb25uZWN0UGFja2V0LCBQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IFBsYXllckxlYXZlU2lnbmFsIH0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuXG5jbGFzcyBEaXNjb25uZWN0SGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuRGlzY29ubmVjdDtcblxuICBwdWJsaWMgaGFuZGxlKHBhY2tldDogRGlzY29ubmVjdFBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGJ5IHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIENyZWF0ZSBhIFBsYXllckxlYXZlU2lnbmFsXG4gICAgbmV3IFBsYXllckxlYXZlU2lnbmFsKFxuICAgICAgcGxheWVyLFxuICAgICAgcGFja2V0LnJlYXNvbixcbiAgICAgIHBhY2tldC5tZXNzYWdlLm1lc3NhZ2UgPz8gU3RyaW5nKClcbiAgICApLmVtaXQoKTtcblxuICAgIC8vIERlc3Bhd24gdGhlIHBsYXllclxuICAgIHBsYXllci5kZXNwYXduKCk7XG5cbiAgICAvLyBHZXQgdGhlIHBsYXllcidzIGRpbWVuc2lvblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHBsYXllci5kaW1lbnNpb247XG5cbiAgICAvLyBTYXZlIHRoZSBwbGF5ZXIncyBkYXRhXG4gICAgZGltZW5zaW9uLndvcmxkLnByb3ZpZGVyLndyaXRlUGxheWVyKHBsYXllci5nZXREYXRhRW50cnkoKSwgZGltZW5zaW9uKTtcblxuICAgIC8vIExvZyB0aGUgbGVhdmUgZXZlbnQgdG8gdGhlIGNvbnNvbGVcbiAgICBkaW1lbnNpb24ud29ybGQubG9nZ2VyLmluZm8oXG4gICAgICBgwqc4W8KnOSR7cGxheWVyLnVzZXJuYW1lfcKnOF0gRXZlbnQ6wqdyIFBsYXllciBsZWZ0IHRoZSBzZXJ2ZXIuYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRGlzY29ubmVjdEhhbmRsZXIgfTtcbiIsICJpbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCIuLi93b3JsZFwiO1xuXG5jbGFzcyBFdmVudFNpZ25hbCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2lnbmFsLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBXb3JsZEV2ZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2lnbmFsLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgRXZlbnRTaWduYWwpXG4gICAgLmlkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZCBpbnN0YW5jZSB0aGUgc2lnbmFsIHdhcyBlbWl0dGVkIGluLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmxkOiBXb3JsZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzaWduYWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB3b3JsZCBUaGUgd29ybGQgaW5zdGFuY2UgdGhlIHNpZ25hbCB3YXMgZW1pdHRlZCBpbi5cbiAgICogQHJldHVybnMgQSBuZXcgc2lnbmFsIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmxkOiBXb3JsZCkge1xuICAgIHRoaXMud29ybGQgPSB3b3JsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgc2lnbmFsIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBzaWduYWwgd2FzIGVtaXR0ZWQgc3VjY2Vzc2Z1bGx5OyBkZWZhdWx0IGlzIHRydWUuXG4gICAqL1xuICBwdWJsaWMgZW1pdCgpOiBib29sZWFuIHtcbiAgICAvLyBFbWl0IHRoZSBzaWduYWwgaW4gdGhlIHdvcmxkIGFuZCBzZXJ2ZXJcbiAgICBjb25zdCB3b3JsZCA9IHRoaXMud29ybGQuZW1pdCh0aGlzLmlkZW50aWZpZXIsIHRoaXMpO1xuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMud29ybGQuc2VyZW5pdHkuZW1pdCh0aGlzLmlkZW50aWZpZXIsIHRoaXMpO1xuXG4gICAgLy8gUmV0dXJuIHdoZXRoZXIgdGhlIHNpZ25hbCB3YXMgZW1pdHRlZCBzdWNjZXNzZnVsbHlcbiAgICByZXR1cm4gd29ybGQgJiYgc2VydmVyO1xuICB9XG59XG5cbmV4cG9ydCB7IEV2ZW50U2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBXb3JsZEluaXRpYWxpemVTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuV29ybGRJbml0aWFsaXplO1xufVxuXG5leHBvcnQgeyBXb3JsZEluaXRpYWxpemVTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vd29ybGRcIjtcblxuY2xhc3MgV29ybGRUaWNrU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LldvcmxkVGljaztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdGljayBvZiB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3VycmVudFRpY2s6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIHRpbWUgZGVsdGEgYmV0d2VlbiB0aGUgY3VycmVudCB0aWNrIGFuZCB0aGUgbGFzdCB0aWNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlbHRhVGljazogYmlnaW50O1xuXG4gIC8qKlxuICAgKiBUaGUgd29ybGQgdGhhdCBoYXMgYmVlbiB0aWNrZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ybGQ6IFdvcmxkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHdvcmxkIHRpY2sgc2lnbmFsLlxuICAgKiBAcGFyYW0gY3VycmVudFRpY2sgVGhlIGN1cnJlbnQgdGljayBvZiB0aGUgd29ybGQuXG4gICAqIEBwYXJhbSBkZWx0YVRpY2sgVGhlIHRpbWUgZGVsdGEgYmV0d2VlbiB0aGUgY3VycmVudCB0aWNrIGFuZCB0aGUgbGFzdCB0aWNrLlxuICAgKiBAcGFyYW0gd29ybGQgVGhlIHdvcmxkIHRoYXQgaGFzIGJlZW4gdGlja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGN1cnJlbnRUaWNrOiBiaWdpbnQsIGRlbHRhVGljazogYmlnaW50LCB3b3JsZDogV29ybGQpIHtcbiAgICBzdXBlcih3b3JsZCk7XG4gICAgdGhpcy5jdXJyZW50VGljayA9IGN1cnJlbnRUaWNrO1xuICAgIHRoaXMuZGVsdGFUaWNrID0gZGVsdGFUaWNrO1xuICAgIHRoaXMud29ybGQgPSB3b3JsZDtcbiAgfVxufVxuXG5leHBvcnQgeyBXb3JsZFRpY2tTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBDaHVuaywgRGltZW5zaW9uIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIENodW5rUmVhZHlTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuQ2h1bmtSZWFkeTtcblxuICAvKipcbiAgICogVGhlIGNodW5rIHRoYXQgaXMgcmVhZHkgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2h1bms6IENodW5rO1xuXG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9uIHRoYXQgdGhlIGNodW5rIGlzIGluLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpbWVuc2lvbjogRGltZW5zaW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNodW5rIHJlYWR5IHNpZ25hbC5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRoYXQgdGhlIGNodW5rIGlzIGluLlxuICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRoYXQgaXMgcmVhZHkgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZGltZW5zaW9uOiBEaW1lbnNpb24sIGNodW5rOiBDaHVuaykge1xuICAgIHN1cGVyKGRpbWVuc2lvbi53b3JsZCk7XG4gICAgdGhpcy5kaW1lbnNpb24gPSBkaW1lbnNpb247XG4gICAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB9XG59XG5cbmV4cG9ydCB7IENodW5rUmVhZHlTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmltcG9ydCB0eXBlIHsgRGltZW5zaW9uIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcblxuLyoqXG4gKiBTaWduYWwgZW1pdHRlZCB3aGVuIGFuIGVudGl0eSBzcGF3bnMuXG4gKi9cbmNsYXNzIEVudGl0eVNwYXduZWRTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuRW50aXR5U3Bhd25lZDtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IHNwYXduZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5OiBFbnRpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb24gdGhlIGVudGl0eSBzcGF3bmVkIGluLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpbWVuc2lvbjogRGltZW5zaW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGVudGl0eSBzcGF3bmVkIHNpZ25hbC5cbiAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRoYXQgc3Bhd25lZC5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRoZSBlbnRpdHkgc3Bhd25lZCBpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSwgZGltZW5zaW9uOiBEaW1lbnNpb24pIHtcbiAgICBzdXBlcihlbnRpdHkuZGltZW5zaW9uLndvcmxkKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICB0aGlzLmRpbWVuc2lvbiA9IGRpbWVuc2lvbjtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlTcGF3bmVkU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5pbXBvcnQgdHlwZSB7IERpbWVuc2lvbiB9IGZyb20gXCIuLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5cbi8qKlxuICogU2lnbmFsIGVtaXR0ZWQgd2hlbiBhbiBlbnRpdHkgZGVzcGF3bnMuXG4gKi9cbmNsYXNzIEVudGl0eURlc3Bhd25lZFNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5FbnRpdHlEZXNwYXduZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCBkZXNwYXduZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5OiBFbnRpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb24gdGhlIGVudGl0eSBkZXNwYXduZWQgaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGltZW5zaW9uOiBEaW1lbnNpb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZW50aXR5IGRlc3Bhd25lZCBzaWduYWwuXG4gICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0aGF0IGRlc3Bhd25lZC5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRoZSBlbnRpdHkgZGVzcGF3bmVkIGluLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5LCBkaW1lbnNpb246IERpbWVuc2lvbikge1xuICAgIHN1cGVyKGVudGl0eS5kaW1lbnNpb24ud29ybGQpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgIHRoaXMuZGltZW5zaW9uID0gZGltZW5zaW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eURlc3Bhd25lZFNpZ25hbCB9O1xuIiwgImltcG9ydCB7IEFjdG9yRmxhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIEVudGl0eUZsYWdVcGRhdGVTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5FbnRpdHlGbGFnVXBkYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IGluIHdoaWNoIHRoZSBmbGFnIHdhcyB1cGRhdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgZmxhZyB0aGF0IHdhcyB1cGRhdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZsYWc6IEFjdG9yRmxhZztcblxuICAvKipcbiAgICogVGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZy5cbiAgICovXG4gIHB1YmxpYyB2YWx1ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSBmbGFnIHVwZGF0ZSBldmVudC5cbiAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IGluIHdoaWNoIHRoZSBmbGFnIHdhcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0aGF0IHdhcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmxhZy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSwgZmxhZzogQWN0b3JGbGFnLCB2YWx1ZTogYm9vbGVhbikge1xuICAgIHN1cGVyKGVudGl0eS5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICB0aGlzLmZsYWcgPSBmbGFnO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlGbGFnVXBkYXRlU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgQWN0b3JEYXRhSWQsIERhdGFJdGVtIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgRW50aXR5TWV0YWRhdGFVcGRhdGVTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5FbnRpdHlNZXRhZGF0YVVwZGF0ZTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSBpbiB3aGljaCB0aGUgbWV0YWRhdGEgd2FzIHVwZGF0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5OiBFbnRpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRhZGF0YSBrZXkgdGhhdCB3YXMgdXBkYXRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBrZXk6IEFjdG9yRGF0YUlkO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHZhbHVlIG9mIHRoZSBtZXRhZGF0YS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYXRhSXRlbTogRGF0YUl0ZW07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgbWV0YWRhdGEgdXBkYXRlIGV2ZW50LlxuICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgaW4gd2hpY2ggdGhlIG1ldGFkYXRhIHdhcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBtZXRhZGF0YSBrZXkgdGhhdCB3YXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGRhdGFJdGVtIFRoZSBuZXcgdmFsdWUgb2YgdGhlIG1ldGFkYXRhLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5LCBrZXk6IEFjdG9yRGF0YUlkLCBkYXRhSXRlbTogRGF0YUl0ZW0pIHtcbiAgICBzdXBlcihlbnRpdHkuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy5kYXRhSXRlbSA9IGRhdGFJdGVtO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eU1ldGFkYXRhVXBkYXRlU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgQXR0cmlidXRlLCBBdHRyaWJ1dGVOYW1lIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgRW50aXR5QXR0cmlidXRlVXBkYXRlU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LkVudGl0eUF0dHJpYnV0ZVVwZGF0ZTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSBpbiB3aGljaCB0aGUgYXR0cmlidXRlIHdhcyB1cGRhdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlIHRoYXQgd2FzIHVwZGF0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXR0cmlidXRlOiBBdHRyaWJ1dGVOYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IEF0dHJpYnV0ZTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSBhdHRyaWJ1dGUgdXBkYXRlIGV2ZW50LlxuICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgaW4gd2hpY2ggdGhlIGF0dHJpYnV0ZSB3YXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIHRoYXQgd2FzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgYXR0cmlidXRlOiBBdHRyaWJ1dGVOYW1lLFxuICAgIHZhbHVlOiBBdHRyaWJ1dGVcbiAgKSB7XG4gICAgc3VwZXIoZW50aXR5LmdldFdvcmxkKCkpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlBdHRyaWJ1dGVVcGRhdGVTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIFBsYXllckpvaW5TaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVySm9pbjtcblxuICAvKipcbiAgICogVGhlIHBsYXllciBqb2luaW5nIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbGF5ZXIgam9pbiBldmVudCBzaWduYWwuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciBqb2luaW5nIHRoZSB3b3JsZC4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIpIHtcbiAgICBzdXBlcihwbGF5ZXIuZGltZW5zaW9uLndvcmxkKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJKb2luU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5pbXBvcnQgdHlwZSB7IERpc2Nvbm5lY3RSZWFzb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuY2xhc3MgUGxheWVyTGVhdmVTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVyTGVhdmU7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgbGVhdmluZyB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZWFzb24gdGhlIHBsYXllciBsZWZ0IHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWFzb246IERpc2Nvbm5lY3RSZWFzb247XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRoYXQgd2FzIGRpc3BsYXllZCB0byB0aGUgcGxheWVyLCBpZiBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbGF5ZXIgam9pbiBldmVudCBzaWduYWwuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciBsZWF2aW5nIHRoZSB3b3JsZC5cbiAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIHRoZSBwbGF5ZXIgbGVmdCB0aGUgd29ybGQuXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRoYXQgd2FzIGRpc3BsYXllZCB0byB0aGUgcGxheWVyLCBpZiBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIHJlYXNvbjogRGlzY29ubmVjdFJlYXNvbixcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIocGxheWVyLmRpbWVuc2lvbi53b3JsZCk7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJMZWF2ZVNpZ25hbCB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyQ2hhdFNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5QbGF5ZXJDaGF0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgc2VudCB0aGUgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgdGhhdCB3YXMgc2VudC5cbiAgICovXG4gIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBsYXllckNoYXRTaWduYWwgY2xhc3MuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHNlbnQgdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRoYXQgd2FzIHNlbnQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKHBsYXllci5kaW1lbnNpb24ud29ybGQpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyQ2hhdFNpZ25hbCB9O1xuIiwgImltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuaW1wb3J0IHR5cGUgeyBEaW1lbnNpb24gfSBmcm9tIFwiLi4vd29ybGRcIjtcbmltcG9ydCB0eXBlIHsgQmxvY2sgfSBmcm9tIFwiLi4vYmxvY2tcIjtcblxuY2xhc3MgQmxvY2tVcGRhdGVTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudCA9IFdvcmxkRXZlbnQuQmxvY2tVcGRhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBibG9jayB0aGF0IHdhcyB1cGRhdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrOiBCbG9jaztcblxuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbiB0aGUgYmxvY2sgd2FzIHVwZGF0ZWQgaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGltZW5zaW9uOiBEaW1lbnNpb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYmxvY2sgdXBkYXRlIHNpZ25hbC5cbiAgICogQHBhcmFtIGJsb2NrIFRoZSBibG9jayB0aGF0IHdhcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdGhlIGJsb2NrIHdhcyB1cGRhdGVkIGluLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGJsb2NrOiBCbG9jaykge1xuICAgIHN1cGVyKGJsb2NrLmRpbWVuc2lvbi53b3JsZCk7XG4gICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuICAgIHRoaXMuZGltZW5zaW9uID0gYmxvY2suZGltZW5zaW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IEJsb2NrVXBkYXRlU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBCbG9ja1VwZGF0ZVNpZ25hbCB9IGZyb20gXCIuL2Jsb2NrLXVwZGF0ZVwiO1xuXG5pbXBvcnQgdHlwZSB7IEJsb2NrLCBCbG9ja1Blcm11dGF0aW9uIH0gZnJvbSBcIi4uL2Jsb2NrXCI7XG5pbXBvcnQgdHlwZSB7IEJsb2NrRmFjZSwgVmVjdG9yM2YgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuY2xhc3MgUGxheWVyUGxhY2VCbG9ja1NpZ25hbCBleHRlbmRzIEJsb2NrVXBkYXRlU2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5QbGF5ZXJQbGFjZUJsb2NrO1xuXG4gIC8qKlxuICAgKiBUaGUgZmFjZSBvZiB0aGUgYmxvY2sgdGhlIG5ldyBibG9jayBpcyBiZWluZyBwbGFjZWQgb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZmFjZTogQmxvY2tGYWNlO1xuXG4gIC8qKlxuICAgKiBMb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgYm90dG9tIG5vcnRoLXdlc3QgY29ybmVyIG9mIHRoZSBibG9jayB3aGVyZSB0aGUgbmV3IGJsb2NrIGlzIGJlaW5nIHBsYWNlZCBvbnRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZhY2VMb2NhdGlvbjogVmVjdG9yM2Y7XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmxvY2sgYmVpbmcgcGxhY2VkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcm11dGF0aW9uQmVpbmdQbGFjZWQ6IEJsb2NrUGVybXV0YXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgcGxhY2luZyB0aGUgYmxvY2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGxheWVyIHBsYWNlIGJsb2NrIHNpZ25hbC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHBsYWNpbmcgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gcGVybXV0YXRpb25CZWluZ1BsYWNlZCBUaGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrIGJlaW5nIHBsYWNlZC5cbiAgICogQHBhcmFtIGZhY2UgVGhlIGZhY2Ugb2YgdGhlIGJsb2NrIHRoZSBuZXcgYmxvY2sgaXMgYmVpbmcgcGxhY2VkIG9uLlxuICAgKiBAcGFyYW0gZmFjZUxvY2F0aW9uIExvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBib3R0b20gbm9ydGgtd2VzdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHdoZXJlIHRoZSBuZXcgYmxvY2sgaXMgYmVpbmcgcGxhY2VkIG9udG8uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgYmxvY2s6IEJsb2NrLFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIHBlcm11dGF0aW9uQmVpbmdQbGFjZWQ6IEJsb2NrUGVybXV0YXRpb24sXG4gICAgZmFjZTogQmxvY2tGYWNlLFxuICAgIGZhY2VMb2NhdGlvbjogVmVjdG9yM2ZcbiAgKSB7XG4gICAgc3VwZXIoYmxvY2spO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMucGVybXV0YXRpb25CZWluZ1BsYWNlZCA9IHBlcm11dGF0aW9uQmVpbmdQbGFjZWQ7XG4gICAgdGhpcy5mYWNlID0gZmFjZTtcbiAgICB0aGlzLmZhY2VMb2NhdGlvbiA9IGZhY2VMb2NhdGlvbjtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJQbGFjZUJsb2NrU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBCbG9ja1VwZGF0ZVNpZ25hbCB9IGZyb20gXCIuL2Jsb2NrLXVwZGF0ZVwiO1xuXG5pbXBvcnQgdHlwZSB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9pdGVtXCI7XG5pbXBvcnQgdHlwZSB7IEJsb2NrIH0gZnJvbSBcIi4uL2Jsb2NrXCI7XG5cbmNsYXNzIFBsYXllckJyZWFrQmxvY2tTaWduYWwgZXh0ZW5kcyBCbG9ja1VwZGF0ZVNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVyQnJlYWtCbG9jaztcblxuICAvKipcbiAgICogVGhlIHBsYXllciBwbGFjaW5nIHRoZSBibG9jay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gc3RhY2sgdGhhdCBpcyBiZWluZyB1c2VkIHRvIGJyZWFrIHRoZSBibG9jaywgb3IgbnVsbCBpZiBlbXB0eSBoYW5kLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbGF5ZXIgYnJlYWsgYmxvY2sgc2lnbmFsLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgYnJlYWtpbmcgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gaXRlbVN0YWNrIFRoZSBpdGVtIHN0YWNrIHRoYXQgaXMgYmVpbmcgdXNlZCB0byBicmVhayB0aGUgYmxvY2ssIG9yIG51bGwgaWYgZW1wdHkgaGFuZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBibG9jazogQmxvY2ssXG4gICAgcGxheWVyOiBQbGF5ZXIsXG4gICAgaXRlbVN0YWNrOiBJdGVtU3RhY2sgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKGJsb2NrKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLml0ZW1TdGFjayA9IGl0ZW1TdGFjaztcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJCcmVha0Jsb2NrU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyRHJvcEl0ZW1TaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVyRHJvcEl0ZW07XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdGhhdCBkcm9wcGVkIHRoZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaXRlbSBzdGFjayB0aGF0IHdhcyBkcm9wcGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1TdGFjazogSXRlbVN0YWNrO1xuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIGl0ZW1zIHRoYXQgd2VyZSBkcm9wcGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFtb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsYXllciBkcm9wIGl0ZW0gc2lnbmFsLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBkcm9wcGVkIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gaXRlbVN0YWNrIFRoZSBpdGVtIHN0YWNrIHRoYXQgd2FzIGRyb3BwZWQuXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCBvZiBpdGVtcyB0aGF0IHdlcmUgZHJvcHBlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgaXRlbVN0YWNrOiBJdGVtU3RhY2ssIGFtb3VudDogbnVtYmVyKSB7XG4gICAgc3VwZXIocGxheWVyLmRpbWVuc2lvbi53b3JsZCk7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy5pdGVtU3RhY2sgPSBpdGVtU3RhY2s7XG4gICAgdGhpcy5hbW91bnQgPSBhbW91bnQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyRHJvcEl0ZW1TaWduYWwgfTtcbiIsICJpbXBvcnQgeyBBYmlsaXR5SW5kZXggfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBQbGF5ZXJBYmlsaXR5VXBkYXRlU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LlBsYXllckFiaWxpdHlVcGRhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgaW4gd2hpY2ggdGhlIGFiaWxpdHkgd2FzIHVwZGF0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhYmlsaXR5IHRoYXQgd2FzIHVwZGF0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWJpbGl0eTogQWJpbGl0eUluZGV4O1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHZhbHVlIG9mIHRoZSBhYmlsaXR5LlxuICAgKi9cbiAgcHVibGljIHZhbHVlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGxheWVyIGFiaWxpdHkgdXBkYXRlIGV2ZW50LlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgaW4gd2hpY2ggdGhlIGFiaWxpdHkgd2FzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSBhYmlsaXR5IFRoZSBhYmlsaXR5IHRoYXQgd2FzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBhYmlsaXR5LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBhYmlsaXR5OiBBYmlsaXR5SW5kZXgsIHZhbHVlOiBib29sZWFuKSB7XG4gICAgc3VwZXIocGxheWVyLmdldFdvcmxkKCkpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMuYWJpbGl0eSA9IGFiaWxpdHk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllckFiaWxpdHlVcGRhdGVTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtVXNlTWV0aG9kLCBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBQbGF5ZXJTdGFydFVzaW5nSXRlbVNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5QbGF5ZXJTdGFydFVzaW5nSXRlbTtcblxuICAvKipcbiAgICogVGhlIHBsYXllciB0aGF0IHN0YXJ0ZWQgdXNpbmcgdGhlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHN0YWNrIHRoYXQgdGhlIHBsYXllciBzdGFydGVkIHVzaW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1TdGFjazogSXRlbVN0YWNrO1xuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIHRoYXQgdGhlIHBsYXllciBzdGFydGVkIHVzaW5nIHRoZSBpdGVtIHdpdGguXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlTWV0aG9kOiBJdGVtVXNlTWV0aG9kO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsYXllciBzdGFydCB1c2luZyBpdGVtIHNpZ25hbC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgc3RhcnRlZCB1c2luZyB0aGUgaXRlbS5cbiAgICogQHBhcmFtIGl0ZW1TdGFjayBUaGUgaXRlbSBzdGFjayB0aGF0IHRoZSBwbGF5ZXIgc3RhcnRlZCB1c2luZy5cbiAgICogQHBhcmFtIHVzZU1ldGhvZCBUaGUgbWV0aG9kIHRoYXQgdGhlIHBsYXllciBzdGFydGVkIHVzaW5nIHRoZSBpdGVtIHdpdGguXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcGxheWVyOiBQbGF5ZXIsXG4gICAgaXRlbVN0YWNrOiBJdGVtU3RhY2ssXG4gICAgdXNlTWV0aG9kOiBJdGVtVXNlTWV0aG9kXG4gICkge1xuICAgIHN1cGVyKHBsYXllci5kaW1lbnNpb24ud29ybGQpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMuaXRlbVN0YWNrID0gaXRlbVN0YWNrO1xuICAgIHRoaXMudXNlTWV0aG9kID0gdXNlTWV0aG9kO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllclN0YXJ0VXNpbmdJdGVtU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyU3RvcFVzaW5nSXRlbVNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5QbGF5ZXJTdG9wVXNpbmdJdGVtO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgc3RvcHBlZCB1c2luZyB0aGUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gc3RhY2sgdGhhdCB0aGUgcGxheWVyIHN0b3BwZWQgdXNpbmcuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbVN0YWNrOiBJdGVtU3RhY2s7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGxheWVyIHN0YXJ0IHVzaW5nIGl0ZW0gc2lnbmFsLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBzdG9wcGVkIHVzaW5nIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gaXRlbVN0YWNrIFRoZSBpdGVtIHN0YWNrIHRoYXQgdGhlIHBsYXllciBzdG9wcGVkIHVzaW5nLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBpdGVtU3RhY2s6IEl0ZW1TdGFjaykge1xuICAgIHN1cGVyKHBsYXllci5kaW1lbnNpb24ud29ybGQpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMuaXRlbVN0YWNrID0gaXRlbVN0YWNrO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllclN0b3BVc2luZ0l0ZW1TaWduYWwgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtVXNlTWV0aG9kLCBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBQbGF5ZXJVc2VJdGVtU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LlBsYXllclVzZUl0ZW07XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdGhhdCB1c2VkIHRoZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaXRlbSBzdGFjayB0aGF0IHRoZSBwbGF5ZXIgdXNlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpdGVtU3RhY2s6IEl0ZW1TdGFjaztcblxuICAvKipcbiAgICogVGhlIG1ldGhvZCB0aGF0IHRoZSBwbGF5ZXIgdXNlZCB0aGUgaXRlbSB3aXRoLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZU1ldGhvZDogSXRlbVVzZU1ldGhvZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbGF5ZXIgdXNlIGl0ZW0gc2lnbmFsLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCB1c2VkIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gaXRlbVN0YWNrIFRoZSBpdGVtIHN0YWNrIHRoYXQgdGhlIHBsYXllciB1c2VkLlxuICAgKiBAcGFyYW0gdXNlTWV0aG9kIFRoZSBtZXRob2QgdGhhdCB0aGUgcGxheWVyIHVzZWQgdGhlIGl0ZW0gd2l0aC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICBpdGVtU3RhY2s6IEl0ZW1TdGFjayxcbiAgICB1c2VNZXRob2Q6IEl0ZW1Vc2VNZXRob2RcbiAgKSB7XG4gICAgc3VwZXIocGxheWVyLmRpbWVuc2lvbi53b3JsZCk7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy5pdGVtU3RhY2sgPSBpdGVtU3RhY2s7XG4gICAgdGhpcy51c2VNZXRob2QgPSB1c2VNZXRob2Q7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyVXNlSXRlbVNpZ25hbCB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyU3RhcnRFbW90aW5nU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFdvcmxkRXZlbnQuUGxheWVyU3RhcnRFbW90aW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgc3RhcnRlZCBlbW90aW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZW1vdGUgdGhlIHBsYXllciBzdGFydGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVtb3RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgZW1vdGUgaW4gdGlja3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGlja0xlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGxheWVyIHN0YXJ0IGVtb3Rpbmcgc2lnbmFsLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBzdGFydGVkIGVtb3RpbmcuXG4gICAqIEBwYXJhbSBlbW90ZSBUaGUgZW1vdGUgdGhlIHBsYXllciBzdGFydGVkLlxuICAgKiBAcGFyYW0gdGlja0xlbmd0aCBUaGUgZHVyYXRpb24gb2YgdGhlIGVtb3RlIGluIHRpY2tzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBlbW90ZTogc3RyaW5nLCB0aWNrTGVuZ3RoOiBudW1iZXIpIHtcbiAgICBzdXBlcihwbGF5ZXIuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG4gICAgdGhpcy5lbW90ZSA9IGVtb3RlO1xuICAgIHRoaXMudGlja0xlbmd0aCA9IHRpY2tMZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyU3RhcnRFbW90aW5nU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBQbGF5ZXJTdG9wRW1vdGluZ1NpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBXb3JsZEV2ZW50LlBsYXllclN0b3BFbW90aW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgc3RhcnRlZCBlbW90aW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZW1vdGUgdGhlIHBsYXllciBzdGFydGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVtb3RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbGF5ZXIgc3RvcCBlbW90aW5nIHNpZ25hbC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgc3RvcHBlZCBlbW90aW5nLlxuICAgKiBAcGFyYW0gZW1vdGUgVGhlIGVtb3RlIHRoZSBwbGF5ZXIgc3RvcHBlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgZW1vdGU6IHN0cmluZykge1xuICAgIHN1cGVyKHBsYXllci5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLmVtb3RlID0gZW1vdGU7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyU3RvcEVtb3RpbmdTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi4vZWZmZWN0XCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIEVmZmVjdEFkZFNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBXb3JsZEV2ZW50ID0gV29ybGRFdmVudC5FZmZlY3RBZGQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgd2hlcmUgdGhlIGVmZmVjdCB3YXMgYWRkZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGVmZmVjdCB0aGF0IHdhcyBhZGRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlZmZlY3Q6IEVmZmVjdDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHksIGVmZmVjdDogRWZmZWN0KSB7XG4gICAgc3VwZXIoZW50aXR5LmdldFdvcmxkKCkpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgIHRoaXMuZWZmZWN0ID0gZWZmZWN0O1xuICB9XG59XG5cbmV4cG9ydCB7IEVmZmVjdEFkZFNpZ25hbCB9O1xuIiwgImltcG9ydCB7IEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBFZmZlY3RSZW1vdmVTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudCA9IFdvcmxkRXZlbnQuRWZmZWN0UmVtb3ZlO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHdoZXJlIHRoZSBlZmZlY3Qgd2FzIHJlbW92ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGVmZmVjdCB0aGF0IHdhcyByZW1vdmVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZWZmZWN0OiBFZmZlY3RUeXBlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSwgZWZmZWN0OiBFZmZlY3RUeXBlKSB7XG4gICAgc3VwZXIoZW50aXR5LmdldFdvcmxkKCkpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgIHRoaXMuZWZmZWN0ID0gZWZmZWN0O1xuICB9XG59XG5cbmV4cG9ydCB7IEVmZmVjdFJlbW92ZVNpZ25hbCB9O1xuIiwgImltcG9ydCB7IEdhbWVtb2RlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgUGxheWVyR2FtZW1vZGVDaGFuZ2VTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudCA9XG4gICAgV29ybGRFdmVudC5QbGF5ZXJHYW1lbW9kZUNoYW5nZTtcblxuICAvKipcbiAgICogVGhlIHBsYXllciB0aGF0IGhhcyBjaGFuZ2VkIGhpcyBnYW1lbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGdhbWVtb2RlIHRoYXQgdGhlIHBsYXllciB3YXMgcHJldmlvdXNseSBpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmcm9tR2FtZW1vZGU6IEdhbWVtb2RlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHBsYXllcidzIGdhbWVtb2RlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdG9HYW1lbW9kZTogR2FtZW1vZGU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIGZyb21HYW1lbW9kZTogR2FtZW1vZGUsXG4gICAgdG9HYW1lbW9kZTogR2FtZW1vZGVcbiAgKSB7XG4gICAgc3VwZXIocGxheWVyLmdldFdvcmxkKCkpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICAgIHRoaXMuZnJvbUdhbWVtb2RlID0gZnJvbUdhbWVtb2RlO1xuICAgIHRoaXMudG9HYW1lbW9kZSA9IHRvR2FtZW1vZGU7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyR2FtZW1vZGVDaGFuZ2VTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBEaW1lbnNpb24gfSBmcm9tIFwiLi4vd29ybGRcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgRW50aXR5RGltZW5zaW9uQ2hhbmdlU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IFdvcmxkRXZlbnQgPVxuICAgIFdvcmxkRXZlbnQuRW50aXR5RGltZW5zaW9uQ2hhbmdlO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgY2hhbmdlZCBkaW1lbnNpb25zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9uIHRoZSBlbnRpdHkgbW92ZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnJvbURpbWVuc2lvbjogRGltZW5zaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9uIHRoZSBlbnRpdHkgbW92ZWQgZnJvbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0b0RpbWVuc2lvbjogRGltZW5zaW9uO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBmcm9tRGltZW5zaW9uOiBEaW1lbnNpb24sXG4gICAgdG9EaW1lbnNpb246IERpbWVuc2lvblxuICApIHtcbiAgICBzdXBlcihlbnRpdHkuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgdGhpcy5mcm9tRGltZW5zaW9uID0gZnJvbURpbWVuc2lvbjtcbiAgICB0aGlzLnRvRGltZW5zaW9uID0gdG9EaW1lbnNpb247XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5RGltZW5zaW9uQ2hhbmdlU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgQmxvY2sgfSBmcm9tIFwiLi4vYmxvY2tcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9pdGVtXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIFBsYXllckludGVyYWN0V2l0aEJsb2NrU2lnbmFsIGV4dGVuZHMgRXZlbnRTaWduYWwge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IFdvcmxkRXZlbnQgPVxuICAgIFdvcmxkRXZlbnQuUGxheWVySW50ZXJhY3RXaXRoQmxvY2s7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdGhhdCB0cmlnZ2VyZWQgdGhlIGludGVyYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHNvdXJjZTogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgdGhhdCB3YXMgaW50ZXJhY3RlZCB3aXRoLlxuICAgKi9cbiAgcHVibGljIGJsb2NrOiBCbG9jaztcblxuICAvKipcbiAgICogVGhlIHBsYXllcidzIGhlbGQgaXRlbSBiZWZvcmUgdGhlIGludGVyYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGJlZm9yZUl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHBsYXllcidzIGhlbGQgaXRlbSBhZnRlciB0aGUgaW50ZXJhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgaXRlbVN0YWNrOiBJdGVtU3RhY2sgfCBudWxsO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzb3VyY2U6IFBsYXllcixcbiAgICBibG9jazogQmxvY2ssXG4gICAgYmVmb3JlSXRlbVN0YWNrOiBJdGVtU3RhY2sgfCBudWxsLFxuICAgIGl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbFxuICApIHtcbiAgICBzdXBlcihzb3VyY2UuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuICAgIHRoaXMuYmVmb3JlSXRlbVN0YWNrID0gYmVmb3JlSXRlbVN0YWNrO1xuICAgIHRoaXMuaXRlbVN0YWNrID0gaXRlbVN0YWNrO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllckludGVyYWN0V2l0aEJsb2NrU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgRW50aXR5LCBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBQbGF5ZXJJbnRlcmFjdFdpdGhFbnRpdHlTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudCA9XG4gICAgV29ybGRFdmVudC5QbGF5ZXJJbnRlcmFjdFdpdGhFbnRpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdGhhdCB0cmlnZ2VyZWQgdGhlIGludGVyYWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZTogUGxheWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgd2FzIGludGVyYWN0ZWQgd2l0aC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXQ6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIHBsYXllcidzIGhlbGQgaXRlbSB0aGF0IHdhcyB1c2VkIHRvIGludGVyYWN0IHdpdGggYWZ0ZXIgdGhlIGludGVyYWN0aW9uXG4gICAqL1xuICBwdWJsaWMgaXRlbVN0YWNrOiBJdGVtU3RhY2sgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVyJ3MgaXRlbSB0aGF0IHdhcyB1c2VkIHRvIGludGVyYWN0IHdpdGggYmVmb3JlIHRoZSBpbnRlcmFjdGlvblxuICAgKi9cbiAgcHVibGljIGJlZm9yZUl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc291cmNlOiBQbGF5ZXIsXG4gICAgdGFyZ2V0OiBFbnRpdHksXG4gICAgYmVmb3JlSXRlbVN0YWNrOiBJdGVtU3RhY2sgfCBudWxsLFxuICAgIGl0ZW1TdGFjazogSXRlbVN0YWNrIHwgbnVsbFxuICApIHtcbiAgICBzdXBlcihzb3VyY2UuZ2V0V29ybGQoKSk7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy5iZWZvcmVJdGVtU3RhY2sgPSBiZWZvcmVJdGVtU3RhY2s7XG4gICAgdGhpcy5pdGVtU3RhY2sgPSBpdGVtU3RhY2s7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVySW50ZXJhY3RXaXRoRW50aXR5U2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4uL2NvbnRhaW5lclwiO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuaW1wb3J0IHsgV29ybGRFdmVudCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFdmVudFNpZ25hbCB9IGZyb20gXCIuL2V2ZW50LXNpZ25hbFwiO1xuXG5jbGFzcyBQbGF5ZXJPcGVuZWRDb250YWluZXJTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyID0gV29ybGRFdmVudC5QbGF5ZXJPcGVuZWRDb250YWluZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdGhhdCBvcGVuZWQgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lciB0aGF0IHdhcyBvcGVuZWQgYnkgdGhlIHBsYXllci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXI6IENvbnRhaW5lcjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsYXllciBvcGVuZWQgY29udGFpbmVyIGV2ZW50LlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBvcGVuZWQgdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHRoYXQgd2FzIG9wZW5lZCBieSB0aGUgcGxheWVyLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBjb250YWluZXI6IENvbnRhaW5lcikge1xuICAgIHN1cGVyKHBsYXllci5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJPcGVuZWRDb250YWluZXJTaWduYWwgfTtcbiIsICJpbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIEVudGl0eUhpdFNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBXb3JsZEV2ZW50ID0gV29ybGRFdmVudC5FbnRpdHlIaXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCB3YXMgaGl0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhpdEVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgaGl0dGVkIHRoZSBvdGhlciBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGFtYWdpbmdFbnRpdHk6IEVudGl0eTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZGFtYWdpbmdFbnRpdHk6IEVudGl0eSwgaGl0RW50aXR5OiBFbnRpdHkpIHtcbiAgICBzdXBlcihkYW1hZ2luZ0VudGl0eS5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLmRhbWFnaW5nRW50aXR5ID0gZGFtYWdpbmdFbnRpdHk7XG4gICAgdGhpcy5oaXRFbnRpdHkgPSBoaXRFbnRpdHk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5SGl0U2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgQWN0b3JEYW1hZ2VDYXVzZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIEVudGl0eUh1cnRTaWduYWwgZXh0ZW5kcyBFdmVudFNpZ25hbCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogV29ybGRFdmVudCA9IFdvcmxkRXZlbnQuRW50aXR5SHVydDtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IHdhcyBodXJ0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGh1cnRFbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IGh1cnRlZCB0aGUgZW50aXR5LCBpZiB0aGUgZGFtYWdlIHdhcyBjYXVzZWQgYnkgYW4gZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhbWFnaW5nRW50aXR5PzogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIGRhbWFnZSBkZWFsZWQgdG8gdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYW1hZ2U6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGNhdXNlIG9mIHRoZSBkYW1hZ2UgZGVhbGVkIHRvIHRoZSBlbnRpdHlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYXVzZT86IEFjdG9yRGFtYWdlQ2F1c2U7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGh1cnRFbnRpdHk6IEVudGl0eSxcbiAgICBkYW1hZ2U6IG51bWJlcixcbiAgICBjYXVzZT86IEFjdG9yRGFtYWdlQ2F1c2UsXG4gICAgZGFtYWdpbmdFbnRpdHk/OiBFbnRpdHlcbiAgKSB7XG4gICAgc3VwZXIoaHVydEVudGl0eS5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLmh1cnRFbnRpdHkgPSBodXJ0RW50aXR5O1xuICAgIHRoaXMuZGFtYWdpbmdFbnRpdHkgPSBkYW1hZ2luZ0VudGl0eTtcbiAgICB0aGlzLmRhbWFnZSA9IGRhbWFnZTtcbiAgICB0aGlzLmNhdXNlID0gY2F1c2U7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5SHVydFNpZ25hbCB9O1xuIiwgImltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkRXZlbnQgfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRXZlbnRTaWduYWwgfSBmcm9tIFwiLi9ldmVudC1zaWduYWxcIjtcblxuY2xhc3MgRW50aXR5SGVhbHRoQ2hhbmdlZFNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBXb3JsZEV2ZW50ID0gV29ybGRFdmVudC5IZWFsdGhDaGFuZ2VkO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHdoaWNoIGhlYWx0aCBjaGFuZ2VkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJldmlvdXMgaGVhbHRoIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZyb21IZWFsdGg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5ldyBoZWFsdGggdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdG9IZWFsdGg6IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHksIGZyb21IZWFsdGg6IG51bWJlciwgdG9IZWFsdGg6IG51bWJlcikge1xuICAgIHN1cGVyKGVudGl0eS5nZXRXb3JsZCgpKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgICB0aGlzLmZyb21IZWFsdGggPSBmcm9tSGVhbHRoO1xuICAgIHRoaXMudG9IZWFsdGggPSB0b0hlYWx0aDtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlIZWFsdGhDaGFuZ2VkU2lnbmFsIH07XG4iLCAiaW1wb3J0IHsgQWN0b3JEYW1hZ2VDYXVzZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBXb3JsZEV2ZW50IH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEV2ZW50U2lnbmFsIH0gZnJvbSBcIi4vZXZlbnQtc2lnbmFsXCI7XG5cbmNsYXNzIEVudGl0eURpZVNpZ25hbCBleHRlbmRzIEV2ZW50U2lnbmFsIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBXb3JsZEV2ZW50ID0gV29ybGRFdmVudC5FbnRpdHlEaWU7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCBkaWVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQga2lsbGVkIHRoZSBlbnRpdHksIG9ubHkgaWYgdGhlIGRlYXRoIHdhcyBjYXVzZWQgYnkgYW4gZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhbWFnaW5nRW50aXR5PzogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBkYW1hZ2UgY2F1c2UgYmVmb3JlIHRoZSBlbnRpdHkgZGVhdGguXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGFtYWdlQ2F1c2U/OiBBY3RvckRhbWFnZUNhdXNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBkYW1hZ2luZ0VudGl0eT86IEVudGl0eSxcbiAgICBkYW1hZ2VDYXVzZT86IEFjdG9yRGFtYWdlQ2F1c2VcbiAgKSB7XG4gICAgc3VwZXIoZW50aXR5LmdldFdvcmxkKCkpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgIHRoaXMuZGFtYWdpbmdFbnRpdHkgPSBkYW1hZ2luZ0VudGl0eTtcbiAgICB0aGlzLmRhbWFnZUNhdXNlID0gZGFtYWdlQ2F1c2U7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5RGllU2lnbmFsIH07XG4iLCAiaW1wb3J0IHtcbiAgQmxvY2tQb3NpdGlvbixcbiAgQ29tcGxleEludmVudG9yeVRyYW5zYWN0aW9uLFxuICBHYW1lbW9kZSxcbiAgSW52ZW50b3J5QWN0aW9uLFxuICBJbnZlbnRvcnlTb3VyY2VUeXBlLFxuICBJbnZlbnRvcnlUcmFuc2FjdGlvblBhY2tldCxcbiAgSXRlbVVzZUludmVudG9yeVRyYW5zYWN0aW9uLFxuICBJdGVtVXNlSW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlLFxuICBJdGVtVXNlT25FbnRpdHlJbnZlbnRvcnlUcmFuc2FjdGlvbixcbiAgTGV2ZWxTb3VuZEV2ZW50LFxuICBMZXZlbFNvdW5kRXZlbnRQYWNrZXQsXG4gIFBhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IEVudGl0eUludmVudG9yeVRyYWl0LCBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyLCBFbnRpdHlJbnRlcmFjdE1ldGhvZCwgSXRlbVVzZU1ldGhvZCB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHtcbiAgUGxheWVyRHJvcEl0ZW1TaWduYWwsXG4gIFBsYXllclBsYWNlQmxvY2tTaWduYWwsXG4gIFBsYXllclVzZUl0ZW1TaWduYWxcbn0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuaW1wb3J0IHsgQmxvY2tFbnRyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5jbGFzcyBJbnZlbnRvcnlUcmFuc2FjdGlvbkhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LkludmVudG9yeVRyYW5zYWN0aW9uO1xuXG4gIHB1YmxpYyBoYW5kbGUoXG4gICAgcGFja2V0OiBJbnZlbnRvcnlUcmFuc2FjdGlvblBhY2tldCxcbiAgICBjb25uZWN0aW9uOiBDb25uZWN0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LmdldFBsYXllckJ5Q29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhY2tldCBoYXMgYSB0cmFuc2FjdGlvblxuICAgIC8vIFRoZXJlIHNob3VsZCBhbHdheXMgYmUgYSB0cmFuc2FjdGlvbiwgYnV0IHdlIGNhbiBuZXZlciBiZSB0b28gc3VyZS4uLlxuICAgIGlmICghcGFja2V0LnRyYW5zYWN0aW9uKSByZXR1cm47XG5cbiAgICAvLyBTd2l0Y2ggdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICBzd2l0Y2ggKHBhY2tldC50cmFuc2FjdGlvbi50eXBlKSB7XG4gICAgICAvLyBOb3JtYWwgdHJhbnNhY3Rpb25zIGluY2x1ZGUgZHJvcHBpbmcgaXRlbXNcbiAgICAgIGNhc2UgQ29tcGxleEludmVudG9yeVRyYW5zYWN0aW9uLk5vcm1hbFRyYW5zYWN0aW9uOlxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVOb3JtYWxUcmFuc2FjdGlvbihwbGF5ZXIsIHBhY2tldC50cmFuc2FjdGlvbi5hY3Rpb25zKTtcblxuICAgICAgLy8gSXRlbSB1c2UgdHJhbnNhY3Rpb25zIGluY2x1ZGUgdXNpbmcgaXRlbXMsIHBsYWNpbmcgYmxvY2tzLCBldGMuXG4gICAgICBjYXNlIENvbXBsZXhJbnZlbnRvcnlUcmFuc2FjdGlvbi5JdGVtVXNlVHJhbnNhY3Rpb246IHtcbiAgICAgICAgLy8gR2V0IHRoZSBpdGVtIHVzZSB0cmFuc2FjdGlvblxuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHBhY2tldC50cmFuc2FjdGlvbi5pdGVtVXNlO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGFjdHVhbGx5IGNvbnRhaW5zIGFuIGl0ZW0gdXNlIHRyYW5zYWN0aW9uXG4gICAgICAgIGlmICghdHJhbnNhY3Rpb24pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSXRlbVVzZSBvYmplY3QgbWlzc2luZyBmcm9tIEl0ZW1Vc2VUcmFuc2FjdGlvblwiKTtcblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGl0ZW0gdXNlIHRyYW5zYWN0aW9uXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUl0ZW1Vc2VUcmFuc2FjdGlvbihwbGF5ZXIsIHRyYW5zYWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gSXRlbSB1c2Ugb24gZW50aXR5IHRyYW5zYWN0aW9ucyBpbmNsdWRlIHVzaW5nIGl0ZW1zIG9uIGVudGl0aWVzXG4gICAgICBjYXNlIENvbXBsZXhJbnZlbnRvcnlUcmFuc2FjdGlvbi5JdGVtVXNlT25FbnRpdHlUcmFuc2FjdGlvbjoge1xuICAgICAgICAvLyBHZXQgdGhlIGl0ZW0gdXNlIG9uIGVudGl0eSB0cmFuc2FjdGlvblxuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHBhY2tldC50cmFuc2FjdGlvbi5pdGVtVXNlT25FbnRpdHk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gYWN0dWFsbHkgY29udGFpbnMgYW4gaXRlbSB1c2Ugb24gZW50aXR5IHRyYW5zYWN0aW9uXG4gICAgICAgIGlmICghdHJhbnNhY3Rpb24pXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJJdGVtVXNlT25FbnRpdHkgb2JqZWN0IG1pc3NpbmcgZnJvbSBJdGVtVXNlT25FbnRpdHlUcmFuc2FjdGlvblwiXG4gICAgICAgICAgKTtcblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGl0ZW0gdXNlIG9uIGVudGl0eSB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVJdGVtVXNlT25FbnRpdHlUcmFuc2FjdGlvbihwbGF5ZXIsIHRyYW5zYWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb21wbGV4SW52ZW50b3J5VHJhbnNhY3Rpb24uSXRlbVJlbGVhc2VUcmFuc2FjdGlvbjoge1xuICAgICAgICByZXR1cm4gY29uc29sZS5sb2coXCJUT0RPOiBJbXBsZW1lbnQgaXRlbSByZWxlYXNlIHRyYW5zYWN0aW9uXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVOb3JtYWxUcmFuc2FjdGlvbihcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICBhY3Rpb25zOiBBcnJheTxJbnZlbnRvcnlBY3Rpb24+XG4gICk6IHZvaWQge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGFjdGlvblxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgIC8vIFN3aXRjaCB0aGUgYWN0aW9uIHNvdXJjZSB0eXBlXG4gICAgICBzd2l0Y2ggKGFjdGlvbi5zb3VyY2UudHlwZSkge1xuICAgICAgICAvLyBMb2cgdW5pbXBsZW1lbnRlZCBzb3VyY2UgdHlwZXNcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIERlYnVnIGxvZyB0aGUgdW5pbXBsZW1lbnRlZCBzb3VyY2UgdHlwZVxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYEludmVudG9yeVRyYW5zYWN0aW9uSGFuZGxlcjogVW5pbXBsZW1lbnRlZCBpbnZlbnRvcnkgc291cmNlIHR5cGU6ICR7SW52ZW50b3J5U291cmNlVHlwZVthY3Rpb24uc291cmNlLnR5cGVdfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBJbnZlbnRvcnlTb3VyY2VUeXBlLkNvbnRhaW5lckludmVudG9yeToge1xuICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB2YWxpZGF0aW9uIGZvciBjb250YWluZXIgaW52ZW50b3J5XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZHJvcHBpbmcgaXRlbXMgaW50byB0aGUgd29ybGRcbiAgICAgICAgY2FzZSBJbnZlbnRvcnlTb3VyY2VUeXBlLldvcmxkSW50ZXJhY3Rpb246IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHN0YWNrIGFtb3VudCBmcm9tIHRoZSBhY3Rpb25cbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBhY3Rpb24ubmV3SXRlbS5zdGFja1NpemUgPz8gMTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgaW52ZW50b3J5IHRyYWl0XG4gICAgICAgICAgY29uc3QgaW52ZW50b3J5ID0gcGxheWVyLmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgaXRlbSBzdGFjayBmcm9tIHRoZSBwbGF5ZXIncyBpbnZlbnRvcnlcbiAgICAgICAgICBjb25zdCBpdGVtU3RhY2sgPSBpbnZlbnRvcnkuY29udGFpbmVyLmdldEl0ZW0oXG4gICAgICAgICAgICBhY3Rpb24uc2xvdFxuICAgICAgICAgICkgYXMgSXRlbVN0YWNrO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllckRyb3BJdGVtU2lnbmFsXG4gICAgICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFBsYXllckRyb3BJdGVtU2lnbmFsKFxuICAgICAgICAgICAgcGxheWVyLFxuICAgICAgICAgICAgaXRlbVN0YWNrLFxuICAgICAgICAgICAgYW1vdW50XG4gICAgICAgICAgKS5lbWl0KCk7XG5cbiAgICAgICAgICAvLyBJZiB0aGUgc2lnbmFsIHdhcyBjYW5jZWxlZCwgd2UgZG9uJ3Qgd2FudCB0byBkcm9wIHRoZSBpdGVtXG4gICAgICAgICAgaWYgKCFzaWduYWwpIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgaXRlbSBzdGFjayBpbiB0aGUgaW52ZW50b3J5XG4gICAgICAgICAgICBpdGVtU3RhY2sudXBkYXRlKCk7XG5cbiAgICAgICAgICAgIC8vIEJyZWFrIGZyb20gdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1ha2UgdGhlIHBsYXllciBkcm9wIHRoZSBpdGVtXG4gICAgICAgICAgcGxheWVyLmRyb3BJdGVtKGludmVudG9yeS5zZWxlY3RlZFNsb3QsIGFtb3VudCwgaW52ZW50b3J5LmNvbnRhaW5lcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlSXRlbVVzZVRyYW5zYWN0aW9uKFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIHRyYW5zYWN0aW9uOiBJdGVtVXNlSW52ZW50b3J5VHJhbnNhY3Rpb25cbiAgKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIncyBkaW1lbnNpb25cbiAgICBjb25zdCBkaW1lbnNpb24gPSBwbGF5ZXIuZGltZW5zaW9uO1xuXG4gICAgLy8gU3dpdGNoIHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAgc3dpdGNoICh0cmFuc2FjdGlvbi50eXBlKSB7XG4gICAgICAvLyBIYW5kbGVzIHBsYWNpbmcgaXRlbXMgYXMgYmxvY2tzXG4gICAgICBjYXNlIEl0ZW1Vc2VJbnZlbnRvcnlUcmFuc2FjdGlvblR5cGUuUGxhY2U6IHtcbiAgICAgICAgLy8gR2V0IHRoZSBibG9jayB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyBpbml0aWFsbHkgaW50ZXJhY3Rpbmcgd2l0aFxuICAgICAgICBjb25zdCBpbnRlcmFjdGluZyA9IGRpbWVuc2lvbi5nZXRCbG9jayh0cmFuc2FjdGlvbi5ibG9ja1Bvc2l0aW9uKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgdGhlIGluaXRpYWwgYWN0aW9uXG4gICAgICAgIC8vIElmIGl0IGlzbid0LCB3ZSBkb24ndCB3YW50IHRvIHBsYWNlIGEgYmxvY2tcbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5pbml0aWFsVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAvLyBJbnRlcmFjdCB3aXRoIHRoZSBibG9jayBhdCB0aGUgcG9zaXRpb25cbiAgICAgICAgICByZXR1cm4gdm9pZCBpbnRlcmFjdGluZy5pbnRlcmFjdChwbGF5ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGlzIGFpciwgd2UgY2FuJ3QgcGxhY2UgYSBibG9jayB0aGVyZVxuICAgICAgICBpZiAoaW50ZXJhY3RpbmcuaXNBaXIoKSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIE1ha2UgdGhlIHBsYXllciBpbnRlcmFjdCB3aXRoIHRoZSBibG9ja1xuICAgICAgICBpZiAoIWludGVyYWN0aW5nLmludGVyYWN0KHBsYXllcikpIHJldHVybjtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgaW50ZXJhY3Rpb24gb3BlbmVkIGEgY29udGFpbmVyIG9yIGlmIHRoZSBwbGF5ZXIgaXNuJ3QgdXNpbmcgYW4gaXRlbVxuICAgICAgICAvLyBJZiBzbywgd2Ugc2tpcCB0aGUgYmxvY2sgcGxhY2VtZW50XG4gICAgICAgIGlmIChwbGF5ZXIub3BlbmVkQ29udGFpbmVyIHx8ICFwbGF5ZXIuaXRlbVRhcmdldCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEdldCB0aGUgaXRlbSBzdGFjayBmcm9tIHRoZSBwbGF5ZXJcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBwbGF5ZXIuaXRlbVRhcmdldCBhcyBJdGVtU3RhY2s7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGl0ZW0gc3RhY2sgbmV0d29yayBpZHMgbWF0Y2hcbiAgICAgICAgaWYgKHN0YWNrLnR5cGUubmV0d29yayAhPT0gdHJhbnNhY3Rpb24uaXRlbS5uZXR3b3JrKSByZXR1cm47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBibG9jayB0eXBlIGlzIHByZXNlbnQgZm9yIHRoZSBpdGVtIHN0YWNrXG4gICAgICAgIGNvbnN0IGJsb2NrVHlwZSA9IHN0YWNrLnR5cGUuYmxvY2s7XG4gICAgICAgIGlmICghYmxvY2tUeXBlIHx8IGJsb2NrVHlwZS5pZGVudGlmaWVyID09PSBCbG9ja0lkZW50aWZpZXIuQWlyKSByZXR1cm47XG5cbiAgICAgICAgLy8gR2V0IHRoZSByZXN1bHRpbmcgYmxvY2sgdXNpbmcgdGhlIGZhY2UgcHJvdmlkZWQgYnkgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGludGVyYWN0aW5nLmZhY2UodHJhbnNhY3Rpb24uZmFjZSk7XG4gICAgICAgIGNvbnN0IG9sZFBlcm11dGF0aW9uID0gcmVzdWx0LmdldFBlcm11dGF0aW9uKCk7XG5cbiAgICAgICAgLy8gSWYgdGhlIGlzJ3MgYWlyLCB3ZSBjYW4ndCBwbGFjZSBhIGJsb2NrIHRoZXJlXG4gICAgICAgIGlmICghcmVzdWx0LmlzQWlyKCkpIHJldHVybjtcblxuICAgICAgICAvLyBHZXQgdGhlIHBlcm11dGF0aW9uIHRvIHNldCB0aGUgYmxvY2sgc3RhdGVcbiAgICAgICAgY29uc3QgcGVybXV0YXRpb24gPVxuICAgICAgICAgIGJsb2NrVHlwZS5wZXJtdXRhdGlvbnNbc3RhY2suYXV4aWxsYXJ5XSA/PyBibG9ja1R5cGUuZ2V0UGVybXV0YXRpb24oKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyUGxhY2VCbG9ja1NpZ25hbFxuICAgICAgICBjb25zdCBzaWduYWwgPSBuZXcgUGxheWVyUGxhY2VCbG9ja1NpZ25hbChcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgcGxheWVyLFxuICAgICAgICAgIHBlcm11dGF0aW9uLFxuICAgICAgICAgIHRyYW5zYWN0aW9uLmZhY2UsXG4gICAgICAgICAgdHJhbnNhY3Rpb24uY2xpY2tQb3NpdGlvblxuICAgICAgICApLmVtaXQoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBzdGFjayBoYXMgYSBibG9ja19kYXRhIGNvbXBvbmVudFxuICAgICAgICBpZiAoc3RhY2suY29tcG9uZW50cy5oYXMoXCJibG9ja19kYXRhXCIpKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBibG9jayBkYXRhIGVudHJ5IGZyb20gdGhlIGl0ZW0gc3RhY2tcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IHN0YWNrLmNvbXBvbmVudHMuZ2V0KFwiYmxvY2tfZGF0YVwiKSBhcyBCbG9ja0VudHJ5O1xuXG4gICAgICAgICAgLy8gU2V0IHRoZSBibG9jayBkYXRhIGVudHJ5IHRvIHRoZSBibG9ja1xuICAgICAgICAgIHJlc3VsdC5sb2FkRGF0YUVudHJ5KHJlc3VsdC5nZXRXb3JsZCgpLCBlbnRyeSk7XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9jayB3aXRoIHRoZSBibG9jayBkYXRhXG4gICAgICAgICAgcmVzdWx0LnNldFBlcm11dGF0aW9uKHBlcm11dGF0aW9uLCBlbnRyeSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmxvY2tcbiAgICAgICAgICByZXN1bHQuc2V0UGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgYmxvY2sgb25QbGFjZSB0cmFpdCBtZXRob2RzXG4gICAgICAgIGxldCBwbGFjZUNhbmNlbGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgcmVzdWx0LnRyYWl0cy52YWx1ZXMoKSkge1xuICAgICAgICAgIC8vIEdldCB0aGUgY2xpY2sgcG9zaXRpb24gZnJvbSB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgICBjb25zdCBjbGlja1Bvc2l0aW9uID0gdHJhbnNhY3Rpb24uY2xpY2tQb3NpdGlvbjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBicmVhayB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0cmFpdC5vblBsYWNlPy4ocGxheWVyLCBjbGlja1Bvc2l0aW9uKTtcblxuICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLCBjb250aW51ZVxuICAgICAgICAgIC8vIEFzIHRoZSB0cmFpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG1ldGhvZFxuICAgICAgICAgIGlmIChzdWNjZXNzID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBmYWxzZSwgY2FuY2VsIHRoZSBicmVha1xuICAgICAgICAgIHBsYWNlQ2FuY2VsZWQgPSAhc3VjY2VzcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgdXNlIG1ldGhvZCBvZiB0aGUgYWN0aW9uICYgdGFyZ2V0IGJsb2NrXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IEl0ZW1Vc2VNZXRob2QuUGxhY2U7XG4gICAgICAgIGNvbnN0IHRhcmdldEJsb2NrID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIENhbGwgdGhlIG9uVXNlIG1ldGhvZCBmb3IgdGhlIGl0ZW0gc3RhY2tcbiAgICAgICAgY29uc3QgdXNlU3VjY2VzcyA9XG4gICAgICAgICAgc3RhY2sudXNlKHBsYXllciwgeyBtZXRob2QsIHRhcmdldEJsb2NrIH0pICYmXG4gICAgICAgICAgbmV3IFBsYXllclVzZUl0ZW1TaWduYWwocGxheWVyLCBzdGFjaywgbWV0aG9kKS5lbWl0KCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IExldmVsU291bmRFdmVudFBhY2tldCB0byBwbGF5IHRoZSBibG9jayBwbGFjZSBzb3VuZFxuICAgICAgICBjb25zdCBzb3VuZCA9IG5ldyBMZXZlbFNvdW5kRXZlbnRQYWNrZXQoKTtcbiAgICAgICAgc291bmQuZXZlbnQgPSBMZXZlbFNvdW5kRXZlbnQuUGxhY2U7XG4gICAgICAgIHNvdW5kLnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi50b1ZlY3RvcjNmKHJlc3VsdC5wb3NpdGlvbik7XG4gICAgICAgIHNvdW5kLmRhdGEgPSByZXN1bHQucGVybXV0YXRpb24ubmV0d29yaztcbiAgICAgICAgc291bmQuYWN0b3JJZGVudGlmaWVyID0gU3RyaW5nKCk7XG4gICAgICAgIHNvdW5kLmlzQmFieU1vYiA9IGZhbHNlO1xuICAgICAgICBzb3VuZC5pc0dsb2JhbCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIElmIHRoZSBibG9jayBwbGFjZW1lbnQgd2FzIGNhbmNlbGVkLCByZXZlcnQgdGhlIGJsb2NrXG4gICAgICAgIGlmIChwbGFjZUNhbmNlbGVkIHx8ICFzaWduYWwpXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5zZXRQZXJtdXRhdGlvbihvbGRQZXJtdXRhdGlvbik7XG4gICAgICAgIGVsc2UgcmVzdWx0LmRpbWVuc2lvbi5icm9hZGNhc3Qoc291bmQpO1xuXG4gICAgICAgIC8vIElmIHRoZSBpdGVtIHVzZSB3YXMgY2FuY2VsZWQsIGluY3JlbWVudCB0aGUgc3RhY2tcbiAgICAgICAgLy8gSWYgbm90LCBkZWNyZW1lbnQgdGhlIHN0YWNrXG4gICAgICAgIGlmICghdXNlU3VjY2VzcykgcmV0dXJuIHN0YWNrLmluY3JlbWVudCgpO1xuICAgICAgICBlbHNlIGlmIChwbGF5ZXIuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLlN1cnZpdmFsKVxuICAgICAgICAgIHJldHVybiBzdGFjay5kZWNyZW1lbnQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZXMgd2hlbiBhbiBpdGVtIGlzIHVzZWRcbiAgICAgIGNhc2UgSXRlbVVzZUludmVudG9yeVRyYW5zYWN0aW9uVHlwZS5Vc2U6IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyB1c2luZyBhbiBpdGVtXG4gICAgICAgIC8vIElmIHNvLCB0aGUgaXRlbSB1c2UgY2xpY2tlZCBpbiB0aGVpciBoYW5kXG4gICAgICAgIGlmICghcGxheWVyLml0ZW1UYXJnZXQpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHBsYXllcnMgaGVsZCBpdGVtIHN0YWNrXG4gICAgICAgICAgY29uc3Qgc3RhY2sgPSBwbGF5ZXIuZ2V0SGVsZEl0ZW0oKSBhcyBJdGVtU3RhY2s7XG5cbiAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgaXRlbSBzdGFjayBuZXR3b3JrIGlkcyBtYXRjaFxuICAgICAgICAgIGlmIChzdGFjay50eXBlLm5ldHdvcmsgIT09IHRyYW5zYWN0aW9uLml0ZW0ubmV0d29yaykgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSB1c2UgbWV0aG9kIG9mIHRoZSBhY3Rpb25cbiAgICAgICAgICBjb25zdCBtZXRob2QgPSBJdGVtVXNlTWV0aG9kLkNsaWNrO1xuXG4gICAgICAgICAgLy8gQ2FsbCB0aGUgb25Vc2UgbWV0aG9kIGZvciB0aGUgaXRlbSBzdGFja1xuICAgICAgICAgIHN0YWNrLnVzZShwbGF5ZXIsIHsgbWV0aG9kIH0pO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllclVzZUl0ZW1TaWduYWxcbiAgICAgICAgICBuZXcgUGxheWVyVXNlSXRlbVNpZ25hbChwbGF5ZXIsIHN0YWNrLCBtZXRob2QpLmVtaXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGl0ZW0gc3RhY2sgZnJvbSB0aGUgcGxheWVyXG4gICAgICAgICAgY29uc3Qgc3RhY2sgPSBwbGF5ZXIuaXRlbVRhcmdldCBhcyBJdGVtU3RhY2s7XG5cbiAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgaXRlbSBzdGFjayBuZXR3b3JrIGlkcyBtYXRjaFxuICAgICAgICAgIGlmIChzdGFjay50eXBlLm5ldHdvcmsgIT09IHRyYW5zYWN0aW9uLml0ZW0ubmV0d29yaykgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSB1c2UgbWV0aG9kIG9mIHRoZSBhY3Rpb25cbiAgICAgICAgICBjb25zdCBtZXRob2QgPSBJdGVtVXNlTWV0aG9kLlVzZTtcblxuICAgICAgICAgIC8vIENhbGwgdGhlIG9uVXNlIG1ldGhvZCBmb3IgdGhlIGl0ZW0gc3RhY2tcbiAgICAgICAgICBzdGFjay51c2UocGxheWVyLCB7IG1ldGhvZCB9KTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBQbGF5ZXJVc2VJdGVtU2lnbmFsXG4gICAgICAgICAgbmV3IFBsYXllclVzZUl0ZW1TaWduYWwocGxheWVyLCBzdGFjaywgbWV0aG9kKS5lbWl0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCcmVhayBmcm9tIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIEl0ZW1Vc2VJbnZlbnRvcnlUcmFuc2FjdGlvblR5cGUuRGVzdHJveToge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlRPRE86IEltcGxlbWVudCBkZXN0cm95IGl0ZW0gdXNlIHRyYW5zYWN0aW9uXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVJdGVtVXNlT25FbnRpdHlUcmFuc2FjdGlvbihcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICB0cmFuc2FjdGlvbjogSXRlbVVzZU9uRW50aXR5SW52ZW50b3J5VHJhbnNhY3Rpb25cbiAgKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gZnJvbSB0aGUgcGxheWVyXG4gICAgY29uc3QgZGltZW5zaW9uID0gcGxheWVyLmRpbWVuc2lvbjtcblxuICAgIC8vIEdldCB0aGUgZW50aXR5IGZyb20gdGhlIGRpbWVuc2lvbiB1c2luZyB0aGUgcnVudGltZSBpZFxuICAgIGNvbnN0IGVudGl0eSA9IGRpbWVuc2lvbi5nZXRFbnRpdHkodHJhbnNhY3Rpb24uYWN0b3JSdW50aW1lSWQsIHRydWUpO1xuXG4gICAgLy8gUmV0dXJuIGlmIHRoZSBlbnRpdHkgaXMgbm90IGZvdW5kXG4gICAgaWYgKCFlbnRpdHkpIHJldHVybjtcblxuICAgIC8vIEdldCB0aGUgZW50aXR5IGludGVyYWN0IG1ldGhvZFxuICAgIGNvbnN0IG1ldGhvZCA9IHRyYW5zYWN0aW9uLnR5cGUgYXMgdW5rbm93biBhcyBFbnRpdHlJbnRlcmFjdE1ldGhvZDtcblxuICAgIC8vIENhbGwgdGhlIG9uSW50ZXJhY3QgbWV0aG9kIGZvciB0aGUgZW50aXR5XG4gICAgZW50aXR5LmludGVyYWN0KHBsYXllciwgbWV0aG9kKTtcblxuICAgIC8vIENhbGwgdGhlIG9uVXNlIG1ldGhvZCBmb3IgdGhlIGl0ZW0gc3RhY2tcbiAgICBpZiAocGxheWVyLmdldEhlbGRJdGVtKCkpIHtcbiAgICAgIC8vIEdldCB0aGUgaXRlbSBzdGFjayBmcm9tIHRoZSBwbGF5ZXJcbiAgICAgIGNvbnN0IHN0YWNrID0gcGxheWVyLmdldEhlbGRJdGVtKCkgYXMgSXRlbVN0YWNrO1xuXG4gICAgICAvLyBHZXQgdGhlIHVzZSBtZXRob2Qgb2YgdGhlIGFjdGlvblxuICAgICAgY29uc3QgbWV0aG9kID1cbiAgICAgICAgdHJhbnNhY3Rpb24udHlwZSA9PT0gMCA/IEl0ZW1Vc2VNZXRob2QuUGxhY2UgOiBJdGVtVXNlTWV0aG9kLlVzZTtcblxuICAgICAgLy8gQ2FsbCB0aGUgb25Vc2UgbWV0aG9kIGZvciB0aGUgaXRlbSBzdGFja1xuICAgICAgc3RhY2sudXNlKHBsYXllciwgeyBtZXRob2QsIHRhcmdldEVudGl0eTogZW50aXR5IH0pO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyVXNlSXRlbVNpZ25hbFxuICAgICAgbmV3IFBsYXllclVzZUl0ZW1TaWduYWwocGxheWVyLCBzdGFjaywgbWV0aG9kKS5lbWl0KCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEludmVudG9yeVRyYW5zYWN0aW9uSGFuZGxlciB9O1xuIiwgImltcG9ydCB7IEVOVElUWV9UWVBFUyB9IGZyb20gXCJAc2VyZW5pdHlqcy9kYXRhXCI7XG5cbmltcG9ydCB7IEVudGl0eVR5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5cbmltcG9ydCB0eXBlIHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG4vLyBJdGVyYXRlIG92ZXIgdGhlIGVudGl0eSB0eXBlcyBhbmQgcmVnaXN0ZXIgdGhlbS5cbmZvciAoY29uc3QgdHlwZSBvZiBFTlRJVFlfVFlQRVMpIHtcbiAgLy8gQ3JlYXRlIGEgbmV3IGVudGl0eSB0eXBlLlxuICBjb25zdCBlbnRpdHlUeXBlID0gbmV3IEVudGl0eVR5cGUoXG4gICAgdHlwZS5pZGVudGlmaWVyIGFzIEVudGl0eUlkZW50aWZpZXIsXG4gICAgdHlwZS5jb21wb25lbnRzXG4gICk7XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGVudGl0eSB0eXBlLlxuICBFbnRpdHlUeXBlLnR5cGVzLnNldCh0eXBlLmlkZW50aWZpZXIsIGVudGl0eVR5cGUpO1xufVxuIiwgImltcG9ydCB7IENvbXBvdW5kVGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuXG5pbXBvcnQgdHlwZSB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxudHlwZSBDb21wb25lbnRSZWNvcmQ8VD4gPSBUICYgeyBpZGVudGlmaWVyOiBzdHJpbmcgfTtcblxuY2xhc3MgRW50aXR5VHlwZSB7XG4gIC8qKlxuICAgKiBBIGNvbGxlY3RpdmUgcmVnaXN0cnkgb2YgYWxsIGVudGl0eSB0eXBlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBuZXcgTWFwPHN0cmluZywgRW50aXR5VHlwZT4oKTtcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgaWRlbnRpZmllciBjb3VudGVyIGZvciBlbnRpdHkgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG5ldHdvcmsgPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZW50aXR5IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogRW50aXR5SWRlbnRpZmllcjtcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgaWQgb2YgdGhlIGVudGl0eSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcms6IG51bWJlciA9ICsrRW50aXR5VHlwZS5uZXR3b3JrO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjb21wb25lbnRzIG9mIHRoZSBlbnRpdHkgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRzOiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIGNvbXBvbmVudHMgVGhlIGRlZmF1bHQgY29tcG9uZW50cyBvZiB0aGUgZW50aXR5IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoaWRlbnRpZmllcjogRW50aXR5SWRlbnRpZmllciwgY29tcG9uZW50cz86IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMuY29tcG9uZW50cyA9IGNvbXBvbmVudHMgPz8gW107XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjb21wb25lbnQgdG8gdGhlIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXI8VD4oY29tcG9uZW50OiBDb21wb25lbnRSZWNvcmQ8VD4pOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLmNvbXBvbmVudHMuaW5jbHVkZXMoY29tcG9uZW50LmlkZW50aWZpZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb21wb25lbnQgJHtjb21wb25lbnQuaWRlbnRpZmllcn0gaXMgYWxyZWFkeSByZWdpc3RlcmVkIHRvIGVudGl0eSB0eXBlICR7dGhpcy5pZGVudGlmaWVyfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudC5pZGVudGlmaWVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhIGNvbXBvbmVudCBmcm9tIHRoZSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIGNvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIHVucmVnaXN0ZXIuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlcjxUPihjb21wb25lbnQ6IENvbXBvbmVudFJlY29yZDxUPik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjb21wb25lbnQgaXMgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLmNvbXBvbmVudHMuaW5jbHVkZXMoY29tcG9uZW50LmlkZW50aWZpZXIpKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudHMuc3BsaWNlKHRoaXMuY29tcG9uZW50cy5pbmRleE9mKGNvbXBvbmVudC5pZGVudGlmaWVyKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbXBvbmVudCAke2NvbXBvbmVudC5pZGVudGlmaWVyfSBpcyBub3QgcmVnaXN0ZXJlZCB0byBlbnRpdHkgdHlwZSAke3RoaXMuaWRlbnRpZmllcn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVudGl0eSB0eXBlIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgZW50aXR5IHR5cGUuXG4gICAqIEByZXR1cm5zIFRoZSBlbnRpdHkgdHlwZSwgaWYgZm91bmQ7IG90aGVyd2lzZSwgbnVsbC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0KGlkZW50aWZpZXI6IEVudGl0eUlkZW50aWZpZXIpOiBFbnRpdHlUeXBlIHwgbnVsbCB7XG4gICAgcmV0dXJuIEVudGl0eVR5cGUudHlwZXMuZ2V0KGlkZW50aWZpZXIpIGFzIEVudGl0eVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnRpdHkgdHlwZXMgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsbCBlbnRpdHkgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEFsbCgpOiBBcnJheTxFbnRpdHlUeXBlPiB7XG4gICAgcmV0dXJuIFsuLi5FbnRpdHlUeXBlLnR5cGVzLnZhbHVlcygpXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9OYnQodHlwZTogRW50aXR5VHlwZSk6IENvbXBvdW5kVGFnIHtcbiAgICAvLyBDcmVhdGUgYSByb290IGNvbXBvdW5kIHRhZyBmb3IgdGhlIGVudGl0eSB0eXBlLlxuICAgIGNvbnN0IHJvb3QgPSBuZXcgQ29tcG91bmRUYWcoKTtcblxuICAgIC8vIENyZWF0ZSBhIGNvbXBvdW5kIHRhZyBmb3IgdGhlIGVudGl0eSBkYXRhLlxuICAgIHJvb3QuY3JlYXRlU3RyaW5nVGFnKFwiYmlkXCIsIFwiXCIpO1xuICAgIHJvb3QuY3JlYXRlQnl0ZVRhZyhcImhhc3NwYXduZWdnXCIsIDEpO1xuICAgIHJvb3QuY3JlYXRlU3RyaW5nVGFnKFwiaWRcIiwgdHlwZS5pZGVudGlmaWVyKTtcbiAgICByb290LmNyZWF0ZUludFRhZyhcInJpZFwiLCB0eXBlLm5ldHdvcmspO1xuICAgIHJvb3QuY3JlYXRlQnl0ZVRhZyhcInN1bW1vbmFibGVcIiwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJvb3QgY29tcG91bmQgdGFnLlxuICAgIHJldHVybiByb290O1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eVR5cGUgfTtcbiIsICJpbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEVudGl0eVR5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5cbmNsYXNzIEN1c3RvbUVudGl0eVR5cGUgZXh0ZW5kcyBFbnRpdHlUeXBlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSBjb21wb25lbnRzIFRoZSBkZWZhdWx0IGNvbXBvbmVudHMgb2YgdGhlIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICBzdXBlcihpZGVudGlmaWVyIGFzIEVudGl0eUlkZW50aWZpZXIpO1xuICB9XG59XG5cbmV4cG9ydCB7IEN1c3RvbUVudGl0eVR5cGUgfTtcbiIsICJpbXBvcnQge1xuICBBY3RvckRhbWFnZUNhdXNlLFxuICBBY3RvckZsYWcsXG4gIENvbnRhaW5lck5hbWUsXG4gIEVmZmVjdFR5cGUsXG4gIE1vdmVBY3RvckRlbHRhUGFja2V0LFxuICBNb3ZlRGVsdGFGbGFncyxcbiAgUm90YXRpb24sXG4gIFNldEFjdG9yTW90aW9uUGFja2V0LFxuICBWZWN0b3IzZlxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRGltZW5zaW9uLCBXb3JsZCB9IGZyb20gXCIuLi93b3JsZFwiO1xuaW1wb3J0IHtcbiAgQ2FyZGluYWxEaXJlY3Rpb24sXG4gIEVudGl0eUlkZW50aWZpZXIsXG4gIEVudGl0eUludGVyYWN0TWV0aG9kXG59IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlLFxuICBFbnRpdHlFZmZlY3RPcHRpb25zLFxuICBFbnRpdHlFbnRyeSxcbiAgRW50aXR5UHJvcGVydGllcyxcbiAgSlNPTkxpa2VWYWx1ZVxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIi4uL3NlcmVuaXR5XCI7XG5pbXBvcnQgeyBDaHVuayB9IGZyb20gXCIuLi93b3JsZC9jaHVua1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4uL2NvbnRhaW5lclwiO1xuaW1wb3J0IHsgSXRlbUJ1bmRsZVRyYWl0LCBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuaW1wb3J0IHsgQ29tbWFuZEV4ZWN1dGlvblN0YXRlIH0gZnJvbSBcIi4uL2NvbW1hbmRzXCI7XG5pbXBvcnQge1xuICBFbnRpdHlEZXNwYXduZWRTaWduYWwsXG4gIEVudGl0eURpZVNpZ25hbCxcbiAgRW50aXR5RGltZW5zaW9uQ2hhbmdlU2lnbmFsLFxuICBFbnRpdHlIaXRTaWduYWwsXG4gIEVudGl0eVNwYXduZWRTaWduYWwsXG4gIFBsYXllckludGVyYWN0V2l0aEVudGl0eVNpZ25hbFxufSBmcm9tIFwiLi4vZXZlbnRzXCI7XG5pbXBvcnQgeyBTY29yZWJvYXJkSWRlbnRpdHkgfSBmcm9tIFwiLi4vd29ybGQvc2NvcmVib2FyZFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlUeXBlIH0gZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmltcG9ydCB7XG4gIEVudGl0eUVmZmVjdHNUcmFpdCxcbiAgRW50aXR5RXF1aXBtZW50VHJhaXQsXG4gIEVudGl0eUhlYWx0aFRyYWl0LFxuICBFbnRpdHlJbnZlbnRvcnlUcmFpdCxcbiAgRW50aXR5VHJhaXRcbn0gZnJvbSBcIi4vdHJhaXRzXCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi9wbGF5ZXJcIjtcbmltcG9ydCB7IE1ldGFkYXRhTWFwLCBBY3RvckZsYWdNYXAsIEF0dHJpYnV0ZU1hcCB9IGZyb20gXCIuL21hcHNcIjtcblxuY2xhc3MgRW50aXR5IHtcbiAgLyoqXG4gICAqIFRoZSBydW5uaW5nIHRvdGFsIG9mIGVudGl0aWVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcnVudGltZUlkID0gMG47XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZW50aXR5LiAoSWRlbnRpZmllciwgTmV0d29ya0lkLCBldGMpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRW50aXR5VHlwZTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcnVudGltZSBpZCBvZiB0aGUgZW50aXR5LiAoSW5jcmVtZW50ZWQgZWFjaCB0aW1lIGFuIGVudGl0eSBpcyBjcmVhdGVkKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJ1bnRpbWVJZCA9ICsrRW50aXR5LnJ1bnRpbWVJZDtcblxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgZW50aXR5LiAoR2VuZXJhdGVkIGJ5IHRoZSBzZXJ2ZXIsIGFuZCBleGlzdHMgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgZW50aXR5KVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXF1ZUlkOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBlbnRpdHlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzZigwLCAwLCAwKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdmVsb2NpdHkgb2YgdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlbG9jaXR5ID0gbmV3IFZlY3RvcjNmKDAsIDAsIDApO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCByb3RhdGlvbiBvZiB0aGUgZW50aXR5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm90YXRpb24gPSBuZXcgUm90YXRpb24oMCwgMCwgMCk7XG5cbiAgLyoqXG4gICAqIFRoZSB0cmFpdHMgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0cyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRpdHlUcmFpdD4oKTtcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudHMgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudHMgPSBuZXcgTWFwPHN0cmluZywgSlNPTkxpa2VWYWx1ZT4oKTtcblxuICAvKipcbiAgICogVGhlIG1ldGFkYXRhIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIGVudGl0eVxuICAgKiBUaGVzZSB2YWx1ZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgY29tcG9uZW50cyBhbmQgdHJhaXRzIG9mIHRoZSBlbnRpdHlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YU1hcCh0aGlzKTtcblxuICAvKipcbiAgICogVGhlIGZsYWdzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHlcbiAgICogVGhlc2UgdmFsdWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudHMgYW5kIHRyYWl0cyBvZiB0aGUgZW50aXR5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZmxhZ3MgPSBuZXcgQWN0b3JGbGFnTWFwKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0cmlidXRlcyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGUgZW50aXR5XG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnRzIGFuZCB0cmFpdHMgb2YgdGhlIGVudGl0eVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlTWFwKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFncyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGUgZW50aXR5XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NvcmVib2FyZCBpZGVudGl0eSBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHNjb3JlYm9hcmRJZGVudGl0eTogU2NvcmVib2FyZElkZW50aXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBkaW1lbnNpb24gb2YgdGhlIGVudGl0eS5cbiAgICogVGhpcyBzaG91bGQgbm90IGJlIGR5bmFtaWNhbGx5IGNoYW5nZWQsIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgYHRlbGVwb3J0YCBtZXRob2QuXG4gICAqL1xuICBwdWJsaWMgZGltZW5zaW9uOiBEaW1lbnNpb247XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudGl0eSBpcyBhbGl2ZSBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgaXNBbGl2ZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnRpdHkgaXMgbW92aW5nIG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBpc01vdmluZyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnRpdHkgaXMgb24gdGhlIGdyb3VuZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgb25Hcm91bmQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBlbnRpdHkgd2l0aGluIGEgZGltZW5zaW9uLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gY3JlYXRlIHRoZSBlbnRpdHkgaW5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGVudGl0eSB0byBjcmVhdGVcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGFzc2lnbiB0byB0aGUgZW50aXR5XG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZGltZW5zaW9uOiBEaW1lbnNpb24sXG4gICAgdHlwZTogRW50aXR5VHlwZSB8IEVudGl0eUlkZW50aWZpZXIsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8RW50aXR5UHJvcGVydGllcz5cbiAgKSB7XG4gICAgLy8gQXNzaWduIHRoZSBzZXJlbml0eSBpbnN0YW5jZSB0byB0aGUgZW50aXR5XG4gICAgdGhpcy5zZXJlbml0eSA9IGRpbWVuc2lvbi53b3JsZC5zZXJlbml0eTtcblxuICAgIC8vIEFzc2lnbiB0aGUgZGltZW5zaW9uIGFuZCB0eXBlIHRvIHRoZSBlbnRpdHlcbiAgICB0aGlzLmRpbWVuc2lvbiA9IGRpbWVuc2lvbjtcblxuICAgIC8vIEFzc2lnbiB0aGUgdHlwZSBvZiB0aGUgZW50aXR5XG4gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBFbnRpdHlUeXBlKSB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIGVsc2UgdGhpcy50eXBlID0gZGltZW5zaW9uLndvcmxkLmVudGl0eVBhbGV0dGUuZ2V0VHlwZSh0eXBlKSBhcyBFbnRpdHlUeXBlO1xuXG4gICAgLy8gQXNzaWduIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBlbnRpdHlcbiAgICAvLyBJZiBhIHByb3ZpZGVkIHVuaXF1ZSBpZCBpcyBub3QgZ2l2ZW4sIGdlbmVyYXRlIG9uZVxuICAgIHRoaXMudW5pcXVlSWQgPSAhcHJvcGVydGllcz8udW5pcXVlSWRcbiAgICAgID8gRW50aXR5LmNyZWF0ZVVuaXF1ZUlkKHRoaXMudHlwZS5uZXR3b3JrLCB0aGlzLnJ1bnRpbWVJZClcbiAgICAgIDogcHJvcGVydGllcy51bmlxdWVJZDtcblxuICAgIC8vIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGVudGl0eVxuICAgIHRoaXMucG9zaXRpb24uc2V0KGRpbWVuc2lvbi5zcGF3blBvc2l0aW9uKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgc2NvcmVib2FyZCBpZGVudGl0eVxuICAgIHRoaXMuc2NvcmVib2FyZElkZW50aXR5ID0gbmV3IFNjb3JlYm9hcmRJZGVudGl0eSh0aGlzKTtcblxuICAgIC8vIElmIHRoZSBlbnRpdHkgaXMgbm90IGEgcGxheWVyXG4gICAgaWYgKCF0aGlzLmlzUGxheWVyKCkpIHtcbiAgICAgIC8vIElmIHRoZSBlbnRpdHkgcHJvcGVydGllcyBjb250YWlucyBhbiBlbnRyeSwgbG9hZCBpdFxuICAgICAgaWYgKHByb3BlcnRpZXM/LmVudHJ5KVxuICAgICAgICB0aGlzLmxvYWREYXRhRW50cnkodGhpcy5kaW1lbnNpb24ud29ybGQsIHByb3BlcnRpZXMuZW50cnkpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBlbnRpdHlcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgdHJhaXRzIGZvciB0aGUgZW50aXR5XG4gICAgY29uc3QgdHJhaXRzID0gdGhpcy5kaW1lbnNpb24ud29ybGQuZW50aXR5UGFsZXR0ZS5nZXRSZWdpc3RyeUZvcihcbiAgICAgIHRoaXMudHlwZS5pZGVudGlmaWVyXG4gICAgKTtcblxuICAgIC8vIEZldGNoIHRoZSBjb21wb25lbnQgdHlwZSBiYXNlZCB0cmFpdHNcbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLnR5cGUuY29tcG9uZW50cykge1xuICAgICAgLy8gUHJlcGFyZSB0aGUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBvbmVudFxuICAgICAgbGV0IGlkZW50aWZpZXIgPSBjb21wb25lbnQ7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjb21wb25lbnQgc3RhcnRzIHdpdGggYSBuYW1lc3BhY2VcbiAgICAgIGlmIChjb21wb25lbnQuaW5jbHVkZXMoXCI6XCIpKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gY29tcG9uZW50LnNwbGl0KFwiOlwiKTtcbiAgICAgICAgaWRlbnRpZmllciA9IHNwbGl0WzFdIGFzIHN0cmluZztcbiAgICAgIH1cblxuICAgICAgLy8gRmluZCB0aGUgdHJhaXQgZm9yIHRoZSBjb21wb25lbnRcbiAgICAgIGNvbnN0IHRyYWl0ID0gdGhpcy5kaW1lbnNpb24ud29ybGQuZW50aXR5UGFsZXR0ZS5nZXRUcmFpdChpZGVudGlmaWVyKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRyYWl0IGV4aXN0c1xuICAgICAgLy8gSWYgc28sIGFkZCBpdCB0byB0aGUgZW50aXR5XG4gICAgICBpZiAodHJhaXQpIHRyYWl0cy5wdXNoKHRyYWl0KTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgdHJhaXRzIHRvIHRoZSBlbnRpdHlcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRyYWl0cykgaWYgKCF0aGlzLmhhc1RyYWl0KHRyYWl0KSkgdGhpcy5hZGRUcmFpdCh0cmFpdCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXIuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgaXNQbGF5ZXIoKTogdGhpcyBpcyBQbGF5ZXIge1xuICAgIHJldHVybiB0aGlzLnR5cGUuaWRlbnRpZmllciA9PT0gRW50aXR5SWRlbnRpZmllci5QbGF5ZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBlbnRpdHkgaXMgYW4gaXRlbS5cbiAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGVudGl0eSBpcyBhbiBpdGVtLlxuICAgKi9cbiAgcHVibGljIGlzSXRlbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50eXBlLmlkZW50aWZpZXIgPT09IEVudGl0eUlkZW50aWZpZXIuSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnRpdHkgaXMgc25lYWtpbmcgb3Igbm90LlxuICAgKi9cbiAgcHVibGljIGdldCBpc1NuZWFraW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZsYWdzLmdldChBY3RvckZsYWcuU25lYWtpbmcpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudGl0eSBpcyBzcHJpbnRpbmcgb3Igbm90LlxuICAgKi9cbiAgcHVibGljIGdldCBpc1NwcmludGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mbGFncy5nZXQoQWN0b3JGbGFnLlNwcmludGluZykgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZW50aXR5IGlzIHN3aW1taW5nIG9yIG5vdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNTd2ltbWluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mbGFncy5nZXQoQWN0b3JGbGFnLlN3aW1taW5nKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQncyBhbiBlZmZlY3QgdG8gdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIGVmZmVjdFR5cGUgVGhlIGVmZmVjdCB0eXBlIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbnRpdHlcbiAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBvZiB0aGUgZWZmZWN0IGluIHNlY29uZHMuXG4gICAqIEBwYXJhbSBhbXBsaWZpZXIgVGhlIGFtcGxpZmllciBvZiB0aGUgZWZmZWN0LlxuICAgKiBAcGFyYW0gc2hvd1BhcnRpY2xlcyBXZXRoZXIgb3Igbm90IHRoZSBlZmZlY3Qgd2lsbCBzaG93IHBhcnRpY2xlcy5cbiAgICogVE9ETzogUmVmYWN0b3IgbWV0aG9kIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgYWRkRWZmZWN0KFxuICAgIGVmZmVjdFR5cGU6IEVmZmVjdFR5cGUsXG4gICAgZHVyYXRpb246IG51bWJlcixcbiAgICBvcHRpb25zPzogRW50aXR5RWZmZWN0T3B0aW9uc1xuICApOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgZW50aXR5IGRvZXNuJ3QgaGF2ZSB0aGUgZWZmZWN0cyB0cmFpdCwgYWRkIHRoZSB0cmFpdFxuICAgIGNvbnN0IGVmZmVjdFRyYWl0ID1cbiAgICAgIHRoaXMuZ2V0VHJhaXQoRW50aXR5RWZmZWN0c1RyYWl0KSA/PyB0aGlzLmFkZFRyYWl0KEVudGl0eUVmZmVjdHNUcmFpdCk7XG5cbiAgICAvLyBBZGQgdGhlIGVmZmVjdCB0byB0aGUgZW50aXR5LlxuICAgIGVmZmVjdFRyYWl0LmFkZChlZmZlY3RUeXBlLCBkdXJhdGlvbiAqIDQwLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVmZmVjdCBmcm9tIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSBlZmZlY3RUeXBlIFRoZSBlZmZlY3QgdHlwZSB0byByZW1vdmUgZnJvbSB0aGUgZW50aXR5XG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRWZmZWN0KGVmZmVjdFR5cGU6IEVmZmVjdFR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBlZmZlY3RUcmFpdCA9IHRoaXMuZ2V0VHJhaXQoRW50aXR5RWZmZWN0c1RyYWl0KTtcbiAgICBpZiAoIWVmZmVjdFRyYWl0IHx8ICFlZmZlY3RUcmFpdC5oYXMoZWZmZWN0VHlwZSkpIHJldHVybjtcblxuICAgIGVmZmVjdFRyYWl0LnJlbW92ZShlZmZlY3RUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZW50aXR5IGhhcyB0aGUgZWZmZWN0IG9yIG5vdC5cbiAgICogQHBhcmFtIGVmZmVjdFR5cGUgVGhlIGVmZmVjdCB0eXBlIHRvIGNoZWNrIGlmIHRoZSBlbnRpdHkgaGFzLlxuICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBlbnRpdHkgaGFzIHRoZSBlZmZlY3Qgb3Igbm90LlxuICAgKi9cbiAgcHVibGljIGhhc0VmZmVjdChlZmZlY3RUeXBlOiBFZmZlY3RUeXBlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZWZmZWN0VHJhaXQgPSB0aGlzLmdldFRyYWl0KEVudGl0eUVmZmVjdHNUcmFpdCk7XG4gICAgcmV0dXJuIGVmZmVjdFRyYWl0Py5oYXMoZWZmZWN0VHlwZSkgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZW50aXR5IGhhcyB0aGUgc3BlY2lmaWVkIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIGNoZWNrIGZvclxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBlbnRpdHkgaGFzIHRoZSB0cmFpdFxuICAgKi9cbiAgcHVibGljIGhhc1RyYWl0KHRyYWl0OiBzdHJpbmcgfCB0eXBlb2YgRW50aXR5VHJhaXQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFpdHMuaGFzKFxuICAgICAgdHlwZW9mIHRyYWl0ID09PSBcInN0cmluZ1wiID8gdHJhaXQgOiB0cmFpdC5pZGVudGlmaWVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgdmlldyBkaXJlY3Rpb24gdmVjdG9yIGJhc2VkIG9uIHRoZSBjdXJyZW50IHBpdGNoIGFuZCB5YXcgcm90YXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFZlY3RvcjNmIHJlcHJlc2VudGluZyB0aGUgZGlyZWN0aW9uIHRoZSB2aWV3IGlzIHBvaW50aW5nLlxuICAgKi9cbiAgcHVibGljIGdldFZpZXdEaXJlY3Rpb24oKTogVmVjdG9yM2Yge1xuICAgIC8vIENvbnZlcnQgcGl0Y2ggYW5kIHlhdyBhbmdsZXMgZnJvbSBkZWdyZWVzIHRvIHJhZGlhbnNcbiAgICBjb25zdCBwaXRjaFJhZGlhbnMgPSB0aGlzLnJvdGF0aW9uLnBpdGNoICogKE1hdGguUEkgLyAxODApO1xuICAgIGNvbnN0IHlhd1JhZGlhbnMgPSAtdGhpcy5yb3RhdGlvbi5oZWFkWWF3ICogKE1hdGguUEkgLyAxODApOyAvLyBJbnZlcnQgeWF3IGZvciBjb3JyZWN0IG9yaWVudGF0aW9uXG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRpcmVjdGlvbiB2ZWN0b3IgY29tcG9uZW50c1xuICAgIHJldHVybiBuZXcgVmVjdG9yM2YoXG4gICAgICBNYXRoLnNpbih5YXdSYWRpYW5zKSAqIE1hdGguY29zKHBpdGNoUmFkaWFucyksIC8vIFggY29tcG9uZW50IG9mIHRoZSB2aWV3IHZlY3RvclxuICAgICAgLU1hdGguc2luKHBpdGNoUmFkaWFucyksIC8vIFkgY29tcG9uZW50IG9mIHRoZSB2aWV3IHZlY3RvciAobmVnYXRpdmUgZm9yIGNvcnJlY3Qgb3JpZW50YXRpb24pXG4gICAgICBNYXRoLmNvcyh5YXdSYWRpYW5zKSAqIE1hdGguY29zKHBpdGNoUmFkaWFucykgLy8gWiBjb21wb25lbnQgb2YgdGhlIHZpZXcgdmVjdG9yXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgdHJhaXQgZnJvbSB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIGdldCBmcm9tIHRoZSBlbnRpdHlcbiAgICogQHJldHVybnMgVGhlIHRyYWl0IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFpdDxUIGV4dGVuZHMgdHlwZW9mIEVudGl0eVRyYWl0Pih0cmFpdDogVCk6IEluc3RhbmNlVHlwZTxUPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHRyYWl0IGZyb20gdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBnZXQgZnJvbSB0aGUgZW50aXR5XG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhaXQodHJhaXQ6IHN0cmluZyk6IEVudGl0eVRyYWl0IHwgbnVsbDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHRyYWl0IGZyb20gdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBnZXQgZnJvbSB0aGUgZW50aXR5XG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhaXQodHJhaXQ6IHN0cmluZyB8IHR5cGVvZiBFbnRpdHlUcmFpdCk6IEVudGl0eVRyYWl0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhaXRzLmdldChcbiAgICAgIHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllclxuICAgICkgYXMgRW50aXR5VHJhaXQgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVHJhaXQodHJhaXQ6IHN0cmluZyB8IHR5cGVvZiBFbnRpdHlUcmFpdCk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgdHJhaXQgZnJvbSB0aGUgZW50aXR5XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnRyYWl0cy5nZXQoXG4gICAgICB0eXBlb2YgdHJhaXQgPT09IFwic3RyaW5nXCIgPyB0cmFpdCA6IHRyYWl0LmlkZW50aWZpZXJcbiAgICApO1xuXG4gICAgLy8gQ2FsbCB0aGUgb25SZW1vdmUgdHJhaXQgZXZlbnRcbiAgICBpbnN0YW5jZT8ub25SZW1vdmU/LigpO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBlbnRpdHlcbiAgICB0aGlzLnRyYWl0cy5kZWxldGUodHlwZW9mIHRyYWl0ID09PSBcInN0cmluZ1wiID8gdHJhaXQgOiB0cmFpdC5pZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdHJhaXQgdG8gdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBhZGRcbiAgICogQHJldHVybnMgVGhlIHRyYWl0IHRoYXQgd2FzIGFkZGVkXG4gICAqL1xuICBwdWJsaWMgYWRkVHJhaXQ8VCBleHRlbmRzIHR5cGVvZiBFbnRpdHlUcmFpdD4oXG4gICAgdHJhaXQ6IFQgfCBFbnRpdHlUcmFpdFxuICApOiBJbnN0YW5jZVR5cGU8VD4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBhbHJlYWR5IGV4aXN0c1xuICAgIGlmICh0aGlzLnRyYWl0cy5oYXModHJhaXQuaWRlbnRpZmllcikpXG4gICAgICByZXR1cm4gdGhpcy5nZXRUcmFpdCh0cmFpdC5pZGVudGlmaWVyKSBhcyBJbnN0YW5jZVR5cGU8VD47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgaXMgaW4gdGhlIHBhbGV0dGVcbiAgICBpZiAoIXRoaXMuZ2V0V29ybGQoKS5lbnRpdHlQYWxldHRlLnRyYWl0cy5oYXModHJhaXQuaWRlbnRpZmllcikpXG4gICAgICB0aGlzLmdldFdvcmxkKCkubG9nZ2VyLndhcm4oXG4gICAgICAgIGBUcmFpdCBcIsKnYyR7dHJhaXQuaWRlbnRpZmllcn3Cp3JcIiB3YXMgYWRkZWQgdG8gZW50aXR5IFwiwqdkJHt0aGlzLnR5cGUuaWRlbnRpZmllcn3Cp3I6wqdkJHt0aGlzLnVuaXF1ZUlkfcKnclwiIGluIGRpbWVuc2lvbiBcIsKnYSR7dGhpcy5kaW1lbnNpb24uaWRlbnRpZmllcn3Cp3JcIiBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGUuIFRoaXMgbWF5IHJlc3VsdCBpbiBhIGRlc2VyaWxpemF0aW9uIGVycm9yLmBcbiAgICAgICk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGFkZCB0aGUgdHJhaXQgdG8gdGhlIGVudGl0eVxuICAgIHRyeSB7XG4gICAgICBpZiAodHJhaXQgaW5zdGFuY2VvZiBFbnRpdHlUcmFpdCkge1xuICAgICAgICAvLyBBZGQgdGhlIHRyYWl0IHRvIHRoZSBlbnRpdHlcbiAgICAgICAgdGhpcy50cmFpdHMuc2V0KHRyYWl0LmlkZW50aWZpZXIsIHRyYWl0KTtcblxuICAgICAgICAvLyBDYWxsIHRoZSBvbkFkZCB0cmFpdCBldmVudFxuICAgICAgICB0cmFpdC5vbkFkZD8uKCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB0cmFpdCB0aGF0IHdhcyBhZGRlZFxuICAgICAgICByZXR1cm4gdHJhaXQgYXMgSW5zdGFuY2VUeXBlPFQ+O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0cmFpdFxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0cmFpdCh0aGlzKSBhcyBJbnN0YW5jZVR5cGU8VD47XG5cbiAgICAgICAgLy8gQWRkIHRoZSB0cmFpdCB0byB0aGUgZW50aXR5XG4gICAgICAgIHRoaXMudHJhaXRzLnNldCh0cmFpdC5pZGVudGlmaWVyLCBpbnN0YW5jZSk7XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgb25BZGQgdHJhaXQgZXZlbnRcbiAgICAgICAgaW5zdGFuY2Uub25BZGQ/LigpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgdHJhaXQgdGhhdCB3YXMgYWRkZWRcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvciB0byB0aGUgY29uc29sZVxuICAgICAgdGhpcy5zZXJlbml0eS5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gYWRkIHRyYWl0IFwiJHt0cmFpdC5pZGVudGlmaWVyfVwiIHRvIGVudGl0eSBcIiR7dGhpcy50eXBlLmlkZW50aWZpZXJ9OiR7dGhpcy51bmlxdWVJZH1cIiBpbiBkaW1lbnNpb24gXCIke3RoaXMuZGltZW5zaW9uLmlkZW50aWZpZXJ9XCJgLFxuICAgICAgICByZWFzb25cbiAgICAgICk7XG5cbiAgICAgIC8vIFJldHVybiBudWxsIGFzIHRoZSB0cmFpdCB3YXMgbm90IGFkZGVkXG4gICAgICByZXR1cm4gbnVsbCBhcyBJbnN0YW5jZVR5cGU8VD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHdvcmxkIHRoZSBlbnRpdHkgaXMgY3VycmVudGx5IGluLlxuICAgKiBAcmV0dXJucyBUaGUgd29ybGQgdGhlIGVudGl0eSBpcyBpblxuICAgKi9cbiAgcHVibGljIGdldFdvcmxkKCk6IFdvcmxkIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24ud29ybGQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY2h1bmsgdGhlIGVudGl0eSBpcyBjdXJyZW50bHkgaW4uXG4gICAqIEByZXR1cm5zIFRoZSBjaHVuayB0aGUgZW50aXR5IGlzIGluXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2h1bmsoKTogQ2h1bmsge1xuICAgIC8vIENvbnZlcnQgdGhlIHBvc2l0aW9uIHRvIGEgY2h1bmsgcG9zaXRpb25cbiAgICBjb25zdCBjeCA9IHRoaXMucG9zaXRpb24ueCA+PiA0O1xuICAgIGNvbnN0IGN6ID0gdGhpcy5wb3NpdGlvbi56ID4+IDQ7XG5cbiAgICAvLyBHZXQgdGhlIGNodW5rIGZyb20gdGhlIGRpbWVuc2lvblxuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbi5nZXRDaHVuayhjeCwgY3opO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGl0ZW0gdGhlIGVudGl0eSBpcyBjdXJyZW50bHkgaG9sZGluZy5cbiAgICogQHJldHVybnMgVGhlIGl0ZW0gdGhlIGVudGl0eSBpcyBob2xkaW5nXG4gICAqL1xuICBwdWJsaWMgZ2V0SGVsZEl0ZW0oKTogSXRlbVN0YWNrIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYW4gaW52ZW50b3J5IHRyYWl0XG4gICAgaWYgKCF0aGlzLmhhc1RyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBHZXQgdGhlIGludmVudG9yeSB0cmFpdFxuICAgIGNvbnN0IGludmVudG9yeSA9IHRoaXMuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBoZWxkIGl0ZW1cbiAgICByZXR1cm4gaW52ZW50b3J5LmdldEhlbGRJdGVtKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY2FyZGluYWwgZGlyZWN0aW9uIG9mIHRoZSBlbnRpdHkuXG4gICAqIEByZXR1cm5zIFRoZSBjYXJkaW5hbCBkaXJlY3Rpb24gb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBnZXRDYXJkaW5hbERpcmVjdGlvbigpOiBDYXJkaW5hbERpcmVjdGlvbiB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBjYXJkaW5hbCBkaXJlY3Rpb24gb2YgdGhlIGVudGl0eVxuICAgIC8vIEVudGl0eSB5YXcgaXMgLTE4MCB0byAxODBcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcm90YXRpb24gb2YgdGhlIGVudGl0eVxuICAgIGNvbnN0IHJvdGF0aW9uID0gKE1hdGguZmxvb3IodGhpcy5yb3RhdGlvbi55YXcpICsgMzYwKSAlIDM2MDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgY2FyZGluYWwgZGlyZWN0aW9uXG4gICAgaWYgKHJvdGF0aW9uID49IDMxNSB8fCByb3RhdGlvbiA8IDQ1KSByZXR1cm4gQ2FyZGluYWxEaXJlY3Rpb24uU291dGg7XG4gICAgaWYgKHJvdGF0aW9uID49IDQ1ICYmIHJvdGF0aW9uIDwgMTM1KSByZXR1cm4gQ2FyZGluYWxEaXJlY3Rpb24uV2VzdDtcbiAgICBpZiAocm90YXRpb24gPj0gMTM1ICYmIHJvdGF0aW9uIDwgMjI1KSByZXR1cm4gQ2FyZGluYWxEaXJlY3Rpb24uTm9ydGg7XG4gICAgaWYgKHJvdGF0aW9uID49IDIyNSAmJiByb3RhdGlvbiA8IDMxNSkgcmV0dXJuIENhcmRpbmFsRGlyZWN0aW9uLkVhc3Q7XG5cbiAgICByZXR1cm4gQ2FyZGluYWxEaXJlY3Rpb24uU291dGg7XG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIHRoZSBlbnRpdHkgaW50byB0aGUgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHNwYXduKCk6IHRoaXMge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBFbnRpdHlTcGF3bmVkU2lnbmFsXG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IEVudGl0eVNwYXduZWRTaWduYWwodGhpcywgdGhpcy5kaW1lbnNpb24pLmVtaXQoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGxlZFxuICAgIGlmICghc2lnbmFsKSByZXR1cm4gdGhpcztcblxuICAgIC8vIEFkZCB0aGUgZW50aXR5IHRvIHRoZSBkaW1lbnNpb25cbiAgICB0aGlzLmRpbWVuc2lvbi5lbnRpdGllcy5zZXQodGhpcy51bmlxdWVJZCwgdGhpcyk7XG5cbiAgICAvLyBTZXQgdGhlIGVudGl0eSBhcyBhbGl2ZVxuICAgIHRoaXMuaXNBbGl2ZSA9IHRydWU7XG5cbiAgICAvLyBUcmlnZ2VyIHRoZSBlbnRpdHkgb25TcGF3biB0cmFpdCBldmVudFxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gdHJpZ2dlciB0aGUgb25TcGF3biB0cmFpdCBldmVudFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2FsbCB0aGUgb25TcGF3biB0cmFpdCBldmVudFxuICAgICAgICB0cmFpdC5vblNwYXduPy4oKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgIHRoaXMuc2VyZW5pdHkubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdHJpZ2dlciBvblNwYXduIHRyYWl0IGV2ZW50IGZvciBlbnRpdHkgXCIke3RoaXMudHlwZS5pZGVudGlmaWVyfToke3RoaXMudW5pcXVlSWR9XCIgaW4gZGltZW5zaW9uIFwiJHt0aGlzLmRpbWVuc2lvbi5pZGVudGlmaWVyfVwiYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIGVudGl0eVxuICAgICAgICB0aGlzLnRyYWl0cy5kZWxldGUodHJhaXQuaWRlbnRpZmllcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBlbnRpdHkgYWN0b3IgZGF0YSAmIGF0dHJpYnV0ZXNcbiAgICB0aGlzLm1ldGFkYXRhLnVwZGF0ZSgpO1xuICAgIHRoaXMuYXR0cmlidXRlcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgZW50aXR5XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVzcGF3bnMgdGhlIGVudGl0eSBmcm9tIHRoZSBkaW1lbnNpb24uXG4gICAqL1xuICBwdWJsaWMgZGVzcGF3bigpOiB0aGlzIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRW50aXR5RGVzcGF3bmVkU2lnbmFsXG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IEVudGl0eURlc3Bhd25lZFNpZ25hbCh0aGlzLCB0aGlzLmRpbWVuc2lvbikuZW1pdCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNpZ25hbCB3YXMgY2FuY2VsbGVkXG4gICAgaWYgKCFzaWduYWwpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gU2V0IHRoZSBlbnRpdHkgYXMgbm90IGFsaXZlXG4gICAgdGhpcy5pc0FsaXZlID0gZmFsc2U7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGVudGl0eSBmcm9tIHRoZSBkaW1lbnNpb25cbiAgICB0aGlzLmRpbWVuc2lvbi5lbnRpdGllcy5kZWxldGUodGhpcy51bmlxdWVJZCk7XG5cbiAgICAvLyBUcmlnZ2VyIHRoZSBlbnRpdHkgb25EZXNwYXduIHRyYWl0IGV2ZW50XG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiB0aGlzLnRyYWl0cy52YWx1ZXMoKSkge1xuICAgICAgLy8gQXR0ZW1wdCB0byB0cmlnZ2VyIHRoZSBvbkRlc3Bhd24gdHJhaXQgZXZlbnRcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENhbGwgdGhlIG9uRGVzcGF3biB0cmFpdCBldmVudFxuICAgICAgICB0cmFpdC5vbkRlc3Bhd24/LigpO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgdGhpcy5zZXJlbml0eS5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byB0cmlnZ2VyIG9uRGVzcGF3biB0cmFpdCBldmVudCBmb3IgZW50aXR5IFwiJHt0aGlzLnR5cGUuaWRlbnRpZmllcn06JHt0aGlzLnVuaXF1ZUlkfVwiIGluIGRpbWVuc2lvbiBcIiR7dGhpcy5kaW1lbnNpb24uaWRlbnRpZmllcn1cImAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBlbnRpdHlcbiAgICAgICAgdGhpcy50cmFpdHMuZGVsZXRlKHRyYWl0LmlkZW50aWZpZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgZW50aXR5XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogS2lsbHMgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBraWxsKGRhbWFnaW5nRW50aXR5PzogRW50aXR5LCBkYW1hZ2VDYXVzZT86IEFjdG9yRGFtYWdlQ2F1c2UpOiB2b2lkIHtcbiAgICBuZXcgRW50aXR5RGllU2lnbmFsKHRoaXMsIGRhbWFnaW5nRW50aXR5LCBkYW1hZ2VDYXVzZSkuZW1pdCgpO1xuXG4gICAgLy8gU2V0IHRoZSBlbnRpdHkgYXMgbm90IGFsaXZlXG4gICAgdGhpcy5pc0FsaXZlID0gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhbiBpbnZlbnRvcnkgdHJhaXRcbiAgICBpZiAodGhpcy5oYXNUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCkpIHtcbiAgICAgIC8vIEdldCB0aGUgaW52ZW50b3J5IHRyYWl0XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciwgaW52ZW50b3J5U2l6ZSB9ID0gdGhpcy5nZXRUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgaW52ZW50b3J5IHNsb3RzXG4gICAgICBmb3IgKGxldCBzbG90ID0gMDsgc2xvdCA8IGludmVudG9yeVNpemU7IHNsb3QrKykge1xuICAgICAgICAvLyBHZXQgdGhlIGl0ZW0gZnJvbSB0aGUgc2xvdFxuICAgICAgICBjb25zdCBpdGVtID0gY29udGFpbmVyLmdldEl0ZW0oc2xvdCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgdmFsaWRcbiAgICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgICAvLyBTcGF3biB0aGUgaXRlbSBpbiB0aGUgZGltZW5zaW9uXG4gICAgICAgIHRoaXMuZGltZW5zaW9uLnNwYXduSXRlbShpdGVtLCB0aGlzLnBvc2l0aW9uKTtcblxuICAgICAgICAvLyBDbGVhciB0aGUgc2xvdFxuICAgICAgICBjb250YWluZXIuY2xlYXJTbG90KHNsb3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGEgaGVhbHRoIHRyYWl0XG4gICAgaWYgKHRoaXMuaGFzVHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpKSB7XG4gICAgICAvLyBHZXQgdGhlIGhlYWx0aCB0cmFpdFxuICAgICAgY29uc3QgaGVhbHRoID0gdGhpcy5nZXRUcmFpdChFbnRpdHlIZWFsdGhUcmFpdCk7XG5cbiAgICAgIC8vIFNldCB0aGUgaGVhbHRoIHRvIG1pbmltdW0gdmFsdWVcbiAgICAgIGhlYWx0aC5jdXJyZW50VmFsdWUgPSBoZWFsdGguZWZmZWN0aXZlTWluO1xuICAgIH1cblxuICAgIC8vIFNjaGVkdWxlIHRoZSBlbnRpdHkgdG8gZGVzcGF3blxuICAgIHRoaXMuZGltZW5zaW9uLnNjaGVkdWxlKDUwKS5vbigoKSA9PiB7XG4gICAgICAvLyBJZiB0aGUgZW50aXR5IGlzIG5vdCBhIHBsYXllciwgZGVzcGF3biB0aGUgZW50aXR5XG4gICAgICBpZiAoIXRoaXMuaXNQbGF5ZXIoKSkgdGhpcy5kZXNwYXduKCk7XG4gICAgICAvLyBNYW51YWxseSB0cmlnZ2VyIHRoZSBvbkRlc3Bhd24gdHJhaXQgZXZlbnQgZm9yIHBsYXllcnNcbiAgICAgIC8vIFdlIGRvZXMgdGhpcyBiZWNhdXNlIHRoZSBwbGF5ZXIgaGFzIHRoZSBvcHRpb24gdG8gZGlzY29ubmVjdCBhdCB0aGUgcmVzcGF3biBzY3JlZW5cbiAgICAgIGVsc2UgZm9yIChjb25zdCB0cmFpdCBvZiB0aGlzLnRyYWl0cy52YWx1ZXMoKSkgdHJhaXQub25EZXNwYXduPy4oKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXVzZXMgYSBwbGF5ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpcyBpbnRlcmFjdGluZyB3aXRoIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0aGF0IHRoZSBwbGF5ZXIgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgaW50ZXJhY3QocGxheWVyOiBQbGF5ZXIsIG1ldGhvZDogRW50aXR5SW50ZXJhY3RNZXRob2QpOiB2b2lkIHtcbiAgICBpZiAobWV0aG9kID09PSBFbnRpdHlJbnRlcmFjdE1ldGhvZC5JbnRlcmFjdCkge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IFBsYXllckludGVyYWN0V2l0aEVudGl0eVNpZ25hbChcbiAgICAgICAgcGxheWVyLFxuICAgICAgICB0aGlzLFxuICAgICAgICBwbGF5ZXIuZ2V0SGVsZEl0ZW0oKSxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcbiAgICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBuZXcgRW50aXR5SGl0U2lnbmFsKHBsYXllciwgdGhpcyk7XG5cbiAgICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXIgdGhlIGVudGl0eSBvbkludGVyYWN0IHRyYWl0IGV2ZW50XG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiB0aGlzLnRyYWl0cy52YWx1ZXMoKSkge1xuICAgICAgLy8gQXR0ZW1wdCB0byB0cmlnZ2VyIHRoZSBvbkludGVyYWN0IHRyYWl0IGV2ZW50XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDYWxsIHRoZSBvbkludGVyYWN0IHRyYWl0IGV2ZW50XG4gICAgICAgIHRyYWl0Lm9uSW50ZXJhY3Q/LihwbGF5ZXIsIG1ldGhvZCk7XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciB0byB0aGUgY29uc29sZVxuICAgICAgICB0aGlzLnNlcmVuaXR5LmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHRyaWdnZXIgb25JbnRlcmFjdCB0cmFpdCBldmVudCBmb3IgZW50aXR5IFwiJHt0aGlzLnR5cGUuaWRlbnRpZmllcn06JHt0aGlzLnVuaXF1ZUlkfVwiIGluIGRpbWVuc2lvbiBcIiR7dGhpcy5kaW1lbnNpb24uaWRlbnRpZmllcn1cImAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBlbnRpdHlcbiAgICAgICAgdGhpcy50cmFpdHMuZGVsZXRlKHRyYWl0LmlkZW50aWZpZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjb250YWluZXIgZnJvbSB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIGdldENvbnRhaW5lcihcbiAgICBuYW1lOiBDb250YWluZXJOYW1lLFxuICAgIGR5bmFtaWNJZD86IG51bWJlclxuICApOiBDb250YWluZXIgfCBudWxsIHtcbiAgICAvLyBDaGVjayBpZiBhIGR5bmFtaWMgaWQgd2FzIHByb3ZpZGVkXG4gICAgaWYgKGR5bmFtaWNJZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYW4gaW52ZW50b3J5IHRyYWl0XG4gICAgICBpZiAoIXRoaXMuaGFzVHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgLy8gR2V0IHRoZSBpbnZlbnRvcnkgdHJhaXRcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSB0aGlzLmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBpdGVtcyBpbiB0aGUgY29udGFpbmVyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29udGFpbmVyLnN0b3JhZ2UpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgdmFsaWRcbiAgICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBoYXMgYSBJdGVtQnVuZGxlVHJhaXRcbiAgICAgICAgaWYgKGl0ZW0uaGFzVHJhaXQoSXRlbUJ1bmRsZVRyYWl0KSkge1xuICAgICAgICAgIC8vIEdldCB0aGUgYnVuZGxlIHRyYWl0XG4gICAgICAgICAgY29uc3QgYnVuZGxlID0gaXRlbS5nZXRUcmFpdChJdGVtQnVuZGxlVHJhaXQpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1bmRsZSBoYXMgdGhlIGR5bmFtaWMgaWRcbiAgICAgICAgICBpZiAoYnVuZGxlLmR5bmFtaWNJZCA9PT0gZHluYW1pY0lkKSByZXR1cm4gYnVuZGxlLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN3aXRjaCBuYW1lIG9mIHRoZSBjb250YWluZXJcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gUmV0dXJuIG51bGwgaWYgdGhlIGNvbnRhaW5lciBuYW1lIGlzIG5vdCB2YWxpZFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gY2FzZSBDb250YWluZXJOYW1lLkFybW9yOiB7XG4gICAgICAvLyAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGludmVudG9yeSBjb21wb25lbnRcbiAgICAgIC8vICAgaWYgKCF0aGlzLmhhc0NvbXBvbmVudChcIm1pbmVjcmFmdDppbnZlbnRvcnlcIikpXG4gICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGVudGl0eSBkb2VzIG5vdCBoYXZlIGFuIGludmVudG9yeSBjb21wb25lbnQuXCIpO1xuXG4gICAgICAvLyAgIC8vIEdldCB0aGUgaW52ZW50b3J5IGNvbXBvbmVudFxuICAgICAgLy8gICBjb25zdCBpbnZlbnRvcnkgPSB0aGlzLmdldENvbXBvbmVudChcIm1pbmVjcmFmdDppbnZlbnRvcnlcIik7XG5cbiAgICAgIC8vICAgLy8gUmV0dXJuIHRoZSBhcm1vciBjb250YWluZXJcbiAgICAgIC8vICAgcmV0dXJuIGludmVudG9yeS5jb250YWluZXI7XG4gICAgICAvLyB9XG5cbiAgICAgIGNhc2UgQ29udGFpbmVyTmFtZS5Bcm1vcjoge1xuICAgICAgICBpZiAoIXRoaXMuaGFzVHJhaXQoRW50aXR5RXF1aXBtZW50VHJhaXQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwbGF5ZXIgZG9lcyBub3QgaGF2ZSBhbiBlcXVpcG1lbnQgdHJhaXQuXCIpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgZXF1aXBtZW50IHRyYWl0XG4gICAgICAgIGNvbnN0IGVxdWlwbWVudCA9IHRoaXMuZ2V0VHJhaXQoRW50aXR5RXF1aXBtZW50VHJhaXQpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgZXF1aXBtZW50IGNvbnRhaW5lclxuICAgICAgICByZXR1cm4gZXF1aXBtZW50LmNvbnRhaW5lcjtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250YWluZXJOYW1lLkhvdGJhcjpcbiAgICAgIGNhc2UgQ29udGFpbmVyTmFtZS5JbnZlbnRvcnk6XG4gICAgICBjYXNlIENvbnRhaW5lck5hbWUuSG90YmFyQW5kSW52ZW50b3J5OiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGludmVudG9yeSB0cmFpdFxuICAgICAgICBpZiAoIXRoaXMuaGFzVHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBlbnRpdHkgZG9lcyBub3QgaGF2ZSBhbiBpbnZlbnRvcnkgdHJhaXQuXCIpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgaW52ZW50b3J5IHRyYWl0XG4gICAgICAgIGNvbnN0IGludmVudG9yeSA9IHRoaXMuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgaW52ZW50b3J5IGNvbnRhaW5lclxuICAgICAgICByZXR1cm4gaW52ZW50b3J5LmNvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHZlY3RvciBUaGUgcG9zaXRpb24gdG8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldE1vdGlvbih2ZWN0b3I/OiBWZWN0b3IzZik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmVsb2NpdHkgb2YgdGhlIGVudGl0eVxuICAgIHRoaXMudmVsb2NpdHkueCA9IHZlY3Rvcj8ueCA/PyB0aGlzLnZlbG9jaXR5Lng7XG4gICAgdGhpcy52ZWxvY2l0eS55ID0gdmVjdG9yPy55ID8/IHRoaXMudmVsb2NpdHkueTtcbiAgICB0aGlzLnZlbG9jaXR5LnogPSB2ZWN0b3I/LnogPz8gdGhpcy52ZWxvY2l0eS56O1xuXG4gICAgdGhpcy5wb3NpdGlvbi54ICs9IHRoaXMudmVsb2NpdHkueDtcbiAgICB0aGlzLnBvc2l0aW9uLnkgKz0gdGhpcy52ZWxvY2l0eS55O1xuICAgIHRoaXMucG9zaXRpb24ueiArPSB0aGlzLnZlbG9jaXR5Lno7XG5cbiAgICAvLyBTZXQgdGhlIG9uR3JvdW5kIHByb3BlcnR5IG9mIHRoZSBlbnRpdHlcbiAgICB0aGlzLm9uR3JvdW5kID0gZmFsc2U7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgU2V0QWN0b3JNb3Rpb25QYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgU2V0QWN0b3JNb3Rpb25QYWNrZXQoKTtcblxuICAgIC8vIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGFja2V0XG4gICAgcGFja2V0LnJ1bnRpbWVJZCA9IHRoaXMucnVudGltZUlkO1xuICAgIHBhY2tldC5tb3Rpb24gPSB0aGlzLnZlbG9jaXR5O1xuICAgIHBhY2tldC5pbnB1dFRpY2sgPSB0aGlzLmlzUGxheWVyKClcbiAgICAgID8gdGhpcy5pbnB1dFRpY2tcbiAgICAgIDogdGhpcy5kaW1lbnNpb24ud29ybGQuY3VycmVudFRpY2s7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgZGltZW5zaW9uXG4gICAgdGhpcy5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtb3Rpb24gdG8gdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHZlY3RvciBUaGUgbW90aW9uIHRvIGFkZC5cbiAgICovXG4gIHB1YmxpYyBhZGRNb3Rpb24odmVjdG9yOiBWZWN0b3IzZik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmVsb2NpdHkgb2YgdGhlIGVudGl0eVxuICAgIHRoaXMudmVsb2NpdHkueCArPSB2ZWN0b3IueDtcbiAgICB0aGlzLnZlbG9jaXR5LnkgKz0gdmVjdG9yLnk7XG4gICAgdGhpcy52ZWxvY2l0eS56ICs9IHZlY3Rvci56O1xuXG4gICAgLy8gU2V0IHRoZSBtb3Rpb24gb2YgdGhlIGVudGl0eVxuICAgIHRoaXMuc2V0TW90aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBtb3Rpb24gb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyBjbGVhck1vdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnZlbG9jaXR5LnggPSAwO1xuICAgIHRoaXMudmVsb2NpdHkueSA9IDA7XG4gICAgdGhpcy52ZWxvY2l0eS56ID0gMDtcblxuICAgIC8vIFNldCB0aGUgbW90aW9uIG9mIHRoZSBlbnRpdHlcbiAgICB0aGlzLnNldE1vdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYW4gaW1wdWxzZSB0byB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gdmVjdG9yIFRoZSBpbXB1bHNlIHRvIGFwcGx5LlxuICAgKi9cbiAgcHVibGljIGFwcGx5SW1wdWxzZSh2ZWN0b3I6IFZlY3RvcjNmKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2ZWxvY2l0eSBvZiB0aGUgZW50aXR5XG4gICAgdGhpcy52ZWxvY2l0eS54ICs9IHZlY3Rvci54O1xuICAgIHRoaXMudmVsb2NpdHkueSArPSB2ZWN0b3IueTtcbiAgICB0aGlzLnZlbG9jaXR5LnogKz0gdmVjdG9yLno7XG5cbiAgICAvLyBTZXQgdGhlIG1vdGlvbiBvZiB0aGUgZW50aXR5XG4gICAgdGhpcy5zZXRNb3Rpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyB0ZWxlcG9ydChwb3NpdGlvbjogVmVjdG9yM2YsIGRpbWVuc2lvbj86IERpbWVuc2lvbik6IHZvaWQge1xuICAgIC8vIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGVudGl0eVxuICAgIHRoaXMucG9zaXRpb24ueCA9IHBvc2l0aW9uLng7XG4gICAgdGhpcy5wb3NpdGlvbi55ID0gcG9zaXRpb24ueTtcbiAgICB0aGlzLnBvc2l0aW9uLnogPSBwb3NpdGlvbi56O1xuXG4gICAgLy8gQ2hlY2sgaWYgYSBkaW1lbnNpb24gd2FzIHByb3ZpZGVkXG4gICAgaWYgKGRpbWVuc2lvbikge1xuICAgICAgY29uc3Qgc2lnbmFsID0gbmV3IEVudGl0eURpbWVuc2lvbkNoYW5nZVNpZ25hbChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5kaW1lbnNpb24sXG4gICAgICAgIGRpbWVuc2lvblxuICAgICAgKTtcblxuICAgICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm47XG5cbiAgICAgIC8vIERlc3Bhd24gdGhlIGVudGl0eSBmcm9tIHRoZSBjdXJyZW50IGRpbWVuc2lvblxuICAgICAgdGhpcy5kZXNwYXduKCk7XG5cbiAgICAgIC8vIFNldCB0aGUgZGltZW5zaW9uIG9mIHRoZSBlbnRpdHlcbiAgICAgIHRoaXMuZGltZW5zaW9uID0gZGltZW5zaW9uO1xuXG4gICAgICAvLyBTcGF3biB0aGUgZW50aXR5IGluIHRoZSBuZXcgZGltZW5zaW9uXG4gICAgICB0aGlzLnNwYXduKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBNb3ZlQWN0b3JEZWx0YVBhY2tldFxuICAgICAgY29uc3QgcGFja2V0ID0gbmV3IE1vdmVBY3RvckRlbHRhUGFja2V0KCk7XG5cbiAgICAgIC8vIEFzc2lnbiB0aGUgcGFja2V0IHByb3BlcnRpZXNcbiAgICAgIHBhY2tldC5ydW50aW1lSWQgPSB0aGlzLnJ1bnRpbWVJZDtcbiAgICAgIHBhY2tldC5mbGFncyA9IE1vdmVEZWx0YUZsYWdzLkFsbDtcbiAgICAgIHBhY2tldC54ID0gdGhpcy5wb3NpdGlvbi54O1xuICAgICAgcGFja2V0LnkgPSB0aGlzLnBvc2l0aW9uLnk7XG4gICAgICBwYWNrZXQueiA9IHRoaXMucG9zaXRpb24uejtcbiAgICAgIHBhY2tldC55YXcgPSB0aGlzLnJvdGF0aW9uLnlhdztcbiAgICAgIHBhY2tldC5oZWFkWWF3ID0gdGhpcy5yb3RhdGlvbi5oZWFkWWF3O1xuICAgICAgcGFja2V0LnBpdGNoID0gdGhpcy5yb3RhdGlvbi5waXRjaDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBvbiB0aGUgZ3JvdW5kXG4gICAgICBpZiAodGhpcy5vbkdyb3VuZCkgcGFja2V0LmZsYWdzIHw9IE1vdmVEZWx0YUZsYWdzLk9uR3JvdW5kO1xuXG4gICAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgZGltZW5zaW9uXG4gICAgICB0aGlzLmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2VsZWN0ZWQgaW52ZW50b3J5IHNsb3Qgb2YgdGhlIGVudGl0eS5cbiAgICogQHJldHVybnMgVGhlIHNlbGVjdGVkIGhvdGJhciBpbmRleCBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkU2xvdCgpOiBudW1iZXIge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGludmVudG9yeSB0cmFpdFxuICAgIGlmICghdGhpcy5oYXNUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZW50aXR5IGRvZXMgbm90IGhhdmUgYW4gaW52ZW50b3J5IHRyYWl0LlwiKTtcblxuICAgIC8vIEdldCB0aGUgaW52ZW50b3J5IHRyYWl0XG4gICAgY29uc3QgaW52ZW50b3J5ID0gdGhpcy5nZXRUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHNlbGVjdGVkIHNsb3RcbiAgICByZXR1cm4gaW52ZW50b3J5LnNlbGVjdGVkU2xvdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZXMgdGhlIGVudGl0eSB0byBkcm9wIGFuIGl0ZW0gZnJvbSBpdHMgaW52ZW50b3J5LlxuICAgKiBAcGFyYW0gc2xvdCBUaGUgc2xvdCB0byBkcm9wIHRoZSBpdGVtIGZyb20uXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCBvZiBpdGVtcyB0byBkcm9wLlxuICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgdG8gZHJvcCB0aGUgaXRlbSBmcm9tLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgaXRlbSB3YXMgZHJvcHBlZC5cbiAgICovXG4gIHB1YmxpYyBkcm9wSXRlbShzbG90OiBudW1iZXIsIGFtb3VudDogbnVtYmVyLCBjb250YWluZXI6IENvbnRhaW5lcik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGludmVudG9yeSB0cmFpdFxuICAgIGlmICghdGhpcy5oYXNUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEdldCB0aGUgaXRlbSBmcm9tIHRoZSBzbG90XG4gICAgY29uc3QgaXRlbSA9IGNvbnRhaW5lci50YWtlSXRlbShzbG90LCBhbW91bnQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgdmFsaWRcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEdldCB0aGUgZW50aXR5J3MgcG9zaXRpb24gYW5kIHJvdGF0aW9uXG4gICAgY29uc3QgeyB4LCB5LCB6IH0gPSB0aGlzLnBvc2l0aW9uO1xuICAgIGNvbnN0IHsgaGVhZFlhdywgcGl0Y2ggfSA9IHRoaXMucm90YXRpb247XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIHBpdGNoICYgaGVhZFlhdywgc28gdGhlIGVudGl0eSB3aWxsIGJlIHNwYXduZWQgaW4gdGhlIGNvcnJlY3QgZGlyZWN0aW9uXG4gICAgY29uc3QgaGVhZFlhd1JhZCA9IChoZWFkWWF3ICogTWF0aC5QSSkgLyAxODA7XG4gICAgY29uc3QgcGl0Y2hSYWQgPSAocGl0Y2ggKiBNYXRoLlBJKSAvIDE4MDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgb2YgdGhlIGVudGl0eSBiYXNlZCBvbiB0aGUgZW50aXR5J3Mgcm90YXRpb25cbiAgICBjb25zdCB2ZWxvY2l0eSA9IG5ldyBWZWN0b3IzZihcbiAgICAgICgtTWF0aC5zaW4oaGVhZFlhd1JhZCkgKiBNYXRoLmNvcyhwaXRjaFJhZCkpIC8gMyAvIDAuNSxcbiAgICAgICgtTWF0aC5zaW4ocGl0Y2hSYWQpIC8gMikgKiAwLjc1LFxuICAgICAgKE1hdGguY29zKGhlYWRZYXdSYWQpICogTWF0aC5jb3MocGl0Y2hSYWQpKSAvIDMgLyAwLjVcbiAgICApO1xuXG4gICAgLy8gU3Bhd24gdGhlIGVudGl0eVxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZGltZW5zaW9uLnNwYXduSXRlbShpdGVtLCBuZXcgVmVjdG9yM2YoeCwgeSAtIDAuMjUsIHopKTtcblxuICAgIC8vIFNldCB0aGUgdmVsb2NpdHkgb2YgdGhlIGVudGl0eVxuICAgIGVudGl0eS5hZGRNb3Rpb24odmVsb2NpdHkpO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgYXMgdGhlIGl0ZW0gd2FzIGRyb3BwZWRcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGhhcyBhIHRhZy5cbiAgICogQHBhcmFtIHRhZyBUaGUgdGFnIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGhhcyB0aGUgdGFnLlxuICAgKi9cbiAgcHVibGljIGhhc1RhZyh0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhZ3MuaGFzKHRhZyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGFncyBvZiB0aGUgZW50aXR5LlxuICAgKiBAcmV0dXJucyBUaGUgdGFncyBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIGdldFRhZ3MoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRhZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB0YWcgdG8gdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHRhZyBUaGUgdGFnIHRvIGFkZC5cbiAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIHRhZyB3YXMgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkVGFnKHRhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhZyBhbHJlYWR5IGV4aXN0c1xuICAgIGlmICh0aGlzLnRhZ3MuaGFzKHRhZykpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFRhZ3MgYXJlIHJlYWQtb25seVxuICAgIHRoaXMudGFncy5hZGQodGFnKTtcblxuICAgIC8vIFJldHVybiB0cnVlIGFzIHRoZSB0YWcgd2FzIGFkZGVkXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHRhZyBmcm9tIHRoZSBlbnRpdHkuXG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSB0YWcgd2FzIHJlbW92ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVGFnKHRhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhZyBleGlzdHNcbiAgICBpZiAoIXRoaXMudGFncy5oYXModGFnKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSB0YWcgZnJvbSB0aGUgZW50aXR5XG4gICAgdGhpcy50YWdzLmRlbGV0ZSh0YWcpO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgYXMgdGhlIHRhZyB3YXMgcmVtb3ZlZFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgY29tbWFuZCBhcyB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgY29tbWFuZCB0byBleGVjdXRlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzcG9uc2Ugb2YgdGhlIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgZXhlY3V0ZUNvbW1hbmQ8VCA9IHVua25vd24+KGNvbW1hbmQ6IHN0cmluZyk6IENvbW1hbmRSZXNwb25zZTxUPiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbW1hbmQgc3RhcnRzIHdpdGggYSBzbGFzaCwgcmVtb3ZlIGl0IGlmIGl0IGRvZXMgbm90XG4gICAgaWYgKGNvbW1hbmQuc3RhcnRzV2l0aChcIi9cIikpIGNvbW1hbmQgPSBjb21tYW5kLnNsaWNlKDEpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNvbW1hbmQgZXhlY3V0ZSBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlID0gbmV3IENvbW1hbmRFeGVjdXRpb25TdGF0ZShcbiAgICAgIHRoaXMuZ2V0V29ybGQoKS5jb21tYW5kcy5nZXRBbGwoKSxcbiAgICAgIGNvbW1hbmQsXG4gICAgICB0aGlzXG4gICAgKTtcblxuICAgIC8vIEV4ZWN1dGUgdGhlIGNvbW1hbmQgc3RhdGVcbiAgICByZXR1cm4gc3RhdGUuZXhlY3V0ZSgpIGFzIENvbW1hbmRSZXNwb25zZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlbnRpdHkncyBkYXRhIGFzIGEgZGF0YWJhc2UgZW50cnkuXG4gICAqIEByZXR1cm5zIFRoZSBlbnRpdHkgZW50cnkgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGdldERhdGFFbnRyeSgpOiBFbnRpdHlFbnRyeSB7XG4gICAgLy8gQ3JlYXRlIHRoZSBlbnRpdHkgZW50cnkgdG8gc2F2ZVxuICAgIGNvbnN0IGVudHJ5OiBFbnRpdHlFbnRyeSA9IHtcbiAgICAgIHVuaXF1ZUlkOiB0aGlzLnVuaXF1ZUlkLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy50eXBlLmlkZW50aWZpZXIsXG4gICAgICBwb3NpdGlvbjogdGhpcy5wb3NpdGlvbixcbiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgY29tcG9uZW50czogWy4uLnRoaXMuY29tcG9uZW50cy5lbnRyaWVzKCldLFxuICAgICAgdHJhaXRzOiBbLi4udGhpcy50cmFpdHMua2V5cygpXSxcbiAgICAgIG1ldGFkYXRhOiBbLi4udGhpcy5tZXRhZGF0YS5lbnRyaWVzKCldLFxuICAgICAgZmxhZ3M6IFsuLi50aGlzLmZsYWdzLmVudHJpZXMoKV0sXG4gICAgICBhdHRyaWJ1dGVzOiBbLi4udGhpcy5hdHRyaWJ1dGVzLmVudHJpZXMoKV0sXG4gICAgICBzY29yZWJvYXJkSWRlbnRpdHk6IHRoaXMuc2NvcmVib2FyZElkZW50aXR5LmlkZW50aWZpZXJcbiAgICB9O1xuXG4gICAgLy8gUmV0dXJuIHRoZSBlbnRpdHkgZW50cnlcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGVudGl0eSBmcm9tIHRoZSBwcm92aWRlZCBlbnRpdHkgZW50cnkuXG4gICAqIEBwYXJhbSB3b3JsZCBUaGUgd29ybGQgdG8gdGhlIGVudGl0eSBkYXRhIGlzIGNvbWluZyBmcm9tXG4gICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50aXR5IGVudHJ5IHRvIGxvYWRcbiAgICogQHBhcmFtIG92ZXJ3cml0ZSBXaGV0aGVyIHRvIG92ZXJ3cml0ZSB0aGUgY3VycmVudCBlbnRpdHkgZGF0YTsgZGVmYXVsdCBpcyB0cnVlXG4gICAqL1xuICBwdWJsaWMgbG9hZERhdGFFbnRyeShcbiAgICB3b3JsZDogV29ybGQsXG4gICAgZW50cnk6IEVudGl0eUVudHJ5LFxuICAgIG92ZXJ3cml0ZSA9IHRydWVcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgdW5pcXVlIGlkIG1hdGNoZXMgdGhlIGVudGl0eSdzIHVuaXF1ZSBpZFxuICAgIGlmIChlbnRyeS51bmlxdWVJZCAhPT0gdGhpcy51bmlxdWVJZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gbG9hZCBlbnRpdHkgZW50cnkgYXMgdGhlIHVuaXF1ZSBpZCBkb2VzIG5vdCBtYXRjaCB0aGUgZW50aXR5J3MgdW5pcXVlIGlkIVwiXG4gICAgICApO1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgaWRlbnRpZmllciBtYXRjaGVzIHRoZSBlbnRpdHkncyBpZGVudGlmaWVyXG4gICAgaWYgKGVudHJ5LmlkZW50aWZpZXIgIT09IHRoaXMudHlwZS5pZGVudGlmaWVyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBsb2FkIGVudGl0eSBlbnRyeSBhcyB0aGUgaWRlbnRpZmllciBkb2VzIG5vdCBtYXRjaCB0aGUgZW50aXR5J3MgaWRlbnRpZmllciFcIlxuICAgICAgKTtcblxuICAgIC8vIFNldCB0aGUgZW50aXR5J3MgcG9zaXRpb24gYW5kIHJvdGF0aW9uXG4gICAgdGhpcy5wb3NpdGlvbi5zZXQoZW50cnkucG9zaXRpb24pO1xuICAgIHRoaXMucm90YXRpb24uc2V0KGVudHJ5LnJvdGF0aW9uKTtcblxuICAgIC8vIFNldCB0aGUgZW50aXR5J3Mgc2NvcmVib2FyZCBpZGVudGl0eVxuICAgIHRoaXMuc2NvcmVib2FyZElkZW50aXR5ID0gbmV3IFNjb3JlYm9hcmRJZGVudGl0eShcbiAgICAgIHRoaXMsXG4gICAgICBlbnRyeS5zY29yZWJvYXJkSWRlbnRpdHlcbiAgICApO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBzaG91bGQgb3ZlcndyaXRlIHRoZSBjdXJyZW50IGRhdGFcbiAgICBpZiAob3ZlcndyaXRlKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudHMuY2xlYXIoKTtcbiAgICAgIHRoaXMudHJhaXRzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBjb21wb25lbnRzIHRvIHRoZSBlbnRpdHksIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyeS5jb21wb25lbnRzKSB7XG4gICAgICBpZiAoIXRoaXMuY29tcG9uZW50cy5oYXMoa2V5KSkgdGhpcy5jb21wb25lbnRzLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIHRyYWl0cyB0byB0aGUgZW50aXR5LCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiBlbnRyeS50cmFpdHMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWxldHRlIGhhcyB0aGUgdHJhaXRcbiAgICAgIGNvbnN0IHRyYWl0VHlwZSA9IHdvcmxkLmVudGl0eVBhbGV0dGUudHJhaXRzLmdldCh0cmFpdCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBleGlzdHMgaW4gdGhlIHBhbGV0dGVcbiAgICAgIGlmICghdHJhaXRUeXBlKSB7XG4gICAgICAgIHdvcmxkLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgdHJhaXQgXCIke3RyYWl0fVwiIGZvciBlbnRpdHkgXCIke3RoaXMudHlwZS5pZGVudGlmaWVyfToke3RoaXMudW5pcXVlSWR9XCIgYXMgaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGVgXG4gICAgICAgICk7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gYWRkIHRoZSB0cmFpdCB0byB0aGUgZW50aXR5XG4gICAgICB0aGlzLmFkZFRyYWl0KHRyYWl0VHlwZSBhcyB0eXBlb2YgRW50aXR5VHJhaXQpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgbWV0YWRhdGEgdG8gdGhlIGVudGl0eSwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJ5Lm1ldGFkYXRhKSB7XG4gICAgICBpZiAoIXRoaXMubWV0YWRhdGEuaGFzKGtleSkpIHRoaXMubWV0YWRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgZmxhZ3MgdG8gdGhlIGVudGl0eSwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJ5LmZsYWdzKSB7XG4gICAgICBpZiAoIXRoaXMuZmxhZ3MuaGFzKGtleSkpIHRoaXMuZmxhZ3Muc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlcyB0byB0aGUgZW50aXR5LCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cnkuYXR0cmlidXRlcykge1xuICAgICAgaWYgKCF0aGlzLmF0dHJpYnV0ZXMuaGFzKGtleSkpIHRoaXMuYXR0cmlidXRlcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdW5pcXVlIGlkIGZvciB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gbmV0d29yayBUaGUgbmV0d29yayBpZCBvZiB0aGUgZW50aXR5IHR5cGVcbiAgICogQHBhcmFtIHJ1bnRpbWVJZCBUaGUgY3VycmVudCBydW50aW1lIGlkIG9mIHRoZSBlbnRpdHlcbiAgICogQHJldHVybnMgQSBnZW5lcmF0ZWQgdW5pcXVlIGlkIGZvciB0aGUgZW50aXR5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVVuaXF1ZUlkKG5ldHdvcms6IG51bWJlciwgcnVudGltZUlkOiBiaWdpbnQpOiBiaWdpbnQge1xuICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIGlkIGZvciB0aGUgZW50aXR5XG4gICAgY29uc3QgdW5pcXVlID0gQmlnSW50KE1hdGguYWJzKERhdGUubm93KCkgPj4gNCkgJiAweDFfZmYpO1xuXG4gICAgcmV0dXJuIEJpZ0ludChuZXR3b3JrIDw8IDE5KSB8ICh1bmlxdWUgPDwgMTBuKSB8IHJ1bnRpbWVJZDtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHkgfTtcbiIsICJpbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5pbXBvcnQge1xuICBDUkVBVElWRV9DT05URU5ULFxuICBJVEVNX1RZUEVTLFxuICBJVEVNREFUQSxcbiAgVE9PTF9UWVBFU1xufSBmcm9tIFwiQHNlcmVuaXR5anMvZGF0YVwiO1xuaW1wb3J0IHsgQ3JlYXRpdmVJdGVtcywgSXRlbURhdGEgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgSXRlbVRvb2xUaWVyLCB0eXBlIEl0ZW1JZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBCbG9ja1R5cGUgfSBmcm9tIFwiLi4vLi4vYmxvY2tcIjtcblxuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5pbXBvcnQgeyBDcmVhdGl2ZUl0ZW0gfSBmcm9tIFwiLi9jcmVhdGl2ZVwiO1xuXG5pbXBvcnQgdHlwZSB7IENvbXBvdW5kVGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuXG4vLyBDcmVhdGUgYSBuZXcgc3RyZWFtIGZyb20gdGhlIGl0ZW0gZGF0YS5cbmNvbnN0IGRhdGFTdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKElURU1EQVRBKTtcblxuLy8gUmVhZCB0aGUgaXRlbSBkYXRhIGZyb20gdGhlIHN0cmVhbS5cbmNvbnN0IGRhdGEgPSBJdGVtRGF0YS5yZWFkKGRhdGFTdHJlYW0pO1xuXG4vLyBJdGVyYXRlIG92ZXIgdGhlIGl0ZW0gZGF0YS5cbmZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gIC8vIEdldCB0aGUgbWV0YWRhdGEgZm9yIHRoZSBpdGVtLlxuICBjb25zdCBtZXRhID0gSVRFTV9UWVBFUy5maW5kKCh0eXBlKSA9PiB0eXBlLmlkZW50aWZpZXIgPT09IGl0ZW0ubmFtZSk7XG5cbiAgLy8gR2V0IHRoZSB0b29sIHR5cGUgZm9yIHRoZSBpdGVtLlxuICBjb25zdCB0b29sID0gVE9PTF9UWVBFUy5maW5kKCh0b29sKSA9PiB0b29sLnR5cGVzLmluY2x1ZGVzKGl0ZW0ubmFtZSkpO1xuICBjb25zdCBpbmRleCA9IHRvb2w/LnR5cGVzLmluZGV4T2YoaXRlbS5uYW1lKTtcbiAgY29uc3QgbGV2ZWwgPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gSXRlbVRvb2xUaWVyLk5vbmUgOiBpbmRleCArIDE7XG4gIGNvbnN0IGJsb2NrVHlwZSA9IEJsb2NrVHlwZS50eXBlcy5nZXQoaXRlbS5uYW1lKSA/PyBudWxsO1xuXG4gIC8vIENyZWF0ZSB0aGUgaXRlbSB0eXBlLlxuICBjb25zdCB0eXBlID0gbmV3IEl0ZW1UeXBlKGl0ZW0ubmFtZSBhcyBJdGVtSWRlbnRpZmllciwgaXRlbS5uZXR3b3JrSWQsIHtcbiAgICBzdGFja2FibGU6IG1ldGE/LnN0YWNrYWJsZSxcbiAgICBtYXhBbW91bnQ6IG1ldGE/Lm1heEFtb3VudCxcbiAgICB0b29sOiB0b29sPy5uZXR3b3JrLFxuICAgIHRpZXI6IGxldmVsLFxuICAgIHRhZ3M6IG1ldGE/LnRhZ3MsXG4gICAgYmxvY2s6IGJsb2NrVHlwZVxuICB9KTtcblxuICAvLyBBZGQgdGhlIGl0ZW0gdHlwZSB0byB0aGUgbWFwLlxuICBJdGVtVHlwZS50eXBlcy5zZXQodHlwZS5pZGVudGlmaWVyLCB0eXBlKTtcbn1cblxuLy8gQ3JlYXRlIGEgbmV3IHN0cmVhbSBmcm9tIHRoZSBjcmVhdGl2ZSBjb250ZW50LlxuY29uc3QgY3JlYXRpdmVTdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKENSRUFUSVZFX0NPTlRFTlQpO1xuXG4vLyBSZWFkIHRoZSBjcmVhdGl2ZSBjb250ZW50IGZyb20gdGhlIHN0cmVhbS5cbmNvbnN0IGNyZWF0aXZlID0gQ3JlYXRpdmVJdGVtcy5yZWFkKGNyZWF0aXZlU3RyZWFtKTtcblxuLy8gSXRlcmF0ZSBvdmVyIHRoZSBjcmVhdGl2ZSBjb250ZW50LlxuZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIGNyZWF0aXZlLmVudHJpZXMoKSkge1xuICAvLyBHZXQgdGhlIGl0ZW0gdHlwZSBmcm9tIHRoZSBtYXAuXG4gIGNvbnN0IHR5cGUgPSBbLi4uSXRlbVR5cGUudHlwZXMudmFsdWVzKCldLmZpbmQoXG4gICAgKHR5cGUpID0+IHR5cGUubmV0d29yayA9PT0gaXRlbS5uZXR3b3JrXG4gICk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gdHlwZSBpcyB2YWxpZC5cbiAgLy8gSWYgbm90LCB0aGVuIGNvbnRpbnVlIHRvIHRoZSBuZXh0IGl0ZW0uXG4gIGlmICghdHlwZSkgY29udGludWU7XG5cbiAgLy8gRG8gdG8gc29tZSByZWFzb24sIHNvbWUgaXRlbXMgaGF2ZSBhbiBpbmNvcnJlY3QgbWV0YWRhdGEgdmFsdWUsXG4gIC8vIFNvIHdlIHdpbGwgZ2VuZXJhdGUgb3VyIG93bi5cbiAgY29uc3QgbWV0YWRhdGEgPSBpdGVtLm1ldGFkYXRhID8/IDA7XG4gIC8vIGluZGV4IC0gY3JlYXRpdmUuZmluZEluZGV4KChpbmRleF8pID0+IGluZGV4Xy5uZXR3b3JrID09PSBpdGVtLm5ldHdvcmspO1xuXG4gIGNvbnN0IG5idCA9IGl0ZW0uZXh0cmFzPy5uYnQgYXMgQ29tcG91bmRUYWc7XG5cbiAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0gaW5zdGFuY2UgZGVzY3JpcHRvci5cbiAgaXRlbS5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAvLyBpdGVtLm5ldHdvcmtCbG9ja0lkID0gdHlwZS5ibG9jaz8ucGVybXV0YXRpb25zW21ldGFkYXRhXT8ubmV0d29yayA/PyAwO1xuXG4gIC8vIFNldCB0aGUgaXRlbSBpbiB0aGUgcmVnaXN0cnkuXG4gIENyZWF0aXZlSXRlbS5pdGVtcy5zZXQoaW5kZXgsIG5ldyBDcmVhdGl2ZUl0ZW0odHlwZSwgbWV0YWRhdGEsIG5idCkpO1xufVxuIiwgImltcG9ydCB7XG4gIEJMT0NLX1RZUEVTLFxuICBCTE9DS19QRVJNVVRBVElPTlMsXG4gIEJMT0NLX0RST1BTLFxuICBCTE9DS19NRVRBREFUQVxufSBmcm9tIFwiQHNlcmVuaXR5anMvZGF0YVwiO1xuXG5pbXBvcnQgeyBCbG9ja1R5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5pbXBvcnQgeyBCbG9ja1Blcm11dGF0aW9uIH0gZnJvbSBcIi4vcGVybXV0YXRpb25cIjtcbmltcG9ydCB7IEl0ZW1Ecm9wIH0gZnJvbSBcIi4vZHJvcHNcIjtcblxuaW1wb3J0IHR5cGUgeyBCbG9ja0lkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuLy8gSXRlcmF0ZSBvdmVyIHRoZSBibG9jayB0eXBlcyBhbmQgcmVnaXN0ZXIgdGhlbS5cbmZvciAoY29uc3QgdHlwZSBvZiBCTE9DS19UWVBFUykge1xuICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgdHlwZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4gIGlmIChCbG9ja1R5cGUudHlwZXMuaGFzKHR5cGUuaWRlbnRpZmllciBhcyBCbG9ja0lkZW50aWZpZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCbG9jayB0eXBlICR7dHlwZS5pZGVudGlmaWVyfSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGJsb2NrIGRyb3BzIGZvciB0aGUgYmxvY2sgdHlwZS5cbiAgY29uc3QgZHJvcCA9IEJMT0NLX0RST1BTLmZpbmQoKGRyb3ApID0+IGRyb3AuaWRlbnRpZmllciA9PT0gdHlwZS5pZGVudGlmaWVyKTtcblxuICAvLyBGaW5kIHRoZSBtZXRhZGF0YSBmb3IgdGhlIGJsb2NrIHR5cGUuXG4gIGNvbnN0IG1ldGFkYXRhID0gQkxPQ0tfTUVUQURBVEEuZmluZChcbiAgICAobWV0YSkgPT4gbWV0YS5pZGVudGlmaWVyID09PSB0eXBlLmlkZW50aWZpZXJcbiAgKSA/PyB7IGhhcmRuZXNzOiAwLCBmcmljdGlvbjogMCwgbWFwQ29sb3I6IFwiXCIgfTtcblxuICAvLyBSZWdpc3RlciB0aGUgYmxvY2sgdHlwZS5cbiAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQmxvY2tUeXBlKHR5cGUuaWRlbnRpZmllciBhcyBCbG9ja0lkZW50aWZpZXIsIHtcbiAgICBsb2dnYWJsZTogdHlwZS5sb2dnYWJsZSxcbiAgICBhaXI6IHR5cGUuYWlyLFxuICAgIGxpcXVpZDogdHlwZS5saXF1aWQsXG4gICAgc29saWQ6IHR5cGUuc29saWQsXG4gICAgaGFyZG5lc3M6IG1ldGFkYXRhLmhhcmRuZXNzLFxuICAgIGZyaWN0aW9uOiBtZXRhZGF0YS5mcmljdGlvbixcbiAgICBjb2xvcjogbWV0YWRhdGEubWFwQ29sb3IsXG4gICAgY29tcG9uZW50czogdHlwZS5jb21wb25lbnRzLFxuICAgIHRhZ3M6IHR5cGUudGFnc1xuICB9KTtcblxuICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgdHlwZSBoYXMgZHJvcHMuXG4gIGlmIChkcm9wKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBkcm9wPy5kcm9wcyA/PyBbXSkge1xuICAgICAgLy8gU2VwYXJhdGUgdGhlIGRyb3AgaW5mb3JtYXRpb24uXG4gICAgICBjb25zdCB7IGlkZW50aWZpZXIsIG1pbiwgbWF4LCBjaGFuY2UgfSA9IGVudHJ5O1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgaXRlbSBkcm9wLlxuICAgICAgY29uc3QgaXRlbURyb3AgPSBuZXcgSXRlbURyb3AoaWRlbnRpZmllciwgbWluLCBtYXgsIGNoYW5jZSk7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBpdGVtIGRyb3AgdG8gdGhlIGJsb2NrIHR5cGUuXG4gICAgICBpbnN0YW5jZS5kcm9wcy5wdXNoKGl0ZW1Ecm9wKTtcbiAgICB9XG4gIH1cbiAgLy8gUmVnaXN0ZXIgdGhlIGRlZmF1bHQgZHJvcCBmb3IgdGhlIGJsb2NrIHR5cGUuXG4gIGVsc2UgaW5zdGFuY2UuZHJvcHMucHVzaChuZXcgSXRlbURyb3AodHlwZS5pZGVudGlmaWVyLCAxLCAxLCAxKSk7XG5cbiAgLy8gU2V0IHRoZSBibG9jayB0eXBlIGluIHRoZSByZWdpc3RyeS5cbiAgQmxvY2tUeXBlLnR5cGVzLnNldCh0eXBlLmlkZW50aWZpZXIgYXMgQmxvY2tJZGVudGlmaWVyLCBpbnN0YW5jZSk7XG59XG5cbi8vIEl0ZXJhdGUgb3ZlciB0aGUgYmxvY2sgcGVybXV0YXRpb25zIGFuZCByZWdpc3RlciB0aGVtLlxuZm9yIChjb25zdCBwZXJtdXRhdGlvbiBvZiBCTE9DS19QRVJNVVRBVElPTlMpIHtcbiAgLy8gR2V0IHRoZSBibG9jayB0eXBlIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICBjb25zdCB0eXBlID0gQmxvY2tUeXBlLnR5cGVzLmdldChwZXJtdXRhdGlvbi5pZGVudGlmaWVyIGFzIEJsb2NrSWRlbnRpZmllcik7XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHR5cGUgZXhpc3RzLlxuICBpZiAoIXR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJsb2NrIHR5cGUgJHtwZXJtdXRhdGlvbi5pZGVudGlmaWVyfSBkb2VzIG5vdCBleGlzdGApO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbmV3IGJsb2NrIHBlcm11dGF0aW9uLlxuICBjb25zdCBpbnN0YW5jZSA9IG5ldyBCbG9ja1Blcm11dGF0aW9uKFxuICAgIHBlcm11dGF0aW9uLmhhc2gsXG4gICAgcGVybXV0YXRpb24uc3RhdGUgYXMgbmV2ZXIsXG4gICAgdHlwZVxuICApO1xuXG4gIC8vIFJlZ2lzdGVyIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgdHlwZS5wZXJtdXRhdGlvbnMucHVzaChpbnN0YW5jZSk7XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrIHBlcm11dGF0aW9uIGluIHRoZSByZWdpc3RyeS5cbiAgQmxvY2tQZXJtdXRhdGlvbi5wZXJtdXRhdGlvbnMuc2V0KHBlcm11dGF0aW9uLmhhc2gsIGluc3RhbmNlKTtcbn1cbiIsICJpbXBvcnQgeyBCbG9ja0lkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEJsb2NrU3RhdGUsIEJsb2NrVHlwZVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgSXRlbURyb3AgfSBmcm9tIFwiLi9kcm9wc1wiO1xuXG5pbXBvcnQgdHlwZSB7IEJsb2NrUGVybXV0YXRpb24gfSBmcm9tIFwiLi9wZXJtdXRhdGlvblwiO1xuXG5jb25zdCBEZWZhdWx0QmxvY2tUeXBlUHJvcGVydGllczogQmxvY2tUeXBlUHJvcGVydGllcyA9IHtcbiAgbG9nZ2FibGU6IGZhbHNlLFxuICBhaXI6IGZhbHNlLFxuICBsaXF1aWQ6IGZhbHNlLFxuICBzb2xpZDogZmFsc2UsXG4gIGhhcmRuZXNzOiAwLFxuICBmcmljdGlvbjogMCxcbiAgY29sb3I6IFwiXCIsXG4gIGNvbXBvbmVudHM6IFtdLFxuICB0YWdzOiBbXSxcbiAgZHJvcHM6IFtdLFxuICBwZXJtdXRhdGlvbnM6IFtdXG59O1xuXG4vKipcbiAqIEJsb2NrVHlwZSByZXByZXNlbnRzIGEgYmxvY2sgdHlwZSBpbiB0aGUgZ2FtZSwgd2hpY2ggaG9sZCBhbGwgcG9zc2libGUgcGVybXV0YXRpb25zIHRoZSBibG9jayBjYW4gaGF2ZS5cbiAqIFxuICogKipFeGFtcGxlIFVzYWdlKipcbiAqIGBgYHR5cGVzY3JpcHRcblx0aW1wb3J0IHsgQmxvY2tUeXBlLCBCbG9ja0lkZW50aWZpZXIgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmxvY2tcIlxuXG5cdC8vIEdldCB0aGUgYmxvY2sgdHlwZSBmb3IgZGlydFxuXHRjb25zdCBkaXJ0VHlwZSA9IEJsb2NrVHlwZS5nZXQoQmxvY2tJZGVudGlmaWVyLkRpcnQpXG5cblx0Ly8gR2V0IHRoZSBpZGVudGlmaWVyIG9mIHRoZSB0eXBlXG5cdGRpcnRUeXBlLmlkZW50aWZpZXIgLy8gRXhwZWN0ZWQgdG8gYmUgXCJtaW5lY3JhZnQ6ZGlydFwiXG4gKiBgYGBcbiAqL1xuY2xhc3MgQmxvY2tUeXBlPFQgZXh0ZW5kcyBrZXlvZiBCbG9ja1N0YXRlID0ga2V5b2YgQmxvY2tTdGF0ZT4ge1xuICAvKipcbiAgICogQSBjb2xsZWN0aXZlIHJlZ2lzdHJ5IG9mIGFsbCBibG9jayB0eXBlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBuZXcgTWFwPHN0cmluZywgQmxvY2tUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBUO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBibG9jayB0eXBlIGlzIGN1c3RvbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjdXN0b206IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJsb2NrIHR5cGUgaXMgbG9nZ2FibGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2FibGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJsb2NrIHR5cGUgaXMgYWlyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFpcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYmxvY2sgdHlwZSBpcyBsaXF1aWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbGlxdWlkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBibG9jayB0eXBlIGlzIHNvbGlkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNvbGlkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaGFyZG5lc3Mgb2YgdGhlIGJsb2NrIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGFyZG5lc3M6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZyaWN0aW9uIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZyaWN0aW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXAgY29sb3Igb2YgdGhlIGJsb2NrIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29sb3I6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgY29tcG9uZW50cyBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHRhZ3Mgb2YgdGhlIGJsb2NrIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFnczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBpdGVtIGRyb3BzIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRyb3BzOiBBcnJheTxJdGVtRHJvcD4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgcGVybXV0YXRpb25zIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcm11dGF0aW9uczogQXJyYXk8QmxvY2tQZXJtdXRhdGlvbj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihpZGVudGlmaWVyOiBULCBwcm9wZXJ0aWVzPzogUGFydGlhbDxCbG9ja1R5cGVQcm9wZXJ0aWVzPikge1xuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy5jdXN0b20gPSBmYWxzZTtcblxuICAgIC8vIFNwcmVhZCB0aGUgcHJvcGVydGllcyB3aXRoIHRoZSBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLkRlZmF1bHRCbG9ja1R5cGVQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICAvLyBBc3NpZ24gdGhlIHByb3BlcnRpZXMgdG8gdGhlIGJsb2NrIHR5cGUuXG4gICAgdGhpcy5sb2dnYWJsZSA9IHByb3BzLmxvZ2dhYmxlO1xuICAgIHRoaXMuYWlyID0gcHJvcHMuYWlyO1xuICAgIHRoaXMubGlxdWlkID0gcHJvcHMubGlxdWlkO1xuICAgIHRoaXMuc29saWQgPSBwcm9wcy5zb2xpZDtcbiAgICB0aGlzLmhhcmRuZXNzID0gcHJvcHMuaGFyZG5lc3M7XG4gICAgdGhpcy5mcmljdGlvbiA9IHByb3BzLmZyaWN0aW9uO1xuICAgIHRoaXMuY29sb3IgPSBwcm9wcy5jb2xvcjtcbiAgICB0aGlzLmNvbXBvbmVudHMgPSBbLi4ucHJvcHMuY29tcG9uZW50cywgLi4udGhpcy5jb21wb25lbnRzXTtcbiAgICB0aGlzLnRhZ3MgPSBbLi4ucHJvcHMudGFncywgLi4udGhpcy50YWdzXTtcbiAgICB0aGlzLmRyb3BzID0gWy4uLnByb3BzLmRyb3BzLCAuLi50aGlzLmRyb3BzXTtcbiAgICB0aGlzLnBlcm11dGF0aW9ucyA9IFsuLi5wcm9wcy5wZXJtdXRhdGlvbnMsIC4uLnRoaXMucGVybXV0YXRpb25zXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIG9mIHRoZSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldFBlcm11dGF0aW9uKHN0YXRlPzogQmxvY2tTdGF0ZVtUXSk6IEJsb2NrUGVybXV0YXRpb248VD4ge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgcGVybXV0YXRpb25zLlxuICAgIGZvciAoY29uc3QgcGVybXV0YXRpb24gb2YgdGhpcy5wZXJtdXRhdGlvbnMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwZXJtdXRhdGlvbiBtYXRjaGVzIHRoZSBzdGF0ZS5cbiAgICAgIGlmICghc3RhdGUgfHwgcGVybXV0YXRpb24ubWF0Y2hlcyhzdGF0ZSBhcyBCbG9ja1N0YXRlW1RdKSkge1xuICAgICAgICByZXR1cm4gcGVybXV0YXRpb24gYXMgQmxvY2tQZXJtdXRhdGlvbjxUPjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGRlZmF1bHQgcGVybXV0YXRpb24gaWYgdGhlIHN0YXRlIGlzIG5vdCBmb3VuZC5cbiAgICByZXR1cm4gdGhpcy5wZXJtdXRhdGlvbnNbMF0gYXMgQmxvY2tQZXJtdXRhdGlvbjxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJsb2NrIHR5cGUgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldDxUIGV4dGVuZHMga2V5b2YgQmxvY2tTdGF0ZT4oaWRlbnRpZmllcjogVCk6IEJsb2NrVHlwZTxUPiB7XG4gICAgLy8gR2V0IHRoZSBibG9jayB0eXBlIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgIGNvbnN0IHR5cGUgPSBCbG9ja1R5cGUudHlwZXMuZ2V0KGlkZW50aWZpZXIgYXMgQmxvY2tJZGVudGlmaWVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayB0eXBlIGV4aXN0cy5cbiAgICBpZiAoIXR5cGUpIHJldHVybiB0aGlzLmdldChCbG9ja0lkZW50aWZpZXIuQWlyKSBhcyBCbG9ja1R5cGU8VD47XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJsb2NrIHR5cGUuXG4gICAgcmV0dXJuIHR5cGUgYXMgQmxvY2tUeXBlPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYmxvY2sgdHlwZXMgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEFsbCgpOiBBcnJheTxCbG9ja1R5cGU+IHtcbiAgICByZXR1cm4gWy4uLkJsb2NrVHlwZS50eXBlcy52YWx1ZXMoKV07XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2tUeXBlIH07XG4iLCAiaW1wb3J0IHsgQnl0ZVRhZywgQ29tcG91bmRUYWcsIEludFRhZywgU3RyaW5nVGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuXG5pbXBvcnQgeyBCbG9ja1N0YXRlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBCbG9ja0lkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgQmxvY2tUeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuaW1wb3J0IHsgaGFzaCB9IGZyb20gXCIuL2hhc2hcIjtcblxuY2xhc3MgQmxvY2tQZXJtdXRhdGlvbjxUIGV4dGVuZHMga2V5b2YgQmxvY2tTdGF0ZSA9IGtleW9mIEJsb2NrU3RhdGU+IHtcbiAgLyoqXG4gICAqIEEgY29sbGVjdGl2ZSByZWdpc3RyeSBvZiBhbGwgYmxvY2sgcGVybXV0YXRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwZXJtdXRhdGlvbnMgPSBuZXcgTWFwPG51bWJlciwgQmxvY2tQZXJtdXRhdGlvbj4oKTtcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgaGFzaCBvZiB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV0d29yazogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZXggdmFsdWUgb2YgdGhlIGJsb2NrIHBlcm11dGF0aW9uIGluIHRoZSBibG9jayB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0ZSBvZiB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGU6IEJsb2NrU3RhdGVbVF07XG5cbiAgLyoqXG4gICAqIFRoZSBibG9jayB0eXBlIG9mIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBCbG9ja1R5cGU8VD47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBibG9jayBwZXJtdXRhdGlvbi5cbiAgICogQHBhcmFtIG5ldHdvcmsgVGhlIG5ldHdvcmsgaGFzaCBvZiB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgb2YgdGhlIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgYmxvY2sgdHlwZSBvZiB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbmV0d29yazogbnVtYmVyLFxuICAgIHN0YXRlOiBCbG9ja1N0YXRlW1RdLFxuICAgIHR5cGU6IEJsb2NrVHlwZTxUPlxuICApIHtcbiAgICB0aGlzLm5ldHdvcmsgPSBuZXR3b3JrO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaW5kZXggPSB0eXBlLnBlcm11dGF0aW9ucy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGJsb2NrIHBlcm11dGF0aW9uIG1hdGNoZXMgdGhlIGlkZW50aWZpZXIgYW5kIHN0YXRlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgYmxvY2sgaWRlbnRpZmllciB0byBtYXRjaC5cbiAgICogQHBhcmFtIHN0YXRlIFRoZSBibG9jayBzdGF0ZSB0byBtYXRjaC5cbiAgICovXG4gIHB1YmxpYyBtYXRjaGVzKHN0YXRlOiBCbG9ja1N0YXRlW1RdKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHN0YXRlIG1hdGNoZXMuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlW2tleV0gIT09IHN0YXRlW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBibG9jayBwZXJtdXRhdGlvbiBtYXRjaGVzLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBibG9jayBwZXJtdXRhdGlvbiBmcm9tIHRoZSBibG9jayBpZGVudGlmaWVyIGFuZCBzdGF0ZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGJsb2NrIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS5cbiAgICogQHBhcmFtIHN0YXRlIFRoZSBibG9jayBzdGF0ZSB0byByZXNvbHZlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXNvbHZlPFQgZXh0ZW5kcyBrZXlvZiBCbG9ja1N0YXRlPihcbiAgICBpZGVudGlmaWVyOiBULFxuICAgIHN0YXRlPzogQmxvY2tTdGF0ZVtUXVxuICApOiBCbG9ja1Blcm11dGF0aW9uPFQ+IHtcbiAgICAvLyBHZXQgdGhlIGJsb2NrIHR5cGUgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAgY29uc3QgdHlwZSA9IEJsb2NrVHlwZS50eXBlcy5nZXQoaWRlbnRpZmllciBhcyBCbG9ja0lkZW50aWZpZXIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHR5cGUgZXhpc3RzLlxuICAgIGlmICghdHlwZSkgcmV0dXJuIHRoaXMucmVzb2x2ZShCbG9ja0lkZW50aWZpZXIuQWlyKSBhcyBCbG9ja1Blcm11dGF0aW9uPFQ+O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXRlIGlzIG5vdCBwcm92aWRlZC5cbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IHR5cGUucGVybXV0YXRpb25zLmZpbmQoKHBlcm11dGF0aW9uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzdGF0ZSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBibG9jayBzdGF0ZS5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAocGVybXV0YXRpb24uc3RhdGUgYXMgbmV2ZXIpW2tleV07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgYm9vbGVhblxuICAgICAgICBjb25zdCBib29sID0gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0YXRlIHRvIGEgYm9vbGVhbiBpZiBpdCBpcyBhIGJvb2xlYW4uXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID1cbiAgICAgICAgICBib29sICYmIChzdGF0ZVtrZXldID09PSAwIHx8IHN0YXRlW2tleV0gPT09IDEpXG4gICAgICAgICAgICA/IHN0YXRlW2tleV0gPT09IDFcbiAgICAgICAgICAgIDogc3RhdGVba2V5XTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgc3RhdGUgbWF0Y2hlc1xuICAgICAgICBpZiAodmFsdWUgIT09IHF1ZXJ5KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBibG9jayBwZXJtdXRhdGlvbiBtYXRjaGVzLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgcGVybXV0YXRpb24gZG9lcyBub3QgZXhpc3QuXG4gICAgaWYgKCFwZXJtdXRhdGlvbikge1xuICAgICAgLy8gUmV0dXJuIHRoZSBkZWZhdWx0IHBlcm11dGF0aW9uIGlmIHRoZSBzdGF0ZSBpcyBub3QgZm91bmQuXG4gICAgICByZXR1cm4gdHlwZS5wZXJtdXRhdGlvbnNbMF0gYXMgQmxvY2tQZXJtdXRhdGlvbjxUPjtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgIHJldHVybiBwZXJtdXRhdGlvbiBhcyBCbG9ja1Blcm11dGF0aW9uPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBibG9jayBwZXJtdXRhdGlvbi5cbiAgICogUHJpbWFyaWx5IHVzZWQgZm9yIGN1c3RvbSBibG9jayB0eXBlcy5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGJsb2NrIHR5cGUgb2YgdGhlIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIG9mIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgIHR5cGU6IEJsb2NrVHlwZSxcbiAgICBzdGF0ZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+XG4gICk6IEJsb2NrUGVybXV0YXRpb24ge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV0d29yayBoYXNoIG9mIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgICBjb25zdCBuZXR3b3JrID0gaGFzaCh0eXBlLmlkZW50aWZpZXIsIHN0YXRlID8/IHt9KTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBibG9jayBwZXJtdXRhdGlvbi5cbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IG5ldyBCbG9ja1Blcm11dGF0aW9uKG5ldHdvcmssIHN0YXRlID8/IHt9LCB0eXBlKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgICBCbG9ja1Blcm11dGF0aW9uLnBlcm11dGF0aW9ucy5zZXQocGVybXV0YXRpb24ubmV0d29yaywgcGVybXV0YXRpb24pO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIHBlcm11dGF0aW9uIGluIHRoZSBibG9jayB0eXBlLlxuICAgIHR5cGUucGVybXV0YXRpb25zLnB1c2gocGVybXV0YXRpb24pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBibG9jayBwZXJtdXRhdGlvbi5cbiAgICByZXR1cm4gcGVybXV0YXRpb247XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvTmJ0KHBlcm11dGF0aW9uOiBCbG9ja1Blcm11dGF0aW9uKTogQ29tcG91bmRUYWc8dW5rbm93bj4ge1xuICAgIGNvbnN0IG5idCA9IG5ldyBDb21wb3VuZFRhZyhcIlwiLCB7fSk7XG5cbiAgICBjb25zdCBuYW1lID0gbmV3IFN0cmluZ1RhZyhcIm5hbWVcIiwgcGVybXV0YXRpb24udHlwZS5pZGVudGlmaWVyKTtcblxuICAgIGNvbnN0IHN0YXRlcyA9IG5ldyBDb21wb3VuZFRhZyhcInN0YXRlc1wiLCB7fSk7XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGVybXV0YXRpb24uc3RhdGUpO1xuICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMocGVybXV0YXRpb24uc3RhdGUpO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGtleV0gb2Yga2V5cy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2luZGV4XTtcblxuICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOiB7XG4gICAgICAgICAgc3RhdGVzLmFkZFRhZyhuZXcgSW50VGFnKGtleSwgdmFsdWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjoge1xuICAgICAgICAgIHN0YXRlcy5hZGRUYWcobmV3IFN0cmluZ1RhZyhrZXksIHZhbHVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiB7XG4gICAgICAgICAgc3RhdGVzLmFkZFRhZyhuZXcgQnl0ZVRhZyhrZXksIHZhbHVlID8gMSA6IDApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5idC5hZGRUYWcobmFtZSk7XG4gICAgbmJ0LmFkZFRhZyhzdGF0ZXMpO1xuXG4gICAgcmV0dXJuIG5idDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZnJvbU5idChuYnQ6IENvbXBvdW5kVGFnPHVua25vd24+KTogQmxvY2tQZXJtdXRhdGlvbiB7XG4gICAgY29uc3QgbmFtZSA9IG5idC5nZXRUYWcoXCJuYW1lXCIpIGFzIFN0cmluZ1RhZztcbiAgICBjb25zdCBzdGF0ZXMgPSBuYnQuZ2V0VGFnKFwic3RhdGVzXCIpIGFzIENvbXBvdW5kVGFnPHVua25vd24+O1xuXG4gICAgY29uc3Qgc3RhdGUgPSBzdGF0ZXMudmFsdWVPZigpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuXG4gICAgcmV0dXJuIEJsb2NrUGVybXV0YXRpb24ucmVzb2x2ZShuYW1lLnZhbHVlIGFzIEJsb2NrSWRlbnRpZmllciwgc3RhdGUpO1xuICB9XG59XG5cbmV4cG9ydCB7IEJsb2NrUGVybXV0YXRpb24gfTtcbiIsICJpbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5pbXBvcnQgeyBCeXRlVGFnLCBDb21wb3VuZFRhZywgSW50VGFnLCBTdHJpbmdUYWcgfSBmcm9tIFwiQHNlcmVuaXR5anMvbmJ0XCI7XG5cbmNvbnN0IEhBU0hfT0ZGU0VUID0gMHg4MV8xY185ZF9jNTtcblxuZnVuY3Rpb24gaGFzaChcbiAgaWRlbnRpZmllcjogc3RyaW5nLFxuICBzdGF0ZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj5cbik6IG51bWJlciB7XG4gIC8vIFNlcGFyYXRlIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIHN0YXRlIG9iamVjdC5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlKTtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhzdGF0ZSk7XG5cbiAgLy8gQ3JlYXRlIGEgbmV3IGNvbXBvdW5kIHRhZyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBpZGVudGlmaWVyLlxuICBjb25zdCByb290ID0gbmV3IENvbXBvdW5kVGFnKFwiXCIsIHt9KTtcbiAgcm9vdC5hZGRUYWcobmV3IFN0cmluZ1RhZyhcIm5hbWVcIiwgaWRlbnRpZmllcikpO1xuXG4gIC8vIENyZWF0ZSBhIG5ldyBjb21wb3VuZCB0YWcgd2l0aCB0aGUgbmFtZSBvZiBcInN0YXRlc1wiLlxuICBjb25zdCBzdGF0ZXMgPSBuZXcgQ29tcG91bmRUYWcoXCJzdGF0ZXNcIiwge30pO1xuXG4gIC8vIExvb3AgdGhyb3VnaCBlYWNoIGtleSBhbmQgdmFsdWUgaW4gdGhlIHN0YXRlIG9iamVjdC5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGtleV0gb2Yga2V5cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpbmRleF07XG5cbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgY2FzZSBcIm51bWJlclwiOiB7XG4gICAgICAgIHN0YXRlcy5hZGRUYWcobmV3IEludFRhZyhrZXksIHZhbHVlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwic3RyaW5nXCI6IHtcbiAgICAgICAgc3RhdGVzLmFkZFRhZyhuZXcgU3RyaW5nVGFnKGtleSwgdmFsdWUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6IHtcbiAgICAgICAgc3RhdGVzLmFkZFRhZyhuZXcgQnl0ZVRhZyhrZXksIHZhbHVlID8gMSA6IDApKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHRoZSBzdGF0ZXMgdGFnIHRvIHRoZSByb290IHRhZy5cbiAgcm9vdC5hZGRUYWcoc3RhdGVzKTtcblxuICAvLyBDcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbSBhbmQgd3JpdGUgdGhlIHJvb3QgdGFnIHRvIGl0LlxuICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG4gIENvbXBvdW5kVGFnLndyaXRlKHN0cmVhbSwgcm9vdCk7XG5cbiAgLy8gQXNzaWduIHRoZSBoYXNoIHRvIHRoZSBvZmZzZXQuXG4gIGxldCBoYXNoID0gSEFTSF9PRkZTRVQ7XG5cbiAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggZWxlbWVudCBpbiB0aGUgYnVmZmVyLlxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygc3RyZWFtLmdldEJ1ZmZlcigpKSB7XG4gICAgLy8gU2V0IHRoZSBoYXNoIHRvIHRoZSBYT1Igb2YgdGhlIGhhc2ggYW5kIHRoZSBlbGVtZW50LlxuICAgIGhhc2ggXj0gZWxlbWVudCAmIDB4ZmY7XG5cbiAgICAvLyBBcHBseSB0aGUgaGFzaCBhbGdvcml0aG0uXG4gICAgaGFzaCArPVxuICAgICAgKGhhc2ggPDwgMSkgKyAoaGFzaCA8PCA0KSArIChoYXNoIDw8IDcpICsgKGhhc2ggPDwgOCkgKyAoaGFzaCA8PCAyNCk7XG5cbiAgICAvLyBDb252ZXJ0IHRoZSBoYXNoIHRvIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLlxuXG4gICAgaGFzaCA9IGhhc2ggfCAwO1xuICB9XG5cbiAgLy8gUmV0dXJuIHRoZSBoYXNoLlxuICByZXR1cm4gaGFzaDtcbn1cblxuZXhwb3J0IHsgaGFzaCB9O1xuIiwgIi8qKlxuICogUmVwcmVzZW50cyBhIGJsb2NrIGRyb3AuXG4gKi9cbmNsYXNzIEl0ZW1Ecm9wIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBibG9jayBkcm9wLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIHRoZSBibG9jayBkcm9wLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1pbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGhlIGJsb2NrIGRyb3AuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgYmxvY2sgZHJvcC4gMC4wIC0gMS4wXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvYmFiaWxpdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBibG9jayBkcm9wLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgYmxvY2sgZHJvcC5cbiAgICogQHBhcmFtIG1pbiBUaGUgbWluaW11bSBhbW91bnQgb2YgdGhlIGJsb2NrIGRyb3AuXG4gICAqIEBwYXJhbSBtYXggVGhlIG1heGltdW0gYW1vdW50IG9mIHRoZSBibG9jayBkcm9wLlxuICAgKiBAcGFyYW0gcHJvYmFiaWxpdHkgVGhlIHByb2JhYmlsaXR5IG9mIHRoZSBibG9jayBkcm9wLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBtaW46IG51bWJlcixcbiAgICBtYXg6IG51bWJlcixcbiAgICBwcm9iYWJpbGl0eTogbnVtYmVyXG4gICkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5taW4gPSBtaW47XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gICAgdGhpcy5wcm9iYWJpbGl0eSA9IHByb2JhYmlsaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGwgdGhlIGJsb2NrIGRyb3AgYW5kIHJldHVybiB0aGUgYW1vdW50IG9mIHRoZSBkcm9wLlxuICAgKiBAcmV0dXJucyBUaGUgYW1vdW50IG9mIHRoZSBkcm9wLlxuICAgKi9cbiAgcHVibGljIHJvbGwoKTogbnVtYmVyIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSBkcm9wLlxuICAgIGlmIChNYXRoLnJhbmRvbSgpID4gdGhpcy5wcm9iYWJpbGl0eSkgcmV0dXJuIDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiB0aGUgZHJvcC5cbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKHRoaXMubWF4IC0gdGhpcy5taW4gKyAxKSkgKyB0aGlzLm1pbjtcbiAgfVxufVxuXG5leHBvcnQgeyBJdGVtRHJvcCB9O1xuIiwgImltcG9ydCB7IENvbXBvdW5kVGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuaW1wb3J0IHsgQmxvY2tQcm9wZXJ0eSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBCbG9ja1R5cGVQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBCbG9ja0lkZW50aWZpZXIsIEl0ZW1DYXRlZ29yeSB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBCbG9ja1R5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5cbmNsYXNzIEN1c3RvbUJsb2NrVHlwZSBleHRlbmRzIEJsb2NrVHlwZSB7XG4gIHByb3RlY3RlZCBzdGF0aWMgbmV0d29ya0lkID0gMTAwMDA7IC8vIFN0YXJ0IGF0IDEwMDAwIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHZhbmlsbGEgYmxvY2sgdHlwZXMuXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBibG9jayB0eXBlIGlzIGN1c3RvbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjdXN0b20gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV0d29yayBJRCBvZiB0aGUgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV0d29ya0lkID0gKytDdXN0b21CbG9ja1R5cGUubmV0d29ya0lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIGJsb2NrIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEJsb2NrVHlwZVByb3BlcnRpZXM+XG4gICkge1xuICAgIHN1cGVyKGlkZW50aWZpZXIgYXMgQmxvY2tJZGVudGlmaWVyLCBwcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9OYnQodHlwZTogQ3VzdG9tQmxvY2tUeXBlKTogQ29tcG91bmRUYWcge1xuICAgIC8vIENyZWF0ZSBhIHJvb3QgY29tcG91bmQgdGFnIGZvciB0aGUgYmxvY2sgdHlwZS5cbiAgICBjb25zdCByb290ID0gbmV3IENvbXBvdW5kVGFnKCk7XG5cbiAgICAvLyBDcmVhdGUgYSBjb21wb3VuZCB0YWcgZm9yIHRoZSBibG9jayBkYXRhLlxuICAgIGNvbnN0IHZhbmlsbGFCbG9ja0RhdGEgPSByb290LmNyZWF0ZUNvbXBvdW5kVGFnKFwidmFuaWxsYV9ibG9ja19kYXRhXCIpO1xuICAgIHZhbmlsbGFCbG9ja0RhdGEuY3JlYXRlSW50VGFnKFwiYmxvY2tfaWRcIiwgdHlwZS5uZXR3b3JrSWQpOyAvLyBUaGUgYmxvY2sgbmV0d29yayBJRCwgdGhpcyBzaG91bGQgY29ycmVzcG9uZCB0byBhIG1hdGNoaW5nIGl0ZW0gdHlwZS5cblxuICAgIC8vIENyZWF0ZSBhIGNvbXBvdW5kIHRhZyBmb3IgY3JlYXRpdmUgaW52ZW50b3J5IGRhdGEuXG4gICAgY29uc3QgbWVudUNhdGVnb3J5RGF0YSA9IHJvb3QuY3JlYXRlQ29tcG91bmRUYWcoXCJtZW51X2NhdGVnb3J5XCIpO1xuICAgIG1lbnVDYXRlZ29yeURhdGEuY3JlYXRlU3RyaW5nVGFnKFwiY2F0ZWdvcnlcIiwgSXRlbUNhdGVnb3J5Lk5hdHVyZSk7IC8vIFRPRE86IEFkZCBhIHByb3BlcnR5IGZvciB0aGUgY3JlYXRpdmUgaW52ZW50b3J5IGNhdGVnb3J5LlxuICAgIC8vIG1lbnVDYXRlZ29yeURhdGEuY3JlYXRlU3RyaW5nVGFnKFwiZ3JvdXBcIiwgSXRlbUdyb3VwLik7IC8vIFRoZSBjcmVhdGl2ZSBpbnZlbnRvcnkgZ3JvdXAuXG5cbiAgICAvLyBDcmVhdGUgYSBjb21wb3VuZCB0YWcgZm9yIHRoZSBNb2xhbmcgZGF0YS5cbiAgICByb290LmNyZWF0ZUludFRhZyhcIm1vbGFuZ1ZlcnNpb25cIiwgMCk7IC8vIFRoZSB2ZXJzaW9uIG9mIHRoZSBNb2xhbmcgZGF0YSwgbm90IHN1cmUgd2hhdCB0aGlzIGluZGljYXRlcyBvbiB0aGUgY2xpZW50IGVuZC5cblxuICAgIC8vIFJldHVybiB0aGUgcm9vdCBjb21wb3VuZCB0YWcuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gYSBibG9jayBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIFRoZSBibG9jayBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdG9CbG9ja1Byb3BlcnR5KHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IEJsb2NrUHJvcGVydHkge1xuICAgIHJldHVybiBuZXcgQmxvY2tQcm9wZXJ0eSh0eXBlLmlkZW50aWZpZXIsIEN1c3RvbUJsb2NrVHlwZS50b05idCh0eXBlKSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQ3VzdG9tQmxvY2tUeXBlIH07XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vdHJhaXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludmVudG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2VpcmRvLWRpcmVjdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXBzaWRlLWRvd24tYml0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vcGVuLWJpdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXBwZXItYmxvY2stYml0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi92ZXJ0aWNhbC1oYWxmXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jYXJkaW5hbF9kaXJlY3Rpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RpcmVjdGlvblwiO1xuIiwgImNsYXNzIFRyYWl0IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSB0cmFpdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBpZGVudGlmaWVycyB0aGF0IHRoaXMgdHJhaXQgaXMgY29tcGF0aWJsZSB3aXRoIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgdHJhaXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllciA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBUcmFpdCkuaWRlbnRpZmllcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdHJhaXQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHRyYWl0IGlzIGFkZGVkIHRvIGFuIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBvbkFkZD8oKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHRyYWl0IGlzIHJlbW92ZWQgZnJvbSBhbiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgb25SZW1vdmU/KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB0cmFpdCBpcyB0aWNrZWQgYnkgdGhlIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIGRlbHRhVGljayBUaGUgZGVsdGEgdGljayBvZiB0aGUgdHJhaXQuXG4gICAqL1xuICBwdWJsaWMgb25UaWNrPyhkZWx0YVRpY2s6IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENsb25lcyB0aGUgdHJhaXQgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIGFyZ3VtZW50cyBUaGUgYXJndW1lbnRzIHRvIGNsb25lIHRoZSB0cmFpdCB3aXRoLlxuICAgKi9cbiAgcHVibGljIGNsb25lKC4uLl9hcmd1bWVudHM6IEFycmF5PHVua25vd24+KTogVHJhaXQge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmlkZW50aWZpZXJ9LmNsb25lKCkgaXMgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgVHJhaXQgfTtcbiIsICJpbXBvcnQgeyBWZWN0b3IzZiB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBCbG9ja0lkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IFRyYWl0IH0gZnJvbSBcIi4uLy4uL3RyYWl0XCI7XG5pbXBvcnQgeyBCbG9jayB9IGZyb20gXCIuLi9ibG9ja1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4uLy4uL2NvbnRhaW5lclwiO1xuXG5jbGFzcyBCbG9ja1RyYWl0IGV4dGVuZHMgVHJhaXQge1xuICAvKipcbiAgICogVGhlIGJsb2NrIHR5cGUgaWRlbnRpZmllcnMgdGhhdCB0aGlzIHRyYWl0IGlzIGNvbXBhdGlibGUgd2l0aCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlczogQXJyYXk8QmxvY2tJZGVudGlmaWVyPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgdGhhdCB0aGlzIHRyYWl0IGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJsb2NrOiBCbG9jaztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSBibG9jayBUaGUgYmxvY2sgdGhhdCB0aGlzIHRyYWl0IHdpbGwgYmUgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoYmxvY2s6IEJsb2NrKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJsb2NrID0gYmxvY2s7XG5cbiAgICAvLyBBZGQgdGhlIHRyYWl0IHRvIHRoZSBibG9jay5cbiAgICBibG9jay5hZGRUcmFpdCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgYmxvY2sgaXMgdXBkYXRlZCBpbiB0aGUgd29ybGQuXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgdXBkYXRlLCBpZiBhbnkuXG4gICAqL1xuICBwdWJsaWMgb25VcGRhdGU/KHNvdXJjZT86IEJsb2NrKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIHBsYWNlZCBpbiB0aGUgd29ybGQuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHBsYWNlZCB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBjbGlja1Bvc2l0aW9uIFRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgYWZmZWN0ZWQgYmxvY2sgd2FzIGNsaWNrZWQuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGJsb2NrIHBsYWNlbWVudCB3YXMgc3VjY2Vzc2Z1bDsgZGVmYXVsdCBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIG9uUGxhY2U/KHBsYXllcjogUGxheWVyLCBjbGlja1Bvc2l0aW9uOiBWZWN0b3IzZik6IGJvb2xlYW4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgYmxvY2sgaXMgYnJva2VuIGluIHRoZSB3b3JsZC5cbiAgICogQHBhcmFtIHBsYXllciBXaGV0aGVyIHRoZSBwbGF5ZXIgYnJva2UgdGhlIGJsb2NrOyBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgZGVmaW5lZC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgYmxvY2sgYnJlYWsgd2FzIHN1Y2Nlc3NmdWw7IGRlZmF1bHQgaXMgdHJ1ZS5cbiAgICovXG4gIHB1YmxpYyBvbkJyZWFrPyhwbGF5ZXI/OiBQbGF5ZXIpOiBib29sZWFuIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIHN0YXJ0ZWQgdG8gYmUgYnJva2VuIGluIHRoZSB3b3JsZC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgc3RhcnRlZCB0byBicmVhayB0aGUgYmxvY2suXG4gICAqL1xuICBwdWJsaWMgb25TdGFydEJyZWFrPyhwbGF5ZXI6IFBsYXllcik6IGJvb2xlYW4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgYmxvY2sgaXMgc3RvcHBlZCB0byBiZSBicm9rZW4gaW4gdGhlIHdvcmxkLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBzdG9wcGVkIGJyZWFraW5nIHRoZSBibG9jay5cbiAgICovXG4gIHB1YmxpYyBvblN0b3BCcmVhaz8ocGxheWVyOiBQbGF5ZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgYmxvY2sgaXMgaW50ZXJhY3RlZCB3aXRoIGJ5IGEgcGxheWVyLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnRlcmFjdGVkIHdpdGggdGhlIGJsb2NrLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBpbnRlcmFjdGlvbiB3YXMgc3VjY2Vzc2Z1bDsgZGVmYXVsdCBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIG9uSW50ZXJhY3Q/KHBsYXllcjogUGxheWVyKTogYm9vbGVhbiB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgcGxheWVyIHBpY2sgYmxvY2tzIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgcGlja2VkIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHdpdGhEYXRhIFdoZXRoZXIgdGhlIHBsYXllciBwaWNrZWQgdGhlIGJsb2NrIHdpdGggYSBkYXRhIHJlcXVlc3QuXG4gICAqL1xuICBwdWJsaWMgb25QaWNrPyhwbGF5ZXI6IFBsYXllciwgd2l0aERhdGE6IGJvb2xlYW4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIGNvbnRhaW5lciB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBibG9jayBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgdGhhdCB3YXMgdXBkYXRlZC5cbiAgICovXG4gIHB1YmxpYyBvbkNvbnRhaW5lclVwZGF0ZT8oY29udGFpbmVyOiBDb250YWluZXIpOiB2b2lkO1xufVxuXG5leHBvcnQgeyBCbG9ja1RyYWl0IH07XG4iLCAiaW1wb3J0IHtcbiAgQWJpbGl0eUluZGV4LFxuICBCbG9ja0V2ZW50UGFja2V0LFxuICBCbG9ja0V2ZW50VHlwZSxcbiAgQmxvY2tQb3NpdGlvbixcbiAgQ29udGFpbmVySWQsXG4gIENvbnRhaW5lclR5cGUsXG4gIExldmVsU291bmRFdmVudCxcbiAgTGV2ZWxTb3VuZEV2ZW50UGFja2V0LFxuICBWZWN0b3IzZlxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBCbG9ja0NvbnRhaW5lciB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgQmxvY2sgfSBmcm9tIFwiLi4vYmxvY2tcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9jb250YWluZXJcIjtcbmltcG9ydCB7IEl0ZW1TdGFja0VudHJ5LCBKU09OTGlrZU9iamVjdCB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uLy4uL2l0ZW1cIjtcblxuaW1wb3J0IHsgQmxvY2tUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmludGVyZmFjZSBJbnZlbnRvcnlDb21wb25lbnQgZXh0ZW5kcyBKU09OTGlrZU9iamVjdCB7XG4gIHNpemU6IG51bWJlcjtcbiAgaXRlbXM6IEFycmF5PFtudW1iZXIsIEl0ZW1TdGFja0VudHJ5XT47XG59XG5cbmNsYXNzIEJsb2NrSW52ZW50b3J5VHJhaXQgZXh0ZW5kcyBCbG9ja1RyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJpbnZlbnRvcnlcIjtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW0Jsb2NrSWRlbnRpZmllci5DaGVzdF07XG5cbiAgcHJvdGVjdGVkIG9wZW5lZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXI6IEJsb2NrQ29udGFpbmVyO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJUeXBlOiBDb250YWluZXJUeXBlO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJJZDogQ29udGFpbmVySWQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IGludmVudG9yeVNpemU6IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoYmxvY2s6IEJsb2NrKSB7XG4gICAgc3VwZXIoYmxvY2spO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb250YWluZXIgZm9yIHRoZSBibG9jayBiYXNlZCBvbiB0aGUgYmxvY2sgdHlwZVxuICAgIHN3aXRjaCAoYmxvY2suZ2V0VHlwZSgpLmlkZW50aWZpZXIpIHtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gU2V0IHRoZSBjb250YWluZXIgdHlwZSBhbmQgaWRcbiAgICAgICAgdGhpcy5jb250YWluZXJUeXBlID0gQ29udGFpbmVyVHlwZS5Db250YWluZXI7XG4gICAgICAgIHRoaXMuY29udGFpbmVySWQgPSBDb250YWluZXJJZC5Ob25lO1xuICAgICAgICB0aGlzLmludmVudG9yeVNpemUgPSAyNztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb250YWluZXIgZm9yIHRoZSB0cmFpdFxuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IEJsb2NrQ29udGFpbmVyKFxuICAgICAgYmxvY2ssXG4gICAgICB0aGlzLmNvbnRhaW5lclR5cGUsXG4gICAgICB0aGlzLmNvbnRhaW5lcklkLFxuICAgICAgdGhpcy5pbnZlbnRvcnlTaXplXG4gICAgKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBoYXMgYW4gaW52ZW50b3J5IGNvbXBvbmVudFxuICAgIGlmIChibG9jay5jb21wb25lbnRzLmhhcyhcImludmVudG9yeVwiKSkge1xuICAgICAgLy8gR2V0IHRoZSBpbnZlbnRvcnkgY29tcG9uZW50IGZyb20gdGhlIGJsb2NrXG4gICAgICBjb25zdCBpbnZlbnRvcnkgPSBibG9jay5jb21wb25lbnRzLmdldChcImludmVudG9yeVwiKSBhcyBJbnZlbnRvcnlDb21wb25lbnQ7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBlYWNoIGl0ZW0gaW4gdGhlIGludmVudG9yeVxuICAgICAgZm9yIChjb25zdCBbc2xvdCwgZW50cnldIG9mIGludmVudG9yeS5pdGVtcykge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgaXRlbSBzdGFja1xuICAgICAgICBjb25zdCBzdGFjayA9IG5ldyBJdGVtU3RhY2soZW50cnkuaWRlbnRpZmllciwge1xuICAgICAgICAgIGFtb3VudDogZW50cnkuYW1vdW50LFxuICAgICAgICAgIGF1eGlsbGFyeTogZW50cnkuYXV4aWxsYXJ5LFxuICAgICAgICAgIHdvcmxkOiBibG9jay5kaW1lbnNpb24ud29ybGQsXG4gICAgICAgICAgZW50cnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBpdGVtIHN0YWNrIHRvIHRoZSBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc2V0SXRlbShzbG90LCBzdGFjayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uSW50ZXJhY3QocGxheWVyOiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIHNuZWFraW5nXG4gICAgaWYgKHBsYXllci5pc1NuZWFraW5nIHx8ICFwbGF5ZXIuYWJpbGl0aWVzLmdldChBYmlsaXR5SW5kZXguT3BlbkNvbnRhaW5lcnMpKVxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gU2hvdyB0aGUgY29udGFpbmVyIHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLmNvbnRhaW5lci5zaG93KHBsYXllcik7XG4gIH1cblxuICBwdWJsaWMgb25CcmVhaygpOiB2b2lkIHtcbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIGl0ZW1zIGluIHRoZSBjb250YWluZXJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5jb250YWluZXIuc3RvcmFnZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgdmFsaWRcbiAgICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICAgIC8vIFNwYXduIHRoZSBpdGVtIGluIHRoZSB3b3JsZFxuICAgICAgY29uc3QgeyB4LCB5LCB6IH0gPSB0aGlzLmJsb2NrLnBvc2l0aW9uO1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5ibG9jay5kaW1lbnNpb24uc3Bhd25JdGVtKFxuICAgICAgICBpdGVtLFxuICAgICAgICBuZXcgVmVjdG9yM2YoeCArIDAuNSwgeSArIDAuNSwgeiArIDAuNSlcbiAgICAgICk7XG5cbiAgICAgIC8vIEFkZCBzb21lIHVwd2FyZHMgdmVsb2NpdHkgdG8gdGhlIGl0ZW0uXG4gICAgICBlbnRpdHkuc2V0TW90aW9uKG5ldyBWZWN0b3IzZigwLCAwLjEsIDApKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Db250YWluZXJVcGRhdGUoY29udGFpbmVyOiBDb250YWluZXIpOiB2b2lkIHtcbiAgICAvLyBWZXJpZnkgdGhlIGNvbnRhaW5lciBpcyB0aGUgc2FtZSBhcyB0aGUgYmxvY2sgY29udGFpbmVyXG4gICAgaWYgKGNvbnRhaW5lciAhPT0gdGhpcy5jb250YWluZXIpIHJldHVybjtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBpbnZlbnRvcnkgY29tcG9uZW50XG4gICAgY29uc3QgaW52ZW50b3J5OiBJbnZlbnRvcnlDb21wb25lbnQgPSB7XG4gICAgICBzaXplOiB0aGlzLmludmVudG9yeVNpemUsXG4gICAgICBpdGVtczogW11cbiAgICB9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggaXRlbSBpbiB0aGUgY29udGFpbmVyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmludmVudG9yeVNpemU7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBpdGVtIHN0YWNrIGF0IHRoZSBpbmRleFxuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY29udGFpbmVyLmdldEl0ZW0oaSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIG51bGxcbiAgICAgIGlmIChpdGVtID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgLy8gR2V0IHRoZSBkYXRhIGVudHJ5IG9mIHRoZSBpdGVtIHN0YWNrXG4gICAgICBjb25zdCBlbnRyeSA9IGl0ZW0uZ2V0RGF0YUVudHJ5KCk7XG5cbiAgICAgIC8vIFB1c2ggdGhlIGl0ZW0gc3RhY2sgZW50cnkgdG8gdGhlIGludmVudG9yeSBpdGVtc1xuICAgICAgaW52ZW50b3J5Lml0ZW1zLnB1c2goW2ksIGVudHJ5XSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBpbnZlbnRvcnkgY29tcG9uZW50IHRvIHRoZSBibG9ja1xuICAgIHRoaXMuYmxvY2suY29tcG9uZW50cy5zZXQoXCJpbnZlbnRvcnlcIiwgaW52ZW50b3J5KTtcbiAgfVxuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBoYXMgb2NjdXBhbnRzIGFuZCB0aGUgYmxvY2sgaXMgbm90IG9wZW5lZFxuICAgIGlmICh0aGlzLmNvbnRhaW5lci5vY2N1cGFudHMuc2l6ZSA+IDAgJiYgIXRoaXMub3BlbmVkKSB7XG4gICAgICAvLyBTZXQgdGhlIGJsb2NrIHN0YXRlIHRvIG9wZW5cbiAgICAgIHRoaXMub3BlbmVkID0gdHJ1ZTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IEJsb2NrRXZlbnRQYWNrZXRcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEJsb2NrRXZlbnRQYWNrZXQoKTtcbiAgICAgIGV2ZW50LnBvc2l0aW9uID0gdGhpcy5ibG9jay5wb3NpdGlvbjtcbiAgICAgIGV2ZW50LnR5cGUgPSBCbG9ja0V2ZW50VHlwZS5DaGFuZ2VTdGF0ZTtcbiAgICAgIGV2ZW50LmRhdGEgPSAxO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgTGV2ZWxTb3VuZEV2ZW50UGFja2V0XG4gICAgICBjb25zdCBzb3VuZCA9IG5ldyBMZXZlbFNvdW5kRXZlbnRQYWNrZXQoKTtcbiAgICAgIHNvdW5kLnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi50b1ZlY3RvcjNmKHRoaXMuYmxvY2sucG9zaXRpb24pO1xuICAgICAgc291bmQuZGF0YSA9IHRoaXMuYmxvY2sucGVybXV0YXRpb24ubmV0d29yaztcbiAgICAgIHNvdW5kLmFjdG9ySWRlbnRpZmllciA9IFN0cmluZygpO1xuICAgICAgc291bmQuaXNCYWJ5TW9iID0gZmFsc2U7XG4gICAgICBzb3VuZC5pc0dsb2JhbCA9IGZhbHNlO1xuXG4gICAgICAvLyBTZXQgdGhlIHNvdW5kIGV2ZW50IGJhc2VkIG9uIHRoZSBibG9jayB0eXBlXG4gICAgICBzd2l0Y2ggKHRoaXMuYmxvY2suZ2V0VHlwZSgpLmlkZW50aWZpZXIpIHtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHNvdW5kLmV2ZW50ID0gLTEgYXMgTGV2ZWxTb3VuZEV2ZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBCbG9ja0lkZW50aWZpZXIuQ2hlc3Q6XG4gICAgICAgIGNhc2UgQmxvY2tJZGVudGlmaWVyLlRyYXBwZWRDaGVzdDoge1xuICAgICAgICAgIHNvdW5kLmV2ZW50ID0gTGV2ZWxTb3VuZEV2ZW50LkNoZXN0T3BlbjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcm9hZGNhc3QgdGhlIGJsb2NrIGV2ZW50IHBhY2tldFxuICAgICAgdGhpcy5ibG9jay5kaW1lbnNpb24uYnJvYWRjYXN0KGV2ZW50LCBzb3VuZCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBoYXMgbm8gb2NjdXBhbnRzXG4gICAgaWYgKHRoaXMuY29udGFpbmVyLm9jY3VwYW50cy5zaXplID09PSAwICYmIHRoaXMub3BlbmVkKSB7XG4gICAgICAvLyBTZXQgdGhlIGJsb2NrIHN0YXRlIHRvIGNsb3NlZFxuICAgICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJsb2NrIGV2ZW50IHBhY2tldFxuICAgICAgY29uc3QgcGFja2V0ID0gbmV3IEJsb2NrRXZlbnRQYWNrZXQoKTtcbiAgICAgIHBhY2tldC5wb3NpdGlvbiA9IHRoaXMuYmxvY2sucG9zaXRpb247XG4gICAgICBwYWNrZXQudHlwZSA9IEJsb2NrRXZlbnRUeXBlLkNoYW5nZVN0YXRlO1xuICAgICAgcGFja2V0LmRhdGEgPSAwO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgbGV2ZWwgc291bmQgZXZlbnQgcGFja2V0XG4gICAgICBjb25zdCBzb3VuZCA9IG5ldyBMZXZlbFNvdW5kRXZlbnRQYWNrZXQoKTtcbiAgICAgIHNvdW5kLnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi50b1ZlY3RvcjNmKHRoaXMuYmxvY2sucG9zaXRpb24pO1xuICAgICAgc291bmQuZGF0YSA9IHRoaXMuYmxvY2sucGVybXV0YXRpb24ubmV0d29yaztcbiAgICAgIHNvdW5kLmFjdG9ySWRlbnRpZmllciA9IFN0cmluZygpO1xuICAgICAgc291bmQuaXNCYWJ5TW9iID0gZmFsc2U7XG4gICAgICBzb3VuZC5pc0dsb2JhbCA9IGZhbHNlO1xuXG4gICAgICAvLyBTZXQgdGhlIHNvdW5kIGV2ZW50IGJhc2VkIG9uIHRoZSBibG9jayB0eXBlXG4gICAgICBzd2l0Y2ggKHRoaXMuYmxvY2suZ2V0VHlwZSgpLmlkZW50aWZpZXIpIHtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHNvdW5kLmV2ZW50ID0gLTEgYXMgTGV2ZWxTb3VuZEV2ZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBCbG9ja0lkZW50aWZpZXIuQ2hlc3Q6XG4gICAgICAgIGNhc2UgQmxvY2tJZGVudGlmaWVyLlRyYXBwZWRDaGVzdDoge1xuICAgICAgICAgIHNvdW5kLmV2ZW50ID0gTGV2ZWxTb3VuZEV2ZW50LkNoZXN0Q2xvc2VkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJyb2FkY2FzdCB0aGUgYmxvY2sgZXZlbnQgcGFja2V0XG4gICAgICB0aGlzLmJsb2NrLmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0LCBzb3VuZCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEJsb2NrSW52ZW50b3J5VHJhaXQgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBDYXJkaW5hbERpcmVjdGlvbiB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBCbG9ja1RyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgQmxvY2tXZWlyZG9EaXJlY3Rpb25UcmFpdCBleHRlbmRzIEJsb2NrVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcIndlaXJkb19kaXJlY3Rpb25cIjtcblxuICBwdWJsaWMgb25QbGFjZShwbGF5ZXI6IFBsYXllcik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgY2FyZGluYWwgZGlyZWN0aW9uXG4gICAgY29uc3QgZGlyZWN0aW9uID0gcGxheWVyLmdldENhcmRpbmFsRGlyZWN0aW9uKCk7XG5cbiAgICAvLyBTZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2tcbiAgICB0aGlzLnNldERpcmVjdGlvbihkaXJlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0byBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0RGlyZWN0aW9uKGRpcmVjdGlvbjogQ2FyZGluYWxEaXJlY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGJsb2NrIHR5cGVcbiAgICBjb25zdCB0eXBlID0gdGhpcy5ibG9jay5nZXRUeXBlKCk7XG5cbiAgICAvLyBHZXQgdGhlIHN0YXRlIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ibG9jay5wZXJtdXRhdGlvbi5zdGF0ZTtcblxuICAgIC8vIENyZWF0ZSB0aGUgc3RhdGUgb2YgdGhlIGJsb2NrXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHdlaXJkb19kaXJlY3Rpb246IGRpcmVjdGlvblxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gdHlwZS5nZXRQZXJtdXRhdGlvbihuZXdTdGF0ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgIGlmIChwZXJtdXRhdGlvbikgdGhpcy5ibG9jay5zZXRQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2tXZWlyZG9EaXJlY3Rpb25UcmFpdCB9O1xuIiwgImltcG9ydCB7IFZlY3RvcjNmIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgQmxvY2tUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEJsb2NrVXBzaWRlRG93bkJpdFRyYWl0IGV4dGVuZHMgQmxvY2tUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwidXBzaWRlX2Rvd25fYml0XCI7XG5cbiAgcHVibGljIG9uUGxhY2UoXzogUGxheWVyLCBjbGlja1Bvc2l0aW9uOiBWZWN0b3IzZik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjbGljayBwb3NpdGlvbiBpcyBvbiB0aGUgdG9wIGZhY2Ugb2YgdGhlIGJsb2NrXG4gICAgaWYgKGNsaWNrUG9zaXRpb24ueSA9PT0gMSkgcmV0dXJuIHRoaXMuc2V0VXBzaWRlRG93bihmYWxzZSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2sgcG9zaXRpb24gaXMgb24gdGhlIGJvdHRvbSBmYWNlIG9mXG4gICAgaWYgKGNsaWNrUG9zaXRpb24ueSA9PT0gMCkgcmV0dXJuIHRoaXMuc2V0VXBzaWRlRG93bih0cnVlKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBuZWVkcyB0byBiZSB1cHNpZGUgZG93blxuICAgIGNvbnN0IHVwc2lkZURvd24gPSBjbGlja1Bvc2l0aW9uLnkgPiAwLjU7XG5cbiAgICAvLyBTZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2tcbiAgICByZXR1cm4gdGhpcy5zZXRVcHNpZGVEb3duKHVwc2lkZURvd24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0byBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0VXBzaWRlRG93bih1cHNpZGVEb3duOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBibG9jayB0eXBlXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuYmxvY2suZ2V0VHlwZSgpO1xuXG4gICAgLy8gR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYmxvY2sucGVybXV0YXRpb24uc3RhdGU7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHN0YXRlIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICB1cHNpZGVfZG93bl9iaXQ6IHVwc2lkZURvd25cbiAgICB9O1xuXG4gICAgLy8gU2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrXG4gICAgY29uc3QgcGVybXV0YXRpb24gPSB0eXBlLmdldFBlcm11dGF0aW9uKG5ld1N0YXRlKTtcblxuICAgIC8vIFNldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrXG4gICAgaWYgKHBlcm11dGF0aW9uKSB0aGlzLmJsb2NrLnNldFBlcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja1Vwc2lkZURvd25CaXRUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIEFiaWxpdHlJbmRleCxcbiAgQmxvY2tQb3NpdGlvbixcbiAgTGV2ZWxTb3VuZEV2ZW50LFxuICBMZXZlbFNvdW5kRXZlbnRQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB7IEJsb2NrIH0gZnJvbSBcIi4uL2Jsb2NrXCI7XG5cbmltcG9ydCB7IEJsb2NrVHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5jbGFzcyBCbG9ja09wZW5CaXRUcmFpdCBleHRlbmRzIEJsb2NrVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcIm9wZW5fYml0XCI7XG5cbiAgcHVibGljIG9uSW50ZXJhY3QocGxheWVyOiBQbGF5ZXIpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGNhbiBvcGVuIGRvb3JzXG4gICAgaWYgKCFwbGF5ZXIuYWJpbGl0aWVzLmdldChBYmlsaXR5SW5kZXguRG9vcnNBbmRTd2l0Y2hlcykpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEdldCB0aGUgc3RhdGUgb2YgdGhlIGJsb2NrXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJsb2NrLnBlcm11dGF0aW9uLnN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gR2V0IHRoZSBvcGVuIGJpdCBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBvcGVuQml0ID0gc3RhdGUub3Blbl9iaXQgYXMgYm9vbGVhbjtcblxuICAgIC8vIFNldCB0aGUgYml0IG9mIHRoZSBibG9ja1xuICAgIHRoaXMuc2V0Qml0KCFvcGVuQml0KTtcblxuICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgc25lYWtpbmcsIHdlIHNob3VsZCBwbGFjZSB0aGUgYmxvY2sgYW5kIGludGVyYWN0IHdpdGggaXQgZG9vci5cbiAgICAvLyBJZiB0aGUgcGxheWVyIGlzIG5vdCBzbmVha2luZywgd2Ugc2hvdWxkIGp1c3QgaW50ZXJhY3Qgd2l0aCB0aGUgZG9vci5cbiAgICByZXR1cm4gcGxheWVyLmlzU25lYWtpbmc7IC8vIFRoZSBzbmVha2luZyBzdGF0ZSBvZiB0aGUgcGxheWVyIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjdGlvbi5cbiAgfVxuXG4gIHB1YmxpYyBzZXRCaXQob3BlbjogYm9vbGVhbiwgc2lsZW50ID0gZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGJsb2NrIHR5cGVcbiAgICBjb25zdCB0eXBlID0gdGhpcy5ibG9jay5nZXRUeXBlKCk7XG5cbiAgICAvLyBHZXQgdGhlIHN0YXRlIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ibG9jay5wZXJtdXRhdGlvbi5zdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBpcyBhIGRvb3JcbiAgICBpZiAodHlwZW9mIHN0YXRlW1widXBwZXJfYmxvY2tfYml0XCJdID09PSBcImJvb2xlYW5cIikge1xuICAgICAgLy8gR2V0IHRoZSB1cHBlciBibG9jayBiaXQgb2YgdGhlIGJsb2NrXG4gICAgICBjb25zdCB1cHBlckJsb2NrQml0ID0gc3RhdGVbXCJ1cHBlcl9ibG9ja19iaXRcIl0gYXMgYm9vbGVhbjtcblxuICAgICAgLy8gR2V0IHRoZSBhYm92ZSBhbmQgYmVsb3cgYmxvY2tzXG4gICAgICAvLyBHZXQgdGhlIGFib3ZlIGFuZCBiZWxvdyBibG9ja3NcbiAgICAgIGNvbnN0IGFib3ZlOiBCbG9jayA9IHVwcGVyQmxvY2tCaXQgPyB0aGlzLmJsb2NrIDogdGhpcy5ibG9jay5hYm92ZSgpO1xuICAgICAgY29uc3QgYmVsb3c6IEJsb2NrID0gdXBwZXJCbG9ja0JpdCA/IHRoaXMuYmxvY2suYmVsb3coKSA6IHRoaXMuYmxvY2s7XG5cbiAgICAgIC8vIEdldCB0aGUgc3RhdGUgb2YgdGhlIGFib3ZlIGJsb2NrXG4gICAgICBjb25zdCBhYm92ZVN0YXRlID0gYWJvdmUucGVybXV0YXRpb24uc3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgc3RhdGUgb2YgdGhlIGFib3ZlIGJsb2NrXG4gICAgICBjb25zdCBhYm92ZU5ld1N0YXRlID0ge1xuICAgICAgICAuLi5hYm92ZVN0YXRlLFxuICAgICAgICBvcGVuX2JpdDogb3BlblxuICAgICAgfTtcblxuICAgICAgLy8gR2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYWJvdmUgYmxvY2tcbiAgICAgIGNvbnN0IGFib3ZlUGVybXV0YXRpb24gPSB0eXBlLmdldFBlcm11dGF0aW9uKGFib3ZlTmV3U3RhdGUpO1xuXG4gICAgICAvLyBTZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBhYm92ZSBibG9ja1xuICAgICAgaWYgKGFib3ZlUGVybXV0YXRpb24pIGFib3ZlLnNldFBlcm11dGF0aW9uKGFib3ZlUGVybXV0YXRpb24pO1xuXG4gICAgICAvLyBHZXQgdGhlIHN0YXRlIG9mIHRoZSBiZWxvdyBibG9ja1xuICAgICAgY29uc3QgYmVsb3dTdGF0ZSA9IGJlbG93LnBlcm11dGF0aW9uLnN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN0YXRlIG9mIHRoZSBiZWxvdyBibG9ja1xuICAgICAgY29uc3QgYmVsb3dOZXdTdGF0ZSA9IHtcbiAgICAgICAgLi4uYmVsb3dTdGF0ZSxcbiAgICAgICAgb3Blbl9iaXQ6IG9wZW5cbiAgICAgIH07XG5cbiAgICAgIC8vIEdldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJlbG93IGJsb2NrXG4gICAgICBjb25zdCBiZWxvd1Blcm11dGF0aW9uID0gdHlwZS5nZXRQZXJtdXRhdGlvbihiZWxvd05ld1N0YXRlKTtcblxuICAgICAgLy8gU2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmVsb3cgYmxvY2tcbiAgICAgIGlmIChiZWxvd1Blcm11dGF0aW9uKSBiZWxvdy5zZXRQZXJtdXRhdGlvbihiZWxvd1Blcm11dGF0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2tcbiAgICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgb3Blbl9iaXQ6IG9wZW5cbiAgICAgIH07XG5cbiAgICAgIC8vIEdldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrXG4gICAgICBjb25zdCBwZXJtdXRhdGlvbiA9IHR5cGUuZ2V0UGVybXV0YXRpb24obmV3U3RhdGUpO1xuXG4gICAgICAvLyBTZXQgdGhlIHBlcm11dGF0aW9uIG9mIHRoZSBibG9ja1xuICAgICAgaWYgKHBlcm11dGF0aW9uKSB0aGlzLmJsb2NrLnNldFBlcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgaXMgc2lsZW50XG4gICAgaWYgKHNpbGVudCkgcmV0dXJuO1xuXG4gICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYmxvY2sgYW5kIHRoZSBpZGVudGlmaWVyXG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuYmxvY2suZ2V0VHlwZSgpLmlkZW50aWZpZXI7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGxldmVsIHNvdW5kIGV2ZW50IHBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMZXZlbFNvdW5kRXZlbnRQYWNrZXQoKTtcbiAgICBwYWNrZXQuZGF0YSA9IHRoaXMuYmxvY2sucGVybXV0YXRpb24ubmV0d29yaztcbiAgICBwYWNrZXQuZXZlbnQgPSBvcGVuID8gTGV2ZWxTb3VuZEV2ZW50LkRvb3JPcGVuIDogTGV2ZWxTb3VuZEV2ZW50LkRvb3JDbG9zZTtcbiAgICBwYWNrZXQucG9zaXRpb24gPSBCbG9ja1Bvc2l0aW9uLnRvVmVjdG9yM2YodGhpcy5ibG9jay5wb3NpdGlvbik7XG4gICAgcGFja2V0LmFjdG9ySWRlbnRpZmllciA9IFN0cmluZygpO1xuICAgIHBhY2tldC5pc0JhYnlNb2IgPSBmYWxzZTtcbiAgICBwYWNrZXQuaXNHbG9iYWwgPSB0cnVlO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIGlzIGEgdHJhcGRvb3JcbiAgICBpZiAoaWRlbnRpZmllci5pbmNsdWRlcyhcInRyYXBkb29yXCIpKSB7XG4gICAgICBwYWNrZXQuZXZlbnQgPSBvcGVuXG4gICAgICAgID8gTGV2ZWxTb3VuZEV2ZW50LlRyYXBkb29yT3BlblxuICAgICAgICA6IExldmVsU291bmRFdmVudC5UcmFwZG9vckNsb3NlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBpcyBhIGZlbmNlIGdhdGVcbiAgICBpZiAoaWRlbnRpZmllci5pbmNsdWRlcyhcImZlbmNlX2dhdGVcIikpIHtcbiAgICAgIHBhY2tldC5ldmVudCA9IG9wZW5cbiAgICAgICAgPyBMZXZlbFNvdW5kRXZlbnQuRmVuY2VHYXRlT3BlblxuICAgICAgICA6IExldmVsU291bmRFdmVudC5GZW5jZUdhdGVDbG9zZTtcbiAgICB9XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIGRpbWVuc2lvblxuICAgIHRoaXMuYmxvY2suZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuICB9XG59XG5cbmV4cG9ydCB7IEJsb2NrT3BlbkJpdFRyYWl0IH07XG4iLCAiaW1wb3J0IHsgQmxvY2tUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEJsb2NrVXBwZXJCaXRUcmFpdCBleHRlbmRzIEJsb2NrVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInVwcGVyX2Jsb2NrX2JpdFwiO1xuXG4gIHB1YmxpYyBvblBsYWNlKCk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgYWJvdmUgYmxvY2tcbiAgICBjb25zdCBhYm92ZSA9IHRoaXMuYmxvY2suYWJvdmUoKTtcblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ibG9jay5wZXJtdXRhdGlvbi5zdGF0ZTtcblxuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICB1cHBlcl9ibG9ja19iaXQ6IHRydWVcbiAgICB9O1xuXG4gICAgY29uc3QgcGVybXV0YXRpb24gPSB0aGlzLmJsb2NrLmdldFR5cGUoKS5nZXRQZXJtdXRhdGlvbihuZXdTdGF0ZSk7XG5cbiAgICBhYm92ZS5zZXRQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2tVcHBlckJpdFRyYWl0IH07XG4iLCAiaW1wb3J0IHsgVmVjdG9yM2YgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBCbG9ja1RyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgVmVydGljYWxIYWxmVHJhaXQgZXh0ZW5kcyBCbG9ja1RyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJtaW5lY3JhZnQ6dmVydGljYWxfaGFsZlwiO1xuXG4gIHB1YmxpYyBvblBsYWNlKF9wbGF5ZXI6IFBsYXllciwgY2xpY2tQb3NpdGlvbjogVmVjdG9yM2YpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2sgcG9zaXRpb24gaXMgYWJvdmUgdGhlIGNlbnRlciBvZiB0aGUgYmxvY2tcbiAgICBpZiAoY2xpY2tQb3NpdGlvbi55ID4gMC41ICYmIGNsaWNrUG9zaXRpb24ueSA8IDAuOTkpXG4gICAgICB0aGlzLnNldFZlcnRpY2FsSGFsZih0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkludGVyYWN0KHBsYXllcjogUGxheWVyKTogYm9vbGVhbiB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXJzIGhlbGQgaXRlbVxuICAgIGNvbnN0IGl0ZW1TdGFjayA9IHBsYXllci5nZXRIZWxkSXRlbSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0YWNrIGhhcyBhIGJsb2NrIHR5cGVcbiAgICBpZiAoIWl0ZW1TdGFjayB8fCAhaXRlbVN0YWNrLnR5cGUuYmxvY2spIHJldHVybiB0cnVlO1xuXG4gICAgLy8gR2V0IHRoZSBibG9jayB0eXBlIG9mIHRoZSBpdGVtXG4gICAgY29uc3QgYmxvY2tUeXBlID0gaXRlbVN0YWNrLnR5cGUuYmxvY2s7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgdHlwZSBpcyBlcXVhbCB0byB0aGUgaW50ZXJhY3RpbmcgYmxvY2tcbiAgICBpZiAoYmxvY2tUeXBlICE9PSB0aGlzLmJsb2NrLmdldFR5cGUoKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc2V0VmVydGljYWxIYWxmKHRvcEJpdDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgYmxvY2sgdHlwZVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmJsb2NrLmdldFR5cGUoKTtcblxuICAgIC8vIEdldCB0aGUgc3RhdGUgb2YgdGhlIGJsb2NrXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJsb2NrLnBlcm11dGF0aW9uLnN0YXRlO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgXCJtaW5lY3JhZnQ6dmVydGljYWxfaGFsZlwiOiB0b3BCaXQgPyBcInRvcFwiIDogXCJib3R0b21cIlxuICAgIH07XG5cbiAgICAvLyBTZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IHR5cGUuZ2V0UGVybXV0YXRpb24obmV3U3RhdGUpO1xuXG4gICAgLy8gU2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmxvY2tcbiAgICBpZiAocGVybXV0YXRpb24pIHRoaXMuYmxvY2suc2V0UGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICB9XG59XG5cbmV4cG9ydCB7IFZlcnRpY2FsSGFsZlRyYWl0IH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgQ2FyZGluYWxEaXJlY3Rpb24gfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgQmxvY2tUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEJsb2NrQ2FyZGluYWxEaXJlY3Rpb25UcmFpdCBleHRlbmRzIEJsb2NrVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcIm1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb25cIjtcblxuICBwdWJsaWMgb25QbGFjZShwbGF5ZXI6IFBsYXllcik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgY2FyZGluYWwgZGlyZWN0aW9uXG4gICAgY29uc3QgZGlyZWN0aW9uID0gcGxheWVyLmdldENhcmRpbmFsRGlyZWN0aW9uKCk7XG5cbiAgICAvLyBTZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2sgdG8gdGhlIG9wcG9zaXRlIG9mIHRoZSBwbGF5ZXIncyBkaXJlY3Rpb25cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSBDYXJkaW5hbERpcmVjdGlvbi5Ob3J0aDpcbiAgICAgICAgdGhpcy5zZXREaXJlY3Rpb24oQ2FyZGluYWxEaXJlY3Rpb24uU291dGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FyZGluYWxEaXJlY3Rpb24uU291dGg6XG4gICAgICAgIHRoaXMuc2V0RGlyZWN0aW9uKENhcmRpbmFsRGlyZWN0aW9uLk5vcnRoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENhcmRpbmFsRGlyZWN0aW9uLkVhc3Q6XG4gICAgICAgIHRoaXMuc2V0RGlyZWN0aW9uKENhcmRpbmFsRGlyZWN0aW9uLldlc3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FyZGluYWxEaXJlY3Rpb24uV2VzdDpcbiAgICAgICAgdGhpcy5zZXREaXJlY3Rpb24oQ2FyZGluYWxEaXJlY3Rpb24uRWFzdCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gdG8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldERpcmVjdGlvbihkaXJlY3Rpb246IENhcmRpbmFsRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBibG9jayB0eXBlXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuYmxvY2suZ2V0VHlwZSgpO1xuXG4gICAgLy8gR2V0IHRoZSBzdGF0ZSBvZiB0aGUgYmxvY2tcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYmxvY2sucGVybXV0YXRpb24uc3RhdGU7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHN0YXRlIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBcIm1pbmVjcmFmdDpjYXJkaW5hbF9kaXJlY3Rpb25cIjogQ2FyZGluYWxEaXJlY3Rpb25bZGlyZWN0aW9uXS50b0xvd2VyQ2FzZSgpXG4gICAgfTtcblxuICAgIC8vIEdldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrXG4gICAgY29uc3QgcGVybXV0YXRpb24gPSB0eXBlLmdldFBlcm11dGF0aW9uKG5ld1N0YXRlKTtcblxuICAgIC8vIFNldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrXG4gICAgaWYgKHBlcm11dGF0aW9uKSB0aGlzLmJsb2NrLnNldFBlcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja0NhcmRpbmFsRGlyZWN0aW9uVHJhaXQgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBDYXJkaW5hbERpcmVjdGlvbiB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBCbG9ja1RyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgQmxvY2tEaXJlY3Rpb25UcmFpdCBleHRlbmRzIEJsb2NrVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImRpcmVjdGlvblwiO1xuXG4gIHB1YmxpYyBvblBsYWNlKHBsYXllcjogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIncyBjYXJkaW5hbCBkaXJlY3Rpb25cbiAgICBjb25zdCBkaXJlY3Rpb24gPSBwbGF5ZXIuZ2V0Q2FyZGluYWxEaXJlY3Rpb24oKTtcblxuICAgIC8vIFNldCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBibG9jayB0byB0aGUgb3Bwb3NpdGUgb2YgdGhlIHBsYXllcidzIGRpcmVjdGlvblxuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlIENhcmRpbmFsRGlyZWN0aW9uLk5vcnRoOlxuICAgICAgICB0aGlzLnNldERpcmVjdGlvbihDYXJkaW5hbERpcmVjdGlvbi5Tb3V0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDYXJkaW5hbERpcmVjdGlvbi5Tb3V0aDpcbiAgICAgICAgdGhpcy5zZXREaXJlY3Rpb24oQ2FyZGluYWxEaXJlY3Rpb24uTm9ydGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ2FyZGluYWxEaXJlY3Rpb24uRWFzdDpcbiAgICAgICAgdGhpcy5zZXREaXJlY3Rpb24oQ2FyZGluYWxEaXJlY3Rpb24uV2VzdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDYXJkaW5hbERpcmVjdGlvbi5XZXN0OlxuICAgICAgICB0aGlzLnNldERpcmVjdGlvbihDYXJkaW5hbERpcmVjdGlvbi5FYXN0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiB0byBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0RGlyZWN0aW9uKGRpcmVjdGlvbjogQ2FyZGluYWxEaXJlY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGJsb2NrIHR5cGVcbiAgICBjb25zdCB0eXBlID0gdGhpcy5ibG9jay5nZXRUeXBlKCk7XG5cbiAgICAvLyBHZXQgdGhlIHN0YXRlIG9mIHRoZSBibG9ja1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ibG9jay5wZXJtdXRhdGlvbi5zdGF0ZTtcblxuICAgIC8vIENyZWF0ZSB0aGUgc3RhdGUgb2YgdGhlIGJsb2NrXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgfTtcblxuICAgIC8vIEdldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrXG4gICAgY29uc3QgcGVybXV0YXRpb24gPSB0eXBlLmdldFBlcm11dGF0aW9uKG5ld1N0YXRlKTtcblxuICAgIC8vIFNldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrXG4gICAgaWYgKHBlcm11dGF0aW9uKSB0aGlzLmJsb2NrLnNldFBlcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja0RpcmVjdGlvblRyYWl0IH07XG4iLCAiaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBCbG9ja1N0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBCbG9ja0VudW0gfSBmcm9tIFwiLi5cIjtcblxuaW1wb3J0IHsgQmxvY2tQZXJtdXRhdGlvbiwgQmxvY2tUeXBlLCBDdXN0b21CbG9ja1R5cGUgfSBmcm9tIFwiLi9pZGVudGl0eVwiO1xuXG5pbXBvcnQgeyBCbG9ja1RyYWl0cyB9IGZyb20gXCIuXCI7XG5cbmltcG9ydCB0eXBlIHsgQmxvY2tUcmFpdCB9IGZyb20gXCIuL3RyYWl0c1wiO1xuXG5jbGFzcyBCbG9ja1BhbGV0dGUge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgYmxvY2sgdHlwZXMgZm9yIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzID0gQmxvY2tUeXBlLnR5cGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBibG9jayBwZXJtdXRhdGlvbnMgZm9yIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcm11dGF0aW9ucyA9IEJsb2NrUGVybXV0YXRpb24ucGVybXV0YXRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBibG9jayB0cmFpdHMgZm9yIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0cyA9IG5ldyBNYXA8c3RyaW5nLCB0eXBlb2YgQmxvY2tUcmFpdD4oKTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdHJ5IGZvciB0aGUgYmxvY2sgdHJhaXRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gbmV3IE1hcDxcbiAgICBCbG9ja0lkZW50aWZpZXIsXG4gICAgQXJyYXk8dHlwZW9mIEJsb2NrVHJhaXQ+XG4gID4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gUmVnaXN0ZXIgYWxsIGJsb2NrIHRyYWl0cy5cbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIEJsb2NrVHJhaXRzKSB0aGlzLnJlZ2lzdGVyVHJhaXQodHJhaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIGJsb2NrIHR5cGVzIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEByZXR1cm5zIEFsbCBibG9jayB0eXBlcyBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIGdldEFsbFR5cGVzKCk6IEFycmF5PEJsb2NrVHlwZT4ge1xuICAgIHJldHVybiBbLi4udGhpcy50eXBlcy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgY3VzdG9tIGJsb2NrIHR5cGVzIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEByZXR1cm5zIEFsbCBjdXN0b20gYmxvY2sgdHlwZXMgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGxDdXN0b21UeXBlcygpOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxUeXBlcygpLmZpbHRlcigodHlwZSkgPT4gdHlwZSBpbnN0YW5jZW9mIEN1c3RvbUJsb2NrVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgYmxvY2sgcGVybXV0YXRpb25zIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEByZXR1cm5zIEFsbCBibG9jayBwZXJtdXRhdGlvbnMgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGxQZXJtdXRhdGlvbnMoKTogQXJyYXk8QmxvY2tQZXJtdXRhdGlvbj4ge1xuICAgIHJldHVybiBbLi4udGhpcy5wZXJtdXRhdGlvbnMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBibG9jayB0eXBlIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBibG9jayBpZGVudGlmaWVyIHRvIGdldC5cbiAgICogQHJldHVybnMgVGhlIGJsb2NrIHR5cGUgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlVHlwZShpZGVudGlmaWVyOiBCbG9ja0lkZW50aWZpZXIpOiBCbG9ja1R5cGUge1xuICAgIHJldHVybiB0aGlzLnR5cGVzLmdldChpZGVudGlmaWVyKSBhcyBCbG9ja1R5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBibG9jayBwZXJtdXRhdGlvbiBmcm9tIHRoZSBibG9jayBpZGVudGlmaWVyIGFuZCBzdGF0ZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGJsb2NrIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS5cbiAgICogQHBhcmFtIHN0YXRlIFRoZSBibG9jayBzdGF0ZSB0byByZXNvbHZlLlxuICAgKiBAcmV0dXJucyBUaGUgYmxvY2sgcGVybXV0YXRpb24gZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlUGVybXV0YXRpb248VCBleHRlbmRzIGtleW9mIEJsb2NrU3RhdGU+KFxuICAgIGlkZW50aWZpZXI6IFQsXG4gICAgc3RhdGU/OiBCbG9ja1N0YXRlW1RdXG4gICk6IEJsb2NrUGVybXV0YXRpb248VD4ge1xuICAgIC8vIEdldCB0aGUgYmxvY2sgdHlwZSBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5yZXNvbHZlVHlwZShpZGVudGlmaWVyIGFzIEJsb2NrSWRlbnRpZmllcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgdHlwZSBleGlzdHMuXG4gICAgaWYgKCF0eXBlKVxuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVBlcm11dGF0aW9uKFxuICAgICAgICBCbG9ja0lkZW50aWZpZXIuQWlyXG4gICAgICApIGFzIEJsb2NrUGVybXV0YXRpb248VD47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgc3RhdGUgaXMgbm90IHByb3ZpZGVkLlxuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gdHlwZS5wZXJtdXRhdGlvbnMuZmluZCgocGVybXV0YXRpb24pID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHN0YXRlKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGJsb2NrIHN0YXRlLlxuICAgICAgICBjb25zdCB2YWx1ZSA9IChwZXJtdXRhdGlvbi5zdGF0ZSBhcyBuZXZlcilba2V5XTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBib29sZWFuXG4gICAgICAgIGNvbnN0IGJvb2wgPSB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RhdGUgdG8gYSBib29sZWFuIGlmIGl0IGlzIGEgYm9vbGVhbi5cbiAgICAgICAgY29uc3QgcXVlcnkgPVxuICAgICAgICAgIGJvb2wgJiYgKHN0YXRlW2tleV0gPT09IDAgfHwgc3RhdGVba2V5XSA9PT0gMSlcbiAgICAgICAgICAgID8gc3RhdGVba2V5XSA9PT0gMVxuICAgICAgICAgICAgOiBzdGF0ZVtrZXldO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBzdGF0ZSBtYXRjaGVzXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gcXVlcnkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGJsb2NrIHBlcm11dGF0aW9uIG1hdGNoZXMuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBwZXJtdXRhdGlvbiBkb2VzIG5vdCBleGlzdC5cbiAgICBpZiAoIXBlcm11dGF0aW9uKSB7XG4gICAgICAvLyBSZXR1cm4gdGhlIGRlZmF1bHQgcGVybXV0YXRpb24gaWYgdGhlIHN0YXRlIGlzIG5vdCBmb3VuZC5cbiAgICAgIHJldHVybiB0eXBlLnBlcm11dGF0aW9uc1swXSBhcyBCbG9ja1Blcm11dGF0aW9uPFQ+O1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgYmxvY2sgcGVybXV0YXRpb24uXG4gICAgcmV0dXJuIHBlcm11dGF0aW9uIGFzIEJsb2NrUGVybXV0YXRpb248VD47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBibG9jayB0eXBlIHRvIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgYmxvY2sgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgYmxvY2sgdHlwZSB3YXMgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclR5cGUodHlwZTogQmxvY2tUeXBlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHR5cGUgYWxyZWFkeSBleGlzdHMuXG4gICAgaWYgKHRoaXMudHlwZXMuaGFzKHR5cGUuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBibG9jayB0eXBlLlxuICAgIHRoaXMudHlwZXMuc2V0KHR5cGUuaWRlbnRpZmllciwgdHlwZSk7XG5cbiAgICAvLyBBZGQgdGhlIGJsb2NrIHR5cGUgdG8gdGhlIGJsb2NrIGVudW0uXG4gICAgQmxvY2tFbnVtLm9wdGlvbnMucHVzaCh0eXBlLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIHBlcm11dGF0aW9ucyBvZiB0aGUgYmxvY2sgdHlwZS5cbiAgICBmb3IgKGNvbnN0IHBlcm11dGF0aW9uIG9mIHR5cGUucGVybXV0YXRpb25zKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBibG9jayB0eXBlIHdhcyByZWdpc3RlcmVkLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgYmxvY2sgcGVybXV0YXRpb24gdG8gdGhlIHBhbGV0dGUuXG4gICAqIEBwYXJhbSBwZXJtdXRhdGlvbiBUaGUgYmxvY2sgcGVybXV0YXRpb24gdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGJsb2NrIHBlcm11dGF0aW9uIHdhcyByZWdpc3RlcmVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyUGVybXV0YXRpb24ocGVybXV0YXRpb246IEJsb2NrUGVybXV0YXRpb24pOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgcGVybXV0YXRpb24gYWxyZWFkeSBleGlzdHMuXG4gICAgaWYgKHRoaXMucGVybXV0YXRpb25zLmhhcyhwZXJtdXRhdGlvbi5uZXR3b3JrKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGJsb2NrIHBlcm11dGF0aW9uLlxuICAgIHRoaXMucGVybXV0YXRpb25zLnNldChwZXJtdXRhdGlvbi5uZXR3b3JrLCBwZXJtdXRhdGlvbik7XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgcGVybXV0YXRpb24gd2FzIHJlZ2lzdGVyZWQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGJsb2NrIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBibG9jayBpZGVudGlmaWVyIHRvIGdldCB0aGUgcmVnaXN0cnkgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkgZm9yIHRoZSBibG9jayBpZGVudGlmaWVyLlxuICAgKi9cbiAgcHVibGljIGdldFJlZ2lzdHJ5KHR5cGU6IEJsb2NrSWRlbnRpZmllcik6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiB7XG4gICAgLy8gR2V0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGJsb2NrIGlkZW50aWZpZXIuXG4gICAgY29uc3QgcmVnaXN0cnkgPSB0aGlzLnJlZ2lzdHJ5LmdldCh0eXBlKSB8fCBbXTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVnaXN0cnkuXG4gICAgcmV0dXJuIHJlZ2lzdHJ5IGFzIEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHRyYWl0IHRvIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB0cmFpdCB3YXMgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBCbG9ja1RyYWl0KTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIHRyYWl0IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiAgICBpZiAodGhpcy50cmFpdHMuaGFzKHRyYWl0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgYmxvY2sgdHJhaXQuXG4gICAgdGhpcy50cmFpdHMuc2V0KHRyYWl0LmlkZW50aWZpZXIsIHRyYWl0KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgdHlwZXMgb2YgdGhlIHRyYWl0LlxuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0cmFpdC50eXBlcykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlZ2lzdHJ5IGhhcyB0aGUgYmxvY2sgaWRlbnRpZmllci5cbiAgICAgIGlmICghdGhpcy5yZWdpc3RyeS5oYXModHlwZSkpXG4gICAgICAgIC8vIFNldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBibG9jayBpZGVudGlmaWVyLlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5LnNldCh0eXBlLCBbXSk7XG5cbiAgICAgIC8vIEdldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBibG9jayBpZGVudGlmaWVyLlxuICAgICAgY29uc3QgcmVnaXN0cnkgPSB0aGlzLnJlZ2lzdHJ5LmdldCh0eXBlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlZ2lzdHJ5IGV4aXN0cy5cbiAgICAgIGlmIChyZWdpc3RyeSkge1xuICAgICAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgcmVnaXN0cnkuXG4gICAgICAgIHJlZ2lzdHJ5LnB1c2godHJhaXQpO1xuXG4gICAgICAgIC8vIFNldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBibG9jayBpZGVudGlmaWVyLlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5LnNldCh0eXBlLCByZWdpc3RyeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGJsb2NrIHRyYWl0IHdhcyByZWdpc3RlcmVkLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRyYWl0IGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSB0cmFpdC5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdHJhaXQgd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVUcmFpdChpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgZXhpc3RzLlxuICAgIGlmICghdGhpcy50cmFpdHMuaGFzKGlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBHZXQgdGhlIHRyYWl0LlxuICAgIGNvbnN0IHRyYWl0ID0gdGhpcy50cmFpdHMuZ2V0KGlkZW50aWZpZXIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRyYWl0IGV4aXN0cy5cbiAgICBpZiAoIXRyYWl0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHR5cGVzIG9mIHRoZSB0cmFpdC5cbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHJhaXQudHlwZXMpIHtcbiAgICAgIC8vIEdldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBibG9jayBpZGVudGlmaWVyLlxuICAgICAgY29uc3QgcmVnaXN0cnkgPSB0aGlzLnJlZ2lzdHJ5LmdldCh0eXBlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlZ2lzdHJ5IGV4aXN0cy5cbiAgICAgIGlmIChyZWdpc3RyeSkge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5LnNldChcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHJlZ2lzdHJ5LmZpbHRlcigodHJhaXQpID0+IHRyYWl0LmlkZW50aWZpZXIgIT09IGlkZW50aWZpZXIpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBwYWxldHRlLlxuICAgIHRoaXMudHJhaXRzLmRlbGV0ZShpZGVudGlmaWVyKTtcblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSB0cmFpdCB3YXMgcmVtb3ZlZC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSB0cmFpdHMgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHJldHVybnMgQWxsIHRoZSB0cmFpdHMgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGxUcmFpdHMoKTogQXJyYXk8dHlwZW9mIEJsb2NrVHJhaXQ+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMudHJhaXRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFpdCBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgdHJhaXQuXG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIGdldFRyYWl0KGlkZW50aWZpZXI6IHN0cmluZyk6IHR5cGVvZiBCbG9ja1RyYWl0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhaXRzLmdldChpZGVudGlmaWVyKSA/PyBudWxsO1xuICB9XG59XG5cbmV4cG9ydCB7IEJsb2NrUGFsZXR0ZSB9O1xuIiwgImltcG9ydCB7XG4gIEJsb2NrRmFjZSxcbiAgQmxvY2tQb3NpdGlvbixcbiAgR2FtZW1vZGUsXG4gIExldmVsRXZlbnQsXG4gIExldmVsRXZlbnRQYWNrZXQsXG4gIFVwZGF0ZUJsb2NrRmxhZ3NUeXBlLFxuICBVcGRhdGVCbG9ja0xheWVyVHlwZSxcbiAgVXBkYXRlQmxvY2tQYWNrZXQsXG4gIFZlY3RvcjNmXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBEaW1lbnNpb24sIFdvcmxkIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5pbXBvcnQge1xuICBCbG9ja0VudHJ5LFxuICBCbG9ja1Byb3BlcnRpZXMsXG4gIEl0ZW1TdGFja1Byb3BlcnRpZXMsXG4gIEpTT05MaWtlT2JqZWN0LFxuICBKU09OTGlrZVZhbHVlXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi4vd29ybGQvY2h1bmtcIjtcbmltcG9ydCB7IEl0ZW1TdGFjaywgSXRlbVR5cGUgfSBmcm9tIFwiLi4vaXRlbVwiO1xuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyLCBCbG9ja1Rvb2xUeXBlLCBJdGVtSWRlbnRpZmllciB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiLi4vc2VyZW5pdHlcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFBsYXllckludGVyYWN0V2l0aEJsb2NrU2lnbmFsIH0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuXG5pbXBvcnQgeyBCbG9ja1RyYWl0IH0gZnJvbSBcIi4vdHJhaXRzXCI7XG5pbXBvcnQgeyBOYnRNYXAgfSBmcm9tIFwiLi9tYXBzXCI7XG5cbmltcG9ydCB7IEJsb2NrUGVybXV0YXRpb24sIEJsb2NrVHlwZSB9IGZyb20gXCIuXCI7XG5cbmNsYXNzIEJsb2NrIHtcbiAgcHJvdGVjdGVkIHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGltZW5zaW9uOiBEaW1lbnNpb247XG5cbiAgcHVibGljIHJlYWRvbmx5IHBvc2l0aW9uOiBCbG9ja1Bvc2l0aW9uO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRzID0gbmV3IE1hcDxzdHJpbmcsIEpTT05MaWtlVmFsdWU+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0cyA9IG5ldyBNYXA8c3RyaW5nLCBCbG9ja1RyYWl0PigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBuYnQgPSBuZXcgTmJ0TWFwKHRoaXMpO1xuXG4gIHB1YmxpYyBwZXJtdXRhdGlvbjogQmxvY2tQZXJtdXRhdGlvbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZGltZW5zaW9uOiBEaW1lbnNpb24sXG4gICAgcG9zaXRpb246IEJsb2NrUG9zaXRpb24sXG4gICAgcGVybXV0YXRpb246IEJsb2NrUGVybXV0YXRpb24sXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8QmxvY2tQcm9wZXJ0aWVzPlxuICApIHtcbiAgICB0aGlzLnNlcmVuaXR5ID0gZGltZW5zaW9uLndvcmxkLnNlcmVuaXR5O1xuICAgIHRoaXMuZGltZW5zaW9uID0gZGltZW5zaW9uO1xuICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB0aGlzLnBlcm11dGF0aW9uID0gcGVybXV0YXRpb247XG5cbiAgICBpZiAocHJvcGVydGllcz8uZW50cnkpXG4gICAgICB0aGlzLmxvYWREYXRhRW50cnkodGhpcy5kaW1lbnNpb24ud29ybGQsIHByb3BlcnRpZXMuZW50cnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBibG9jayBpcyBhaXIuXG4gICAqL1xuICBwdWJsaWMgaXNBaXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVybXV0YXRpb24udHlwZS5haXI7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGJsb2NrIGlzIGxpcXVpZC5cbiAgICovXG4gIHB1YmxpYyBpc0xpcXVpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtdXRhdGlvbi50eXBlLmxpcXVpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYmxvY2sgaXMgc29saWQuXG4gICAqL1xuICBwdWJsaWMgaXNTb2xpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtdXRhdGlvbi50eXBlLnNvbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNodW5rIHRoZSBibG9jayBpcyBpbi5cbiAgICogQHJldHVybnMgVGhlIGNodW5rIHRoZSBibG9jayBpcyBpbi5cbiAgICovXG4gIHB1YmxpYyBnZXRDaHVuaygpOiBDaHVuayB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBjaHVuayBjb29yZGluYXRlcy5cbiAgICBjb25zdCBjeCA9IHRoaXMucG9zaXRpb24ueCA+PiA0O1xuICAgIGNvbnN0IGN6ID0gdGhpcy5wb3NpdGlvbi56ID4+IDQ7XG5cbiAgICAvLyBHZXQgdGhlIGNodW5rIGZyb20gdGhlIGRpbWVuc2lvbi5cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24uZ2V0Q2h1bmsoY3gsIGN6KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQZXJtdXRhdGlvbigpOiBCbG9ja1Blcm11dGF0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtdXRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRQZXJtdXRhdGlvbihcbiAgICBwZXJtdXRhdGlvbjogQmxvY2tQZXJtdXRhdGlvbixcbiAgICBlbnRyeT86IEJsb2NrRW50cnlcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHR5cGUgb2YgdGhlIHBlcm11dGF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgIGlmICh0aGlzLnBlcm11dGF0aW9uLnR5cGUgIT09IHBlcm11dGF0aW9uLnR5cGUpIHtcbiAgICAgIC8vIENsZWFyIHRoZSBjb21wb25lbnRzIGFuZCB0cmFpdHMgaWYgdGhlIHR5cGUgaGFzIGNoYW5nZWQuXG4gICAgICB0aGlzLnRyYWl0cy5jbGVhcigpO1xuICAgICAgdGhpcy5jb21wb25lbnRzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIGlzIGFpci5cbiAgICBpZiAocGVybXV0YXRpb24udHlwZS5haXIpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgYmxvY2sgZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgYWlyLlxuICAgICAgdGhpcy5kaW1lbnNpb24uYmxvY2tzLmRlbGV0ZShCbG9ja1Bvc2l0aW9uLmhhc2godGhpcy5wb3NpdGlvbikpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgY2h1bmsgdGhlIGJsb2NrIGlzIGluLlxuICAgIGNvbnN0IGNodW5rID0gdGhpcy5nZXRDaHVuaygpO1xuXG4gICAgLy8gU2V0IHRoZSBwZXJtdXRhdGlvbiBvZiB0aGUgYmxvY2suXG4gICAgY2h1bmsuc2V0UGVybXV0YXRpb24odGhpcy5wb3NpdGlvbiwgcGVybXV0YXRpb24pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudHJ5IGlzIHByb3ZpZGVkLlxuICAgIGlmIChlbnRyeSkgdGhpcy5sb2FkRGF0YUVudHJ5KHRoaXMuZ2V0V29ybGQoKSwgZW50cnkpO1xuXG4gICAgLy8gR2V0IHRoZSB0cmFpdHMgZnJvbSB0aGUgYmxvY2sgcGFsZXR0ZVxuICAgIGNvbnN0IHRyYWl0cyA9IHRoaXMuZ2V0V29ybGQoKS5ibG9ja1BhbGV0dGUuZ2V0UmVnaXN0cnkoXG4gICAgICBwZXJtdXRhdGlvbi50eXBlLmlkZW50aWZpZXJcbiAgICApO1xuXG4gICAgLy8gRmV0Y2ggYW55IHRyYWl0cyB0aGF0IGFwcGx5IHRvIHRoZSBiYXNlIHR5cGUgY29tcG9uZW50c1xuICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiBwZXJtdXRhdGlvbi50eXBlLmNvbXBvbmVudHMpIHtcbiAgICAgIC8vIEdldCB0aGUgdHJhaXQgZnJvbSB0aGUgYmxvY2sgcGFsZXR0ZSB1c2luZyB0aGUgaWRlbnRpZmllclxuICAgICAgY29uc3QgdHJhaXQgPSB0aGlzLmdldFdvcmxkKCkuYmxvY2tQYWxldHRlLmdldFRyYWl0KGlkZW50aWZpZXIpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgZXhpc3RzXG4gICAgICBpZiAodHJhaXQpIHRyYWl0cy5wdXNoKHRyYWl0KTtcbiAgICB9XG5cbiAgICAvLyBGZXRjaCBhbnkgdHJhaXRzIHRoYXQgYXJlIGJsb2NrIHN0YXRlIHNwZWNpZmljXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGVybXV0YXRpb24uc3RhdGUpKSB7XG4gICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHRyYWl0IGluIHRoZSByZWdpc3RyeS5cbiAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy5nZXRXb3JsZCgpLmJsb2NrUGFsZXR0ZS5nZXRBbGxUcmFpdHMoKSkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgaWRlbnRpZmllciBtYXRjaGVzIHRoZSBrZXlcbiAgICAgICAgaWYgKHRyYWl0LmlkZW50aWZpZXIgPT09IGtleSkge1xuICAgICAgICAgIC8vIEFkZCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBsaXN0XG4gICAgICAgICAgdHJhaXRzLnB1c2godHJhaXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgdHJhaXRzIGFuZCBhcHBseSB0aGVtIHRvIHRoZSBibG9ja1xuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdHJhaXRzKSB0aGlzLmFkZFRyYWl0KHRyYWl0KTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBVcGRhdGVCbG9ja1BhY2tldCB0byBicm9hZGNhc3QgdGhlIGNoYW5nZS5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgVXBkYXRlQmxvY2tQYWNrZXQoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgYmxvY2sgcG9zaXRpb24gYW5kIHBlcm11dGF0aW9uIHRvIHRoZSBwYWNrZXQuXG4gICAgcGFja2V0Lm5ldHdvcmtCbG9ja0lkID0gcGVybXV0YXRpb24ubmV0d29yaztcbiAgICBwYWNrZXQucG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuICAgIHBhY2tldC5mbGFncyA9IFVwZGF0ZUJsb2NrRmxhZ3NUeXBlLk5ldHdvcms7XG4gICAgcGFja2V0LmxheWVyID0gVXBkYXRlQmxvY2tMYXllclR5cGUuTm9ybWFsO1xuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gdGhlIGRpbWVuc2lvbi5cbiAgICB0aGlzLmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrLlxuICAgIHRoaXMucGVybXV0YXRpb24gPSBwZXJtdXRhdGlvbjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBzaG91bGQgYmUgY2FjaGVkLlxuICAgIGlmICgodGhpcy5jb21wb25lbnRzLnNpemUgPiAwIHx8IHRoaXMudHJhaXRzLnNpemUgPiAwKSAmJiAhdGhpcy5pc0FpcigpKSB7XG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGJsb2NrIGhhc2ggdXNpbmcgdGhlIHBvc2l0aW9uXG4gICAgICBjb25zdCBoYXNoID0gQmxvY2tQb3NpdGlvbi5oYXNoKHRoaXMucG9zaXRpb24pO1xuXG4gICAgICAvLyBTZXQgdGhlIGJsb2NrIGluIHRoZSBjYWNoZS5cbiAgICAgIHRoaXMuZGltZW5zaW9uLmJsb2Nrcy5zZXQoaGFzaCwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFR5cGUodHlwZTogQmxvY2tUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQZXJtdXRhdGlvbih0eXBlLmdldFBlcm11dGF0aW9uKCkpO1xuICB9XG5cbiAgcHVibGljIGdldFR5cGUoKTogQmxvY2tUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtdXRhdGlvbi50eXBlO1xuICB9XG5cbiAgcHVibGljIGdldFdvcmxkKCkge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbi53b3JsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBibG9jayBoYXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgY29tcG9uZW50IHRvIGNoZWNrIGZvci5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgYmxvY2sgaGFzIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgaGFzQ29tcG9uZW50KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50cy5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGZyb20gdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGNvbXBvbmVudCB0byBnZXQgZnJvbSB0aGUgYmxvY2suXG4gICAqIEByZXR1cm5zIFRoZSBjb21wb25lbnQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgbnVsbC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb21wb25lbnQ8VCBleHRlbmRzIEpTT05MaWtlT2JqZWN0PihrZXk6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRzLmdldChrZXkpIGFzIFQgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgZnJvbSB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgY29tcG9uZW50IHRvIHJlbW92ZS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVDb21wb25lbnQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudHMuZGVsZXRlKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbXBvbmVudCB0byB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgY29tcG9uZW50IHRvIGFkZC5cbiAgICogQHBhcmFtIGNvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGFkZC5cbiAgICovXG4gIHB1YmxpYyBhZGRDb21wb25lbnQoa2V5OiBzdHJpbmcsIGNvbXBvbmVudDogSlNPTkxpa2VPYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudHMuc2V0KGtleSwgY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IHRvIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBjb21wb25lbnQgdG8gc2V0LlxuICAgKiBAcGFyYW0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gc2V0LlxuICAgKi9cbiAgcHVibGljIHNldENvbXBvbmVudChrZXk6IHN0cmluZywgY29tcG9uZW50OiBKU09OTGlrZU9iamVjdCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50cy5zZXQoa2V5LCBjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJsb2NrIGhhcyB0aGUgc3BlY2lmaWVkIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIGNoZWNrIGZvclxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBibG9jayBoYXMgdGhlIHRyYWl0XG4gICAqL1xuICBwdWJsaWMgaGFzVHJhaXQodHJhaXQ6IHN0cmluZyB8IHR5cGVvZiBCbG9ja1RyYWl0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJhaXRzLmhhcyhcbiAgICAgIHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHRyYWl0IGZyb20gdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIGdldCBmcm9tIHRoZSBibG9ja1xuICAgKiBAcmV0dXJucyBUaGUgdHJhaXQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgbnVsbFxuICAgKi9cbiAgcHVibGljIGdldFRyYWl0PFQgZXh0ZW5kcyB0eXBlb2YgQmxvY2tUcmFpdD4odHJhaXQ6IFQpOiBJbnN0YW5jZVR5cGU8VD47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBnZXQgZnJvbSB0aGUgYmxvY2tcbiAgICogQHJldHVybnMgVGhlIHRyYWl0IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFpdCh0cmFpdDogc3RyaW5nKTogQmxvY2tUcmFpdCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBnZXQgZnJvbSB0aGUgYmxvY2tcbiAgICogQHJldHVybnMgVGhlIHRyYWl0IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFpdCh0cmFpdDogc3RyaW5nIHwgdHlwZW9mIEJsb2NrVHJhaXQpOiBCbG9ja1RyYWl0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhaXRzLmdldChcbiAgICAgIHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllclxuICAgICkgYXMgQmxvY2tUcmFpdCB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHRyYWl0IGZyb20gdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRyYWl0KHRyYWl0OiBzdHJpbmcgfCB0eXBlb2YgQmxvY2tUcmFpdCk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgdHJhaXQgZnJvbSB0aGUgYmxvY2tcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMudHJhaXRzLmdldChcbiAgICAgIHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllclxuICAgICk7XG5cbiAgICAvLyBDYWxsIHRoZSBvblJlbW92ZSBtZXRob2Qgb2YgdGhlIHRyYWl0XG4gICAgaW5zdGFuY2U/Lm9uUmVtb3ZlPy4oKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgYmxvY2tcbiAgICB0aGlzLnRyYWl0cy5kZWxldGUodHlwZW9mIHRyYWl0ID09PSBcInN0cmluZ1wiID8gdHJhaXQgOiB0cmFpdC5pZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdHJhaXQgdG8gdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIGFkZFxuICAgKiBAcmV0dXJucyBUaGUgdHJhaXQgdGhhdCB3YXMgYWRkZWRcbiAgICovXG4gIHB1YmxpYyBhZGRUcmFpdDxUIGV4dGVuZHMgdHlwZW9mIEJsb2NrVHJhaXQ+KFxuICAgIHRyYWl0OiBUIHwgQmxvY2tUcmFpdFxuICApOiBJbnN0YW5jZVR5cGU8VD4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBhbHJlYWR5IGV4aXN0c1xuICAgIGlmICh0aGlzLnRyYWl0cy5oYXModHJhaXQuaWRlbnRpZmllcikpXG4gICAgICByZXR1cm4gdGhpcy50cmFpdHMuZ2V0KHRyYWl0LmlkZW50aWZpZXIpIGFzIEluc3RhbmNlVHlwZTxUPjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBpcyBpbiB0aGUgcGFsZXR0ZVxuICAgIGlmICghdGhpcy5nZXRXb3JsZCgpLmJsb2NrUGFsZXR0ZS50cmFpdHMuaGFzKHRyYWl0LmlkZW50aWZpZXIpKVxuICAgICAgdGhpcy5nZXRXb3JsZCgpLmxvZ2dlci53YXJuKFxuICAgICAgICBgVHJhaXQgXCLCp2Mke3RyYWl0LmlkZW50aWZpZXJ9wqdyXCIgd2FzIGFkZGVkIHRvIGJsb2NrIFwiwqdkJHt0aGlzLmdldFR5cGUoKS5pZGVudGlmaWVyfcKncjrCp2Qke0pTT04uc3RyaW5naWZ5KHRoaXMucG9zaXRpb24pfcKnclwiIGluIGRpbWVuc2lvbiBcIsKnYSR7dGhpcy5kaW1lbnNpb24uaWRlbnRpZmllcn3Cp3JcIiBidXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHBhbGV0dGUuIFRoaXMgbWF5IHJlc3VsdCBpbiBhIGRlc2VyaWxpemF0aW9uIGVycm9yLmBcbiAgICAgICk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGFkZCB0aGUgdHJhaXQgdG8gdGhlIGJsb2NrXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBpcyBhIGJsb2NrIHRyYWl0XG4gICAgICBpZiAodHJhaXQgaW5zdGFuY2VvZiBCbG9ja1RyYWl0KSB7XG4gICAgICAgIC8vIEFkZCB0aGUgdHJhaXQgdG8gdGhlIGJsb2NrXG4gICAgICAgIHRoaXMudHJhaXRzLnNldCh0cmFpdC5pZGVudGlmaWVyLCB0cmFpdCk7XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgb25BZGQgbWV0aG9kIG9mIHRoZSB0cmFpdFxuICAgICAgICB0cmFpdC5vbkFkZD8uKCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB0cmFpdCB0aGF0IHdhcyBhZGRlZFxuICAgICAgICByZXR1cm4gdHJhaXQgYXMgSW5zdGFuY2VUeXBlPFQ+O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0cmFpdFxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0cmFpdCh0aGlzKSBhcyBJbnN0YW5jZVR5cGU8VD47XG5cbiAgICAgICAgLy8gQWRkIHRoZSB0cmFpdCB0byB0aGUgYmxvY2tcbiAgICAgICAgdGhpcy50cmFpdHMuc2V0KGluc3RhbmNlLmlkZW50aWZpZXIsIGluc3RhbmNlKTtcblxuICAgICAgICAvLyBDYWxsIHRoZSBvbkFkZCBtZXRob2Qgb2YgdGhlIHRyYWl0XG4gICAgICAgIGluc3RhbmNlLm9uQWRkPy4oKTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIHRyYWl0IHRoYXQgd2FzIGFkZGVkXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgIHRoaXMuc2VyZW5pdHkubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGFkZCB0cmFpdCBcIiR7dHJhaXQuaWRlbnRpZmllcn1cIiB0byBibG9jayBcIiR7dGhpcy5nZXRUeXBlKCkuaWRlbnRpZmllcn06JHtKU09OLnN0cmluZ2lmeSh0aGlzLnBvc2l0aW9uKX1cIiBpbiBkaW1lbnNpb24gXCIke3RoaXMuZGltZW5zaW9uLmlkZW50aWZpZXJ9XCJgLFxuICAgICAgICByZWFzb25cbiAgICAgICk7XG5cbiAgICAgIC8vIFJldHVybiBudWxsIGFzIHRoZSB0cmFpdCBjb3VsZCBub3QgYmUgYWRkZWRcbiAgICAgIHJldHVybiBudWxsIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdG9vbCB0eXBlIHJlcXVpcmVkIHRvIGJyZWFrIHRoZSBibG9jay5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBnZXRUb29sVHlwZSgpOiBCbG9ja1Rvb2xUeXBlIHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdG9vbCB0eXBlIGNoZWNraW5nLlxuXG4gICAgcmV0dXJuIEJsb2NrVG9vbFR5cGUuTm9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0b29sIHJlcXVpcmVkIHRvIGJyZWFrIHRoZSBibG9jay5cbiAgICogQHJldHVybnMgVGhlIHRvb2wgcmVxdWlyZWQgdG8gYnJlYWsgdGhlIGJsb2NrLlxuICAgKi9cbiAgcHVibGljIGlzVG9vbENvbXBhdGlibGUoX2l0ZW1TdGFjazogSXRlbVN0YWNrKTogYm9vbGVhbiB7XG4gICAgLy8gR2V0IHRoZSBibG9jayB0eXBlLlxuICAgIGNvbnN0IGJsb2NrVHlwZSA9IHRoaXMuZ2V0VHlwZSgpO1xuXG4gICAgLy8gSWYgdGhlIGhhcmRuZXNzIGlzIGxlc3MgdGhhbiAwLCBubyB0b29sIGlzIGNvbXBhdGlibGUuXG4gICAgaWYgKGJsb2NrVHlwZS5oYXJkbmVzcyA8IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0b29sIHR5cGUgaXMgbm9uZS5cbiAgICBpZiAodGhpcy5nZXRUb29sVHlwZSgpID09PSBCbG9ja1Rvb2xUeXBlLk5vbmUpIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0aW1lIGl0IHRha2VzIHRvIGJyZWFrIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGl0ZW1TdGFjayBUaGUgaXRlbSBzdGFjayB1c2VkIHRvIGJyZWFrIHRoZSBibG9jay5cbiAgICogQHJldHVybnMgVGhlIHRpbWUgaXQgdGFrZXMgdG8gYnJlYWsgdGhlIGJsb2NrLlxuICAgKi9cbiAgcHVibGljIGdldEJyZWFrVGltZShpdGVtU3RhY2s/OiBJdGVtU3RhY2sgfCBudWxsKTogbnVtYmVyIHtcbiAgICAvLyBHZXQgdGhlIHR5cGUgb2YgdGhlIGJsb2NrLlxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldFR5cGUoKTtcblxuICAgIC8vIEdldCB0aGUgaGFyZG5lc3Mgb2YgdGhlIGJsb2NrLlxuICAgIGxldCBoYXJkbmVzcyA9IHR5cGUuaGFyZG5lc3M7XG5cbiAgICBpZiAoIWl0ZW1TdGFjayAmJiB0aGlzLmdldFRvb2xUeXBlKCkgPT09IEJsb2NrVG9vbFR5cGUuTm9uZSkge1xuICAgICAgaGFyZG5lc3MgKj0gMS41O1xuICAgIH0gZWxzZSBpZiAoaXRlbVN0YWNrICYmIHRoaXMuaXNUb29sQ29tcGF0aWJsZShpdGVtU3RhY2spKSB7XG4gICAgICBoYXJkbmVzcyAqPSAxLjU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhcmRuZXNzICo9IDU7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguY2VpbChoYXJkbmVzcyAqIDIwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpdGVtIHN0YWNrIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBhcHBseSB0byB0aGUgaXRlbSBzdGFjay5cbiAgICogQHJldHVybnMgVGhlIGl0ZW0gc3RhY2sgb2YgdGhlIGJsb2NrLlxuICAgKi9cbiAgcHVibGljIGdldEl0ZW1TdGFjayhwcm9wZXJ0aWVzPzogUGFydGlhbDxJdGVtU3RhY2tQcm9wZXJ0aWVzPik6IEl0ZW1TdGFjayB7XG4gICAgLy8gR2V0IHRoZSBpdGVtUGFsZXR0ZSBmcm9tIHRoZSB3b3JsZC5cbiAgICBjb25zdCBwYWxldHRlID0gdGhpcy5nZXRXb3JsZCgpLml0ZW1QYWxldHRlO1xuXG4gICAgLy8gR2V0IHRoZSBpdGVtIHR5cGUgb2YgdGhlIGJsb2NrLlxuICAgIGNvbnN0IHR5cGUgPSBwYWxldHRlLnJlc29sdmVUeXBlKHRoaXMuZ2V0VHlwZSgpKSBhcyBJdGVtVHlwZTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBpdGVtIHN0YWNrIHdpdGggdGhlIHR5cGUuXG4gICAgY29uc3QgaXRlbVN0YWNrID0gbmV3IEl0ZW1TdGFjayh0eXBlLCBwcm9wZXJ0aWVzKTtcblxuICAgIC8vIFJldHVybiB0aGUgaXRlbSBzdGFjay5cbiAgICByZXR1cm4gaXRlbVN0YWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJsb2NrIGFib3ZlIHRoaXMgYmxvY2suXG4gICAqXG4gICAqIEBwYXJhbSBzdGVwcyBUaGUgYW1vdW50IG9mIHN0ZXBzIHRvIGdvIHVwLlxuICAgKi9cbiAgcHVibGljIGFib3ZlKHN0ZXBzPzogbnVtYmVyKTogQmxvY2sge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbi5nZXRCbG9jayh7XG4gICAgICAuLi50aGlzLnBvc2l0aW9uLFxuICAgICAgeTogdGhpcy5wb3NpdGlvbi55ICsgKHN0ZXBzID8/IDEpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYmxvY2sgYmVsb3cgdGhpcyBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIHN0ZXBzIFRoZSBhbW91bnQgb2Ygc3RlcHMgdG8gZ28gZG93bi5cbiAgICovXG4gIHB1YmxpYyBiZWxvdyhzdGVwcz86IG51bWJlcik6IEJsb2NrIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24uZ2V0QmxvY2soe1xuICAgICAgLi4udGhpcy5wb3NpdGlvbixcbiAgICAgIHk6IHRoaXMucG9zaXRpb24ueSAtIChzdGVwcyA/PyAxKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJsb2NrIHRvIHRoZSBub3J0aCBvZiB0aGlzIGJsb2NrLlxuICAgKlxuICAgKiBAcGFyYW0gc3RlcHMgVGhlIGFtb3VudCBvZiBzdGVwcyB0byBnbyBub3J0aC5cbiAgICovXG4gIHB1YmxpYyBub3J0aChzdGVwcz86IG51bWJlcik6IEJsb2NrIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24uZ2V0QmxvY2soe1xuICAgICAgLi4udGhpcy5wb3NpdGlvbixcbiAgICAgIHo6IHRoaXMucG9zaXRpb24ueiAtIChzdGVwcyA/PyAxKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJsb2NrIHRvIHRoZSBzb3V0aCBvZiB0aGlzIGJsb2NrLlxuICAgKlxuICAgKiBAcGFyYW0gc3RlcHMgVGhlIGFtb3VudCBvZiBzdGVwcyB0byBnbyBzb3V0aC5cbiAgICovXG4gIHB1YmxpYyBzb3V0aChzdGVwcz86IG51bWJlcik6IEJsb2NrIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24uZ2V0QmxvY2soe1xuICAgICAgLi4udGhpcy5wb3NpdGlvbixcbiAgICAgIHo6IHRoaXMucG9zaXRpb24ueiArIChzdGVwcyA/PyAxKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJsb2NrIHRvIHRoZSBlYXN0IG9mIHRoaXMgYmxvY2suXG4gICAqXG4gICAqIEBwYXJhbSBzdGVwcyBUaGUgYW1vdW50IG9mIHN0ZXBzIHRvIGdvIGVhc3QuXG4gICAqL1xuICBwdWJsaWMgZWFzdChzdGVwcz86IG51bWJlcik6IEJsb2NrIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24uZ2V0QmxvY2soe1xuICAgICAgLi4udGhpcy5wb3NpdGlvbixcbiAgICAgIHg6IHRoaXMucG9zaXRpb24ueCArIChzdGVwcyA/PyAxKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJsb2NrIHRvIHRoZSB3ZXN0IG9mIHRoaXMgYmxvY2suXG4gICAqXG4gICAqIEBwYXJhbSBzdGVwcyBUaGUgYW1vdW50IG9mIHN0ZXBzIHRvIGdvIHdlc3QuXG4gICAqL1xuICBwdWJsaWMgd2VzdChzdGVwcz86IG51bWJlcik6IEJsb2NrIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24uZ2V0QmxvY2soe1xuICAgICAgLi4udGhpcy5wb3NpdGlvbixcbiAgICAgIHg6IHRoaXMucG9zaXRpb24ueCAtIChzdGVwcyA/PyAxKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgbmV4dCB0byBhIGdpdmVuIGJsb2NrIGZhY2Ugb2YgdGhlIGJsb2NrLlxuICAgKlxuICAgKiBAcGFyYW0gZmFjZSBUaGUgZmFjZSBvZiB0aGUgYmxvY2suXG4gICAqL1xuICBwdWJsaWMgZmFjZShmYWNlOiBCbG9ja0ZhY2UpOiBCbG9jayB7XG4gICAgc3dpdGNoIChmYWNlKSB7XG4gICAgICBjYXNlIEJsb2NrRmFjZS5Ub3A6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWJvdmUoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgQmxvY2tGYWNlLkJvdHRvbToge1xuICAgICAgICByZXR1cm4gdGhpcy5iZWxvdygpO1xuICAgICAgfVxuICAgICAgY2FzZSBCbG9ja0ZhY2UuTm9ydGg6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9ydGgoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgQmxvY2tGYWNlLlNvdXRoOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXRoKCk7XG4gICAgICB9XG4gICAgICBjYXNlIEJsb2NrRmFjZS5FYXN0OiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc3QoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgQmxvY2tGYWNlLldlc3Q6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2VzdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYSBwbGF5ZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0byBpbnRlcmFjdCB3aXRoIHRoZSBibG9jay5cbiAgICovXG4gIHB1YmxpYyBpbnRlcmFjdChwbGF5ZXI6IFBsYXllcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJJbnRlcmFjdFdpdGhCbG9ja1NpZ25hbChcbiAgICAgIHBsYXllcixcbiAgICAgIHRoaXMsXG4gICAgICBwbGF5ZXIuZ2V0SGVsZEl0ZW0oKSxcbiAgICAgIG51bGxcbiAgICApO1xuXG4gICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDYWxsIHRoZSBibG9jayBvbkludGVyYWN0IHRyYWl0IG1ldGhvZHNcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRoaXMudHJhaXRzLnZhbHVlcygpKSB7XG4gICAgICAvLyBDYWxsIHRoZSBvbkludGVyYWN0IG1ldGhvZCBvZiB0aGUgdHJhaXRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYWl0Lm9uSW50ZXJhY3Q/LihwbGF5ZXIpO1xuXG4gICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIHJlc3VsdCBpcyBmYWxzZVxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgd2FzIGludGVyYWN0ZWQgd2l0aFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHBsYXllciBXaGV0aGVyIHRoZSBibG9jayB3YXMgZGVzdHJveWVkIGJ5IGEgcGxheWVyLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBibG9jayB3YXMgZGVzdHJveWVkIHN1Y2Nlc3NmdWxseTsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KHBsYXllcj86IFBsYXllcik6IGJvb2xlYW4ge1xuICAgIC8vIENhbGwgdGhlIGJsb2NrIG9uQnJlYWsgdHJhaXQgbWV0aG9kc1xuICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBicmVhayB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRyYWl0Lm9uQnJlYWs/LihwbGF5ZXIpO1xuXG4gICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCwgY29udGludWVcbiAgICAgIC8vIEFzIHRoZSB0cmFpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG1ldGhvZFxuICAgICAgaWYgKHN1Y2Nlc3MgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgZmFsc2UsIGNhbmNlbCB0aGUgYnJlYWtcbiAgICAgIGNhbmNlbGVkID0gIXN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZSBibG9jayBicmVhayB3YXMgY2FuY2VsZWRcbiAgICBpZiAoY2FuY2VsZWQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgZGVzdHJveWVkIHRoZSBibG9jay5cbiAgICBpZiAocGxheWVyKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIGluIHN1cnZpdmFsIG1vZGUuXG4gICAgICAvLyBJZiBzbywgdGhlIGJsb2NrIHNob3VsZCBkcm9wIGFuIGl0ZW0uXG4gICAgICBpZiAocGxheWVyLmdhbWVtb2RlID09PSBHYW1lbW9kZS5TdXJ2aXZhbCkge1xuICAgICAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBibG9jay5cbiAgICAgICAgY29uc3QgeyB4LCB5LCB6IH0gPSB0aGlzLnBvc2l0aW9uO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgZHJvcHMgb2YgdGhlIGJsb2NrLlxuICAgICAgICBmb3IgKGNvbnN0IGRyb3Agb2YgdGhpcy5nZXRUeXBlKCkuZHJvcHMpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZHJvcCBpcyBhaXIsIGlmIHNvIHdlIHdpbGwgc2tpcCBpdC5cbiAgICAgICAgICBpZiAoZHJvcC50eXBlID09PSBCbG9ja0lkZW50aWZpZXIuQWlyKSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIFJvbGwgdGhlIGRyb3AgYW1vdW50LlxuICAgICAgICAgIGNvbnN0IGFtb3VudCA9IGRyb3Aucm9sbCgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFtb3VudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMC5cbiAgICAgICAgICBpZiAoYW1vdW50IDw9IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEl0ZW1TdGFjay5cbiAgICAgICAgICBjb25zdCBpdGVtU3RhY2sgPSBuZXcgSXRlbVN0YWNrKGRyb3AudHlwZSBhcyBJdGVtSWRlbnRpZmllciwge1xuICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgd29ybGQ6IHRoaXMuZGltZW5zaW9uLndvcmxkXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgSXRlbUVudGl0eS5cbiAgICAgICAgICBjb25zdCBpdGVtRW50aXR5ID0gdGhpcy5kaW1lbnNpb24uc3Bhd25JdGVtKFxuICAgICAgICAgICAgaXRlbVN0YWNrLFxuICAgICAgICAgICAgbmV3IFZlY3RvcjNmKHggKyAwLjUsIHkgKyAwLjUsIHogKyAwLjUpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEFkZCByYW5kb20geCAmIHogdmVsb2NpdHkgdG8gdGhlIGl0ZW0gZW50aXR5LlxuICAgICAgICAgIGNvbnN0IHZlbG9jaXR5ID0gbmV3IFZlY3RvcjNmKFxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSAqIDAuMSAtIDAuMDUsXG4gICAgICAgICAgICBpdGVtRW50aXR5LnZlbG9jaXR5LnksXG4gICAgICAgICAgICBNYXRoLnJhbmRvbSgpICogMC4xIC0gMC4wNVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHZlbG9jaXR5IHRvIHRoZSBpdGVtIGVudGl0eS5cbiAgICAgICAgICBpdGVtRW50aXR5LmFkZE1vdGlvbih2ZWxvY2l0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IExldmVsRXZlbnRQYWNrZXQgdG8gYnJvYWRjYXN0IHRoZSBibG9jayBicmVhay5cbiAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMZXZlbEV2ZW50UGFja2V0KCk7XG4gICAgICBwYWNrZXQuZXZlbnQgPSBMZXZlbEV2ZW50LlBhcnRpY2xlc0Rlc3Ryb3lCbG9jaztcbiAgICAgIHBhY2tldC5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24udG9WZWN0b3IzZih0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHBhY2tldC5kYXRhID0gdGhpcy5wZXJtdXRhdGlvbi5uZXR3b3JrO1xuXG4gICAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgZGltZW5zaW9uLlxuICAgICAgdGhpcy5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBhaXIgYmxvY2sgcGVybXV0YXRpb24uXG4gICAgY29uc3QgYWlyID0gQmxvY2tQZXJtdXRhdGlvbi5yZXNvbHZlKEJsb2NrSWRlbnRpZmllci5BaXIpO1xuXG4gICAgLy8gU2V0IHRoZSBibG9jayBwZXJtdXRhdGlvbiB0byBhaXIuXG4gICAgdGhpcy5zZXRQZXJtdXRhdGlvbihhaXIpO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGJsb2NrIHdhcyBkZXN0cm95ZWQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYmxvY2sncyBkYXRhIGFzIGEgZGF0YWJhc2UgZW50cnkuXG4gICAqIEByZXR1cm5zIFRoZSBibG9jayBlbnRyeSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGF0YUVudHJ5KCk6IEJsb2NrRW50cnkge1xuICAgIC8vIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGJsb2NrLlxuICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gdGhpcy5wb3NpdGlvbjtcblxuICAgIC8vIENyZWF0ZSB0aGUgYmxvY2sgZW50cnkgb2JqZWN0LlxuICAgIGNvbnN0IGVudHJ5OiBCbG9ja0VudHJ5ID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZXRUeXBlKCkuaWRlbnRpZmllcixcbiAgICAgIHBlcm11dGF0aW9uOiB0aGlzLnBlcm11dGF0aW9uLm5ldHdvcmssXG4gICAgICBwb3NpdGlvbjogW3gsIHksIHpdLFxuICAgICAgdHJhaXRzOiBbLi4udGhpcy50cmFpdHMua2V5cygpXSxcbiAgICAgIGNvbXBvbmVudHM6IFsuLi50aGlzLmNvbXBvbmVudHMuZW50cmllcygpXVxuICAgIH07XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJsb2NrIGVudHJ5IG9iamVjdC5cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBwdWJsaWMgbG9hZERhdGFFbnRyeShcbiAgICB3b3JsZDogV29ybGQsXG4gICAgZW50cnk6IEJsb2NrRW50cnksXG4gICAgb3ZlcndyaXRlID0gdHJ1ZVxuICApOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgc2hvdWxkIGJlIG92ZXJ3cml0dGVuLlxuICAgIGlmIChvdmVyd3JpdGUpIHtcbiAgICAgIHRoaXMudHJhaXRzLmNsZWFyKCk7XG4gICAgICB0aGlzLmNvbXBvbmVudHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGNvbXBvbmVudHMgdG8gdGhlIGJsb2NrLCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJ5LmNvbXBvbmVudHMpIHtcbiAgICAgIGlmICghdGhpcy5jb21wb25lbnRzLmhhcyhrZXkpKSB0aGlzLmNvbXBvbmVudHMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgdHJhaXRzIHRvIHRoZSBibG9jaywgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgZW50cnkudHJhaXRzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFsZXR0ZSBoYXMgdGhlIHRyYWl0XG4gICAgICBjb25zdCB0cmFpdFR5cGUgPSB3b3JsZC5ibG9ja1BhbGV0dGUudHJhaXRzLmdldCh0cmFpdCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBleGlzdHMgaW4gdGhlIHBhbGV0dGVcbiAgICAgIGlmICghdHJhaXRUeXBlKSB7XG4gICAgICAgIHdvcmxkLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgdHJhaXQgXCIke3RyYWl0fVwiIGZvciBibG9jayBcIiR7dGhpcy5nZXRUeXBlKCkuaWRlbnRpZmllcn06JHt0aGlzLnBvc2l0aW9uLnh9LCR7dGhpcy5wb3NpdGlvbi55fSwke3RoaXMucG9zaXRpb24uen1cIiBhcyBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcGFsZXR0ZWBcbiAgICAgICAgKTtcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0ZW1wdCB0byBhZGQgdGhlIHRyYWl0IHRvIHRoZSBibG9ja1xuICAgICAgdGhpcy5hZGRUcmFpdCh0cmFpdFR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBCbG9jayB9O1xuIiwgImltcG9ydCB7IENvbXBvdW5kVGFnLCBOQlRUYWcgfSBmcm9tIFwiQHNlcmVuaXR5anMvbmJ0XCI7XG5pbXBvcnQgeyBCbG9ja0FjdG9yRGF0YVBhY2tldCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBCbG9jayB9IGZyb20gXCIuLi9ibG9ja1wiO1xuXG5jbGFzcyBOYnRNYXAgZXh0ZW5kcyBNYXA8c3RyaW5nLCBOQlRUYWc+IHtcbiAgLyoqXG4gICAqIFRoZSBibG9jayBpbiB3aGljaCB0aGUgTkJUIGRhdGEgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmxvY2s6IEJsb2NrO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgTkJUIG1hcCBmb3IgYSBibG9jay5cbiAgICogQHBhcmFtIGJsb2NrIFRoZSBibG9jayBpbiB3aGljaCB0aGUgTkJUIGRhdGEgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoYmxvY2s6IEJsb2NrKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJsb2NrID0gYmxvY2s7XG4gIH1cblxuICBwdWJsaWMgYWRkKHZhbHVlOiBOQlRUYWcpOiB0aGlzIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2RcbiAgICBzdXBlci5zZXQodmFsdWUubmFtZSwgdmFsdWUpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBibG9jayB3aXRoIHRoZSBuZXcgTkJUIGRhdGFcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBpbnN0YW5jZVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IE5CVFRhZyk6IHRoaXMge1xuICAgIC8vIENhbGwgdGhlIHN1cGVyIG1ldGhvZFxuICAgIHN1cGVyLnNldChrZXksIHZhbHVlKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYmxvY2sgd2l0aCB0aGUgbmV3IE5CVCBkYXRhXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgaW5zdGFuY2VcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5kZWxldGUoa2V5KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYmxvY2sgd2l0aCB0aGUgbmV3IE5CVCBkYXRhXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2RcbiAgICBzdXBlci5jbGVhcigpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBibG9jayB3aXRoIHRoZSBuZXcgTkJUIGRhdGFcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmxvY2tBY3RvckRhdGEgcGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IEJsb2NrQWN0b3JEYXRhUGFja2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHBhY2tldCB2YWx1ZXNcbiAgICBwYWNrZXQucG9zaXRpb24gPSB0aGlzLmJsb2NrLnBvc2l0aW9uO1xuICAgIHBhY2tldC5uYnQgPSBuZXcgQ29tcG91bmRUYWcoKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgTkJUIGRhdGFcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzKSBwYWNrZXQubmJ0LnNldFRhZyhrZXksIHZhbHVlKTtcblxuICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIHRoZSBkaW1lbnNpb25cbiAgICB0aGlzLmJsb2NrLmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcbiAgfVxufVxuXG5leHBvcnQgeyBOYnRNYXAgfTtcbiIsICJpbXBvcnQge1xuICBDb250YWluZXJJZCxcbiAgQ29udGFpbmVyT3BlblBhY2tldCxcbiAgQ29udGFpbmVyVHlwZVxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4uL2NvbnRhaW5lclwiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFBsYXllck9wZW5lZENvbnRhaW5lclNpZ25hbCB9IGZyb20gXCIuLi9ldmVudHNcIjtcblxuaW1wb3J0IHsgQmxvY2sgfSBmcm9tIFwiLi9ibG9ja1wiO1xuXG5jbGFzcyBCbG9ja0NvbnRhaW5lciBleHRlbmRzIENvbnRhaW5lciB7XG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgdGhhdCB0aGlzIGNvbnRhaW5lciBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBibG9jazogQmxvY2s7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGJsb2NrOiBCbG9jayxcbiAgICB0eXBlOiBDb250YWluZXJUeXBlLFxuICAgIGlkZW50aWZpZXI6IENvbnRhaW5lcklkLFxuICAgIHNpemU6IG51bWJlclxuICApIHtcbiAgICBzdXBlcih0eXBlLCBpZGVudGlmaWVyLCBzaXplKTtcbiAgICB0aGlzLmJsb2NrID0gYmxvY2s7XG4gIH1cblxuICBwdWJsaWMgc2V0SXRlbShzbG90OiBudW1iZXIsIGl0ZW1TdGFjazogSXRlbVN0YWNrKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgc2V0SXRlbSBtZXRob2RcbiAgICBzdXBlci5zZXRJdGVtKHNsb3QsIGl0ZW1TdGFjayk7XG5cbiAgICAvLyBTZXQgdGhlIHdvcmxkIGluIHRoZSBpdGVtIHN0YWNrIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICBpZiAoIWl0ZW1TdGFjay53b3JsZCkgaXRlbVN0YWNrLndvcmxkID0gdGhpcy5ibG9jay5nZXRXb3JsZCgpO1xuICAgIGl0ZW1TdGFjay5pbml0aWFsaXplKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlKHBsYXllcj86IFBsYXllcik6IHZvaWQge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIHVwZGF0ZSBtZXRob2RcbiAgICBzdXBlci51cGRhdGUocGxheWVyKTtcblxuICAgIC8vIENhbGwgdGhlIG9uQ29udGFpbmVyVXBkYXRlIG1ldGhvZCBmb3IgdGhlIGJsb2NrIHRyYWl0c1xuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdGhpcy5ibG9jay50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENhbGwgdGhlIHRyYWl0IG1ldGhvZFxuICAgICAgICB0cmFpdC5vbkNvbnRhaW5lclVwZGF0ZT8uKHRoaXMpO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIEdldCB0aGUgYmxvY2sgcG9zaXRpb25cbiAgICAgICAgY29uc3QgeyB4LCB5LCB6IH0gPSB0aGlzLmJsb2NrLnBvc2l0aW9uO1xuXG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgdGhpcy5ibG9ja1xuICAgICAgICAgIC5nZXRXb3JsZCgpXG4gICAgICAgICAgLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gdHJpZ2dlciBvbkNvbnRhaW5lclVwZGF0ZSB0cmFpdCBldmVudCBmb3IgYmxvY2sgXCIke3RoaXMuYmxvY2suZ2V0VHlwZSgpLmlkZW50aWZpZXJ9OiR7eH0sJHt5fSwke3p9XCIgaW4gZGltZW5zaW9uIFwiJHt0aGlzLmJsb2NrLmRpbWVuc2lvbi5pZGVudGlmaWVyfVwiYCxcbiAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBibG9ja1xuICAgICAgICB0aGlzLmJsb2NrLnRyYWl0cy5kZWxldGUodHJhaXQuaWRlbnRpZmllcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNob3cocGxheWVyOiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyT3BlbmVkQ29udGFpbmVyU2lnbmFsXG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IFBsYXllck9wZW5lZENvbnRhaW5lclNpZ25hbChwbGF5ZXIsIHRoaXMpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNpZ25hbCB3YXMgY2FuY2VsbGVkXG4gICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm47XG5cbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzaG93IG1ldGhvZFxuICAgIHN1cGVyLnNob3cocGxheWVyKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBDb250YWluZXJPcGVuUGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IENvbnRhaW5lck9wZW5QYWNrZXQoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllc1xuICAgIHBhY2tldC5pZGVudGlmaWVyID0gdGhpcy5pZGVudGlmaWVyO1xuICAgIHBhY2tldC50eXBlID0gdGhpcy50eXBlO1xuICAgIHBhY2tldC5wb3NpdGlvbiA9IHRoaXMuYmxvY2sucG9zaXRpb247XG4gICAgcGFja2V0LnVuaXF1ZUlkID1cbiAgICAgIHRoaXMudHlwZSA9PT0gQ29udGFpbmVyVHlwZS5Db250YWluZXIgPyAtMW4gOiBwbGF5ZXIudW5pcXVlSWQ7XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgIHBsYXllci5zZW5kKHBhY2tldCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbnRhaW5lclxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQmxvY2tDb250YWluZXIgfTtcbiIsICJpbXBvcnQge1xuICBDb250YWluZXJDbG9zZVBhY2tldCxcbiAgQ29udGFpbmVySWQsXG4gIENvbnRhaW5lclR5cGUsXG4gIEZ1bGxDb250YWluZXJOYW1lLFxuICBJbnZlbnRvcnlDb250ZW50UGFja2V0LFxuICBJbnZlbnRvcnlTbG90UGFja2V0LFxuICBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvclxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4vaXRlbVwiO1xuXG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gXCIuL2VudGl0eVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb250YWluZXIuXG4gKi9cbmNsYXNzIENvbnRhaW5lciB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IENvbnRhaW5lclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogQ29udGFpbmVySWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RvcmFnZSBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2U6IEFycmF5PEl0ZW1TdGFjayB8IG51bGw+O1xuXG4gIC8qKlxuICAgKiBUaGUgb2NjdXBhbnRzIG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb2NjdXBhbnRzID0gbmV3IFNldDxQbGF5ZXI+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgZW1wdHkgc2xvdHMgaW4gdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyBlbXB0eVNsb3RzQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIG9mIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgdHlwZTogQ29udGFpbmVyVHlwZSxcbiAgICBpZGVudGlmaWVyOiBDb250YWluZXJJZCxcbiAgICBzaXplOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gQXNzaWduIHRoZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgdGhpcy5zdG9yYWdlID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogc2l6ZSB9LCAoKSA9PiBudWxsKTtcbiAgICB0aGlzLmVtcHR5U2xvdHNDb3VudCA9IHNpemU7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgYW1vdW50IG9mIGVtcHR5IHNsb3RzIGluIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FsY3VsYXRlRW1wdHlTbG90Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmZpbHRlcigoaXRlbSkgPT4gaXRlbSA9PT0gbnVsbCkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gaXRlbSBmcm9tIHRoZSBjb250YWluZXIuXG4gICAqIEBwYXJhbSBzbG90IFRoZSBzbG90IHRvIGdldCB0aGUgaXRlbSBmcm9tLlxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSBpbiB0aGUgc2xvdC5cbiAgICovXG4gIHB1YmxpYyBnZXRJdGVtKHNsb3Q6IG51bWJlcik6IEl0ZW1TdGFjayB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2Vbc2xvdF0gPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFuIGl0ZW0gaW4gdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIHNsb3QgVGhlIHNsb3QgdG8gc2V0IHRoZSBpdGVtIGluLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0SXRlbShzbG90OiBudW1iZXIsIGl0ZW06IEl0ZW1TdGFjayk6IHZvaWQge1xuICAgIC8vIFNldCB0aGUgaXRlbSBpbiB0aGUgc2xvdFxuICAgIHRoaXMuc3RvcmFnZVtzbG90XSA9IGl0ZW07XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBhbW91bnQgaXMgMFxuICAgIC8vIElmIHNvLCBzZXQgdGhlIHNsb3QgdG8gbnVsbCBhcyB0aGVyZSBpcyBubyBpdGVtXG4gICAgaWYgKGl0ZW0uYW1vdW50ID09PSAwKSB0aGlzLmNsZWFyU2xvdChzbG90KTtcblxuICAgIC8vIFNldCB0aGUgY29udGFpbmVyIG9mIHRoZSBpdGVtXG4gICAgaXRlbS5jb250YWluZXIgPSB0aGlzO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBlbXB0eSBzbG90cyBjb3VudFxuICAgIHRoaXMuZW1wdHlTbG90c0NvdW50ID0gdGhpcy5jYWxjdWxhdGVFbXB0eVNsb3RDb3VudCgpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250YWluZXIgZm9yIGFsbCBvY2N1cGFudHNcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaXRlbSB0byB0aGUgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoZSBhZGRlZCBpdGVtLlxuICAgKi9cbiAgcHVibGljIGFkZEl0ZW0oaXRlbTogSXRlbVN0YWNrKTogdm9pZCB7XG4gICAgLy8gRmluZCBhIHNsb3QgdGhhdCBoYXMgdGhlIHNhbWUgaXRlbSB0eXBlIGFuZCBpc24ndCBmdWxsICh4NjQpXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gc2xvdCwgZmluZCB0aGUgbmV4dCBlbXB0eSBzbG90LlxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnN0b3JhZ2UuZmluZEluZGV4KChzbG90KSA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgc2xvdCBpcyBudWxsLlxuICAgICAgaWYgKCFzbG90KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGNhbiBiZSBzdGFja2VkLlxuICAgICAgaWYgKHNsb3QuYW1vdW50ID49IGl0ZW0ubWF4QW1vdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIGVxdWFsIHRvIHRoZSBzbG90LlxuICAgICAgcmV0dXJuIGl0ZW0uZXF1YWxzKHNsb3QpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgbWF4ZWQuXG4gICAgY29uc3QgbWF4ZWQgPSBpdGVtLmFtb3VudCA+PSBpdGVtLm1heEFtb3VudDtcblxuICAgIC8vIENoZWNrIGlmIGV4aXN0cyBhbiBhdmFpbGFibGUgc2xvdFxuICAgIGlmIChzbG90ID4gLTEgJiYgIW1heGVkICYmIGl0ZW0uc3RhY2thYmxlKSB7XG4gICAgICAvLyBHZXQgdGhlIGl0ZW0gaWYgc2xvdCBhdmFpbGFibGVcbiAgICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuc3RvcmFnZVtzbG90XSBhcyBJdGVtU3RhY2s7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGl0ZW1zIHRvIGFkZC5cbiAgICAgIGNvbnN0IGFtb3VudCA9IE1hdGgubWluKFxuICAgICAgICBpdGVtLm1heEFtb3VudCAtIGV4aXN0aW5nSXRlbS5hbW91bnQsXG4gICAgICAgIGl0ZW0uYW1vdW50XG4gICAgICApO1xuXG4gICAgICAvLyBBZGQgdGhlIGFtb3VudCB0byB0aGUgZXhpc3RpbmcgaXRlbS5cbiAgICAgIGV4aXN0aW5nSXRlbS5pbmNyZW1lbnQoYW1vdW50KTtcblxuICAgICAgLy8gU3VidHJhY3QgdGhlIGFtb3VudCBmcm9tIHRoZSBpdGVtLlxuICAgICAgaXRlbS5kZWNyZW1lbnQoYW1vdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmluZCB0aGUgbmV4dCBlbXB0eSBzbG90LlxuICAgICAgY29uc3QgZW1wdHlTbG90ID0gdGhpcy5zdG9yYWdlLmluZGV4T2YobnVsbCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGFuIGVtcHR5IHNsb3QuXG4gICAgICBpZiAoZW1wdHlTbG90ID09PSAtMSkgcmV0dXJuO1xuICAgICAgaWYgKGl0ZW0uYW1vdW50ID4gaXRlbS5tYXhBbW91bnQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgZnVsbCBzdGFjayBpdGVtIGZvciB0aGUgZW1wdHkgc2xvdFxuICAgICAgICBjb25zdCBuZXdJdGVtID0gbmV3IEl0ZW1TdGFjayhpdGVtLnR5cGUsIHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIGFtb3VudDogaXRlbS5tYXhBbW91bnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBuZXcgSXRlbSBhbmQgZGVjcmVhc2UgaXRcbiAgICAgICAgdGhpcy5zZXRJdGVtKGVtcHR5U2xvdCwgbmV3SXRlbSk7XG4gICAgICAgIGl0ZW0uZGVjcmVtZW50KGl0ZW0ubWF4QW1vdW50KTtcblxuICAgICAgICAvLyBCZWNhdXNlIGl0IGlzIGdyZWF0ZXIgdGhhbiA2NCBjYWxsIHRoZSBmdW5jdGlvbiB0byBhZGQgdGhlIHJlbWFpbmluZyBpdGVtc1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtKGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIGl0ZW0gaW4gdGhlIGVtcHR5IHNsb3QuXG4gICAgICB0aGlzLnNldEl0ZW0oZW1wdHlTbG90LCBpdGVtKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIHNsb3QgVGhlIHNsb3QgdG8gcmVtb3ZlIHRoZSBpdGVtIGZyb20uXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCBvZiB0aGUgaXRlbSB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlSXRlbShzbG90OiBudW1iZXIsIGFtb3VudDogbnVtYmVyKTogSXRlbVN0YWNrIHwgbnVsbCB7XG4gICAgLy8gR2V0IHRoZSBpdGVtIGZyb20gdGhlIHNsb3QuXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0SXRlbShzbG90KTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgaXRlbXMgdG8gcmVtb3ZlLlxuICAgIGNvbnN0IHJlbW92ZWQgPSBNYXRoLm1pbihhbW91bnQsIGl0ZW0uYW1vdW50KTtcblxuICAgIC8vIFN1YnRyYWN0IHRoZSBhbW91bnQgZnJvbSB0aGUgaXRlbS5cbiAgICBpdGVtLmRlY3JlbWVudChyZW1vdmVkKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGFtb3VudCBpcyAwLlxuICAgIGlmIChpdGVtLmFtb3VudCA9PT0gMCkgdGhpcy5zdG9yYWdlW3Nsb3RdID0gbnVsbDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGVtcHR5IHNsb3RzIGluIHRoZSBjb250YWluZXIuXG4gICAgdGhpcy5lbXB0eVNsb3RzQ291bnQgPSB0aGlzLmNhbGN1bGF0ZUVtcHR5U2xvdENvdW50KCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlbW92ZWQgaXRlbS5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhbiBpdGVtIGZyb20gdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIHNsb3QgVGhlIHNsb3QgdG8gdGFrZSB0aGUgaXRlbSBmcm9tLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgb2YgdGhlIGl0ZW0gdG8gdGFrZS5cbiAgICogQHJldHVybnMgVGhlIHRha2VuIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgdGFrZUl0ZW0oc2xvdDogbnVtYmVyLCBhbW91bnQ6IG51bWJlcik6IEl0ZW1TdGFjayB8IG51bGwge1xuICAgIC8vIEdldCB0aGUgaXRlbSBpbiB0aGUgc2xvdC5cbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtKHNsb3QpO1xuICAgIGlmIChpdGVtID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGl0ZW1zIHRvIHJlbW92ZS5cbiAgICBjb25zdCByZW1vdmVkID0gTWF0aC5taW4oYW1vdW50LCBpdGVtLmFtb3VudCk7XG4gICAgaXRlbS5kZWNyZW1lbnQocmVtb3ZlZCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBhbW91bnQgaXMgMC5cbiAgICBpZiAoaXRlbS5hbW91bnQgPT09IDApIHRoaXMuY2xlYXJTbG90KHNsb3QpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgZW1wdHkgc2xvdHMgaW4gdGhlIGNvbnRhaW5lci5cbiAgICB0aGlzLmVtcHR5U2xvdHNDb3VudCA9IHRoaXMuY2FsY3VsYXRlRW1wdHlTbG90Q291bnQoKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBpdGVtIHdpdGggdGhlIHJlbW92ZWQgYW1vdW50LlxuICAgIGNvbnN0IG5ld0l0ZW0gPSBuZXcgSXRlbVN0YWNrKGl0ZW0udHlwZSwgeyAuLi5pdGVtLCBhbW91bnQ6IHJlbW92ZWQgfSk7XG5cbiAgICAvLyBDbG9uZSB0aGUgY29tcG9uZW50cyBvZiB0aGUgaXRlbSB0byB0aGUgbmV3IGl0ZW0uXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaXRlbS5jb21wb25lbnRzKVxuICAgICAgbmV3SXRlbS5jb21wb25lbnRzLnNldChrZXksIHZhbHVlKTtcblxuICAgIC8vIENsb25lIHRoZSB0cmFpdHMgb2YgdGhlIGl0ZW0gdG8gdGhlIG5ldyBpdGVtLlxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgaXRlbS50cmFpdHMudmFsdWVzKCkpIHRyYWl0LmNsb25lKG5ld0l0ZW0pO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250YWluZXIgZm9yIGFsbCBvY2N1cGFudHMuXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIENsb25lIHRoZSBOQlQgdGFncyBvZiB0aGUgaXRlbS5cbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBpdGVtLm5idC52YWx1ZXMoKSkge1xuICAgICAgbmV3SXRlbS5uYnQuYWRkKHRhZyk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBuZXcgaXRlbS5cbiAgICByZXR1cm4gbmV3SXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwcyBpdGVtcyBpbiB0aGUgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gc2xvdCBUaGUgc2xvdCB0byBzd2FwIHRoZSBpdGVtIGZyb20uXG4gICAqIEBwYXJhbSBvdGhlclNsb3QgVGhlIHNsb3QgdG8gc3dhcCB0aGUgaXRlbSB0by5cbiAgICogQHBhcmFtIG90aGVyQ29udGFpbmVyIFRoZSBvdGhlciBjb250YWluZXIgdG8gc3dhcCB0aGUgaXRlbSB0by5cbiAgICovXG4gIHB1YmxpYyBzd2FwSXRlbXMoXG4gICAgc2xvdDogbnVtYmVyLFxuICAgIG90aGVyU2xvdDogbnVtYmVyLFxuICAgIG90aGVyQ29udGFpbmVyPzogQ29udGFpbmVyXG4gICk6IHZvaWQge1xuICAgIC8vIEFzc2lnbiB0aGUgdGFyZ2V0IGNvbnRhaW5lclxuICAgIGNvbnN0IHRhcmdldENvbnRhaW5lciA9IG90aGVyQ29udGFpbmVyID8/IHRoaXM7XG5cbiAgICAvLyBHZXQgdGhlIGl0ZW1zIGluIHRoZSBzbG90c1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW0oc2xvdCk7XG4gICAgY29uc3Qgb3RoZXJJdGVtID0gdGFyZ2V0Q29udGFpbmVyLmdldEl0ZW0ob3RoZXJTbG90KTtcblxuICAgIC8vIENsZWFyIHRoZSBzbG90c1xuICAgIHRoaXMuY2xlYXJTbG90KHNsb3QpO1xuICAgIHRhcmdldENvbnRhaW5lci5jbGVhclNsb3Qob3RoZXJTbG90KTtcblxuICAgIGlmIChpdGVtKSB0YXJnZXRDb250YWluZXIuc2V0SXRlbShvdGhlclNsb3QsIGl0ZW0pO1xuICAgIGlmIChvdGhlckl0ZW0pIHRoaXMuc2V0SXRlbShzbG90LCBvdGhlckl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhIHNsb3QgaW4gdGhlIGNvbnRhaW5lci5cbiAgICogQHBhcmFtIHNsb3QgVGhlIHNsb3QgdG8gY2xlYXIuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTbG90KHNsb3Q6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFNldCB0aGUgc2xvdCB0byBudWxsLlxuICAgIHRoaXMuc3RvcmFnZVtzbG90XSA9IG51bGw7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBlbXB0eSBzbG90cyBpbiB0aGUgY29udGFpbmVyLlxuICAgIHRoaXMuZW1wdHlTbG90c0NvdW50ID0gdGhpcy5jYWxjdWxhdGVFbXB0eVNsb3RDb3VudCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBhIHBsYXllciwgaWYgc28sIHJldHVybi5cbiAgICBpZiAodGhpcy5vY2N1cGFudHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IEludmVudG9yeVNsb3RQYWNrZXQuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IEludmVudG9yeVNsb3RQYWNrZXQoKTtcblxuICAgIC8vIFNldCBwcm9wZXJ0aWVzIG9mIHRoZSBwYWNrZXQuXG4gICAgcGFja2V0LmNvbnRhaW5lcklkID0gdGhpcy5pZGVudGlmaWVyO1xuICAgIHBhY2tldC5zbG90ID0gc2xvdDtcbiAgICBwYWNrZXQuaXRlbSA9IG5ldyBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvcigwKTtcbiAgICBwYWNrZXQuZnVsbENvbnRhaW5lck5hbWUgPSBuZXcgRnVsbENvbnRhaW5lck5hbWUoMCwgMCk7XG4gICAgcGFja2V0LnN0b3JhZ2VJdGVtID0gbmV3IE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yKDApOyAvLyBCdW5kbGVzID9cblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgb2NjdXBhbnRzLlxuICAgIGZvciAoY29uc3QgcGxheWVyIG9mIHRoaXMub2NjdXBhbnRzKSBwbGF5ZXIuc2VuZChwYWNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgc2xvdHMgaW4gdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBhbGwgc2xvdHMgaW4gdGhlIGNvbnRhaW5lci5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2l6ZTsgaSsrKSB0aGlzLmNsZWFyU2xvdChpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZShwbGF5ZXI/OiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgSW52ZW50b3J5Q29udGVudFBhY2tldC5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgSW52ZW50b3J5Q29udGVudFBhY2tldCgpO1xuXG4gICAgLy8gU2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwYWNrZXQuXG4gICAgcGFja2V0LmNvbnRhaW5lcklkID0gdGhpcy5pZGVudGlmaWVyO1xuICAgIHBhY2tldC5mdWxsQ29udGFpbmVyTmFtZSA9IG5ldyBGdWxsQ29udGFpbmVyTmFtZSgwLCAwKTtcbiAgICBwYWNrZXQuc3RvcmFnZUl0ZW0gPSBuZXcgTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3IoMCk7IC8vIEJ1bmRsZXMgP1xuXG4gICAgLy8gTWFwIHRoZSBpdGVtcyBpbiB0aGUgc3RvcmFnZSB0byBuZXR3b3JrIGl0ZW0gc3RhY2sgZGVzY3JpcHRvcnMuXG4gICAgcGFja2V0Lml0ZW1zID0gdGhpcy5zdG9yYWdlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgbnVsbCwgcmV0dXJuIGEgbmV3IE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yLlxuICAgICAgLy8gVGhpcyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHNsb3QgaXMgZW1wdHkuXG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBuZXcgTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3IoMCk7XG5cbiAgICAgIC8vIENvbnZlcnQgdGhlIGl0ZW0gc3RhY2sgdG8gYSBuZXR3b3JrIGl0ZW0gc3RhY2sgZGVzY3JpcHRvclxuICAgICAgcmV0dXJuIEl0ZW1TdGFjay50b05ldHdvcmtTdGFjayhpdGVtKTtcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaXMgcHJvdmlkZWQuXG4gICAgaWYgKHBsYXllcikge1xuICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXIuXG4gICAgICBwbGF5ZXIuc2VuZChwYWNrZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIG9jY3VwYW50cy5cbiAgICAgIGZvciAoY29uc3QgcGxheWVyIG9mIHRoaXMub2NjdXBhbnRzKSBwbGF5ZXIuc2VuZChwYWNrZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyB0aGUgY29udGFpbmVyIHRvIGEgcGxheWVyLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdG8gc2hvdyB0aGUgY29udGFpbmVyIHRvLlxuICAgKi9cbiAgcHVibGljIHNob3cocGxheWVyOiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIGFscmVhZHkgdmlld2luZyBhIGNvbnRhaW5lci5cbiAgICAvLyBJZiBzbywgY2xvc2UgdGhlIGNvbnRhaW5lci5cbiAgICBpZiAocGxheWVyLm9wZW5lZENvbnRhaW5lcikgcGxheWVyLm9wZW5lZENvbnRhaW5lci5jbG9zZShwbGF5ZXIpO1xuXG4gICAgLy8gQWRkIHRoZSBwbGF5ZXIgdG8gdGhlIG9jY3VwYW50cy5cbiAgICB0aGlzLm9jY3VwYW50cy5hZGQocGxheWVyKTtcblxuICAgIC8vIFNldCB0aGUgb3BlbmVkIGNvbnRhaW5lciBvZiB0aGUgcGxheWVyLlxuICAgIHBsYXllci5vcGVuZWRDb250YWluZXIgPSB0aGlzO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzdG9yYWdlLCBhbmQgY2FsbCB0aGUgb25Db250YWluZXJPcGVuIG1ldGhvZCBvZiB0aGUgaXRlbS5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5zdG9yYWdlKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyBudWxsLlxuICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0cmFpdHMgb2YgdGhlIGl0ZW0gYW5kIGNhbGwgdGhlIG9uQ29udGFpbmVyT3BlbiBtZXRob2QuXG4gICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIGl0ZW0udHJhaXRzLnZhbHVlcygpKSB0cmFpdC5vbkNvbnRhaW5lck9wZW4/LihwbGF5ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgY29udGFpbmVyIGZvciBhIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRvIGNsb3NlIHRoZSBjb250YWluZXIgZm9yLlxuICAgKi9cbiAgcHVibGljIGNsb3NlKHBsYXllcjogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBub3Qgdmlld2luZyB0aGUgY29udGFpbmVyLlxuICAgIGlmICghdGhpcy5vY2N1cGFudHMuaGFzKHBsYXllcikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGF5ZXIgaXMgbm90IHZpZXdpbmcgdGhlIGNvbnRhaW5lci5cIik7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgQ29udGFpbmVyQ2xvc2VQYWNrZXQuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IENvbnRhaW5lckNsb3NlUGFja2V0KCk7XG4gICAgcGFja2V0LmlkZW50aWZpZXIgPSB0aGlzLmlkZW50aWZpZXI7XG4gICAgcGFja2V0LnR5cGUgPSBDb250YWluZXJUeXBlLk5vbmU7XG4gICAgcGFja2V0LnNlcnZlckluaXRpYXRlZCA9IGZhbHNlO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXIuXG4gICAgcGxheWVyLnNlbmQocGFja2V0KTtcblxuICAgIC8vIFNldCB0aGUgb3BlbmVkIGNvbnRhaW5lciBvZiB0aGUgcGxheWVyIHRvIG51bGwuXG4gICAgcGxheWVyLm9wZW5lZENvbnRhaW5lciA9IG51bGw7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHBsYXllciBmcm9tIHRoZSBvY2N1cGFudHMuXG4gICAgdGhpcy5vY2N1cGFudHMuZGVsZXRlKHBsYXllcik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHN0b3JhZ2UsIGFuZCBjYWxsIHRoZSBvbkNvbnRhaW5lckNsb3NlIG1ldGhvZCBvZiB0aGUgaXRlbS5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5zdG9yYWdlKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyBudWxsLlxuICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0cmFpdHMgb2YgdGhlIGl0ZW0gYW5kIGNhbGwgdGhlIG9uQ29udGFpbmVyQ2xvc2UgbWV0aG9kLlxuICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiBpdGVtLnRyYWl0cy52YWx1ZXMoKSlcbiAgICAgICAgdHJhaXQub25Db250YWluZXJDbG9zZT8uKHBsYXllcik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IENvbnRhaW5lciB9O1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90cmFpdHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BhbGV0dGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Jsb2NrXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb250YWluZXJcIjtcblxuaW1wb3J0ICogYXMgVHJhaXRzIGZyb20gXCIuL3RyYWl0c1wiO1xuXG4vKipcbiAqIEEgbGlzdCBvZiBhbGwgYmxvY2sgdHJhaXRzXG4gKi9cbmNvbnN0IEJsb2NrVHJhaXRzID0gQXJyYXk8dHlwZW9mIFRyYWl0cy5CbG9ja1RyYWl0PigpO1xuXG4vLyBJdGVyYXRlIG92ZXIgZWFjaCB0cmFpdFxuZm9yIChjb25zdCBrZXkgaW4gVHJhaXRzKSB7XG4gIC8vIEdldCB0aGUgYmxvY2sgdHJhaXRcbiAgY29uc3QgdHJhaXQgPSBUcmFpdHNba2V5IGFzIGtleW9mIHR5cGVvZiBUcmFpdHNdO1xuXG4gIC8vIFB1c2ggdGhlIGJsb2NrIHRyYWl0IHRvIHRoZSBsaXN0XG4gIEJsb2NrVHJhaXRzLnB1c2godHJhaXQpO1xufVxuXG5leHBvcnQgeyBCbG9ja1RyYWl0cyB9O1xuIiwgImltcG9ydCB7IEl0ZW1zLCBJdGVtVHlwZVByb3BlcnRpZXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEl0ZW1Ub29sVGllciwgSXRlbVRvb2xUeXBlIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBCbG9ja1R5cGUgfSBmcm9tIFwiLi4vLi4vYmxvY2tcIjtcblxuY29uc3QgRGVmYXVsdEl0ZW1UeXBlUHJvcGVydGllczogSXRlbVR5cGVQcm9wZXJ0aWVzID0ge1xuICBzdGFja2FibGU6IHRydWUsXG4gIG1heEFtb3VudDogNjQsXG4gIHRvb2w6IEl0ZW1Ub29sVHlwZS5Ob25lLFxuICB0aWVyOiBJdGVtVG9vbFRpZXIuTm9uZSxcbiAgdGFnczogW10sXG4gIGJsb2NrOiBudWxsXG59O1xuXG5pbXBvcnQgdHlwZSB7XG4gIEl0ZW1EYXRhLFxuICBOZXR3b3JrSXRlbUluc3RhbmNlRGVzY3JpcHRvclxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuY2xhc3MgSXRlbVR5cGU8VCBleHRlbmRzIGtleW9mIEl0ZW1zID0ga2V5b2YgSXRlbXM+IHtcbiAgLyoqXG4gICAqIEEgY29sbGVjdGl2ZSByZWdpc3RyeSBvZiBhbGwgaXRlbSB0eXBlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBuZXcgTWFwPHN0cmluZywgSXRlbVR5cGU+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpdGVtIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogVDtcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgb2YgdGhlIGl0ZW0gdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGl0ZW0gdHlwZSBpcyBzdGFja2FibGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhY2thYmxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBzdGFjayBzaXplIG9mIHRoZSBpdGVtIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4QW1vdW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIHR5cGUgb2YgdGhlIGl0ZW0gdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0b29sOiBJdGVtVG9vbFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIHRpZXIgb2YgdGhlIGl0ZW0gdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0aWVyOiBJdGVtVG9vbFRpZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIG9mIHRoZSBpdGVtIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFnczogQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIG9mIHRoZSBpdGVtIHR5cGUsIGlmIGFwcGxpY2FibGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2s6IEl0ZW1zW1RdO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gbmV0d29yayBUaGUgbmV0d29yayBvZiB0aGUgaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgaXRlbSB0eXBlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IFQsXG4gICAgbmV0d29yazogbnVtYmVyLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPEl0ZW1UeXBlUHJvcGVydGllcz5cbiAgKSB7XG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLm5ldHdvcmsgPSBuZXR3b3JrO1xuXG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLkRlZmF1bHRJdGVtVHlwZVByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIHRoaXMuc3RhY2thYmxlID0gcHJvcHMuc3RhY2thYmxlO1xuICAgIHRoaXMubWF4QW1vdW50ID0gcHJvcHMubWF4QW1vdW50O1xuICAgIHRoaXMudG9vbCA9IHByb3BzLnRvb2w7XG4gICAgdGhpcy50aWVyID0gcHJvcHMudGllcjtcbiAgICB0aGlzLnRhZ3MgPSBwcm9wcy50YWdzO1xuICAgIHRoaXMuYmxvY2sgPSBwcm9wcy5ibG9jayBhcyBJdGVtc1tUXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgdGhlIGl0ZW0gdHlwZSBpcyBhIHRvb2wuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGl0ZW0gdHlwZSBpcyBhIHRvb2wuXG4gICAqL1xuICBwdWJsaWMgaXNUb29sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRvb2wgIT09IEl0ZW1Ub29sVHlwZS5Ob25lICYmIHRoaXMudGllciAhPT0gSXRlbVRvb2xUaWVyLk5vbmU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpdGVtIHR5cGUgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldDxUIGV4dGVuZHMga2V5b2YgSXRlbXM+KGlkZW50aWZpZXI6IFQpOiBJdGVtVHlwZTxUPiB8IG51bGwge1xuICAgIHJldHVybiBJdGVtVHlwZS50eXBlcy5nZXQoaWRlbnRpZmllcikgYXMgSXRlbVR5cGU8VD47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBpdGVtIHR5cGUgZnJvbSB0aGUgbmV0d29yay5cbiAgICogQHBhcmFtIG5ldHdvcmsgVGhlIG5ldHdvcmsgdG8gZ2V0IHRoZSBpdGVtIHR5cGUgZnJvbS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QnlOZXR3b3JrKG5ldHdvcms6IG51bWJlcik6IEl0ZW1UeXBlIHwgbnVsbCB7XG4gICAgcmV0dXJuIChcbiAgICAgIFsuLi5JdGVtVHlwZS50eXBlcy52YWx1ZXMoKV0uZmluZCgoaXRlbSkgPT4gaXRlbS5uZXR3b3JrID09PSBuZXR3b3JrKSA/P1xuICAgICAgbnVsbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBpdGVtIHR5cGVzIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRBbGwoKTogQXJyYXk8SXRlbVR5cGU+IHtcbiAgICByZXR1cm4gWy4uLkl0ZW1UeXBlLnR5cGVzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBpdGVtIHR5cGUgZnJvbSB0aGUgYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGJsb2NrIHR5cGUgdG8gcmVzb2x2ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzb2x2ZSh0eXBlOiBCbG9ja1R5cGUpOiBJdGVtVHlwZSB8IG51bGwge1xuICAgIHJldHVybiAoXG4gICAgICBbLi4uSXRlbVR5cGUudHlwZXMudmFsdWVzKCldLmZpbmQoKGl0ZW0pID0+IGl0ZW0uYmxvY2sgPT09IHR5cGUpID8/IG51bGxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGl0ZW0gdHlwZSB0byBpdGVtIGRhdGEsIHRoaXMgaXMgdXNlZCBmb3IgdGhlIHByb3RvY29sLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgaXRlbSB0eXBlIHRvIGNvbnZlcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRvSXRlbURhdGEodHlwZTogSXRlbVR5cGUpOiBJdGVtRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHR5cGUuaWRlbnRpZmllcixcbiAgICAgIG5ldHdvcmtJZDogdHlwZS5uZXR3b3JrLFxuICAgICAgY29tcG9uZW50QmFzZWQ6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9OZXR3b3JrSW5zdGFuY2UoXG4gICAgdHlwZTogSXRlbVR5cGUsXG4gICAgc3RhY2tTaXplOiBudW1iZXIgPSAxXG4gICk6IE5ldHdvcmtJdGVtSW5zdGFuY2VEZXNjcmlwdG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmV0d29yazogdHlwZS5uZXR3b3JrLFxuICAgICAgbWV0YWRhdGE6IDAsXG4gICAgICBuZXR3b3JrQmxvY2tJZDogdHlwZS5ibG9jaz8uZ2V0UGVybXV0YXRpb24oKS5uZXR3b3JrID8/IDAsXG4gICAgICBzdGFja1NpemUsXG4gICAgICBleHRyYXM6IHtcbiAgICAgICAgY2FuRGVzdHJveTogW10sXG4gICAgICAgIGNhblBsYWNlT246IFtdLFxuICAgICAgICBuYnQ6IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCB7IEl0ZW1UeXBlIH07XG4iLCAiaW1wb3J0IHsgQ29tcG91bmRUYWcgfSBmcm9tIFwiQHNlcmVuaXR5anMvbmJ0XCI7XG5cbmltcG9ydCB0eXBlIHsgSXRlbVR5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5cbmNsYXNzIENyZWF0aXZlSXRlbSB7XG4gIC8qKlxuICAgKiBBIGNvbGxlY3RpdmUgbWFwIG9mIGNyZWF0aXZlIGl0ZW1zIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGl0ZW1zID0gbmV3IE1hcDxudW1iZXIsIENyZWF0aXZlSXRlbT4oKTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGNyZWF0aXZlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogSXRlbVR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRhZGF0YSBvZiB0aGUgY3JlYXRpdmUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgTkJUIG9mIHRoZSBjcmVhdGl2ZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5idDogQ29tcG91bmRUYWc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBjcmVhdGl2ZSBpdGVtLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgY3JlYXRpdmUgaXRlbS5cbiAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZXRhZGF0YSBvZiB0aGUgY3JlYXRpdmUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBJdGVtVHlwZSwgbWV0YWRhdGE6IG51bWJlciwgbmJ0PzogQ29tcG91bmRUYWcpIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0aGlzLm5idCA9IG5idCA/PyBuZXcgQ29tcG91bmRUYWcoXCJcIiwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbmV3IGNyZWF0aXZlIGl0ZW0uXG4gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBjcmVhdGl2ZSBpdGVtLlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1ldGFkYXRhIG9mIHRoZSBjcmVhdGl2ZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWdpc3Rlcih0eXBlOiBJdGVtVHlwZSwgbWV0YWRhdGE6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtLlxuICAgIGNvbnN0IGluZGV4ID0gQ3JlYXRpdmVJdGVtLml0ZW1zLnNpemU7XG5cbiAgICAvLyBTZXQgdGhlIGl0ZW0gaW4gdGhlIHJlZ2lzdHJ5LlxuICAgIENyZWF0aXZlSXRlbS5pdGVtcy5zZXQoaW5kZXgsIG5ldyBDcmVhdGl2ZUl0ZW0odHlwZSwgbWV0YWRhdGEpKTtcbiAgfVxufVxuXG5leHBvcnQgeyBDcmVhdGl2ZUl0ZW0gfTtcbiIsICJpbXBvcnQgeyBJdGVtSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgSXRlbVR5cGVQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDcmVhdGl2ZUl0ZW0gfSBmcm9tIFwiLi4vLi5cIjtcblxuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5cbmNsYXNzIEN1c3RvbUl0ZW1UeXBlIGV4dGVuZHMgSXRlbVR5cGUge1xuICBwcm90ZWN0ZWQgc3RhdGljIG5ldHdvcmtJZCA9IDIwMDAwOyAvLyBTdGFydCBhdCAyMDAwMCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB2YW5pbGxhIGl0ZW0gdHlwZXMuXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGF0IHRoZSBpdGVtIHR5cGUgaXMgY3VzdG9tLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGN1c3RvbSA9IHRydWU7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxJdGVtVHlwZVByb3BlcnRpZXM+XG4gICkge1xuICAgIHN1cGVyKGlkZW50aWZpZXIgYXMgSXRlbUlkZW50aWZpZXIsICsrQ3VzdG9tSXRlbVR5cGUubmV0d29ya0lkLCBwcm9wZXJ0aWVzKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBjdXN0b20gaXRlbSB0eXBlIHRvIHRoZSBjcmVhdGl2ZSBpbnZlbnRvcnkuXG4gICAgQ3JlYXRpdmVJdGVtLnJlZ2lzdGVyKHRoaXMsIDApO1xuICB9XG59XG5cbmV4cG9ydCB7IEN1c3RvbUl0ZW1UeXBlIH07XG4iLCAiaW1wb3J0IHR5cGUgeyBDb21tYW5kQXJndW1lbnRQb2ludGVyIH0gZnJvbSBcIi4uL2V4ZWN1dGlvbi1zdGF0ZVwiO1xuXG5jbGFzcyBFbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBlbnVtcyA9IG5ldyBNYXA8c3RyaW5nLCBFbnVtPigpO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogbnVtYmVyO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ltYm9sOiBudW1iZXI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBkZWZhdWx0ID0gbmV3IEVudW0oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZW51bSB2YWx1ZSBpcyBvcHRpb25hbC5cbiAgICovXG4gIHB1YmxpYyBvcHRpb25hbCA9IHRydWU7XG5cbiAgcHVibGljIHJlc3VsdDogdW5rbm93bjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoLi4uX2FyZ3VtZW50czogQXJyYXk8dW5rbm93bj4pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9uc1xuICAgIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBlbnVtIHZhbHVlIGlzIGFwcGxpY2FibGUuXG4gICAqIEBwYXJhbSBlcnJvciBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSBlbnVtIHZhbHVlIGlzIG5vdCBhcHBsaWNhYmxlLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW51bSB2YWx1ZSBpcyBhcHBsaWNhYmxlLCBvciBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZShfZXJyb3IgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCB0aHJvdyBhbiBlcnJvci5cbiAgICBpZiAoX2Vycm9yKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCB2YWx1ZSBhZnRlciBwcmV2aW91cyBhcmd1bWVudC5cIik7XG5cbiAgICAvLyBSZXR1cm4gZmFsc2UuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIHBvaW50ZXIuXG4gICAqIEBwYXJhbSBwb2ludGVyIFRoZSBwb2ludGVyIHRvIHJlYWQgZnJvbS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdChfcG9pbnRlcjogQ29tbWFuZEFyZ3VtZW50UG9pbnRlcik6IEVudW0gfCBudWxsIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbnVtLmV4dHJhY3QoKSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQuXCIpO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudW0gfTtcbiIsICJpbXBvcnQgeyBFbnVtIH0gZnJvbSBcIi4uL2VudW1cIjtcblxuY2xhc3MgVmFsaWRFbnVtIGV4dGVuZHMgRW51bSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9IDB4MTA7XG59XG5cbmV4cG9ydCB7IFZhbGlkRW51bSB9O1xuIiwgImltcG9ydCB7IFZhbGlkRW51bSB9IGZyb20gXCIuL3ZhbGlkXCI7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZEFyZ3VtZW50UG9pbnRlciB9IGZyb20gXCIuLi8uLi9leGVjdXRpb24tc3RhdGVcIjtcblxuY2xhc3MgU3RyaW5nRW51bSBleHRlbmRzIFZhbGlkRW51bSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwic3RyaW5nXCI7XG5cbiAgLyoqXG4gICAqIFRoZSBzeW1ib2wgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN5bWJvbCA9ICh0aGlzLnR5cGUgPDwgMTYpIHwgMHgzODtcblxuICAvKipcbiAgICogVGhlIG9wdGlvbnMgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZW51bSBpcyBzdHJpY3QgdG8gaXRzIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN0cmljdCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdWx0OiBzdHJpbmcgfCBudWxsO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihyZXN1bHQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKF9lcnJvcj86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgbnVsbC5cbiAgICBpZiAodGhpcy5yZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCB0aHJvdyBhbiBlcnJvci5cbiAgICAgIGlmIChfZXJyb3IpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHR5cGUgXCJzdHJpbmdcIiBhZnRlciBwcmV2aW91cyBhcmd1bWVudC4nKTtcblxuICAgICAgLy8gUmV0dXJuIGZhbHNlLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0KHBvaW50ZXI6IENvbW1hbmRBcmd1bWVudFBvaW50ZXIpOiBTdHJpbmdFbnVtIHwgbnVsbCB7XG4gICAgLy8gUGVlayB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgIGxldCBwZWVrID0gcG9pbnRlci5wZWVrKCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGVlayB2YWx1ZSBpcyBudWxsLlxuICAgIGlmICghcGVlaykgcmV0dXJuIG5ldyBTdHJpbmdFbnVtKG51bGwpO1xuXG4gICAgLy8gUmVhZCB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgIHBlZWsgPSBwb2ludGVyLm5leHQoKSBhcyBzdHJpbmc7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgY2FuIGJlIGEgbnVtYmVyIG9yIGEgZmxvYXQuXG4gICAgaWYgKCtwZWVrID49IDAgfHwgK3BlZWsgPD0gMCkgcmV0dXJuIG5ldyBTdHJpbmdFbnVtKG51bGwpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4uXG4gICAgaWYgKHBlZWsgPT09IFwidHJ1ZVwiIHx8IHBlZWsgPT09IFwiZmFsc2VcIikgcmV0dXJuIG5ldyBTdHJpbmdFbnVtKG51bGwpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIHN0cmluZ1xuICAgIHJldHVybiBuZXcgU3RyaW5nRW51bShwZWVrKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTdHJpbmdFbnVtIH07XG4iLCAiaW1wb3J0IHsgVmFsaWRFbnVtIH0gZnJvbSBcIi4vdmFsaWRcIjtcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kQXJndW1lbnRQb2ludGVyIH0gZnJvbSBcIi4uLy4uL2V4ZWN1dGlvbi1zdGF0ZVwiO1xuXG5jbGFzcyBJbnRlZ2VyRW51bSBleHRlbmRzIFZhbGlkRW51bSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiaW50ZWdlclwiO1xuXG4gIC8qKlxuICAgKiBUaGUgc3ltYm9sIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBzeW1ib2wgPSAodGhpcy50eXBlIDw8IDE2KSB8IDB4MDE7XG5cbiAgLyoqXG4gICAqIFRoZSByZXN1bHQgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdWx0OiBudW1iZXIgfCBudWxsO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihyZXN1bHQ6IG51bWJlciB8IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKF9lcnJvcj86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgbnVsbC5cbiAgICBpZiAodGhpcy5yZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCB0aHJvdyBhbiBlcnJvci5cbiAgICAgIGlmIChfZXJyb3IpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHR5cGUgXCJpbnRlZ2VyXCIgYWZ0ZXIgcHJldmlvdXMgYXJndW1lbnQuJyk7XG5cbiAgICAgIC8vIFJldHVybiBmYWxzZS5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZS5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdChwb2ludGVyOiBDb21tYW5kQXJndW1lbnRQb2ludGVyKTogSW50ZWdlckVudW0gfCBudWxsIHtcbiAgICAvLyBQZWVrIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIHBvaW50ZXIuXG4gICAgbGV0IHBlZWsgPSBwb2ludGVyLnBlZWsoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwZWVrIHZhbHVlIGlzIG51bGwuXG4gICAgaWYgKCFwZWVrKSByZXR1cm4gbmV3IEludGVnZXJFbnVtKG51bGwpO1xuXG4gICAgLy8gUmVhZCB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgIHBlZWsgPSBwb2ludGVyLm5leHQoKSBhcyBzdHJpbmc7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbi5cbiAgICBpZiAocGVlayA9PT0gXCJ0cnVlXCIpXG4gICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGFzIGFuIGludGVnZXIuXG4gICAgICByZXR1cm4gbmV3IEludGVnZXJFbnVtKDEpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4uXG4gICAgaWYgKHBlZWsgPT09IFwiZmFsc2VcIilcbiAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgYXMgYW4gaW50ZWdlci5cbiAgICAgIHJldHVybiBuZXcgSW50ZWdlckVudW0oMCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgY2FuIGJlIGEgbnVtYmVyIG9yIGEgZmxvYXQuXG4gICAgaWYgKCtwZWVrID49IDAgfHwgK3BlZWsgPD0gMCkgcmV0dXJuIG5ldyBJbnRlZ2VyRW51bSgrKHBlZWsgYXMgc3RyaW5nKSk7XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGEgbnVtYmVyLlxuICAgIHJldHVybiBuZXcgSW50ZWdlckVudW0obnVsbCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgSW50ZWdlckVudW0gfTtcbiIsICJpbXBvcnQgeyBFbnRpdHksIEVudGl0eU5hbWVUYWdUcmFpdCwgUGxheWVyIH0gZnJvbSBcIi4uLy4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBWYWxpZEVudW0gfSBmcm9tIFwiLlwiO1xuXG5pbXBvcnQgdHlwZSB7IERpbWVuc2lvbiB9IGZyb20gXCIuLi8uLi8uLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kQXJndW1lbnRQb2ludGVyIH0gZnJvbSBcIi4uLy4uL2V4ZWN1dGlvbi1zdGF0ZVwiO1xuXG5jbGFzcyBUYXJnZXRFbnVtIGV4dGVuZHMgVmFsaWRFbnVtIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJ0YXJnZXRcIjtcblxuICAvKipcbiAgICogVGhlIHN5bWJvbCBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ltYm9sID0gKHRoaXMudHlwZSA8PCAxNikgfCAweDBhO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3VsdDogQXJyYXk8RW50aXR5PiB8IG51bGw7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHJlc3VsdDogQXJyYXk8RW50aXR5PiB8IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKGVycm9yID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHJlc3VsdCBpcyBudWxsLlxuICAgIGlmIChlcnJvciAmJiAhdGhpcy5yZXN1bHQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB0YXJnZXRzIG1hdGNoZWQgdGhlIHNlbGVjdG9yLlwiKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSByZXN1bHQgaXMgbnVsbC5cbiAgICBpZiAoIXRoaXMucmVzdWx0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcmVzdWx0IGlzIGFuIGFycmF5LlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0KHBvaW50ZXI6IENvbW1hbmRBcmd1bWVudFBvaW50ZXIpOiBUYXJnZXRFbnVtIHwgbnVsbCB7XG4gICAgLy8gUGVlayB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgIGNvbnN0IHRhcmdldCA9IHBvaW50ZXIubmV4dCgpIGFzIHN0cmluZztcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgaXMgbnVsbC5cbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG5ldyBUYXJnZXRFbnVtKG51bGwpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBjYW4gYmUgYSBudW1iZXIgb3IgYSBmbG9hdC5cbiAgICBpZiAoK3RhcmdldCA+PSAwIHx8ICt0YXJnZXQgPD0gMCkgcmV0dXJuIG5ldyBUYXJnZXRFbnVtKG51bGwpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBjYW4gYmUgYSBib29sZWFuLlxuICAgIGlmICh0YXJnZXQgPT09IFwidHJ1ZVwiIHx8IHRhcmdldCA9PT0gXCJmYWxzZVwiKSByZXR1cm4gbmV3IFRhcmdldEVudW0obnVsbCk7XG5cbiAgICAvLyBHZXQgdGhlIG9yaWdpbiBvZiB0aGUgY29tbWFuZC5cbiAgICBjb25zdCBvcmlnaW4gPVxuICAgICAgcG9pbnRlci5zdGF0ZS5vcmlnaW4gaW5zdGFuY2VvZiBFbnRpdHlcbiAgICAgICAgPyBwb2ludGVyLnN0YXRlLm9yaWdpbi5kaW1lbnNpb25cbiAgICAgICAgOiAocG9pbnRlci5zdGF0ZS5vcmlnaW4gYXMgRGltZW5zaW9uKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgaXMgYSBwbGF5ZXIgb3Igc3RhcnRzIHdpdGggQC5cbiAgICBpZiAoXG4gICAgICAhdGFyZ2V0LnN0YXJ0c1dpdGgoXCJAXCIpICYmXG4gICAgICAhb3JpZ2luLmdldFBsYXllcnMoKS5zb21lKCh4KSA9PiB4LnVzZXJuYW1lID09PSB0YXJnZXQpXG4gICAgKVxuICAgICAgcmV0dXJuIG5ldyBUYXJnZXRFbnVtKG51bGwpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBzdGFydHMgd2l0aCBALlxuICAgIC8vIFRoaXMgbWVhbnMgd2UgYXJlIHF1ZXJ5aW5nIGZvciBhIHRhcmdldC5cbiAgICBpZiAodGFyZ2V0LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICAvLyBHZXQgdGhlIHF1ZXJ5IHN5bWJvbC4gKGUuZy4gYSwgZSwgcCwgciwgcylcbiAgICAgIGNvbnN0IHN5bWJvbCA9IHRhcmdldC5zbGljZSgxKVswXTtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGFyZ2V0LnNsaWNlKDIpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcXVlcnkgaXMgdmFsaWQuXG4gICAgICBpZiAocXVlcnkubGVuZ3RoID4gMCAmJiAoIXF1ZXJ5LnN0YXJ0c1dpdGgoXCJbXCIpIHx8ICFxdWVyeS5lbmRzV2l0aChcIl1cIikpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHF1ZXJ5LlwiKTsgLy8gVE9ETzogbW9yZSBzcGVjaWZpYyBlcnJvclxuXG4gICAgICAvLyBQYXJzZSB0aGUgcXVlcnkuXG4gICAgICBjb25zdCBxdWVyaWVzID1cbiAgICAgICAgcXVlcnkubGVuZ3RoID4gMFxuICAgICAgICAgID8gcXVlcnlcbiAgICAgICAgICAgICAgLnNsaWNlKDEsIC0xKVxuICAgICAgICAgICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAgICAgICAgIC5mbGF0TWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZGF0YS5zcGxpdChcIj1cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZSB9O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgIDogW107XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzeW1ib2wgaXMgYSB2YWxpZCBxdWVyeS5cbiAgICAgIHN3aXRjaCAoc3ltYm9sKSB7XG4gICAgICAgIC8vIEdldCBhbGwgcGxheWVycy5cbiAgICAgICAgY2FzZSBcImFcIjoge1xuICAgICAgICAgIGNvbnN0IHBsYXllcnMgPSBvcmlnaW4uZ2V0UGxheWVycygpLmZpbHRlcigocGxheWVyKSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHF1ZXJpZXMuXG4gICAgICAgICAgICBpZiAocXVlcmllcy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBxdWVyaWVzKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBuYW1lIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGNhc2UgXCJuYW1lXCI6IHtcbiAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmFtZSBxdWVyeS5cbiAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdmFsdWUgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcXVlcnkgaXMgbmVnYXRlZC5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZ2F0ZSA9IG5hbWUuc3RhcnRzV2l0aChcIiFcIik7XG4gICAgICAgICAgICAgICAgICBpZiAobmVnYXRlKSBuYW1lID0gbmFtZS5zbGljZSgxKTtcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBuYW1lIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBuZWdhdGUgPyBwbGF5ZXIudXNlcm5hbWUgPT09IG5hbWUgOiBwbGF5ZXIudXNlcm5hbWUgIT09IG5hbWVcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciB0YWcgbWF0Y2hlcyB0aGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgY2FzZSBcInRhZ1wiOiB7XG4gICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHRhZyBxdWVyeS5cbiAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB2YWx1ZSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBxdWVyeSBpcyBuZWdhdGVkLlxuICAgICAgICAgICAgICAgICAgY29uc3QgbmVnYXRlID0gdGFnLnN0YXJ0c1dpdGgoXCIhXCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSkgdGFnID0gdGFnLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyB0aGUgdGFnLlxuICAgICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSA/IHBsYXllci5oYXNUYWcodGFnKSA6ICFwbGF5ZXIuaGFzVGFnKHRhZykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgcXVlcnkga2V5IFwiJHtrZXl9XCJgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gbmV3IFRhcmdldEVudW0ocGxheWVycyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYWxsIGVudGl0aWVzLlxuICAgICAgICBjYXNlIFwiZVwiOiB7XG4gICAgICAgICAgLy8gRmlsdGVyIGVudGl0aWVzIGJ5IHF1ZXJ5LlxuICAgICAgICAgIGNvbnN0IGVudGl0aWVzID0gb3JpZ2luLmdldEVudGl0aWVzKCkuZmlsdGVyKChlbnRpdHkpID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcXVlcmllcy5cbiAgICAgICAgICAgIGlmIChxdWVyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgbWF0Y2hlcyB0aGUgcXVlcnkuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsga2V5LCB2YWx1ZSB9IG9mIHF1ZXJpZXMpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IG5hbWUgbWF0Y2hlcyB0aGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgY2FzZSBcIm5hbWVcIjoge1xuICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eS5oYXNUcmFpdChFbnRpdHlOYW1lVGFnVHJhaXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmFtZSBmcm9tIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSB2YWx1ZSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVnYXRlID0gbmFtZS5zdGFydHNXaXRoKFwiIVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSkgbmFtZSA9IG5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuYW1ldGFnIHRyYWl0LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFpdCA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlOYW1lVGFnVHJhaXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBuYW1ldGFnIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgbmVnYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRyYWl0LmdldE5hbWVUYWcoKSA9PT0gbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0cmFpdC5nZXROYW1lVGFnKCkgIT09IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgdHlwZSBtYXRjaGVzIHRoZSBxdWVyeS5cbiAgICAgICAgICAgICAgICBjYXNlIFwidHlwZVwiOiB7XG4gICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHR5cGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHZhbHVlIGFzIHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIG5lZ2F0ZWQuXG4gICAgICAgICAgICAgICAgICBjb25zdCBuZWdhdGUgPSB0eXBlLnN0YXJ0c1dpdGgoXCIhXCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSkgdHlwZSA9IHR5cGUuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBlbnRpdHkgdHlwZS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHR5cGUuaW5jbHVkZXMoXCI6XCIpXG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBgbWluZWNyYWZ0OiR7dmFsdWV9YDtcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSB0eXBlIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBuZWdhdGVcbiAgICAgICAgICAgICAgICAgICAgICA/IGVudGl0eS50eXBlLmlkZW50aWZpZXIgPT09IHBhcnNlZFxuICAgICAgICAgICAgICAgICAgICAgIDogZW50aXR5LnR5cGUuaWRlbnRpZmllciAhPT0gcGFyc2VkXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgdGFnIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGNhc2UgXCJ0YWdcIjoge1xuICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0YWcgcXVlcnkuXG4gICAgICAgICAgICAgICAgICBsZXQgdGFnID0gdmFsdWUgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcXVlcnkgaXMgbmVnYXRlZC5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZ2F0ZSA9IHRhZy5zdGFydHNXaXRoKFwiIVwiKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuZWdhdGUpIHRhZyA9IHRhZy5zbGljZSgxKTtcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgdGhlIHRhZy5cbiAgICAgICAgICAgICAgICAgIGlmIChuZWdhdGUgPyBlbnRpdHkuaGFzVGFnKHRhZykgOiAhZW50aXR5Lmhhc1RhZyh0YWcpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHF1ZXJ5IGtleSBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIG5ldyBUYXJnZXRFbnVtKGVudGl0aWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgbmVhcmVzdCBwbGF5ZXIuXG4gICAgICAgIGNhc2UgXCJwXCI6IHtcbiAgICAgICAgICBpZiAocG9pbnRlci5zdGF0ZS5vcmlnaW4gaW5zdGFuY2VvZiBQbGF5ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFyZ2V0RW51bShbcG9pbnRlci5zdGF0ZS5vcmlnaW5dKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgXCJOZWFyZXN0IHBsYXllciBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYSByYW5kb20gcGxheWVyLlxuICAgICAgICBjYXNlIFwiclwiOiB7XG4gICAgICAgICAgLy8gR2V0IGFsbCBwbGF5ZXJzIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5LlxuICAgICAgICAgIGNvbnN0IHBsYXllcnMgPSBvcmlnaW4uZ2V0UGxheWVycygpLmZpbHRlcigocGxheWVyKSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHF1ZXJpZXMuXG4gICAgICAgICAgICBpZiAocXVlcmllcy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBxdWVyaWVzKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBuYW1lIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgIGNhc2UgXCJuYW1lXCI6IHtcbiAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmFtZSBxdWVyeS5cbiAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdmFsdWUgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcXVlcnkgaXMgbmVnYXRlZC5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5lZ2F0ZSA9IG5hbWUuc3RhcnRzV2l0aChcIiFcIik7XG4gICAgICAgICAgICAgICAgICBpZiAobmVnYXRlKSBuYW1lID0gbmFtZS5zbGljZSgxKTtcblxuICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBuYW1lIG1hdGNoZXMgdGhlIHF1ZXJ5LlxuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBuZWdhdGUgPyBwbGF5ZXIudXNlcm5hbWUgPT09IG5hbWUgOiBwbGF5ZXIudXNlcm5hbWUgIT09IG5hbWVcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSB0YWcgbWF0Y2hlcyB0aGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgY2FzZSBcInRhZ1wiOiB7XG4gICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHRhZyBxdWVyeS5cbiAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB2YWx1ZSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBxdWVyeSBpcyBuZWdhdGVkLlxuICAgICAgICAgICAgICAgICAgY29uc3QgbmVnYXRlID0gdGFnLnN0YXJ0c1dpdGgoXCIhXCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSkgdGFnID0gdGFnLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyB0aGUgdGFnLlxuICAgICAgICAgICAgICAgICAgaWYgKG5lZ2F0ZSA/IHBsYXllci5oYXNUYWcodGFnKSA6ICFwbGF5ZXIuaGFzVGFnKHRhZykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgcXVlcnkga2V5IFwiJHtrZXl9XCJgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBHZXQgYSByYW5kb20gcGxheWVyIGZyb20gdGhlIGxpc3QuXG4gICAgICAgICAgY29uc3QgcGxheWVyID0gcGxheWVyc1tcbiAgICAgICAgICAgIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHBsYXllcnMubGVuZ3RoKVxuICAgICAgICAgIF0gYXMgUGxheWVyO1xuXG4gICAgICAgICAgLy8gUmV0dXJuIHRoZSByYW5kb20gcGxheWVyLlxuICAgICAgICAgIHJldHVybiBuZXcgVGFyZ2V0RW51bShbcGxheWVyXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBwbGF5ZXIuXG4gICAgICAgIGNhc2UgXCJzXCI6IHtcbiAgICAgICAgICBpZiAocG9pbnRlci5zdGF0ZS5vcmlnaW4gaW5zdGFuY2VvZiBFbnRpdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFyZ2V0RW51bShbcG9pbnRlci5zdGF0ZS5vcmlnaW5dKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgXCJTb3VyY2UgcGxheWVyIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0LlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaWx0ZXIgcGxheWVycyBieSB1c2VybmFtZS5cbiAgICAgIGNvbnN0IHBsYXllcnMgPSBvcmlnaW5cbiAgICAgICAgLmdldFBsYXllcnMoKVxuICAgICAgICAuZmlsdGVyKChwbGF5ZXIpID0+IHBsYXllci51c2VybmFtZSA9PT0gdGFyZ2V0KTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciB3YXMgZm91bmQuXG4gICAgICBpZiAocGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQbGF5ZXIgXCIke3RhcmdldH1cIiB3YXMgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGRpbWVuc2lvbi5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiB0aGUgcGxheWVyLlxuICAgICAgcmV0dXJuIG5ldyBUYXJnZXRFbnVtKHBsYXllcnMpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBudWxsIGlmIG5vIHRhcmdldCB3YXMgZm91bmRcbiAgICByZXR1cm4gbmV3IFRhcmdldEVudW0obnVsbCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgVGFyZ2V0RW51bSB9O1xuIiwgImltcG9ydCB7IFZlY3RvcjNmIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB7IENvbW1hbmRBcmd1bWVudFBvaW50ZXIgfSBmcm9tIFwiLi4vLi4vZXhlY3V0aW9uLXN0YXRlXCI7XG5cbmltcG9ydCB7IFZhbGlkRW51bSB9IGZyb20gXCIuXCI7XG5cbmNsYXNzIFBvc2l0aW9uRW51bSBleHRlbmRzIFZhbGlkRW51bSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgbmFtZSA9IFwicG9zaXRpb25cIjtcblxuICAvKipcbiAgICogVGhlIHN5bWJvbCBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgc3ltYm9sID0gKHRoaXMudHlwZSA8PCAxNikgfCAweDQwO1xuXG4gIHB1YmxpYyByZWFkb25seSByZXN1bHQ6IFZlY3RvcjNmIHwgbnVsbDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocmVzdWx0OiBWZWN0b3IzZiB8IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKGVycm9yPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSByZXN1bHQgaXMgYSB2YWxpZCBvcHRpb24uXG4gICAgaWYgKCF0aGlzLnJlc3VsdCAmJiBlcnJvcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlV4cGVjdGVkIGlucHV0IHRvIGJlIGZvcm1hdHRlZCBhcyBhIHBvc2l0aW9uLlwiKTtcblxuICAgIGlmICghdGhpcy5yZXN1bHQpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0KHBvaW50ZXI6IENvbW1hbmRBcmd1bWVudFBvaW50ZXIpOiBQb3NpdGlvbkVudW0gfCBudWxsIHtcbiAgICAvLyBQZWVrIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIHBvaW50ZXIuXG4gICAgY29uc3QgeCA9IHBvaW50ZXIubmV4dCgpIGFzIHN0cmluZztcblxuICAgIC8vIENoZWNrIGlmIHRoZSB4IHZhbHVlIGlzIG51bGwuXG4gICAgaWYgKCF4KSByZXR1cm4gbmV3IFBvc2l0aW9uRW51bShudWxsKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB4IHZhbHVlIGlzIG51bWJlciBvciBzdGFydHMgd2l0aCB+LlxuICAgIC8vIElmIGl0IGlzIG5vdCwgcmV0dXJuIG51bGwuXG4gICAgaWYgKE51bWJlci5pc05hTigreCkgJiYgIXguc3RhcnRzV2l0aChcIn5cIikpIHJldHVybiBuZXcgUG9zaXRpb25FbnVtKG51bGwpO1xuXG4gICAgLy8gUGVlayB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgIGNvbnN0IHkgPSBwb2ludGVyLm5leHQoKSBhcyBzdHJpbmc7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgeSB2YWx1ZSBpcyBudWxsLlxuICAgIGlmICgheSkgcmV0dXJuIG5ldyBQb3NpdGlvbkVudW0obnVsbCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgeSB2YWx1ZSBpcyBudW1iZXIgb3Igc3RhcnRzIHdpdGggfi5cbiAgICAvLyBJZiBpdCBpcyBub3QsIHJldHVybiBudWxsLlxuICAgIGlmIChOdW1iZXIuaXNOYU4oK3kpICYmICF5LnN0YXJ0c1dpdGgoXCJ+XCIpKSByZXR1cm4gbmV3IFBvc2l0aW9uRW51bShudWxsKTtcblxuICAgIC8vIFBlZWsgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgcG9pbnRlci5cbiAgICBjb25zdCB6ID0gcG9pbnRlci5uZXh0KCkgYXMgc3RyaW5nO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHogdmFsdWUgaXMgbnVsbC5cbiAgICBpZiAoIXopIHJldHVybiBuZXcgUG9zaXRpb25FbnVtKG51bGwpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHogdmFsdWUgaXMgbnVtYmVyIG9yIHN0YXJ0cyB3aXRoIH4uXG4gICAgLy8gSWYgaXQgaXMgbm90LCByZXR1cm4gbnVsbC5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKCt6KSAmJiAhei5zdGFydHNXaXRoKFwiflwiKSkgcmV0dXJuIG5ldyBQb3NpdGlvbkVudW0obnVsbCk7XG5cbiAgICAvLyBHZXQgdGhlIHN0ZXBzIGZvciBlYWNoIGRpcmVjdGlvbi5cbiAgICBjb25zdCB4c3RlcHMgPSB4LnN0YXJ0c1dpdGgoXCJ+XCIpID8gK3guc2xpY2UoMSkgOiAwO1xuICAgIGNvbnN0IHlzdGVwcyA9IHkuc3RhcnRzV2l0aChcIn5cIikgPyAreS5zbGljZSgxKSA6IDA7XG4gICAgY29uc3QgenN0ZXBzID0gei5zdGFydHNXaXRoKFwiflwiKSA/ICt6LnNsaWNlKDEpIDogMDtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBvcmlnaW4gaXMgYW4gZW50aXR5IG9yIGEgZGltZW5zaW9uLlxuICAgIGlmIChwb2ludGVyLnN0YXRlLm9yaWdpbiBpbnN0YW5jZW9mIEVudGl0eSkge1xuICAgICAgLy8gR2V0IHRoZSBlbnRpdHkgZnJvbSB0aGUgcG9pbnRlci5cbiAgICAgIGNvbnN0IGVudGl0eSA9IHBvaW50ZXIuc3RhdGUub3JpZ2luO1xuXG4gICAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbnRpdHkgYW5kIGNyZWF0ZSBhIG5ldyBwb3NpdGlvbiB3aXRoIHRoZSBzdGVwcy5cbiAgICAgIGNvbnN0IHsgeDogZXgsIHk6IGV5LCB6OiBleiB9ID0gZW50aXR5LnBvc2l0aW9uO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgcG9zaXRpb24gd2l0aCB0aGUgc3RlcHMuXG4gICAgICBjb25zdCBueCA9IHggPT09IFwiflwiID8gZXggOiB4LnN0YXJ0c1dpdGgoXCJ+XCIpID8gZXggKyB4c3RlcHMgOiAreDtcbiAgICAgIGNvbnN0IG55ID0geSA9PT0gXCJ+XCIgPyBleSA6IHkuc3RhcnRzV2l0aChcIn5cIikgPyBleSArIHlzdGVwcyA6ICt5O1xuICAgICAgY29uc3QgbnogPSB6ID09PSBcIn5cIiA/IGV6IDogei5zdGFydHNXaXRoKFwiflwiKSA/IGV6ICsgenN0ZXBzIDogK3o7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBwb3NpdGlvbi5cbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gbmV3IFZlY3RvcjNmKG54LCBueSwgbnopO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIG5ldyBwb3NpdGlvbiBlbnVtLlxuICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbkVudW0ocG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgcG9zaXRpb24gd2l0aCB0aGUgc3RlcHMuXG4gICAgICBjb25zdCBueCA9IHggPT09IFwiflwiID8gMCA6IHguc3RhcnRzV2l0aChcIn5cIikgPyB4c3RlcHMgOiAreDtcbiAgICAgIGNvbnN0IG55ID0geSA9PT0gXCJ+XCIgPyAwIDogeS5zdGFydHNXaXRoKFwiflwiKSA/IHlzdGVwcyA6ICt5O1xuICAgICAgY29uc3QgbnogPSB6ID09PSBcIn5cIiA/IDAgOiB6LnN0YXJ0c1dpdGgoXCJ+XCIpID8genN0ZXBzIDogK3o7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBwb3NpdGlvbi5cbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gbmV3IFZlY3RvcjNmKG54LCBueSwgbnopO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIG5ldyBwb3NpdGlvbiBlbnVtLlxuICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbkVudW0ocG9zaXRpb24pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQb3NpdGlvbkVudW0gfTtcbiIsICJpbXBvcnQgeyBFbnVtIH0gZnJvbSBcIi4uL2VudW1cIjtcblxuY2xhc3MgU29mdEVudW0gZXh0ZW5kcyBFbnVtIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlID0gMHg0XzEwO1xufVxuXG5leHBvcnQgeyBTb2Z0RW51bSB9O1xuIiwgImltcG9ydCB7IFNvZnRFbnVtIH0gZnJvbSBcIi4vc29mdFwiO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRBcmd1bWVudFBvaW50ZXIgfSBmcm9tIFwiLi4vLi4vZXhlY3V0aW9uLXN0YXRlXCI7XG5cbmNsYXNzIEN1c3RvbUVudW0gZXh0ZW5kcyBTb2Z0RW51bSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgZW51bS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3ltYm9sIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBzeW1ib2wgPSAodGhpcy50eXBlIDw8IDE2KSB8IDB4Mzg7XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb25zIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudW0gaXMgc3RyaWN0IHRvIGl0cyBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdHJpY3Q6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3VsdDogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBleHBlY3RlZCBvcHRpb25zIG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IEFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGVudW0uXG4gICAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdCBvZiB0aGUgZW51bS5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGV4cGVjdGVkIG9wdGlvbnMgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocmVzdWx0OiBzdHJpbmcgfCBudWxsLCBvcHRpb25zOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBpZiB0aGUgcmVzdWx0IGlzIGEgdmFsaWQgb3B0aW9uLlxuICAgKiBAcGFyYW0gZXJyb3IgV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgcmVzdWx0IGlzIG5vdCBhIHZhbGlkIG9wdGlvbi5cbiAgICogQHJldHVybnMgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlc3VsdCBpcyBhIHZhbGlkIG9wdGlvbiwgb3IgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGUoZXJyb3IgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmIChlcnJvciAmJiB0aGlzLnJlc3VsdCA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCBvbmUgb2YgXCIke3RoaXMub3B0aW9ucy5qb2luKFwiLCBcIil9XCIgYWZ0ZXIgcHJldmlvdXMgYXJndW1lbnQuYFxuICAgICAgKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSByZXN1bHQgaXMgbnVsbC5cbiAgICBpZiAodGhpcy5yZXN1bHQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSByZXN1bHQgaXMgYSB2YWxpZCBvcHRpb24uXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuaW5jbHVkZXModGhpcy5yZXN1bHQpICYmIGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgb25lIG9mIFwiJHt0aGlzLm9wdGlvbnMuam9pbihcIiwgXCIpfVwiIGFmdGVyIHByZXZpb3VzIGFyZ3VtZW50LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHdoZXRoZXIgdGhlIHJlc3VsdCBpcyBhIHZhbGlkIG9wdGlvbi5cbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmluY2x1ZGVzKHRoaXMucmVzdWx0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdChwb2ludGVyOiBDb21tYW5kQXJndW1lbnRQb2ludGVyKTogQ3VzdG9tRW51bSB8IG51bGwge1xuICAgIC8vIFBlZWsgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgcG9pbnRlci5cbiAgICBsZXQgcGVlayA9IHBvaW50ZXIucGVlaygpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBlZWsgdmFsdWUgaXMgbnVsbC5cbiAgICBpZiAoIXBlZWspIHJldHVybiBuZXcgdGhpcyhudWxsLCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgLy8gUmVhZCB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyLlxuICAgIHBlZWsgPSBwb2ludGVyLm5leHQoKSBhcyBzdHJpbmc7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgY2FuIGJlIGEgbnVtYmVyIG9yIGEgZmxvYXQuXG4gICAgaWYgKCtwZWVrID49IDAgfHwgK3BlZWsgPD0gMCkgcmV0dXJuIG5ldyB0aGlzKG51bGwsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbi5cbiAgICBpZiAocGVlayA9PT0gXCJ0cnVlXCIgfHwgcGVlayA9PT0gXCJmYWxzZVwiKVxuICAgICAgcmV0dXJuIG5ldyB0aGlzKG51bGwsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGFzIGEgc3RyaW5nXG4gICAgcmV0dXJuIG5ldyB0aGlzKHBlZWssIHRoaXMub3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQ3VzdG9tRW51bSB9O1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiLi9jdXN0b21cIjtcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kQXJndW1lbnRQb2ludGVyIH0gZnJvbSBcIi4uLy4uL2V4ZWN1dGlvbi1zdGF0ZVwiO1xuXG5jbGFzcyBCb29sZWFuRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImJvb2xlYW5cIjtcblxuICAvKipcbiAgICogVGhlIG9wdGlvbnMgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnMgPSBbXCJ0cnVlXCIsIFwiZmFsc2VcIl07XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVudW0gaXMgc3RyaWN0IHRvIGl0cyBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBzdHJpY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBlbnVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3VsdDogYm9vbGVhbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYm9vbGVhbiBlbnVtLlxuICAgKiBAcGFyYW0gcmVzdWx0IFRoZSByZXN1bHQgb2YgdGhlIGVudW0uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocmVzdWx0OiBib29sZWFuIHwgbnVsbCkge1xuICAgIHN1cGVyKHJlc3VsdD8udG9TdHJpbmcoKSA/PyBcImZhbHNlXCIsIEJvb2xlYW5FbnVtLm9wdGlvbnMpO1xuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZW51bSB2YWx1ZSBpcyBhcHBsaWNhYmxlLlxuICAgKiBAcGFyYW0gZXJyb3IgV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgYXBwbGljYWJsZS5cbiAgICogQHJldHVybnMgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudW0gdmFsdWUgaXMgYXBwbGljYWJsZSwgb3IgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGUoZXJyb3I/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBlaXRoZXIgdHJ1ZSBvciBmYWxzZS5cbiAgICBpZiAodGhpcy5yZXN1bHQgPT09IHRydWUgfHwgdGhpcy5yZXN1bHQgPT09IGZhbHNlKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFRocm93IGFuIGVycm9yIGlmIHRoZSByZXN1bHQgaXMgbm90IGEgdmFsaWQgYm9vbGVhbi5cbiAgICBpZiAoZXJyb3IpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBvbmUgb2Y6ICR7Qm9vbGVhbkVudW0ub3B0aW9ucy5qb2luKFwiLCBcIil9YCk7XG5cbiAgICAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIHJlc3VsdCBpcyBub3QgYSB2YWxpZCBib29sZWFuLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdChwb2ludGVyOiBDb21tYW5kQXJndW1lbnRQb2ludGVyKTogQm9vbGVhbkVudW0gfCBudWxsIHtcbiAgICAvLyBQZWVrIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIHBvaW50ZXIuXG4gICAgbGV0IHBlZWsgPSBwb2ludGVyLnBlZWsoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwZWVrIHZhbHVlIGlzIG51bGwuXG4gICAgaWYgKCFwZWVrKSByZXR1cm4gbmV3IEJvb2xlYW5FbnVtKG51bGwpO1xuXG4gICAgLy8gUmVhZCB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBwb2ludGVyXG4gICAgcGVlayA9IHBvaW50ZXIubmV4dCgpIGFzIHN0cmluZztcblxuICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLlxuICAgIGlmIChwZWVrID09PSBcInRydWVcIilcbiAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgYXMgYSBib29sZWFuLlxuICAgICAgcmV0dXJuIG5ldyBCb29sZWFuRW51bSh0cnVlKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuLlxuICAgIGlmIChwZWVrID09PSBcImZhbHNlXCIpXG4gICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGFzIGEgYm9vbGVhbi5cbiAgICAgIHJldHVybiBuZXcgQm9vbGVhbkVudW0oZmFsc2UpO1xuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBhIGJvb2xlYW4uXG4gICAgcmV0dXJuIG5ldyBCb29sZWFuRW51bShudWxsKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCb29sZWFuRW51bSB9O1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiLi9jdXN0b21cIjtcblxuY2xhc3MgR2FtZW1vZGVFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiZ2FtZW1vZGVcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zID0gW1xuICAgIFwic1wiLFxuICAgIFwiY1wiLFxuICAgIFwiYVwiLFxuICAgIFwic3BcIixcbiAgICBcInN1cnZpdmFsXCIsXG4gICAgXCJjcmVhdGl2ZVwiLFxuICAgIFwiYWR2ZW50dXJlXCIsXG4gICAgXCJzcGVjdGF0b3JcIlxuICBdO1xufVxuXG5leHBvcnQgeyBHYW1lbW9kZUVudW0gfTtcbiIsICJpbXBvcnQgeyBBYmlsaXR5SW5kZXggfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCIuXCI7XG5cbmNvbnN0IGlkZW50aWZpZXJzID0gT2JqZWN0LnZhbHVlcyhBYmlsaXR5SW5kZXgpLmZpbHRlcihcbiAgKGlkKSA9PiB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCJcbikgYXMgQXJyYXk8c3RyaW5nPjtcblxuY2xhc3MgQWJpbGl0eUVudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBuYW1lID0gXCJhYmlsaXR5XCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9ucyA9IGlkZW50aWZpZXJzO1xufVxuXG5leHBvcnQgeyBBYmlsaXR5RW51bSB9O1xuIiwgImltcG9ydCB7IEJsb2NrVHlwZSB9IGZyb20gXCIuLi8uLi8uLi9ibG9ja1wiO1xuXG5pbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIi5cIjtcblxuY29uc3QgaWRlbnRpZmllcnMgPSBCbG9ja1R5cGUuZ2V0QWxsKCkubWFwKChibG9jaykgPT5cbiAgYmxvY2suaWRlbnRpZmllci5zdGFydHNXaXRoKFwibWluZWNyYWZ0OlwiKVxuICAgID8gYmxvY2suaWRlbnRpZmllci5zbGljZSgxMClcbiAgICA6IGJsb2NrLmlkZW50aWZpZXJcbik7XG5cbmNsYXNzIEJsb2NrRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImJsb2Nrc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnMgPSBpZGVudGlmaWVycztcbn1cblxuZXhwb3J0IHsgQmxvY2tFbnVtIH07XG4iLCAiaW1wb3J0IHsgRW50aXR5VHlwZSB9IGZyb20gXCIuLi8uLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCIuXCI7XG5cbmNvbnN0IGlkZW50aWZpZXJzID0gRW50aXR5VHlwZS5nZXRBbGwoKS5tYXAoKGVudGl0eSkgPT5cbiAgZW50aXR5LmlkZW50aWZpZXIuc3RhcnRzV2l0aChcIm1pbmVjcmFmdDpcIilcbiAgICA/IGVudGl0eS5pZGVudGlmaWVyLnNsaWNlKDEwKVxuICAgIDogZW50aXR5LmlkZW50aWZpZXJcbik7XG5cbmNsYXNzIEVudGl0eUVudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJlbnRpdGllc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnMgPSBpZGVudGlmaWVycztcbn1cblxuZXhwb3J0IHsgRW50aXR5RW51bSB9O1xuIiwgImltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSBcIi4uLy4uLy4uL2l0ZW1cIjtcblxuaW1wb3J0IHsgQ3VzdG9tRW51bSB9IGZyb20gXCIuXCI7XG5cbmNvbnN0IGlkZW50aWZpZXJzID0gSXRlbVR5cGUuZ2V0QWxsKCkubWFwKChpdGVtKSA9PlxuICBpdGVtLmlkZW50aWZpZXIuc3RhcnRzV2l0aChcIm1pbmVjcmFmdDpcIilcbiAgICA/IGl0ZW0uaWRlbnRpZmllci5zbGljZSgxMClcbiAgICA6IGl0ZW0uaWRlbnRpZmllclxuKTtcblxuY2xhc3MgSXRlbUVudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJpdGVtc1wiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IG9wdGlvbnMgPSBpZGVudGlmaWVycztcbn1cblxuZXhwb3J0IHsgSXRlbUVudW0gfTtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIi5cIjtcblxuY2xhc3MgVGFnRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInRhZ19vcGVyYXRpb25cIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zID0gW1wiYWRkXCIsIFwicmVtb3ZlXCIsIFwibGlzdFwiXTtcbn1cblxuZXhwb3J0IHsgVGFnRW51bSB9O1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiLlwiO1xuXG5jbGFzcyBXb3JsZEVudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJ3b3JsZHNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmV4cG9ydCB7IFdvcmxkRW51bSB9O1xuIiwgImltcG9ydCB0eXBlIHsgQ29tbWFuZFJlZ2lzdHJ5IH0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB0eXBlIHsgQ29tbWFuZENhbGxiYWNrIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmNsYXNzIENvbW1hbmQ8VCA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RyeSBvZiB0aGUgY29tbWFuZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpc3RyeTogQ29tbWFuZFJlZ2lzdHJ5O1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgb2YgdGhlIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FsbGJhY2s6IENvbW1hbmRDYWxsYmFjazxUPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjb21tYW5kLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZC5cbiAgICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSByZWdpc3RyeSBvZiB0aGUgY29tbWFuZC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBvZiB0aGUgY29tbWFuZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICByZWdpc3RyeTogQ29tbWFuZFJlZ2lzdHJ5LFxuICAgIGNhbGxiYWNrOiBDb21tYW5kQ2FsbGJhY2s8VD5cbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxufVxuXG5leHBvcnQgeyBDb21tYW5kIH07XG4iLCAiaW1wb3J0IHsgQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuL2NvbW1hbmRcIjtcbmltcG9ydCB7IENvbW1hbmRSZWdpc3RyeSB9IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBTb2Z0RW51bSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgQ3VzdG9tRW51bSB9IGZyb20gXCIuL2VudW1zXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmRDYWxsYmFjayxcbiAgQ29tbWFuZENvbnRleHQsXG4gIENvbW1hbmRSZWdpc3RyeUNhbGxiYWNrXG59IGZyb20gXCIuLi90eXBlc1wiO1xuXG5jbGFzcyBDb21tYW5kcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZHMgb2YgdGhlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbW1hbmRzID0gbmV3IE1hcDxzdHJpbmcsIENvbW1hbmQ+KCk7XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSBjb21tYW5kcyBpbiB0aGUgcmVnaXN0cnkuXG4gICAqIEByZXR1cm5zIEFsbCB0aGUgY29tbWFuZHMgaW4gdGhlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIGdldEFsbCgpOiBBcnJheTxDb21tYW5kPiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmNvbW1hbmRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgY29tbWFuZCBieSBpdHMgbmFtZS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21tYW5kIG9yIHVuZGVmaW5lZCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cbiAgICovXG4gIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nKTogQ29tbWFuZCB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG5hbWUgc3RhcnRzIHdpdGggYSBzbGFzaC5cbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBzbGFzaCBmcm9tIHRoZSBuYW1lLlxuICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBuYW1lLlxuICAgIG5hbWUgPSBuYW1lLnNwbGl0KFwiIFwiKVswXSBhcyBzdHJpbmc7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNvbW1hbmQgYnkgdGhlIG5hbWUuXG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZHMuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBjb21tYW5kIGluIHRoZSByZWdpc3RyeS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHRoYXQgd2FzIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXI8SyA9IE5vbk51bGxhYmxlPHVua25vd24+LCBUID0gQ29tbWFuZENvbnRleHQ8Sz4+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIGNhbGxiYWNrOiBDb21tYW5kQ2FsbGJhY2s8VD5cbiAgKTogQ29tbWFuZDxUPjtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IGNvbW1hbmQgaW4gdGhlIHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0gbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSByZWdpc3RyeSBUaGUgcmVnaXN0cnkgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHRoYXQgd2FzIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXI8SyA9IE5vbk51bGxhYmxlPHVua25vd24+LCBUID0gQ29tbWFuZENvbnRleHQ8Sz4+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHJlZ2lzdHJ5OiBDb21tYW5kUmVnaXN0cnlDYWxsYmFjayxcbiAgICBjYWxsYmFjazogQ29tbWFuZENhbGxiYWNrPFQ+XG4gICk6IENvbW1hbmQ8VD47XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIG5ldyBjb21tYW5kIGluIHRoZSByZWdpc3RyeS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSByZWdpc3RyeSBUaGUgcmVnaXN0cnkgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2YgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHRoYXQgd2FzIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXI8SyA9IE5vbk51bGxhYmxlPHVua25vd24+LCBUID0gQ29tbWFuZENvbnRleHQ8Sz4+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHJlZ2lzdHJ5OiBDb21tYW5kUmVnaXN0cnlDYWxsYmFjayB8IENvbW1hbmRDYWxsYmFjazxUPixcbiAgICBjYWxsYmFjaz86IENvbW1hbmRDYWxsYmFjazxUPlxuICApOiBDb21tYW5kPFQ+IHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgcmVnaXN0cnkgaW5zdGFuY2VcbiAgICBjb25zdCByZWdJbnN0YW5jZSA9IG5ldyBDb21tYW5kUmVnaXN0cnkoKTtcblxuICAgIC8vIEdldCB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgYXJndW1lbnRzXG4gICAgY29uc3QgZXhlY0NhbGxiYWNrID0gY2FsbGJhY2sgPz8gKHJlZ2lzdHJ5IGFzIENvbW1hbmRDYWxsYmFjazxUPik7XG5cbiAgICBjb25zdCByZWdDYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgICA/IChyZWdpc3RyeSBhcyBDb21tYW5kUmVnaXN0cnlDYWxsYmFjaylcbiAgICAgIDogKCkgPT4ge307XG5cbiAgICAvLyBFeGVjdXRlIHRoZSByZWdpc3RyeSBjYWxsYmFja1xuICAgIHJlZ0NhbGxiYWNrKHJlZ0luc3RhbmNlKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjb21tYW5kIGluc3RhbmNlXG4gICAgY29uc3QgY29tbWFuZCA9IG5ldyBDb21tYW5kPFQ+KFxuICAgICAgbmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgcmVnSW5zdGFuY2UsXG4gICAgICBleGVjQ2FsbGJhY2tcbiAgICApO1xuXG4gICAgLy8gU2V0IHRoZSBjb21tYW5kIGluIHRoZSBjb21tYW5kcyBtYXBcbiAgICB0aGlzLmNvbW1hbmRzLnNldChuYW1lLCBjb21tYW5kIGFzIENvbW1hbmQ8dW5rbm93bj4pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjb21tYW5kXG4gICAgcmV0dXJuIGNvbW1hbmQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjb21tYW5kIGZyb20gdGhlIHJlZ2lzdHJ5IGJ5IGl0cyBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRvIGJlIHVucmVnaXN0ZXJlZC5cbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqIElmIHRoZSBjb21tYW5kIGRvZXMgbm90IGV4aXN0IGluIHRoZSByZWdpc3RyeSwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXIobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kcy5kZWxldGUobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKCk6IEF2YWlsYWJsZUNvbW1hbmRzUGFja2V0IHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgYXZhaWxhYmxlIGNvbW1hbmRzIHBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBBdmFpbGFibGVDb21tYW5kc1BhY2tldCgpO1xuXG4gICAgLy8gSG9sZHMgYWxsIGN1c3RvbSBlbnVtcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBjb21tYW5kc1xuICAgIHBhY2tldC5keW5hbWljRW51bXMgPSBbXTtcblxuICAgIC8vIE1hcCB0aGUgY29tbWFuZHMgdG8gdGhlIHBhY2tldCBwcm9wZXJ0eVxuICAgIHBhY2tldC5jb21tYW5kcyA9IHRoaXMuZ2V0QWxsKCkubWFwKChjb21tYW5kKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBjb21tYW5kLm5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBjb21tYW5kLmRlc2NyaXB0aW9uLFxuICAgICAgICBwZXJtaXNzaW9uTGV2ZWw6IGNvbW1hbmQucmVnaXN0cnkucGVybWlzc2lvbkxldmVsLFxuICAgICAgICBzdWJjb21tYW5kczogW10sXG4gICAgICAgIGZsYWdzOiBjb21tYW5kLnJlZ2lzdHJ5LmRlYnVnID8gMSA6IDAsXG4gICAgICAgIGFsaWFzOiAtMSxcbiAgICAgICAgb3ZlcmxvYWRzOiBbLi4uY29tbWFuZC5yZWdpc3RyeS5vdmVybG9hZHMua2V5cygpXS5tYXAoKG92ZXJsb2FkKSA9PiB7XG4gICAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBrZXlzIG9mIHRoZSBvdmVybG9hZCBhbmQgZXh0cmFjdCB0aGUgcGFyYW1ldGVycy5cbiAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXMob3ZlcmxvYWQpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJhbWV0ZXIgY29uc3RydWN0b3IgYnkgY2hlY2tpbmcgaWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5LlxuICAgICAgICAgICAgY29uc3QgZW5tID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZVswXSA6IHZhbHVlO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci5cbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbCA9XG4gICAgICAgICAgICAgIGVubS50eXBlID09PSBTb2Z0RW51bS50eXBlXG4gICAgICAgICAgICAgICAgPyAoZW5tIGFzIHR5cGVvZiBDdXN0b21FbnVtKS5vcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gKDB4NF8xMCA8PCAxNikgfFxuICAgICAgICAgICAgICAgICAgICAocGFja2V0LmR5bmFtaWNFbnVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbm0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IChlbm0gYXMgdHlwZW9mIEN1c3RvbUVudW0pLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgfSkgLVxuICAgICAgICAgICAgICAgICAgICAgIDEpXG4gICAgICAgICAgICAgICAgICA6IGVubS5zeW1ib2xcbiAgICAgICAgICAgICAgICA6IGVubS5zeW1ib2w7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuXG4gICAgICAgICAgICBjb25zdCBvcHRpb25hbCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMV0gOiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBxdWVzdGlvbiBtYXJrIHRvIHRoZSBuYW1lIGlmIHRoZSBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuXG4gICAgICAgICAgICBuYW1lID0gb3B0aW9uYWwgPyBuYW1lICsgXCI/XCIgOiBuYW1lO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIG9wdGlvbmFsLFxuICAgICAgICAgICAgICBvcHRpb25zOiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoYWluaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnNcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcmVtYWluaW5nIHByb3BlcnRpZXMgdG8gdGhlIHBhY2tldFxuICAgIHBhY2tldC5jaGFpbmVkU3ViY29tbWFuZFZhbHVlcyA9IFtdO1xuICAgIHBhY2tldC5zdWJjb21tYW5kcyA9IFtdO1xuICAgIHBhY2tldC5lbnVtQ29uc3RyYWludHMgPSBbXTtcbiAgICBwYWNrZXQuZW51bVZhbHVlcyA9IFtdO1xuICAgIHBhY2tldC5lbnVtcyA9IFtdO1xuICAgIHBhY2tldC5wb3N0Rml4ZXMgPSBbXTtcblxuICAgIC8vIFJldHVybiB0aGUgcGFja2V0XG4gICAgcmV0dXJuIHBhY2tldDtcbiAgfVxufVxuXG5leHBvcnQgeyBDb21tYW5kcyB9O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC91bmlmaWVkLXNpZ25hdHVyZXMgKi9cbmltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kQXJndW1lbnRzLFxuICBDb21tYW5kQ2FsbGJhY2ssXG4gIENvbW1hbmRPdmVybG9hZFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY2xhc3MgQ29tbWFuZFJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBvdmVybG9hZHMgb2YgdGhlIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3ZlcmxvYWRzID0gbmV3IE1hcDxDb21tYW5kT3ZlcmxvYWQsIENvbW1hbmRDYWxsYmFjaz4oKTtcblxuICAvKipcbiAgICogVGhlIHdpbGwgbWFrZSB0aGUgY29tbWFuZCBhcHBlYXIgd2l0aCBhIGBkZWJ1Z2AgZmxhZyBpbiB0aGUgYXZhaWxhYmxlIGNvbW1hbmRzIGxpc3QuXG4gICAqL1xuICBwdWJsaWMgZGVidWcgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHBlcm1pc3Npb24gbGV2ZWwgcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZC5cbiAgICovXG4gIHB1YmxpYyBwZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk5vcm1hbDtcblxuICAvKipcbiAgICogT3ZlcmxvYWRzIHRoZSBjb21tYW5kIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBvdmVybG9hZC5cbiAgICovXG4gIHB1YmxpYyBvdmVybG9hZDxUIGV4dGVuZHMgQ29tbWFuZE92ZXJsb2FkPihvcHRpb25zOiBUKTogdGhpcztcblxuICAvKipcbiAgICogT3ZlcmxvYWRzIHRoZSBjb21tYW5kIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMgYW5kIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvZiB0aGUgb3ZlcmxvYWQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2YgdGhlIG92ZXJsb2FkLlxuICAgKi9cbiAgcHVibGljIG92ZXJsb2FkPFQgZXh0ZW5kcyBDb21tYW5kT3ZlcmxvYWQ+KFxuICAgIG9wdGlvbnM6IFQsXG4gICAgY2FsbGJhY2s6IENvbW1hbmRDYWxsYmFjazxDb21tYW5kQXJndW1lbnRzPFQ+PlxuICApOiB0aGlzO1xuXG4gIC8qKlxuICAgKiBPdmVybG9hZHMgdGhlIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucyBhbmQgY2FsbGJhY2suXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBvdmVybG9hZC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBvZiB0aGUgb3ZlcmxvYWRcbiAgICovXG4gIHB1YmxpYyBvdmVybG9hZDxUIGV4dGVuZHMgQ29tbWFuZE92ZXJsb2FkPihcbiAgICBvcHRpb25zOiBULFxuICAgIGNhbGxiYWNrPzogQ29tbWFuZENhbGxiYWNrPENvbW1hbmRBcmd1bWVudHM8VD4+XG4gICk6IHRoaXMge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5vdmVybG9hZHMuc2V0KG9wdGlvbnMsIGNhbGxiYWNrIGFzIENvbW1hbmRDYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3ZlcmxvYWRzLnNldChvcHRpb25zLCAoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSByZWdpc3RyeS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBDb21tYW5kUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyBEaW1lbnNpb24gfSBmcm9tIFwiLi4vd29ybGRcIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgRW51bSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZCB9IGZyb20gXCIuL2NvbW1hbmRcIjtcbmltcG9ydCB0eXBlIHsgQ29tbWFuZENvbnRleHQsIENvbW1hbmRSZXNwb25zZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29tbWFuZEFyZ3VtZW50UG9pbnRlciB7XG4gIC8qKlxuICAgKiBUaGUgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhlIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXJndW1lbnRzOiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdGUgb2YgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlOiBDb21tYW5kRXhlY3V0aW9uU3RhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQgb2YgdGhlIGFyZ3VtZW50cy5cbiAgICovXG4gIHB1YmxpYyBvZmZzZXQgPSAwO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbW1hbmQgYXJndW1lbnQgcG9pbnRlci5cbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSBvZiB0aGUgY29tbWFuZCBleGVjdXRpb24uXG4gICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHN0YXRlOiBDb21tYW5kRXhlY3V0aW9uU3RhdGUsIGFyZ3VtZW50c186IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHNfO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlZWtzIHRoZSBuZXh0IGFyZ3VtZW50LlxuICAgKiBAcmV0dXJucyBUaGUgbmV4dCBhcmd1bWVudCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyBtb3JlIGFyZ3VtZW50cy5cbiAgICovXG4gIHB1YmxpYyBwZWVrKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFyZ3VtZW50c1t0aGlzLm9mZnNldF0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuZXh0IGFyZ3VtZW50LlxuICAgKiBAcmV0dXJucyBUaGUgbmV4dCBhcmd1bWVudCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyBtb3JlIGFyZ3VtZW50cy5cbiAgICovXG4gIHB1YmxpYyBuZXh0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFyZ3VtZW50c1t0aGlzLm9mZnNldCsrXSB8fCBudWxsO1xuICB9XG59XG5cbmNsYXNzIENvbW1hbmRFeGVjdXRpb25TdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgc3BsaXQgYXJndW1lbnRzIG9mIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNwbGl0OiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCB0aGF0IHdhcyBleGVjdXRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kOiBDb21tYW5kIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luIG9mIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBvcmlnaW46IERpbWVuc2lvbiB8IEVudGl0eTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgY29tbWFuZHM6IEFycmF5PENvbW1hbmQ+LFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIG9yaWdpbjogRGltZW5zaW9uIHwgRW50aXR5XG4gICkge1xuICAgIHRoaXMuc3BsaXQgPSB0aGlzLnBhcnNlKHNvdXJjZSk7XG5cbiAgICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgZnJvbSB0aGUgc3BsaXQgYXJyYXkuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuc3BsaXQuc2hpZnQoKTtcblxuICAgIC8vIEZpbmQgdGhlIGNvbW1hbmQgZnJvbSB0aGUgY29tbWFuZHNcbiAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kcy5maW5kKChjb21tYW5kKSA9PiBjb21tYW5kLm5hbWUgPT09IG5hbWUpO1xuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgZXhlY3V0ZSgpOiBDb21tYW5kUmVzcG9uc2Uge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjb21tYW5kIGlzIHVuZGVmaW5lZC5cbiAgICAvLyBJZiBpdCBpcywgd2Ugd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICBpZiAoIXRoaXMuY29tbWFuZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFVua25vd24gY29tbWFuZCBleGVjdXRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgY29tbWFuZCBleGlzdHMsIGFuZCB0aGF0IHlvdSBoYXZlIHBlcm1pc3Npb24gdG8gdXNlIGl0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgZ2xvYmFsIGNvbnRleHQgb2JqZWN0IHdpdGggdGhlIG9yaWdpbi5cbiAgICBjb25zdCBnbG9iYWxDb250ZXh0ID0geyBvcmlnaW46IHRoaXMub3JpZ2luIH0gYXMgQ29tbWFuZENvbnRleHQ8XG4gICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgID47XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIG92ZXJsb2FkcyBhbmQgZXh0cmFjdCB0aGUgYXJndW1lbnRzLlxuICAgIGZvciAoY29uc3QgW292ZXJsb2FkLCBjYWxsYmFja10gb2YgdGhpcy5jb21tYW5kLnJlZ2lzdHJ5Lm92ZXJsb2Fkcykge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNvbnRleHQgb2JqZWN0IHdpdGggdGhlIG9yaWdpbi5cbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IG9yaWdpbjogdGhpcy5vcmlnaW4gfSBhcyBDb21tYW5kQ29udGV4dDxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgRW51bT5cbiAgICAgID47XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdGF0ZSBvYmplY3Qgd2l0aCB0aGUgc3BsaXQgYXJyYXkuXG4gICAgICBjb25zdCBzdGF0ZSA9IG5ldyBDb21tYW5kQXJndW1lbnRQb2ludGVyKHRoaXMsIHRoaXMuc3BsaXQpO1xuXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIG92ZXJsb2FkIGtleXMgYW5kIGV4dHJhY3QgdGhlIGFyZ3VtZW50cy5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG92ZXJsb2FkKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IG92ZXJsb2FkW2tleV07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLCBpZiBpdCBpcyB0aGVuIHdlIHdpbGwgY29udGludWUgdG8gdGhlIG5leHQgb3ZlcmxvYWRcbiAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5LCBpZiBpdCBpcyB0aGVuIHdlIHdpbGwgY2hlY2sgaWYgdGhlIGFyZ3VtZW50IGlzIHJlcXVpcmVkLlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGVudW0gYW5kIG9wdGlvbmFsIGZsYWcgZnJvbSB0aGUgdmFsdWUuXG4gICAgICAgICAgY29uc3QgW3R5cGUsIG9wdGlvbmFsXSA9IHZhbHVlO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFyZ3VtZW50IGlzIG9wdGlvbmFsIGFuZCBpZiB0aGVyZSBhcmUgYW55IGFyZ3VtZW50cyBsZWZ0LlxuICAgICAgICAgIGlmICghb3B0aW9uYWwgJiYgc3RhdGUub2Zmc2V0ID49IHN0YXRlLmFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEFyZ3VtZW50ICR7a2V5fSBpcyByZXF1aXJlZC5gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBhcmd1bWVudCBmcm9tIHRoZSBzcGxpdCBhcnJheS5cbiAgICAgICAgICAvLyBXZSB3aWxsIHBhc3MgdGhlIGV4ZWN1dGlvbiBzdGF0ZSB0byB0aGUgZXh0cmFjdCBtZXRob2QuXG4gICAgICAgICAgLy8gVGhpcyBhbGxvd3MgY3VzdG9tcyBlbnVtcyB0byBleHRyYWN0IHRoZSBhcmd1bWVudCBpbiB2YXJpb3VzIHdheXMuXG4gICAgICAgICAgY29uc3QgdmFsdWVfID0gdHlwZS5leHRyYWN0KHN0YXRlIGFzIENvbW1hbmRBcmd1bWVudFBvaW50ZXIpO1xuXG4gICAgICAgICAgLy8gRGVjbGFyZSBpZiB0aGUgdmFsdWUgaXMgb3B0aW9uYWwuXG4gICAgICAgICAgaWYgKHZhbHVlXykgdmFsdWVfLm9wdGlvbmFsID0gb3B0aW9uYWw7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIHZhbHVlIHRvIHRoZSBjb250ZXh0IG9iamVjdC5cbiAgICAgICAgICBjb250ZXh0W2tleV0gPSB2YWx1ZV8gPz8gdHlwZS5kZWZhdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIGFyZ3VtZW50IGZyb20gdGhlIHNwbGl0IGFycmF5LlxuICAgICAgICAgIC8vIFdlIHdpbGwgcGFzcyB0aGUgZXhlY3V0aW9uIHN0YXRlIHRvIHRoZSBleHRyYWN0IG1ldGhvZC5cbiAgICAgICAgICAvLyBUaGlzIGFsbG93cyBjdXN0b21zIGVudW1zIHRvIGV4dHJhY3QgdGhlIGFyZ3VtZW50IGluIHZhcmlvdXMgd2F5cy5cbiAgICAgICAgICBjb25zdCB2YWx1ZV8gPSB2YWx1ZS5leHRyYWN0KHN0YXRlIGFzIENvbW1hbmRBcmd1bWVudFBvaW50ZXIpO1xuXG4gICAgICAgICAgLy8gRGVjbGFyZSB0aGF0IHRoZSBlbnVtIHZhbHVlIGlzIG5vdCBvcHRpb25hbC5cbiAgICAgICAgICBpZiAodmFsdWVfKSB2YWx1ZV8ub3B0aW9uYWwgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgdmFsdWUgdG8gdGhlIGNvbnRleHQgb2JqZWN0LlxuICAgICAgICAgIGNvbnRleHRba2V5XSA9IHZhbHVlXyA/PyB2YWx1ZS5kZWZhdWx0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgY29udGV4dCBvYmplY3QgdG8gdGhlIGdsb2JhbCBjb250ZXh0IG9iamVjdC5cbiAgICAgIE9iamVjdC5hc3NpZ24oZ2xvYmFsQ29udGV4dCwgY29udGV4dCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgYXJndW1lbnRzIGxlZnQgaW4gdGhlIHNwbGl0IGFycmF5LlxuICAgICAgLy8gSWYgdGhlcmUgYXJlLCB3ZSB3aWxsIGNvbnRpbnVlIHRvIHRoZSBuZXh0IG92ZXJsb2FkLlxuICAgICAgaWYgKHN0YXRlLm9mZnNldCA8IHN0YXRlLmFyZ3VtZW50cy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBDaGVjayB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIGNvbnRleHQgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoZSBvdmVybG9hZCBvYmplY3QuXG4gICAgICAvLyBXZSBuZWVkIHRvIGFkZCAxIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBvcmlnaW4gcHJvcGVydHkuXG4gICAgICBpZiAoT2JqZWN0LmtleXMoY29udGV4dCkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhvdmVybG9hZCkubGVuZ3RoICsgMSlcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY29udGV4dCBvbmplY3QgYW5kIHRyeSB0byB2YWxpZGF0ZSB0aGUgYXJndW1lbnRzLlxuICAgICAgZm9yIChjb25zdCBbXywgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRleHQpKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBFbnVtLlxuICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVudW0pKSBjb250aW51ZTtcblxuICAgICAgICAvLyBHZXQgdGhlIHJlc3VsdCBmcm9tIHRoZSB2YWx1ZS5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUucmVzdWx0O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBvcHRpb25hbCBhbmQgaWYgaXQgaXMgbm90IHZhbGlkLlxuICAgICAgICBpZiAodmFsdWUub3B0aW9uYWwgJiYgKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHVuZGVmaW5lZCkpXG4gICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHZhbHVlLlxuICAgICAgICB2YWx1ZS52YWxpZGF0ZSh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSByZXNwb25zZSBmcm9tIHRoZSBjYWxsYmFjay5cbiAgICAgIHJldHVybiBjYWxsYmFjayhjb250ZXh0KSA/PyB7fTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIHRoZSBnbG9iYWwgY2FsbGJhY2sgd2l0aCB0aGUgZ2xvYmFsIGNvbnRleHQgb2JqZWN0LlxuICAgIHJldHVybiB0aGlzLmNvbW1hbmQuY2FsbGJhY2soZ2xvYmFsQ29udGV4dCkgPz8ge307XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2Uoc291cmNlOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgcmVnZXggb2JqZWN0IHRvIG1hdGNoXG4gICAgY29uc3QgcmVnZXggPSAvXCIoW15cIl0rKVwifChcXFMrKS9nO1xuICAgIGNvbnN0IGFyZ3VtZW50c18gPSBbXTtcblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc291cmNlIHN0cmluZyBhbmQgZXh0cmFjdCB0aGUgYXJndW1lbnRzXG4gICAgbGV0IG1hdGNoID0gbnVsbDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhzb3VyY2UpKSkge1xuICAgICAgYXJndW1lbnRzXy5wdXNoKG1hdGNoWzFdIHx8IG1hdGNoWzJdKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGFyZ3VtZW50cyBhcnJheS5cbiAgICByZXR1cm4gYXJndW1lbnRzXyBhcyBBcnJheTxzdHJpbmc+O1xuICB9XG59XG5cbmV4cG9ydCB7IENvbW1hbmRFeGVjdXRpb25TdGF0ZSB9O1xuIiwgImltcG9ydCB7IEdhbWVtb2RlLCBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEdhbWVtb2RlRW51bSwgVGFyZ2V0RW51bSB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uLy4uL3dvcmxkXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICAvLyBSZWdpc3RlciB0aGUgYWJvdXQgY29tbWFuZFxuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcImdhbWVtb2RlXCIsXG4gICAgXCJTZXRzIGEgcGxheWVyJ3MgZ2FtZW1vZGVcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gb3ZlcmxvYWQgZm9yIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGdhbWVtb2RlOiBHYW1lbW9kZUVudW0sXG4gICAgICAgICAgdGFyZ2V0OiBbVGFyZ2V0RW51bSwgdHJ1ZV1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHRhcmdldHMgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBjb250ZXh0LnRhcmdldC52YWxpZGF0ZSgpXG4gICAgICAgICAgICA/IGNvbnRleHQudGFyZ2V0LnJlc3VsdFxuICAgICAgICAgICAgOiBbY29udGV4dC5vcmlnaW4gaW5zdGFuY2VvZiBQbGF5ZXIgPyBjb250ZXh0Lm9yaWdpbiA6IG51bGxdO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIG5vIHRhcmdldHNcbiAgICAgICAgICBpZiAoIXRhcmdldHMgfHwgdGFyZ2V0cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB0YXJnZXRzIG1hdGNoZWQgdGhlIHNlbGVjdG9yLlwiKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZ2FtZW1vZGUgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IGdhbWVtb2RlID0gY29udGV4dC5nYW1lbW9kZS5yZXN1bHQgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGFuIGFycmF5IHRvIGhvbGQgdGhlIGxvZyBtZXNzYWdlc1xuICAgICAgICAgIGNvbnN0IGxvZ3M6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHNcbiAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBhIHBsYXllclxuICAgICAgICAgICAgaWYgKCF0YXJnZXQgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBQbGF5ZXIpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgc3dpdGNoIChnYW1lbW9kZSkge1xuICAgICAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgICBjYXNlIFwic3Vydml2YWxcIjoge1xuICAgICAgICAgICAgICAgIHRhcmdldC5nYW1lbW9kZSA9IEdhbWVtb2RlLlN1cnZpdmFsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImNyZWF0aXZlXCI6IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuZ2FtZW1vZGUgPSBHYW1lbW9kZS5DcmVhdGl2ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJhZHZlbnR1cmVcIjoge1xuICAgICAgICAgICAgICAgIHRhcmdldC5nYW1lbW9kZSA9IEdhbWVtb2RlLkFkdmVudHVyZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgXCJzcFwiOlxuICAgICAgICAgICAgICBjYXNlIFwic3BlY3RhdG9yXCI6IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuZ2FtZW1vZGUgPSBHYW1lbW9kZS5TcGVjdGF0b3I7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgZ2FtZW1vZGUgc3BlY2lmaWVkIVwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGxvZyBtZXNzYWdlXG4gICAgICAgICAgICBsb2dzLnB1c2goXG4gICAgICAgICAgICAgIGDCp2FTdWNjZXNzZnVsbHkgdXBkYXRlZCDCpzIke3RhcmdldC51c2VybmFtZX0nc8KnYSBnYW1lbW9kZSHCp3JgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJldHVybiB0aGUgc3VjY2VzcyBtZXNzYWdlXG4gICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogbG9ncy5qb2luKFwiXFxuXCIpIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQWJpbGl0eUluZGV4LCBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEJvb2xlYW5FbnVtLCBUYXJnZXRFbnVtLCBBYmlsaXR5RW51bSB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uLy4uL3dvcmxkXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIC8vIFJlZ2lzdGVyIHRoZSBraWxsIGNvbW1hbmRcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJhYmlsaXR5XCIsXG4gICAgXCJVcGRhdGUgYW4gYWJpbGl0eSBmb3IgYSBzcGVjaWZpZWQgcGxheWVyLlwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIC8vIENyZWF0ZSBhbiBvdmVybG9hZCBmb3IgdGhlIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0OiBUYXJnZXRFbnVtLFxuICAgICAgICAgIGFiaWxpdHk6IEFiaWxpdHlFbnVtLFxuICAgICAgICAgIGVuYWJsZWQ6IEJvb2xlYW5FbnVtXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gY29udGV4dC50YXJnZXQucmVzdWx0IGFzIEFycmF5PEVudGl0eT47XG5cbiAgICAgICAgICAvLyBHZXQgYWJpbGl0eSBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBjb250ZXh0LmFiaWxpdHkucmVzdWx0IGFzIHN0cmluZztcbiAgICAgICAgICBjb25zdCBhYmlsaXR5ID0gQWJpbGl0eUluZGV4W2luZGV4IGFzIGtleW9mIHR5cGVvZiBBYmlsaXR5SW5kZXhdO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBlbmFibGVkIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBlbmFibGVkID0gY29udGV4dC5lbmFibGVkLnJlc3VsdCBhcyBib29sZWFuO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHRhcmdldHNcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIGEgcGxheWVyXG4gICAgICAgICAgICBpZiAoIWVudGl0eS5pc1BsYXllcigpKSB7XG4gICAgICAgICAgICAgIC8vIFB1c2ggdGhlIG1lc3NhZ2UgdG8gdGhlIGFycmF5XG4gICAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqc3RW50aXR5IMKnYyR7ZW50aXR5LnVuaXF1ZUlkfcKnNyBpcyBub3QgYSBwbGF5ZXIuYCk7XG5cbiAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgZW50aXR5XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBlbnRpdHlcbiAgICAgICAgICAgIGVudGl0eS5hYmlsaXRpZXMuc2V0KGFiaWxpdHksIGVuYWJsZWQpO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBtZXNzYWdlIHRvIHRoZSBhcnJheVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICBgwqc3VXBkYXRlZCBhYmlsaXR5IMKnYSR7aW5kZXh9wqc3IHRvIMKnYyR7ZW5hYmxlZH3CpzcgZm9yIMKnYyR7ZW50aXR5LnVuaXF1ZUlkfcKnN2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2Uuam9pbihcIlxcblwiKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBJbnRlZ2VyRW51bSwgSXRlbUVudW0sIFRhcmdldEVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eUludmVudG9yeVRyYWl0LCB0eXBlIEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgLy8gUmVnaXN0ZXIgdGhlIGNsZWFyIGNvbW1hbmRcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJjbGVhclwiLFxuICAgIFwiQ2xlYXJzIGl0ZW1zIGZyb20gcGxheWVyIGludmVudG9yeS5cIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gb3ZlcmxvYWQgZm9yIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bSxcbiAgICAgICAgICBpdGVtOiBbSXRlbUVudW0sIHRydWVdLFxuICAgICAgICAgIG1ldGFkYXRhOiBbSW50ZWdlckVudW0sIHRydWVdLFxuICAgICAgICAgIGFtb3VudDogW0ludGVnZXJFbnVtLCB0cnVlXVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGNvbnRleHQudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxFbnRpdHk+O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSByZXN1bHQgb2YgdGhlIGl0ZW0sIGFtb3VudCwgYW5kIG1ldGFkYXRhXG4gICAgICAgICAgY29uc3QgaXRlbVJlc3VsdCA9IGNvbnRleHQuaXRlbT8ucmVzdWx0IGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBpdGVtSWRlbnRpZmllciA9IGl0ZW1SZXN1bHRcbiAgICAgICAgICAgID8gYCR7aXRlbVJlc3VsdC5pbmNsdWRlcyhcIjpcIikgPyBcIlwiIDogXCJtaW5lY3JhZnQ6XCJ9JHtpdGVtUmVzdWx0fWBcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IGl0ZW1NZXRhZGF0YSA9IGNvbnRleHQubWV0YWRhdGE/LnJlc3VsdCA/PyAwO1xuICAgICAgICAgIGNvbnN0IGl0ZW1BbW91bnQgPSBjb250ZXh0LmFtb3VudD8ucmVzdWx0O1xuICAgICAgICAgIGxldCBpdGVtQ291bnQgPSAwO1xuXG4gICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBcIk5vIHRhcmdldHMgbWF0Y2hlZCBzZWxlY3RvclwiIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQuaGFzVHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSB0YXJnZXQuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgICAgICAgICBpZiAoIWl0ZW1SZXN1bHQpIHtcbiAgICAgICAgICAgICAgY29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtzbG90LCBpdGVtU3RhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRhaW5lci5zdG9yYWdlKSkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWl0ZW1TdGFjayB8fFxuICAgICAgICAgICAgICAgIChpdGVtU3RhY2sudHlwZS5pZGVudGlmaWVyICE9PSBpdGVtSWRlbnRpZmllciAmJlxuICAgICAgICAgICAgICAgICAgaXRlbVN0YWNrLmF1eGlsbGFyeSAhPT0gaXRlbU1ldGFkYXRhKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHN0YWNrQW1vdW50ID0gaXRlbVN0YWNrLmFtb3VudDtcbiAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gc3RhY2tBbW91bnQgLSAoaXRlbUFtb3VudCA/PyAxKTtcblxuICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5jbGVhclNsb3QoTnVtYmVyLnBhcnNlSW50KHNsb3QpKTtcbiAgICAgICAgICAgICAgICBpdGVtQ291bnQgKz0gc3RhY2tBbW91bnQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbVN0YWNrLnNldEFtb3VudChNYXRoLm1heChyZW1haW5pbmcsIDApKTtcbiAgICAgICAgICAgICAgICBpdGVtQ291bnQgKz0gTWF0aC5taW4oaXRlbUFtb3VudCA/PyAxLCBzdGFja0Ftb3VudCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoaXRlbUNvdW50ID49IChpdGVtQW1vdW50ID8/IDEpKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYENsZWFyZWQgdGhlIGludmVudG9yeSBvZiAke3RhcmdldHMubGVuZ3RofSBlbnRpdGllc2BcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwsIHR5cGUgVmVjdG9yM2YgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQmxvY2tFbnVtLCBQb3NpdGlvbkVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB7IEJsb2NrSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uLy4uL3dvcmxkXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcImZpbGxcIixcbiAgICBcIkZpbGwgYSByZWdpb24gd2l0aCBhIHNwZWNpZmljIGJsb2NrXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiBQb3NpdGlvbkVudW0sXG4gICAgICAgICAgdG86IFBvc2l0aW9uRW51bSxcbiAgICAgICAgICBibG9jazogQmxvY2tFbnVtXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSByZXN1bHQgb2YgdGhlIGJsb2NrLCBwb3NpdGlvbiwgYW5kIG1vZGVcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmJsb2NrLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHJlc3VsdC5pbmNsdWRlcyhcIjpcIilcbiAgICAgICAgICAgID8gcmVzdWx0XG4gICAgICAgICAgICA6IGBtaW5lY3JhZnQ6JHtyZXN1bHR9YDtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZnJvbSBwb3NpdGlvbiBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgZnJvbSA9IGNvbnRleHQuZnJvbS5yZXN1bHQ/LmZsb29yKCkgYXMgVmVjdG9yM2Y7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHRvIHBvc2l0aW9uIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0byA9IGNvbnRleHQudG8ucmVzdWx0Py5mbG9vcigpIGFzIFZlY3RvcjNmO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gYmFzZWQgb24gdGhlIG9yaWdpblxuICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbiA9XG4gICAgICAgICAgICBjb250ZXh0Lm9yaWdpbiBpbnN0YW5jZW9mIEVudGl0eVxuICAgICAgICAgICAgICA/IGNvbnRleHQub3JpZ2luLmRpbWVuc2lvblxuICAgICAgICAgICAgICA6IGNvbnRleHQub3JpZ2luO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBibG9jayB0eXBlIGZyb20gdGhlIGlkZW50aWZpZXJcbiAgICAgICAgICBjb25zdCB0eXBlID0gd29ybGQuYmxvY2tQYWxldHRlLnJlc29sdmVUeXBlKFxuICAgICAgICAgICAgaWRlbnRpZmllciBhcyBCbG9ja0lkZW50aWZpZXJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gRmlsbCB0aGUgcmVnaW9uIHdpdGggdGhlIHNwZWNpZmllZCBibG9ja1xuICAgICAgICAgIGRpbWVuc2lvbi5maWxsKGZyb20sIHRvLCB0eXBlLmdldFBlcm11dGF0aW9uKCkpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgSW50ZWdlckVudW0sIEl0ZW1FbnVtLCBUYXJnZXRFbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHlJbnZlbnRvcnlUcmFpdCwgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vLi4vaXRlbVwiO1xuaW1wb3J0IHsgSXRlbUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgLy8gUmVnaXN0ZXIgdGhlIHNldGJsb2NrIGNvbW1hbmRcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJnaXZlXCIsXG4gICAgXCJHaXZlcyBhbiBpdGVtIHRvIGEgcGxheWVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXQ6IFRhcmdldEVudW0sXG4gICAgICAgICAgaXRlbTogSXRlbUVudW0sXG4gICAgICAgICAgYW1vdW50OiBbSW50ZWdlckVudW0sIHRydWVdLFxuICAgICAgICAgIG1ldGFkYXRhOiBbSW50ZWdlckVudW0sIHRydWVdXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gY29udGV4dC50YXJnZXQucmVzdWx0IGFzIEFycmF5PEVudGl0eT47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgaXRlbSwgYW1vdW50LCBhbmQgbWV0YWRhdGFcbiAgICAgICAgICBjb25zdCBpdGVtUmVzdWx0ID0gY29udGV4dC5pdGVtLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAgICAgY29uc3QgaXRlbUlkZW50aWZpZXIgPSBpdGVtUmVzdWx0LmluY2x1ZGVzKFwiOlwiKVxuICAgICAgICAgICAgPyBpdGVtUmVzdWx0XG4gICAgICAgICAgICA6IGBtaW5lY3JhZnQ6JHtpdGVtUmVzdWx0fWA7XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gY29udGV4dC5hbW91bnQ/LnJlc3VsdCA/PyAxO1xuICAgICAgICAgIGNvbnN0IGF1eGlsbGFyeSA9IGNvbnRleHQubWV0YWRhdGE/LnJlc3VsdCA/PyAwO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB0YXJnZXRzXG4gICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBpcyBhbiBlbnRpdHlcbiAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzUGxheWVyKCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGl0ZW0gc3RhY2tcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1TdGFjayA9IG5ldyBJdGVtU3RhY2soaXRlbUlkZW50aWZpZXIgYXMgSXRlbUlkZW50aWZpZXIsIHtcbiAgICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgICBhdXhpbGxhcnksXG4gICAgICAgICAgICAgIHdvcmxkOiB0YXJnZXQuZ2V0V29ybGQoKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgaW52ZW50b3J5XG4gICAgICAgICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gdGFyZ2V0LmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBpdGVtIHRvIHRoZSBwbGF5ZXIncyBpbnZlbnRvcnlcbiAgICAgICAgICAgIGNvbnRhaW5lci5hZGRJdGVtKGl0ZW1TdGFjayk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgc3VjY2VzcyBtZXNzYWdlXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBTdWNjZXNzZnVsbHkgZ2F2ZSB4JHthbW91bnR9ICR7aXRlbUlkZW50aWZpZXJ9IHRvICR7dGFyZ2V0cy5sZW5ndGh9IHBsYXllcnMuYFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgRGlzY29ubmVjdFJlYXNvbiwgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBTdHJpbmdFbnVtLCBUYXJnZXRFbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJraWNrXCIsXG4gICAgXCJLaWNrcyBhIHBsYXllciBmcm9tIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gb3ZlcmxvYWQgZm9yIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bSxcbiAgICAgICAgICByZWFzb246IFtTdHJpbmdFbnVtLCB0cnVlXVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGNvbnRleHQudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxFbnRpdHk+O1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBraWNrIHJlYXNvbiBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgcmVhc29uID0gY29udGV4dC5yZWFzb24/LnJlc3VsdCA/PyBcIktpY2tlZCBieSBhbiBvcGVyYXRvci5cIjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBubyB0YXJnZXRzXG4gICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0cyBtYXRjaGVkIHRoZSBzZWxlY3Rvci5cIik7XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSB0YXJnZXRzXG4gICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBpcyBub3QgYSBwbGF5ZXJcbiAgICAgICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIFBsYXllcikpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBLaWNrIHRoZSBwbGF5ZXJcbiAgICAgICAgICAgIHRhcmdldC5kaXNjb25uZWN0KHJlYXNvbiwgRGlzY29ubmVjdFJlYXNvbi5LaWNrZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHt9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsLCB0eXBlIFZlY3RvcjNmIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEJsb2NrRW51bSwgUG9zaXRpb25FbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBCbG9ja0lkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgLy8gUmVnaXN0ZXIgdGhlIHNldGJsb2NrIGNvbW1hbmRcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJzZXRibG9ja1wiLFxuICAgIFwiU2V0cyBhIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb25cIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gb3ZlcmxvYWQgZm9yIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHBvc2l0aW9uOiBQb3NpdGlvbkVudW0sXG4gICAgICAgICAgYmxvY2s6IEJsb2NrRW51bVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgcmVzdWx0IG9mIHRoZSBibG9jaywgcG9zaXRpb24sIGFuZCBtb2RlXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5ibG9jay5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSByZXN1bHQuaW5jbHVkZXMoXCI6XCIpXG4gICAgICAgICAgICA/IHJlc3VsdFxuICAgICAgICAgICAgOiBgbWluZWNyYWZ0OiR7cmVzdWx0fWA7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGNvbnRleHQucG9zaXRpb24ucmVzdWx0Py5mbG9vcigpIGFzIFZlY3RvcjNmO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gYmFzZWQgb24gdGhlIG9yaWdpblxuICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbiA9XG4gICAgICAgICAgICBjb250ZXh0Lm9yaWdpbiBpbnN0YW5jZW9mIEVudGl0eVxuICAgICAgICAgICAgICA/IGNvbnRleHQub3JpZ2luLmRpbWVuc2lvblxuICAgICAgICAgICAgICA6IGNvbnRleHQub3JpZ2luO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uXG4gICAgICAgICAgY29uc3QgYmxvY2sgPSBkaW1lbnNpb24uZ2V0QmxvY2socG9zaXRpb24pO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBibG9jayB0eXBlIGZyb20gdGhlIGlkZW50aWZpZXJcbiAgICAgICAgICBjb25zdCB0eXBlID0gd29ybGQuYmxvY2tQYWxldHRlLnJlc29sdmVUeXBlKFxuICAgICAgICAgICAgaWRlbnRpZmllciBhcyBCbG9ja0lkZW50aWZpZXJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gU2V0IHRoZSBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uXG4gICAgICAgICAgYmxvY2suc2V0VHlwZSh0eXBlKTtcblxuICAgICAgICAgIC8vIFJldHVybiB0aGUgbWVzc2FnZVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHNldCBibG9jayBhdCDCpzIke3Bvc2l0aW9uLnh9wqdhLCDCpzIke3Bvc2l0aW9uLnl9wqdhLCDCpzIke3Bvc2l0aW9uLnp9wqdhIHRvIMKnMiR7dHlwZS5pZGVudGlmaWVyfcKnYS7Cp3JgXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHt9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFN0cmluZ0VudW0sIFRhZ0VudW0sIFRhcmdldEVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICAvLyBSZWdpc3RlciB0aGUga2lsbCBjb21tYW5kXG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwidGFnXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSB0YWdzIG9mIGEgc3BlY2lmaWVkIGVudGl0eS5cIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gb3ZlcmxvYWQgZm9yIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bSxcbiAgICAgICAgICBvcGVyYXRpb246IFRhZ0VudW0sXG4gICAgICAgICAgdGFnOiBbU3RyaW5nRW51bSwgdHJ1ZV1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHRhcmdldHMgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBjb250ZXh0LnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8RW50aXR5PjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBvcGVyYXRpb24gPSBjb250ZXh0Lm9wZXJhdGlvbi5yZXN1bHQgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHRhcmdldHNcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAvLyBTd2l0Y2ggdGhlIG9wZXJhdGlvblxuICAgICAgICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgY2FzZSBcImFkZFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0YWcgZnJvbSB0aGUgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IGNvbnRleHQudGFnLnJlc3VsdCBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHRhZyB0byB0aGUgZW50aXR5XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBlbnRpdHkuYWRkVGFnKHRhZyk7XG5cbiAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBtZXNzYWdlIHRvIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGlmIChhZGRlZCkge1xuICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgwqc3QWRkZWQgdGFnIMKnYSR7dGFnfcKnNyB0byDCp2Mke2VudGl0eS51bmlxdWVJZH3CpzdgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGDCpzdUYWcgwqdhJHt0YWd9wqc3IGFscmVhZHkgZXhpc3RzIG9uIMKnYyR7ZW50aXR5LnVuaXF1ZUlkfcKnN2BcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0YWcgZnJvbSB0aGUgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IGNvbnRleHQudGFnLnJlc3VsdCBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRhZyBmcm9tIHRoZSBlbnRpdHlcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkID0gZW50aXR5LnJlbW92ZVRhZyh0YWcpO1xuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgbWVzc2FnZSB0byB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgwqc3UmVtb3ZlZCB0YWcgwqdhJHt0YWd9wqc3IGZyb20gwqdjJHtlbnRpdHkudW5pcXVlSWR9wqc3YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBgwqc3VGFnIMKnYSR7dGFnfcKnNyBkb2VzIG5vdCBleGlzdCBvbiDCp2Mke2VudGl0eS51bmlxdWVJZH3CpzdgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FzZSBcImxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdGFncyBvZiB0aGUgZW50aXR5XG4gICAgICAgICAgICAgICAgY29uc3QgdGFncyA9IGVudGl0eS5nZXRUYWdzKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBQdXNoIHRoZSBtZXNzYWdlIHRvIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wdXNoKGDCp2Mke2VudGl0eS51bmlxdWVJZH3CpzcgaGFzIG5vIHRhZ3MuYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYMKnYyR7ZW50aXR5LnVuaXF1ZUlkfcKnNyBoYXMgdGhlIGZvbGxvd2luZyB0YWdzOiDCp2Eke3RhZ3Muam9pbihcbiAgICAgICAgICAgICAgICAgICAgICBcIsKnNywgwqdhXCJcbiAgICAgICAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2Uuam9pbihcIlxcblwiKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCwgdHlwZSBWZWN0b3IzZiB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQb3NpdGlvbkVudW0sIFRhcmdldEVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IERpbWVuc2lvbiwgdHlwZSBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIC8vIFJlZ2lzdGVyIHRoZSBzZXRibG9jayBjb21tYW5kXG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwidHBcIixcbiAgICBcIlRlbGVwb3J0cyBhbiBlbnRpdHkgdG8gYSBzcGVjaWZpZWQgbG9jYXRpb25cIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHBvc2l0aW9uOiBQb3NpdGlvbkVudW1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIG9yaWdpbiBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3Qgb3JpZ2luID0gY29udGV4dC5vcmlnaW47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgb3JpZ2luIGlzIGEgZGltZW5zaW9uXG4gICAgICAgICAgaWYgKG9yaWdpbiBpbnN0YW5jZW9mIERpbWVuc2lvbilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiVGhpcyBjb21tYW5kIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGJ5IGVudGl0aWVzXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGNvbnRleHQucG9zaXRpb24ucmVzdWx0IGFzIFZlY3RvcjNmO1xuXG4gICAgICAgICAgLy8gVGVsZXBvcnQgdGhlIGVudGl0eSB0byB0aGUgbmV3IGxvY2F0aW9uXG4gICAgICAgICAgb3JpZ2luLnRlbGVwb3J0KHBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICB0YXJnZXQ6IFRhcmdldEVudW0sXG4gICAgICAgICAgZGVzdGluYXRpb246IFRhcmdldEVudW1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHRhcmdldHMgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBjb250ZXh0LnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8RW50aXR5PjtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGVzdGluYXRpb24gZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gY29udGV4dC5kZXN0aW5hdGlvbi5yZXN1bHQgYXMgQXJyYXk8RW50aXR5PjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpbWVuc2lvblxuICAgICAgICAgIGlmIChkZXN0aW5hdGlvbi5sZW5ndGggPiAxKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVzdGluYXRpb24gbXVzdCBiZSBhIHNpbmdsZSBlbnRpdHlcIik7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIGZyb20gdGhlIGRlc3RpbmF0aW9uXG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSAoZGVzdGluYXRpb25bMF0gYXMgRW50aXR5KS5wb3NpdGlvbjtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHNcbiAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAvLyBUZWxlcG9ydCB0aGUgZW50aXR5IHRvIHRoZSBuZXcgbG9jYXRpb25cbiAgICAgICAgICAgIHRhcmdldC50ZWxlcG9ydChwb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gb3ZlcmxvYWQgZm9yIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bSxcbiAgICAgICAgICBwb3NpdGlvbjogUG9zaXRpb25FbnVtXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gY29udGV4dC50YXJnZXQucmVzdWx0IGFzIEFycmF5PEVudGl0eT47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGNvbnRleHQucG9zaXRpb24ucmVzdWx0IGFzIFZlY3RvcjNmO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdGFyZ2V0c1xuICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICAgIC8vIFRlbGVwb3J0IHRoZSBlbnRpdHkgdG8gdGhlIG5ldyBsb2NhdGlvblxuICAgICAgICAgICAgdGFyZ2V0LnRlbGVwb3J0KHBvc2l0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICBEYXRhUGFja2V0LFxuICBEaW1lbnNpb25UeXBlLFxuICBTZXRUaW1lUGFja2V0LFxuICBUZXh0UGFja2V0LFxuICBUZXh0UGFja2V0VHlwZVxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCBFbWl0dGVyIGZyb20gXCJAc2VyZW5pdHlqcy9lbWl0dGVyXCI7XG5cbmltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIi4uL3NlcmVuaXR5XCI7XG5pbXBvcnQge1xuICBEaW1lbnNpb25Qcm9wZXJ0aWVzLFxuICBXb3JsZEV2ZW50U2lnbmFscyxcbiAgV29ybGRQcm9wZXJ0aWVzXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlQYWxldHRlLCBQbGF5ZXIgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtUGFsZXR0ZSB9IGZyb20gXCIuLi9pdGVtXCI7XG5pbXBvcnQgeyBCbG9ja1BhbGV0dGUgfSBmcm9tIFwiLi4vYmxvY2tcIjtcbmltcG9ydCB7IEFkbWluQ29tbWFuZHMsIENvbW1hbmRzLCBDb21tb25Db21tYW5kcyB9IGZyb20gXCIuLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgV29ybGRUaWNrU2lnbmFsIH0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuaW1wb3J0IHsgRWZmZWN0UGFsbGV0ZSB9IGZyb20gXCIuLi9lZmZlY3RcIjtcblxuaW1wb3J0IHsgV29ybGRQcm92aWRlciB9IGZyb20gXCIuL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBEZWZhdWx0RGltZW5zaW9uUHJvcGVydGllcywgRGltZW5zaW9uIH0gZnJvbSBcIi4vZGltZW5zaW9uXCI7XG5pbXBvcnQgeyBUaWNrU2NoZWR1bGUgfSBmcm9tIFwiLi9zY2hlZHVsZVwiO1xuaW1wb3J0IHsgU2NvcmVib2FyZCB9IGZyb20gXCIuL3Njb3JlYm9hcmRcIjtcblxuY29uc3QgRGVmYXVsdFdvcmxkUHJvcGVydGllczogV29ybGRQcm9wZXJ0aWVzID0ge1xuICBpZGVudGlmaWVyOiBcImRlZmF1bHRcIixcbiAgc2VlZDogTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMiAqKiAzMiksXG4gIHNhdmVJbnRlcnZhbDogNSxcbiAgZGltZW5zaW9uczogW1xuICAgIHtcbiAgICAgIGlkZW50aWZpZXI6IFwib3ZlcndvcmxkXCIsXG4gICAgICB0eXBlOiBEaW1lbnNpb25UeXBlLk92ZXJ3b3JsZCxcbiAgICAgIGdlbmVyYXRvcjogXCJzdXBlcmZsYXRcIixcbiAgICAgIHZpZXdEaXN0YW5jZTogMjAsXG4gICAgICBzaW11bGF0aW9uRGlzdGFuY2U6IDEwLFxuICAgICAgc3Bhd25Qb3NpdGlvbjogWzAsIDMyNzY3LCAwXVxuICAgIH1cbiAgXVxufTtcblxuY2xhc3MgV29ybGQgZXh0ZW5kcyBFbWl0dGVyPFdvcmxkRXZlbnRTaWduYWxzPiB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2UgdGhhdCB0aGUgd29ybGQgYmVsb25ncyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9wZXJ0aWVzOiBXb3JsZFByb3BlcnRpZXMgPSBEZWZhdWx0V29ybGRQcm9wZXJ0aWVzO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvdmlkZXIgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3ZpZGVyOiBXb3JsZFByb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9ucyBvZiB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGltZW5zaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBEaW1lbnNpb24+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHBhbGV0dGUgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eVBhbGV0dGUgPSBuZXcgRW50aXR5UGFsZXR0ZSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgZWZmZWN0IHBhbGV0dGUgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVmZmVjdFBhbGV0dGUgPSBuZXcgRWZmZWN0UGFsbGV0ZSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgcGFsZXR0ZSBvZiB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tQYWxldHRlID0gbmV3IEJsb2NrUGFsZXR0ZSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgaXRlbSBwYWxldHRlIG9mIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpdGVtUGFsZXR0ZSA9IG5ldyBJdGVtUGFsZXR0ZSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZHMgb2YgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbW1hbmRzID0gbmV3IENvbW1hbmRzKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwZW5kaW5nIHNjaGVkdWxlcyBvZiB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2NoZWR1bGVzID0gbmV3IFNldDxUaWNrU2NoZWR1bGU+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBzY29yZWJvYXJkIGZvciB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2NvcmVib2FyZCA9IG5ldyBTY29yZWJvYXJkKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB0aWNrIG9mIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyBjdXJyZW50VGljayA9IDBuO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB0aW1lIG9mIGRheSBmb3IgdGhlIHdvcmxkLlxuICAgKi9cbiAgcHVibGljIGRheVRpbWUgPSAwO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvdmlkZXI6IFdvcmxkUHJvdmlkZXIsXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8V29ybGRQcm9wZXJ0aWVzPlxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gQXNzaWduIHRoZSBzZXJlbml0eSBhbmQgcHJvdmlkZXIgdG8gdGhlIHdvcmxkXG4gICAgdGhpcy5zZXJlbml0eSA9IHNlcmVuaXR5O1xuICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjtcblxuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllcyB0byB0aGUgd29ybGQgd2l0aCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi5EZWZhdWx0V29ybGRQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICAvLyBBc3NpZ24gdGhlIGlkZW50aWZpZXIgdG8gdGhlIHdvcmxkXG4gICAgdGhpcy5pZGVudGlmaWVyID0gdGhpcy5wcm9wZXJ0aWVzLmlkZW50aWZpZXI7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgbG9nZ2VyIGZvciB0aGUgd29ybGRcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcy5pZGVudGlmaWVyLCBMb2dnZXJDb2xvcnMuR3JlZW5CcmlnaHQpO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGFkbWluIGNvbW1hbmRzXG4gICAgZm9yIChjb25zdCBjb21tYW5kIG9mIFsuLi5BZG1pbkNvbW1hbmRzLCAuLi5Db21tb25Db21tYW5kc10pIGNvbW1hbmQodGhpcyk7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgZGltZW5zaW9ucyBmcm9tIHRoZSBwcm9wZXJ0aWVzXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLnByb3BlcnRpZXMuZGltZW5zaW9ucykgdGhpcy5jcmVhdGVEaW1lbnNpb24oZW50cnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpY2tzIHRoZSB3b3JsZCB3aXRoIGEgZ2l2ZW4gZGVsdGEgdGljay5cbiAgICogQHBhcmFtIGRlbHRhVGljayBUaGUgZGVsdGEgdGljayB0byB0aWNrIHRoZSB3b3JsZCB3aXRoLlxuICAgKi9cbiAgcHVibGljIG9uVGljayhkZWx0YVRpY2s6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFJldHVybiBpZiB0aGVyZSBhcmUgbm8gcGxheWVycyBpbiB0aGUgd29ybGRcbiAgICBpZiAodGhpcy5nZXRQbGF5ZXJzKCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgV29ybGRUaWNrU2lnbmFsXG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IFdvcmxkVGlja1NpZ25hbChcbiAgICAgIHRoaXMuY3VycmVudFRpY2ssXG4gICAgICBCaWdJbnQoZGVsdGFUaWNrKSxcbiAgICAgIHRoaXNcbiAgICApLmVtaXQoKTtcblxuICAgIC8vIFJldHVybiBpZiB0aGUgc2lnbmFsIHdhcyBub3QgZW1pdHRlZFxuICAgIGlmICghc2lnbmFsKSByZXR1cm47XG5cbiAgICAvLyBJbmNyZW1lbnQgdGhlIGN1cnJlbnQgdGlja1xuICAgICsrdGhpcy5jdXJyZW50VGljaztcblxuICAgIC8vIEluY3JlbWVudCB0aGUgZGF5IHRpbWU7IGRheSB0aW1lIGlzIDI0MDAwIHRpY2tzIGxvbmdcbiAgICB0aGlzLmRheVRpbWUgPSAodGhpcy5kYXlUaW1lICsgMSkgJSAyNF8wMDA7XG5cbiAgICAvLyBBdHRlbXB0IHRvIHRpY2sgZWFjaCBkaW1lbnNpb25cbiAgICBmb3IgKGNvbnN0IGRpbWVuc2lvbiBvZiB0aGlzLmRpbWVuc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRpY2sgdGhlIGRpbWVuc2lvbiB3aXRoIHRoZSBkZWx0YSB0aWNrXG4gICAgICAgIGRpbWVuc2lvbi5vblRpY2soZGVsdGFUaWNrKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhhdCB0aGUgZGltZW5zaW9uIGZhaWxlZCB0byB0aWNrXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gdGljayBkaW1lbnNpb24gJHtkaW1lbnNpb24uaWRlbnRpZmllcn1gLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHRpY2sgaXMgZGl2aXNpYmxlIGJ5IDUwMCAoMjUgc2Vjb25kcylcbiAgICAvLyBXaGVuIHdhbnQgdG8gc3luYyB0aGUgZGF5VGltZSB3aXRoIHRoZSBjbGllbnQsIGFzIHN0cmVzcyBjb3VsZCBjYXVzZSBkZS1zeW5jXG4gICAgaWYgKHRoaXMuY3VycmVudFRpY2sgJSA1MDBuID09PSAwbikge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IFNldFRpbWVQYWNrZXRcbiAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBTZXRUaW1lUGFja2V0KCk7XG4gICAgICBwYWNrZXQudGltZSA9IHRoaXMuZGF5VGltZTtcblxuICAgICAgLy8gQnJvYWRjYXN0IHRoZSB0aW1lIHBhY2tldCB0byBhbGwgcGxheWVyc1xuICAgICAgdGhpcy5icm9hZGNhc3QocGFja2V0KTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHNjaGVkdWxlcyB0byBleGVjdXRlXG4gICAgaWYgKHRoaXMuc2NoZWR1bGVzLnNpemUgPiAwKSB7XG4gICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHNjaGVkdWxlc1xuICAgICAgZm9yIChjb25zdCBzY2hlZHVsZSBvZiB0aGlzLnNjaGVkdWxlcykge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2NoZWR1bGUgaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFRpY2sgPj0gc2NoZWR1bGUuY29tcGxldGVUaWNrKSB7XG4gICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgc2NoZWR1bGVcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2NoZWR1bGUuZXhlY3V0ZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgc2NoZWR1bGUgZmFpbGVkIHRvIGV4ZWN1dGVcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgc2NoZWR1bGUgZm9yIGRpbWVuc2lvbiBhdCB0aWNrICR7c2NoZWR1bGUuY29tcGxldGVUaWNrfWAsXG4gICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHNjaGVkdWxlXG4gICAgICAgICAgdGhpcy5zY2hlZHVsZXMuZGVsZXRlKHNjaGVkdWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHRpY2sgaXMgZGl2aXNpYmxlIGJ5IHRoZSBzYXZlIGludGVydmFsIChpbiBtaW51dGVzKVxuICAgIGlmIChcbiAgICAgIHRoaXMuY3VycmVudFRpY2sgJSAoQmlnSW50KHRoaXMucHJvcGVydGllcy5zYXZlSW50ZXJ2YWwpICogMTIwMG4pID09PVxuICAgICAgMG5cbiAgICApIHtcbiAgICAgIC8vIFNhdmUgdGhlIHdvcmxkIHZpYSB0aGUgcHJvdmlkZXJcbiAgICAgIHRoaXMucHJvdmlkZXIub25TYXZlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZGltZW5zaW9uIHdpdGggdGhlIHNwZWNpZmllZCBnZW5lcmF0b3IgYW5kIHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBnZW5lcmF0b3IgVGhlIGdlbmVyYXRvciB0byB1c2UgZm9yIHRoZSBkaW1lbnNpb25cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gdXNlIGZvciB0aGUgZGltZW5zaW9uXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGRpbWVuc2lvbiwgaWYgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlLCBmYWxzZVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZURpbWVuc2lvbihcbiAgICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPERpbWVuc2lvblByb3BlcnRpZXM+XG4gICk6IERpbWVuc2lvbiB8IGZhbHNlIHtcbiAgICAvLyBDcmVhdGUgdGhlIGRpbWVuc2lvbiBwcm9wZXJ0aWVzXG4gICAgY29uc3QgZGltZW5zaW9uUHJvcGVydGllcyA9IHtcbiAgICAgIC4uLkRlZmF1bHREaW1lbnNpb25Qcm9wZXJ0aWVzLFxuICAgICAgLi4ucHJvcGVydGllc1xuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGltZW5zaW9uIGFscmVhZHkgZXhpc3RzXG4gICAgaWYgKHRoaXMuZGltZW5zaW9ucy5oYXMoZGltZW5zaW9uUHJvcGVydGllcy5pZGVudGlmaWVyKSkge1xuICAgICAgLy8gTG9nIHRoYXQgdGhlIGRpbWVuc2lvbiBhbHJlYWR5IGV4aXN0c1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIGRpbWVuc2lvbiB3aXRoIGlkZW50aWZpZXIgJHtkaW1lbnNpb25Qcm9wZXJ0aWVzLmlkZW50aWZpZXJ9IGFzIGl0IGFscmVhZHkgZXhpc3RzYFxuICAgICAgKTtcblxuICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZSBkaW1lbnNpb24gYWxyZWFkeSBleGlzdHNcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgZGltZW5zaW9uXG4gICAgY29uc3QgZGltZW5zaW9uID0gbmV3IERpbWVuc2lvbih0aGlzLCBkaW1lbnNpb25Qcm9wZXJ0aWVzKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBkaW1lbnNpb25cbiAgICB0aGlzLmRpbWVuc2lvbnMuc2V0KGRpbWVuc2lvbi5pZGVudGlmaWVyLCBkaW1lbnNpb24pO1xuXG4gICAgLy8gTG9nIHRoYXQgdGhlIGRpbWVuc2lvbiBoYXMgYmVlbiBjcmVhdGVkXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0ZWQgZGltZW5zaW9uOiAke2RpbWVuc2lvbi5pZGVudGlmaWVyfWApO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjcmVhdGVkIGRpbWVuc2lvblxuICAgIHJldHVybiBkaW1lbnNpb247XG4gIH1cblxuICAvKipcbiAgICogQnJvYWRjYXN0cyBhIG1lc3NhZ2UgdG8gYWxsIHBsYXllcnMgaW4gdGhlIHdvcmxkLlxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBicm9hZGNhc3QuXG4gICAqL1xuICBwdWJsaWMgc2VuZE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ29uc3RydWN0IHRoZSB0ZXh0IHBhY2tldC5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgVGV4dFBhY2tldCgpO1xuXG4gICAgLy8gQXNzaWduIHRoZSBwYWNrZXQgZGF0YS5cbiAgICBwYWNrZXQudHlwZSA9IFRleHRQYWNrZXRUeXBlLlJhdztcbiAgICBwYWNrZXQubmVlZHNUcmFuc2xhdGlvbiA9IGZhbHNlO1xuICAgIHBhY2tldC5zb3VyY2UgPSBudWxsO1xuICAgIHBhY2tldC5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICBwYWNrZXQucGFyYW1ldGVycyA9IG51bGw7XG4gICAgcGFja2V0Lnh1aWQgPSBcIlwiO1xuICAgIHBhY2tldC5wbGF0Zm9ybUNoYXRJZCA9IFwiXCI7XG4gICAgcGFja2V0LmZpbHRlcmVkID0gbWVzc2FnZTtcblxuICAgIHRoaXMuYnJvYWRjYXN0KHBhY2tldCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGRpbWVuc2lvbiBmb3IgdGhlIHdvcmxkXG4gICAqL1xuICBwdWJsaWMgZ2V0RGltZW5zaW9uKCk6IERpbWVuc2lvbjtcblxuICAvKipcbiAgICogR2V0IGEgZGltZW5zaW9uIGJ5IHRoZSBpZGVudGlmaWVyIGZyb20gdGhlIHdvcmxkXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkaW1lbnNpb25cbiAgICogQHJldHVybnMgVGhlIGRpbWVuc2lvbiwgaWYgZm91bmQ7IG90aGVyd2lzZSwgdW5kZWZpbmVkXG4gICAqL1xuICBwdWJsaWMgZ2V0RGltZW5zaW9uKGlkZW50aWZpZXI6IHN0cmluZyk6IERpbWVuc2lvbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogR2V0IGEgZGltZW5zaW9uIGJ5IHRoZSBpZGVudGlmaWVyIGZyb20gdGhlIHdvcmxkXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkaW1lbnNpb25cbiAgICogQHJldHVybnMgVGhlIGRpbWVuc2lvbiwgaWYgZm91bmQ7IG90aGVyd2lzZSwgdW5kZWZpbmVkXG4gICAqL1xuICBwdWJsaWMgZ2V0RGltZW5zaW9uKGlkZW50aWZpZXI/OiBzdHJpbmcpOiBEaW1lbnNpb24gfCB1bmRlZmluZWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBpZGVudGlmaWVyIGlzIHVuZGVmaW5lZFxuICAgIGlmIChpZGVudGlmaWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEdldCB0aGUgZmlyc3QgZGltZW5zaW9uXG4gICAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25zLnZhbHVlcygpLm5leHQoKS52YWx1ZSBhcyBEaW1lbnNpb247XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gYnkgdGhlIGlkZW50aWZpZXJcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25zLmdldChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBkaW1lbnNpb25zIGluIHRoZSB3b3JsZFxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBkaW1lbnNpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0RGltZW5zaW9ucygpOiBBcnJheTxEaW1lbnNpb24+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZGltZW5zaW9ucy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgdGhlIHBsYXllcnMgaW4gdGhlIHdvcmxkLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBwbGF5ZXJzLlxuICAgKi9cbiAgcHVibGljIGdldFBsYXllcnMoKTogQXJyYXk8UGxheWVyPiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmRpbWVuc2lvbnMudmFsdWVzKCldLmZsYXRNYXAoKGRpbWVuc2lvbikgPT5cbiAgICAgIGRpbWVuc2lvbi5nZXRQbGF5ZXJzKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSBlbnRpdGllcyBpbiB0aGUgd29ybGQuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVudGl0aWVzLlxuICAgKi9cbiAgcHVibGljIGdldEVudGl0aWVzKCk6IEFycmF5PEVudGl0eT4ge1xuICAgIHJldHVybiBbLi4udGhpcy5kaW1lbnNpb25zLnZhbHVlcygpXS5mbGF0TWFwKChkaW1lbnNpb24pID0+XG4gICAgICBkaW1lbnNpb24uZ2V0RW50aXRpZXMoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGUgYW4gZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24gYWZ0ZXIgYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpY2tzLlxuICAgKiBAcGFyYW0gdGlja3MgVGhlIGFtb3VudCBvZiB0aWNrcyB0byB3YWl0IGJlZm9yZSB0aGUgc2NoZWR1bGUgaXMgY29tcGxldGUuXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHRpY2sgc2NoZWR1bGUuXG4gICAqL1xuICBwdWJsaWMgc2NoZWR1bGUodGlja3M6IG51bWJlcik6IFRpY2tTY2hlZHVsZSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHRpY2sgc2NoZWR1bGVcbiAgICBjb25zdCBzY2hlZHVsZSA9IG5ldyBUaWNrU2NoZWR1bGUodGlja3MsIHRoaXMpO1xuXG4gICAgLy8gQWRkIHRoZSBzY2hlZHVsZSB0byB0aGUgd29ybGRcbiAgICB0aGlzLnNjaGVkdWxlcy5hZGQoc2NoZWR1bGUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBzY2hlZHVsZVxuICAgIHJldHVybiBzY2hlZHVsZTtcbiAgfVxuXG4gIHB1YmxpYyBicm9hZGNhc3QoLi4ucGFja2V0czogQXJyYXk8RGF0YVBhY2tldD4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBsYXllciBvZiB0aGlzLmdldFBsYXllcnMoKSkgcGxheWVyLnNlbmQoLi4ucGFja2V0cyk7XG4gIH1cblxuICBwdWJsaWMgYnJvYWRjYXN0SW1tZWRpYXRlKC4uLnBhY2tldHM6IEFycmF5PERhdGFQYWNrZXQ+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbGF5ZXIgb2YgdGhpcy5nZXRQbGF5ZXJzKCkpIHBsYXllci5zZW5kSW1tZWRpYXRlKC4uLnBhY2tldHMpO1xuICB9XG5cbiAgcHVibGljIGJyb2FkY2FzdEV4Y2VwdChwbGF5ZXI6IFBsYXllciwgLi4ucGFja2V0czogQXJyYXk8RGF0YVBhY2tldD4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG90aGVyIG9mIHRoaXMuZ2V0UGxheWVycygpKVxuICAgICAgaWYgKG90aGVyICE9PSBwbGF5ZXIpIG90aGVyLnNlbmQoLi4ucGFja2V0cyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgV29ybGQgfTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9lZmZlY3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlZ2VuZXJhdGlvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcG9pc29uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uaWdodC12aXNpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2luc3RhbnQtZGFtYWdlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnN0YW50LWhlYWx0aFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmRuZXNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXJrbmVzc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmF1c2Vhc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3BlZWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dpdGhlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmF0YWwtcG9pc29uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zbG93bmVzc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW52aXNpYmlsaXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi93YXRlci1icmVhdGhpbmdcIjtcbiIsICJpbXBvcnQgeyBDb2xvciwgRWZmZWN0VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmNsYXNzIEVmZmVjdCB7XG4gIC8vIFRoZSBtaW5lY3JhZnQgZWZmZWN0IHR5cGUuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZTtcblxuICAvLyBXaGV0aGVyIHRoZSBlZmZlY3QgaXMgaW5zdGFudGFuZW91cyBvciBub3QuIERlZmF1bHQgaXMgZmFsc2UuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW5zdGFudDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIFRoZSBlZmZlY3QncyBwYXJ0aWNsZSBjb2xvci5cbiAgcHVibGljIHJlYWRvbmx5IGNvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigyNTUsIDI1NSwgMjU1LCAyNTUpO1xuXG4gIC8vIEVmZmVjdCBkdXJhdGlvbi5cbiAgcHVibGljIGR1cmF0aW9uOiBudW1iZXI7XG5cbiAgLy8gVGhlIGVmZmVjdCdzIGFtcGxpZmllci4gRGVmYXVsdCBpcyAwLlxuICBwdWJsaWMgYW1wbGlmaWVyOiBudW1iZXI7XG5cbiAgLy8gV2V0aGVyIHRoZSBlZmZlY3Qgc2hvdWxkIHNob3cgcGFydGljbGVzIG9yIG5vdC4gRGVmYXVsdCBpcyB0cnVlLlxuICBwdWJsaWMgc2hvd1BhcnRpY2xlczogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZHVyYXRpb246IG51bWJlcixcbiAgICBhbXBsaWZpZXI/OiBudW1iZXIsXG4gICAgc2hvd1BhcnRpY2xlcz86IGJvb2xlYW5cbiAgKSB7XG4gICAgdGhpcy5kdXJhdGlvbiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5pbnN0YW50ID8gMCA6IGR1cmF0aW9uO1xuICAgIHRoaXMuYW1wbGlmaWVyID0gYW1wbGlmaWVyID8/IDA7XG4gICAgdGhpcy5zaG93UGFydGljbGVzID0gc2hvd1BhcnRpY2xlcyA/PyB0cnVlO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGVmZmVjdFR5cGU6IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS50eXBlLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICBhbXBsaWZpZXI6IHRoaXMuYW1wbGlmaWVyLFxuICAgICAgc2hvd1BhcnRpY2xlczogdGhpcy5zaG93UGFydGljbGVzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBlZmZlY3QgaGFzIGV4cGlyZWQuXG4gICAqIEByZXR1cm5zIFdldGhlciBvciBub3QgdGhlIGVmZmVjdCBoYXMgZXhwaXJlZC5cbiAgICovXG5cbiAgcHVibGljIGlzRXhwaXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kdXJhdGlvbiA8PSAwO1xuICB9XG5cbiAgcHVibGljIG9uQWRkPyhlbnRpdHk6IEVudGl0eSk6IHZvaWQ7XG5cbiAgcHVibGljIG9uUmVtb3ZlPyhlbnRpdHk6IEVudGl0eSk6IHZvaWQ7XG5cbiAgcHVibGljIG9uVGljaz8oZW50aXR5OiBFbnRpdHkpOiB2b2lkO1xufVxuXG5leHBvcnQgeyBFZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBDb2xvciwgRWZmZWN0VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eUhlYWx0aFRyYWl0IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgUmVnZW5lcmF0aW9uRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5SZWdlbmVyYXRpb247XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigyNTUsIDIwNSwgOTIsIDE3MSk7XG5cbiAgcHVibGljIG9uVGljayhlbnRpdHk6IEVudGl0eSk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgZW50aXR5IGhlYWx0aCB0cmFpdC5cbiAgICBjb25zdCBlbnRpdHlIZWFsdGggPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGVudGl0eSBkb2Vzbid0IGhhdmUgYSBoZWFsdGggdHJhaXQsIG1lYW5zIHRoYXQgdGhlIGVudGl0eSBjYW4ndFxuICAgIC8vIEJlIGhlYWxlZC5cbiAgICBpZiAoIWVudGl0eUhlYWx0aCkgcmV0dXJuO1xuICAgIC8vIENvbXB1dGUgdGhlIGVmZmVjdCB0aW1pbmdzLlxuICAgIGNvbnN0IHRpY2tzUGVyU2Vjb25kID0gTWF0aC5tYXgoXG4gICAgICA1MCAvIDIgKiogKHRoaXMuYW1wbGlmaWVyIC0gMSksXG4gICAgICAxICogMiAqKiAodGhpcy5hbXBsaWZpZXIgLSA1KVxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBjYW4gaGVhbCBpbiB0aGUgY3VycmVudCB0aWNrLlxuICAgIGlmIChOdW1iZXIoZW50aXR5LmdldFdvcmxkKCkuY3VycmVudFRpY2spICUgdGlja3NQZXJTZWNvbmQgIT0gMCkgcmV0dXJuO1xuICAgIC8vIEhlYWwgdGhlIGVudGl0eSBieSAxIGhlYWx0aCBwb2ludC5cbiAgICBlbnRpdHlIZWFsdGguc2V0KGVudGl0eUhlYWx0aC5jdXJyZW50VmFsdWUgKyAxKTtcbiAgfVxufVxuXG5leHBvcnQgeyBSZWdlbmVyYXRpb25FZmZlY3QgfTtcbiIsICJpbXBvcnQge1xuICBFZmZlY3RUeXBlLFxuICBDb2xvcixcbiAgR2FtZW1vZGUsXG4gIEFjdG9yRGFtYWdlQ2F1c2Vcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSwgRW50aXR5SGVhbHRoVHJhaXQgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCIuL2VmZmVjdFwiO1xuXG5jbGFzcyBQb2lzb25FZmZlY3QgZXh0ZW5kcyBFZmZlY3Qge1xuICBwdWJsaWMgc3RhdGljIHR5cGU6IEVmZmVjdFR5cGUgPSBFZmZlY3RUeXBlLlBvaXNvbjtcbiAgcHVibGljIHN0YXRpYyBpbnN0YW50OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCA3OCwgMTQ3LCA0OSk7XG5cbiAgcHVibGljIG9uVGljaz8oZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICBsZXQgdGlja3NQZXJTZWNvbmQgPSBNYXRoLmZsb29yKFxuICAgICAgTWF0aC5tYXgoMjUgKiBNYXRoLnBvdygwLjUsIHRoaXMuYW1wbGlmaWVyIC0gMSksIDEyKVxuICAgICk7XG4gICAgdGlja3NQZXJTZWNvbmQgPSBNYXRoLm1pbih0aWNrc1BlclNlY29uZCwgMTApO1xuXG4gICAgaWYgKE51bWJlcihlbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrKSAlIHRpY2tzUGVyU2Vjb25kICE9IDApXG4gICAgICByZXR1cm47XG4gICAgaWYgKGVudGl0eS5pc1BsYXllcigpICYmIGVudGl0eS5nYW1lbW9kZSA9PSBHYW1lbW9kZS5DcmVhdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGVudGl0eUhlYWx0aCA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlIZWFsdGhUcmFpdCk7XG5cbiAgICBpZiAoZW50aXR5SGVhbHRoLmN1cnJlbnRWYWx1ZSA8PSAxKSByZXR1cm47XG4gICAgZW50aXR5SGVhbHRoLmFwcGx5RGFtYWdlKDEsIHVuZGVmaW5lZCwgQWN0b3JEYW1hZ2VDYXVzZS5NYWdpYyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUG9pc29uRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgQ29sb3IsIEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIE5pZ2h0VmlzaW9uRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5OaWdodFZpc2lvbjtcbiAgcHVibGljIGNvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigyNTUsIDMxLCAzMSwgMTYxKTtcbn1cblxuZXhwb3J0IHsgTmlnaHRWaXNpb25FZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBBY3RvckRhbWFnZUNhdXNlLCBFZmZlY3RUeXBlLCBHYW1lbW9kZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eUhlYWx0aFRyYWl0IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgSW5zdGFudERhbWFnZUVmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuSW5zdGFudERhbWFnZTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpbnN0YW50OiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgb25BZGQoZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICAvLyBUT0RPOiBVbmRlYWQgY2hlY2sgZm9yIGhlYWxpbmdcbiAgICAvL2lmIChlbnRpdHkpXG5cbiAgICBpZiAoZW50aXR5LmlzUGxheWVyKCkgJiYgZW50aXR5LmdhbWVtb2RlID09IEdhbWVtb2RlLkNyZWF0aXZlKSByZXR1cm47XG4gICAgY29uc3QgaGVhbHRoVHJhaXQgPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuXG4gICAgaWYgKCFoZWFsdGhUcmFpdCkgcmV0dXJuO1xuICAgIGhlYWx0aFRyYWl0LmFwcGx5RGFtYWdlKFxuICAgICAgMyAqIDIgKiogdGhpcy5hbXBsaWZpZXIsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBBY3RvckRhbWFnZUNhdXNlLk1hZ2ljXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBJbnN0YW50RGFtYWdlRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgRWZmZWN0VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eUhlYWx0aFRyYWl0IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgSW5zdGFudEhlYWx0aEVmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuSW5zdGFudEhlYWx0aDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpbnN0YW50OiBib29sZWFuID0gdHJ1ZTtcblxuICBwdWJsaWMgb25BZGQoZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICBjb25zdCBoZWFsdGhUcmFpdCA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlIZWFsdGhUcmFpdCk7XG4gICAgY29uc3QgY3VycmVudEhlYWx0aCA9IGhlYWx0aFRyYWl0LmN1cnJlbnRWYWx1ZTtcblxuICAgIC8vIFRPRE86IFVuZGVhZCBjaGVjayB0byBkYW1hZ2VcbiAgICBpZiAoY3VycmVudEhlYWx0aCA+PSBoZWFsdGhUcmFpdC5lZmZlY3RpdmVNYXgpIHJldHVybjtcbiAgICBoZWFsdGhUcmFpdC5zZXQoXG4gICAgICBNYXRoLm1pbihcbiAgICAgICAgaGVhbHRoVHJhaXQuZWZmZWN0aXZlTWF4LFxuICAgICAgICBjdXJyZW50SGVhbHRoICsgMiAqIDIgKiogdGhpcy5hbXBsaWZpZXJcbiAgICAgIClcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7IEluc3RhbnRIZWFsdGhFZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBDb2xvciwgRWZmZWN0VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgQmxpbmRuZXNzRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5CbGluZG5lc3M7XG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCAzMSwgMzEsIDM1KTtcbn1cblxuZXhwb3J0IHsgQmxpbmRuZXNzRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgQ29sb3IsIEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIERhcmtuZXNzRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5EYXJrbmVzcztcbiAgcHVibGljIHJlYWRvbmx5IGNvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigyNTUsIDQxLCAzOSwgMzMpO1xufVxuXG5leHBvcnQgeyBEYXJrbmVzc0VmZmVjdCB9O1xuIiwgImltcG9ydCB7IENvbG9yLCBFZmZlY3RUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCIuL2VmZmVjdFwiO1xuXG5jbGFzcyBOYXVzZWFzRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5OYXVzZWE7XG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCA4NSwgMjksIDc0KTtcbn1cblxuZXhwb3J0IHsgTmF1c2Vhc0VmZmVjdCB9O1xuIiwgImltcG9ydCB7IENvbG9yLCBFZmZlY3RUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSwgRW50aXR5TW92ZW1lbnRUcmFpdCB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIFNwZWVkRWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5TcGVlZDtcbiAgcHVibGljIHJlYWRvbmx5IGNvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigyNTUsIDEyNCwgMTc1LCAxOTgpO1xuXG4gIHB1YmxpYyBvbkFkZChlbnRpdHk6IEVudGl0eSk6IHZvaWQge1xuICAgIGNvbnN0IG1vdmVtZW50VHJhaXQgPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5TW92ZW1lbnRUcmFpdCk7XG4gICAgbW92ZW1lbnRUcmFpdC5zZXQobW92ZW1lbnRUcmFpdC5jdXJyZW50VmFsdWUgKiAoMSArIDAuMiAqIHRoaXMuYW1wbGlmaWVyKSk7XG4gIH1cblxuICBwdWJsaWMgb25SZW1vdmUoZW50aXR5OiBFbnRpdHkpOiB2b2lkIHtcbiAgICBjb25zdCBtb3ZlbWVudFRyYWl0ID0gZW50aXR5LmdldFRyYWl0KEVudGl0eU1vdmVtZW50VHJhaXQpO1xuICAgIG1vdmVtZW50VHJhaXQuc2V0KG1vdmVtZW50VHJhaXQuZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTcGVlZEVmZmVjdCB9O1xuIiwgImltcG9ydCB7XG4gIEFjdG9yRGFtYWdlQ2F1c2UsXG4gIENvbG9yLFxuICBFZmZlY3RUeXBlLFxuICBHYW1lbW9kZVxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlIZWFsdGhUcmFpdCB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0XCI7XG5cbmNsYXNzIFdpdGhlckVmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuV2l0aGVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY29sb3I6IENvbG9yID0gbmV3IENvbG9yKDI1NSwgNTMsIDQyLCAzOSk7XG5cbiAgcHVibGljIG9uVGljayhlbnRpdHk6IEVudGl0eSk6IHZvaWQge1xuICAgIGNvbnN0IHRpY2tzUGVyU2Vjb25kID0gTWF0aC5tYXgoNDAgLyBNYXRoLnBvdygyLCB0aGlzLmFtcGxpZmllciAtIDEpLCAxMCk7XG5cbiAgICBpZiAoTnVtYmVyKGVudGl0eS5kaW1lbnNpb24ud29ybGQuY3VycmVudFRpY2spICUgdGlja3NQZXJTZWNvbmQgIT0gMClcbiAgICAgIHJldHVybjtcbiAgICBpZiAoZW50aXR5LmlzUGxheWVyKCkgJiYgZW50aXR5LmdhbWVtb2RlID09IEdhbWVtb2RlLkNyZWF0aXZlKSByZXR1cm47XG4gICAgY29uc3QgaGVhbHRoVHJhaXQgPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuXG4gICAgaGVhbHRoVHJhaXQuYXBwbHlEYW1hZ2UoMSwgdW5kZWZpbmVkLCBBY3RvckRhbWFnZUNhdXNlLk1hZ2ljKTtcbiAgfVxufVxuXG5leHBvcnQgeyBXaXRoZXJFZmZlY3QgfTtcbiIsICJpbXBvcnQge1xuICBBY3RvckRhbWFnZUNhdXNlLFxuICBDb2xvcixcbiAgRWZmZWN0VHlwZSxcbiAgR2FtZW1vZGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSwgRW50aXR5SGVhbHRoVHJhaXQgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCIuL2VmZmVjdFwiO1xuXG5jbGFzcyBGYXRhbFBvaXNvbkVmZmVjdCBleHRlbmRzIEVmZmVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZTogRWZmZWN0VHlwZSA9IEVmZmVjdFR5cGUuRmF0YWxQb2lzb247XG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCA3OCwgMTQ3LCA0OSk7XG5cbiAgcHVibGljIG9uVGljayhlbnRpdHk6IEVudGl0eSk6IHZvaWQge1xuICAgIGxldCB0aWNrc1BlclNlY29uZCA9IE1hdGguZmxvb3IoXG4gICAgICBNYXRoLm1heCgyNSAqIE1hdGgucG93KDAuNSwgdGhpcy5hbXBsaWZpZXIgLSAxKSwgMTIpXG4gICAgKTtcbiAgICB0aWNrc1BlclNlY29uZCA9IE1hdGgubWluKHRpY2tzUGVyU2Vjb25kLCAxMCk7XG5cbiAgICBpZiAoTnVtYmVyKGVudGl0eS5kaW1lbnNpb24ud29ybGQuY3VycmVudFRpY2spICUgdGlja3NQZXJTZWNvbmQgIT0gMClcbiAgICAgIHJldHVybjtcblxuICAgIGlmIChlbnRpdHkuaXNQbGF5ZXIoKSAmJiBlbnRpdHkuZ2FtZW1vZGUgPT0gR2FtZW1vZGUuQ3JlYXRpdmUpIHJldHVybjtcbiAgICBjb25zdCBlbnRpdHlIZWFsdGggPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuICAgIGVudGl0eUhlYWx0aC5hcHBseURhbWFnZSgxLCB1bmRlZmluZWQsIEFjdG9yRGFtYWdlQ2F1c2UuTWFnaWMpO1xuICB9XG59XG5cbmV4cG9ydCB7IEZhdGFsUG9pc29uRWZmZWN0IH07XG4iLCAiaW1wb3J0IHsgQ29sb3IsIEVmZmVjdFR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5LCBFbnRpdHlNb3ZlbWVudFRyYWl0IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgU2xvd25lc3NFZmZlY3QgZXh0ZW5kcyBFZmZlY3Qge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGU6IEVmZmVjdFR5cGUgPSBFZmZlY3RUeXBlLlNsb3duZXNzO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCA5MCwgMTA4LCAxMjkpO1xuXG4gIHB1YmxpYyBvbkFkZChlbnRpdHk6IEVudGl0eSk6IHZvaWQge1xuICAgIGNvbnN0IG1vdmVtZW50VHJhaXQgPSBlbnRpdHkuZ2V0VHJhaXQoRW50aXR5TW92ZW1lbnRUcmFpdCk7XG4gICAgbW92ZW1lbnRUcmFpdC5zZXQobW92ZW1lbnRUcmFpdC5jdXJyZW50VmFsdWUgKiAoMSAtIDAuMTUgKiB0aGlzLmFtcGxpZmllcikpO1xuICB9XG5cbiAgcHVibGljIG9uUmVtb3ZlKGVudGl0eTogRW50aXR5KTogdm9pZCB7XG4gICAgY29uc3QgbW92ZW1lbnRUcmFpdCA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlNb3ZlbWVudFRyYWl0KTtcbiAgICBtb3ZlbWVudFRyYWl0LnNldChtb3ZlbWVudFRyYWl0LmRlZmF1bHRWYWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2xvd25lc3NFZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBDb2xvciwgRWZmZWN0VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eUludmlzaWJpbGl0eVRyYWl0IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgSW52aXNpYmlsaXR5RWZmZWN0IGV4dGVuZHMgRWZmZWN0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlOiBFZmZlY3RUeXBlID0gRWZmZWN0VHlwZS5JbnZpc2liaWxpdHk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbG9yOiBDb2xvciA9IG5ldyBDb2xvcigyNTUsIDEyNywgMTMxLCAxNDYpO1xuXG4gIHB1YmxpYyBvbkFkZChlbnRpdHk6IEVudGl0eSk6IHZvaWQge1xuICAgIC8vIE1ha2UgdGhlIGVudGl0eSBpbnZpc2libGUuXG4gICAgZW50aXR5LmdldFRyYWl0KEVudGl0eUludmlzaWJpbGl0eVRyYWl0KT8uc2V0SW52aXNpYmlsaXR5KHRydWUpO1xuICB9XG5cbiAgcHVibGljIG9uUmVtb3ZlKGVudGl0eTogRW50aXR5KTogdm9pZCB7XG4gICAgLy8gTWFrZSB0aGUgZW50aXR5IHZpc2libGUgYWdhaW4uXG4gICAgZW50aXR5LmdldFRyYWl0KEVudGl0eUludmlzaWJpbGl0eVRyYWl0KT8uc2V0SW52aXNpYmlsaXR5KGZhbHNlKTtcbiAgfVxufVxuXG5leHBvcnQgeyBJbnZpc2liaWxpdHlFZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBDb2xvciwgRWZmZWN0VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiLi9lZmZlY3RcIjtcblxuY2xhc3MgV2F0ZXJCcmVhdGhpbmdFZmZlY3QgZXh0ZW5kcyBFZmZlY3Qge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGU6IEVmZmVjdFR5cGUgPSBFZmZlY3RUeXBlLldhdGVyQnJlYXRoaW5nO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb2xvcjogQ29sb3IgPSBuZXcgQ29sb3IoMjU1LCAxNTIsIDIxOCwgMTkyKTtcbn1cblxuZXhwb3J0IHsgV2F0ZXJCcmVhdGhpbmdFZmZlY3QgfTtcbiIsICJpbXBvcnQgeyBFZmZlY3RUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eUVmZmVjdHMgfSBmcm9tIFwiLlwiO1xuXG5pbXBvcnQgdHlwZSB7IEVmZmVjdCB9IGZyb20gXCIuL2VmZmVjdHMvZWZmZWN0XCI7XG5cbmNsYXNzIEVmZmVjdFBhbGxldGUge1xuICBwdWJsaWMgZWZmZWN0czogTWFwPEVmZmVjdFR5cGUsIHR5cGVvZiBFZmZlY3Q+ID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBSZWdpc3RlciBhbGwgZWZmZWN0IHR5cGVzLlxuICAgIGZvciAoY29uc3QgZWZmZWN0IG9mIEVudGl0eUVmZmVjdHMpIHRoaXMucmVnaXN0ZXJFZmZlY3QoZWZmZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gZWZmZWN0IHR5cGUgaW4gdGhlIGVmZmVjdCByZWdpc3RyeS5cbiAgICogQHBhcmFtIGVmZmVjdCBUaGUgZWZmZWN0IHR5cGUgdG8gYmUgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckVmZmVjdChlZmZlY3Q6IHR5cGVvZiBFZmZlY3QpOiB2b2lkIHtcbiAgICB0aGlzLmVmZmVjdHMuc2V0KGVmZmVjdC50eXBlLCBlZmZlY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYSBlZmZlY3QgdHlwZSBmcm9tIHRoZSBlZmZlY3QgcmVnaXN0cnkuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBlZmZlY3QgdHlwZSB0byBiZSBmZXRjaGVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBAcmV0dXJucyBUaGUgZWZmZWN0IGlmIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIGdldEVmZmVjdCh0eXBlOiBFZmZlY3RUeXBlKTogdHlwZW9mIEVmZmVjdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0cy5nZXQodHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0J3MgYWxsIHRoZSBlZmZlY3RzIHRoYXQgYXJlIGluIHRoZSByZWdpc3RyeSxcbiAgICogQHJldHVybnMgQWxsIHRoZSBlZmZlY3RzIHRoYXQgYXJlIHJlZ2lzdGVyZWQuXG4gICAqL1xuXG4gIHB1YmxpYyBnZXRBbGxFZmZlY3RzKCk6IEFycmF5PHR5cGVvZiBFZmZlY3Q+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZWZmZWN0cy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlZmZlY3QgZnJvbSB0aGUgZWZmZWN0IHJlZ2lzdHJ5LlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgZWZmZWN0IHR5cGUgdG8gcmVtb3ZlIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVmZmVjdCh0eXBlOiBFZmZlY3RUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5lZmZlY3RzLmRlbGV0ZSh0eXBlKTtcbiAgfVxufVxuXG5leHBvcnQgeyBFZmZlY3RQYWxsZXRlIH07XG4iLCAiaW1wb3J0ICogYXMgRWZmZWN0cyBmcm9tIFwiLi9lZmZlY3RzXCI7XG5cbmltcG9ydCB0eXBlIHsgRWZmZWN0IH0gZnJvbSBcIi4vZWZmZWN0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGFsbGV0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZWZmZWN0c1wiO1xuXG5jb25zdCBFbnRpdHlFZmZlY3RzOiBBcnJheTx0eXBlb2YgRWZmZWN0PiA9IFtdO1xuXG4vLyBJdGVyYXRlIG92ZXIgZWFjaCBlZmZlY3RcbmZvciAoY29uc3Qga2V5IGluIEVmZmVjdHMpIHtcbiAgLy8gR2V0IHRoZSBibG9jayBlZmZlY3RcbiAgY29uc3QgZWZmZWN0ID0gRWZmZWN0c1trZXkgYXMga2V5b2YgdHlwZW9mIEVmZmVjdHNdO1xuXG4gIC8vIFB1c2ggdGhlIGJsb2NrIGVmZmVjdCB0byB0aGUgbGlzdFxuICBFbnRpdHlFZmZlY3RzLnB1c2goZWZmZWN0KTtcbn1cblxuZXhwb3J0IHsgRW50aXR5RWZmZWN0cyB9O1xuIiwgImltcG9ydCB7XG4gIEJsb2NrUG9zaXRpb24sXG4gIERhdGFQYWNrZXQsXG4gIERpbWVuc2lvblR5cGUsXG4gIElQb3NpdGlvbixcbiAgVGV4dFBhY2tldCxcbiAgVGV4dFBhY2tldFR5cGUsXG4gIFZlY3RvcjNmXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBDb21tYW5kUmVzcG9uc2UsIERpbWVuc2lvblByb3BlcnRpZXMsIEl0ZW1zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBFbnRpdHksXG4gIEVudGl0eUdyYXZpdHlUcmFpdCxcbiAgRW50aXR5SW52ZW50b3J5VHJhaXQsXG4gIEVudGl0eUl0ZW1TdGFja1RyYWl0LFxuICBFbnRpdHlNb3ZlbWVudFRyYWl0LFxuICBFbnRpdHlQaHlzaWNzVHJhaXQsXG4gIEVudGl0eVR5cGUsXG4gIFBsYXllcixcbiAgUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdFxufSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBCbG9jaywgQmxvY2tQZXJtdXRhdGlvbiB9IGZyb20gXCIuLi9ibG9ja1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIi4uL3NlcmVuaXR5XCI7XG5pbXBvcnQgeyBDb21tYW5kRXhlY3V0aW9uU3RhdGUgfSBmcm9tIFwiLi4vY29tbWFuZHNcIjtcblxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiLi93b3JsZFwiO1xuaW1wb3J0IHsgVGVycmFpbkdlbmVyYXRvciB9IGZyb20gXCIuL2dlbmVyYXRvclwiO1xuaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi9jaHVua1wiO1xuaW1wb3J0IHsgVGlja1NjaGVkdWxlIH0gZnJvbSBcIi4vc2NoZWR1bGVcIjtcblxuY29uc3QgRGVmYXVsdERpbWVuc2lvblByb3BlcnRpZXM6IERpbWVuc2lvblByb3BlcnRpZXMgPSB7XG4gIGlkZW50aWZpZXI6IFwib3ZlcndvcmxkXCIsXG4gIHR5cGU6IERpbWVuc2lvblR5cGUuT3ZlcndvcmxkLFxuICBnZW5lcmF0b3I6IFwidm9pZFwiLFxuICB2aWV3RGlzdGFuY2U6IDIwLFxuICBzaW11bGF0aW9uRGlzdGFuY2U6IDEwLFxuICBzcGF3blBvc2l0aW9uOiBbMCwgMzI3NjcsIDBdXG59O1xuXG5jbGFzcyBEaW1lbnNpb24ge1xuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VyZW5pdHk6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BlcnRpZXM6IERpbWVuc2lvblByb3BlcnRpZXMgPSBEZWZhdWx0RGltZW5zaW9uUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRpbWVuc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBkaW1lbnNpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRGltZW5zaW9uVHlwZTtcblxuICAvKipcbiAgICogVGhlIHdvcmxkIHRoYXQgdGhlIGRpbWVuc2lvbiBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmxkOiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIGdlbmVyYXRvciBvZiB0aGUgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdlbmVyYXRvcjogVGVycmFpbkdlbmVyYXRvcjtcblxuICAvKipcbiAgICogVGhlIGVudGl0aWVzIGluIHRoZSBkaW1lbnNpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgTWFwPGJpZ2ludCwgRW50aXR5PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2tzIGluIHRoZSBkaW1lbnNpb24gdGhhdCBjb250YWluIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzID0gbmV3IE1hcDxiaWdpbnQsIEJsb2NrPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIGNodW5rcyB0aGF0IHRoYXQgd2lsbCBiZSByZW5kZXJlZCBieSB0aGUgY2xpZW50LlxuICAgKi9cbiAgcHVibGljIGdldCB2aWV3RGlzdGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnZpZXdEaXN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIGNodW5rcyB0aGF0IHRoYXQgd2lsbCBiZSByZW5kZXJlZCBieSB0aGUgY2xpZW50LlxuICAgKi9cbiAgcHVibGljIHNldCB2aWV3RGlzdGFuY2UodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMucHJvcGVydGllcy52aWV3RGlzdGFuY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgaW4gY2h1bmtzIHRoYXQgZW50aXRpZXMgd2lsbCBiZSBzaW11bGF0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpbXVsYXRpb25EaXN0YW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuc2ltdWxhdGlvbkRpc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBpbiBjaHVua3MgdGhhdCBlbnRpdGllcyB3aWxsIGJlIHNpbXVsYXRlZC5cbiAgICovXG4gIHB1YmxpYyBzZXQgc2ltdWxhdGlvbkRpc3RhbmNlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnByb3BlcnRpZXMuc2ltdWxhdGlvbkRpc3RhbmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNwYXduIHBvc2l0aW9uIG9mIHRoZSBkaW1lbnNpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNwYXduUG9zaXRpb24oKTogVmVjdG9yM2Yge1xuICAgIC8vIEdldCB0aGUgc3Bhd24gcG9zaXRpb24gZnJvbSB0aGUgcHJvcGVydGllc1xuICAgIGNvbnN0IHBvc2l0aW9uID0gVmVjdG9yM2YuZnJvbUFycmF5KHRoaXMucHJvcGVydGllcy5zcGF3blBvc2l0aW9uKTtcblxuICAgIC8vIEZpbmQgdGhlIHNwYXduIHBvc2l0aW9uIGlmIGl0IGlzIGF0IHRoZSBtYXhpbXVtIGhlaWdodFxuICAgIC8vIFRoaXMgd2lsbCBkZXRlcm1pbmUgdGhlIHRvcG1vc3QgYmxvY2sgYXQgdGhlIHNwYXduIHBvc2l0aW9uXG4gICAgaWYgKHBvc2l0aW9uLnkgPj0gMzI3NjcpIHtcbiAgICAgIC8vIEdldCB0aGUgdG9wbW9zdCBibG9jayBhdCB0aGUgc3Bhd24gcG9zaXRpb25cbiAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5nZXRUb3Btb3N0QmxvY2socG9zaXRpb24pO1xuXG4gICAgICAvLyBTZXQgdGhlIHNwYXduIHBvc2l0aW9uIHRvIHRoZSB0b3Btb3N0IGJsb2NrXG4gICAgICBpZiAoYmxvY2spIHBvc2l0aW9uLnkgPSBibG9jay5wb3NpdGlvbi55ICsgMztcbiAgICAgIC8vIFNldCB0aGUgc3Bhd24gcG9zaXRpb24gdG8gdGhlIHRvcG1vc3QgYmxvY2tcbiAgICAgIGVsc2UgcG9zaXRpb24ueSA9IDA7XG5cbiAgICAgIC8vIFNldCB0aGUgc3Bhd24gcG9zaXRpb24gaW4gdGhlIHByb3BlcnRpZXNcbiAgICAgIHRoaXMuc3Bhd25Qb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgc3Bhd24gcG9zaXRpb25cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNwYXduIHBvc2l0aW9uIG9mIHRoZSBkaW1lbnNpb24uXG4gICAqL1xuICBwdWJsaWMgc2V0IHNwYXduUG9zaXRpb24odmFsdWU6IFZlY3RvcjNmKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzLnNwYXduUG9zaXRpb24gPSBbdmFsdWUueCwgdmFsdWUueSwgdmFsdWUuel07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBkaW1lbnNpb24gZm9yIGEgd29ybGQuXG4gICAqIEBwYXJhbSB3b3JsZCBUaGUgd29ybGQgdGhhdCB0aGUgZGltZW5zaW9uIHdpbGwgYmVsb25nIHRvLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB0aGUgZGltZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHdvcmxkOiBXb3JsZCwgcHJvcGVydGllcz86IERpbWVuc2lvblByb3BlcnRpZXMpIHtcbiAgICAvLyBBc3NpZ24gdGhlIHNlcmVuaXR5IGluc3RhbmNlICYgd29ybGRcbiAgICB0aGlzLnNlcmVuaXR5ID0gd29ybGQuc2VyZW5pdHk7XG4gICAgdGhpcy53b3JsZCA9IHdvcmxkO1xuXG4gICAgLy8gQXNzaWduIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBkaW1lbnNpb24gd2l0aCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi5EZWZhdWx0RGltZW5zaW9uUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gR2V0IHRoZSBnZW5lcmF0b3IgZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICBjb25zdCBnZW5lcmF0b3IgPSB0aGlzLnNlcmVuaXR5LmdldEdlbmVyYXRvcih0aGlzLnByb3BlcnRpZXMuZ2VuZXJhdG9yKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBnZW5lcmF0b3IgZXhpc3RzXG4gICAgaWYgKCFnZW5lcmF0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZmluZCBnZW5lcmF0b3IgXCIke3RoaXMucHJvcGVydGllcy5nZW5lcmF0b3J9XCIgZm9yIGRpbWVuc2lvbiBcIiR7dGhpcy5wcm9wZXJ0aWVzLmlkZW50aWZpZXJ9XCJgXG4gICAgICApO1xuXG4gICAgLy8gQXNzaWduIHRoZSBnZW5lcmF0b3IgdG8gdGhlIGRpbWVuc2lvblxuICAgIHRoaXMuZ2VuZXJhdG9yID0gbmV3IGdlbmVyYXRvcih0aGlzLCB7IHNlZWQ6IHdvcmxkLnByb3BlcnRpZXMuc2VlZCB9KTtcblxuICAgIC8vIEFzc2lnbiB0aGUgaWRlbnRpZmllciBhbmQgdHlwZVxuICAgIHRoaXMuaWRlbnRpZmllciA9IHRoaXMucHJvcGVydGllcy5pZGVudGlmaWVyO1xuICAgIHRoaXMudHlwZSA9IHRoaXMucHJvcGVydGllcy50eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRpbWVuc2lvbiBpbmRleCBpbiB0aGUgd29ybGQuXG4gICAqIEByZXR1cm5zIFRoZSBkaW1lbnNpb24gaW5kZXguXG4gICAqL1xuICBwdWJsaWMgaW5kZXhPZigpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JsZC5kaW1lbnNpb25zLnZhbHVlcygpXS5pbmRleE9mKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpY2tzIHRoZSBkaW1lbnNpb24gd2l0aCBhIGdpdmVuIGRlbHRhIHRpY2suXG4gICAqIEBwYXJhbSBkZWx0YVRpY2sgVGhlIGRlbHRhIHRpY2sgdG8gdGljayB0aGUgZGltZW5zaW9uIHdpdGguXG4gICAqL1xuICBwdWJsaWMgb25UaWNrKGRlbHRhVGljazogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIG5vIHBsYXllcnMgaW4gdGhlIGRpbWVuc2lvblxuICAgIGlmICh0aGlzLmdldFBsYXllcnMoKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIEdldCBhbGwgdGhlIHBsYXllciBwb3NpdGlvbnMgaW4gdGhlIGRpbWVuc2lvbi5cbiAgICBjb25zdCBwbGF5ZXJQb3NpdGlvbnMgPSB0aGlzLmdldFBsYXllcnMoKS5tYXAoKHBsYXllcikgPT4gcGxheWVyLnBvc2l0aW9uKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGVudGl0aWVzIGluIHRoZSBkaW1lbnNpb25cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiB0aGlzLmVudGl0aWVzLnZhbHVlcygpKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBsYXllciB3aXRoaW4gdGhlIHNpbXVsYXRpb24gZGlzdGFuY2UgdG8gdGljayB0aGUgZW50aXR5XG4gICAgICBjb25zdCBpblNpbXVsYXRpb25SYW5nZSA9IHBsYXllclBvc2l0aW9ucy5zb21lKChwb3NpdGlvbikgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHBvc2l0aW9uLmRpc3RhbmNlKGVudGl0eS5wb3NpdGlvbikgPD0gdGhpcy5zaW11bGF0aW9uRGlzdGFuY2UgPDwgNFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRpY2sgdGhlIGVudGl0eSBpZiBpdCBpcyBpbiBzaW11bGF0aW9uIHJhbmdlXG4gICAgICBpZiAoaW5TaW11bGF0aW9uUmFuZ2UpIHtcbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgdHJhaXRzIGluIHRoZSBlbnRpdHlcbiAgICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiBlbnRpdHkudHJhaXRzLnZhbHVlcygpKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBUaWNrIHRoZSB0cmFpdFxuICAgICAgICAgICAgdHJhaXQub25UaWNrPy4oZGVsdGFUaWNrKTtcbiAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgICAgIHRoaXMud29ybGQubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHRpY2sgZW50aXR5IHRyYWl0IFwiJHt0cmFpdC5pZGVudGlmaWVyfVwiIGZvciBlbnRpdHkgXCIke2VudGl0eS50eXBlLmlkZW50aWZpZXJ9OiR7ZW50aXR5LnVuaXF1ZUlkfVwiIGluIGRpbWVuc2lvbiBcIiR7dGhpcy5pZGVudGlmaWVyfVwiYCxcbiAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIGVudGl0eVxuICAgICAgICAgICAgZW50aXR5LnRyYWl0cy5kZWxldGUodHJhaXQuaWRlbnRpZmllcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGEgaW52ZW50b3J5IHRyYWl0XG4gICAgICAgIGlmIChlbnRpdHkuaGFzVHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBpbnZlbnRvcnkgdHJhaXQgZnJvbSB0aGUgZW50aXR5XG4gICAgICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCk7XG5cbiAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBpdGVtcyBpbiB0aGUgaW52ZW50b3J5XG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbnRhaW5lci5zdG9yYWdlKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyBudWxsXG4gICAgICAgICAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSB0cmFpdHMgaW4gdGhlIGl0ZW1cbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgaXRlbS50cmFpdHMudmFsdWVzKCkpXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gVGljayB0aGUgaXRlbSB0cmFpdFxuICAgICAgICAgICAgICAgIHRyYWl0Lm9uVGljaz8uKGRlbHRhVGljayk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgICAgICAgICB0aGlzLndvcmxkLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gdGljayBpdGVtIHRyYWl0IFwiJHt0cmFpdC5pZGVudGlmaWVyfVwiIGZvciBpdGVtIFwiJHtpdGVtLnR5cGUuaWRlbnRpZmllcn1cIiBpbiBkaW1lbnNpb24gXCIke3RoaXMuaWRlbnRpZmllcn1cImAsXG4gICAgICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBpdGVtXG4gICAgICAgICAgICAgICAgaXRlbS50cmFpdHMuZGVsZXRlKHRyYWl0LmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYmxvY2tzIGluIHRoZSBkaW1lbnNpb25cbiAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIHRoaXMuYmxvY2tzLnZhbHVlcygpKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBsYXllciB3aXRoaW4gdGhlIHNpbXVsYXRpb24gZGlzdGFuY2UgdG8gdGljayB0aGUgYmxvY2tcbiAgICAgIGNvbnN0IGluU2ltdWxhdGlvblJhbmdlID0gcGxheWVyUG9zaXRpb25zLnNvbWUoKHBsYXllcikgPT4ge1xuICAgICAgICByZXR1cm4gcGxheWVyLmRpc3RhbmNlKGJsb2NrLnBvc2l0aW9uKSA8PSB0aGlzLnNpbXVsYXRpb25EaXN0YW5jZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaWNrIHRoZSBibG9jayBpZiBpdCBpcyBpbiBzaW11bGF0aW9uIHJhbmdlXG4gICAgICBpZiAoaW5TaW11bGF0aW9uUmFuZ2UpIHtcbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgdHJhaXRzIGluIHRoZSBibG9ja1xuICAgICAgICAvLyBUcnkgdG8gdGljayB0aGUgYmxvY2sgdHJhaXRcbiAgICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiBibG9jay50cmFpdHMudmFsdWVzKCkpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRyYWl0Lm9uVGljaz8uKGRlbHRhVGljayk7XG4gICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICAgICAgICB0aGlzLndvcmxkLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB0aWNrIGJsb2NrIHRyYWl0IFwiJHt0cmFpdC5pZGVudGlmaWVyfVwiIGZvciBibG9jayBcIiR7YmxvY2sucG9zaXRpb24ueH0sICR7YmxvY2sucG9zaXRpb24ueX0sICR7YmxvY2sucG9zaXRpb24uen1cIiBpbiBkaW1lbnNpb24gXCIke3RoaXMuaWRlbnRpZmllcn1cImAsXG4gICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBibG9ja1xuICAgICAgICAgICAgYmxvY2sudHJhaXRzLmRlbGV0ZSh0cmFpdC5pZGVudGlmaWVyKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgd29ybGQgdGhhdCB0aGUgZGltZW5zaW9uIGJlbG9uZ3MgdG8uXG4gICAqIEByZXR1cm5zIFRoZSB3b3JsZCB0aGF0IHRoZSBkaW1lbnNpb24gYmVsb25ncyB0by5cbiAgICovXG4gIHB1YmxpYyBnZXRXb3JsZCgpOiBXb3JsZCB7XG4gICAgcmV0dXJuIHRoaXMud29ybGQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNodW5rIGZyb20gdGhlIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIGN4IFRoZSBjaHVuayB4IGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBjeiBUaGUgY2h1bmsgeiBjb29yZGluYXRlLlxuICAgKiBAcmV0dXJucyBUaGUgY2h1bmsgYXQgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlcy5cbiAgICovXG4gIHB1YmxpYyBnZXRDaHVuayhjeDogbnVtYmVyLCBjejogbnVtYmVyKTogQ2h1bmsge1xuICAgIC8vIFJlYWQgdGhlIGNodW5rIGZyb20gdGhlIHByb3ZpZGVyXG4gICAgY29uc3QgY2h1bmsgPSB0aGlzLndvcmxkLnByb3ZpZGVyLnJlYWRDaHVuayhjeCwgY3osIHRoaXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjaHVua1xuICAgIHJldHVybiBjaHVuaztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgY2h1bmsgaW4gdGhlIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0Q2h1bmsoY2h1bms6IENodW5rKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IENodW5rV3JpdGVTaWduYWxcbiAgICAvLyBjb25zdCBzaWduYWwgPSBuZXcgQ2h1bmtXcml0ZVNpZ25hbChjaHVuaywgdGhpcyk7XG4gICAgLy8gY29uc3QgdmFsdWUgPSBzaWduYWwuZW1pdCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNpZ25hbCB3YXMgYXR0ZW1wdGVkIHRvIGJlIGNhbmNlbGxlZFxuICAgIC8vIGlmICh2YWx1ZSA9PT0gZmFsc2UpXG4gICAgLy8gICAvLyBMb2cgYSB3YXJuaW5nIHRvIHRoZSBjb25zb2xlLCBhcyB0aGlzIHNpZ25hbCBjYW5ub3QgYmUgY2FuY2VsbGVkXG4gICAgLy8gICB0aGlzLndvcmxkLmxvZ2dlci53YXJuKFxuICAgIC8vICAgICBgQ2h1bmsgd3JpdGUgc2lnbmFsIGNhbm5vdCBiZSBjYW5jZWxsZWQsIGNodW5rOiAke2NodW5rLnh9LCAke2NodW5rLnp9YFxuICAgIC8vICAgKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHBsYXllcnMgaW4gdGhlIGRpbWVuc2lvblxuICAgIGZvciAoY29uc3QgcGxheWVyIG9mIHRoaXMuZ2V0UGxheWVycygpKSB7XG4gICAgICAvLyBHZXQgdGhlIHBsYXllcidzIGNodW5rIHJlbmRlcmluZyB0cmFpdFxuICAgICAgY29uc3QgdHJhaXQgPSBwbGF5ZXIuZ2V0VHJhaXQoUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIHRoZSBjaHVuayBiZWluZyBzZXRcbiAgICAgIGlmICghdHJhaXQuY2h1bmtzLmhhcyhjaHVuay5oYXNoKSkgY29udGludWU7XG5cbiAgICAgIC8vIFNlbmQgdGhlIGNodW5rIHRvIHRoZSBwbGF5ZXJcbiAgICAgIHRyYWl0LnNlbmQoY2h1bmspO1xuICAgIH1cblxuICAgIC8vIFdyaXRlIHRoZSBjaHVuayB0byB0aGUgcHJvdmlkZXJcbiAgICByZXR1cm4gdGhpcy53b3JsZC5wcm92aWRlci53cml0ZUNodW5rKGNodW5rLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgYmxvY2sgZnJvbSB0aGUgZGltZW5zaW9uLlxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBibG9jay5cbiAgICogQHJldHVybnMgVGhlIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0QmxvY2socG9zaXRpb246IElQb3NpdGlvbik6IEJsb2NrIHtcbiAgICAvLyBDb252ZXJ0IHRoZSBwb3NpdGlvbiB0byBhIGJsb2NrIHBvc2l0aW9uXG4gICAgY29uc3QgYmxvY2tQb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24uZnJvbShwb3NpdGlvbik7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJsb2NrIGhhc2ggdXNpbmcgdGhlIHBvc2l0aW9uXG4gICAgY29uc3QgaGFzaCA9IEJsb2NrUG9zaXRpb24uaGFzaChibG9ja1Bvc2l0aW9uKTtcblxuICAgIC8vIEdldCB0aGUgYmxvY2sgZnJvbSB0aGUgYmxvY2sgY2FjaGVcbiAgICBjb25zdCBibG9jayA9IHRoaXMuYmxvY2tzLmdldChoYXNoKTtcblxuICAgIC8vIFJldHVybiB0aGUgYmxvY2sgaWYgaXQgZXhpc3RzXG4gICAgaWYgKGJsb2NrKSByZXR1cm4gYmxvY2s7XG4gICAgZWxzZSB7XG4gICAgICAvLyBDb252ZXJ0IHRoZSBibG9jayBwb3NpdGlvbiB0byBhIGNodW5rIHBvc2l0aW9uXG4gICAgICBjb25zdCBjeCA9IGJsb2NrUG9zaXRpb24ueCA+PiA0O1xuICAgICAgY29uc3QgY3ogPSBibG9ja1Bvc2l0aW9uLnogPj4gNDtcblxuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGNodW5rIHRoZSBibG9jayB3aWxsIGJlIGluXG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuZ2V0Q2h1bmsoY3gsIGN6KTtcblxuICAgICAgLy8gR2V0IHRoZSBwZXJtdXRhdGlvbiBmcm9tIHRoZSBjaHVua1xuICAgICAgY29uc3QgcGVybXV0YXRpb24gPSBjaHVuay5nZXRQZXJtdXRhdGlvbihibG9ja1Bvc2l0aW9uKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJsb2NrIHdpdGggdGhlIGRpbWVuc2lvbiwgcG9zaXRpb24sIGFuZCBwZXJtdXRhdGlvblxuICAgICAgY29uc3QgYmxvY2sgPSBuZXcgQmxvY2sodGhpcywgYmxvY2tQb3NpdGlvbiwgcGVybXV0YXRpb24pO1xuXG4gICAgICAvLyBHZXQgdGhlIHRyYWl0cyBmcm9tIHRoZSBibG9jayBwYWxldHRlXG4gICAgICBjb25zdCB0cmFpdHMgPSB0aGlzLndvcmxkLmJsb2NrUGFsZXR0ZS5nZXRSZWdpc3RyeShcbiAgICAgICAgcGVybXV0YXRpb24udHlwZS5pZGVudGlmaWVyXG4gICAgICApO1xuXG4gICAgICAvLyBGZXRjaCBhbnkgdHJhaXRzIHRoYXQgYXBwbHkgdG8gdGhlIGJhc2UgdHlwZSBjb21wb25lbnRzXG4gICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgcGVybXV0YXRpb24udHlwZS5jb21wb25lbnRzKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdHJhaXQgZnJvbSB0aGUgYmxvY2sgcGFsZXR0ZSB1c2luZyB0aGUgaWRlbnRpZmllclxuICAgICAgICBjb25zdCB0cmFpdCA9IHRoaXMud29ybGQuYmxvY2tQYWxldHRlLmdldFRyYWl0KGlkZW50aWZpZXIpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBleGlzdHNcbiAgICAgICAgaWYgKHRyYWl0KSB0cmFpdHMucHVzaCh0cmFpdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZldGNoIGFueSB0cmFpdHMgdGhhdCBhcmUgYmxvY2sgc3RhdGUgc3BlY2lmaWNcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBlcm11dGF0aW9uLnN0YXRlKSkge1xuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHRyYWl0IGluIHRoZSByZWdpc3RyeS5cbiAgICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiB0aGlzLndvcmxkLmJsb2NrUGFsZXR0ZS5nZXRBbGxUcmFpdHMoKSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBpZGVudGlmaWVyIG1hdGNoZXMgdGhlIGtleVxuICAgICAgICAgIGlmICh0cmFpdC5pZGVudGlmaWVyID09PSBrZXkpIHtcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBsaXN0XG4gICAgICAgICAgICB0cmFpdHMucHVzaCh0cmFpdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHRyYWl0cyBhbmQgYXBwbHkgdGhlbSB0byB0aGUgYmxvY2tcbiAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdHJhaXRzKSBibG9jay5hZGRUcmFpdCh0cmFpdCk7XG5cbiAgICAgIC8vIElmIHRoZSBibG9jayBoYXMgY29tcG9uZW50cyBvciB0cmFpdHMsIHdlIHdpbGwgY2FjaGUgdGhlIGJsb2NrXG4gICAgICBpZiAoYmxvY2suY29tcG9uZW50cy5zaXplID4gMCB8fCBibG9jay50cmFpdHMuc2l6ZSA+IDApXG4gICAgICAgIHRoaXMuYmxvY2tzLnNldChoYXNoLCBibG9jayk7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgYmxvY2tcbiAgICAgIHJldHVybiBibG9jaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdG9wbW9zdCBibG9jayBpbiB3aGljaCB0aGUgcGVybXV0YXRpb24gaXMgbm90IGFpciwgYXQgdGhlIGdpdmVuIFggYW5kIFogY29vcmRpbmF0ZXMuXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIFRoZSB0b3Btb3N0IGJsb2NrIGluIHdoaWNoIHRoZSBwZXJtdXRhdGlvbiBpcyBub3QgYWlyLlxuICAgKi9cbiAgcHVibGljIGdldFRvcG1vc3RCbG9jayhwb3NpdGlvbjogSVBvc2l0aW9uKTogQmxvY2sge1xuICAgIC8vIEdldCB0aGUgY3VycmVudCBjaHVua1xuICAgIGNvbnN0IGNodW5rID0gdGhpcy5nZXRDaHVuayhwb3NpdGlvbi54ID4+IDQsIHBvc2l0aW9uLnogPj4gNCk7XG5cbiAgICAvLyBHZXQgdGhlIHRvcG1vc3QgbGV2ZWwgdGhhdCBpcyBub3QgYWlyXG4gICAgY29uc3QgdG9wTGV2ZWwgPSBjaHVuay5nZXRUb3Btb3N0TGV2ZWwocG9zaXRpb24pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBibG9ja1xuICAgIHJldHVybiB0aGlzLmdldEJsb2NrKHsgLi4ucG9zaXRpb24sIHk6IHRvcExldmVsIH0pO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHBlcm11dGF0aW9uIG9mIGEgYmxvY2sgYXQgYSBnaXZlbiBwb3NpdGlvbi5cbiAgICogVGhpcyBtZXRob2Qgd29uJ3QgY29uc3RydWN0IGEgYmxvY2sgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIGJsb2NrLlxuICAgKiBAcmV0dXJucyBUaGUgYmxvY2sgcGVybXV0YXRpb24gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRQZXJtdXRhdGlvbihwb3NpdGlvbjogSVBvc2l0aW9uKTogQmxvY2tQZXJtdXRhdGlvbiB7XG4gICAgLy8gQ29udmVydCB0aGUgcG9zaXRpb24gdG8gYSBibG9jayBwb3NpdGlvblxuICAgIGNvbnN0IGJsb2NrUG9zaXRpb24gPSBwb3NpdGlvbiBhcyBCbG9ja1Bvc2l0aW9uO1xuXG4gICAgLy8gQ29udmVydCB0aGUgYmxvY2sgcG9zaXRpb24gdG8gYSBjaHVuayBwb3NpdGlvblxuICAgIGNvbnN0IGN4ID0gYmxvY2tQb3NpdGlvbi54ID4+IDQ7XG4gICAgY29uc3QgY3ogPSBibG9ja1Bvc2l0aW9uLnogPj4gNDtcblxuICAgIC8vIEdldCB0aGUgY2h1bmsgb2YgdGhlIHByb3ZpZGVkIHBvc2l0aW9uXG4gICAgY29uc3QgY2h1bmsgPSB0aGlzLmdldENodW5rKGN4LCBjeik7XG5cbiAgICAvLyBHZXQgdGhlIHBlcm11dGF0aW9uIGZyb20gdGhlIGNodW5rXG4gICAgcmV0dXJuIGNodW5rLmdldFBlcm11dGF0aW9uKHsgeDogY3gsIHk6IGJsb2NrUG9zaXRpb24ueSwgejogY3ogfSk7XG4gIH1cblxuICAvKipcbiAgICogQnJvYWRjYXN0cyBhIG1lc3NhZ2UgdG8gYWxsIHBsYXllcnMgaW4gdGhlIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYnJvYWRjYXN0LlxuICAgKi9cbiAgcHVibGljIHNlbmRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENvbnN0cnVjdCB0aGUgdGV4dCBwYWNrZXQuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFRleHRQYWNrZXQoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcGFja2V0IGRhdGEuXG4gICAgcGFja2V0LnR5cGUgPSBUZXh0UGFja2V0VHlwZS5SYXc7XG4gICAgcGFja2V0Lm5lZWRzVHJhbnNsYXRpb24gPSBmYWxzZTtcbiAgICBwYWNrZXQuc291cmNlID0gbnVsbDtcbiAgICBwYWNrZXQubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgcGFja2V0LnBhcmFtZXRlcnMgPSBudWxsO1xuICAgIHBhY2tldC54dWlkID0gXCJcIjtcbiAgICBwYWNrZXQucGxhdGZvcm1DaGF0SWQgPSBcIlwiO1xuICAgIHBhY2tldC5maWx0ZXJlZCA9IG1lc3NhZ2U7XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQuXG4gICAgdGhpcy5icm9hZGNhc3QocGFja2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgcGxheWVycyBpbiB0aGUgZGltZW5zaW9uLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBwbGF5ZXJzLlxuICAgKi9cbiAgcHVibGljIGdldFBsYXllcnMoKTogQXJyYXk8UGxheWVyPiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmVudGl0aWVzLnZhbHVlcygpXS5maWx0ZXIoKGVudGl0eSkgPT4gZW50aXR5LmlzUGxheWVyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gZW50aXR5IGZyb20gdGhlIGRpbWVuc2lvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRFbnRpdHkoaWQ6IGJpZ2ludCwgcnVudGltZUlkID0gZmFsc2UpOiBFbnRpdHkgfCBudWxsIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgaWQgaXMgYSBydW50aW1lIGlkXG4gICAgLy8gSWYgbm90LCB3ZSB3aWxsIGdldCB0aGUgZW50aXR5IGJ5IHRoZSB1bmlxdWUgaWRcbiAgICBpZiAoIXJ1bnRpbWVJZCkgcmV0dXJuIHRoaXMuZW50aXRpZXMuZ2V0KGlkKSA/PyBudWxsO1xuICAgIC8vIElmIHRoZSBpZCBpcyBhIHJ1bnRpbWUgaWQsIHdlIHdpbGwgZ2V0IHRoZSBlbnRpdHkgYnkgdGhlIHJ1bnRpbWUgaWRcbiAgICBlbHNlXG4gICAgICByZXR1cm4gKFxuICAgICAgICBbLi4udGhpcy5lbnRpdGllcy52YWx1ZXMoKV0uZmluZCgoZW50aXR5KSA9PiBlbnRpdHkucnVudGltZUlkID09PSBpZCkgfHxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgZW50aXRpZXMgaW4gdGhlIGRpbWVuc2lvbi5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZW50aXRpZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0RW50aXRpZXMoKTogQXJyYXk8RW50aXR5PiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmVudGl0aWVzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWxscyBhIHJlZ2lvbiB3aXRoIGEgcGVybXV0YXRpb24uXG4gICAqIEBwYXJhbSBmcm9tIFRoZSBzdGFydGluZyBwb3NpdGlvbi5cbiAgICogQHBhcmFtIHRvIFRoZSBlbmRpbmcgcG9zaXRpb24uXG4gICAqIEBwYXJhbSBwZXJtdXRhdGlvbiBUaGUgcGVybXV0YXRpb24gdG8gZmlsbCB0aGUgcmVnaW9uIHdpdGguXG4gICAqL1xuICBwdWJsaWMgZmlsbChcbiAgICBmcm9tOiBJUG9zaXRpb24sXG4gICAgdG86IElQb3NpdGlvbixcbiAgICBwZXJtdXRhdGlvbjogQmxvY2tQZXJtdXRhdGlvblxuICApOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIG1pbiBhbmQgbWF4IGNvb3JkaW5hdGVzXG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKGZyb20ueCwgdG8ueCk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKGZyb20ueSwgdG8ueSk7XG4gICAgY29uc3QgbWluWiA9IE1hdGgubWluKGZyb20ueiwgdG8ueik7XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KGZyb20ueCwgdG8ueCk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KGZyb20ueSwgdG8ueSk7XG4gICAgY29uc3QgbWF4WiA9IE1hdGgubWF4KGZyb20ueiwgdG8ueik7XG5cbiAgICAvLyBIb2xkIHRoZSB1cGRhdGVkIGNodW5rc1xuICAgIGNvbnN0IHVwZGF0ZWRDaHVua3MgPSBuZXcgU2V0PENodW5rPigpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBjb29yZGluYXRlc1xuICAgIGZvciAobGV0IHggPSBtaW5YOyB4IDw9IG1heFg7IHgrKykge1xuICAgICAgZm9yIChsZXQgeSA9IG1pblk7IHkgPD0gbWF4WTsgeSsrKSB7XG4gICAgICAgIGZvciAobGV0IHogPSBtaW5aOyB6IDw9IG1heFo7IHorKykge1xuICAgICAgICAgIC8vIEdldCB0aGUgY2h1bmsgb2YgdGhlIGJsb2NrXG4gICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLmdldENodW5rKHggPj4gNCwgeiA+PiA0KTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrXG4gICAgICAgICAgY2h1bmsuc2V0UGVybXV0YXRpb24oeyB4LCB5LCB6IH0sIHBlcm11dGF0aW9uKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgY2h1bmsgdG8gdGhlIHVwZGF0ZWQgY2h1bmtzXG4gICAgICAgICAgdXBkYXRlZENodW5rcy5hZGQoY2h1bmspO1xuXG4gICAgICAgICAgLy8gU2V0IHRoZSBjaHVuayB0byBkaXJ0eVxuICAgICAgICAgIGNodW5rLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB0aGUgdXBkYXRlZCBjaHVua3NcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHVwZGF0ZWRDaHVua3MpIHRoaXMuc2V0Q2h1bmsoY2h1bmspO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhbiBlbnRpdHkgaW4gdGhlIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgZW50aXR5LlxuICAgKiBAcmV0dXJucyBUaGUgZW50aXR5IHRoYXQgd2FzIHNwYXduZWQuXG4gICAqL1xuICBwdWJsaWMgc3Bhd25FbnRpdHkoXG4gICAgdHlwZTogRW50aXR5SWRlbnRpZmllciB8IEVudGl0eVR5cGUsXG4gICAgcG9zaXRpb246IFZlY3RvcjNmXG4gICk6IEVudGl0eSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEVudGl0eSBpbnN0YW5jZSB3aXRoIHRoZSBkaW1lbnNpb24gYW5kIHR5cGVcbiAgICBjb25zdCBlbnRpdHkgPSBuZXcgRW50aXR5KHRoaXMsIHR5cGUpO1xuXG4gICAgLy8gQXMgYSBTZXJlbml0eSBzdGFuZGFyZCwgd2Ugd2lsbCBhZGQgdGhlIGdyYXZpdHksIHBoeXNpY3MsIG1vdmVtZW50IHRyYWl0cyB0byB0aGUgZW50aXR5XG4gICAgZW50aXR5LmFkZFRyYWl0KEVudGl0eUdyYXZpdHlUcmFpdCk7XG4gICAgZW50aXR5LmFkZFRyYWl0KEVudGl0eVBoeXNpY3NUcmFpdCk7XG4gICAgZW50aXR5LmFkZFRyYWl0KEVudGl0eU1vdmVtZW50VHJhaXQpO1xuXG4gICAgLy8gU2V0IHRoZSBlbnRpdHkgcG9zaXRpb25cbiAgICBlbnRpdHkucG9zaXRpb24ueCA9IHBvc2l0aW9uLng7XG4gICAgZW50aXR5LnBvc2l0aW9uLnkgPSBwb3NpdGlvbi55O1xuICAgIGVudGl0eS5wb3NpdGlvbi56ID0gcG9zaXRpb24uejtcblxuICAgIC8vIFNwYXduIHRoZSBlbnRpdHlcbiAgICByZXR1cm4gZW50aXR5LnNwYXduKCk7XG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGFuIGl0ZW0gaW4gdGhlIGRpbWVuc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGl0ZW1TdGFjayBUaGUgaXRlbSBzdGFjayBvZiB0aGUgaXRlbS5cbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbS5cbiAgICogQHJldHVybnMgVGhlIGVudGl0eSB0aGF0IHdhcyBzcGF3bmVkLlxuICAgKi9cbiAgcHVibGljIHNwYXduSXRlbTxUIGV4dGVuZHMga2V5b2YgSXRlbXM+KFxuICAgIGl0ZW1TdGFjazogSXRlbVN0YWNrPFQ+LFxuICAgIHBvc2l0aW9uOiBWZWN0b3IzZlxuICApOiBFbnRpdHkge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBFbnRpdHkgaW5zdGFuY2VcbiAgICBjb25zdCBlbnRpdHkgPSBuZXcgRW50aXR5KHRoaXMsIEVudGl0eUlkZW50aWZpZXIuSXRlbSk7XG5cbiAgICAvLyBTZXQgdGhlIHdvcmxkIGluIHRoZSBpdGVtIHN0YWNrIGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICBpZiAoIWl0ZW1TdGFjay53b3JsZCkgaXRlbVN0YWNrLndvcmxkID0gdGhpcy53b3JsZDtcblxuICAgIC8vIFNldCB0aGUgZW50aXR5IHBvc2l0aW9uXG4gICAgZW50aXR5LnBvc2l0aW9uLnggPSBwb3NpdGlvbi54O1xuICAgIGVudGl0eS5wb3NpdGlvbi55ID0gcG9zaXRpb24ueTtcbiAgICBlbnRpdHkucG9zaXRpb24ueiA9IHBvc2l0aW9uLno7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgaXRlbSB0cmFpdCwgdGhpcyB3aWxsIHJlZ2lzdGVyIHRoZSBpdGVtIHRvIHRoZSBlbnRpdHlcbiAgICBjb25zdCB0cmFpdCA9IG5ldyBFbnRpdHlJdGVtU3RhY2tUcmFpdChlbnRpdHkpO1xuICAgIHRyYWl0Lml0ZW1TdGFjayA9IGl0ZW1TdGFjaztcblxuICAgIC8vIEFkZCBncmF2aXR5IGFuZCBwaHlzaWNzIHRyYWl0cyB0byB0aGUgZW50aXR5XG4gICAgZW50aXR5LmFkZFRyYWl0KEVudGl0eUdyYXZpdHlUcmFpdCk7XG4gICAgZW50aXR5LmFkZFRyYWl0KEVudGl0eVBoeXNpY3NUcmFpdCk7XG4gICAgZW50aXR5LmFkZFRyYWl0KEVudGl0eU1vdmVtZW50VHJhaXQpO1xuXG4gICAgLy8gU3Bhd24gdGhlIGl0ZW0gZW50aXR5XG4gICAgZW50aXR5LnNwYXduKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGl0ZW0gZW50aXR5XG4gICAgcmV0dXJuIGVudGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGNvbW1hbmQgaW4gdGhlIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybnMgVGhlIHJlc3BvbnNlIG9mIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcHVibGljIGV4ZWN1dGVDb21tYW5kPFQgPSB1bmtub3duPihjb21tYW5kOiBzdHJpbmcpOiBDb21tYW5kUmVzcG9uc2U8VD4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjb21tYW5kIHN0YXJ0cyB3aXRoIGEgc2xhc2gsIHJlbW92ZSBpdCBpZiBpdCBkb2VzIG5vdFxuICAgIGlmIChjb21tYW5kLnN0YXJ0c1dpdGgoXCIvXCIpKSBjb21tYW5kID0gY29tbWFuZC5zbGljZSgxKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjb21tYW5kIGV4ZWN1dGUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IG5ldyBDb21tYW5kRXhlY3V0aW9uU3RhdGUoXG4gICAgICB0aGlzLndvcmxkLmNvbW1hbmRzLmdldEFsbCgpLFxuICAgICAgY29tbWFuZCxcbiAgICAgIHRoaXNcbiAgICApO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGUgY29tbWFuZCBzdGF0ZVxuICAgIHJldHVybiBzdGF0ZS5leGVjdXRlKCkgYXMgQ29tbWFuZFJlc3BvbnNlPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlIGFuIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uIGFmdGVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aWNrcy5cbiAgICogQHBhcmFtIHRpY2tzIFRoZSBhbW91bnQgb2YgdGlja3MgdG8gd2FpdCBiZWZvcmUgdGhlIHNjaGVkdWxlIGlzIGNvbXBsZXRlLlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCB0aWNrIHNjaGVkdWxlLlxuICAgKi9cbiAgcHVibGljIHNjaGVkdWxlKHRpY2tzOiBudW1iZXIpOiBUaWNrU2NoZWR1bGUge1xuICAgIC8vIENyZWF0ZSBhIG5ldyB0aWNrIHNjaGVkdWxlXG4gICAgY29uc3Qgc2NoZWR1bGUgPSBuZXcgVGlja1NjaGVkdWxlKHRpY2tzLCB0aGlzKTtcblxuICAgIC8vIEFkZCB0aGUgc2NoZWR1bGUgdG8gdGhlIHdvcmxkXG4gICAgdGhpcy53b3JsZC5zY2hlZHVsZXMuYWRkKHNjaGVkdWxlKTtcblxuICAgIC8vIFJldHVybiB0aGUgc2NoZWR1bGVcbiAgICByZXR1cm4gc2NoZWR1bGU7XG4gIH1cblxuICAvKipcbiAgICogQnJvYWRjYXN0IHBhY2tldHMgdG8gYWxsIHRoZSBwbGF5ZXJzIGluIHRoZSBkaW1lbnNpb24uXG4gICAqIEBwYXJhbSBwYWNrZXRzIFRoZSBwYWNrZXRzIHRvIGJyb2FkY2FzdC5cbiAgICovXG4gIHB1YmxpYyBicm9hZGNhc3QoLi4ucGFja2V0czogQXJyYXk8RGF0YVBhY2tldD4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBsYXllciBvZiB0aGlzLmdldFBsYXllcnMoKSkgcGxheWVyLnNlbmQoLi4ucGFja2V0cyk7XG4gIH1cblxuICAvKipcbiAgICogQnJvYWRjYXN0IHBhY2tldHMgdG8gYWxsIHRoZSBwbGF5ZXJzIGluIHRoZSBkaW1lbnNpb24gaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSBwYWNrZXRzIFRoZSBwYWNrZXRzIHRvIGJyb2FkY2FzdC5cbiAgICovXG4gIHB1YmxpYyBicm9hZGNhc3RJbW1lZGlhdGUoLi4ucGFja2V0czogQXJyYXk8RGF0YVBhY2tldD4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBsYXllciBvZiB0aGlzLmdldFBsYXllcnMoKSkgcGxheWVyLnNlbmRJbW1lZGlhdGUoLi4ucGFja2V0cyk7XG4gIH1cblxuICAvKipcbiAgICogQnJvYWRjYXN0IHBhY2tldHMgdG8gYWxsIHRoZSBwbGF5ZXJzIGluIHRoZSBkaW1lbnNpb24gZXhjZXB0IHRoZSBzcGVjaWZpZWQgcGxheWVyLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdG8gZXhjbHVkZSBmcm9tIHRoZSBicm9hZGNhc3QuXG4gICAqIEBwYXJhbSBwYWNrZXRzIFRoZSBwYWNrZXRzIHRvIGJyb2FkY2FzdC5cbiAgICovXG4gIHB1YmxpYyBicm9hZGNhc3RFeGNlcHQocGxheWVyOiBQbGF5ZXIsIC4uLnBhY2tldHM6IEFycmF5PERhdGFQYWNrZXQ+KTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBhIHBsYXllciBhbmQgaXMgbm90IHRoZSBwbGF5ZXIgdG8gZXhjbHVkZVxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIHRoaXMuZW50aXRpZXMudmFsdWVzKCkpXG4gICAgICBpZiAoZW50aXR5LmlzUGxheWVyKCkgJiYgZW50aXR5ICE9PSBwbGF5ZXIpIGVudGl0eS5zZW5kKC4uLnBhY2tldHMpO1xuICB9XG59XG5cbmV4cG9ydCB7IERpbWVuc2lvbiwgRGVmYXVsdERpbWVuc2lvblByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyBEaW1lbnNpb24gfSBmcm9tIFwiLi9kaW1lbnNpb25cIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuL3dvcmxkXCI7XG5cbmNsYXNzIFRpY2tTY2hlZHVsZSB7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHRpY2tzIHRvIHdhaXQgYmVmb3JlIHRoZSBzY2hlZHVsZSBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzY2hlZHVsZWRUaWNrOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0aWNrIGF0IHdoaWNoIHRoZSBzY2hlZHVsZSB3aWxsIGJlIGNvbXBsZXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbXBsZXRlVGljazogYmlnaW50O1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2tzIHRvIGNhbGwgd2hlbiB0aGUgc2NoZWR1bGUgaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FsbGJhY2tzID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHRpY2sgc2NoZWR1bGUuXG4gICAqIEBwYXJhbSBzY2hlZHVsZWRUaWNrIFRoZSBhbW91bnQgb2YgdGlja3MgdG8gd2FpdCBiZWZvcmUgdGhlIHNjaGVkdWxlIGlzIGNvbXBsZXRlLlxuICAgKiBAcGFyYW0gd29ybGRPckRpbWVuc2lvbiBUaGUgd29ybGQgb3IgZGltZW5zaW9uIHRvIHNjaGVkdWxlIHRoZSB0aWNrIGluLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNjaGVkdWxlZFRpY2s6IGJpZ2ludCB8IG51bWJlcixcbiAgICB3b3JsZE9yRGltZW5zaW9uOiBXb3JsZCB8IERpbWVuc2lvblxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNjaGVkdWxlZCB0aWNrXG4gICAgdGhpcy5zY2hlZHVsZWRUaWNrID0gQmlnSW50KHNjaGVkdWxlZFRpY2spO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBmcm9tIHRoZSBjb25zdHJ1Y3RvclxuICAgIGNvbnN0IHdvcmxkID1cbiAgICAgIHdvcmxkT3JEaW1lbnNpb24gaW5zdGFuY2VvZiBEaW1lbnNpb25cbiAgICAgICAgPyB3b3JsZE9yRGltZW5zaW9uLndvcmxkXG4gICAgICAgIDogd29ybGRPckRpbWVuc2lvbjtcblxuICAgIC8vIEdldCB0aGUgY3VycmVudCB0aWNrXG4gICAgY29uc3QgY3VycmVudFRpY2sgPSB3b3JsZC5jdXJyZW50VGljaztcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgY29tcGxldGUgdGlja1xuICAgIHRoaXMuY29tcGxldGVUaWNrID0gY3VycmVudFRpY2sgKyB0aGlzLnNjaGVkdWxlZFRpY2s7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYWxsIHRoZSBjYWxsYmFja3MgaW4gdGhlIHNjaGVkdWxlLlxuICAgKi9cbiAgcHVibGljIGV4ZWN1dGUoKTogdm9pZCB7XG4gICAgLy8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrc1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIGNhbGxiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIHRvIHRoZSBzY2hlZHVsZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBhZGQuXG4gICAqL1xuICBwdWJsaWMgb24oY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIHRvIHRoZSBzY2hlZHVsZVxuICAgIHRoaXMuY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyB0aGUgc2NoZWR1bGUuXG4gICAqL1xuICBwdWJsaWMgY2FuY2VsKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGFsbCB0aGUgY2FsbGJhY2tzXG4gICAgdGhpcy5jYWxsYmFja3MuY2xlYXIoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBUaWNrU2NoZWR1bGUgfTtcbiIsICJpbXBvcnQge1xuICBSZW1vdmVPYmplY3RpdmVQYWNrZXQsXG4gIFNjb3JlYm9hcmRBY3Rpb25UeXBlLFxuICBTZXREaXNwbGF5T2JqZWN0aXZlUGFja2V0LFxuICBTZXRTY29yZVBhY2tldCxcbiAgdHlwZSBEaXNwbGF5U2xvdFR5cGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFNjb3JlYm9hcmRPYmplY3RpdmUgfSBmcm9tIFwiLi9vYmplY3RpdmVcIjtcblxuaW1wb3J0IHR5cGUgeyBTY29yZWJvYXJkT2JqZWN0aXZlRGlzcGxheU9wdGlvbnMgfSBmcm9tIFwiLi9kaXNwbGF5LW9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vd29ybGRcIjtcblxuY2xhc3MgU2NvcmVib2FyZCB7XG4gIC8qKlxuICAgKiBUaGUgd29ybGQgdGhlIHNjb3JlYm9hcmQgaXMgYmluZGVkIHRvLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHdvcmxkOiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdGl2ZXMgb2YgdGhlIHNjb3JlYm9hcmQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb2JqZWN0aXZlcyA9IG5ldyBTZXQ8U2NvcmVib2FyZE9iamVjdGl2ZT4oKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgb2JqZWN0aXZlcyBpbiB0aGUgZGlzcGxheSBzbG90cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzbG90cyA9IG5ldyBNYXA8RGlzcGxheVNsb3RUeXBlLCBTY29yZWJvYXJkT2JqZWN0aXZlPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHNjb3JlYm9hcmQuXG4gICAqIEBwYXJhbSB3b3JsZCBUaGUgd29ybGQgdGhlIHNjb3JlYm9hcmQgd2lsbCBiZSBiaW5kZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Iod29ybGQ6IFdvcmxkKSB7XG4gICAgdGhpcy53b3JsZCA9IHdvcmxkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG9iamVjdGl2ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG9iamVjdGl2ZS5cbiAgICogQHJldHVybnMgVGhlIG9iamVjdGl2ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgb3IgdW5kZWZpbmVkIGlmIG5vIG9iamVjdGl2ZSB3YXMgZm91bmQuXG4gICAqL1xuICBwdWJsaWMgZ2V0T2JqZWN0aXZlKG5hbWU6IHN0cmluZyk6IFNjb3JlYm9hcmRPYmplY3RpdmUgfCB1bmRlZmluZWQge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgb2JqZWN0aXZlcyBhbmQgcmV0dXJuIHRoZSBvYmplY3RpdmUgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS5cbiAgICBmb3IgKGNvbnN0IG9iamVjdGl2ZSBvZiB0aGlzLm9iamVjdGl2ZXMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBvYmplY3RpdmUgbmFtZSBtYXRjaGVzIHRoZSBuYW1lLlxuICAgICAgaWYgKG9iamVjdGl2ZS5vYmplY3RpdmVOYW1lID09PSBuYW1lKSByZXR1cm4gb2JqZWN0aXZlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gb2JqZWN0aXZlXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IG9iamVjdGl2ZSB0byB0aGUgc2NvcmVib2FyZC5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG9iamVjdGl2ZS5cbiAgICogQHBhcmFtIGRpc3BsYXkgVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgb2JqZWN0aXZlLlxuICAgKiBAcmV0dXJucyBUaGUgb2JqZWN0aXZlIHRoYXQgd2FzIGFkZGVkLlxuICAgKi9cbiAgcHVibGljIGFkZE9iamVjdGl2ZShuYW1lOiBzdHJpbmcsIGRpc3BsYXk/OiBzdHJpbmcpOiBTY29yZWJvYXJkT2JqZWN0aXZlIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgb2JqZWN0aXZlIGFscmVhZHkgZXhpc3RzLlxuICAgIGlmICh0aGlzLmdldE9iamVjdGl2ZShuYW1lKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT2JqZWN0aXZlIHdpdGggbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBleGlzdHNgKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBvYmplY3RpdmUgYW5kIGFkZCBpdCB0byB0aGUgc2NvcmVib2FyZC5cbiAgICBjb25zdCBvYmplY3RpdmUgPSBuZXcgU2NvcmVib2FyZE9iamVjdGl2ZSh0aGlzLndvcmxkLCBuYW1lLCBkaXNwbGF5KTtcblxuICAgIC8vIEFkZCB0aGUgb2JqZWN0aXZlIHRvIHRoZSBzY29yZWJvYXJkLlxuICAgIHRoaXMub2JqZWN0aXZlcy5hZGQob2JqZWN0aXZlKTtcblxuICAgIC8vIFJldHVybiB0aGUgb2JqZWN0aXZlLlxuICAgIHJldHVybiBvYmplY3RpdmU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgb2JqZWN0aXZlIGZyb20gdGhlIHNjb3JlYm9hcmQuXG4gICAqIEBwYXJhbSBvYmplY3RpdmUgVGhlIG9iamVjdGl2ZSB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlT2JqZWN0aXZlKG9iamVjdGl2ZTogc3RyaW5nIHwgU2NvcmVib2FyZE9iamVjdGl2ZSk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgb2JqZWN0aXZlIGJ5IG5hbWUgaWYgaXQgaXMgYSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIG9iamVjdGl2ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgZE9iamVjdGl2ZSA9IHRoaXMuZ2V0T2JqZWN0aXZlKG9iamVjdGl2ZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBvYmplY3RpdmUgZXhpc3RzXG4gICAgICBpZiAoIWRPYmplY3RpdmUpIHRocm93IG5ldyBFcnJvcihcIk9iamVjdGl2ZSBkb2VzIG5vdCBleGlzdFwiKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBvYmplY3RpdmUgZnJvbSB0aGUgc2NvcmVib2FyZFxuICAgICAgdGhpcy5vYmplY3RpdmVzLmRlbGV0ZShkT2JqZWN0aXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBvYmplY3RpdmUgZnJvbSB0aGUgc2NvcmVib2FyZFxuICAgICAgdGhpcy5vYmplY3RpdmVzLmRlbGV0ZShvYmplY3RpdmUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBvYmplY3RpdmUgYXQgdGhlIGRpc3BsYXkgc2xvdC5cbiAgICogQHBhcmFtIHNsb3QgVGhlIGRpc3BsYXkgc2xvdCB0byBnZXQgdGhlIG9iamVjdGl2ZSBhdC5cbiAgICogQHJldHVybnMgVGhlIG9iamVjdGl2ZSBhdCB0aGUgZGlzcGxheSBzbG90LCBvciB1bmRlZmluZWQgaWYgbm8gb2JqZWN0aXZlIHdhcyBmb3VuZC5cbiAgICovXG4gIHB1YmxpYyBnZXRPYmplY3RpdmVBdERpc3BsYXlTbG90KFxuICAgIHNsb3Q6IERpc3BsYXlTbG90VHlwZVxuICApOiBTY29yZWJvYXJkT2JqZWN0aXZlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zbG90cy5nZXQoc2xvdCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb2JqZWN0aXZlIGF0IHRoZSBkaXNwbGF5IHNsb3QuXG4gICAqIEBwYXJhbSBzbG90IFRoZSBkaXNwbGF5IHNsb3QgdG8gc2V0IHRoZSBvYmplY3RpdmUgYXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHRvIHNldCB0aGUgb2JqZWN0aXZlIHdpdGguXG4gICAqIEByZXR1cm5zIFRoZSBvYmplY3RpdmUgdGhhdCB3YXMgc2V0LlxuICAgKi9cbiAgcHVibGljIHNldE9iamVjdGl2ZUF0RGlzcGxheVNsb3QoXG4gICAgc2xvdDogRGlzcGxheVNsb3RUeXBlLFxuICAgIG9wdGlvbnM6IFNjb3JlYm9hcmRPYmplY3RpdmVEaXNwbGF5T3B0aW9uc1xuICApOiBTY29yZWJvYXJkT2JqZWN0aXZlIHtcbiAgICAvLyBTZXBlcmF0ZSB0aGUgb3B0aW9ucyBpbnRvIG9iamVjdGl2ZSwgc29ydE9yZGVyLCBhbmQgcGxheWVyXG4gICAgY29uc3QgeyBvYmplY3RpdmUsIHNvcnRPcmRlciwgcGxheWVyIH0gPSBvcHRpb25zO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGRpc3BsYXkgb2JqZWN0aXZlIHBhY2tldFxuICAgIGNvbnN0IGRpc3BsYXkgPSBuZXcgU2V0RGlzcGxheU9iamVjdGl2ZVBhY2tldCgpO1xuICAgIGRpc3BsYXkuZGlzcGxheVNsb3QgPSBzbG90O1xuICAgIGRpc3BsYXkub2JqZWN0aXZlTmFtZSA9IG9iamVjdGl2ZS5vYmplY3RpdmVOYW1lO1xuICAgIGRpc3BsYXkuZGlzcGxheU5hbWUgPSBvYmplY3RpdmUuZGlzcGxheU5hbWU7XG4gICAgZGlzcGxheS5jcml0ZXJpYU5hbWUgPSBcImR1bW15XCI7XG4gICAgZGlzcGxheS5zb3J0T3JkZXIgPSBzb3J0T3JkZXI7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc2V0IHNjb3JlIHBhY2tldFxuICAgIGNvbnN0IHNjb3JlcyA9IG5ldyBTZXRTY29yZVBhY2tldCgpO1xuICAgIHNjb3Jlcy50eXBlID0gU2NvcmVib2FyZEFjdGlvblR5cGUuQ2hhbmdlO1xuICAgIHNjb3Jlcy5lbnRyaWVzID0gWy4uLm9iamVjdGl2ZS5wYXJ0aWNpcGFudHNdLm1hcCgoW2lkZW50aXR5LCBzY29yZV0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjb3JlYm9hcmRJZDogaWRlbnRpdHkuaWRlbnRpZmllcixcbiAgICAgICAgb2JqZWN0aXZlTmFtZTogb2JqZWN0aXZlLm9iamVjdGl2ZU5hbWUsXG4gICAgICAgIHNjb3JlLFxuICAgICAgICBpZGVudGl0eVR5cGU6IGlkZW50aXR5LnR5cGUsXG4gICAgICAgIGFjdG9yVW5pcXVlSWQ6IGlkZW50aXR5LmVudGl0eT8udW5pcXVlSWQgPz8gbnVsbCxcbiAgICAgICAgY3VzdG9tTmFtZTogaWRlbnRpdHkuZGlzcGxheU5hbWVcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBTZW5kIHRoZSBkaXNwbGF5IGFuZCBzY29yZXMgdG8gdGhlIHBsYXllciBpZiBzcGVjaWZpZWQsIG90aGVyd2lzZSBicm9hZGNhc3QgaXQgdG8gdGhlIHdvcmxkXG4gICAgaWYgKHBsYXllcikge1xuICAgICAgcGxheWVyLnNlbmQoZGlzcGxheSwgc2NvcmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3JsZC5icm9hZGNhc3QoZGlzcGxheSwgc2NvcmVzKTtcbiAgICB9XG4gICAgLy8gU2V0IHRoZSBvYmplY3RpdmUgYXQgdGhlIGRpc3BsYXkgc2xvdFxuICAgIHRoaXMuc2xvdHMuc2V0KHNsb3QsIG9iamVjdGl2ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG9iamVjdGl2ZSB0aGF0IHdhcyBzZXRcbiAgICByZXR1cm4gb2JqZWN0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgb2JqZWN0aXZlIGF0IHRoZSBkaXNwbGF5IHNsb3QuXG4gICAqIEBwYXJhbSBzbG90IFRoZSBkaXNwbGF5IHNsb3QgdG8gY2xlYXIgdGhlIG9iamVjdGl2ZSBhdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgdG8gY2xlYXIgdGhlIG9iamVjdGl2ZSB3aXRoLlxuICAgKiBAcmV0dXJucyBUaGUgb2JqZWN0aXZlIHRoYXQgd2FzIGNsZWFyZWQuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJPYmplY3RpdmVBdERpc3BsYXlTbG90KFxuICAgIHNsb3Q6IERpc3BsYXlTbG90VHlwZSxcbiAgICBvcHRpb25zPzogU2NvcmVib2FyZE9iamVjdGl2ZURpc3BsYXlPcHRpb25zXG4gICk6IFNjb3JlYm9hcmRPYmplY3RpdmUgfCB1bmRlZmluZWQge1xuICAgIC8vIEdldCB0aGUgb2JqZWN0aXZlIGF0IHRoZSBkaXNwbGF5IHNsb3RcbiAgICBjb25zdCBvYmplY3RpdmUgPSB0aGlzLnNsb3RzLmdldChzbG90KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBvYmplY3RpdmUgZXhpc3RzXG4gICAgaWYgKCFvYmplY3RpdmUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgcmVtb3ZlIG9iamVjdGl2ZSBwYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgUmVtb3ZlT2JqZWN0aXZlUGFja2V0KCk7XG4gICAgcGFja2V0Lm9iamVjdGl2ZU5hbWUgPSBvYmplY3RpdmUub2JqZWN0aXZlTmFtZTtcblxuICAgIGlmIChvcHRpb25zPy5wbGF5ZXIpIHtcbiAgICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgICBvcHRpb25zLnBsYXllci5zZW5kKHBhY2tldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIHRoZSB3b3JsZFxuICAgICAgdGhpcy53b3JsZC5icm9hZGNhc3QocGFja2V0KTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSBvYmplY3RpdmUgZnJvbSB0aGUgZGlzcGxheSBzbG90XG4gICAgICB0aGlzLnNsb3RzLmRlbGV0ZShzbG90KTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdGhlIG9iamVjdGl2ZSBmcm9tIHRoZSBkaXNwbGF5IHNsb3RcbiAgICByZXR1cm4gb2JqZWN0aXZlO1xuICB9XG59XG5cbmV4cG9ydCB7IFNjb3JlYm9hcmQgfTtcbiIsICJpbXBvcnQgeyBTY29yZWJvYXJkQWN0aW9uVHlwZSwgU2V0U2NvcmVQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBTY29yZWJvYXJkSWRlbnRpdHkgfSBmcm9tIFwiLi9pZGVudGl0eVwiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5pbXBvcnQgdHlwZSB7IFNjb3JlYm9hcmQgfSBmcm9tIFwiLi9zY29yZWJvYXJkXCI7XG5cbmNsYXNzIFNjb3JlYm9hcmRPYmplY3RpdmUge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRoZSBvYmplY3RpdmUgaXMgYmluZGVkIHRvLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHdvcmxkOiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNjb3JlYm9hcmQgdGhlIG9iamVjdGl2ZSBpcyBiaW5kZWQgdG8uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2NvcmVib2FyZDogU2NvcmVib2FyZDtcblxuICAvKipcbiAgICogVGhlIHBhcnRpY2lwYW50cyBvZiB0aGUgb2JqZWN0aXZlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpY2lwYW50cyA9IG5ldyBNYXA8U2NvcmVib2FyZElkZW50aXR5LCBudW1iZXI+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvYmplY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb2JqZWN0aXZlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBvYmplY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgZGlzcGxheU5hbWU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ybGQ6IFdvcmxkLFxuICAgIG9iamVjdGl2ZU5hbWU6IHN0cmluZyxcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLndvcmxkID0gd29ybGQ7XG4gICAgdGhpcy5zY29yZWJvYXJkID0gd29ybGQuc2NvcmVib2FyZDtcbiAgICB0aGlzLm9iamVjdGl2ZU5hbWUgPSBvYmplY3RpdmVOYW1lO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZSA/PyBvYmplY3RpdmVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGlkZW50aXR5IGlzIGEgcGFydGljaXBhbnQgaW4gdGhlIG9iamVjdGl2ZS5cbiAgICogQHBhcmFtIHBhcnRpY2lwYW50IFRoZSBpZGVudGl0eSB0byBjaGVjay5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgaWRlbnRpdHkgaXMgYSBwYXJ0aWNpcGFudCBpbiB0aGUgb2JqZWN0aXZlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaGFzUGFydGljaXBhbnQoXG4gICAgcGFydGljaXBhbnQ6IEVudGl0eSB8IHN0cmluZyB8IFNjb3JlYm9hcmRJZGVudGl0eVxuICApOiBib29sZWFuIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBhcnRpY2lwYW50cyBhbmQgcmV0dXJuIHRoZSBpZGVudGl0eSB3aXRoIHRoZSBtYXRjaGluZyBwYXJ0aWNpcGFudC5cbiAgICBmb3IgKGNvbnN0IFtpZGVudGl0eV0gb2YgdGhpcy5wYXJ0aWNpcGFudHMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJ0aWNpcGFudCBpcyBzY29yZWJvYXJkIGlkZW50aXR5XG4gICAgICAvLyBBbmQgY2hlY2sgaWYgdGhlIHNjb3JlYm9hcmQgaWRlbnRpdHkgaXMgdGhlIHNhbWUgYXMgdGhlIHBhcnRpY2lwYW50XG4gICAgICBpZiAocGFydGljaXBhbnQgaW5zdGFuY2VvZiBTY29yZWJvYXJkSWRlbnRpdHkgJiYgaWRlbnRpdHkgPT09IHBhcnRpY2lwYW50KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcnRpY2lwYW50IGlzIGEgZW50aXR5XG4gICAgICAvLyBBbmQgY2hlY2sgaWYgdGhlIGVudGl0eSBpZGVudGl0eSBpcyB0aGUgc2FtZSBhcyB0aGUgcGFydGljaXBhbnRcbiAgICAgIGlmIChwYXJ0aWNpcGFudCBpbnN0YW5jZW9mIEVudGl0eSAmJiBpZGVudGl0eS5lbnRpdHkgPT09IHBhcnRpY2lwYW50KVxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcnRpY2lwYW50IGlzIGEgc3RyaW5nXG4gICAgICAvLyBBbmQgY2hlY2sgaWYgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgaWRlbnRpdHkgaXMgdGhlIHNhbWUgYXMgdGhlIHBhcnRpY2lwYW50XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBwYXJ0aWNpcGFudCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICBpZGVudGl0eS5kaXNwbGF5TmFtZSA9PT0gcGFydGljaXBhbnRcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgbm8gaWRlbnRpdHkgd2FzIGZvdW5kLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgaWRlbnRpdHkgZnJvbSB0aGUgb2JqZWN0aXZlLlxuICAgKiBAcGFyYW0gcGFydGljaXBhbnQgVGhlIGlkZW50aXR5IHRvIGdldC5cbiAgICogQHJldHVybnMgVGhlIGlkZW50aXR5IGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGdldFBhcnRpY2lwYW50KFxuICAgIHBhcnRpY2lwYW50OiBFbnRpdHkgfCBzdHJpbmcgfCBTY29yZWJvYXJkSWRlbnRpdHlcbiAgKTogU2NvcmVib2FyZElkZW50aXR5IHwgbnVsbCB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBwYXJ0aWNpcGFudHMgYW5kIHJldHVybiB0aGUgaWRlbnRpdHkgd2l0aCB0aGUgbWF0Y2hpbmcgcGFydGljaXBhbnQuXG4gICAgZm9yIChjb25zdCBbaWRlbnRpdHldIG9mIHRoaXMucGFydGljaXBhbnRzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFydGljaXBhbnQgaXMgc2NvcmVib2FyZCBpZGVudGl0eVxuICAgICAgLy8gQW5kIGNoZWNrIGlmIHRoZSBzY29yZWJvYXJkIGlkZW50aXR5IGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJ0aWNpcGFudFxuICAgICAgaWYgKHBhcnRpY2lwYW50IGluc3RhbmNlb2YgU2NvcmVib2FyZElkZW50aXR5ICYmIGlkZW50aXR5ID09PSBwYXJ0aWNpcGFudClcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5O1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFydGljaXBhbnQgaXMgYSBlbnRpdHlcbiAgICAgIC8vIEFuZCBjaGVjayBpZiB0aGUgZW50aXR5IGlkZW50aXR5IGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJ0aWNpcGFudFxuICAgICAgaWYgKHBhcnRpY2lwYW50IGluc3RhbmNlb2YgRW50aXR5ICYmIGlkZW50aXR5LmVudGl0eSA9PT0gcGFydGljaXBhbnQpXG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcnRpY2lwYW50IGlzIGEgc3RyaW5nXG4gICAgICAvLyBBbmQgY2hlY2sgaWYgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgaWRlbnRpdHkgaXMgdGhlIHNhbWUgYXMgdGhlIHBhcnRpY2lwYW50XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBwYXJ0aWNpcGFudCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICBpZGVudGl0eS5kaXNwbGF5TmFtZSA9PT0gcGFydGljaXBhbnRcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5O1xuICAgIH1cblxuICAgIC8vIFJldHVybiBudWxsIGlmIG5vIGlkZW50aXR5IHdhcyBmb3VuZC5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBwYXJ0aWNpcGFudHMgaW4gdGhlIG9iamVjdGl2ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRQYXJ0aWNpcGFudHMoKTogQXJyYXk8U2NvcmVib2FyZElkZW50aXR5PiB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnBhcnRpY2lwYW50cy5rZXlzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwYXJ0aWNpcGFudCB0byB0aGUgb2JqZWN0aXZlLlxuICAgKiBAcGFyYW0gcGFydGljaXBhbnQgVGhlIGlkZW50aXR5IG9mIHRoZSBwYXJ0aWNpcGFudCB0byBhZGQuXG4gICAqIEBwYXJhbSBpbml0aWFsU2NvcmUgVGhlIGluaXRpYWwgc2NvcmUgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgKi9cbiAgcHVibGljIGFkZFBhcnRpY2lwYW50KFxuICAgIHBhcnRpY2lwYW50OiBFbnRpdHkgfCBzdHJpbmcgfCBTY29yZWJvYXJkSWRlbnRpdHksXG4gICAgaW5pdGlhbFNjb3JlID0gMFxuICApOiBTY29yZWJvYXJkSWRlbnRpdHkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwYXJ0aWNpcGFudCBpcyBhbHJlYWR5IGluIHRoZSBvYmplY3RpdmUuXG4gICAgaWYgKHRoaXMuaGFzUGFydGljaXBhbnQocGFydGljaXBhbnQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFydGljaXBhbnQgaXMgYWxyZWFkeSBpbiB0aGUgb2JqZWN0aXZlLlwiKTtcblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGlkZW50aXR5IG9mIHRoZSBwYXJ0aWNpcGFudC5cbiAgICBjb25zdCBpZGVudGl0eSA9XG4gICAgICBwYXJ0aWNpcGFudCBpbnN0YW5jZW9mIFNjb3JlYm9hcmRJZGVudGl0eVxuICAgICAgICA/IHBhcnRpY2lwYW50XG4gICAgICAgIDogcGFydGljaXBhbnQgaW5zdGFuY2VvZiBFbnRpdHlcbiAgICAgICAgICA/IHBhcnRpY2lwYW50LnNjb3JlYm9hcmRJZGVudGl0eVxuICAgICAgICAgIDogbmV3IFNjb3JlYm9hcmRJZGVudGl0eShwYXJ0aWNpcGFudCk7XG5cbiAgICAvLyBTZXQgdGhlIHBhcnRpY2lwYW50IGluIHRoZSBvYmplY3RpdmUuXG4gICAgdGhpcy5wYXJ0aWNpcGFudHMuc2V0KGlkZW50aXR5LCBpbml0aWFsU2NvcmUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBwYXJ0aWNpcGFudCBmcm9tIHRoZSBvYmplY3RpdmUgdXNpbmcgdGhlIHNwZWNpZmllZCBpZGVudGl0eS5cbiAgICogQHBhcmFtIHBhcnRpY2lwYW50IFRoZSBpZGVudGl0eSBvZiB0aGUgcGFydGljaXBhbnQgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwYXJ0aWNpcGFudCB3YXMgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhcnRpY2lwYW50KFxuICAgIHBhcnRpY2lwYW50OiBFbnRpdHkgfCBzdHJpbmcgfCBTY29yZWJvYXJkSWRlbnRpdHlcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gR2V0IHRoZSBpZGVudGl0eSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmdldFBhcnRpY2lwYW50KHBhcnRpY2lwYW50KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpZGVudGl0eSBpcyBudWxsLlxuICAgIGlmICghaWRlbnRpdHkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGFydGljaXBhbnQgZnJvbSB0aGUgb2JqZWN0aXZlLlxuICAgIHRoaXMucGFydGljaXBhbnRzLmRlbGV0ZShpZGVudGl0eSk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgcGFja2V0IHRvIHJlbW92ZSB0aGUgc2NvcmUuXG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFNldFNjb3JlUGFja2V0KCk7XG4gICAgcGFja2V0LnR5cGUgPSBTY29yZWJvYXJkQWN0aW9uVHlwZS5SZW1vdmU7XG4gICAgcGFja2V0LmVudHJpZXMgPSBbXG4gICAgICB7XG4gICAgICAgIHNjb3JlYm9hcmRJZDogaWRlbnRpdHkuaWRlbnRpZmllcixcbiAgICAgICAgb2JqZWN0aXZlTmFtZTogdGhpcy5vYmplY3RpdmVOYW1lLFxuICAgICAgICBzY29yZTogMCxcbiAgICAgICAgaWRlbnRpdHlUeXBlOiBpZGVudGl0eS50eXBlLFxuICAgICAgICBhY3RvclVuaXF1ZUlkOiBudWxsLFxuICAgICAgICBjdXN0b21OYW1lOiBudWxsXG4gICAgICB9XG4gICAgXTtcblxuICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIHRoZSB3b3JsZC5cbiAgICB0aGlzLndvcmxkLmJyb2FkY2FzdChwYWNrZXQpO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHBhcnRpY2lwYW50IHdhcyByZW1vdmVkLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNjb3JlIG9mIHRoZSBwYXJ0aWNpcGFudCBpbiB0aGUgb2JqZWN0aXZlLlxuICAgKiBAcGFyYW0gcGFydGljaXBhbnQgVGhlIGlkZW50aXR5IG9mIHRoZSBwYXJ0aWNpcGFudC5cbiAgICogQHBhcmFtIHNjb3JlIFRoZSBuZXcgc2NvcmUgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgKi9cbiAgcHVibGljIHNldFNjb3JlKFxuICAgIHBhcnRpY2lwYW50OiBFbnRpdHkgfCBzdHJpbmcgfCBTY29yZWJvYXJkSWRlbnRpdHksXG4gICAgc2NvcmU6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICAvLyBJbml0aWFsaXplIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAgY29uc3QgaWRlbnRpdHkgPVxuICAgICAgdGhpcy5nZXRQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCkgPz8gdGhpcy5hZGRQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCk7XG5cbiAgICAvLyBTZXQgdGhlIHNjb3JlIG9mIHRoZSBwYXJ0aWNpcGFudCBpbiB0aGUgb2JqZWN0aXZlLlxuICAgIHRoaXMucGFydGljaXBhbnRzLnNldChpZGVudGl0eSwgc2NvcmUpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHBhY2tldCB0byBzZXQgdGhlIHNjb3JlLlxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBTZXRTY29yZVBhY2tldCgpO1xuICAgIHBhY2tldC50eXBlID0gU2NvcmVib2FyZEFjdGlvblR5cGUuQ2hhbmdlO1xuICAgIHBhY2tldC5lbnRyaWVzID0gW1xuICAgICAge1xuICAgICAgICBzY29yZWJvYXJkSWQ6IGlkZW50aXR5LmlkZW50aWZpZXIsXG4gICAgICAgIG9iamVjdGl2ZU5hbWU6IHRoaXMub2JqZWN0aXZlTmFtZSxcbiAgICAgICAgc2NvcmUsXG4gICAgICAgIGlkZW50aXR5VHlwZTogaWRlbnRpdHkudHlwZSxcbiAgICAgICAgYWN0b3JVbmlxdWVJZDogaWRlbnRpdHkuZW50aXR5Py51bmlxdWVJZCA/PyBudWxsLFxuICAgICAgICBjdXN0b21OYW1lOiBpZGVudGl0eS5kaXNwbGF5TmFtZVxuICAgICAgfVxuICAgIF07XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgd29ybGQuXG4gICAgdGhpcy53b3JsZC5icm9hZGNhc3QocGFja2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc2NvcmUgdG8gdGhlIHBhcnRpY2lwYW50IGluIHRoZSBvYmplY3RpdmUuXG4gICAqIEBwYXJhbSBwYXJ0aWNpcGFudCBUaGUgaWRlbnRpdHkgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgKiBAcGFyYW0gc2NvcmUgVGhlIHNjb3JlIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIG5ldyBzY29yZSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAqL1xuICBwdWJsaWMgYWRkU2NvcmUoXG4gICAgcGFydGljaXBhbnQ6IEVudGl0eSB8IHN0cmluZyB8IFNjb3JlYm9hcmRJZGVudGl0eSxcbiAgICBzY29yZTogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhcnRpY2lwYW50IGlzIGFscmVhZHkgaW4gdGhlIG9iamVjdGl2ZS5cbiAgICBjb25zdCBpZGVudGl0eSA9XG4gICAgICB0aGlzLmdldFBhcnRpY2lwYW50KHBhcnRpY2lwYW50KSA/PyB0aGlzLmFkZFBhcnRpY2lwYW50KHBhcnRpY2lwYW50KTtcblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBzY29yZSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAgY29uc3QgY3VycmVudFNjb3JlID0gdGhpcy5wYXJ0aWNpcGFudHMuZ2V0KGlkZW50aXR5KSA/PyAwO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgc2NvcmUgb2YgdGhlIHBhcnRpY2lwYW50LlxuICAgIGNvbnN0IG5ld1Njb3JlID0gY3VycmVudFNjb3JlICsgc2NvcmU7XG5cbiAgICAvLyBTZXQgdGhlIG5ldyBzY29yZSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAgdGhpcy5zZXRTY29yZShpZGVudGl0eSwgbmV3U2NvcmUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBuZXcgc2NvcmUuXG4gICAgcmV0dXJuIG5ld1Njb3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNjb3JlIG9mIHRoZSBwYXJ0aWNpcGFudCBpbiB0aGUgb2JqZWN0aXZlLlxuICAgKiBAcGFyYW0gcGFydGljaXBhbnQgVGhlIGlkZW50aXR5IG9mIHRoZSBwYXJ0aWNpcGFudC5cbiAgICogQHJldHVybnMgVGhlIHNjb3JlIG9mIHRoZSBwYXJ0aWNpcGFudCwgbnVsbCBpZiB0aGUgcGFydGljaXBhbnQgaXMgbm90IGluIHRoZSBvYmplY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0U2NvcmUoXG4gICAgcGFydGljaXBhbnQ6IEVudGl0eSB8IHN0cmluZyB8IFNjb3JlYm9hcmRJZGVudGl0eVxuICApOiBudW1iZXIgfCBudWxsIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGFydGljaXBhbnQgaXMgYWxyZWFkeSBpbiB0aGUgb2JqZWN0aXZlLlxuICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5nZXRQYXJ0aWNpcGFudChwYXJ0aWNpcGFudCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaWRlbnRpdHkgaXMgbnVsbC5cbiAgICBpZiAoIWlkZW50aXR5KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBzY29yZSBvZiB0aGUgcGFydGljaXBhbnQuXG4gICAgcmV0dXJuIHRoaXMucGFydGljaXBhbnRzLmdldChpZGVudGl0eSkgYXMgbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgc2NvcmVzIG9mIGFsbCB0aGUgcGFydGljaXBhbnRzIGluIHRoZSBvYmplY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTY29yZXMoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHBhY2tldCB0byByZW1vdmUgdGhlIHNjb3JlLlxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBTZXRTY29yZVBhY2tldCgpO1xuICAgIHBhY2tldC50eXBlID0gU2NvcmVib2FyZEFjdGlvblR5cGUuUmVtb3ZlO1xuICAgIHBhY2tldC5lbnRyaWVzID0gWy4uLnRoaXMucGFydGljaXBhbnRzLmtleXMoKV0ubWFwKChpZGVudGl0eSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcmVib2FyZElkOiBpZGVudGl0eS5pZGVudGlmaWVyLFxuICAgICAgICBvYmplY3RpdmVOYW1lOiB0aGlzLm9iamVjdGl2ZU5hbWUsXG4gICAgICAgIHNjb3JlOiAwLFxuICAgICAgICBpZGVudGl0eVR5cGU6IGlkZW50aXR5LnR5cGUsXG4gICAgICAgIGFjdG9yVW5pcXVlSWQ6IG51bGwsXG4gICAgICAgIGN1c3RvbU5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byB0aGUgd29ybGQuXG4gICAgdGhpcy53b3JsZC5icm9hZGNhc3QocGFja2V0KTtcblxuICAgIC8vIENsZWFyIHRoZSBwYXJ0aWNpcGFudHMgb2YgdGhlIG9iamVjdGl2ZS5cbiAgICB0aGlzLnBhcnRpY2lwYW50cy5jbGVhcigpO1xuICB9XG59XG5cbmV4cG9ydCB7IFNjb3JlYm9hcmRPYmplY3RpdmUgfTtcbiIsICJpbXBvcnQgeyBTY29yZWJvYXJkSWRlbnRpdHlUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuY2xhc3MgU2NvcmVib2FyZElkZW50aXR5IHtcbiAgLyoqXG4gICAqIFRoZSBydW5uaW5nIGlkZW50aWZpZXIgb2YgdGhlIHNjb3JlYm9hcmQgaWRlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIElERU5USUZJRVIgPSAwbjtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNjb3JlYm9hcmQgaWRlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFNjb3JlYm9hcmRJZGVudGl0eS5JREVOVElGSUVSKys7XG5cbiAgLyoqXG4gICAqIFRoZSBzY29yZWJvYXJkIGlkZW50aXR5IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogU2NvcmVib2FyZElkZW50aXR5VHlwZTtcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgaWRlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVudGl0eSBvZiB0aGUgaWRlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXR5OiBFbnRpdHkgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzY29yZWJvYXJkIGlkZW50aXR5LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGVudGl0eSBvciBkaXNwbGF5IG5hbWUgb2YgdGhlIGlkZW50aXR5LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHZhbHVlOiBFbnRpdHkgfCBzdHJpbmcsIGlkZW50aWZpZXI/OiBiaWdpbnQpIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYW4gZW50aXR5LlxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVudGl0eSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBhIHBsYXllci5cbiAgICAgIGlmICh2YWx1ZS5pc1BsYXllcigpKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IFNjb3JlYm9hcmRJZGVudGl0eVR5cGUuUGxheWVyO1xuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gdmFsdWUudXNlcm5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnR5cGUgPSBTY29yZWJvYXJkSWRlbnRpdHlUeXBlLkVudGl0eTtcbiAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IHZhbHVlLnR5cGUuaWRlbnRpZmllcjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBlbnRpdHkgb2YgdGhlIGlkZW50aXR5LlxuICAgICAgdGhpcy5pZGVudGlmaWVyID0gIWlkZW50aWZpZXIgPyB2YWx1ZS5ydW50aW1lSWQgOiBpZGVudGlmaWVyO1xuICAgICAgdGhpcy5lbnRpdHkgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2V0IHRoZSB0eXBlIHRvIGZha2UgcGxheWVyIGFuZCBzZXQgdGhlIGRpc3BsYXkgbmFtZS5cbiAgICAgIHRoaXMudHlwZSA9IFNjb3JlYm9hcmRJZGVudGl0eVR5cGUuRmFrZVBsYXllcjtcbiAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgU2NvcmVib2FyZElkZW50aXR5IH07XG4iLCAiaW1wb3J0IHsgRW5kaWFubmVzcywgdHlwZSBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5pbXBvcnQgeyBDb21wb3VuZFRhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcblxuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBCbG9ja1Blcm11dGF0aW9uIH0gZnJvbSBcIi4uLy4uL2Jsb2NrXCI7XG5cbi8vIFRPRE86IEFkZCBsb2dnZWQgYmxvY2tzLCBsaWdodCBibG9ja3MsIGFuZCBiaW9tZXMuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGJsb2NrIHN0b3JhZ2UuXG4gKi9cbmNsYXNzIEJsb2NrU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBjaHVuayBzaXplIGluIHRoZSB4IGRpcmVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUFYX1ggPSAxNjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gY2h1bmsgc2l6ZSBpbiB0aGUgeSBkaXJlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BWF9ZID0gMTY7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGNodW5rIHNpemUgaW4gdGhlIHogZGlyZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNQVhfWiA9IDE2O1xuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbWF4aW11bSBjaHVuayBzaXplLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNQVhfU0laRSA9IDE2ICogMTYgKiAxNjtcblxuICAvKipcbiAgICogVGhlIHBhbGV0dGUgb2YgdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFsZXR0ZTogQXJyYXk8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIGJsb2NrcyBvZiB0aGUgc3RvcmFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBibG9ja3M6IEFycmF5PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBhaXIgdmFsdWUgb2YgdGhlIHN0b3JhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWlyOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYmxvY2sgc3RvcmFnZS5cbiAgICpcbiAgICogQHBhcmFtIGJsb2NrcyBUaGUgb3B0aW9uYWwgYmxvY2tzLlxuICAgKiBAcGFyYW0gcGFsZXR0ZSBUaGUgb3B0aW9uYWwgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYWxldHRlPzogQXJyYXk8bnVtYmVyPiwgYmxvY2tzPzogQXJyYXk8bnVtYmVyPikge1xuICAgIC8vIEZpbmQgdGhlIGFpciB2YWx1ZS5cbiAgICBjb25zdCBwZXJtdXRhdGlvbiA9IEJsb2NrUGVybXV0YXRpb24ucmVzb2x2ZShCbG9ja0lkZW50aWZpZXIuQWlyKTtcbiAgICB0aGlzLmFpciA9IHBlcm11dGF0aW9uLm5ldHdvcms7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHBhbGV0dGUuXG4gICAgLy8gV2hlbiB3ZSBjcmVhdGUgY2h1bmtzLCB3ZSB3aWxsIHByb3ZpZGUgdGhlIHBhbGV0dGUgd2l0aCB0aGUgY3VycmVudCBhaXIgdmFsdWUuXG4gICAgdGhpcy5wYWxldHRlID0gcGFsZXR0ZSA/PyBbdGhpcy5haXJdO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBibG9jayBzdG9yYWdlLlxuICAgIHRoaXMuYmxvY2tzID1cbiAgICAgIGJsb2NrcyA/PyBBcnJheS5mcm9tKHsgbGVuZ3RoOiBCbG9ja1N0b3JhZ2UuTUFYX1NJWkUgfSwgKCkgPT4gMCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBibG9jayBzdG9yYWdlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFsZXR0ZS5sZW5ndGggPT09IDEgJiYgdGhpcy5wYWxldHRlWzBdID09PSB0aGlzLmFpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBibG9jayBzdGF0ZSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBieCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGJ5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gYnogVGhlIHogY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEByZXR1cm5zIFRoZSBibG9jayBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0ZShieDogbnVtYmVyLCBieTogbnVtYmVyLCBiejogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIGluZGV4LlxuICAgIGNvbnN0IGluZGV4ID0gQmxvY2tTdG9yYWdlLmdldEluZGV4KGJ4LCBieSwgYnopO1xuXG4gICAgLy8gR2V0IHRoZSBwYWxldHRlIGluZGV4LlxuICAgIGNvbnN0IHBhbGV0dGVJbmRleCA9IHRoaXMuYmxvY2tzW2luZGV4XSA/PyAwO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBibG9jay5cbiAgICByZXR1cm4gdGhpcy5wYWxldHRlW3BhbGV0dGVJbmRleF0gPz8gdGhpcy5haXI7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYmxvY2sgc3RhdGUgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gYnggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBieSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGJ6IFRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIGJsb2NrIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIHNldFN0YXRlKGJ4OiBudW1iZXIsIGJ5OiBudW1iZXIsIGJ6OiBudW1iZXIsIHN0YXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgc3RhdGUgZXhpc3RzIGluIHRoZSBwYWxldHRlLlxuICAgIGxldCBwYWxldHRlSW5kZXggPSB0aGlzLnBhbGV0dGUuaW5kZXhPZihzdGF0ZSk7XG4gICAgaWYgKHBhbGV0dGVJbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vIEFkZCB0aGUgc3RhdGUgdG8gdGhlIHBhbGV0dGUuXG4gICAgICBwYWxldHRlSW5kZXggPSB0aGlzLnBhbGV0dGUucHVzaChzdGF0ZSkgLSAxO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgYmxvY2sgc3RhdGUuXG4gICAgdGhpcy5ibG9ja3NbQmxvY2tTdG9yYWdlLmdldEluZGV4KGJ4LCBieSwgYnopXSA9IHBhbGV0dGVJbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBpbmRleCBvZiB0aGUgYmxvY2sgcG9zaXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBieCBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGJ5IFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gYnogVGhlIHogY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEByZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgYmxvY2suXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluZGV4KGJ4OiBudW1iZXIsIGJ5OiBudW1iZXIsIGJ6OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAoKGJ4ICYgMHhmKSA8PCA4KSB8ICgoYnogJiAweGYpIDw8IDQpIHwgKGJ5ICYgMHhmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHRoZSBibG9jayBzdG9yYWdlIHRvIGEgYmluYXJ5IHN0cmVhbS5cbiAgICpcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byB3cml0ZSB0by5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKFxuICAgIHN0b3JhZ2U6IEJsb2NrU3RvcmFnZSxcbiAgICBzdHJlYW06IEJpbmFyeVN0cmVhbSxcbiAgICBuYnQgPSBmYWxzZVxuICApOiB2b2lkIHtcbiAgICAvLyBDYWxjdWxhdGUgYml0cyBwZXIgYmxvY2sgYmFzZWQgb24gdGhlIHBhbGV0dGUgc2l6ZVxuICAgIGxldCBiaXRzUGVyQmxvY2sgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKHN0b3JhZ2UucGFsZXR0ZS5sZW5ndGgpKTtcblxuICAgIC8vIFNldCBiaXRzUGVyQmxvY2sgdG8gMSBpZiBjYWxjdWxhdGVkIGFzIDAsIGFuZCBwYWQgYXMgbmVjZXNzYXJ5XG4gICAgc3dpdGNoIChiaXRzUGVyQmxvY2spIHtcbiAgICAgIGNhc2UgMDoge1xuICAgICAgICBiaXRzUGVyQmxvY2sgPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMTpcbiAgICAgIGNhc2UgMjpcbiAgICAgIGNhc2UgMzpcbiAgICAgIGNhc2UgNDpcbiAgICAgIGNhc2UgNTpcbiAgICAgIGNhc2UgNjoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgNzpcbiAgICAgIGNhc2UgODoge1xuICAgICAgICBiaXRzUGVyQmxvY2sgPSA4O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYml0c1BlckJsb2NrID0gMTY7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdyaXRlIHRoZSBiaXRzIHBlciBibG9jayAoc2hpZnRlZCBhbmQgZmxhZ2dlZClcbiAgICBzdHJlYW0ud3JpdGVCeXRlKChiaXRzUGVyQmxvY2sgPDwgMSkgfCAxKTtcblxuICAgIC8vIENhbGN1bGF0ZSBibG9jayBhbmQgd29yZCBzaXplc1xuICAgIGNvbnN0IGJsb2Nrc1BlcldvcmQgPSBNYXRoLmZsb29yKDMyIC8gYml0c1BlckJsb2NrKTtcbiAgICBjb25zdCB3b3JkQ291bnQgPSBNYXRoLmNlaWwoNDA5NiAvIGJsb2Nrc1BlcldvcmQpO1xuXG4gICAgLy8gU2VyaWFsaXplIHRoZSBibG9ja3MgaW50byB0aGUgd29yZHNcbiAgICBmb3IgKGxldCB3ID0gMDsgdyA8IHdvcmRDb3VudDsgdysrKSB7XG4gICAgICAvLyBQcmVwYXJlIHRoZSB3b3JkXG4gICAgICBsZXQgd29yZCA9IDA7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgYmxvY2tzIGluIHRoZSB3b3JkXG4gICAgICBmb3IgKGxldCBibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tzUGVyV29yZDsgYmxvY2srKykge1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGJsb2NrIGluZGV4XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdyAqIGJsb2Nrc1BlcldvcmQgKyBibG9jaztcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgaW5kZXggaXMgb3V0IG9mIGJvdW5kc1xuICAgICAgICBpZiAoaW5kZXggPj0gNDA5NikgYnJlYWs7IC8vIEhhbmRsZSBhbnkgZXhjZXNzIGJsb2Nrc1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYmxvY2sgc3RhdGUgYW5kIG9mZnNldFxuICAgICAgICBjb25zdCBzdGF0ZSA9IHN0b3JhZ2UuYmxvY2tzW2luZGV4XSA/PyAwO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBibG9jayAqIGJpdHNQZXJCbG9jaztcblxuICAgICAgICAvLyBXcml0ZSB0aGUgYmxvY2sgc3RhdGUgdG8gdGhlIHdvcmRcbiAgICAgICAgd29yZCB8PSBzdGF0ZSA8PCBvZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFdyaXRlIHRoZSB3b3JkIHRvIHRoZSBzdHJlYW1cbiAgICAgIHN0cmVhbS53cml0ZUludDMyKHdvcmQsIEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSBwYWxldHRlIHNpemUgZGVwZW5kaW5nIG9uIHRoZSBzZXJpYWxpemF0aW9uIHR5cGVcbiAgICBpZiAobmJ0KSBzdHJlYW0ud3JpdGVJbnQzMihzdG9yYWdlLnBhbGV0dGUubGVuZ3RoLCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgZWxzZSBzdHJlYW0ud3JpdGVaaWdaYWcoc3RvcmFnZS5wYWxldHRlLmxlbmd0aCk7XG5cbiAgICAvLyBTZXJpYWxpemUgcGFsZXR0ZSB2YWx1ZXNcbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHN0b3JhZ2UucGFsZXR0ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlcmlhbGl6YXRpb24gdHlwZSBpcyBOQlRcbiAgICAgIGlmIChuYnQpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBwZXJtdXRhdGlvbiBmcm9tIHRoZSBzdGF0ZVxuICAgICAgICBjb25zdCBwZXJtdXRhdGlvbiA9IEJsb2NrUGVybXV0YXRpb24ucGVybXV0YXRpb25zLmdldChzdGF0ZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBlcm11dGF0aW9uIGV4aXN0c1xuICAgICAgICBpZiAoIXBlcm11dGF0aW9uKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwZXJtdXRhdGlvbiBzdGF0ZTogJHtzdGF0ZX1gKTtcblxuICAgICAgICAvLyBTZXJpYWxpemUgdGhlIHBlcm11dGF0aW9uIHRvIE5CVFxuICAgICAgICBjb25zdCBkYXRhID0gQmxvY2tQZXJtdXRhdGlvbi50b05idChwZXJtdXRhdGlvbik7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIE5CVCBkYXRhIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgQ29tcG91bmRUYWcud3JpdGUoc3RyZWFtLCBkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdyaXRlIHRoZSBzdGF0ZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVppZ1phZyhzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyB0aGUgYmxvY2sgc3RvcmFnZSBmcm9tIGEgYmluYXJ5IHN0cmVhbS5cbiAgICpcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byByZWFkIGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBibG9jayBzdG9yYWdlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShzdHJlYW06IEJpbmFyeVN0cmVhbSwgbmJ0ID0gZmFsc2UpOiBCbG9ja1N0b3JhZ2Uge1xuICAgIC8vIFJlYWQgdGhlIGJpdHMgcGVyIGJsb2NrXG4gICAgY29uc3QgcGFsZXR0ZUFuZEZsYWcgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcbiAgICBjb25zdCBiaXRzUGVyQmxvY2sgPSBwYWxldHRlQW5kRmxhZyA+PiAxO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhbGV0dGUgaXMgdXNpbmcgcnVudGltZSBJRHMuXG4gICAgY29uc3QgX2lzUnVudGltZSA9IChwYWxldHRlQW5kRmxhZyAmIDEpICE9PSAwO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGJsb2NrIGFuZCB3b3JkIHNpemVzXG4gICAgY29uc3QgYmxvY2tzUGVyV29yZCA9IE1hdGguZmxvb3IoMzIgLyBiaXRzUGVyQmxvY2spO1xuICAgIGNvbnN0IHdvcmRDb3VudCA9IE1hdGguY2VpbCg0MDk2IC8gYmxvY2tzUGVyV29yZCk7XG5cbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgd29yZHMgaW50byBibG9ja3NcbiAgICBjb25zdCB3b3JkcyA9IEFycmF5LmZyb208bnVtYmVyPih7IGxlbmd0aDogd29yZENvdW50IH0pO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB3b3JkQ291bnQ7IGluZGV4KyspIHtcbiAgICAgIHdvcmRzW2luZGV4XSA9IHN0cmVhbS5yZWFkSW50MzIoRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIHBhbGV0dGUgc2l6ZSBkZXBlbmRpbmcgb24gdGhlIHNlcmlhbGl6YXRpb25cbiAgICBjb25zdCBwYWxldHRlU2l6ZSA9IG5idFxuICAgICAgPyBzdHJlYW0ucmVhZEludDMyKEVuZGlhbm5lc3MuTGl0dGxlKVxuICAgICAgOiBzdHJlYW0ucmVhZFppZ1phZygpO1xuXG4gICAgLy8gRGVzZXJpYWxpemUgdGhlIHBhbGV0dGUgdmFsdWVzXG4gICAgY29uc3QgcGFsZXR0ZSA9IEFycmF5LmZyb208bnVtYmVyPih7IGxlbmd0aDogcGFsZXR0ZVNpemUgfSk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhbGV0dGVTaXplOyBpbmRleCsrKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgc2VyaWFsaXphdGlvbiB0eXBlIGlzIE5CVFxuICAgICAgaWYgKG5idCkge1xuICAgICAgICAvLyBSZWFkIHRoZSBOQlQgZGF0YSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgY29uc3QgZGF0YSA9IENvbXBvdW5kVGFnLnJlYWQoc3RyZWFtKTtcblxuICAgICAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgcGVybXV0YXRpb24gZnJvbSBOQlRcbiAgICAgICAgY29uc3QgcGVybXV0YXRpb24gPSBCbG9ja1Blcm11dGF0aW9uLmZyb21OYnQoZGF0YSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBlcm11dGF0aW9uIGV4aXN0c1xuICAgICAgICBpZiAoIXBlcm11dGF0aW9uKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwZXJtdXRhdGlvbiBzdGF0ZTogJHtkYXRhLnZhbHVlT2YodHJ1ZSl9YCk7XG5cbiAgICAgICAgLy8gQXNzaWduIHRoZSBwZXJtdXRhdGlvbiB0byB0aGUgcGFsZXR0ZVxuICAgICAgICBwYWxldHRlW2luZGV4XSA9IHBlcm11dGF0aW9uLm5ldHdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZWFkIHRoZSBzdGF0ZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgcGFsZXR0ZVtpbmRleF0gPSBzdHJlYW0ucmVhZFppZ1phZygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlc2VyaWFsaXplIHRoZSBibG9ja3MgZnJvbSB0aGUgd29yZHNcbiAgICBjb25zdCBibG9ja3MgPSBBcnJheS5mcm9tPG51bWJlcj4oeyBsZW5ndGg6IDQwOTYgfSk7XG4gICAgbGV0IHBvc2l0aW9uID0gMDtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgd29yZHNcbiAgICBmb3IgKGNvbnN0IHdvcmQgb2Ygd29yZHMpIHtcbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgYmxvY2tzIGluIHRoZSB3b3JkXG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgYmxvY2sgPSAwO1xuICAgICAgICBibG9jayA8IGJsb2Nrc1BlcldvcmQgJiYgcG9zaXRpb24gPCA0MDk2O1xuICAgICAgICBibG9jaysrLCBwb3NpdGlvbisrXG4gICAgICApIHtcbiAgICAgICAgLy8gR2V0IHRoZSBzdGF0ZSBmcm9tIHRoZSB3b3JkXG4gICAgICAgIGNvbnN0IHN0YXRlID1cbiAgICAgICAgICAod29yZCA+PiAoYmxvY2sgKiBiaXRzUGVyQmxvY2spKSAmICgoMSA8PCBiaXRzUGVyQmxvY2spIC0gMSk7XG5cbiAgICAgICAgLy8gQWRqdXN0IHRoZSBwb3NpdGlvblxuICAgICAgICBjb25zdCB4ID0gKHBvc2l0aW9uID4+IDgpICYgMHhmO1xuICAgICAgICBjb25zdCB5ID0gcG9zaXRpb24gJiAweGY7XG4gICAgICAgIGNvbnN0IHogPSAocG9zaXRpb24gPj4gNCkgJiAweGY7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBibG9jayBzdGF0ZSBpbiB0aGUgYmxvY2tzIGFycmF5XG4gICAgICAgIGJsb2Nrc1tCbG9ja1N0b3JhZ2UuZ2V0SW5kZXgoeCwgeSwgeildID0gc3RhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCbG9ja1N0b3JhZ2UocGFsZXR0ZSwgYmxvY2tzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja1N0b3JhZ2UgfTtcbiIsICJpbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IEJsb2NrU3RvcmFnZSB9IGZyb20gXCIuL2Jsb2NrLXN0b3JhZ2VcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3ViIGNodW5rLlxuICovXG5leHBvcnQgY2xhc3MgU3ViQ2h1bmsge1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHN1YiBjaHVuay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXllcnMgb2YgdGhlIHN1YiBjaHVuay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsYXllcnM6IEFycmF5PEJsb2NrU3RvcmFnZT47XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgc3ViIGNodW5rLlxuICAgKi9cbiAgcHVibGljIGluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzdWIgY2h1bmsuXG4gICAqXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBzdWIgY2h1bmsuXG4gICAqIEBwYXJhbSBsYXllcnMgVGhlIGxheWVycyBvZiB0aGUgc3ViIGNodW5rLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHZlcnNpb24/OiBudW1iZXIsIGxheWVycz86IEFycmF5PEJsb2NrU3RvcmFnZT4pIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uID8/IDk7XG4gICAgdGhpcy5sYXllcnMgPSBsYXllcnMgPz8gW107XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBzdWIgY2h1bmsgaXMgZW1wdHkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN1YiBjaHVuayBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggc3RvcmFnZS5cbiAgICBmb3IgKGNvbnN0IHN0b3JhZ2Ugb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdG9yYWdlIGlzIGVtcHR5LlxuICAgICAgaWYgKCFzdG9yYWdlLmlzRW1wdHkoKSkge1xuICAgICAgICAvLyBUaGUgc3ViIGNodW5rIGlzIG5vdCBlbXB0eS5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBzdWIgY2h1bmsgaXMgZW1wdHkuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYmxvY2sgc3RvcmFnZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHN0b3JhZ2UuXG4gICAqIEByZXR1cm5zIFRoZSBibG9jayBzdG9yYWdlLlxuICAgKi9cbiAgcHVibGljIGdldExheWVyKGluZGV4OiBudW1iZXIpOiBCbG9ja1N0b3JhZ2Uge1xuICAgIC8vIENoZWNrIGlmIHRoZSBzdG9yYWdlIGV4aXN0cy5cbiAgICBpZiAoIXRoaXMubGF5ZXJzW2luZGV4XSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHN0b3JhZ2UuXG4gICAgICBmb3IgKGxldCBpbmRleF8gPSAwOyBpbmRleF8gPD0gaW5kZXg7IGluZGV4XysrKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXllcnNbaW5kZXhfXSkgdGhpcy5sYXllcnNbaW5kZXhfXSA9IG5ldyBCbG9ja1N0b3JhZ2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIHN0b3JhZ2UuXG4gICAgcmV0dXJuIHRoaXMubGF5ZXJzW2luZGV4XSBhcyBCbG9ja1N0b3JhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYmxvY2sgc3RhdGUgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gYnggVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBieSBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIGJ6IFRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gbGF5ZXIgVGhlIGxheWVyIG9mIHRoZSBibG9jay5cbiAgICogQHJldHVybnMgVGhlIGJsb2NrIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGdldFN0YXRlKGJ4OiBudW1iZXIsIGJ5OiBudW1iZXIsIGJ6OiBudW1iZXIsIGxheWVyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIEdldCB0aGUgc3RvcmFnZS5cbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5nZXRMYXllcihsYXllcik7XG5cbiAgICAvLyBHZXQgdGhlIGJsb2NrIHN0YXRlLlxuICAgIHJldHVybiBzdG9yYWdlLmdldFN0YXRlKGJ4LCBieSwgYnopO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGJsb2NrIHN0YXRlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGJ4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrLlxuICAgKiBAcGFyYW0gYnkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2suXG4gICAqIEBwYXJhbSBieiBUaGUgeiBjb29yZGluYXRlIG9mIHRoZSBibG9jay5cbiAgICogQHBhcmFtIHN0YXRlIFRoZSBibG9jayBzdGF0ZS5cbiAgICogQHBhcmFtIGxheWVyIFRoZSBsYXllciBvZiB0aGUgYmxvY2suXG4gICAqL1xuICBwdWJsaWMgc2V0U3RhdGUoXG4gICAgYng6IG51bWJlcixcbiAgICBieTogbnVtYmVyLFxuICAgIGJ6OiBudW1iZXIsXG4gICAgc3RhdGU6IG51bWJlcixcbiAgICBsYXllcj86IG51bWJlclxuICApOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHN0b3JhZ2UuXG4gICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXIgPz8gMCk7XG5cbiAgICAvLyBTZXQgdGhlIGJsb2NrIHN0YXRlLlxuICAgIHN0b3JhZ2Uuc2V0U3RhdGUoYngsIGJ5LCBieiwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgdGhlIHN1YiBjaHVuay5cbiAgICpcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byB3cml0ZSB0by5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKFxuICAgIHN1YmNodW5rOiBTdWJDaHVuayxcbiAgICBzdHJlYW06IEJpbmFyeVN0cmVhbSxcbiAgICBuYnQgPSBmYWxzZVxuICApOiB2b2lkIHtcbiAgICAvLyBXcml0ZSB0aGUgdmVyc2lvbi5cbiAgICBzdHJlYW0ud3JpdGVVaW50OChzdWJjaHVuay52ZXJzaW9uKTtcblxuICAgIC8vIFdyaXRlIHRoZSBzdG9yYWdlIGNvdW50LlxuICAgIHN0cmVhbS53cml0ZVVpbnQ4KHN1YmNodW5rLmxheWVycy5sZW5ndGgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIGluZGV4LlxuICAgIGlmIChzdWJjaHVuay52ZXJzaW9uID09PSA5KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgaW5kZXggaXMgbnVsbC5cbiAgICAgIGlmIChzdWJjaHVuay5pbmRleCA9PT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViQ2h1bmsgaW5kZXggaXMgbnVsbCBmb3IgZm9ybWF0IHZlcnNpb24gOVwiKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGluZGV4LlxuICAgICAgc3RyZWFtLndyaXRlSW50OChzdWJjaHVuay5pbmRleCk7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggc3RvcmFnZSBhbmQgc2VyaWFsaXplIGl0LlxuICAgIGZvciAoY29uc3Qgc3RvcmFnZSBvZiBzdWJjaHVuay5sYXllcnMpIHtcbiAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgc3RvcmFnZS5cbiAgICAgIEJsb2NrU3RvcmFnZS5zZXJpYWxpemUoc3RvcmFnZSwgc3RyZWFtLCBuYnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgdGhlIHN1YiBjaHVuay5cbiAgICpcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byByZWFkIGZyb20uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlc2VyaWFsaXplKHN0cmVhbTogQmluYXJ5U3RyZWFtLCBuYnQgPSBmYWxzZSk6IFN1YkNodW5rIHtcbiAgICAvLyBSZWFkIHRoZSB2ZXJzaW9uLlxuICAgIGNvbnN0IHZlcnNpb24gPSBzdHJlYW0ucmVhZFVpbnQ4KCk7XG5cbiAgICAvLyBSZWFkIHRoZSBzdG9yYWdlIGNvdW50LlxuICAgIGNvbnN0IGNvdW50ID0gc3RyZWFtLnJlYWRVaW50OCgpO1xuXG4gICAgLy8gUmVhZCB0aGUgaW5kZXggaWYgdGhlIHZlcnNpb24gaXMgOS5cbiAgICBsZXQgaW5kZXggPSBudWxsO1xuICAgIGlmICh2ZXJzaW9uID09PSA5KSB7XG4gICAgICBpbmRleCA9IHN0cmVhbS5yZWFkSW50OCgpO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIHN0b3JhZ2UgYW5kIGRlc2VyaWFsaXplIGl0LlxuICAgIGNvbnN0IGxheWVyczogQXJyYXk8QmxvY2tTdG9yYWdlPiA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgICAgbGF5ZXJzLnB1c2goQmxvY2tTdG9yYWdlLmRlc2VyaWFsaXplKHN0cmVhbSwgbmJ0KSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHN1YiBjaHVuay5cbiAgICBjb25zdCBzdWJjaHVuayA9IG5ldyBTdWJDaHVuayh2ZXJzaW9uLCBsYXllcnMpO1xuICAgIHN1YmNodW5rLmluZGV4ID0gaW5kZXg7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHN1YiBjaHVuay5cbiAgICByZXR1cm4gc3ViY2h1bms7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZyb20oYnVmZmVyOiBCdWZmZXIsIG5idCA9IGZhbHNlKTogU3ViQ2h1bmsge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBzdHJlYW0uXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgLy8gRGVzZXJpYWxpemUgdGhlIHN1YiBjaHVuay5cbiAgICByZXR1cm4gU3ViQ2h1bmsuZGVzZXJpYWxpemUoc3RyZWFtLCBuYnQpO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgQ2h1bmtDb29yZHMsXG4gIERpbWVuc2lvblR5cGUsXG4gIHR5cGUgSVBvc2l0aW9uXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBCbG9ja0lkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEJsb2NrUGVybXV0YXRpb24gfSBmcm9tIFwiLi4vLi4vYmxvY2tcIjtcblxuaW1wb3J0IHsgU3ViQ2h1bmsgfSBmcm9tIFwiLi9zdWItY2h1bmtcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2h1bmsgd2l0aGluIGEgRGltZW5zaW9uIGluc3RhbmNlLiBDaHVua3MgaG9sZCBzdWIgY2h1bmtzLCB3aGljaCBob2xkIGJsb2NrIHN0YXRlcyAoQmxvY2tQZXJtdXRhdGlvbnMpLiBDaHVua3MgY2FuIGJlIGRpcnR5LCBtZWFuaW5nIHRoZXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGFuZCBuZWVkIHRvIGJlIHNhdmVkLlxuICpcbiAqICoqRXhhbXBsZSBVc2FnZSoqXG4gKiBgYGB0eXBlc2NyaXB0XG4gXHRpbXBvcnQgeyBCbG9ja0lkZW50aWZpZXIsIEJsb2NrUGVybXV0YXRpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmxvY2tcIlxuXHRpbXBvcnQgeyBEaW1lbnNpb25UeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCJcblx0aW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiQHNlcmVuaXR5anMvd29ybGRcIlxuXG5cdC8vIENyZWF0ZSBhIG5ldyBjaHVuayB3aXRoIHRoZSBkaW1lbnNpb24gdHlwZSBcIk92ZXJ3b3JsZFwiIGFuZCB0aGUgeCBhbmQgeiBjb29yZGluYXRlcyBvZiAwXG5cdGNvbnN0IGNodW5rID0gbmV3IENodW5rKERpbWVuc2lvblR5cGUuT3ZlcndvcmxkLCAwLCAwKSAvLyBEaW1lbnNpb25UeXBlIHdpbGwgZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgY2h1bmtcblxuXHQvLyBGaXJzdCB3ZSBuZWVkIHRvIG9idGFpbiB0aGUgQmxvY2tQZXJtdXRhdGlvbnMgd2Ugd2lsbCB1c2UgdG8gc2V0IHRoZSBibG9ja3Ncblx0Y29uc3QgYmVkcm9jayA9IEJsb2NrUGVybXV0YXRpb24ucmVzb2x2ZShCbG9ja0lkZW50aWZpZXIuQmVkcm9jaylcblx0Y29uc3QgZGlydCA9IEJsb2NrUGVybXV0YXRpb24ucmVzb2x2ZShCbG9ja0lkZW50aWZpZXIuRGlydCwgeyBkaXJ0X3R5cGU6IFwibm9ybWFsXCIgfSlcblx0Y29uc3QgZ3Jhc3MgPSBCbG9ja1Blcm11dGF0aW9uLnJlc29sdmUoQmxvY2tJZGVudGlmaWVyLkdyYXNzQmxvY2spXG5cblx0Ly8gV2UgY2FuIG5vdyBzZXQgYSBibG9jayBhdCB0aGUgeCwgeSwgYW5kIHogY29vcmRpbmF0ZXMgb2YgdGhlIGNodW5rXG5cdC8vIFdlIHdpbGwgY3JlYXRlIGEgU3VwZXJmbGF0IGNodW5rIHdpdGggYSBtYXhpbXVtIGhlaWdodCBvZiA0XG5cdGZvciAobGV0IHggPSAwOyB4IDwgMTY7IHgrKykge1xuXHRcdGZvciAobGV0IHogPSAwOyB6IDwgMTY7IHorKykge1xuXHRcdFx0Zm9yIChsZXQgeSA9IDA7IHkgPCA0OyB5KyspIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIHkgY29vcmRpbmF0ZSBpcyAwLCBpZiBzbywgc2V0IHRoZSBibG9jayB0byBiZWRyb2NrXG5cdFx0XHRcdGlmICh5ID09PSAwKSBjaHVuay5zZXRQZXJtdXRhdGlvbih4LCB5LCB6LCBiZWRyb2NrKVxuXG5cdFx0XHRcdC8vIENoZWNrIGlmIHRoZSB5IGNvb3JkaW5hdGUgaXMgMSBhbmQgMiwgaWYgc28sIHNldCB0aGUgYmxvY2sgdG8gZGlydFxuXHRcdFx0XHRlbHNlIGlmICh5ID09PSAxIHx8IHkgPT09IDIpIGNodW5rLnNldFBlcm11dGF0aW9uKHgsIHksIHosIGRpcnQpXG5cblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIHkgY29vcmRpbmF0ZSBpcyAzLCBpZiBzbywgc2V0IHRoZSBibG9jayB0byBncmFzc1xuXHRcdFx0XHRlbHNlIGlmICh5ID09PSAzKSBjaHVuay5zZXRQZXJtdXRhdGlvbih4LCB5LCB6LCBncmFzcylcblx0XHRcdH1cblx0XHR9XG5cdH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ2h1bmsge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHN1YiBjaHVua3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BWF9TVUJfQ0hVTktTID0gMjQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb24gdHlwZSBvZiB0aGUgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogRGltZW5zaW9uVHlwZTtcblxuICAvKipcbiAgICogVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgWiBjb29yZGluYXRlIG9mIHRoZSBjaHVuay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB6OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBoYXNoIGtleSBvZiB0aGUgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGFzaDogYmlnaW50O1xuXG4gIC8qKlxuICAgKiBUaGUgc3ViIGNodW5rcyBvZiB0aGUgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3ViY2h1bmtzOiBBcnJheTxTdWJDaHVuaz47XG5cbiAgLyoqXG4gICAqIEEgY2FjaGVkIGJ1ZmZlciBvZiB0aGUgc2VyaWFsaXplZCBjaHVuay5cbiAgICovXG4gIHB1YmxpYyBjYWNoZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIHRoZSBjaHVuayBoYXMgYmVlbiBtb2RpZmllZCwgYW5kIGhhcyBub3QgYmVlbiBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBkaXJ0eSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY2h1bmsgaXMgcmVhZHkgdG8gYmUgc2VudCB0byB0aGUgY2xpZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWR5ID0gdHJ1ZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjaHVuay5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgVGhlIGRpbWVuc2lvbiB0eXBlIG9mIHRoZSBjaHVuay5cbiAgICogQHBhcmFtIHggVGhlIFggY29vcmRpbmF0ZSBvZiB0aGUgY2h1bmsuXG4gICAqIEBwYXJhbSB6IFRoZSBaIGNvb3JkaW5hdGUgb2YgdGhlIGNodW5rLlxuICAgKiBAcGFyYW0gc3ViY2h1bmtzIFRoZSBzdWIgY2h1bmtzIG9mIHRoZSBjaHVuay5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB4OiBudW1iZXIsXG4gICAgejogbnVtYmVyLFxuICAgIHR5cGU6IERpbWVuc2lvblR5cGUsXG4gICAgc3ViY2h1bmtzPzogQXJyYXk8U3ViQ2h1bms+XG4gICkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy56ID0gejtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaGFzaCA9IENodW5rQ29vcmRzLmhhc2goeyB4LCB6IH0pO1xuICAgIHRoaXMuc3ViY2h1bmtzID0gc3ViY2h1bmtzID8/IEFycmF5LmZyb20oeyBsZW5ndGg6IENodW5rLk1BWF9TVUJfQ0hVTktTIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGVybXV0YXRpb24gYXQgdGhlIGdpdmVuIFgsIFkgYW5kIFogY29vcmRpbmF0ZXMuXG4gICAqIEBwYXJhbSB4IFRoZSBYIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSB5IFRoZSBZIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSB6IFRoZSBaIGNvb3JkaW5hdGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0UGVybXV0YXRpb24ocG9zaXRpb246IElQb3NpdGlvbik6IEJsb2NrUGVybXV0YXRpb24ge1xuICAgIC8vIENvcnJlY3QgdGhlIFkgbGV2ZWwgZm9yIHRoZSBvdmVyd29ybGQuXG4gICAgY29uc3QgeyB4LCB5LCB6IH0gPSBwb3NpdGlvbjtcbiAgICBjb25zdCB5ZiA9IHRoaXMudHlwZSA9PT0gRGltZW5zaW9uVHlwZS5PdmVyd29ybGQgPyB5ICsgNjQgOiB5O1xuXG4gICAgLy8gR2V0IHRoZSBzdWIgY2h1bmsuXG4gICAgY29uc3Qgc3ViY2h1bmsgPSB0aGlzLmdldFN1YkNodW5rKHlmID4+IDQpO1xuXG4gICAgLy8gR2V0IHRoZSBibG9jayBzdGF0ZS5cbiAgICBjb25zdCBzdGF0ZSA9IHN1YmNodW5rLmdldFN0YXRlKHggJiAweGYsIHlmICYgMHhmLCB6ICYgMHhmLCAwKTsgLy8gMCA9IFNvbGlkcywgMSA9IExpcXVpZHMgb3IgTG9nZ2VkXG5cbiAgICAvLyBSZXR1cm4gdGhlIHBlcm11dGF0aW9uLlxuICAgIHJldHVybiBCbG9ja1Blcm11dGF0aW9uLnBlcm11dGF0aW9ucy5nZXQoc3RhdGUpIGFzIEJsb2NrUGVybXV0YXRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBwZXJtdXRhdGlvbiBhdCB0aGUgZ2l2ZW4gWCwgWSBhbmQgWiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHggVGhlIFggY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIHkgVGhlIFkgY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIHogVGhlIFogY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIHBlcm11dGF0aW9uIFRoZSBwZXJtdXRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzZXRQZXJtdXRhdGlvbihcbiAgICBwb3NpdGlvbjogSVBvc2l0aW9uLFxuICAgIHBlcm11dGF0aW9uOiBCbG9ja1Blcm11dGF0aW9uLFxuICAgIGRpcnR5ID0gdHJ1ZVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IHgsIHksIHogfSA9IHBvc2l0aW9uO1xuXG4gICAgLy8gQ29ycmVjdCB0aGUgWSBsZXZlbCBmb3IgdGhlIG92ZXJ3b3JsZC5cbiAgICBjb25zdCB5ZiA9IHRoaXMudHlwZSA9PT0gRGltZW5zaW9uVHlwZS5PdmVyd29ybGQgPyB5ICsgNjQgOiB5O1xuXG4gICAgLy8gR2V0IHRoZSBzdWIgY2h1bmsuXG4gICAgY29uc3Qgc3ViY2h1bmsgPSB0aGlzLmdldFN1YkNodW5rKHlmID4+IDQpO1xuXG4gICAgLy8gR2V0IHRoZSBibG9jayBzdGF0ZS5cbiAgICBjb25zdCBzdGF0ZSA9IHBlcm11dGF0aW9uLm5ldHdvcms7XG5cbiAgICAvLyBTZXQgdGhlIGJsb2NrLlxuICAgIHN1YmNodW5rLnNldFN0YXRlKHggJiAweGYsIHlmICYgMHhmLCB6ICYgMHhmLCBzdGF0ZSwgMCk7IC8vIDAgPSBTb2xpZHMsIDEgPSBMaXF1aWRzIG9yIExvZ2dlZFxuXG4gICAgLy8gU2V0IHRoZSBjaHVuayBhcyBkaXJ0eS5cbiAgICBpZiAoZGlydHkpIHRoaXMuZGlydHkgPSB0cnVlO1xuXG4gICAgLy8gU2V0IHRoZSBjYWNoZSBhcyBudWxsLlxuICAgIHRoaXMuY2FjaGUgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdG9wbW9zdCBsZXZlbCBpbiB3aGljaCBhIHBlcm11dGF0aW9uIGlzIG5vdCBhaXIsIGF0IHRoZSBnaXZlbiBYIGFuZCBaIGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyBUaGUgdG9wbW9zdCBsZXZlbCBpbiB3aGljaCBhIHBlcm11dGF0aW9uIGlzIG5vdCBhaXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0VG9wbW9zdExldmVsKHBvc2l0aW9uOiBJUG9zaXRpb24pOiBudW1iZXIge1xuICAgIC8vIEdldCB0aGUgWSBsZXZlbC5cbiAgICBmb3IgKGxldCB5ID0gcG9zaXRpb24ueTsgeSA+PSAtNjQ7IHktLSkge1xuICAgICAgLy8gR2V0IHRoZSBwZXJtdXRhdGlvbiBhdCB0aGUgcG9zaXRpb24uXG4gICAgICBjb25zdCBwZXJtdXRhdGlvbiA9IHRoaXMuZ2V0UGVybXV0YXRpb24oeyAuLi5wb3NpdGlvbiwgeSB9KTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBlcm11dGF0aW9uIGlzIGFpciBvciBpcyBub3Qgc29saWQuXG4gICAgICBpZiAocGVybXV0YXRpb24udHlwZS5pZGVudGlmaWVyID09PSBCbG9ja0lkZW50aWZpZXIuQWlyKSBjb250aW51ZTtcbiAgICAgIGlmICghcGVybXV0YXRpb24udHlwZS5zb2xpZCkgY29udGludWU7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgWSBsZXZlbC5cbiAgICAgIHJldHVybiB5O1xuICAgIH1cblxuICAgIC8vIFJldHVybiAwIGlmIG5vIGJsb2NrIHdhcyBmb3VuZC5cbiAgICByZXR1cm4gLTY0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYm90dG9tbW9zdCBsZXZlbCBpbiB3aGljaCBhIHBlcm11dGF0aW9uIGlzIG5vdCBhaXIsIGF0IHRoZSBnaXZlbiBYIGFuZCBaIGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyBUaGUgYm90dG9tbW9zdCBsZXZlbCBpbiB3aGljaCBhIHBlcm11dGF0aW9uIGlzIG5vdCBhaXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0Qm90dG9tbW9zdExldmVsKHBvc2l0aW9uOiBJUG9zaXRpb24pOiBudW1iZXIge1xuICAgIC8vIEdldCB0aGUgWSBsZXZlbC5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8PSBwb3NpdGlvbi55OyB5KyspIHtcbiAgICAgIGNvbnN0IHBlcm11dGF0aW9uID0gdGhpcy5nZXRQZXJtdXRhdGlvbih7IC4uLnBvc2l0aW9uLCB5IH0pO1xuICAgICAgaWYgKHBlcm11dGF0aW9uLnR5cGUuaWRlbnRpZmllciAhPT0gQmxvY2tJZGVudGlmaWVyLkFpcikgcmV0dXJuIHk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIDAgaWYgbm8gYmxvY2sgd2FzIGZvdW5kLlxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3ViIGNodW5rIGF0IHRoZSBnaXZlbiBpbmRleC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleC5cbiAgICovXG4gIHB1YmxpYyBnZXRTdWJDaHVuayhpbmRleDogbnVtYmVyKTogU3ViQ2h1bmsge1xuICAgIC8vIENoZWNrIGlmIHRoZSBpbmRleCBpcyBiZWxvdyAwLlxuICAgIC8vIFRoZW4gd2lsbCB3ZSByZXR1cm4gdGhlIGJvdHRvbSBzdWIgY2h1bmsuXG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIHRoaXMuZ2V0U3ViQ2h1bmsoMCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaW5kZXggaXMgYWJvdmUgdGhlIG1heGltdW0gc3ViIGNodW5rcy5cbiAgICAvLyBUaGVuIHdpbGwgd2UgcmV0dXJuIHRoZSB0b3Agc3ViIGNodW5rLlxuICAgIGlmIChpbmRleCA+PSBDaHVuay5NQVhfU1VCX0NIVU5LUylcbiAgICAgIHJldHVybiB0aGlzLmdldFN1YkNodW5rKENodW5rLk1BWF9TVUJfQ0hVTktTIC0gMSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgc3ViIGNodW5rIGV4aXN0cy5cbiAgICBpZiAoIXRoaXMuc3ViY2h1bmtzW2luZGV4XSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHN1YiBjaHVuay5cbiAgICAgIGZvciAobGV0IG5kZXggPSAwOyBuZGV4IDw9IGluZGV4OyBuZGV4KyspIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN1YiBjaHVuayBleGlzdHMuXG4gICAgICAgIGlmICh0aGlzLnN1YmNodW5rc1tuZGV4XSkgY29udGludWU7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHN1YiBjaHVuay5cbiAgICAgICAgY29uc3Qgc3ViY2h1bmsgPSBuZXcgU3ViQ2h1bmsoKTtcbiAgICAgICAgc3ViY2h1bmsuaW5kZXggPVxuICAgICAgICAgIHRoaXMudHlwZSA9PT0gRGltZW5zaW9uVHlwZS5PdmVyd29ybGQgPyBuZGV4IC0gNCA6IG5kZXg7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBzdWIgY2h1bmsuXG4gICAgICAgIHRoaXMuc3ViY2h1bmtzW25kZXhdID0gc3ViY2h1bms7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBzdWIgY2h1bmsuXG4gICAgcmV0dXJuIHRoaXMuc3ViY2h1bmtzW2luZGV4XSBhcyBTdWJDaHVuaztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFtb3VudCBvZiBzdWIgY2h1bmtzIHRoYXQgbmVlZCB0byBiZSBzZW50LlxuICAgKi9cbiAgcHVibGljIGdldFN1YkNodW5rU2VuZENvdW50KCk6IG51bWJlciB7XG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggc3ViIGNodW5rLlxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChsZXQgaW5kZXggPSBDaHVuay5NQVhfU1VCX0NIVU5LUyAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbiAgICAgIC8vIEdldCB0aGUgc3ViIGNodW5rLlxuICAgICAgY29uc3Qgc3ViY2h1bmsgPSB0aGlzLnN1YmNodW5rc1tpbmRleF07XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdWIgY2h1bmsgZXhpc3RzLlxuICAgICAgaWYgKCFzdWJjaHVuayB8fCBzdWJjaHVuay5pc0VtcHR5KCkpIGNvdW50Kys7XG4gICAgICAvLyBCcmVhayBpZiB0aGUgc3ViIGNodW5rIGlzIG5vdCBlbXB0eSwgYXMgYWxsIHN1YiBjaHVua3MgYWZ0ZXIgdGhpcyB3aWxsIG5vdCBiZSBlbXB0eS5cbiAgICAgIGVsc2UgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBjb3VudC5cbiAgICByZXR1cm4gQ2h1bmsuTUFYX1NVQl9DSFVOS1MgLSBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgY2h1bmsgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBzdWIgY2h1bmsuXG4gICAgZm9yIChjb25zdCBzdWJjaHVuayBvZiB0aGlzLnN1YmNodW5rcykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN1YiBjaHVuayBpcyBlbXB0eS5cbiAgICAgIGlmICghc3ViY2h1bmsgfHwgIXN1YmNodW5rLmlzRW1wdHkoKSkge1xuICAgICAgICAvLyBUaGUgY2h1bmsgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGNodW5rIGlzIGVtcHR5LlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGUgY2h1bmsgaW50byBhIGJ1ZmZlci5cbiAgICogQHBhcmFtIGNodW5rIFRoZSBjaHVuayB0byBzZXJpYWxpemUuXG4gICAqIEBwYXJhbSBuYnQgSWYgYmxvY2sgcGFsZXR0ZSBzaG91bGQgYmUgc2VyaWFsaXplZCBhcyBOQlQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXJpYWxpemVkIGJ1ZmZlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGNodW5rOiBDaHVuaywgbmJ0ID0gZmFsc2UpOiBCdWZmZXIge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBoYXMgYSBjYWNoZS5cbiAgICBpZiAoY2h1bmsuY2FjaGUpIHJldHVybiBjaHVuay5jYWNoZTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBzdHJlYW0uXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gU2VyaWFsaXplIGVhY2ggc3ViIGNodW5rLlxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaHVuay5nZXRTdWJDaHVua1NlbmRDb3VudCgpOyBpbmRleCsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHN1YiBjaHVuay5cbiAgICAgIGNvbnN0IHN1YmNodW5rID0gY2h1bmsuc3ViY2h1bmtzW2luZGV4XTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN1YiBjaHVuayBleGlzdHMuXG4gICAgICBpZiAoc3ViY2h1bmspIHtcbiAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBzdWIgY2h1bmsuXG4gICAgICAgIFN1YkNodW5rLnNlcmlhbGl6ZShzdWJjaHVuaywgc3RyZWFtLCBuYnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IHN1YiBjaHVuay5cbiAgICAgICAgY29uc3Qgc3ViY2h1bmsgPSBuZXcgU3ViQ2h1bmsoKTtcbiAgICAgICAgc3ViY2h1bmsuaW5kZXggPSBpbmRleDtcblxuICAgICAgICAvLyBTZXJpYWxpemUgYW4gZW1wdHkgc3ViIGNodW5rLlxuICAgICAgICBTdWJDaHVuay5zZXJpYWxpemUoc3ViY2h1bmssIHN0cmVhbSwgbmJ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCaW9tZXM/XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDI0OyBpbmRleCsrKSB7XG4gICAgICBzdHJlYW0ud3JpdGVCeXRlKDApO1xuICAgICAgc3RyZWFtLndyaXRlVmFySW50KDEgPDwgMSk7XG4gICAgfVxuXG4gICAgLy8gQm9yZGVyIGJsb2Nrcz9cbiAgICBzdHJlYW0ud3JpdGVCeXRlKDApO1xuXG4gICAgLy8gU2V0IHRoZSBjYWNoZSBvZiB0aGUgY2h1bmsuXG4gICAgY2h1bmsuY2FjaGUgPSBzdHJlYW0uZ2V0QnVmZmVyKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGJ1ZmZlci5cbiAgICByZXR1cm4gY2h1bmsuY2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYSBidWZmZXIgaW50byBhIGNodW5rLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgZGltZW5zaW9uIHR5cGUgb2YgdGhlIGNodW5rLlxuICAgKiBAcGFyYW0geCBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSBjaHVuay5cbiAgICogQHBhcmFtIHogVGhlIFogY29vcmRpbmF0ZSBvZiB0aGUgY2h1bmsuXG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciB0byBkZXNlcmlhbGl6ZS5cbiAgICogQHBhcmFtIG5idCBJZiBibG9jayBwYWxldHRlIHNob3VsZCBiZSBkZXNlcmlhbGl6ZWQgYXMgTkJULlxuICAgKiBAcmV0dXJucyBUaGUgZGVzZXJpYWxpemVkIGNodW5rLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShcbiAgICB0eXBlOiBEaW1lbnNpb25UeXBlLFxuICAgIHg6IG51bWJlcixcbiAgICB6OiBudW1iZXIsXG4gICAgYnVmZmVyOiBCdWZmZXIsXG4gICAgbmJ0ID0gZmFsc2VcbiAgKTogQ2h1bmsge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBzdHJlYW0uXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgLy8gRGVzZXJpYWxpemUgZWFjaCBzdWIgY2h1bmsuXG4gICAgY29uc3Qgc3ViY2h1bmtzOiBBcnJheTxTdWJDaHVuaz4gPSBBcnJheS5mcm9tKFxuICAgICAgeyBsZW5ndGg6IENodW5rLk1BWF9TVUJfQ0hVTktTIH0sXG4gICAgICAoKSA9PiBuZXcgU3ViQ2h1bmsoKVxuICAgICk7XG5cbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBzdWIgY2h1bmsuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IENodW5rLk1BWF9TVUJfQ0hVTktTOyArK2luZGV4KSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBzdHJlYW0uYmluYXJ5W3N0cmVhbS5vZmZzZXRdO1xuXG4gICAgICBpZiAoaGVhZGVyICE9PSA4ICYmIGhlYWRlciAhPT0gOSkgYnJlYWs7XG4gICAgICBzdWJjaHVua3NbaW5kZXhdID0gU3ViQ2h1bmsuZGVzZXJpYWxpemUoc3RyZWFtLCBuYnQpO1xuICAgIH1cblxuICAgIC8vIEJpb21lcz9cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMjQ7IGluZGV4KyspIHtcbiAgICAgIHN0cmVhbS5yZWFkQnl0ZSgpO1xuICAgICAgc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICB9XG5cbiAgICAvLyBCb3JkZXIgYmxvY2tzP1xuICAgIHN0cmVhbS5yZWFkQnl0ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNodW5rLlxuICAgIGNvbnN0IGNodW5rID0gbmV3IENodW5rKHgsIHosIHR5cGUsIHN1YmNodW5rcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNodW5rLlxuICAgIHJldHVybiBjaHVuaztcbiAgfVxufVxuIiwgImltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIi4uLy4uL3NlcmVuaXR5XCI7XG5pbXBvcnQge1xuICBCbG9ja0VudHJ5LFxuICBFbnRpdHlFbnRyeSxcbiAgUGxheWVyRW50cnksXG4gIFdvcmxkUHJvcGVydGllcyxcbiAgV29ybGRQcm92aWRlclByb3BlcnRpZXNcbn0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDaHVuayB9IGZyb20gXCIuLi9jaHVuay9jaHVua1wiO1xuaW1wb3J0IHsgRGltZW5zaW9uIH0gZnJvbSBcIi4uL2RpbWVuc2lvblwiO1xuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiLi4vd29ybGRcIjtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB3b3JsZCBwcm92aWRlciBwcm9wZXJ0aWVzLlxuICovXG5jb25zdCBEZWZhdWx0V29ybGRQcm92aWRlclByb3BlcnRpZXM6IFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzID0ge1xuICBwYXRoOiBcIi4vd29ybGRzXCJcbn07XG5cbmNsYXNzIFdvcmxkUHJvdmlkZXIge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFdvcmxkUHJvdmlkZXIpXG4gICAgLmlkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JsZCB0aGF0IHRoZSBwcm92aWRlciBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHdvcmxkITogV29ybGQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB3b3JsZCBwcm92aWRlci5cbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoLi4uX3BhcmFtZXRlcnM6IEFycmF5PHVua25vd24+KSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHByb3ZpZGVyIGlzIHN0YXJ0ZWQuXG4gICAqL1xuICBwdWJsaWMgb25TdGFydHVwKCk6IHZvaWQge31cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHByb3ZpZGVyIGlzIHNodXRkb3duLlxuICAgKi9cbiAgcHVibGljIG9uU2h1dGRvd24oKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcHJvdmlkZXIgaXMgc2F2ZWQuXG4gICAqL1xuICBwdWJsaWMgb25TYXZlKCk6IHZvaWQge31cblxuICAvKipcbiAgICogUmVhZHMgYSBjaHVuayBmb3IgYSBzcGVjaWZpZWQgZGltZW5zaW9uIGZyb20gdGhlIHByb3ZpZGVyLlxuICAgKiBAcGFyYW0gY3ggVGhlIGNodW5rIHggY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGN6IFRoZSBjaHVuayB6IGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byByZWFkIHRoZSBjaHVuayBmcm9tLlxuICAgKi9cbiAgcHVibGljIHJlYWRDaHVuayhfY3g6IG51bWJlciwgX2N6OiBudW1iZXIsIF9kaW1lbnNpb246IERpbWVuc2lvbik6IENodW5rIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS5yZWFkQ2h1bmsoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgY2h1bmsgZm9yIGEgc3BlY2lmaWVkIGRpbWVuc2lvbiB0byB0aGUgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gd3JpdGUuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byB3cml0ZSB0aGUgY2h1bmsgdG8uXG4gICAqL1xuICBwdWJsaWMgd3JpdGVDaHVuayhfY2h1bms6IENodW5rLCBfZGltZW5zaW9uOiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS53cml0ZUNodW5rKCkgaXMgbm90IGltcGxlbWVudGVkIWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBhdmFpbGFibGUgZW50aXRpZXMgZm9yIGEgc3BlY2lmaWVkIGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIGdldCB0aGUgYXZhaWxhYmxlIGVudGl0aWVzIGZvci5cbiAgICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBlbnRpdGllcy5cbiAgICovXG4gIHB1YmxpYyByZWFkQXZhaWxhYmxlRW50aXRpZXMoX2RpbWVuc2lvbjogRGltZW5zaW9uKTogQXJyYXk8YmlnaW50PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7dGhpcy5pZGVudGlmaWVyfS5nZXRBdmFpbGFibGVFbnRpdGllcygpIGlzIG5vdCBpbXBsZW1lbnRlZCFgXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIGF2YWlsYWJsZSBlbnRpdGllcyBmb3IgYSBzcGVjaWZpZWQgZGltZW5zaW9uLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gd3JpdGUgdGhlIGF2YWlsYWJsZSBlbnRpdGllcyBmb3IuXG4gICAqIEBwYXJhbSBlbnRpdGllcyBUaGUgZW50aXRpZXMgdG8gd3JpdGUuXG4gICAqL1xuICBwdWJsaWMgd3JpdGVBdmFpbGFibGVFbnRpdGllcyhcbiAgICBfZGltZW5zaW9uOiBEaW1lbnNpb24sXG4gICAgX2VudGl0aWVzOiBBcnJheTxiaWdpbnQ+XG4gICk6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke3RoaXMuaWRlbnRpZmllcn0ud3JpdGVBdmFpbGFibGVFbnRpdGllcygpIGlzIG5vdCBpbXBsZW1lbnRlZCFgXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBlbnRpdHkgZnJvbSB0aGUgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSB1bmlxdWVJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGVudGl0eSB0byByZWFkLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gcmVhZCB0aGUgZW50aXR5IGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBlbnRpdHkgZGF0YS5cbiAgICovXG4gIHB1YmxpYyByZWFkRW50aXR5KF91bmlxdWVJZDogYmlnaW50LCBfZGltZW5zaW9uOiBEaW1lbnNpb24pOiBFbnRpdHlFbnRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuaWRlbnRpZmllcn0ucmVhZEVudGl0eSgpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYW4gZW50aXR5IHRvIHRoZSBwcm92aWRlci5cbiAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IGRhdGEgdG8gd3JpdGUuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byB3cml0ZSB0aGUgZW50aXR5IHRvLlxuICAgKi9cbiAgcHVibGljIHdyaXRlRW50aXR5KF9lbnRpdHk6IEVudGl0eUVudHJ5LCBfZGltZW5zaW9uOiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS53cml0ZUVudGl0eSgpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHBsYXllcnMgZGF0YSBmcm9tIHRoZSBwcm92aWRlci5cbiAgICogQHBhcmFtIHV1aWQgVGhlIHV1aWQgb2YgdGhlIHBsYXllciB0byByZWFkLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gcmVhZCB0aGUgcGxheWVyIGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBwbGF5ZXIgZGF0YSBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgcmVhZFBsYXllcihfdXVpZDogc3RyaW5nLCBfZGltZW5zaW9uOiBEaW1lbnNpb24pOiBQbGF5ZXJFbnRyeSB8IG51bGwge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmlkZW50aWZpZXJ9LnJlYWRQbGF5ZXIoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgcGxheWVycyBkYXRhIHRvIHRoZSBwcm92aWRlci5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIGRhdGEgdG8gd3JpdGUuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byB3cml0ZSB0aGUgcGxheWVyIHRvLlxuICAgKi9cbiAgcHVibGljIHdyaXRlUGxheWVyKF9wbGF5ZXI6IFBsYXllckVudHJ5LCBfZGltZW5zaW9uOiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS53cml0ZVBsYXllcigpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgYXZhaWxhYmxlIGJsb2NrcyBmb3IgYSBzcGVjaWZpZWQgZGltZW5zaW9uLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gcmVhZCB0aGUgYXZhaWxhYmxlIGJsb2NrcyBmb3IuXG4gICAqL1xuICBwdWJsaWMgcmVhZEF2YWlsYWJsZUJsb2NrcyhfZGltZW5zaW9uOiBEaW1lbnNpb24pOiBBcnJheTxiaWdpbnQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHt0aGlzLmlkZW50aWZpZXJ9LnJlYWRBdmFpbGFibGVCbG9ja3MoKSBpcyBub3QgaW1wbGVtZW50ZWQhYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBhdmFpbGFibGUgYmxvY2tzIGZvciBhIHNwZWNpZmllZCBkaW1lbnNpb24uXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byB3cml0ZSB0aGUgYXZhaWxhYmxlIGJsb2NrcyBmb3IuXG4gICAqIEBwYXJhbSBibG9ja3MgVGhlIGJsb2NrcyB0byB3cml0ZS5cbiAgICovXG4gIHB1YmxpYyB3cml0ZUF2YWlsYWJsZUJsb2NrcyhcbiAgICBfZGltZW5zaW9uOiBEaW1lbnNpb24sXG4gICAgX2Jsb2NrczogQXJyYXk8YmlnaW50PlxuICApOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHt0aGlzLmlkZW50aWZpZXJ9LndyaXRlQXZhaWxhYmxlQmxvY2tzKCkgaXMgbm90IGltcGxlbWVudGVkIWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgYmxvY2sgZnJvbSB0aGUgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBoYXNoIFRoZSBwb3NpdGlvbiBoYXNoIHRvIHJlYWQgdGhlIGJsb2NrIGZyb20uXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byByZWFkIHRoZSBibG9jayBmcm9tLlxuICAgKi9cbiAgcHVibGljIHJlYWRCbG9jayhfaGFzaDogYmlnaW50LCBfZGltZW5zaW9uOiBEaW1lbnNpb24pOiBCbG9ja0VudHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5pZGVudGlmaWVyfS5yZWFkQmxvY2soKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgYmxvY2sgdG8gdGhlIHByb3ZpZGVyLlxuICAgKiBAcGFyYW0gYmxvY2sgVGhlIGJsb2NrIHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gd3JpdGUgdGhlIGJsb2NrIHRvLlxuICAgKiBAcmV0dXJucyBUaGUgYmxvY2sgZGF0YS5cbiAgICovXG4gIHB1YmxpYyB3cml0ZUJsb2NrKF9ibG9jazogQmxvY2tFbnRyeSwgX2RpbWVuc2lvbjogRGltZW5zaW9uKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuaWRlbnRpZmllcn0ud3JpdGVCbG9jaygpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSBwcm9wZXJ0eSB0byB0aGUgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gd3JpdGUuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIHdyaXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRQcm9wZXJ0eShfa2V5OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmlkZW50aWZpZXJ9LnJlYWRQcm9wZXJ0eSgpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSBwcm9wZXJ0eSB0byB0aGUgcHJvdmlkZXIuXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gd3JpdGUuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIHdyaXRlLlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIHdyaXRlUHJvcGVydHkoX2tleTogQnVmZmVyLCBfdmFsdWU6IEJ1ZmZlcik6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmlkZW50aWZpZXJ9LndyaXRlUHJvcGVydHkoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHByb3ZpZGVyIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IGluc3RhbmNlIHRvIHVzZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgdG8gdXNlIGZvciB0aGUgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGluaXRpYWxpemUoXG4gICAgX3NlcmVuaXR5OiBTZXJlbml0eSxcbiAgICBfcHJvcGVydGllczogV29ybGRQcm92aWRlclByb3BlcnRpZXNcbiAgKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuaWRlbnRpZmllcn0uaW5pdGlhbGl6ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgIF9zZXJlbml0eTogU2VyZW5pdHksXG4gICAgX3Byb3BlcnRpZXM6IFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzLFxuICAgIF93b3JsZFByb3BlcnRpZXM/OiBQYXJ0aWFsPFdvcmxkUHJvcGVydGllcz5cbiAgKTogV29ybGQge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmlkZW50aWZpZXJ9LmNyZWF0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCFgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBXb3JsZFByb3ZpZGVyLCBEZWZhdWx0V29ybGRQcm92aWRlclByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyBDaHVua0Nvb3JkcyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCIuLi8uLi9zZXJlbml0eVwiO1xuaW1wb3J0IHtcbiAgRW50aXR5RW50cnksXG4gIFBsYXllckVudHJ5LFxuICBXb3JsZFByb3BlcnRpZXMsXG4gIFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzXG59IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi4vY2h1bmtcIjtcbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5pbXBvcnQgeyBEaW1lbnNpb24gfSBmcm9tIFwiLi4vZGltZW5zaW9uXCI7XG5cbmltcG9ydCB7IFdvcmxkUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlclwiO1xuXG5jbGFzcyBJbnRlcm5hbFByb3ZpZGVyIGV4dGVuZHMgV29ybGRQcm92aWRlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiaW50ZXJuYWxcIjtcblxuICAvKipcbiAgICogVGhlIGxvYWRlZCBjaHVua3MgaW4gdGhlIHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNodW5rcyA9IG5ldyBNYXA8RGltZW5zaW9uLCBNYXA8YmlnaW50LCBDaHVuaz4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdGllcyB0aGF0IGV4aXN0IGZvciB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgTWFwPERpbWVuc2lvbiwgTWFwPGJpZ2ludCwgRW50aXR5RW50cnk+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxheWVycyB0aGF0IGV4aXN0IGZvciB0aGUgd29ybGQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVycyA9IG5ldyBNYXA8RGltZW5zaW9uLCBNYXA8c3RyaW5nLCBQbGF5ZXJFbnRyeT4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QgZm9yIHRoZSB3b3JsZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9wZXJ0aWVzID0gbmV3IE1hcDxCdWZmZXIsIEJ1ZmZlcj4oKTtcblxuICBwdWJsaWMgcmVhZENodW5rKGN4OiBudW1iZXIsIGN6OiBudW1iZXIsIGRpbWVuc2lvbjogRGltZW5zaW9uKTogQ2h1bmsge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjaHVua3MgY29udGFpbiB0aGUgZGltZW5zaW9uLlxuICAgIGlmICghdGhpcy5jaHVua3MuaGFzKGRpbWVuc2lvbikpIHtcbiAgICAgIHRoaXMuY2h1bmtzLnNldChkaW1lbnNpb24sIG5ldyBNYXAoKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gY2h1bmtzLlxuICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuY2h1bmtzLmdldChkaW1lbnNpb24pIGFzIE1hcDxiaWdpbnQsIENodW5rPjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjaHVua3MgY29udGFpbiB0aGUgY2h1bmsgaGFzaC5cbiAgICBpZiAoIWNodW5rcy5oYXMoQ2h1bmtDb29yZHMuaGFzaCh7IHg6IGN4LCB6OiBjeiB9KSkpIHtcbiAgICAgIGNodW5rcy5zZXQoXG4gICAgICAgIENodW5rQ29vcmRzLmhhc2goeyB4OiBjeCwgejogY3ogfSksXG4gICAgICAgIGRpbWVuc2lvbi5nZW5lcmF0b3IuYXBwbHkoY3gsIGN6KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGNodW5rIGZyb20gdGhlIGNodW5rcyBtYXAgZm9yIHRoZSBkaW1lbnNpb24uXG4gICAgY29uc3QgY2h1bmsgPSBjaHVua3MuZ2V0KENodW5rQ29vcmRzLmhhc2goeyB4OiBjeCwgejogY3ogfSkpIGFzIENodW5rO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjaHVuay5cbiAgICByZXR1cm4gY2h1bms7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVDaHVuayhjaHVuazogQ2h1bmssIGRpbWVuc2lvbjogRGltZW5zaW9uKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNodW5rcyBjb250YWluIHRoZSBkaW1lbnNpb24uXG4gICAgaWYgKCF0aGlzLmNodW5rcy5oYXMoZGltZW5zaW9uKSkge1xuICAgICAgdGhpcy5jaHVua3Muc2V0KGRpbWVuc2lvbiwgbmV3IE1hcCgpKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbiBjaHVua3MuXG4gICAgY29uc3QgY2h1bmtzID0gdGhpcy5jaHVua3MuZ2V0KGRpbWVuc2lvbikgYXMgTWFwPGJpZ2ludCwgQ2h1bms+O1xuXG4gICAgLy8gU2V0IHRoZSBjaHVuay5cbiAgICBjaHVua3Muc2V0KENodW5rQ29vcmRzLmhhc2goeyB4OiBjaHVuay54LCB6OiBjaHVuay56IH0pLCBjaHVuayk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXZhaWxhYmxlRW50aXRpZXMoZGltZW5zaW9uOiBEaW1lbnNpb24pOiBBcnJheTxiaWdpbnQ+IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXRpZXMgY29udGFpbiB0aGUgZGltZW5zaW9uLlxuICAgIGlmICghdGhpcy5lbnRpdGllcy5oYXMoZGltZW5zaW9uKSkge1xuICAgICAgdGhpcy5lbnRpdGllcy5zZXQoZGltZW5zaW9uLCBuZXcgTWFwKCkpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGVudGl0aWVzLlxuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5lbnRpdGllcy5nZXQoZGltZW5zaW9uKSBhcyBNYXA8YmlnaW50LCBFbnRpdHlFbnRyeT47XG5cbiAgICAvLyBSZXR1cm4gdGhlIGVudGl0eSB1bmlxdWUgaWRzLlxuICAgIHJldHVybiBbLi4uZW50aXRpZXNdLm1hcCgoW3VuaXF1ZUlkXSkgPT4gdW5pcXVlSWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRFbnRpdHkodW5pcXVlSWQ6IGJpZ2ludCwgZGltZW5zaW9uOiBEaW1lbnNpb24pOiBFbnRpdHlFbnRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0aWVzIGNvbnRhaW4gdGhlIGRpbWVuc2lvbi5cbiAgICBpZiAoIXRoaXMuZW50aXRpZXMuaGFzKGRpbWVuc2lvbikpIHtcbiAgICAgIHRoaXMuZW50aXRpZXMuc2V0KGRpbWVuc2lvbiwgbmV3IE1hcCgpKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbiBlbnRpdGllcy5cbiAgICBjb25zdCBlbnRpdGllcyA9IHRoaXMuZW50aXRpZXMuZ2V0KGRpbWVuc2lvbikgYXMgTWFwPGJpZ2ludCwgRW50aXR5RW50cnk+O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0aWVzIGNvbnRhaW4gdGhlIHVuaXF1ZSBpZC5cbiAgICBpZiAoIWVudGl0aWVzLmhhcyh1bmlxdWVJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5IHdpdGggdW5pcXVlIGlkICR7dW5pcXVlSWR9IG5vdCBmb3VuZCFgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGVudGl0eS5cbiAgICByZXR1cm4gZW50aXRpZXMuZ2V0KHVuaXF1ZUlkKSBhcyBFbnRpdHlFbnRyeTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZUVudGl0eShlbnRpdHk6IEVudGl0eUVudHJ5LCBkaW1lbnNpb246IERpbWVuc2lvbik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdGllcyBjb250YWluIHRoZSBkaW1lbnNpb24uXG4gICAgaWYgKCF0aGlzLmVudGl0aWVzLmhhcyhkaW1lbnNpb24pKSB7XG4gICAgICB0aGlzLmVudGl0aWVzLnNldChkaW1lbnNpb24sIG5ldyBNYXAoKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gZW50aXRpZXMuXG4gICAgY29uc3QgZW50aXRpZXMgPSB0aGlzLmVudGl0aWVzLmdldChkaW1lbnNpb24pIGFzIE1hcDxiaWdpbnQsIEVudGl0eUVudHJ5PjtcblxuICAgIC8vIFNldCB0aGUgZW50aXR5LlxuICAgIGVudGl0aWVzLnNldChlbnRpdHkudW5pcXVlSWQsIGVudGl0eSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZFBsYXllcih1dWlkOiBzdHJpbmcsIGRpbWVuc2lvbjogRGltZW5zaW9uKTogUGxheWVyRW50cnkgfCBudWxsIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVycyBjb250YWluIHRoZSBkaW1lbnNpb24uXG4gICAgaWYgKCF0aGlzLnBsYXllcnMuaGFzKGRpbWVuc2lvbikpIHtcbiAgICAgIHRoaXMucGxheWVycy5zZXQoZGltZW5zaW9uLCBuZXcgTWFwKCkpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIHBsYXllcnMuXG4gICAgY29uc3QgcGxheWVycyA9IHRoaXMucGxheWVycy5nZXQoZGltZW5zaW9uKSBhcyBNYXA8c3RyaW5nLCBQbGF5ZXJFbnRyeT47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVycyBjb250YWluIHRoZSB1dWlkLlxuICAgIGlmICghcGxheWVycy5oYXModXVpZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgcGxheWVyLlxuICAgIHJldHVybiBwbGF5ZXJzLmdldCh1dWlkKSBhcyBQbGF5ZXJFbnRyeTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVBsYXllcihwbGF5ZXI6IFBsYXllckVudHJ5LCBkaW1lbnNpb246IERpbWVuc2lvbik6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXJzIGNvbnRhaW4gdGhlIGRpbWVuc2lvbi5cbiAgICBpZiAoIXRoaXMucGxheWVycy5oYXMoZGltZW5zaW9uKSkge1xuICAgICAgdGhpcy5wbGF5ZXJzLnNldChkaW1lbnNpb24sIG5ldyBNYXAoKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gcGxheWVycy5cbiAgICBjb25zdCBwbGF5ZXJzID0gdGhpcy5wbGF5ZXJzLmdldChkaW1lbnNpb24pIGFzIE1hcDxzdHJpbmcsIFBsYXllckVudHJ5PjtcblxuICAgIC8vIFNldCB0aGUgcGxheWVyLlxuICAgIHBsYXllcnMuc2V0KHBsYXllci51dWlkLCBwbGF5ZXIpO1xuICB9XG5cbiAgcHVibGljIHJlYWRQcm9wZXJ0eShrZXk6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBwcm9wZXJ0aWVzLlxuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5LCB2YWx1ZV0gb2YgdGhpcy5wcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcHJvcGVydHkgaXMgZXF1YWwgdG8gdGhlIGtleS5cbiAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoa2V5KSkgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFRocm93IGFuIGVycm9yIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSB3aXRoIGtleSAke2tleS50b1N0cmluZyhcImhleFwiKX0gbm90IGZvdW5kIWApO1xuICB9XG5cbiAgcHVibGljIHdyaXRlUHJvcGVydHkoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BlcnRpZXMuc2V0KGtleSwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIC8vIERvIG5vdGhpbmcgYXMgdGhlIGludGVybmFsIHByb3ZpZGVyIGRvZXMgbm90IHJlcXVpcmUgaW5pdGlhbGl6YXRpb25cbiAgICByZXR1cm47XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgX3Byb3BlcnRpZXM6IFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzLFxuICAgIHdvcmxkUHJvcGVydGllcz86IFdvcmxkUHJvcGVydGllc1xuICApOiBXb3JsZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHByb3ZpZGVyIGluc3RhbmNlXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgdGhpcygpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHdvcmxkIGluc3RhbmNlXG4gICAgY29uc3Qgd29ybGQgPSBuZXcgV29ybGQoc2VyZW5pdHksIHByb3ZpZGVyLCB3b3JsZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gQXNzaWduIHRoZSB3b3JsZCB0byB0aGUgcHJvdmlkZXJcbiAgICBwcm92aWRlci53b3JsZCA9IHdvcmxkO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjcmVhdGVkIHdvcmxkXG4gICAgcmV0dXJuIHdvcmxkO1xuICB9XG59XG5cbmV4cG9ydCB7IEludGVybmFsUHJvdmlkZXIgfTtcbiIsICJpbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IEJpbmFyeVN0cmVhbSwgRW5kaWFubmVzcyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcbmltcG9ydCB7IExldmVsZGIgfSBmcm9tIFwiQHNlcmVuaXR5anMvbGV2ZWxkYlwiO1xuaW1wb3J0IHsgQmxvY2tQb3NpdGlvbiwgQ2h1bmtDb29yZHMgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgQ2h1bmssIFN1YkNodW5rIH0gZnJvbSBcIi4uL2NodW5rXCI7XG5pbXBvcnQgeyBEaW1lbnNpb24gfSBmcm9tIFwiLi4vZGltZW5zaW9uXCI7XG5pbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCIuLi8uLi9zZXJlbml0eVwiO1xuaW1wb3J0IHtcbiAgQmxvY2tFbnRyeSxcbiAgRGltZW5zaW9uUHJvcGVydGllcyxcbiAgRW50aXR5RW50cnksXG4gIFBsYXllckVudHJ5LFxuICBXb3JsZFByb3BlcnRpZXMsXG4gIFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzXG59IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiLi4vd29ybGRcIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB7IENodW5rUmVhZHlTaWduYWwsIFdvcmxkSW5pdGlhbGl6ZVNpZ25hbCB9IGZyb20gXCIuLi8uLi9ldmVudHNcIjtcbmltcG9ydCB7IEJsb2NrIH0gZnJvbSBcIi4uLy4uL2Jsb2NrXCI7XG5cbmltcG9ydCB7IFdvcmxkUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlclwiO1xuXG5jbGFzcyBMZXZlbERCUHJvdmlkZXIgZXh0ZW5kcyBXb3JsZFByb3ZpZGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmcgPSBcImxldmVsZGJcIjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRhdGFiYXNlIGluc3RhbmNlIGZvciB0aGUgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGI6IExldmVsZGI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2FkZWQgY2h1bmtzIGluIHRoZSBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjaHVua3MgPSBuZXcgTWFwPERpbWVuc2lvbiwgTWFwPGJpZ2ludCwgQ2h1bms+PigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gU2V0IHRoZSBwYXRoIG9mIHRoZSBwcm92aWRlci5cbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuXG4gICAgLy8gT3BlbiB0aGUgZGF0YWJhc2UgZm9yIHRoZSBwcm92aWRlclxuICAgIHRoaXMuZGIgPSBMZXZlbGRiLm9wZW4ocmVzb2x2ZShwYXRoLCBcImRiXCIpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblNodXRkb3duKCk6IHZvaWQge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZGltZW5zaW9ucyBhbmQgdGVybWluYXRlIGFueSB3b3JrZXJzLlxuICAgIGZvciAoY29uc3QgZGltZW5zaW9uIG9mIHRoaXMud29ybGQuZGltZW5zaW9ucy52YWx1ZXMoKSlcbiAgICAgIHZvaWQgZGltZW5zaW9uLmdlbmVyYXRvci53b3JrZXI/LnRlcm1pbmF0ZSgpO1xuXG4gICAgLy8gU2F2ZSBhbGwgdGhlIHdvcmxkIGRhdGEuXG4gICAgdGhpcy5vblNhdmUoKTtcblxuICAgIC8vIENsb3NlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgIHRoaXMuZGIuY2xvc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblN0YXJ0dXAoKTogdm9pZCB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBkaW1lbnNpb25zIGFuZCBsb2FkIHRoZSBlbnRpdGllcy5cbiAgICBmb3IgKGNvbnN0IGRpbWVuc2lvbiBvZiB0aGlzLndvcmxkLmRpbWVuc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgIC8vIEdldCB0aGUgYXZhaWxhYmxlIGVudGl0aWVzICYgYmxvY2tzIGZvciB0aGUgZGltZW5zaW9uLlxuICAgICAgY29uc3QgZW50aXRpZXMgPSB0aGlzLnJlYWRBdmFpbGFibGVFbnRpdGllcyhkaW1lbnNpb24pO1xuICAgICAgY29uc3QgYmxvY2tzID0gdGhpcy5yZWFkQXZhaWxhYmxlQmxvY2tzKGRpbWVuc2lvbik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdGllcyBhcmUgZW1wdHkuXG4gICAgICBpZiAoZW50aXRpZXMubGVuZ3RoID09PSAwICYmIGJsb2Nrcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGVudGl0aWVzIGFuZCBsb2FkIHRoZW0uXG4gICAgICBmb3IgKGNvbnN0IHVuaXF1ZUlkIG9mIGVudGl0aWVzKSB7XG4gICAgICAgIC8vIFJlYWQgdGhlIGVudGl0eSBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnJlYWRFbnRpdHkodW5pcXVlSWQsIGRpbWVuc2lvbik7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGVudGl0eSBpbnN0YW5jZS5cbiAgICAgICAgY29uc3QgZW50aXR5ID0gbmV3IEVudGl0eShkaW1lbnNpb24sIGVudHJ5LmlkZW50aWZpZXIsIHtcbiAgICAgICAgICB1bmlxdWVJZCxcbiAgICAgICAgICBlbnRyeVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgdGhlIGVudGl0eSB0byB0aGUgZGltZW5zaW9uLlxuICAgICAgICBlbnRpdHkuc3Bhd24oKTtcbiAgICAgIH1cblxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBibG9ja3MgYW5kIGxvYWQgdGhlbS5cbiAgICAgIGZvciAoY29uc3QgaGFzaCBvZiBibG9ja3MpIHtcbiAgICAgICAgLy8gUmVhZCB0aGUgYmxvY2sgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5yZWFkQmxvY2soaGFzaCwgZGltZW5zaW9uKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHBlcm11dGF0aW9uIGZyb20gdGhlIGJsb2NrIHBhbGV0dGUuXG4gICAgICAgIGNvbnN0IHBlcm11dGF0aW9uID0gZGltZW5zaW9uLndvcmxkLmJsb2NrUGFsZXR0ZVxuICAgICAgICAgIC5nZXRBbGxQZXJtdXRhdGlvbnMoKVxuICAgICAgICAgIC5maW5kKChwZXJtdXRhdGlvbikgPT4gcGVybXV0YXRpb24ubmV0d29yayA9PT0gZW50cnkucGVybXV0YXRpb24pO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIGJsb2NrIGlmIHRoZSBwZXJtdXRhdGlvbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgaWYgKCFwZXJtdXRhdGlvbikgY29udGludWU7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGJsb2NrIGluc3RhbmNlLlxuICAgICAgICBjb25zdCBibG9jayA9IG5ldyBCbG9jayhcbiAgICAgICAgICBkaW1lbnNpb24sXG4gICAgICAgICAgbmV3IEJsb2NrUG9zaXRpb24oLi4uZW50cnkucG9zaXRpb24pLFxuICAgICAgICAgIHBlcm11dGF0aW9uLFxuICAgICAgICAgIHsgZW50cnkgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIGRpbWVuc2lvbiBibG9ja3MgY29sbGVjdGlvbi5cbiAgICAgICAgZGltZW5zaW9uLmJsb2Nrcy5zZXQoQmxvY2tQb3NpdGlvbi5oYXNoKGJsb2NrLnBvc2l0aW9uKSwgYmxvY2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblNhdmUoKTogdm9pZCB7XG4gICAgLy8gU2F2ZSB0aGUgd29ybGQgcHJvcGVydGllcyB0byB0aGUgd29ybGQgZGlyZWN0b3J5LlxuICAgIC8vIEZpcnN0IHdlIG5lZWQgdG8gZ2V0IGFsbCB0aGUgZGltZW5zaW9uIHByb3BlcnRpZXMuXG4gICAgY29uc3QgZGltZW5zaW9uczogQXJyYXk8RGltZW5zaW9uUHJvcGVydGllcz4gPSBbXG4gICAgICAuLi50aGlzLndvcmxkLmRpbWVuc2lvbnMudmFsdWVzKClcbiAgICBdLm1hcCgoZGltZW5zaW9uKSA9PiBkaW1lbnNpb24ucHJvcGVydGllcyk7XG5cbiAgICAvLyBHZXQgdGhlIHdvcmxkIHByb3BlcnRpZXMuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMud29ybGQucHJvcGVydGllcztcbiAgICBwcm9wZXJ0aWVzLmRpbWVuc2lvbnMgPSBkaW1lbnNpb25zO1xuXG4gICAgLy8gV3JpdGUgdGhlIHByb3BlcnRpZXMgdG8gdGhlIHdvcmxkIGRpcmVjdG9yeS5cbiAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIFwicHJvcGVydGllcy5qc29uXCIpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocHJvcGVydGllcywgbnVsbCwgMilcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBjaHVua3MgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIGRhdGFiYXNlLlxuICAgIGZvciAoY29uc3QgW2RpbWVuc2lvbiwgY2h1bmtzXSBvZiB0aGlzLmNodW5rcykge1xuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBjaHVua3MgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIGRhdGFiYXNlLlxuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MudmFsdWVzKCkpIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyBkaXJ0eS5cbiAgICAgICAgaWYgKGNodW5rLmRpcnR5KSB0aGlzLndyaXRlQ2h1bmsoY2h1bmssIGRpbWVuc2lvbik7XG5cbiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZW50aXRpZXMgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIGRhdGFiYXNlLlxuICAgICAgY29uc3QgZW50aXRpZXMgPSBbLi4uZGltZW5zaW9uLmVudGl0aWVzLnZhbHVlcygpXTtcbiAgICAgIGNvbnN0IHVuaXF1ZUlkczogQXJyYXk8YmlnaW50PiA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBhIHBsYXllci5cbiAgICAgICAgaWYgKGVudGl0eS5pc1BsYXllcigpKVxuICAgICAgICAgIHRoaXMud3JpdGVQbGF5ZXIoZW50aXR5LmdldERhdGFFbnRyeSgpLCBkaW1lbnNpb24pO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyBXcml0ZSB0aGUgZW50aXR5IHRvIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgICB0aGlzLndyaXRlRW50aXR5KGVudGl0eS5nZXREYXRhRW50cnkoKSwgZGltZW5zaW9uKTtcbiAgICAgICAgICAvLyBBZGQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIHRvIHRoZSBsaXN0LlxuICAgICAgICAgIHVuaXF1ZUlkcy5wdXNoKGVudGl0eS51bmlxdWVJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gV3JpdGUgdGhlIGF2YWlsYWJsZSBlbnRpdGllcyB0byB0aGUgZGF0YWJhc2UuXG4gICAgICB0aGlzLndyaXRlQXZhaWxhYmxlRW50aXRpZXMoZGltZW5zaW9uLCB1bmlxdWVJZHMpO1xuXG4gICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGJsb2NrcyBhbmQgd3JpdGUgdGhlbSB0byB0aGUgZGF0YWJhc2UuXG4gICAgICBjb25zdCBibG9ja3MgPSBbLi4uZGltZW5zaW9uLmJsb2Nrcy52YWx1ZXMoKV07XG4gICAgICBjb25zdCBoYXNoZXM6IEFycmF5PGJpZ2ludD4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYmxvY2sgb2YgYmxvY2tzKSB7XG4gICAgICAgIC8vIFdyaXRlIHRoZSBibG9jayB0byB0aGUgZGF0YWJhc2UuXG4gICAgICAgIHRoaXMud3JpdGVCbG9jayhibG9jay5nZXREYXRhRW50cnkoKSwgZGltZW5zaW9uKTtcblxuICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHBvc2l0aW9uIGhhc2ggdG8gdGhlIGxpc3QuXG4gICAgICAgIGhhc2hlcy5wdXNoKEJsb2NrUG9zaXRpb24uaGFzaChibG9jay5wb3NpdGlvbikpO1xuICAgICAgfVxuXG4gICAgICAvLyBXcml0ZSB0aGUgYXZhaWxhYmxlIGJsb2NrcyB0byB0aGUgZGF0YWJhc2UuXG4gICAgICB0aGlzLndyaXRlQXZhaWxhYmxlQmxvY2tzKGRpbWVuc2lvbiwgaGFzaGVzKTtcblxuICAgICAgLy8gTG9nIHRoZSBhbW91bnQgb2YgY2h1bmtzLCBlbnRpdGllcywgYW5kIGJsb2NrcyBzYXZlZC5cbiAgICAgIHRoaXMud29ybGQubG9nZ2VyLmluZm8oXG4gICAgICAgIGBTYXZlZCDCp2Mke2NodW5rcy5zaXplfcKnciBjaHVua3MsIMKnYyR7ZW50aXRpZXMubGVuZ3RofcKnciBlbnRpdGllcywgYW5kIMKnYyR7YmxvY2tzLmxlbmd0aH3Cp3IgYmxvY2tzIGZvciBkaW1lbnNpb24gwqdhJHtkaW1lbnNpb24uaWRlbnRpZmllcn3Cp3IuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVhZENodW5rKGN4OiBudW1iZXIsIGN6OiBudW1iZXIsIGRpbWVuc2lvbjogRGltZW5zaW9uKTogQ2h1bmsge1xuICAgIC8vIENoZWNrIGlmIHRoZSBjaHVua3MgY29udGFpbiB0aGUgZGltZW5zaW9uLlxuICAgIGlmICghdGhpcy5jaHVua3MuaGFzKGRpbWVuc2lvbikpIHtcbiAgICAgIHRoaXMuY2h1bmtzLnNldChkaW1lbnNpb24sIG5ldyBNYXAoKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gY2h1bmtzLlxuICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuY2h1bmtzLmdldChkaW1lbnNpb24pIGFzIE1hcDxiaWdpbnQsIENodW5rPjtcblxuICAgIC8vIEdlbmVyYXRlIGEgaGFzaCBmb3IgdGhlIGNodW5rIGNvb3JkaW5hdGVzLlxuICAgIGNvbnN0IGhhc2ggPSBDaHVua0Nvb3Jkcy5oYXNoKHsgeDogY3gsIHo6IGN6IH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNhY2hlIGNvbnRhaW5zIHRoZSBjaHVuay5cbiAgICBpZiAoY2h1bmtzLmhhcyhoYXNoKSkge1xuICAgICAgcmV0dXJuIGNodW5rcy5nZXQoaGFzaCkgYXMgQ2h1bms7XG4gICAgfSBlbHNlIGlmICh0aGlzLmhhc0NodW5rKGN4LCBjeiwgZGltZW5zaW9uKSkge1xuICAgICAgLy8gQ3JlYXRlIGFuIGFycmF5IG9mIHN1YmNodW5rcy5cbiAgICAgIGNvbnN0IHN1YmNodW5rcyA9IG5ldyBBcnJheTxTdWJDaHVuaz4oKTtcblxuICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBzdWJjaHVua3MgYW5kIHJlYWQgdGhlbSBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgIC8vIFRPRE86IERpbWVuc2lvbnMgY2FuIGhhdmUgYSBkYXRhIGRyaXZlbiBtaW4gYW5kIG1heCBzdWJjaHVuayB2YWx1ZSwgd2Ugc2hvdWxkIHVzZSB0aGF0LlxuICAgICAgZm9yIChsZXQgY3kgPSAtNDsgY3kgPCAxNjsgY3krKykge1xuICAgICAgICAvLyBSZWFkIGFuZCBwdXNoIHRoZSBzdWJjaHVuayB0byB0aGUgc3ViY2h1bmtzIGFycmF5LlxuICAgICAgICBzdWJjaHVua3MucHVzaCh0aGlzLnJlYWRTdWJDaHVuayhjeCwgY3ksIGN6LCBkaW1lbnNpb24pKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNodW5rIGluc3RhbmNlLlxuICAgICAgY29uc3QgY2h1bmsgPSBuZXcgQ2h1bmsoY3gsIGN6LCBkaW1lbnNpb24udHlwZSwgc3ViY2h1bmtzKTtcblxuICAgICAgLy8gQWRkIHRoZSBjaHVuayB0byB0aGUgY2FjaGUuXG4gICAgICBjaHVua3Muc2V0KGhhc2gsIGNodW5rKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBjaHVuay5cbiAgICAgIHJldHVybiBjaHVuaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgY2h1bmsgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gICAgICBjb25zdCBjaHVuayA9IGRpbWVuc2lvbi5nZW5lcmF0b3IuYXBwbHkoY3gsIGN6KTtcblxuICAgICAgLy8gQWRkIHRoZSBjaHVuayB0byB0aGUgY2FjaGUuXG4gICAgICBjaHVua3Muc2V0KGhhc2gsIGNodW5rKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNodW5rIGlzIHJlYWR5LlxuICAgICAgLy8gSWYgc28sIGVtaXQgYSBuZXcgQ2h1bmtSZWFkeVNpZ25hbC5cbiAgICAgIGlmIChjaHVuay5yZWFkeSkgbmV3IENodW5rUmVhZHlTaWduYWwoZGltZW5zaW9uLCBjaHVuaykuZW1pdCgpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIGdlbmVyYXRlZCBjaHVuay5cbiAgICAgIHJldHVybiBjaHVuaztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd3JpdGVDaHVuayhjaHVuazogQ2h1bmssIGRpbWVuc2lvbjogRGltZW5zaW9uKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNodW5rIGlzIGVtcHR5LlxuICAgIGlmIChjaHVuay5pc0VtcHR5KCkgfHwgIWNodW5rLmRpcnR5KSByZXR1cm47XG5cbiAgICAvLyBXcml0ZSB0aGUgY2h1bmsgdmVyc2lvbiwgaW4gdGhpcyBjYXNlIHdpbGwgYmUgNDBcbiAgICB0aGlzLndyaXRlQ2h1bmtWZXJzaW9uKGNodW5rLngsIGNodW5rLnosIGRpbWVuc2lvbiwgNDApO1xuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBjaHVua3MgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIGRhdGFiYXNlLlxuICAgIC8vIFRPRE86IERpbWVuc2lvbnMgY2FuIGhhdmUgYSBkYXRhIGRyaXZlbiBtaW4gYW5kIG1heCBzdWJjaHVuayB2YWx1ZSwgd2Ugc2hvdWxkIHVzZSB0aGF0LlxuICAgIGZvciAobGV0IGN5ID0gLTQ7IGN5IDwgMTY7IGN5KyspIHtcbiAgICAgIC8vIEdldCB0aGUgc3ViY2h1bmsgZnJvbSB0aGUgY2h1bmsuXG4gICAgICBjb25zdCBzdWJjaHVuayA9IGNodW5rLmdldFN1YkNodW5rKGN5ICsgNCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdWJjaHVuayBpcyBlbXB0eS5cbiAgICAgIGlmICghc3ViY2h1bmsgfHwgc3ViY2h1bmsuaXNFbXB0eSgpKSBjb250aW51ZTtcblxuICAgICAgLy8gV3JpdGUgdGhlIHN1YmNodW5rIHRvIHRoZSBkYXRhYmFzZS5cbiAgICAgIHRoaXMud3JpdGVTdWJDaHVuayhzdWJjaHVuaywgY2h1bmsueCwgY3ksIGNodW5rLnosIGRpbWVuc2lvbik7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBjaHVuayBhcyBub3QgZGlydHkuXG4gICAgY2h1bmsuZGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSB0aGUgY2h1bmsgdmVyc2lvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBjeCBUaGUgY2h1bmsgWCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gY3ogVGhlIGNodW5rIFogY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBkaW1lbnNpb24gaW5kZXguXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBjaHVuayB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIHdyaXRlQ2h1bmtWZXJzaW9uKFxuICAgIGN4OiBudW1iZXIsXG4gICAgY3o6IG51bWJlcixcbiAgICBkaW1lbnNpb246IERpbWVuc2lvbixcbiAgICB2ZXJzaW9uOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEga2V5IGZvciB0aGUgY2h1bmsgdmVyc2lvblxuICAgIGNvbnN0IGtleSA9IExldmVsREJQcm92aWRlci5idWlsZENodW5rVmVyc2lvbktleShcbiAgICAgIGN4LFxuICAgICAgY3osXG4gICAgICBkaW1lbnNpb24uaW5kZXhPZigpXG4gICAgKTtcblxuICAgIC8vIFdyaXRlIHRoZSBjaHVuayB2ZXJzaW9uIHRvIHRoZSBkYXRhYmFzZS5cbiAgICB0aGlzLmRiLnB1dChrZXksIEJ1ZmZlci5mcm9tKFt2ZXJzaW9uXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZGF0YWJhc2UgaGFzIGEgY2h1bmsuXG4gICAqIEBwYXJhbSBjeCBUaGUgY2h1bmsgWCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gY3ogVGhlIGNodW5rIFogY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIGNoZWNrIGZvciB0aGUgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgaGFzQ2h1bmsoY3g6IG51bWJlciwgY3o6IG51bWJlciwgZGltZW5zaW9uOiBEaW1lbnNpb24pOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEga2V5IGZvciB0aGUgY2h1bmsgdmVyc2lvbi5cbiAgICAgIGNvbnN0IGtleSA9IExldmVsREJQcm92aWRlci5idWlsZENodW5rVmVyc2lvbktleShcbiAgICAgICAgY3gsXG4gICAgICAgIGN6LFxuICAgICAgICBkaW1lbnNpb24uaW5kZXhPZigpXG4gICAgICApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UuXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5kYi5nZXQoa2V5KTtcbiAgICAgIGlmIChkYXRhKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHRoZSBjaHVuayBkb2VzIG5vdCBleGlzdC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSBzdWJjaHVuayBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIGN4IFRoZSBjaHVuayBYIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBjeSBUaGUgc3ViY2h1bmsgWSBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gY3ogVGhlIGNodW5rIFogY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIHJlYWQgdGhlIHN1YmNodW5rIGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBzdWJjaHVuayBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICovXG4gIHB1YmxpYyByZWFkU3ViQ2h1bmsoXG4gICAgY3g6IG51bWJlcixcbiAgICBjeTogbnVtYmVyLFxuICAgIGN6OiBudW1iZXIsXG4gICAgZGltZW5zaW9uOiBEaW1lbnNpb25cbiAgKTogU3ViQ2h1bmsge1xuICAgIC8vIEF0dGVtcHQgdG8gcmVhZCB0aGUgc3ViY2h1bmsgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEJ1aWxkIHRoZSBzdWJjaHVuayBrZXkgZm9yIHRoZSBkYXRhYmFzZS5cbiAgICAgIGNvbnN0IGtleSA9IExldmVsREJQcm92aWRlci5idWlsZFN1YkNodW5rS2V5KFxuICAgICAgICBjeCxcbiAgICAgICAgY3ksXG4gICAgICAgIGN6LFxuICAgICAgICBkaW1lbnNpb24uaW5kZXhPZigpXG4gICAgICApO1xuXG4gICAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgc3ViY2h1bmsgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICBjb25zdCBzdWJjaHVuayA9IFN1YkNodW5rLmZyb20odGhpcy5kYi5nZXQoa2V5KSwgdHJ1ZSk7XG5cbiAgICAgIC8vIFNldCB0aGUgY2h1bmsgeSBjb29yZGluYXRlIG9mIHRoZSBzdWJjaHVuay5cbiAgICAgIHN1YmNodW5rLmluZGV4ID0gY3k7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgc3ViY2h1bmsgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICByZXR1cm4gc3ViY2h1bms7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiBhIG5ldyBzdWJjaHVuay5cbiAgICAgIC8vIFRoZXNlIG1lYW5zIHRoZSBzdWJjaHVuayBkb2VzIG5vdCBleGlzdC5cbiAgICAgIGNvbnN0IHN1YmNodW5rID0gbmV3IFN1YkNodW5rKCk7XG5cbiAgICAgIC8vIFNldCB0aGUgY2h1bmsgeSBjb29yZGluYXRlIG9mIHRoZSBzdWJjaHVuay5cbiAgICAgIHN1YmNodW5rLmluZGV4ID0gY3k7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgbmV3IHN1YmNodW5rLlxuICAgICAgcmV0dXJuIHN1YmNodW5rO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSBzdWJjaHVuayB0byB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBzdWJjaHVuayBUaGUgc3ViY2h1bmsgdG8gd3JpdGUuXG4gICAqIEBwYXJhbSBjeCBUaGUgY2h1bmsgWCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gY3kgVGhlIHN1YmNodW5rIFkgY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGN6IFRoZSBjaHVuayBaIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBkaW1lbnNpb24gVGhlIGRpbWVuc2lvbiB0byB3cml0ZSB0aGUgc3ViY2h1bmsgdG8uXG4gICAqL1xuICBwdWJsaWMgd3JpdGVTdWJDaHVuayhcbiAgICBzdWJjaHVuazogU3ViQ2h1bmssXG4gICAgY3g6IG51bWJlcixcbiAgICBjeTogbnVtYmVyLFxuICAgIGN6OiBudW1iZXIsXG4gICAgZGltZW5zaW9uOiBEaW1lbnNpb25cbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEga2V5IGZvciB0aGUgc3ViY2h1bmsuXG4gICAgY29uc3Qga2V5ID0gTGV2ZWxEQlByb3ZpZGVyLmJ1aWxkU3ViQ2h1bmtLZXkoXG4gICAgICBjeCxcbiAgICAgIGN5LFxuICAgICAgY3osXG4gICAgICBkaW1lbnNpb24uaW5kZXhPZigpXG4gICAgKTtcblxuICAgIC8vIFNldCB0aGUgc3ViY2h1bmsgaW5kZXguXG4gICAgc3ViY2h1bmsuaW5kZXggPSBjeTtcblxuICAgIC8vIFNlcmlhbGl6ZSB0aGUgc3ViY2h1bmsgdG8gYSBidWZmZXJcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG4gICAgU3ViQ2h1bmsuc2VyaWFsaXplKHN1YmNodW5rLCBzdHJlYW0sIHRydWUpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHN1YmNodW5rIHRvIHRoZSBkYXRhYmFzZVxuICAgIHRoaXMuZGIucHV0KGtleSwgc3RyZWFtLmdldEJ1ZmZlcigpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkQXZhaWxhYmxlRW50aXRpZXMoZGltZW5zaW9uOiBEaW1lbnNpb24pOiBBcnJheTxiaWdpbnQ+IHtcbiAgICAvLyBQcmVwYXJlIGFuIGFycmF5IHRvIHN0b3JlIHRoZSBlbnRpdGllcyB1bmlxdWUgaWRlbnRpZmllcnMuXG4gICAgY29uc3QgdW5pcXVlSWRzID0gbmV3IEFycmF5PGJpZ2ludD4oKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gcmVhZCB0aGUgZW50aXRpZXMgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGFjdG9yIGxpc3QuXG4gICAgICBjb25zdCBrZXkgPSBMZXZlbERCUHJvdmlkZXIuYnVpbGRBY3Rvckxpc3RLZXkoZGltZW5zaW9uKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZS5cbiAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0odGhpcy5kYi5nZXQoa2V5KSk7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHVuaXF1ZSBpZGVudGlmaWVycyBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICBkbyB1bmlxdWVJZHMucHVzaChzdHJlYW0ucmVhZEludDY0KEVuZGlhbm5lc3MuTGl0dGxlKSk7XG4gICAgICB3aGlsZSAoIXN0cmVhbS5jdXJzb3JBdEVuZCgpKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllcnMuXG4gICAgICByZXR1cm4gdW5pcXVlSWRzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICByZXR1cm4gdW5pcXVlSWRzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB3cml0ZUF2YWlsYWJsZUVudGl0aWVzKFxuICAgIGRpbWVuc2lvbjogRGltZW5zaW9uLFxuICAgIGVudGl0aWVzOiBBcnJheTxiaWdpbnQ+XG4gICk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGFjdG9yIGxpc3QuXG4gICAgY29uc3Qga2V5ID0gTGV2ZWxEQlByb3ZpZGVyLmJ1aWxkQWN0b3JMaXN0S2V5KGRpbWVuc2lvbik7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlLlxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSB1bmlxdWUgaWRlbnRpZmllcnMgdG8gdGhlIHN0cmVhbS5cbiAgICBmb3IgKGNvbnN0IHVuaXF1ZUlkIG9mIGVudGl0aWVzKVxuICAgICAgc3RyZWFtLndyaXRlSW50NjQodW5pcXVlSWQsIEVuZGlhbm5lc3MuTGl0dGxlKTtcblxuICAgIC8vIFdyaXRlIHRoZSBzdHJlYW0gdG8gdGhlIGRhdGFiYXNlLlxuICAgIHRoaXMuZGIucHV0KGtleSwgc3RyZWFtLmdldEJ1ZmZlcigpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkRW50aXR5KHVuaXF1ZUlkOiBiaWdpbnQsIGRpbWVuc2lvbjogRGltZW5zaW9uKTogRW50aXR5RW50cnkge1xuICAgIC8vIEdldCBhbGwgdGhlIGF2YWlsYWJsZSBlbnRpdGllcyBmb3IgdGhlIGRpbWVuc2lvbi5cbiAgICBjb25zdCBlbnRpdGllcyA9IHRoaXMucmVhZEF2YWlsYWJsZUVudGl0aWVzKGRpbWVuc2lvbik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGV4aXN0cy5cbiAgICBpZiAoIWVudGl0aWVzLmluY2x1ZGVzKHVuaXF1ZUlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgd2l0aCB1bmlxdWUgaWQgJHt1bmlxdWVJZH0gbm90IGZvdW5kIWApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGVudGl0eS5cbiAgICBjb25zdCBrZXkgPSBMZXZlbERCUHJvdmlkZXIuYnVpbGRBY3RvckRhdGFLZXkodW5pcXVlSWQpO1xuXG4gICAgLy8gUmVhZCB0aGUgZW50aXR5IGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kYi5nZXQoa2V5KTtcblxuICAgIC8vIFBhcnNlIHRoZSBlbnRpdHkgZGF0YSBmcm9tIHRoZSBidWZmZXIuXG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoYnVmZmVyLnRvU3RyaW5nKCksIChfLCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5lbmRzV2l0aChcIkJpZ0ludF90XCIpKSB7XG4gICAgICAgIHJldHVybiBCaWdJbnQodmFsdWUuc2xpY2UoMCwgLTgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSBcIkluZmluaXR5X3RcIikgcmV0dXJuIEluZmluaXR5O1xuICAgICAgaWYgKHZhbHVlID09PSBcIi1JbmZpbml0eV90XCIpIHJldHVybiAtSW5maW5pdHk7XG4gICAgICBpZiAodmFsdWUgPT09IFwiTmFOX3RcIikgcmV0dXJuIE51bWJlci5OYU47XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KSBhcyBFbnRpdHlFbnRyeTtcblxuICAgIC8vIFJldHVybiB0aGUgZW50aXR5IGRhdGEuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVFbnRpdHkoZW50aXR5OiBFbnRpdHlFbnRyeSwgZGltZW5zaW9uOiBEaW1lbnNpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgYWxsIHRoZSBhdmFpbGFibGUgZW50aXRpZXMgZm9yIHRoZSBkaW1lbnNpb24uXG4gICAgY29uc3QgZW50aXRpZXMgPSB0aGlzLnJlYWRBdmFpbGFibGVFbnRpdGllcyhkaW1lbnNpb24pO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBhbHJlYWR5IGV4aXN0cy5cbiAgICBpZiAoIWVudGl0aWVzLmluY2x1ZGVzKGVudGl0eS51bmlxdWVJZCkpIGVudGl0aWVzLnB1c2goZW50aXR5LnVuaXF1ZUlkKTtcblxuICAgIC8vIFdyaXRlIHRoZSBlbnRpdHkgdG8gdGhlIGRhdGFiYXNlLlxuICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShlbnRpdHksIChfLCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkgKyBcIkJpZ0ludF90XCI7XG4gICAgICBpZiAodmFsdWUgPT09IEluZmluaXR5KSByZXR1cm4gXCJJbmZpbml0eV90XCI7XG4gICAgICBpZiAodmFsdWUgPT09IC1JbmZpbml0eSkgcmV0dXJuIFwiLUluZmluaXR5X3RcIjtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSByZXR1cm4gXCJOYU5fdFwiO1xuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG5cbiAgICAvLyBDb252ZXJ0IHRoZSBlbnRpdHkgZGF0YSB0byBhIGJ1ZmZlci5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShkYXRhKTtcblxuICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGVudGl0eS5cbiAgICBjb25zdCBrZXkgPSBMZXZlbERCUHJvdmlkZXIuYnVpbGRBY3RvckRhdGFLZXkoZW50aXR5LnVuaXF1ZUlkKTtcblxuICAgIC8vIFdyaXRlIHRoZSBlbnRpdHkgZGF0YSB0byB0aGUgZGF0YWJhc2UuXG4gICAgdGhpcy5kYi5wdXQoa2V5LCBidWZmZXIpO1xuICB9XG5cbiAgcHVibGljIHJlYWRQbGF5ZXIodXVpZDogc3RyaW5nLCBkaW1lbnNpb246IERpbWVuc2lvbik6IFBsYXllckVudHJ5IHwgbnVsbCB7XG4gICAgLy8gQXR0ZW1wdCB0byByZWFkIHRoZSBwbGF5ZXIgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIHBsYXllci5cbiAgICAgIGNvbnN0IGtleSA9IGBwbGF5ZXJfc2VydmVyXyR7dXVpZH1fJHtkaW1lbnNpb24uaWRlbnRpZmllcn1gO1xuXG4gICAgICAvLyBSZWFkIHRoZSBwbGF5ZXIgZGF0YSBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZGIuZ2V0KEJ1ZmZlci5mcm9tKGtleSkpO1xuXG4gICAgICAvLyBQYXJzZSB0aGUgcGxheWVyIGRhdGEgZnJvbSB0aGUgYnVmZmVyLlxuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoYnVmZmVyLnRvU3RyaW5nKCksIChfLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLmVuZHNXaXRoKFwiQmlnSW50X3RcIikpIHtcbiAgICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlLnNsaWNlKDAsIC04KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IFwiSW5maW5pdHlfdFwiKSByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCItSW5maW5pdHlfdFwiKSByZXR1cm4gLUluZmluaXR5O1xuICAgICAgICBpZiAodmFsdWUgPT09IFwiTmFOX3RcIikgcmV0dXJuIE51bWJlci5OYU47XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSkgYXMgUGxheWVyRW50cnk7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgcGxheWVyIGRhdGEuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVBsYXllcihwbGF5ZXI6IFBsYXllckVudHJ5LCBkaW1lbnNpb246IERpbWVuc2lvbik6IHZvaWQge1xuICAgIC8vIFdlIHdhbnQgdG8gc3RyaW5naWZ5IHRoZSBwbGF5ZXIgZGF0YSBhbmQgd3JpdGUgaXQgdG8gdGhlIGRhdGFiYXNlLlxuICAgIC8vIFNvIHdlIG5lZWQgYSBjdXN0b20gc2VyaWFsaXphdGlvbiBtZXRob2QgZm9yIGJpZ2ludHMsIGFzIEpTT04uc3RyaW5naWZ5IGRvZXMgbm90IHN1cHBvcnQgdGhlbS5cbiAgICAvLyBTYW1lIGdvZXMgZm9yIEluZmluaXR5LCAtSW5maW5pdHkgYW5kIE5hTiwgYnV0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhvc2UgaGVyZS5cbiAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkocGxheWVyLCAoXywgdmFsdWUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiB2YWx1ZS50b1N0cmluZygpICsgXCJCaWdJbnRfdFwiO1xuICAgICAgaWYgKHZhbHVlID09PSBJbmZpbml0eSkgcmV0dXJuIFwiSW5maW5pdHlfdFwiO1xuICAgICAgaWYgKHZhbHVlID09PSAtSW5maW5pdHkpIHJldHVybiBcIi1JbmZpbml0eV90XCI7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkgcmV0dXJuIFwiTmFOX3RcIjtcblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCB0aGUgcGxheWVyIGRhdGEgdG8gYSBidWZmZXIuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSk7XG5cbiAgICAvLyBDcmVhdGUgYSBrZXkgZm9yIHRoZSBwbGF5ZXIuXG4gICAgY29uc3Qga2V5ID0gYHBsYXllcl9zZXJ2ZXJfJHtwbGF5ZXIudXVpZH1fJHtkaW1lbnNpb24uaWRlbnRpZmllcn1gO1xuXG4gICAgLy8gV3JpdGUgdGhlIHBsYXllciBkYXRhIHRvIHRoZSBkYXRhYmFzZS5cbiAgICB0aGlzLmRiLnB1dChCdWZmZXIuZnJvbShrZXkpLCBidWZmZXIpO1xuICB9XG5cbiAgcHVibGljIHJlYWRBdmFpbGFibGVCbG9ja3MoZGltZW5zaW9uOiBEaW1lbnNpb24pOiBBcnJheTxiaWdpbnQ+IHtcbiAgICAvLyBQcmVwYXJlIGFuIGFycmF5IHRvIHN0b3JlIHRoZSBibG9jayBwb3NpdGlvbnMgaGFzaGVzLlxuICAgIGNvbnN0IGhhc2hlcyA9IG5ldyBBcnJheTxiaWdpbnQ+KCk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIHJlYWQgdGhlIGJsb2NrcyBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEga2V5IGZvciB0aGUgYmxvY2sgbGlzdC5cbiAgICAgIGNvbnN0IGtleSA9IExldmVsREJQcm92aWRlci5idWlsZEJsb2NrRGF0YUxpc3RLZXkoZGltZW5zaW9uKTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZS5cbiAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0odGhpcy5kYi5nZXQoa2V5KSk7XG5cbiAgICAgIC8vIFJlYWQgdGhlIGJsb2NrIHBvc2l0aW9ucyBmcm9tIHRoZSBzdHJlYW0uXG4gICAgICBkbyB7XG4gICAgICAgIC8vIFJlYWQgdGhlIGJsb2NrIHBvc2l0aW9uIGhhc2ggZnJvbSB0aGUgc3RyZWFtLlxuICAgICAgICBjb25zdCBoYXNoID0gc3RyZWFtLnJlYWRaaWdab25nKCk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBibG9jayBwb3NpdGlvbiB0byB0aGUgbGlzdC5cbiAgICAgICAgaGFzaGVzLnB1c2goaGFzaCk7XG4gICAgICB9IHdoaWxlICghc3RyZWFtLmN1cnNvckF0RW5kKCkpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIGJsb2NrIHBvc2l0aW9ucyBoYXNoZXMuXG4gICAgICByZXR1cm4gaGFzaGVzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICByZXR1cm4gaGFzaGVzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB3cml0ZUF2YWlsYWJsZUJsb2NrcyhcbiAgICBkaW1lbnNpb246IERpbWVuc2lvbixcbiAgICBibG9ja3M6IEFycmF5PGJpZ2ludD5cbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEga2V5IGZvciB0aGUgYmxvY2sgbGlzdC5cbiAgICBjb25zdCBrZXkgPSBMZXZlbERCUHJvdmlkZXIuYnVpbGRCbG9ja0RhdGFMaXN0S2V5KGRpbWVuc2lvbik7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlLlxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBibG9jayBwb3NpdGlvbnMgdG8gdGhlIHN0cmVhbS5cbiAgICBmb3IgKGNvbnN0IGhhc2ggb2YgYmxvY2tzKSBzdHJlYW0ud3JpdGVaaWdab25nKGhhc2gpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHN0cmVhbSB0byB0aGUgZGF0YWJhc2UuXG4gICAgdGhpcy5kYi5wdXQoa2V5LCBzdHJlYW0uZ2V0QnVmZmVyKCkpO1xuICB9XG5cbiAgcHVibGljIHJlYWRCbG9jayhoYXNoOiBiaWdpbnQsIGRpbWVuc2lvbjogRGltZW5zaW9uKTogQmxvY2tFbnRyeSB7XG4gICAgLy8gVW5oYXNoIHRoZSBibG9jayBwb3NpdGlvbi5cbiAgICBjb25zdCBwb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24udW5oYXNoKGhhc2gpO1xuXG4gICAgLy8gQ3JlYXRlIGEga2V5IGZvciB0aGUgYmxvY2suXG4gICAgY29uc3Qga2V5ID0gTGV2ZWxEQlByb3ZpZGVyLmJ1aWxkQmxvY2tEYXRhS2V5KFxuICAgICAgcG9zaXRpb24sXG4gICAgICBkaW1lbnNpb24uaW5kZXhPZigpXG4gICAgKTtcblxuICAgIC8vIFJlYWQgdGhlIGJsb2NrIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5kYi5nZXQoa2V5KTtcblxuICAgIC8vIFBhcnNlIHRoZSBibG9jayBkYXRhIGZyb20gdGhlIGJ1ZmZlci5cbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShidWZmZXIudG9TdHJpbmcoKSkgYXMgQmxvY2tFbnRyeTtcblxuICAgIC8vIFJldHVybiB0aGUgYmxvY2sgZGF0YS5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZUJsb2NrKGJsb2NrOiBCbG9ja0VudHJ5LCBkaW1lbnNpb246IERpbWVuc2lvbik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIGJsb2NrIHBvc2l0aW9uIGluc3RhbmNlLlxuICAgIGNvbnN0IHBvc2l0aW9uID0gbmV3IEJsb2NrUG9zaXRpb24oLi4uYmxvY2sucG9zaXRpb24pO1xuXG4gICAgLy8gV3JpdGUgdGhlIGJsb2NrIHRvIHRoZSBkYXRhYmFzZS5cbiAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoYmxvY2spO1xuXG4gICAgLy8gQ29udmVydCB0aGUgYmxvY2sgZGF0YSB0byBhIGJ1ZmZlci5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShkYXRhKTtcblxuICAgIC8vIENyZWF0ZSBhIGtleSBmb3IgdGhlIGJsb2NrLlxuICAgIGNvbnN0IGtleSA9IExldmVsREJQcm92aWRlci5idWlsZEJsb2NrRGF0YUtleShcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgZGltZW5zaW9uLmluZGV4T2YoKVxuICAgICk7XG5cbiAgICAvLyBXcml0ZSB0aGUgYmxvY2sgZGF0YSB0byB0aGUgZGF0YWJhc2UuXG4gICAgdGhpcy5kYi5wdXQoa2V5LCBidWZmZXIpO1xuICB9XG5cbiAgcHVibGljIHJlYWRQcm9wZXJ0eShrZXk6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuZGIuZ2V0KGtleSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVQcm9wZXJ0eShrZXk6IEJ1ZmZlciwgdmFsdWU6IEJ1ZmZlcik6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmRiLnB1dChrZXksIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5pdGlhbGl6ZShcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllczogV29ybGRQcm92aWRlclByb3BlcnRpZXNcbiAgKTogdm9pZCB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgcGF0aCBmb3IgdGhlIHdvcmxkcyBkaXJlY3RvcnkuXG4gICAgY29uc3QgcGF0aCA9IHJlc29sdmUocHJvcGVydGllcy5wYXRoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwYXRoIHByb3ZpZGVkIGV4aXN0cy5cbiAgICAvLyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIHRoZSBkaXJlY3RvcnkuXG4gICAgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSBta2RpclN5bmMocGF0aCk7XG5cbiAgICAvLyBSZWFkIGFsbCB0aGUgZGlyZWN0b3JpZXMgaW4gdGhlIHdvcmxkIGRpcmVjdG9yeS5cbiAgICAvLyBFeGNsdWRpbmcgZmlsZSB0eXBlcywgYXMgYSB3b3JsZCBlbnRyeSBpcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5maWx0ZXIoXG4gICAgICAoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKVxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LlxuICAgIC8vIElmIGl0IGlzLCBjcmVhdGUgYSBuZXcgd29ybGQgd2l0aCB0aGUgZGVmYXVsdCBpZGVudGlmaWVyLlxuICAgIGlmIChkaXJlY3Rvcmllcy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gdm9pZCBzZXJlbml0eS5yZWdpc3RlcldvcmxkKFxuICAgICAgICB0aGlzLmNyZWF0ZShzZXJlbml0eSwgcHJvcGVydGllcywgeyBpZGVudGlmaWVyOiBcImRlZmF1bHRcIiB9KVxuICAgICAgKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgd29ybGQgZW50cmllcyBpbiB0aGUgZGlyZWN0b3J5LlxuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBHZXQgdGhlIHBhdGggZm9yIHRoZSB3b3JsZC5cbiAgICAgIGNvbnN0IHdvcmxkUGF0aCA9IHJlc29sdmUocGF0aCwgZGlyZWN0b3J5Lm5hbWUpO1xuXG4gICAgICAvLyBHZXQgdGhlIHdvcmxkIHByb3BlcnRpZXMuXG4gICAgICBsZXQgcHJvcGVydGllczogUGFydGlhbDxXb3JsZFByb3BlcnRpZXM+ID0geyBpZGVudGlmaWVyOiBkaXJlY3RvcnkubmFtZSB9O1xuICAgICAgaWYgKGV4aXN0c1N5bmMocmVzb2x2ZSh3b3JsZFBhdGgsIFwicHJvcGVydGllcy5qc29uXCIpKSkge1xuICAgICAgICAvLyBSZWFkIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JsZC5cbiAgICAgICAgcHJvcGVydGllcyA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUod29ybGRQYXRoLCBcInByb3BlcnRpZXMuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgd29ybGQgaW5zdGFuY2UuXG4gICAgICBjb25zdCB3b3JsZCA9IG5ldyBXb3JsZChzZXJlbml0eSwgbmV3IHRoaXMod29ybGRQYXRoKSwgcHJvcGVydGllcyk7XG5cbiAgICAgIC8vIEFzc2lnbiB0aGUgd29ybGQgdG8gdGhlIHByb3ZpZGVyLlxuICAgICAgd29ybGQucHJvdmlkZXIud29ybGQgPSB3b3JsZDtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IFdvcmxkSW5pdGlhbGl6ZWRTaWduYWwgaW5zdGFuY2UuXG4gICAgICBuZXcgV29ybGRJbml0aWFsaXplU2lnbmFsKHdvcmxkKS5lbWl0KCk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSB3b3JsZC5cbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUod29ybGRQYXRoLCBcInByb3BlcnRpZXMuanNvblwiKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkod29ybGQucHJvcGVydGllcywgbnVsbCwgMilcbiAgICAgICk7XG5cbiAgICAgIC8vIFByZXBhcmUgdGhlIGRpbWVuc2lvbnMgZm9yIHRoZSB3b3JsZC5cbiAgICAgIGZvciAoY29uc3QgZGltZW5zaW9uIG9mIHdvcmxkLmRpbWVuc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBzcGF3biBwb3NpdGlvbiBvZiB0aGUgZGltZW5zaW9uLlxuICAgICAgICBjb25zdCBzeCA9IGRpbWVuc2lvbi5wcm9wZXJ0aWVzLnNwYXduUG9zaXRpb25bMF0gPj4gNDtcbiAgICAgICAgY29uc3Qgc3ogPSBkaW1lbnNpb24ucHJvcGVydGllcy5zcGF3blBvc2l0aW9uWzJdID4+IDQ7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB2aWV3IGRpc3RhbmNlIG9mIHRoZSBkaW1lbnNpb24uXG4gICAgICAgIGNvbnN0IHZpZXdEaXN0YW5jZSA9IGRpbWVuc2lvbi52aWV3RGlzdGFuY2U7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgY2h1bmtzIHRvIHByZWdlbmVyYXRlLlxuICAgICAgICBjb25zdCBhbW91bnQgPSAodmlld0Rpc3RhbmNlICogMiArIDEpICoqIDI7XG5cbiAgICAgICAgLy8gTG9nIHRoZSBhbW91bnQgb2YgY2h1bmtzIHRvIHByZWdlbmVyYXRlLlxuICAgICAgICB3b3JsZC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgUHJlcGFyaW5nIMKnYyR7YW1vdW50fcKnciBjaHVua3MgZm9yIGRpbWVuc2lvbiDCp2Eke2RpbWVuc2lvbi5pZGVudGlmaWVyfcKnci5gXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBjaHVua3MgdG8gcHJlZ2VuZXJhdGUuXG4gICAgICAgIGZvciAobGV0IHggPSAtdmlld0Rpc3RhbmNlOyB4IDw9IHZpZXdEaXN0YW5jZTsgeCsrKSB7XG4gICAgICAgICAgZm9yIChsZXQgeiA9IC12aWV3RGlzdGFuY2U7IHogPD0gdmlld0Rpc3RhbmNlOyB6KyspIHtcbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIGNodW5rIGZyb20gdGhlIHByb3ZpZGVyLlxuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB3b3JsZC5wcm92aWRlci5yZWFkQ2h1bmsoc3ggKyB4LCBzeiArIHosIGRpbWVuc2lvbik7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyByZWFkeS5cbiAgICAgICAgICAgIGlmICghY2h1bmsucmVhZHkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBTZXJpYWxpemUgdGhlIGNodW5rLCB0aGUgd2lsbCBjYWNoZSB0aGUgY2h1bmsgaW4gdGhlIHByb3ZpZGVyLlxuICAgICAgICAgICAgY2h1bmsuY2FjaGUgPSBDaHVuay5zZXJpYWxpemUoY2h1bmspO1xuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIGRpcnR5IGZsYWcgdG8gZmFsc2UuXG4gICAgICAgICAgICBjaHVuay5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvZyB0aGUgc3VjY2VzcyBtZXNzYWdlLlxuICAgICAgICB3b3JsZC5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgICBgU3VjY2Vzc2Z1bGx5IHByZWdlbmVyYXRlZCDCp2Mke2Ftb3VudH3Cp3IgY2h1bmtzIGZvciBmb3IgZGltZW5zaW9uIMKnYSR7ZGltZW5zaW9uLmlkZW50aWZpZXJ9wqdyLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHdvcmxkIHdpdGggdGhlIHNlcmVuaXR5IGluc3RhbmNlLlxuICAgICAgc2VyZW5pdHkucmVnaXN0ZXJXb3JsZCh3b3JsZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoXG4gICAgc2VyZW5pdHk6IFNlcmVuaXR5LFxuICAgIHByb3BlcnRpZXM6IFdvcmxkUHJvdmlkZXJQcm9wZXJ0aWVzLFxuICAgIHdvcmxkUHJvcGVydGllcz86IFBhcnRpYWw8V29ybGRQcm9wZXJ0aWVzPlxuICApOiBXb3JsZCB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgcGF0aCBmb3IgdGhlIHdvcmxkcyBkaXJlY3RvcnkuXG4gICAgY29uc3QgcGF0aCA9IHJlc29sdmUocHJvcGVydGllcy5wYXRoKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwYXRoIHByb3ZpZGVkIGV4aXN0cy5cbiAgICAvLyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIHRoZSBkaXJlY3RvcnkuXG4gICAgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSBta2RpclN5bmMocGF0aCk7XG5cbiAgICAvLyBDaGVjayBpZiBhIHdvcmxkIGlkZW50aWZpZXIgd2FzIHByb3ZpZGVkLlxuICAgIGlmICghd29ybGRQcm9wZXJ0aWVzPy5pZGVudGlmaWVyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB3b3JsZCBpZGVudGlmaWVyIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIG5ldyB3b3JsZC5cIik7XG5cbiAgICAvLyBHZXQgdGhlIHdvcmxkIHBhdGggZnJvbSB0aGUgcHJvcGVydGllcy5cbiAgICBjb25zdCB3b3JsZFBhdGggPSByZXNvbHZlKHBhdGgsIHdvcmxkUHJvcGVydGllcy5pZGVudGlmaWVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB3b3JsZCBhbHJlYWR5IGV4aXN0cy5cbiAgICBpZiAoZXhpc3RzU3luYyh3b3JsZFBhdGgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgV29ybGQgd2l0aCBpZGVudGlmaWVyICR7d29ybGRQcm9wZXJ0aWVzLmlkZW50aWZpZXJ9IGFscmVhZHkgZXhpc3RzIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgd29ybGQgZGlyZWN0b3J5LlxuICAgIG1rZGlyU3luYyh3b3JsZFBhdGgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHdvcmxkIGluc3RhbmNlLlxuICAgIGNvbnN0IHdvcmxkID0gbmV3IFdvcmxkKHNlcmVuaXR5LCBuZXcgdGhpcyh3b3JsZFBhdGgpLCB3b3JsZFByb3BlcnRpZXMpO1xuXG4gICAgLy8gQXNzaWduIHRoZSB3b3JsZCB0byB0aGUgcHJvdmlkZXIuXG4gICAgd29ybGQucHJvdmlkZXIud29ybGQgPSB3b3JsZDtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBXb3JsZEluaXRpYWxpemVkU2lnbmFsIGluc3RhbmNlLlxuICAgIG5ldyBXb3JsZEluaXRpYWxpemVTaWduYWwod29ybGQpLmVtaXQoKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgcHJvcGVydGllcyBmaWxlIGZvciB0aGUgd29ybGQuXG4gICAgd3JpdGVGaWxlU3luYyhcbiAgICAgIHJlc29sdmUod29ybGRQYXRoLCBcInByb3BlcnRpZXMuanNvblwiKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHdvcmxkLnByb3BlcnRpZXMsIG51bGwsIDIpXG4gICAgKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIGRpbWVuc2lvbnMgZm9yIHRoZSB3b3JsZC5cbiAgICBmb3IgKGNvbnN0IGRpbWVuc2lvbiBvZiB3b3JsZC5kaW1lbnNpb25zLnZhbHVlcygpKSB7XG4gICAgICAvLyBHZXQgdGhlIHNwYXduIHBvc2l0aW9uIG9mIHRoZSBkaW1lbnNpb24uXG4gICAgICBjb25zdCBzeCA9IGRpbWVuc2lvbi5wcm9wZXJ0aWVzLnNwYXduUG9zaXRpb25bMF0gPj4gNDtcbiAgICAgIGNvbnN0IHN6ID0gZGltZW5zaW9uLnByb3BlcnRpZXMuc3Bhd25Qb3NpdGlvblsyXSA+PiA0O1xuXG4gICAgICAvLyBHZXQgdGhlIHZpZXcgZGlzdGFuY2Ugb2YgdGhlIGRpbWVuc2lvbi5cbiAgICAgIGNvbnN0IHZpZXdEaXN0YW5jZSA9IGRpbWVuc2lvbi52aWV3RGlzdGFuY2U7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGNodW5rcyB0byBwcmVnZW5lcmF0ZS5cbiAgICAgIGNvbnN0IGFtb3VudCA9ICh2aWV3RGlzdGFuY2UgKiAyICsgMSkgKiogMjtcblxuICAgICAgLy8gTG9nIHRoZSBhbW91bnQgb2YgY2h1bmtzIHRvIHByZWdlbmVyYXRlLlxuICAgICAgd29ybGQubG9nZ2VyLmluZm8oXG4gICAgICAgIGBQcmVwYXJpbmcgwqdjJHthbW91bnR9wqdyIGNodW5rcyBmb3IgZGltZW5zaW9uIMKnYSR7ZGltZW5zaW9uLmlkZW50aWZpZXJ9wqdyLmBcbiAgICAgICk7XG5cbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgY2h1bmtzIHRvIHByZWdlbmVyYXRlLlxuICAgICAgZm9yIChsZXQgeCA9IC12aWV3RGlzdGFuY2U7IHggPD0gdmlld0Rpc3RhbmNlOyB4KyspIHtcbiAgICAgICAgZm9yIChsZXQgeiA9IC12aWV3RGlzdGFuY2U7IHogPD0gdmlld0Rpc3RhbmNlOyB6KyspIHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBjaHVuayBmcm9tIHRoZSBwcm92aWRlci5cbiAgICAgICAgICBjb25zdCBjaHVuayA9IHdvcmxkLnByb3ZpZGVyLnJlYWRDaHVuayhzeCArIHgsIHN6ICsgeiwgZGltZW5zaW9uKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyByZWFkeS5cbiAgICAgICAgICBpZiAoIWNodW5rLnJlYWR5KSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgY2h1bmssIHRoZSB3aWxsIGNhY2hlIHRoZSBjaHVuayBpbiB0aGUgcHJvdmlkZXIuXG4gICAgICAgICAgY2h1bmsuY2FjaGUgPSBDaHVuay5zZXJpYWxpemUoY2h1bmspO1xuXG4gICAgICAgICAgLy8gU2V0IHRoZSBkaXJ0eSBmbGFnIHRvIGZhbHNlLlxuICAgICAgICAgIGNodW5rLmRpcnR5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzIG1lc3NhZ2UuXG4gICAgICB3b3JsZC5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSBwcmVnZW5lcmF0ZWQgwqdjJHthbW91bnR9wqdyIGNodW5rcyBmb3IgZm9yIGRpbWVuc2lvbiDCp2Eke2RpbWVuc2lvbi5pZGVudGlmaWVyfcKnci5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgY3JlYXRlZCB3b3JsZC5cbiAgICByZXR1cm4gd29ybGQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBzdWJjaHVuayBrZXkgZm9yIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIGN4IFRoZSBjaHVuayBYIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBjeSBUaGUgc3ViY2h1bmsgWSBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gY3ogVGhlIGNodW5rIFogY29vcmRpbmF0ZS5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBkaW1lbnNpb24gaW5kZXguXG4gICAqIEByZXR1cm5zIFRoZSBidWZmZXIga2V5IGZvciB0aGUgc3ViY2h1bmtcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRTdWJDaHVua0tleShcbiAgICBjeDogbnVtYmVyLFxuICAgIGN5OiBudW1iZXIsXG4gICAgY3o6IG51bWJlcixcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IEJ1ZmZlciB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZS5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgY2h1bmsgY29vcmRpbmF0ZXMgdG8gdGhlIHN0cmVhbS5cbiAgICBzdHJlYW0ud3JpdGVJbnQzMihjeCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgIHN0cmVhbS53cml0ZUludDMyKGN6LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaW5kZXggaXMgbm90IDAuXG4gICAgaWYgKGluZGV4ICE9PSAwKSBzdHJlYW0ud3JpdGVJbnQzMihpbmRleCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHF1ZXJ5IGtleSB0byB0aGUgc3RyZWFtLlxuICAgIHN0cmVhbS53cml0ZUJ5dGUoMHgyZik7XG5cbiAgICAvLyBXcml0ZSB0aGUgc3ViY2h1bmsgaW5kZXggdG8gdGhlIHN0cmVhbS5cbiAgICBzdHJlYW0ud3JpdGVCeXRlKGN5KTtcblxuICAgIC8vIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbS5cbiAgICByZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY2h1bmsgdmVyc2lvbiBrZXkgZm9yIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIGN4IFRoZSBjaHVuayBYIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBjeiBUaGUgY2h1bmsgWiBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGRpbWVuc2lvbiBpbmRleC5cbiAgICogQHJldHVybnMgVGhlIGJ1ZmZlciBrZXkgZm9yIHRoZSBjaHVuayB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkQ2h1bmtWZXJzaW9uS2V5KFxuICAgIGN4OiBudW1iZXIsXG4gICAgY3o6IG51bWJlcixcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IEJ1ZmZlciB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZS5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgY2h1bmsgY29vcmRpbmF0ZXMgdG8gdGhlIHN0cmVhbS5cbiAgICBzdHJlYW0ud3JpdGVJbnQzMihjeCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgIHN0cmVhbS53cml0ZUludDMyKGN6LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaW5kZXggaXMgbm90IDAuXG4gICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICBzdHJlYW0ud3JpdGVJbnQzMihpbmRleCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgIH1cblxuICAgIC8vIFdyaXRlIHRoZSBjaHVuayB2ZXJzaW9uIGJ5dGUgdG8gdGhlIHN0cmVhbS5cbiAgICBzdHJlYW0ud3JpdGVCeXRlKDB4MmMpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtXG4gICAgcmV0dXJuIHN0cmVhbS5nZXRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBhY3RvciBsaXN0IGtleSBmb3IgdGhlIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gcmVhZCB0aGUgYWN0b3IgbGlzdCBrZXkgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgYnVmZmVyIGtleSBmb3IgdGhlIGFjdG9yIGxpc3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRBY3Rvckxpc3RLZXkoZGltZW5zaW9uOiBEaW1lbnNpb24pIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlLlxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBrZXkgc3ltYm9sIHRvIHRoZSBzdHJlYW1cbiAgICBzdHJlYW0ud3JpdGVJbnQzMigweDY0XzY5XzY3XzcwKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpbmRleCBpcyBub3QgMC5cbiAgICBpZiAoZGltZW5zaW9uLmluZGV4T2YoKSAhPT0gMClcbiAgICAgIHN0cmVhbS53cml0ZUludDMyKGRpbWVuc2lvbi5pbmRleE9mKCksIEVuZGlhbm5lc3MuTGl0dGxlKTtcblxuICAgIC8vIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbS5cbiAgICByZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIGFjdG9yIGRhdGEga2V5IGZvciB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB1bmlxdWVJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFjdG9yLlxuICAgKiBAcmV0dXJucyBUaGUgYnVmZmVyIGtleSBmb3IgdGhlIGFjdG9yIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRBY3RvckRhdGFLZXkodW5pcXVlSWQ6IGJpZ2ludCk6IEJ1ZmZlciB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZS5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUga2V5IHN5bWJvbCB0byB0aGUgc3RyZWFtLlxuICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihCdWZmZXIuZnJvbShcImFjdG9ycHJlZml4XCIsIFwiYXNjaWlcIikpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIHRvIHRoZSBzdHJlYW0uXG4gICAgc3RyZWFtLndyaXRlSW50NjQodW5pcXVlSWQsIEVuZGlhbm5lc3MuTGl0dGxlKTtcblxuICAgIC8vIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIHN0cmVhbS5cbiAgICByZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgYmxvY2sga2V5IGZvciB0aGUgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgYmxvY2sgcG9zaXRpb24uXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgZGltZW5zaW9uIGluZGV4LlxuICAgKiBAcmV0dXJucyBUaGUgYnVmZmVyIGtleSBmb3IgdGhlIGJsb2NrXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkQmxvY2tEYXRhTGlzdEtleShkaW1lbnNpb246IERpbWVuc2lvbik6IEJ1ZmZlciB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZS5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUga2V5IHN5bWJvbCB0byB0aGUgc3RyZWFtLlxuICAgIHN0cmVhbS53cml0ZUludDMyKDB4NjJfNmNfNmZfNjNfNmIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGluZGV4IGlzIG5vdCAwLlxuICAgIGlmIChkaW1lbnNpb24uaW5kZXhPZigpICE9PSAwKVxuICAgICAgc3RyZWFtLndyaXRlSW50MzIoZGltZW5zaW9uLmluZGV4T2YoKSwgRW5kaWFubmVzcy5MaXR0bGUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtLlxuICAgIHJldHVybiBzdHJlYW0uZ2V0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBibG9jayBrZXkgZm9yIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBibG9jayBwb3NpdGlvbi5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBkaW1lbnNpb24gaW5kZXguXG4gICAqIEByZXR1cm5zIFRoZSBidWZmZXIga2V5IGZvciB0aGUgYmxvY2tcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRCbG9ja0RhdGFLZXkoXG4gICAgcG9zaXRpb246IEJsb2NrUG9zaXRpb24sXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBCdWZmZXIge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2UuXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gV3JpdGUgdGhlIGJsb2NrIHBvc2l0aW9uIHRvIHRoZSBzdHJlYW0uXG4gICAgc3RyZWFtLndyaXRlWmlnWmFnKHBvc2l0aW9uLngpO1xuICAgIHN0cmVhbS53cml0ZVppZ1phZyhwb3NpdGlvbi55KTtcbiAgICBzdHJlYW0ud3JpdGVaaWdaYWcocG9zaXRpb24ueik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaW5kZXggaXMgbm90IDAuXG4gICAgaWYgKGluZGV4ICE9PSAwKSBzdHJlYW0ud3JpdGVJbnQzMihpbmRleCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuXG4gICAgLy8gV3JpdGUgdGhlIGtleSBzeW1ib2wgdG8gdGhlIHN0cmVhbS5cbiAgICBzdHJlYW0ud3JpdGVCeXRlKDB4MmQpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtLlxuICAgIHJldHVybiBzdHJlYW0uZ2V0QnVmZmVyKCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTGV2ZWxEQlByb3ZpZGVyIH07XG4iLCAiaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi4vY2h1bmtcIjtcbmltcG9ydCB7IFRlcnJhaW5HZW5lcmF0b3JQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEaW1lbnNpb24gfSBmcm9tIFwiLi4vZGltZW5zaW9uXCI7XG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCIuLi93b3JsZFwiO1xuaW1wb3J0IHsgQ2h1bmtSZWFkeVNpZ25hbCB9IGZyb20gXCIuLi8uLi9ldmVudHNcIjtcblxuaW1wb3J0IHR5cGUgeyBUZXJyYWluV29ya2VyIH0gZnJvbSBcIi4vd29ya2VyXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlciB9IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5cbmNvbnN0IERlZmF1bHRUZXJyYWluR2VuZXJhdG9yUHJvcGVydGllczogVGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXMgPSB7XG4gIHNlZWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDB4N2ZmZmZmZmYpXG59O1xuXG5jbGFzcyBUZXJyYWluR2VuZXJhdG9yIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBnZW5lcmF0b3IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRlcnJhaW4gd29ya2VyIGZvciB0aGUgZ2VuZXJhdG9yLlxuICAgKiBUaGlzIGlzIHNldCBieSB0aGUgd29ya2VyIGRlY29yYXRvciwgd2hpY2ggd2lsbCBjcmVhdGUgYSB3b3JrZXIgdGhyZWFkIGZvciB0aGUgZ2VuZXJhdG9yLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfd29ya2VyOiB0eXBlb2YgVGVycmFpbldvcmtlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZ2VuZXJhdG9yLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVGVycmFpbkdlbmVyYXRvcilcbiAgICAuaWRlbnRpZmllcjtcblxuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbiBvZiB0aGUgZ2VuZXJhdG9yLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpbWVuc2lvbjogRGltZW5zaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ybGQgb2YgdGhlIGdlbmVyYXRvci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3b3JsZDogV29ybGQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnZW5lcmF0b3IuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydGllczogVGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXMgPVxuICAgIERlZmF1bHRUZXJyYWluR2VuZXJhdG9yUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIGNodW5rcyB0aGF0IGFyZSBxdWV1ZWQgZm9yIHRocmVhZGVkIGdlbmVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcXVldWUgPSBuZXcgTWFwPGJpZ2ludCwgQ2h1bms+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JrZXIgZm9yIHRoZSBnZW5lcmF0b3IuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2VyOiBXb3JrZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHRlcnJhaW4gZ2VuZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoZSBnZW5lcmF0b3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZGltZW5zaW9uOiBEaW1lbnNpb24sXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8VGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIFNldCB0aGUgZGltZW5zaW9uICYgd29ybGQgb2YgdGhlIGdlbmVyYXRvci5cbiAgICB0aGlzLmRpbWVuc2lvbiA9IGRpbWVuc2lvbjtcbiAgICB0aGlzLndvcmxkID0gZGltZW5zaW9uLndvcmxkO1xuXG4gICAgLy8gU2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnZW5lcmF0b3IuXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0geyAuLi5EZWZhdWx0VGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIFNldCB0aGUgaWRlbnRpZmllciBvZiB0aGUgZ2VuZXJhdG9yLlxuICAgIHRoaXMuaWRlbnRpZmllciA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBUZXJyYWluR2VuZXJhdG9yKS5pZGVudGlmaWVyO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgd29ya2VyIGlmIGF2YWlsYWJsZS5cbiAgICB0aGlzLndvcmtlciA9XG4gICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVGVycmFpbkdlbmVyYXRvcikuX3dvcmtlcj8uaW5pdGlhbGl6ZShcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzXG4gICAgICApID8/IG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd29ya2VyIGlzIGF2YWlsYWJsZSBhbmQgbGlzdGVuIGZvciBtZXNzYWdlcy5cbiAgICB0aGlzLndvcmtlcj8ub24oXCJtZXNzYWdlXCIsIChjaHVuazogQ2h1bmsgJiB7IGlkZW50aWZpZXI6IHN0cmluZyB9KSA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgaWRlbnRpZmllciBtYXRjaGVzIHRoZSBnZW5lcmF0b3IuXG4gICAgICBpZiAoY2h1bmsuaWRlbnRpZmllciAhPT0gdGhpcy5pZGVudGlmaWVyKSByZXR1cm47XG5cbiAgICAgIC8vIFByb2Nlc3MgdGhlIGNodW5rLlxuICAgICAgdGhpcy5wcm9jZXNzKGNodW5rKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBjaHVuayBhdCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0gX2N4IFRoZSBjaHVuayB4IGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBfY3ogVGhlIGNodW5rIHogY29vcmRpbmF0ZS5cbiAgICovXG4gIHB1YmxpYyBhcHBseShfY3g6IG51bWJlciwgX2N6OiBudW1iZXIpOiBDaHVuayB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuaWRlbnRpZmllcn0uYXBwbHkoKSBpcyBub3QgaW1wbGVtZW50ZWQhYCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZG9mZiBhIGNodW5rIHRvIHRoZSB3b3JrZXIgZm9yIGdlbmVyYXRpb24uXG4gICAqIEBwYXJhbSBjaHVuayBUaGUgY2h1bmsgdG8gaGFuZG9mZi5cbiAgICovXG4gIHByb3RlY3RlZCBoYW5kb2ZmKGNodW5rOiBDaHVuayk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSB3b3JrZXIgaXMgYXZhaWxhYmxlLlxuICAgIGlmICghdGhpcy53b3JrZXIpIHRocm93IG5ldyBFcnJvcihcIldvcmtlciBpcyBub3QgYXZhaWxhYmxlLlwiKTtcblxuICAgIC8vIEFkZCB0aGUgY2h1bmsgdG8gdGhlIHF1ZXVlLlxuICAgIHRoaXMucXVldWUuc2V0KGNodW5rLmhhc2gsIGNodW5rKTtcblxuICAgIC8vIFNlcGFyYXRlIHRoZSBjaHVuayBkYXRhLlxuICAgIGNvbnN0IHsgeDogY3gsIHo6IGN6IH0gPSBjaHVuaztcblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIHR5cGUuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZGltZW5zaW9uLnR5cGU7XG5cbiAgICAvLyBIYW5kb2ZmIHRoZSBjaHVuayBnZW5lcmF0aW9uIHRvIHRoZSB3b3JrZXIgdGhyZWFkLlxuICAgIHRoaXMud29ya2VyLnBvc3RNZXNzYWdlKHsgY3gsIGN6LCB0eXBlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhIGNodW5rIHRoYXQgd2FzIGdlbmVyYXRlZCBieSB0aGUgd29ya2VyLlxuICAgKiBAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHRoYXQgd2FzIGdlbmVyYXRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBwcm9jZXNzKGNodW5rOiBDaHVuayk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIHF1ZXVlZCBjaHVuayBmcm9tIHRoZSBzZXQuXG4gICAgY29uc3QgcXVldWVkID0gdGhpcy5xdWV1ZS5nZXQoY2h1bmsuaGFzaCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmsgd2FzIGZvdW5kLlxuICAgIGlmICghcXVldWVkKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgdGhlIHF1ZXVlZCBjaHVuayB3aXRoIHRoZSBnZW5lcmF0ZWQgZGF0YS5cbiAgICAvLyBTaW5jZSB3b3JrZXJzIGFyZSBub3QgYWxsb3dlZCB0byB0cmFuc2ZlciBjbGFzcyBpbnN0YW5jZXMsIHdlIG5lZWQgdG8gbWFudWFsbHkgY29weSB0aGUgZGF0YS5cbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBjaHVuay5zdWJjaHVua3MpIHtcbiAgICAgIC8vIENvbnRpbnVlIGlmIHRoZSBzdWJjaHVuayBpcyBudWxsLlxuICAgICAgaWYgKCFzdWIpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBHZXQgdGhlIHN1YmNodW5rIGZyb20gdGhlIHF1ZXVlZCBjaHVuay5cbiAgICAgIGNvbnN0IHN1YmNodW5rID0gcXVldWVkLmdldFN1YkNodW5rKGNodW5rLnN1YmNodW5rcy5pbmRleE9mKHN1YikpO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIGxheWVycyBhbmQgY29weSB0aGUgZGF0YS5cbiAgICAgIGZvciAoY29uc3QgbGF5IG9mIHN1Yi5sYXllcnMpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBsYXllciBmcm9tIHRoZSBxdWV1ZWRcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBzdWJjaHVuay5nZXRMYXllcihzdWIubGF5ZXJzLmluZGV4T2YobGF5KSk7XG5cbiAgICAgICAgLy8gQ29weSB0aGUgYmxvY2sgZGF0YS5cbiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGJsb2NrXSBvZiBsYXkuYmxvY2tzLmVudHJpZXMoKSkge1xuICAgICAgICAgIGxheWVyLmJsb2Nrc1tpbmRleF0gPSBibG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgdGhlIHBhbGV0dGUgZGF0YS5cbiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGJsb2NrXSBvZiBsYXkucGFsZXR0ZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBsYXllci5wYWxldHRlW2luZGV4XSA9IGJsb2NrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGNhbiBtYXJrIHRoZSBjaHVuayBhcyByZWFkeS5cbiAgICBxdWV1ZWQucmVhZHkgPSB0cnVlO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IENodW5rUmVhZHlTaWduYWwgZm9yIHRoZSBjaHVuay5cbiAgICBuZXcgQ2h1bmtSZWFkeVNpZ25hbCh0aGlzLmRpbWVuc2lvbiwgcXVldWVkKS5lbWl0KCk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGNodW5rIGZyb20gdGhlIHF1ZXVlLlxuICAgIHRoaXMucXVldWUuZGVsZXRlKGNodW5rLmhhc2gpO1xuICB9XG59XG5cbmV4cG9ydCB7IFRlcnJhaW5HZW5lcmF0b3IgfTtcbiIsICJpbXBvcnQgeyBpc01haW5UaHJlYWQsIHR5cGUgV29ya2VyIH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcblxuaW1wb3J0IHsgVGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXMgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcblxuaW1wb3J0IHR5cGUgeyBUZXJyYWluR2VuZXJhdG9yIH0gZnJvbSBcIi4uL2dlbmVyYXRvclwiO1xuaW1wb3J0IHR5cGUgeyBEaW1lbnNpb25UeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgdHlwZSB7IENodW5rIH0gZnJvbSBcIi4uLy4uL2NodW5rXCI7XG5cbmNsYXNzIFRlcnJhaW5Xb3JrZXIge1xuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIHdvcmtlciBmaWxlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYXRoID0gX19maWxlbmFtZTtcblxuICAvKipcbiAgICogVGhlIHByb3BlcnRpZXMgb2YgdGhlIHdvcmtlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwcm9wZXJ0aWVzOiBUZXJyYWluR2VuZXJhdG9yUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIGdlbmVyYXRvciBmb3IgdGhlIHdvcmtlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnZW5lcmF0b3I6IHR5cGVvZiBUZXJyYWluR2VuZXJhdG9yO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHdvcmtlciBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBnZW5lcmF0b3I6IHR5cGVvZiBUZXJyYWluR2VuZXJhdG9yLFxuICAgIHByb3BlcnRpZXM6IFRlcnJhaW5HZW5lcmF0b3JQcm9wZXJ0aWVzXG4gICkge1xuICAgIC8vIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgbWFpbiB0aHJlYWRcbiAgICBpZiAoaXNNYWluVGhyZWFkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIGluIGEgd29ya2VyIHRocmVhZFwiKTtcblxuICAgIC8vIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgd29ya2VyXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblxuICAgIC8vIFNldCB0aGUgZ2VuZXJhdG9yIG9mIHRoZSB3b3JrZXJcbiAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBjaHVuayBhdCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0gX2N4IFRoZSBjaHVuayB4IGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBfY3ogIFRoZSBjaHVuayB6IGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSBfdHlwZSBUaGUgZGltZW5zaW9uIHR5cGUgb2YgdGhlIGNodW5rLlxuICAgKi9cbiAgcHVibGljIGFwcGx5KF9jeDogbnVtYmVyLCBfY3o6IG51bWJlciwgX3R5cGU6IERpbWVuc2lvblR5cGUpOiBDaHVuayB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuZ2VuZXJhdG9yLmlkZW50aWZpZXJ9LmFwcGx5KCkgaXMgbm90IGltcGxlbWVudGVkIWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSB3b3JrZXIgdGhyZWFkLlxuICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgcHJvcGVydGllcyB0byB1c2UgZm9yIHRoZSB3b3JrZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGluaXRpYWxpemUoX3Byb3BlcnRpZXM6IFRlcnJhaW5HZW5lcmF0b3JQcm9wZXJ0aWVzKTogV29ya2VyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5uYW1lfS5pbml0aWFsaXplKCkgaXMgbm90IGltcGxlbWVudGVkIWApO1xuICB9XG59XG5cbmV4cG9ydCB7IFRlcnJhaW5Xb3JrZXIgfTtcbiIsICJpbXBvcnQge1xuICBpc01haW5UaHJlYWQsXG4gIHBhcmVudFBvcnQsXG4gIHdvcmtlckRhdGEsXG4gIFdvcmtlciBhcyBXb3JrZXJUaHJlYWRcbn0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcblxuaW1wb3J0IHsgRGltZW5zaW9uVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBUZXJyYWluR2VuZXJhdG9yUHJvcGVydGllcyB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuXG5pbXBvcnQgdHlwZSB7IFRlcnJhaW5Xb3JrZXIgfSBmcm9tIFwiLi93b3JrZXJcIjtcbmltcG9ydCB0eXBlIHsgVGVycmFpbkdlbmVyYXRvciB9IGZyb20gXCIuLi9nZW5lcmF0b3JcIjtcblxuaW50ZXJmYWNlIFdvcmtlckRhdGEge1xuICBjeDogbnVtYmVyO1xuICBjejogbnVtYmVyO1xuICB0eXBlOiBEaW1lbnNpb25UeXBlO1xuICBpZDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBXb3JrZXIoZ2VuZXJhdG9yOiB0eXBlb2YgVGVycmFpbkdlbmVyYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHdvcmtlcjogdHlwZW9mIFRlcnJhaW5Xb3JrZXIpIHtcbiAgICAvLyBCaW5kIHRoZSBnZW5lcmF0b3IgYW5kIHdvcmtlciB0b2dldGhlclxuICAgIGdlbmVyYXRvci5fd29ya2VyID0gd29ya2VyO1xuXG4gICAgLy8gRGVjbGFyZSB0aGUgaW5pdGlhbGl6ZSBtZXRob2QgZm9yIHRoZSB3b3JrZXJcbiAgICB3b3JrZXIuaW5pdGlhbGl6ZSA9IChwcm9wZXJ0aWVzOiBUZXJyYWluR2VuZXJhdG9yUHJvcGVydGllcykgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSBtYWluIHRocmVhZFxuICAgICAgaWYgKCFpc01haW5UaHJlYWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciBjYW4gb25seSBiZSBpbml0aWFsaXplZCBpbiBhIHdvcmtlciB0aHJlYWRcIik7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyB3b3JrZXIgdGhyZWFkXG4gICAgICByZXR1cm4gbmV3IFdvcmtlclRocmVhZCh3b3JrZXIucGF0aCwgeyB3b3JrZXJEYXRhOiBwcm9wZXJ0aWVzIH0pO1xuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBhcmUgaW4gdGhlIHdvcmtlciB0aHJlYWRcbiAgICBpZiAoIWlzTWFpblRocmVhZCkge1xuICAgICAgLy8gU2V0IHRoZSBzZWVkIG9mIHRoZSB3b3JrZXJcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHdvcmtlcihnZW5lcmF0b3IsIHdvcmtlckRhdGEpO1xuXG4gICAgICAvLyBCaW5kIHRoZSBtZXNzYWdlIGV2ZW50IHRvIHRoZSB3b3JrZXJcbiAgICAgIHBhcmVudFBvcnQ/Lm9uKFwibWVzc2FnZVwiLCAoZGF0YTogV29ya2VyRGF0YSkgPT4ge1xuICAgICAgICAvLyBDYWxsIHRoZSBhcHBseSBtZXRob2Qgb2YgdGhlIHdvcmtlciB0byBnZW5lcmF0ZSB0aGUgY2h1bmtcbiAgICAgICAgY29uc3QgY2h1bmsgPSBpbnN0YW5jZS5hcHBseShkYXRhLmN4LCBkYXRhLmN6LCBkYXRhLnR5cGUpO1xuXG4gICAgICAgIC8vIFNlbmQgdGhlIGdlbmVyYXRlZCBjaHVuayBiYWNrIHRvIHRoZSBtYWluIHRocmVhZFxuICAgICAgICBwYXJlbnRQb3J0Py5wb3N0TWVzc2FnZSh7IGlkZW50aWZpZXI6IGdlbmVyYXRvci5pZGVudGlmaWVyLCAuLi5jaHVuayB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IHsgV29ya2VyIH07XG4iLCAiaW1wb3J0IHsgQ2h1bmsgfSBmcm9tIFwiLi4vY2h1bmtcIjtcbmltcG9ydCB7IEJsb2NrUGVybXV0YXRpb24gfSBmcm9tIFwiLi4vLi4vYmxvY2tcIjtcbmltcG9ydCB7IEJsb2NrSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBUZXJyYWluR2VuZXJhdG9yIH0gZnJvbSBcIi4vZ2VuZXJhdG9yXCI7XG5cbmNsYXNzIFZvaWRHZW5lcmF0b3IgZXh0ZW5kcyBUZXJyYWluR2VuZXJhdG9yIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJ2b2lkXCI7XG5cbiAgcHVibGljIGFwcGx5KGN4OiBudW1iZXIsIGN6OiBudW1iZXIpOiBDaHVuayB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNodW5rXG4gICAgY29uc3QgY2h1bmsgPSBuZXcgQ2h1bmsoY3gsIGN6LCB0aGlzLmRpbWVuc2lvbi50eXBlKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjaHVuayBpcyBjZW50ZXJlZCBhdCB0aGUgb3JpZ2luXG4gICAgaWYgKGN4ID09PSAwICYmIGN6ID09PSAwKSB7XG4gICAgICAvLyBTZXQgYSBiZWRyb2NrIGJsb2NrIGF0IHRoZSBjZW50ZXIgb2YgdGhlIGNodW5rXG4gICAgICBjaHVuay5zZXRQZXJtdXRhdGlvbihcbiAgICAgICAgeyB4OiAwLCB5OiAwLCB6OiAwIH0sXG4gICAgICAgIEJsb2NrUGVybXV0YXRpb24ucmVzb2x2ZShCbG9ja0lkZW50aWZpZXIuQmVkcm9jaylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBnZW5lcmF0ZWQgY2h1bmtcbiAgICByZXR1cm4gY2h1bms7XG4gIH1cbn1cblxuZXhwb3J0IHsgVm9pZEdlbmVyYXRvciB9O1xuIiwgImltcG9ydCB7IFRlcnJhaW5HZW5lcmF0b3IgfSBmcm9tIFwiLi4vZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBDaHVuayB9IGZyb20gXCIuLi8uLi9jaHVua1wiO1xuXG5jbGFzcyBTdXBlcmZsYXRHZW5lcmF0b3IgZXh0ZW5kcyBUZXJyYWluR2VuZXJhdG9yIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJzdXBlcmZsYXRcIjtcblxuICBwdWJsaWMgYXBwbHkoY3g6IG51bWJlciwgY3o6IG51bWJlcik6IENodW5rIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgY2h1bmsgYW5kIHNldCBpdCBhcyBub3QgcmVhZHlcbiAgICBjb25zdCBjaHVuayA9IG5ldyBDaHVuayhjeCwgY3osIHRoaXMuZGltZW5zaW9uLnR5cGUpO1xuICAgIGNodW5rLnJlYWR5ID0gZmFsc2U7XG5cbiAgICAvLyBIYW5kIHRoZSBjaHVuayB0byB0aGUgd29ya2VyXG4gICAgdGhpcy5oYW5kb2ZmKGNodW5rKTtcblxuICAgIC8vIFJldHVybiB0aGUgY2h1bmtcbiAgICByZXR1cm4gY2h1bms7XG4gIH1cbn1cblxuZXhwb3J0IHsgU3VwZXJmbGF0R2VuZXJhdG9yIH07XG4iLCAiaW1wb3J0IHsgRGltZW5zaW9uVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBCbG9ja1Blcm11dGF0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL2Jsb2NrXCI7XG5pbXBvcnQgeyBDaHVuayB9IGZyb20gXCIuLi8uLi9jaHVua1wiO1xuaW1wb3J0IHsgVGVycmFpbldvcmtlciwgV29ya2VyIH0gZnJvbSBcIi4uL3dvcmtlclwiO1xuaW1wb3J0IHsgQmxvY2tJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IFN1cGVyZmxhdEdlbmVyYXRvciB9IGZyb20gXCIuL2dlbmVyYXRvclwiO1xuXG5AV29ya2VyKFN1cGVyZmxhdEdlbmVyYXRvcilcbmNsYXNzIFN1cGVyZmxhdFdvcmtlciBleHRlbmRzIFRlcnJhaW5Xb3JrZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhdGggPSBfX2ZpbGVuYW1lO1xuXG4gIHB1YmxpYyBiZWRyb2NrID0gQmxvY2tQZXJtdXRhdGlvbi5yZXNvbHZlKEJsb2NrSWRlbnRpZmllci5CZWRyb2NrKTtcbiAgcHVibGljIGRpcnQgPSBCbG9ja1Blcm11dGF0aW9uLnJlc29sdmUoQmxvY2tJZGVudGlmaWVyLkRpcnQpO1xuICBwdWJsaWMgZ3Jhc3MgPSBCbG9ja1Blcm11dGF0aW9uLnJlc29sdmUoQmxvY2tJZGVudGlmaWVyLkdyYXNzQmxvY2spO1xuXG4gIHB1YmxpYyBhcHBseShjeDogbnVtYmVyLCBjejogbnVtYmVyLCB0eXBlOiBEaW1lbnNpb25UeXBlKTogQ2h1bmsge1xuICAgIGNvbnN0IGNodW5rID0gbmV3IENodW5rKGN4LCBjeiwgdHlwZSk7XG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IDE2OyB4KyspIHtcbiAgICAgIGZvciAobGV0IHogPSAwOyB6IDwgMTY7IHorKykge1xuICAgICAgICBmb3IgKGxldCB5ID0gLTY0OyB5IDwgLTYwOyB5KyspIHtcbiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHsgeCwgeSwgeiB9O1xuXG4gICAgICAgICAgaWYgKHkgPT09IC02NCkge1xuICAgICAgICAgICAgY2h1bmsuc2V0UGVybXV0YXRpb24ocG9zaXRpb24sIHRoaXMuYmVkcm9jaywgZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeSA9PT0gLTYzIHx8IHkgPT09IC02Mikge1xuICAgICAgICAgICAgY2h1bmsuc2V0UGVybXV0YXRpb24ocG9zaXRpb24sIHRoaXMuZGlydCwgZmFsc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHVuay5zZXRQZXJtdXRhdGlvbihwb3NpdGlvbiwgdGhpcy5ncmFzcywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgY2h1bmsuXG4gICAgcmV0dXJuIGNodW5rO1xuICB9XG59XG5cbmV4cG9ydCB7IFN1cGVyZmxhdFdvcmtlciB9O1xuIiwgImltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgSW50ZWdlckVudW0sIFN0cmluZ0VudW0sIFRhcmdldEVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcInRyYW5zZmVyXCIsXG4gICAgXCJUcmFuc2ZlciBhIHBsYXllciB0byBhIGRpZmZlcmVudCBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bSxcbiAgICAgICAgICBhZGRyZXNzOiBTdHJpbmdFbnVtLFxuICAgICAgICAgIHBvcnQ6IEludGVnZXJFbnVtXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gY29udGV4dC50YXJnZXQucmVzdWx0IGFzIEFycmF5PEVudGl0eT47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHRhcmdldHNcbiAgICAgICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB0YXJnZXRzIG1hdGNoZWQgdGhlIHNlbGVjdG9yLlwiKTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIHJldHVybiBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBhZGRyZXNzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBhZGRyZXNzID0gY29udGV4dC5hZGRyZXNzLnJlc3VsdCBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBvcnQgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHBvcnQgPSBjb250ZXh0LnBvcnQucmVzdWx0IGFzIG51bWJlcjtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHNcbiAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGlzIGEgcGxheWVyXG4gICAgICAgICAgICBpZiAoIXRhcmdldC5pc1BsYXllcigpKSB7XG4gICAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgICAgYMKnY0VudGl0eSDCpzQke3RhcmdldC51bmlxdWVJZH3Cp2MgaXMgbm90IGEgcGxheWVyLsKncmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBTa2lwIHRvIHRoZSBuZXh0IHRhcmdldFxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJhbnNmZXIgdGhlIHBsYXllciB0byB0aGUgbmV3IHNlcnZlclxuICAgICAgICAgICAgdGFyZ2V0LnRyYW5zZmVyKGFkZHJlc3MsIHBvcnQpO1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgYMKnYVRyYW5zZmVycmVkIMKnMiR7dGFyZ2V0LnVzZXJuYW1lfcKnYSB0byDCpzIke2FkZHJlc3N9OiR7cG9ydH3Cp2EuwqdyYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1lc3NhZ2VcbiAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlLmpvaW4oXCJcXG5cIikgfTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHt9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsLCBWZWN0b3IzZiB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlFbnVtLCBQb3NpdGlvbkVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgLy8gUmVnaXN0ZXIgdGhlIHNldGJsb2NrIGNvbW1hbmRcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJzdW1tb25cIixcbiAgICBcIlN1bW1vbnMgYW4gZW50aXR5IGF0IGEgc3BlY2lmaWVkIGxvY2F0aW9uXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBlbnRpdHk6IEVudGl0eUVudW1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgb3JpZ2luIGlzIGEgZGltZW5zaW9uLCBpZiBzbywgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgICBpZiAoIShjb250ZXh0Lm9yaWdpbiBpbnN0YW5jZW9mIEVudGl0eSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIFwiWW91IGNhbid0IHVzZSB0aGlzIGNvbW1hbmQgaW4gdGhpcyBjb250ZXh0LCB0cnkgYWRkaW5nIGEgcG9zaXRpb24gYXJndW1lbnQuXCJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgZW50aXR5XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IChjb250ZXh0LmVudGl0eS5yZXN1bHQgYXMgc3RyaW5nKS5pbmNsdWRlcyhcIjpcIilcbiAgICAgICAgICAgID8gKGNvbnRleHQuZW50aXR5LnJlc3VsdCBhcyBFbnRpdHlJZGVudGlmaWVyKVxuICAgICAgICAgICAgOiAoYG1pbmVjcmFmdDoke2NvbnRleHQuZW50aXR5LnJlc3VsdH1gIGFzIEVudGl0eUlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgZW50aXR5XG4gICAgICAgICAgY29uc3QgeyB4LCB5LCB6IH0gPSBjb250ZXh0Lm9yaWdpbi5wb3NpdGlvbi5mbG9vcigpO1xuXG4gICAgICAgICAgLy8gU3Bhd24gdGhlIGVudGl0eSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uXG4gICAgICAgICAgY29udGV4dC5vcmlnaW4uZGltZW5zaW9uLnNwYXduRW50aXR5KFxuICAgICAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgICAgIG5ldyBWZWN0b3IzZih4LCB5LCB6KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTZW5kIHRoZSBzdWNjZXNzIG1lc3NhZ2VcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogYFN1Y2Nlc3NmdWxseSBzdW1tb25lZCBlbnRpdHkgYXQgJHt4fSwgJHt5fSwgJHt6fSFgXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIGFuIG92ZXJsb2FkIGZvciB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBlbnRpdHk6IEVudGl0eUVudW0sXG4gICAgICAgICAgcG9zaXRpb246IFBvc2l0aW9uRW51bVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgcmVzdWx0IG9mIHRoZSBlbnRpdHkgYW5kIHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IChjb250ZXh0LmVudGl0eS5yZXN1bHQgYXMgc3RyaW5nKS5pbmNsdWRlcyhcIjpcIilcbiAgICAgICAgICAgID8gKGNvbnRleHQuZW50aXR5LnJlc3VsdCBhcyBFbnRpdHlJZGVudGlmaWVyKVxuICAgICAgICAgICAgOiAoYG1pbmVjcmFmdDoke2NvbnRleHQuZW50aXR5LnJlc3VsdH1gIGFzIEVudGl0eUlkZW50aWZpZXIpO1xuICAgICAgICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gY29udGV4dC5wb3NpdGlvbi5yZXN1bHQgYXMgVmVjdG9yM2Y7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGRpbWVuc2lvbiBiYXNlZCBvbiB0aGUgb3JpZ2luXG4gICAgICAgICAgY29uc3QgZGltZW5zaW9uID1cbiAgICAgICAgICAgIGNvbnRleHQub3JpZ2luIGluc3RhbmNlb2YgRW50aXR5XG4gICAgICAgICAgICAgID8gY29udGV4dC5vcmlnaW4uZGltZW5zaW9uXG4gICAgICAgICAgICAgIDogY29udGV4dC5vcmlnaW47XG5cbiAgICAgICAgICAvLyBTdW1tb24gdGhlIGVudGl0eSBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uXG4gICAgICAgICAgZGltZW5zaW9uLnNwYXduRW50aXR5KGlkZW50aWZpZXIsIG5ldyBWZWN0b3IzZih4LCB5LCB6KSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHtcbiAgQWN0b3JEYW1hZ2VDYXVzZSxcbiAgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCxcbiAgR2FtZW1vZGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFRhcmdldEVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbi8qKlxuICogV2hlbiBleGVjdXRpbmcgL2tpbGwgb24gYSBwbGF5ZXIsIGlmIHRoZSBwbGF5ZXJcbiAqIGhhcyBvbmUgb2YgdGhlc2UgZ2FtZW1vZGVzLCB0aGUgcGxheWVyIHdpbGwgYmUgaWdub3JlZC5cbiAqL1xuY29uc3QgSUdOT1JFRF9HQU1FTU9ERVMgPSBuZXcgU2V0KFtcbiAgR2FtZW1vZGUuQ3JlYXRpdmUsXG4gIEdhbWVtb2RlLkNyZWF0aXZlU3BlY3RhdG9yLFxuICBHYW1lbW9kZS5TcGVjdGF0b3Jcbl0pO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgLy8gUmVnaXN0ZXIgdGhlIGtpbGwgY29tbWFuZFxuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcImtpbGxcIixcbiAgICBcIktpbGxzIGVudGl0aWVzIChwbGF5ZXJzLCBtb2JzLCBldGMuKS5cIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gb3ZlcmxvYWQgZm9yIHRoZSBjb21tYW5kXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIFZhbGlkYXRlIHRoZSB0YXJnZXRcbiAgICAgICAgICBjb250ZXh0LnRhcmdldC52YWxpZGF0ZSh0cnVlKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGNvbnRleHQudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxFbnRpdHk+O1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIG5vIHRhcmdldHNcbiAgICAgICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB0YXJnZXRzIG1hdGNoZWQgdGhlIHNlbGVjdG9yLlwiKTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIHJldHVybiBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdGFyZ2V0c1xuICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgUGxheWVyICYmXG4gICAgICAgICAgICAgIElHTk9SRURfR0FNRU1PREVTLmhhcyh0YXJnZXQuZ2FtZW1vZGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgICBgwqdjUGxheWVyIMKnNCR7dGFyZ2V0LnVzZXJuYW1lfcKnYyBpcyBpbiBhIGdhbWVtb2RlIHRoYXQgY2Fubm90IGJlIGtpbGxlZC7Cp3JgXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGxheWVyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBLaWxsIHRoZSBlbnRpdHlcbiAgICAgICAgICAgIHRhcmdldC5raWxsKHVuZGVmaW5lZCwgQWN0b3JEYW1hZ2VDYXVzZS5Ob25lKTtcblxuICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgIGDCp2FLaWxsZWQgwqcyJHt0YXJnZXQuaXNQbGF5ZXIoKSA/IHRhcmdldC51c2VybmFtZSA6IHRhcmdldC51bmlxdWVJZH3Cp2EuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1lc3NhZ2VcbiAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlLmpvaW4oXCJcXG5cIikgfTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHt9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIC8vIFJlZ2lzdGVyIHRoZSBzdG9wIGNvbW1hbmRcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJzdG9wXCIsXG4gICAgXCJTdG9wcyB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIC8vIHN0b3AgdGhlIHNlcnZlclxuICAgICAgd29ybGQuc2VyZW5pdHkuc3RvcCgpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgU3RyaW5nRW51bSwgVGFyZ2V0RW51bSwgV29ybGRFbnVtIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tIFwiLi4vLi4vd29ybGRcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXG4gICAgXCJ3b3JsZFwiLFxuICAgIFwiQ2hhbmdlIHRoZSBjdXJyZW50IHdvcmxkIG9mIGFuIGVudGl0eVwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0OiBUYXJnZXRFbnVtLFxuICAgICAgICAgIHdvcmxkOiBXb3JsZEVudW0sXG4gICAgICAgICAgZGltZW5zaW9uOiBbU3RyaW5nRW51bSwgdHJ1ZV1cbiAgICAgICAgfSxcbiAgICAgICAgKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHNlcmVuaXR5IGluc3RhbmNlIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBzZXJlbml0eSA9IGNvbnRleHQub3JpZ2luLmdldFdvcmxkKCkuc2VyZW5pdHk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHRhcmdldHMgZnJvbSB0aGUgY29udGV4dFxuICAgICAgICAgIGNvbnN0IHRhcmdldHMgPSBjb250ZXh0LnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8RW50aXR5PjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdGFyZ2V0c1xuICAgICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHRhcmdldHMgbWF0Y2hlZCB0aGUgc2VsZWN0b3IuXCIpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSB3b3JsZCBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3Qgd29ybGQgPSBzZXJlbml0eS5nZXRXb3JsZChjb250ZXh0LndvcmxkLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHdvcmxkIGV4aXN0c1xuICAgICAgICAgIGlmICghd29ybGQpIHRocm93IG5ldyBFcnJvcihcIldvcmxkIGRvZXMgbm90IGV4aXN0LlwiKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCBkaW1lbnNpb24gPSBjb250ZXh0LmRpbWVuc2lvbi5yZXN1bHRcbiAgICAgICAgICAgID8gd29ybGQuZ2V0RGltZW5zaW9uKGNvbnRleHQuZGltZW5zaW9uLnJlc3VsdCBhcyBzdHJpbmcpXG4gICAgICAgICAgICA6IHdvcmxkLmdldERpbWVuc2lvbigpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRpbWVuc2lvbiBleGlzdHNcbiAgICAgICAgICBpZiAoIWRpbWVuc2lvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRpbWVuc2lvbiBkb2VzIG5vdCBleGlzdCBpbiBzcGVjaWZpZWQgd29ybGQuXCIpO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmV0dXJuIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gW107XG5cbiAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSB0YXJnZXRzXG4gICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSB3b3JsZCBvZiB0aGUgdGFyZ2V0XG4gICAgICAgICAgICB0YXJnZXQudGVsZXBvcnQodGFyZ2V0LnBvc2l0aW9uLCBkaW1lbnNpb24pO1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgYMKnYVN1Y2Nlc3NmdWxseSBjaGFuZ2VkIHRoZSB3b3JsZCBvZiDCpzIke3RhcmdldC5pc1BsYXllcigpID8gdGFyZ2V0LnVzZXJuYW1lIDogdGFyZ2V0LnVuaXF1ZUlkfcKnYSB0byDCpzIke3dvcmxkLnByb3BlcnRpZXMuaWRlbnRpZmllcn3Cp2EgaW4gZGltZW5zaW9uIMKnMiR7ZGltZW5zaW9uLnByb3BlcnRpZXMuaWRlbnRpZmllcn3Cp2EuwqdyYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1lc3NhZ2VcbiAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlLmpvaW4oXCJcXG5cIikgfTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICAgICgpID0+IHt9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDb21tYW5kUGVybWlzc2lvbkxldmVsIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFRhcmdldEVudW0gfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcIm9wXCIsXG4gICAgXCJTZXQgdGhlIG9wZXJhdG9yIHN0YXR1cyBvZiBhIHBsYXllclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgdGFyZ2V0OiBUYXJnZXRFbnVtXG4gICAgICAgIH0sXG4gICAgICAgIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXRzIGZyb20gdGhlIGNvbnRleHRcbiAgICAgICAgICBjb25zdCB0YXJnZXRzID0gY29udGV4dC50YXJnZXQucmVzdWx0IGFzIEFycmF5PEVudGl0eT47XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHRhcmdldHNcbiAgICAgICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyB0YXJnZXRzIG1hdGNoZWQgdGhlIHNlbGVjdG9yLlwiKTtcblxuICAgICAgICAgIC8vIFByZXBhcmUgdGhlIHJldHVybiBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdGFyZ2V0c1xuICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgaXMgYSBwbGF5ZXJcbiAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzUGxheWVyKCkpIHtcbiAgICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgICBgwqdjRW50aXR5IMKnNCR7dGFyZ2V0LnVuaXF1ZUlkfcKnYyBpcyBub3QgYSBwbGF5ZXIuwqdyYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIFNraXAgdG8gdGhlIG5leHQgdGFyZ2V0XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGlzIGFscmVhZHkgYSBzZXJ2ZXIgb3BlcmF0b3JcbiAgICAgICAgICAgIGlmICh0YXJnZXQuaXNPcCgpKSB7XG4gICAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgICAgYMKnY1BsYXllciDCpzQke3RhcmdldC51c2VybmFtZX3Cp2MgaXMgYWxyZWFkeSBhIHNlcnZlciBvcGVyYXRvciBvciBoYXMgYSBoaWdoZXIgcGVybWlzc2lvbiBsZXZlbC7Cp3JgXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gU2tpcCB0byB0aGUgbmV4dCB0YXJnZXRcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgb3BlcmF0b3Igc3RhdHVzIG9mIHRoZSBwbGF5ZXJcbiAgICAgICAgICAgIHRhcmdldC5vcCgpO1xuXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChcbiAgICAgICAgICAgICAgYMKnYVN1Y2Nlc3NmdWxseSBtYWRlIMKnMiR7dGFyZ2V0LnVzZXJuYW1lfcKnYSBhIHNlcnZlciBvcGVyYXRvci7Cp3JgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJldHVybiB0aGUgbWVzc2FnZVxuICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IG1lc3NhZ2Uuam9pbihcIlxcblwiKSB9O1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge31cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgVGFyZ2V0RW51bSB9IGZyb20gXCIuLi9lbnVtc1wiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uLy4uL3dvcmxkXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwiZGVvcFwiLFxuICAgIFwiUmVtb3ZlIHRoZSBvcGVyYXRvciBzdGF0dXMgb2YgYSBwbGF5ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgY29tbWFuZCB0byBiZSBhbiBvcGVyYXRvciBjb21tYW5kXG4gICAgICByZWdpc3RyeS5wZXJtaXNzaW9uTGV2ZWwgPSBDb21tYW5kUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIHRhcmdldDogVGFyZ2V0RW51bVxuICAgICAgICB9LFxuICAgICAgICAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0cyBmcm9tIHRoZSBjb250ZXh0XG4gICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGNvbnRleHQudGFyZ2V0LnJlc3VsdCBhcyBBcnJheTxFbnRpdHk+O1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSB0YXJnZXRzXG4gICAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdGFyZ2V0cyBtYXRjaGVkIHRoZSBzZWxlY3Rvci5cIik7XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXR1cm4gbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHNcbiAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IGlzIGEgcGxheWVyXG4gICAgICAgICAgICBpZiAoIXRhcmdldC5pc1BsYXllcigpKSB7XG4gICAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICBtZXNzYWdlLnB1c2goXG4gICAgICAgICAgICAgICAgYMKnY0VudGl0eSDCpzQke3RhcmdldC51bmlxdWVJZH3Cp2MgaXMgbm90IGEgcGxheWVyLsKncmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBTa2lwIHRvIHRoZSBuZXh0IHRhcmdldFxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBpcyBub3QgYSBzZXJ2ZXIgb3BlcmF0b3JcbiAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzT3AoKSkge1xuICAgICAgICAgICAgICAvLyBBcHBlbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICAgIGDCp2NQbGF5ZXIgwqc0JHt0YXJnZXQudXNlcm5hbWV9wqdjIGlzIG5vdCBhIHNlcnZlciBvcGVyYXRvci7Cp3JgXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gU2tpcCB0byB0aGUgbmV4dCB0YXJnZXRcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb3BlcmF0b3Igc3RhdHVzIG9mIHRoZSBwbGF5ZXJcbiAgICAgICAgICAgIHRhcmdldC5kZW9wKCk7XG5cbiAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgbWVzc2FnZS5wdXNoKFxuICAgICAgICAgICAgICBgwqdhU3VjY2Vzc2Z1bGx5IHJlbW92ZWQgwqcyJHt0YXJnZXQudXNlcm5hbWV9wqdhIGFzIGEgc2VydmVyIG9wZXJhdG9yLsKncmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmV0dXJuIHRoZSBtZXNzYWdlXG4gICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogbWVzc2FnZS5qb2luKFwiXFxuXCIpIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7fVxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSBcIi4uLy4uL3dvcmxkXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCkgPT4ge1xuICAvLyBSZWdpc3RlciB0aGUgc3RvcCBjb21tYW5kXG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwic2F2ZVwiLFxuICAgIFwiU2F2ZSB0aGUgY3VycmVudCB3b3JsZCdzIGRhdGEgdG8gZGlza1wiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICAvLyBTYXZlIHRoZSB3b3JsZFxuICAgICAgd29ybGQucHJvdmlkZXIub25TYXZlKCk7XG5cbiAgICAgIC8vIFJldHVybiBhIG1lc3NhZ2VcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2U6IFwiV29ybGQgaGFzIGJlZW4gc2F2ZWQsIGNoZWNrIGNvbnNvbGUgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy5cIlxuICAgICAgfTtcbiAgICB9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgR2FtZW1vZGUgZnJvbSBcIi4vZ2FtZW1vZGVcIjtcbmltcG9ydCBBYmlsaXR5IGZyb20gXCIuL2FiaWxpdHlcIjtcbmltcG9ydCBDbGVhciBmcm9tIFwiLi9jbGVhclwiO1xuaW1wb3J0IEZpbGwgZnJvbSBcIi4vZmlsbFwiO1xuaW1wb3J0IEdpdmUgZnJvbSBcIi4vZ2l2ZVwiO1xuaW1wb3J0IEtpY2sgZnJvbSBcIi4va2lja1wiO1xuaW1wb3J0IFNldGJsb2NrIGZyb20gXCIuL3NldGJsb2NrXCI7XG5pbXBvcnQgVGFnIGZyb20gXCIuL3RhZ1wiO1xuaW1wb3J0IFRwIGZyb20gXCIuL3RwXCI7XG5pbXBvcnQgVHJhbnNmZXIgZnJvbSBcIi4vdHJhbnNmZXJcIjtcbmltcG9ydCBTdW1tb24gZnJvbSBcIi4vc3VtbW9uXCI7XG5pbXBvcnQgS2lsbCBmcm9tIFwiLi9raWxsXCI7XG5pbXBvcnQgU1RPUCBmcm9tIFwiLi9zdG9wXCI7XG5pbXBvcnQgV09STEQgZnJvbSBcIi4vd29ybGRcIjtcbmltcG9ydCBPUCBmcm9tIFwiLi9vcFwiO1xuaW1wb3J0IERFT1AgZnJvbSBcIi4vZGVvcFwiO1xuaW1wb3J0IFNBVkUgZnJvbSBcIi4vc2F2ZVwiO1xuXG4vLyBEZWZpbmUgYWxsIHRoZSBhZG1pbiBjb21tYW5kc1xuY29uc3QgQWRtaW5Db21tYW5kcyA9IFtcbiAgR2FtZW1vZGUsXG4gIEFiaWxpdHksXG4gIENsZWFyLFxuICBGaWxsLFxuICBHaXZlLFxuICBLaWNrLFxuICBTZXRibG9jayxcbiAgVGFnLFxuICBUcCxcbiAgVHJhbnNmZXIsXG4gIFN1bW1vbixcbiAgS2lsbCxcbiAgU1RPUCxcbiAgV09STEQsXG4gIE9QLFxuICBERU9QLFxuICBTQVZFXG5dO1xuXG5leHBvcnQgeyBBZG1pbkNvbW1hbmRzIH07XG4iLCAiaW1wb3J0IHsgTUlORUNSQUZUX1ZFUlNJT04sIFBST1RPQ09MX1ZFUlNJT04gfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gXCIuLi8uLi93b3JsZFwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQpID0+IHtcbiAgd29ybGQuY29tbWFuZHMucmVnaXN0ZXIoXCJhYm91dFwiLCBcIkdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyXCIsICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogYMKnN1RoaXMgc2VydmVyIGlzIHJ1bm5pbmcgwqd1U2VyZW5pdHlKU8KnNyBmb3IgTWluZWNyYWZ0IEJlZHJvY2sgRWRpdGlvbi4gwqc4KHYke01JTkVDUkFGVF9WRVJTSU9OfSwgcHJvdG8tdiR7UFJPVE9DT0xfVkVSU0lPTn0pwqdyYFxuICAgIH07XG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXI7XG4iLCAiaW1wb3J0IEFib3V0IGZyb20gXCIuL2Fib3V0XCI7XG5cbmNvbnN0IENvbW1vbkNvbW1hbmRzID0gW0Fib3V0XTtcblxuZXhwb3J0IHsgQ29tbW9uQ29tbWFuZHMgfTtcbiIsICJpbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tIFwibm9kZTpyZWFkbGluZVwiO1xuaW1wb3J0IHsgc3RkaW4sIHN0ZG91dCB9IGZyb20gXCJub2RlOnByb2Nlc3NcIjtcblxuaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiLi4vc2VyZW5pdHlcIjtcblxuY2xhc3MgQ29uc29sZUludGVyZmFjZSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGludGVyZmFjZSA9IGNyZWF0ZUludGVyZmFjZSh7XG4gICAgaW5wdXQ6IHN0ZGluLFxuICAgIG91dHB1dDogc3Rkb3V0LFxuICAgIHRlcm1pbmFsOiB0cnVlXG4gIH0pO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJlbml0eTogU2VyZW5pdHkpIHtcbiAgICB0aGlzLnNlcmVuaXR5ID0gc2VyZW5pdHk7XG5cbiAgICBzdGRpbi5zZXRSYXdNb2RlKHRydWUpO1xuICAgIHN0ZGluLnJlc3VtZSgpO1xuXG4gICAgdGhpcy5pbnRlcmZhY2Uub24oXCJsaW5lXCIsIHRoaXMub25MaW5lLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy5pbnRlcmZhY2Uuc2V0UHJvbXB0KFwiPiBcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25MaW5lKGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBsaW5lIHN0YXJ0cyB3aXRoIGEgL1xuICAgIC8vIElmIHNvLCBzbGljZSB0aGUgbGluZSBhbmQgZXhlY3V0ZSB0aGUgY29tbWFuZFxuICAgIGNvbnN0IGZvcm1hdCA9IGxpbmUuc3RhcnRzV2l0aChcIi9cIikgPyBsaW5lLnNsaWNlKDEpIDogbGluZTtcblxuICAgIC8vIFBhcnNlIHRoZSBmbGFncyBmcm9tIHRoZSBjb21tYW5kXG4gICAgY29uc3QgeyBjb21tYW5kLCBmbGFncyB9ID0gdGhpcy5wYXJzZUZsYWdzKGZvcm1hdCk7XG5cbiAgICAvLyBDaGVjayBpZiBhIGRpbWVuc2lvbiBmbGFnIGFuZCB3b3JsZCBmbGFnIGFyZSBwcmVzZW50XG4gICAgY29uc3QgZGltZW5zaW9uRmxhZyA9IGZsYWdzLmZpbmQoKFtrZXldKSA9PiBrZXkgPT09IFwiZGltXCIpO1xuICAgIGNvbnN0IHdvcmxkRmxhZyA9IGZsYWdzLmZpbmQoKFtrZXldKSA9PiBrZXkgPT09IFwid29ybGRcIik7XG5cbiAgICBpZiAod29ybGRGbGFnICYmICFkaW1lbnNpb25GbGFnKSB7XG4gICAgICAvLyBHZXQgdGhlIHdvcmxkIGZyb20gdGhlIHdvcmxkIGZsYWdcbiAgICAgIGNvbnN0IHdvcmxkID0gdGhpcy5zZXJlbml0eS53b3JsZHMuZ2V0KHdvcmxkRmxhZ1sxXSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB3b3JsZCBleGlzdHNcbiAgICAgIGlmICghd29ybGQpIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciB0byB0aGUgY29uc29sZVxuICAgICAgICB0aGlzLnNlcmVuaXR5LmxvZ2dlci5lcnJvcihcIlRoZSBzcGVjaWZpZWQgd29ybGQgZG9lcyBub3QgZXhpc3RcIik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIGRlZmF1bHQgZGltZW5zaW9uIG9mIHRoZSB3b3JsZFxuICAgICAgY29uc3QgZGltZW5zaW9uID0gd29ybGQuZ2V0RGltZW5zaW9uKCk7XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgY29tbWFuZFxuICAgICAgICBjb25zdCBleGVjdXRlID0gZGltZW5zaW9uLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb21tYW5kIGlzIHVuZGVmaW5lZFxuICAgICAgICBpZiAoIWV4ZWN1dGUubWVzc2FnZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIExvZyB0aGUgY29tbWFuZCB0byB0aGUgY29uc29sZVxuICAgICAgICB3b3JsZC5sb2dnZXIuaW5mbyhgwqdhJHtleGVjdXRlLm1lc3NhZ2V9wqdyYCk7XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gQ2FzdCB0aGUgcmVhc29uIHRvIGFuIGVycm9yXG4gICAgICAgIGNvbnN0IGVycm9yID0gcmVhc29uIGFzIEVycm9yO1xuXG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgd29ybGQubG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGltZW5zaW9uRmxhZyAmJiAhd29ybGRGbGFnKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAgICB0aGlzLnNlcmVuaXR5LmxvZ2dlci5lcnJvcihcbiAgICAgICAgXCJZb3UgbXVzdCBzcGVjaWZ5IGEgd29ybGQgZmxhZyB3aGVuIHNwZWNpZnlpbmcgYSBkaW1lbnNpb24gZmxhZ1wiXG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChkaW1lbnNpb25GbGFnICYmIHdvcmxkRmxhZykge1xuICAgICAgLy8gR2V0IHRoZSB3b3JsZCBmcm9tIHRoZSB3b3JsZCBmbGFnXG4gICAgICBjb25zdCB3b3JsZCA9IHRoaXMuc2VyZW5pdHkud29ybGRzLmdldCh3b3JsZEZsYWdbMV0pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgd29ybGQgZXhpc3RzXG4gICAgICBpZiAoIXdvcmxkKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgdGhpcy5zZXJlbml0eS5sb2dnZXIuZXJyb3IoXCJUaGUgc3BlY2lmaWVkIHdvcmxkIGRvZXMgbm90IGV4aXN0XCIpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gZnJvbSB0aGUgZGltZW5zaW9uIGZsYWdcbiAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IHdvcmxkLmdldERpbWVuc2lvbihkaW1lbnNpb25GbGFnWzFdKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRpbWVuc2lvbiBleGlzdHNcbiAgICAgIGlmICghZGltZW5zaW9uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgdGhpcy5zZXJlbml0eS5sb2dnZXIuZXJyb3IoXCJUaGUgc3BlY2lmaWVkIGRpbWVuc2lvbiBkb2VzIG5vdCBleGlzdFwiKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgY29tbWFuZFxuICAgICAgICBjb25zdCBleGVjdXRlID0gZGltZW5zaW9uLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb21tYW5kIGlzIHVuZGVmaW5lZFxuICAgICAgICBpZiAoIWV4ZWN1dGUubWVzc2FnZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIExvZyB0aGUgY29tbWFuZCB0byB0aGUgY29uc29sZVxuICAgICAgICB3b3JsZC5sb2dnZXIuc3VjY2VzcyhgJHtleGVjdXRlLm1lc3NhZ2V9wqdyYCk7XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gQ2FzdCB0aGUgcmVhc29uIHRvIGFuIGVycm9yXG4gICAgICAgIGNvbnN0IGVycm9yID0gcmVhc29uIGFzIEVycm9yO1xuXG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgd29ybGQubG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgdGhlIGRlZmF1bHQgd29ybGQgb2YgdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgICBjb25zdCB3b3JsZCA9IHRoaXMuc2VyZW5pdHkuZ2V0V29ybGQoKTtcbiAgICAgIC8vIEdldCB0aGUgZGVmYXVsdCBkaW1lbnNpb24gb2YgdGhlIHdvcmxkXG4gICAgICBjb25zdCBkaW1lbnNpb24gPSB3b3JsZC5nZXREaW1lbnNpb24oKTtcblxuICAgICAgLy8gQXR0ZW1wdCB0byBleGVjdXRlIHRoZSBjb21tYW5kXG4gICAgICB0cnkge1xuICAgICAgICAvLyBFeGVjdXRlIHRoZSBjb21tYW5kXG4gICAgICAgIGNvbnN0IGV4ZWN1dGUgPSBkaW1lbnNpb24uZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbW1hbmQgaXMgdW5kZWZpbmVkXG4gICAgICAgIGlmICghZXhlY3V0ZS5tZXNzYWdlKSByZXR1cm47XG5cbiAgICAgICAgLy8gTG9nIHRoZSBjb21tYW5kIHRvIHRoZSBjb25zb2xlXG4gICAgICAgIHdvcmxkLmxvZ2dlci5pbmZvKGDCp2Eke2V4ZWN1dGUubWVzc2FnZX3Cp3JgKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBDYXN0IHRoZSByZWFzb24gdG8gYW4gZXJyb3JcbiAgICAgICAgY29uc3QgZXJyb3IgPSByZWFzb24gYXMgRXJyb3I7XG5cbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciB0byB0aGUgY29uc29sZVxuICAgICAgICB3b3JsZC5sb2dnZXIuZXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBhcnNlRmxhZ3MoY29tbWFuZDogc3RyaW5nKToge1xuICAgIGNvbW1hbmQ6IHN0cmluZztcbiAgICBmbGFnczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT47XG4gIH0ge1xuICAgIC8vIEV4YW1wbGU6IC9zZXRibG9jayAwIDEwMCAwIHN0b25lIC0tZGltPW92ZXJ3b3JsZCAtLXdvcmxkPXRlc3QxMjNcbiAgICBjb25zdCBmbGFncyA9IGNvbW1hbmRcbiAgICAgIC5zcGxpdChcIi0tXCIpXG4gICAgICAuc2xpY2UoMSlcbiAgICAgIC5tYXAoKGZsYWcpID0+IHtcbiAgICAgICAgLy8gU3BsaXQgdGhlIGZsYWcgYnkgdGhlIGVxdWFscyBzaWduXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IGZsYWcuc3BsaXQoXCI9XCIpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgc3BhY2UgYWZ0ZXIgdGhlIHZhbHVlXG4gICAgICAgIC8vIElmIHNvLCBzbGljZSB0aGUgdmFsdWVcbiAgICAgICAgaWYgKHZhbHVlPy5lbmRzV2l0aChcIiBcIikpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBzcGFjZVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdmFsdWUuaW5kZXhPZihcIiBcIik7XG5cbiAgICAgICAgICAvLyBTbGljZSB0aGUgdmFsdWVcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0aGUga2V5IGFuZCB2YWx1ZVxuICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgfSkgYXMgQXJyYXk8W3N0cmluZywgc3RyaW5nXT47XG5cbiAgICBjb25zdCBuZXdDb21tYW5kID0gY29tbWFuZC5zcGxpdChcIi0tXCIpPy5bMF0/LnRyaW0oKSA/PyBjb21tYW5kO1xuXG4gICAgcmV0dXJuIHsgY29tbWFuZDogbmV3Q29tbWFuZCwgZmxhZ3MgfTtcbiAgfVxufVxuXG5leHBvcnQgeyBDb25zb2xlSW50ZXJmYWNlIH07XG4iLCAiaW1wb3J0IHsgSXRlbUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IEl0ZW1zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJdGVtRW51bSB9IGZyb20gXCIuLi9jb21tYW5kc1wiO1xuXG5pbXBvcnQgeyBDcmVhdGl2ZUl0ZW0sIEl0ZW1UcmFpdHMsIEl0ZW1UeXBlIH0gZnJvbSBcIi5cIjtcblxuaW1wb3J0IHR5cGUgeyBJdGVtVHJhaXQgfSBmcm9tIFwiLi90cmFpdHNcIjtcbmltcG9ydCB0eXBlIHsgQmxvY2tUeXBlIH0gZnJvbSBcIi4uL2Jsb2NrXCI7XG5cbmNsYXNzIEl0ZW1QYWxldHRlIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGl0ZW0gdHlwZXMgZm9yIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzID0gSXRlbVR5cGUudHlwZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBjcmVhdGl2ZSBjb250ZW50IGZvciB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGl2ZUNvbnRlbnQgPSBDcmVhdGl2ZUl0ZW0uaXRlbXM7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGl0ZW0gdHJhaXRzIGZvciB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHMgPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIEl0ZW1UcmFpdD4oKTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdHJ5IGZvciB0aGUgaXRlbSB0cmFpdHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVnaXN0cnkgPSBuZXcgTWFwPEl0ZW1JZGVudGlmaWVyLCBBcnJheTx0eXBlb2YgSXRlbVRyYWl0Pj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gUmVnaXN0ZXIgYWxsIGl0ZW0gdHJhaXRzLlxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgSXRlbVRyYWl0cykgdGhpcy5yZWdpc3RlclRyYWl0KHRyYWl0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCBpdGVtIHR5cGVzIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEByZXR1cm5zIEFsbCBpdGVtIHR5cGVzIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsVHlwZXMoKTogQXJyYXk8SXRlbVR5cGU+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMudHlwZXMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gaXRlbSB0eXBlIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpdGVtIGlkZW50aWZpZXIgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSB0eXBlIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VHlwZTxUIGV4dGVuZHMga2V5b2YgSXRlbXM+KGlkZW50aWZpZXI6IFQpOiBJdGVtVHlwZTxUPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnR5cGVzLmdldChpZGVudGlmaWVyKSBhcyBJdGVtVHlwZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBpdGVtIHR5cGUgZnJvbSB0aGUgYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGJsb2NrIHR5cGUgdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMgVGhlIGl0ZW0gdHlwZSBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIHJlc29sdmVUeXBlKHR5cGU6IEJsb2NrVHlwZSk6IEl0ZW1UeXBlIHwgbnVsbCB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnR5cGVzLnZhbHVlcygpXS5maW5kKChpdGVtKSA9PiBpdGVtLmJsb2NrID09PSB0eXBlKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSh0eXBlOiBJdGVtVHlwZSk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIHR5cGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgIGlmICh0aGlzLnR5cGVzLmhhcyh0eXBlLmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgaXRlbSB0eXBlLlxuICAgIHRoaXMudHlwZXMuc2V0KHR5cGUuaWRlbnRpZmllciwgdHlwZSk7XG5cbiAgICAvLyBBZGQgdGhlIGl0ZW0gdHlwZSB0byB0aGUgaXRlbSBlbnVtLlxuICAgIEl0ZW1FbnVtLm9wdGlvbnMucHVzaCh0eXBlLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGl0ZW0gdHlwZSB3YXMgcmVnaXN0ZXJlZC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZWdpc3RyeShpZGVudGlmaWVyOiBJdGVtSWRlbnRpZmllcik6IEFycmF5PHR5cGVvZiBJdGVtVHJhaXQ+IHtcbiAgICAvLyBHZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgaXRlbSBpZGVudGlmaWVyLlxuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyeS5nZXQoaWRlbnRpZmllcik7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgaXRlbSBpZGVudGlmaWVyLlxuICAgIHJldHVybiByZWdpc3RyeSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCBjcmVhdGl2ZSBjb250ZW50IGZyb20gdGhlIHBhbGV0dGUuXG4gICAqIEByZXR1cm5zIEFsbCBjcmVhdGl2ZSBjb250ZW50IGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3JlYXRpdmVDb250ZW50KCk6IEFycmF5PENyZWF0aXZlSXRlbT4ge1xuICAgIHJldHVybiBbLi4udGhpcy5jcmVhdGl2ZUNvbnRlbnQudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjcmVhdGl2ZSBjb250ZW50IGJ5IGluZGV4LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBjcmVhdGl2ZSBjb250ZW50LlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRpdmUgY29udGVudCBieSBpbmRleC5cbiAgICovXG4gIHB1YmxpYyBnZXRDcmVhdGl2ZUNvbnRlbnRCeUluZGV4KGluZGV4OiBudW1iZXIpOiBDcmVhdGl2ZUl0ZW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGl2ZUNvbnRlbnQuZ2V0KGluZGV4KSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbmV3IGNyZWF0aXZlIGl0ZW0uXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBpdGVtIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEBwYXJhbSBhdXhpbGxhcnkgVGhlIGF1eGlsbGFyeSBkYXRhIGZvciB0aGUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckNyZWF0aXZlQ29udGVudCh0eXBlOiBJdGVtVHlwZSwgYXV4aWxsYXJ5ID0gMCk6IHZvaWQge1xuICAgIC8vIFRPRE86IEFkZCBOQlQgc3VwcG9ydFxuXG4gICAgLy8gR2V0IHRoZSBpbmRleCBmb3IgdGhlIGNyZWF0aXZlIGl0ZW0uXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmNyZWF0aXZlQ29udGVudC5zaXplO1xuXG4gICAgLy8gU2V0IHRoZSBjcmVhdGl2ZSBpdGVtIGluIHRoZSByZWdpc3RyeS5cbiAgICB0aGlzLmNyZWF0aXZlQ29udGVudC5zZXQoaW5kZXgsIG5ldyBDcmVhdGl2ZUl0ZW0odHlwZSwgYXV4aWxsYXJ5KSk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhIGNyZWF0aXZlIGl0ZW0gZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY3JlYXRpdmUgaXRlbSB0byB1bnJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJDcmVhdGl2ZUNvbnRlbnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRpdmVDb250ZW50LmRlbGV0ZShpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNyZWF0aXZlIGNvbnRlbnQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhckNyZWF0aXZlQ29udGVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0aXZlQ29udGVudC5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIGl0ZW0gdHJhaXQgdG8gdGhlIHBhbGV0dGUuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgaXRlbSB0cmFpdCB3YXMgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBJdGVtVHJhaXQpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSB0cmFpdCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4gICAgaWYgKHRoaXMudHJhaXRzLmhhcyh0cmFpdC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIGl0ZW0gdHJhaXQuXG4gICAgdGhpcy50cmFpdHMuc2V0KHRyYWl0LmlkZW50aWZpZXIsIHRyYWl0KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgaXRlbSB0eXBlcy5cbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHJhaXQudHlwZXMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdpc3RyeSBoYXMgdGhlIGl0ZW0gaWRlbnRpZmllci5cbiAgICAgIGlmICghdGhpcy5yZWdpc3RyeS5oYXModHlwZSkpXG4gICAgICAgIC8vIFNldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBpdGVtIGlkZW50aWZpZXIuXG4gICAgICAgIHRoaXMucmVnaXN0cnkuc2V0KHR5cGUsIFtdKTtcblxuICAgICAgLy8gR2V0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGl0ZW0gaWRlbnRpZmllci5cbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyeS5nZXQodHlwZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdpc3RyeSBleGlzdHMuXG4gICAgICBpZiAocmVnaXN0cnkpIHtcbiAgICAgICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHJlZ2lzdHJ5LlxuICAgICAgICByZWdpc3RyeS5wdXNoKHRyYWl0KTtcblxuICAgICAgICAvLyBTZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgaXRlbSBpZGVudGlmaWVyLlxuICAgICAgICB0aGlzLnJlZ2lzdHJ5LnNldCh0eXBlLCByZWdpc3RyeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGl0ZW0gdHJhaXQgd2FzIHJlZ2lzdGVyZWQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgaXRlbSB0cmFpdHMgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxUcmFpdHMoKTogQXJyYXk8dHlwZW9mIEl0ZW1UcmFpdD4ge1xuICAgIHJldHVybiBbLi4udGhpcy50cmFpdHMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gaXRlbSB0cmFpdCBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgaXRlbSB0cmFpdC5cbiAgICogQHJldHVybnMgVGhlIGl0ZW0gdHJhaXQgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRUcmFpdChpZGVudGlmaWVyOiBzdHJpbmcpOiB0eXBlb2YgSXRlbVRyYWl0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhaXRzLmdldChpZGVudGlmaWVyKSA/PyBudWxsO1xuICB9XG59XG5cbmV4cG9ydCB7IEl0ZW1QYWxldHRlIH07XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vdHJhaXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2J1bmRsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXF1aXBwYWJsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW5jaGFudGFibGVcIjtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgVHJhaXQgfSBmcm9tIFwiLi4vLi4vdHJhaXRcIjtcbmltcG9ydCB7IEl0ZW1Vc2VPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vc3RhY2tcIjtcblxuY2xhc3MgSXRlbVRyYWl0PFQgZXh0ZW5kcyBJdGVtSWRlbnRpZmllcj4gZXh0ZW5kcyBUcmFpdCB7XG4gIC8qKlxuICAgKiBUaGUgaXRlbSB0eXBlIGlkZW50aWZpZXJzIHRoYXQgdGhpcyB0cmFpdCBpcyBjb21wYXRpYmxlIHdpdGggYnkgZGVmYXVsdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEl0ZW1JZGVudGlmaWVyPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgaXRlbSBzdGFjayB0aGF0IHRoaXMgdHJhaXQgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbTogSXRlbVN0YWNrPFQ+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSBzdGFjayB0aGF0IHRoaXMgdHJhaXQgd2lsbCBiZSBhdHRhY2hlZCB0by5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihpdGVtOiBJdGVtU3RhY2s8VD4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaXRlbSA9IGl0ZW07XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgdHJhaXQgdG8gdGhlIGl0ZW0gc3RhY2tcbiAgICBpdGVtLmFkZFRyYWl0KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBpdGVtIGlzIHVzZWQgYnkgYSBwbGF5ZXIuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHVzZWQgdGhlIGl0ZW0uXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBpdGVtIHVzZS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgaXRlbSB1c2Ugd2FzIHN1Y2Nlc3NmdWw7IGRlZmF1bHQgaXMgdHJ1ZVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVc2U/KFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8SXRlbVVzZU9wdGlvbnM+XG4gICk6IGJvb2xlYW4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgaXRlbSBpcyBzdG9wcGVkIGJlaW5nIHVzZWQgYnkgYSBwbGF5ZXIuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHN0b3BwZWQgdXNpbmcgdGhlIGl0ZW0uXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBpdGVtIHVzZS5cbiAgICovXG4gIHB1YmxpYyBvblN0b3BVc2U/KFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8SXRlbVVzZU9wdGlvbnM+XG4gICk6IGJvb2xlYW4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgaXRlbSBpcyB1c2VkIGJ5IGEgcGxheWVyLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCB1c2VkIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgaXRlbSB1c2UuXG4gICAqL1xuICBwdWJsaWMgb25Vc2U/KFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8SXRlbVVzZU9wdGlvbnM+XG4gICk6IGJvb2xlYW4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udGFpbmVyIHRoYXQgdGhlIGl0ZW0gaXMgc3RvcmVkIGluIGlzIG9wZW5lZC5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgb3BlbmVkIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgb25Db250YWluZXJPcGVuPyhwbGF5ZXI6IFBsYXllcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBjb250YWluZXIgdGhhdCB0aGUgaXRlbSBpcyBzdG9yZWQgaW4gaXMgY2xvc2VkLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBjbG9zZWQgdGhlIGNvbnRhaW5lclxuICAgKi9cbiAgcHVibGljIG9uQ29udGFpbmVyQ2xvc2U/KHBsYXllcjogUGxheWVyKTogdm9pZDtcblxuICAvKipcbiAgICogQ29tcGFyZXMgYW5vdGhlciBpdGVtIHRyYWl0IHRvIHRoaXMgb25lLlxuICAgKiBAcGFyYW0gb3RoZXIgVGhlIG90aGVyIGl0ZW0gdHJhaXQgdG8gY29tcGFyZS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgaXRlbSB0cmFpdHMgYXJlIGVxdWFsLlxuICAgKi9cbiAgcHVibGljIGVxdWFscyhvdGhlcjogSXRlbVRyYWl0PFQ+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpZmllciA9PT0gb3RoZXIuaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZXMgdGhlIGl0ZW0gdHJhaXQgdG8gYW5vdGhlciBpdGVtIHN0YWNrLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSBzdGFjayB0byBjbG9uZSB0aGUgY29tcG9uZW50IHRvLlxuICAgKiBAcmV0dXJucyBBIG5ldyBpdGVtIHRyYWl0LlxuICAgKi9cbiAgcHVibGljIGNsb25lKGl0ZW06IEl0ZW1TdGFjazxUPik6IHRoaXMge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdHJhaXRcbiAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgKHRoaXMuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIGl0ZW06IEl0ZW1TdGFjazxUPixcbiAgICAgIGlkZW50aWZpZXI6IHN0cmluZ1xuICAgICkgPT4gSXRlbVRyYWl0PFQ+KShpdGVtLCB0aGlzLmlkZW50aWZpZXIpIGFzIHRoaXM7XG5cbiAgICAvLyBDb3B5IHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcykpIHtcbiAgICAgIC8vIFNraXAgdGhlIGl0ZW0uXG4gICAgICBpZiAoa2V5ID09PSBcIml0ZW1cIikgY29udGludWU7XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgIGNvbXBvbmVudFtrZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSB0cmFpdFxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgSXRlbVRyYWl0IH07XG4iLCAiaW1wb3J0IHsgSW50VGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuaW1wb3J0IHtcbiAgQ29udGFpbmVySWQsXG4gIENvbnRhaW5lck5hbWUsXG4gIENvbnRhaW5lclR5cGUsXG4gIEZ1bGxDb250YWluZXJOYW1lLFxuICBJbnZlbnRvcnlDb250ZW50UGFja2V0LFxuICBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvclxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgSXRlbUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9zdGFja1wiO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4uLy4uL2NvbnRhaW5lclwiO1xuXG5pbXBvcnQgeyBJdGVtVHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5jbGFzcyBJdGVtQnVuZGxlVHJhaXQ8VCBleHRlbmRzIEl0ZW1JZGVudGlmaWVyPiBleHRlbmRzIEl0ZW1UcmFpdDxUPiB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiZHluYW1pY19jb250YWluZXJcIjtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW1xuICAgIEl0ZW1JZGVudGlmaWVyLkJ1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5CbHVlQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLkJsYWNrQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLkJyb3duQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLkN5YW5CdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuR3JheUJ1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5HcmVlbkJ1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5MaWdodEJsdWVCdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuTGlnaHRHcmF5QnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLkxpbWVCdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuTWFnZW50YUJ1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5PcmFuZ2VCdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuUGlua0J1bmRsZSxcbiAgICBJdGVtSWRlbnRpZmllci5QdXJwbGVCdW5kbGUsXG4gICAgSXRlbUlkZW50aWZpZXIuUmVkQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLldoaXRlQnVuZGxlLFxuICAgIEl0ZW1JZGVudGlmaWVyLlllbGxvd0J1bmRsZVxuICBdO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lcjogQ29udGFpbmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihpdGVtOiBJdGVtU3RhY2s8VD4pIHtcbiAgICBzdXBlcihpdGVtKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGhhcyBhIGJ1bmRsZSBpZC5cbiAgICBpZiAoIWl0ZW0uY29tcG9uZW50cy5oYXMoXCJkeW5hbWljX2NvbnRhaW5lclwiKSkge1xuICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgYnVuZGxlIGlkLlxuICAgICAgY29uc3QgaWQgPSBNYXRoLmFicyhEYXRlLm5vdygpID4+IDQpICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMzIpO1xuXG4gICAgICAvLyBTZXQgdGhlIGJ1bmRsZSBpZCBjb21wb25lbnQgYW5kIG5idC5cbiAgICAgIGl0ZW0uY29tcG9uZW50cy5zZXQoXCJkeW5hbWljX2NvbnRhaW5lclwiLCBpZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbnQgdGFnIGZvciB0aGUgYnVuZGxlIGlkLlxuICAgICAgY29uc3QgdGFnID0gbmV3IEludFRhZyhcImJ1bmRsZV9pZFwiLCBpZCk7XG5cbiAgICAgIC8vIFNldCB0aGUgYnVuZGxlIGlkIG5idC5cbiAgICAgIGl0ZW0ubmJ0LnNldChcImJ1bmRsZV9pZFwiLCB0YWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBHZXQgdGhlIGJ1bmRsZSBpZC5cbiAgICAgIGNvbnN0IGlkID0gaXRlbS5jb21wb25lbnRzLmdldChcImR5bmFtaWNfY29udGFpbmVyXCIpIGFzIG51bWJlcjtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGludCB0YWcgZm9yIHRoZSBidW5kbGUgaWQuXG4gICAgICBjb25zdCB0YWcgPSBuZXcgSW50VGFnKFwiYnVuZGxlX2lkXCIsIGlkKTtcblxuICAgICAgLy8gU2V0IHRoZSBidW5kbGUgaWQgbmJ0LlxuICAgICAgaXRlbS5uYnQuc2V0KFwiYnVuZGxlX2lkXCIsIHRhZyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNvbnRhaW5lci5cbiAgICB0aGlzLmNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoXG4gICAgICBDb250YWluZXJUeXBlLk5vbmUsXG4gICAgICBDb250YWluZXJJZC5SZWdpc3RyeSxcbiAgICAgIDY0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYnVuZGxlIGlkIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBkeW5hbWljSWQoKTogbnVtYmVyIHtcbiAgICAvLyBSZXR1cm4gdGhlIGJ1bmRsZSBpZC5cbiAgICByZXR1cm4gKHRoaXMuaXRlbS5jb21wb25lbnRzLmdldChcImR5bmFtaWNfY29udGFpbmVyXCIpIGFzIG51bWJlcikgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBidW5kbGUgaWQgb2YgdGhlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgc2V0IGR5bmFtaWNJZChpZDogbnVtYmVyKSB7XG4gICAgLy8gU2V0IHRoZSBidW5kbGUgaWQuXG4gICAgdGhpcy5pdGVtLmNvbXBvbmVudHMuc2V0KFwiZHluYW1pY19jb250YWluZXJcIiwgaWQpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGludCB0YWcgZm9yIHRoZSBidW5kbGUgaWQuXG4gICAgY29uc3QgdGFnID0gbmV3IEludFRhZyhcImJ1bmRsZV9pZFwiLCBpZCk7XG5cbiAgICAvLyBTZXQgdGhlIGJ1bmRsZSBpZCBuYnQuXG4gICAgdGhpcy5pdGVtLm5idC5zZXQoXCJidW5kbGVfaWRcIiwgdGFnKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbnRhaW5lck9wZW4ocGxheWVyOiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBBZGQgdGhlIHBsYXllciB0byB0aGUgb2NjdXBhbnRzIG9mIHRoZSBjb250YWluZXIuXG4gICAgdGhpcy5jb250YWluZXIub2NjdXBhbnRzLmFkZChwbGF5ZXIpO1xuICB9XG5cbiAgcHVibGljIG9uQ29udGFpbmVyQ2xvc2UocGxheWVyOiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgdGhlIHBsYXllciBmcm9tIHRoZSBvY2N1cGFudHMgb2YgdGhlIGNvbnRhaW5lci5cbiAgICB0aGlzLmNvbnRhaW5lci5vY2N1cGFudHMuZGVsZXRlKHBsYXllcik7XG4gIH1cblxuICBwdWJsaWMgb25UaWNrKCk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgY3VycmVudCB0aWNrIG9mIHRoZSB3b3JsZC5cbiAgICBjb25zdCBjdXJyZW50VGljayA9IHRoaXMuaXRlbS53b3JsZC5jdXJyZW50VGljaztcblxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBubyBvY2N1cGFudHMgaW4gdGhlIGNvbnRhaW5lci5cbiAgICAvLyBBbmQgdGhlIGN1cnJlbnQgdGljayBpcyBkaXZpc2libGUgYnkgNS5cbiAgICBpZiAodGhpcy5jb250YWluZXIub2NjdXBhbnRzLnNpemUgPT09IDAgfHwgY3VycmVudFRpY2sgJSA1biAhPT0gMG4pIHJldHVybjtcblxuICAgIC8vIFNlbmQgdGhlIGl0ZW1zIGluIHRoZSBidW5kbGUgdG8gdGhlIHBsYXllci5cbiAgICAvLyBDcmVhdGUgYSBuZXcgSW52ZW50b3J5Q29udGVudFBhY2tldC5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgSW52ZW50b3J5Q29udGVudFBhY2tldCgpO1xuICAgIHBhY2tldC5jb250YWluZXJJZCA9IENvbnRhaW5lcklkLlJlZ2lzdHJ5O1xuICAgIHBhY2tldC5zdG9yYWdlSXRlbSA9IEl0ZW1TdGFjay50b05ldHdvcmtTdGFjayh0aGlzLml0ZW0pO1xuICAgIHBhY2tldC5mdWxsQ29udGFpbmVyTmFtZSA9IG5ldyBGdWxsQ29udGFpbmVyTmFtZShcbiAgICAgIENvbnRhaW5lck5hbWUuRHluYW1pYyxcbiAgICAgIHRoaXMuZHluYW1pY0lkXG4gICAgKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIGl0ZW1zIGluIHRoZSBidW5kbGUuXG4gICAgcGFja2V0Lml0ZW1zID0gW107XG5cbiAgICAvLyBQdXNoIHRoZSBpdGVtIHN0YWNrcyB0byB0aGUgcGFja2V0LlxuICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLmNvbnRhaW5lci5zdG9yYWdlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGFpbmVyLnNpemU7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBpdGVtIHN0YWNrIGZyb20gdGhlIGJ1bmRsZS5cbiAgICAgIGNvbnN0IHN0YWNrID0gaXRlbXNbaV07XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIHN0YWNrIGV4aXN0cy5cbiAgICAgIC8vIElmIG5vdCwgcHVzaCBhbiBlbXB0eSBpdGVtIHN0YWNrLlxuICAgICAgaWYgKCFzdGFjaykgcGFja2V0Lml0ZW1zLnB1c2gobmV3IE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yKDApKTtcbiAgICAgIC8vIFB1c2ggdGhlIGl0ZW0gc3RhY2sgdG8gdGhlIHBhY2tldC5cbiAgICAgIGVsc2UgcGFja2V0Lml0ZW1zLnB1c2goSXRlbVN0YWNrLnRvTmV0d29ya1N0YWNrKHN0YWNrKSk7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBvY2N1cGFudHMgb2YgdGhlIGNvbnRhaW5lci5cbiAgICBmb3IgKGNvbnN0IG9jY3VwYW50IG9mIHRoaXMuY29udGFpbmVyLm9jY3VwYW50cykgb2NjdXBhbnQuc2VuZChwYWNrZXQpO1xuICB9XG59XG5cbmV4cG9ydCB7IEl0ZW1CdW5kbGVUcmFpdCB9O1xuIiwgImltcG9ydCB7IENvbXBvdW5kVGFnLCBOQlRUYWcgfSBmcm9tIFwiQHNlcmVuaXR5anMvbmJ0XCI7XG5pbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9zdGFja1wiO1xuXG5jbGFzcyBJdGVtU3RhY2tOYnRNYXAgZXh0ZW5kcyBNYXA8c3RyaW5nLCBOQlRUYWc+IHtcbiAgLyoqXG4gICAqIFRoZSBpdGVtIHN0YWNrIHRoYXQgdGhlIG5idCBtYXAgaXMgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXRlbVN0YWNrOiBJdGVtU3RhY2s7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGl0ZW0gc3RhY2sgbmJ0IG1hcC5cbiAgICogQHBhcmFtIGl0ZW1TdGFjayBUaGUgaXRlbSBzdGFjayB0aGF0IHRoZSBuYnQgbWFwIHdpbGwgYmUgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoaXRlbVN0YWNrOiBJdGVtU3RhY2spIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaXRlbVN0YWNrID0gaXRlbVN0YWNrO1xuICB9XG5cbiAgcHVibGljIGdldDxUIGV4dGVuZHMgTkJUVGFnPihrZXk6IHN0cmluZyk6IFQge1xuICAgIHJldHVybiBzdXBlci5nZXQoa2V5KSBhcyBUO1xuICB9XG5cbiAgcHVibGljIGFkZCh2YWx1ZTogTkJUVGFnPHVua25vd24+KTogdGhpcyB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgc2V0IG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnNldCh2YWx1ZS5uYW1lLCB2YWx1ZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIG5idCBkYXRhIHdoZW4gYSBuZXcgdmFsdWUgaXMgYWRkZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IE5CVFRhZzx1bmtub3duPik6IHRoaXMge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIHNldCBtZXRob2RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIG5idCBkYXRhIHdoZW4gYSBuZXcgdmFsdWUgaXMgYWRkZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGRlbGV0ZSBtZXRob2RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5kZWxldGUoa2V5KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgbmJ0IGRhdGEgd2hlbiBhIHZhbHVlIGlzIHJlbW92ZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGNsZWFyIG1ldGhvZFxuICAgIHN1cGVyLmNsZWFyKCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIG5idCBkYXRhIHdoZW4gdGhlIG1hcCBpcyBjbGVhcmVkXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgbmJ0IG1hcCB0byBhIGNvbXBvdW5kIHRhZy5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyB0b0NvbXBvdW5kKCk6IENvbXBvdW5kVGFnIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgY29tcG91bmQgdGFnXG4gICAgY29uc3Qgcm9vdCA9IG5ldyBDb21wb3VuZFRhZyhcIlwiKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbWFwXG4gICAgZm9yIChjb25zdCBbXywgdmFsdWVdIG9mIHRoaXMpIHtcbiAgICAgIC8vIEFkZCB0aGUgdGFnIHRvIHRoZSBjb21wb3VuZFxuICAgICAgcm9vdC5hZGRUYWcodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgY29tcG91bmRcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSB0YWdzIGZyb20gYSBjb21wb3VuZCB0byB0aGUgbWFwLlxuICAgKiBAcGFyYW0gcm9vdCBUaGUgY29tcG91bmQgdGFnIHRvIGFkZCB0aGUgdGFncyBmcm9tLlxuICAgKi9cbiAgcHVibGljIGZyb21Db21wb3VuZChyb290OiBDb21wb3VuZFRhZyk6IHZvaWQge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgdGFncyBpbiB0aGUgY29tcG91bmRcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiByb290LmdldFRhZ3MoKSkge1xuICAgICAgLy8gU2V0IHRoZSB0YWcgaW4gdGhlIG1hcFxuICAgICAgdGhpcy5zZXQodGFnLm5hbWUsIHRhZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZSgpOiBCdWZmZXIge1xuICAgIC8vIEdldCB0aGUgY29tcG91bmQgdGFnIGZyb20gdGhlIG1hcFxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnRvQ29tcG91bmQoKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gdG8gd3JpdGUgdGhlIGRhdGFcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgY29tcG91bmQgdGFnIHRvIHRoZSBzdHJlYW1cbiAgICBDb21wb3VuZFRhZy53cml0ZShzdHJlYW0sIHJvb3QpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBidWZmZXJcbiAgICByZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcigpO1xuICB9XG5cbiAgcHVibGljIGRlc2VyaWFsaXplKGJ1ZmZlcjogQnVmZmVyKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSB0byByZWFkIHRoZSBkYXRhXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgLy8gUmVhZCB0aGUgY29tcG91bmQgdGFnIGZyb20gdGhlIHN0cmVhbVxuICAgIGNvbnN0IHJvb3QgPSBDb21wb3VuZFRhZy5yZWFkKHN0cmVhbSk7XG5cbiAgICAvLyBBZGQgdGhlIHRhZ3MgZnJvbSB0aGUgY29tcG91bmQgdG8gdGhlIG1hcFxuICAgIHRoaXMuZnJvbUNvbXBvdW5kKHJvb3QpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyBpbiBhIGNvbnRhaW5lci5cbiAgICBpZiAoIXRoaXMuaXRlbVN0YWNrLmNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgLy8gR2V0IHRoZSBzbG90IG9mIHRoZSBpdGVtIGluIHRoZSBjb250YWluZXIuXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuaXRlbVN0YWNrLmNvbnRhaW5lci5zdG9yYWdlLmluZGV4T2YodGhpcy5pdGVtU3RhY2spO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgMCBvciBsZXNzLlxuICAgIGlmICh0aGlzLml0ZW1TdGFjay5hbW91bnQgPD0gMCkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIGNvbnRhaW5lci5cbiAgICAgIHRoaXMuaXRlbVN0YWNrLmNvbnRhaW5lci5jbGVhclNsb3Qoc2xvdCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBpdGVtIGluIHRoZSBjb250YWluZXIuXG4gICAgZWxzZSB0aGlzLml0ZW1TdGFjay5jb250YWluZXIuc2V0SXRlbShzbG90LCB0aGlzLml0ZW1TdGFjayk7XG4gIH1cbn1cblxuZXhwb3J0IHsgSXRlbVN0YWNrTmJ0TWFwIH07XG4iLCAiaW1wb3J0IHtcbiAgTmV0d29ya0l0ZW1JbnN0YW5jZURlc2NyaXB0b3IsXG4gIE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi4vY29udGFpbmVyXCI7XG5pbXBvcnQgeyBJdGVtSWRlbnRpZmllciB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHtcbiAgSXRlbXMsXG4gIEl0ZW1TdGFja0VudHJ5LFxuICBJdGVtU3RhY2tQcm9wZXJ0aWVzLFxuICBJdGVtVXNlT3B0aW9ucyxcbiAgSlNPTkxpa2VWYWx1ZVxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIi4uL3dvcmxkXCI7XG5cbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSBcIi4vaWRlbnRpdHlcIjtcbmltcG9ydCB7IEl0ZW1UcmFpdCB9IGZyb20gXCIuL3RyYWl0c1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrTmJ0TWFwIH0gZnJvbSBcIi4vbWFwc1wiO1xuXG5jb25zdCBEZWZhdWx0SXRlbVN0YWNrUHJvcGVydGllczogSXRlbVN0YWNrUHJvcGVydGllcyA9IHtcbiAgYW1vdW50OiAxLFxuICBhdXhpbGxhcnk6IDBcbn07XG5cbmNsYXNzIEl0ZW1TdGFjazxUIGV4dGVuZHMga2V5b2YgSXRlbXMgPSBrZXlvZiBJdGVtcz4ge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogSXRlbVR5cGU8VD47XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnRzIG9mIHRoZSBpdGVtIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudHMgPSBuZXcgTWFwPHN0cmluZywgSlNPTkxpa2VWYWx1ZT4oKTtcblxuICAvKipcbiAgICogVGhlIHRyYWl0cyBvZiB0aGUgaXRlbSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHMgPSBuZXcgTWFwPHN0cmluZywgSXRlbVRyYWl0PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgbmJ0IGRhdGEgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmJ0ID0gbmV3IEl0ZW1TdGFja05idE1hcCh0aGlzKTtcblxuICAvKipcbiAgICogSWYgdGhlIGl0ZW0gc3RhY2sgaXMgc3RhY2thYmxlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWNrYWJsZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gc3RhY2sgc2l6ZSBvZiB0aGUgaXRlbSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYXhBbW91bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHdvcmxkIHRoZSBpdGVtIHN0YWNrIGlzIGluLlxuICAgKi9cbiAgcHVibGljIHdvcmxkITogV29ybGQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIgdGhlIGl0ZW0gc3RhY2sgaXMgaW4uXG4gICAqIElmIHRoZSBpdGVtIHN0YWNrIGlzIG5vdCBpbiBhIGNvbnRhaW5lciwgdGhpcyB3aWxsIGJlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgY29udGFpbmVyOiBDb250YWluZXIgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiB0aGUgaXRlbSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhbW91bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGF1eGlsbGFyeSBkYXRhIG9mIHRoZSBpdGVtIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGF1eGlsbGFyeTogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBUIHwgSXRlbUlkZW50aWZpZXIgfCBJdGVtVHlwZTxUPixcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxJdGVtU3RhY2tQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBBc3NpZ24gdGhlIHR5cGUgb2YgdGhlIGl0ZW0gc3RhY2tcbiAgICB0aGlzLnR5cGUgPVxuICAgICAgaWRlbnRpZmllciBpbnN0YW5jZW9mIEl0ZW1UeXBlXG4gICAgICAgID8gaWRlbnRpZmllclxuICAgICAgICA6IChJdGVtVHlwZS5nZXQoaWRlbnRpZmllciBhcyBUKSBhcyBJdGVtVHlwZTxUPik7IC8vIFRPRE86IEZpeCB0aGlzLCBmZXRjaCBmcm9tIHBhbGV0dGVcblxuICAgIC8vIFNwcmVhZCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIGFuZCB0aGUgcHJvdmlkZWQgcHJvcGVydGllc1xuICAgIGNvbnN0IHByb3BzID0geyAuLi5EZWZhdWx0SXRlbVN0YWNrUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gQXNzaWduIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBpdGVtIHN0YWNrXG4gICAgdGhpcy5hbW91bnQgPSBwcm9wcy5hbW91bnQ7XG4gICAgdGhpcy5hdXhpbGxhcnkgPSBwcm9wcy5hdXhpbGxhcnk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHN0YWNrYWJsZSBhbmQgbWF4IGFtb3VudCBwcm9wZXJ0aWVzXG4gICAgdGhpcy5zdGFja2FibGUgPSB0aGlzLnR5cGUuc3RhY2thYmxlO1xuICAgIHRoaXMubWF4QW1vdW50ID0gdGhpcy50eXBlLm1heEFtb3VudDtcblxuICAgIC8vIENoZWNrIGlmIGEgd29ybGQgd2FzIHByb3ZpZGVkXG4gICAgaWYgKHByb3BzLndvcmxkKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHdvcmxkIHRvIHRoZSBpdGVtIHN0YWNrXG4gICAgICB0aGlzLndvcmxkID0gcHJvcHMud29ybGQ7XG5cbiAgICAgIC8vIENoZWNrIGlmIGEgZW50cnkgd2FzIHByb3ZpZGVkXG4gICAgICBpZiAocHJvcHMuZW50cnkpXG4gICAgICAgIC8vIExvYWQgdGhlIGRhdGEgZW50cnkgZm9yIHRoZSBpdGVtIHN0YWNrXG4gICAgICAgIHRoaXMubG9hZERhdGFFbnRyeShwcm9wcy53b3JsZCwgcHJvcHMuZW50cnkpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBpdGVtIHN0YWNrXG4gICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGl0ZW0gc3RhY2suXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHRyYWl0cyBmb3IgdGhlIGl0ZW1zdGFja1xuICAgIGNvbnN0IHRyYWl0cyA9IHRoaXMud29ybGQuaXRlbVBhbGV0dGUuZ2V0UmVnaXN0cnkodGhpcy50eXBlLmlkZW50aWZpZXIpO1xuXG4gICAgLy8gUmVnaXN0ZXIgdGhlIHRyYWl0cyB0byB0aGUgaXRlbXN0YWNrXG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiB0cmFpdHMpIGlmICghdGhpcy5oYXNUcmFpdCh0cmFpdCkpIHRoaXMuYWRkVHJhaXQodHJhaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGl0ZW0gc3RhY2sgaW4gdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGUoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgaW4gYSBjb250YWluZXIuXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgLy8gR2V0IHRoZSBzbG90IG9mIHRoZSBpdGVtIGluIHRoZSBjb250YWluZXIuXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuY29udGFpbmVyLnN0b3JhZ2UuaW5kZXhPZih0aGlzKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIDAgb3IgbGVzcy5cbiAgICBpZiAodGhpcy5hbW91bnQgPD0gMCkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIGNvbnRhaW5lci5cbiAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFyU2xvdChzbG90KTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGl0ZW0gaW4gdGhlIGNvbnRhaW5lci5cbiAgICBlbHNlIHRoaXMuY29udGFpbmVyLnNldEl0ZW0oc2xvdCwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBhbW91bnQgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBzZXQuXG4gICAqL1xuICBwdWJsaWMgc2V0QW1vdW50KGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSBhbW91bnQgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAgdGhpcy5hbW91bnQgPSBhbW91bnQ7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGl0ZW0gaW4gdGhlIGNvbnRhaW5lci5cbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY3JlbWVudHMgdGhlIGFtb3VudCBvZiB0aGUgaXRlbSBzdGFjay5cbiAgICogQHBhcmFtIGFtb3VudCBUaGUgYW1vdW50IHRvIGRlY3JlbWVudC5cbiAgICovXG4gIHB1YmxpYyBkZWNyZW1lbnQoYW1vdW50PzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXRBbW91bnQodGhpcy5hbW91bnQgLSAoYW1vdW50ID8/IDEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnRzIHRoZSBhbW91bnQgb2YgdGhlIGl0ZW0gc3RhY2suXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBpbmNyZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgaW5jcmVtZW50KGFtb3VudD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2V0QW1vdW50KHRoaXMuYW1vdW50ICsgKGFtb3VudCA/PyAxKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2F1c2VzIGEgcGxheWVyIHRvIHVzZSB0aGUgaXRlbSBzdGFjay5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHVzaW5nIHRoZSBpdGVtLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBmb3IgdGhlIGl0ZW0gdXNlLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBpdGVtIHVzZSB3YXMgc3VjY2Vzc2Z1bDsgZGVmYXVsdCBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIHVzZShwbGF5ZXI6IFBsYXllciwgb3B0aW9uczogUGFydGlhbDxJdGVtVXNlT3B0aW9ucz4pOiBib29sZWFuIHtcbiAgICAvLyBUcmlnZ2VyIHRoZSBpdGVtIG9uVXNlIHRyYWl0IGV2ZW50XG4gICAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiB0aGlzLnRyYWl0cy52YWx1ZXMoKSkge1xuICAgICAgLy8gU2V0IHRoZSBjYW5jZWxlZCBmbGFnIGluIHRoZSBvcHRpb25zXG4gICAgICBvcHRpb25zLmNhbmNlbGVkID0gY2FuY2VsZWQ7XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gdHJpZ2dlciB0aGUgb25Vc2UgdHJhaXQgZXZlbnRcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBicmVhayB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgICBjb25zdCBzdWNjZXNzID0gdHJhaXQub25Vc2U/LihwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLCBjb250aW51ZVxuICAgICAgICAvLyBBcyB0aGUgdHJhaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtZXRob2RcbiAgICAgICAgaWYgKHN1Y2Nlc3MgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBmYWxzZSwgY2FuY2VsIHRoZSBicmVha1xuICAgICAgICBjYW5jZWxlZCA9ICFzdWNjZXNzO1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGVcbiAgICAgICAgcGxheWVyXG4gICAgICAgICAgLmdldFdvcmxkKClcbiAgICAgICAgICAuc2VyZW5pdHkubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byB0cmlnZ2VyIG9uVXNlIHRyYWl0IGV2ZW50IGZvciBpdGVtIFwiJHt0aGlzLnR5cGUuaWRlbnRpZmllcn1cIiBpbiBkaW1lbnNpb24gXCIke3BsYXllci5kaW1lbnNpb24uaWRlbnRpZmllcn1cImAsXG4gICAgICAgICAgICByZWFzb25cbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgaXRlbVxuICAgICAgICB0aGlzLnRyYWl0cy5kZWxldGUodHJhaXQuaWRlbnRpZmllcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHdoZXRoZXIgdGhlIGl0ZW0gdXNlIHdhcyBjYW5jZWxlZFxuICAgIHJldHVybiAhY2FuY2VsZWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaXRlbXN0YWNrIGhhcyB0aGUgc3BlY2lmaWVkIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIGNoZWNrIGZvclxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBpdGVtc3RhY2sgaGFzIHRoZSB0cmFpdFxuICAgKi9cbiAgcHVibGljIGhhc1RyYWl0KHRyYWl0OiBzdHJpbmcgfCB0eXBlb2YgSXRlbVRyYWl0PFQ+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJhaXRzLmhhcyhcbiAgICAgIHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHRyYWl0IGZyb20gdGhlIGl0ZW1zdGFjay5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBnZXQgZnJvbSB0aGUgaXRlbXN0YWNrXG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhaXQ8SyBleHRlbmRzIHR5cGVvZiBJdGVtVHJhaXQ8VD4+KHRyYWl0OiBLKTogSW5zdGFuY2VUeXBlPEs+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgdHJhaXQgZnJvbSB0aGUgaXRlbXN0YWNrLlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIHRyYWl0IHRvIGdldCBmcm9tIHRoZSBpdGVtc3RhY2tcbiAgICogQHJldHVybnMgVGhlIHRyYWl0IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIG51bGxcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFpdCh0cmFpdDogc3RyaW5nKTogSXRlbVRyYWl0PFQ+IHwgbnVsbDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc3BlY2lmaWVkIHRyYWl0IGZyb20gdGhlIGl0ZW1zdGFjay5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSB0cmFpdCB0byBnZXQgZnJvbSB0aGUgaXRlbXN0YWNrXG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBudWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhaXQodHJhaXQ6IHN0cmluZyB8IHR5cGVvZiBJdGVtVHJhaXQ8VD4pOiBJdGVtVHJhaXQ8VD4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50cmFpdHMuZ2V0KFxuICAgICAgdHlwZW9mIHRyYWl0ID09PSBcInN0cmluZ1wiID8gdHJhaXQgOiB0cmFpdC5pZGVudGlmaWVyXG4gICAgKSBhcyBJdGVtVHJhaXQ8VD4gfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCB0cmFpdCBmcm9tIHRoZSBpdGVtc3RhY2suXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVHJhaXQodHJhaXQ6IHN0cmluZyB8IHR5cGVvZiBJdGVtVHJhaXQ8VD4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHRyYWl0IGZyb20gdGhlIGl0ZW1zdGFja1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy50cmFpdHMuZ2V0KFxuICAgICAgdHlwZW9mIHRyYWl0ID09PSBcInN0cmluZ1wiID8gdHJhaXQgOiB0cmFpdC5pZGVudGlmaWVyXG4gICAgKTtcblxuICAgIC8vIENhbGwgdGhlIG9uUmVtb3ZlIHRyYWl0IGV2ZW50XG4gICAgaW5zdGFuY2U/Lm9uUmVtb3ZlPy4oKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgaXRlbXN0YWNrXG4gICAgdGhpcy50cmFpdHMuZGVsZXRlKHR5cGVvZiB0cmFpdCA9PT0gXCJzdHJpbmdcIiA/IHRyYWl0IDogdHJhaXQuaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRyYWl0IHRvIHRoZSBpdGVtc3RhY2suXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gYWRkXG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCB0aGF0IHdhcyBhZGRlZFxuICAgKi9cbiAgcHVibGljIGFkZFRyYWl0PEsgZXh0ZW5kcyB0eXBlb2YgSXRlbVRyYWl0PFQ+PihcbiAgICB0cmFpdDogSyB8IEl0ZW1UcmFpdDxUPlxuICApOiBJbnN0YW5jZVR5cGU8Sz4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBhbHJlYWR5IGV4aXN0c1xuICAgIGlmICh0aGlzLnRyYWl0cy5oYXModHJhaXQuaWRlbnRpZmllcikpXG4gICAgICByZXR1cm4gdGhpcy5nZXRUcmFpdCh0cmFpdC5pZGVudGlmaWVyKSBhcyBJbnN0YW5jZVR5cGU8Sz47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdHJhaXQgaXMgaW4gdGhlIHBhbGV0dGVcbiAgICBpZiAodGhpcy53b3JsZCAmJiAhdGhpcy53b3JsZC5pdGVtUGFsZXR0ZS50cmFpdHMuaGFzKHRyYWl0LmlkZW50aWZpZXIpKVxuICAgICAgdGhpcy53b3JsZC5sb2dnZXIud2FybihcbiAgICAgICAgYFRyYWl0IFwiwqdjJHt0cmFpdC5pZGVudGlmaWVyfcKnclwiIHdhcyBhZGRlZCB0byBpdGVtc3RhY2sgXCLCp2Qke3RoaXMudHlwZS5pZGVudGlmaWVyfcKnclwiIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcGFsZXR0ZS4gVGhpcyBtYXkgcmVzdWx0IGluIGEgZGVzZXJpbGl6YXRpb24gZXJyb3IuYFxuICAgICAgKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gYWRkIHRoZSB0cmFpdCB0byB0aGUgaXRlbXN0YWNrXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBpcyBhbiBpbnN0YW5jZSBvZiBJdGVtVHJhaXRcbiAgICAgIGlmICh0cmFpdCBpbnN0YW5jZW9mIEl0ZW1UcmFpdCkge1xuICAgICAgICAvLyBBZGQgdGhlIHRyYWl0IHRvIHRoZSBpdGVtc3RhY2tcbiAgICAgICAgdGhpcy50cmFpdHMuc2V0KHRyYWl0LmlkZW50aWZpZXIsIHRyYWl0KTtcblxuICAgICAgICAvLyBDYWxsIHRoZSBvbkFkZCB0cmFpdCBldmVudFxuICAgICAgICB0cmFpdC5vbkFkZD8uKCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB0cmFpdCB0aGF0IHdhcyBhZGRlZFxuICAgICAgICByZXR1cm4gdHJhaXQgYXMgSW5zdGFuY2VUeXBlPEs+O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0cmFpdFxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0cmFpdCh0aGlzKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHRyYWl0IHRvIHRoZSBpdGVtc3RhY2tcbiAgICAgICAgdGhpcy50cmFpdHMuc2V0KGluc3RhbmNlLmlkZW50aWZpZXIsIGluc3RhbmNlKTtcblxuICAgICAgICAvLyBDYWxsIHRoZSBvbkFkZCB0cmFpdCBldmVudFxuICAgICAgICBpbnN0YW5jZS5vbkFkZD8uKCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB0cmFpdCB0aGF0IHdhcyBhZGRlZFxuICAgICAgICByZXR1cm4gaW5zdGFuY2UgYXMgSW5zdGFuY2VUeXBlPEs+O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvciB0byB0aGUgY29uc29sZVxuICAgICAgdGhpcy53b3JsZC5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gYWRkIHRyYWl0IFwiJHt0cmFpdC5pZGVudGlmaWVyfVwiIHRvIGl0ZW1zdGFjayBcIiR7dGhpcy50eXBlLmlkZW50aWZpZXJ9XCJgLFxuICAgICAgICByZWFzb25cbiAgICAgICk7XG5cbiAgICAgIC8vIFJldHVybiBudWxsIGFzIHRoZSB0cmFpdCB3YXMgbm90IGFkZGVkXG4gICAgICByZXR1cm4gbnVsbCBhcyBJbnN0YW5jZVR5cGU8Sz47XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVxdWFscyhvdGhlcjogSXRlbVN0YWNrKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGlkZW50aWZpZXJzICYgYXV4IGFyZSBlcXVhbC5cbiAgICBpZiAodGhpcy50eXBlLmlkZW50aWZpZXIgIT09IG90aGVyLnR5cGUuaWRlbnRpZmllcikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmF1eGlsbGFyeSAhPT0gb3RoZXIuYXV4aWxsYXJ5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50cy5zaXplICE9PSBvdGhlci5jb21wb25lbnRzLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy50cmFpdHMuc2l6ZSAhPT0gb3RoZXIudHJhaXRzLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5uYnQuc2l6ZSAhPT0gb3RoZXIubmJ0LnNpemUpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFN0cmluZ2lmeSB0aGUgY29tcG9uZW50cy5cbiAgICBjb25zdCBjb21wb25lbnRzID0gSlNPTi5zdHJpbmdpZnkoWy4uLnRoaXMuY29tcG9uZW50cy5lbnRyaWVzKCldKTtcbiAgICBjb25zdCBvdGhlckNvbXBvbmVudHMgPSBKU09OLnN0cmluZ2lmeShbLi4ub3RoZXIuY29tcG9uZW50cy5lbnRyaWVzKCldKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjb21wb25lbnRzIGFyZSBlcXVhbC5cbiAgICBpZiAoY29tcG9uZW50cyAhPT0gb3RoZXJDb21wb25lbnRzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIHRyYWl0cy5cbiAgICBmb3IgKGNvbnN0IFtpZGVudGlmaWVyLCB0cmFpdF0gb2YgdGhpcy50cmFpdHMpIHtcbiAgICAgIC8vIEdldCB0aGUgb3RoZXIgdHJhaXQuXG4gICAgICBjb25zdCBvdGhlclRyYWl0ID0gb3RoZXIudHJhaXRzLmdldChpZGVudGlmaWVyKSBhcyBJdGVtVHJhaXQ8VD47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBvdGhlciB0cmFpdCBleGlzdHMuXG4gICAgICBpZiAoIW90aGVyVHJhaXQpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRyYWl0cyBhcmUgZXF1YWwuXG4gICAgICBpZiAoIXRyYWl0LmVxdWFscyhvdGhlclRyYWl0KSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbmJ0LlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMubmJ0KSB7XG4gICAgICAvLyBHZXQgdGhlIG90aGVyIHZhbHVlLlxuICAgICAgY29uc3Qgb3RoZXJWYWx1ZSA9IG90aGVyLm5idC5nZXQoa2V5KTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG90aGVyIHZhbHVlIGV4aXN0cy5cbiAgICAgIGlmICghb3RoZXJWYWx1ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBHZXQgdGhlIHNuYnQgdmFsdWVzIG9mIHRoZSBuYnQuXG4gICAgICBjb25zdCBzbmJ0ID0gdmFsdWUudmFsdWVPZih0cnVlKSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBvdGhlclNuYnQgPSBvdGhlclZhbHVlLnZhbHVlT2YodHJ1ZSkgYXMgc3RyaW5nO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgbmJ0IHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICBpZiAoc25idCAhPT0gb3RoZXJTbmJ0KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGl0ZW0gc3RhY2tzIGFyZSBlcXVhbC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkYXRhIGVudHJ5IGZvciB0aGUgaXRlbSBzdGFjay5cbiAgICogQHJldHVybnMgVGhlIGRhdGEgZW50cnkgZm9yIHRoZSBpdGVtIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGdldERhdGFFbnRyeSgpOiBJdGVtU3RhY2tFbnRyeSB7XG4gICAgLy8gQ3JlYXRlIHRoZSBpdGVtIHN0YWNrIGVudHJ5LlxuICAgIGNvbnN0IGVudHJ5OiBJdGVtU3RhY2tFbnRyeSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMudHlwZS5pZGVudGlmaWVyLFxuICAgICAgYW1vdW50OiB0aGlzLmFtb3VudCxcbiAgICAgIGF1eGlsbGFyeTogdGhpcy5hdXhpbGxhcnksXG4gICAgICBjb21wb25lbnRzOiBbLi4udGhpcy5jb21wb25lbnRzLmVudHJpZXMoKV0sXG4gICAgICB0cmFpdHM6IFsuLi50aGlzLnRyYWl0cy5rZXlzKCldLFxuICAgICAgbmJ0OiB0aGlzLm5idC5zZXJpYWxpemUoKS50b1N0cmluZyhcImJhc2U2NFwiKVxuICAgIH07XG5cbiAgICAvLyBSZXR1cm4gdGhlIGl0ZW0gc3RhY2sgZW50cnkuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBkYXRhIGVudHJ5IGZvciB0aGUgaXRlbSBzdGFjay5cbiAgICogQHBhcmFtIHdvcmxkIFRoZSB3b3JsZCB0byBsb2FkIHRoZSBpdGVtIHN0YWNrIGluLlxuICAgKiBAcGFyYW0gZW50cnkgVGhlIGl0ZW0gc3RhY2sgZW50cnkgdG8gbG9hZC5cbiAgICogQHBhcmFtIG92ZXJ3cml0ZSBXaGV0aGVyIHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZGF0YS5cbiAgICovXG4gIHB1YmxpYyBsb2FkRGF0YUVudHJ5KFxuICAgIHdvcmxkOiBXb3JsZCxcbiAgICBlbnRyeTogSXRlbVN0YWNrRW50cnksXG4gICAgb3ZlcndyaXRlID0gdHJ1ZVxuICApOiB2b2lkIHtcbiAgICAvLyBDaGVjayB0aGF0IHRoZSBpZGVudGlmaWVycyBtYXRjaC5cbiAgICBpZiAoZW50cnkuaWRlbnRpZmllciAhPT0gdGhpcy50eXBlLmlkZW50aWZpZXIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgaXRlbXN0YWNrIGVudHJ5IGFzIHRoZSB0eXBlIGlkZW50aWZpZXIgZG9lcyBub3QgbWF0Y2ghXCJcbiAgICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50cnkgc2hvdWxkIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZGF0YS5cbiAgICBpZiAob3ZlcndyaXRlKSB7XG4gICAgICAvLyBDbGVhciB0aGUgY29tcG9uZW50cyBhbmQgdHJhaXRzLlxuICAgICAgdGhpcy5jb21wb25lbnRzLmNsZWFyKCk7XG4gICAgICB0aGlzLnRyYWl0cy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgaXRlbSBzdGFjayBwcm9wZXJ0aWVzLlxuICAgIHRoaXMuYW1vdW50ID0gZW50cnkuYW1vdW50O1xuICAgIHRoaXMuYXV4aWxsYXJ5ID0gZW50cnkuYXV4aWxsYXJ5O1xuXG4gICAgLy8gQWRkIHRoZSBjb21wb25lbnRzIHRvIHRoZSBzdGFjaywgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJ5LmNvbXBvbmVudHMpIHtcbiAgICAgIGlmICghdGhpcy5jb21wb25lbnRzLmhhcyhrZXkpKSB0aGlzLmNvbXBvbmVudHMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgdHJhaXRzIHRvIHRoZSBpdGVtc3RhY2ssIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIGVudHJ5LnRyYWl0cykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhbGV0dGUgaGFzIHRoZSB0cmFpdFxuICAgICAgY29uc3QgdHJhaXRUeXBlID0gd29ybGQuaXRlbVBhbGV0dGUudHJhaXRzLmdldCh0cmFpdCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBleGlzdHMgaW4gdGhlIHBhbGV0dGVcbiAgICAgIGlmICghdHJhaXRUeXBlKSB7XG4gICAgICAgIHdvcmxkLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgdHJhaXQgXCIke3RyYWl0fVwiIGZvciBpdGVtc3RhY2sgXCIke3RoaXMudHlwZS5pZGVudGlmaWVyfVwiIGFzIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBwYWxldHRlYFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRlbXB0IHRvIGFkZCB0aGUgdHJhaXQgdG8gdGhlIGl0ZW1zdGFja1xuICAgICAgdGhpcy5hZGRUcmFpdCh0cmFpdFR5cGUpO1xuICAgIH1cblxuICAgIC8vIERlc2VyaWFsaXplIHRoZSBuYnQgZGF0YS5cbiAgICB0aGlzLm5idC5kZXNlcmlhbGl6ZShCdWZmZXIuZnJvbShlbnRyeS5uYnQsIFwiYmFzZTY0XCIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgaXRlbSBzdGFjayB0byBhIG5ldHdvcmsgaXRlbSBpbnN0YW5jZSBkZXNjcmlwdG9yLlxuICAgKiBXaGljaCBpcyB1c2VkIG9uIHRoZSBwcm90b2NvbCBsZXZlbC5cbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gc3RhY2sgdG8gY29udmVydC5cbiAgICogQHJldHVybnMgVGhlIG5ldHdvcmsgaXRlbSBpbnN0YW5jZSBkZXNjcmlwdG9yLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0b05ldHdvcmtJbnN0YW5jZShcbiAgICBpdGVtOiBJdGVtU3RhY2tcbiAgKTogTmV0d29ya0l0ZW1JbnN0YW5jZURlc2NyaXB0b3Ige1xuICAgIC8vIEdldCB0aGUgcGVybXV0YXRpb24gb2YgdGhlIGJsb2NrLlxuICAgIGNvbnN0IHBlcm11dGF0aW9uID0gaXRlbS50eXBlLmJsb2NrPy5wZXJtdXRhdGlvbnNbaXRlbS5hdXhpbGxhcnldO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBpdGVtIGluc3RhbmNlIGRlc2NyaXB0b3IuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5ldHdvcms6IGl0ZW0udHlwZS5uZXR3b3JrLFxuICAgICAgc3RhY2tTaXplOiBpdGVtLmFtb3VudCxcbiAgICAgIG1ldGFkYXRhOiBpdGVtLmF1eGlsbGFyeSxcbiAgICAgIG5ldHdvcmtCbG9ja0lkOiBwZXJtdXRhdGlvbj8ubmV0d29yayA/PyAwLFxuICAgICAgZXh0cmFzOiB7XG4gICAgICAgIG5idDogaXRlbS5uYnQudG9Db21wb3VuZCgpLFxuICAgICAgICBjYW5EZXN0cm95OiBbXSxcbiAgICAgICAgY2FuUGxhY2VPbjogW11cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBpdGVtIHN0YWNrIHRvIGEgbmV0d29yayBpdGVtIHN0YWNrIGRlc2NyaXB0b3IuXG4gICAqIFdoaWNoIGlzIHVzZWQgb24gdGhlIHByb3RvY29sIGxldmVsLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSBzdGFjayB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyBUaGUgbmV0d29yayBpdGVtIHN0YWNrIGRlc2NyaXB0b3IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRvTmV0d29ya1N0YWNrKGl0ZW06IEl0ZW1TdGFjayk6IE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yIHtcbiAgICAvLyBHZXQgbmV0d29yayBpdGVtIGluc3RhbmNlIGRlc2NyaXB0b3IuXG4gICAgY29uc3QgaW5zdGFuY2UgPSBJdGVtU3RhY2sudG9OZXR3b3JrSW5zdGFuY2UoaXRlbSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGl0ZW0gc3RhY2sgZGVzY3JpcHRvci5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5zdGFuY2UsXG4gICAgICBzdGFja05ldElkOiBudWxsIC8vIFRPRE86IEltcGxlbWVudCBzdGFja05ldElkLCB0aGlzIGlzIHNvIHRoYXQgdGhlIHNlcnZlciBjYW4gdHJhY2sgdGhlIGl0ZW0gc3RhY2suXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIG5ldHdvcmsgaXRlbSBpbnN0YW5jZSBkZXNjcmlwdG9yIHRvIGFuIGl0ZW0gc3RhY2suXG4gICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBuZXR3b3JrIGl0ZW0gaW5zdGFuY2UgZGVzY3JpcHRvci5cbiAgICogQHJldHVybnMgVGhlIGl0ZW0gc3RhY2suXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21OZXR3b3JrSW5zdGFuY2UoXG4gICAgZGVzY3JpcHRvcjogTmV0d29ya0l0ZW1JbnN0YW5jZURlc2NyaXB0b3JcbiAgKTogSXRlbVN0YWNrIHwgbnVsbCB7XG4gICAgLy8gR2V0IHRoZSBpdGVtIHR5cGUgZnJvbSB0aGUgbmV0d29yay5cbiAgICBjb25zdCB0eXBlID0gSXRlbVR5cGUuZ2V0QnlOZXR3b3JrKGRlc2NyaXB0b3IubmV0d29yayk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSB0eXBlIHdhcyBmb3VuZC5cbiAgICBpZiAoIXR5cGUpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBpdGVtIHN0YWNrLlxuICAgIGNvbnN0IGl0ZW0gPSBuZXcgdGhpcyh0eXBlLmlkZW50aWZpZXIsIHtcbiAgICAgIGFtb3VudDogZGVzY3JpcHRvci5zdGFja1NpemUgPz8gMSxcbiAgICAgIGF1eGlsbGFyeTogZGVzY3JpcHRvci5tZXRhZGF0YSA/PyAwXG4gICAgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGl0ZW0gc3RhY2suXG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cbn1cblxuZXhwb3J0IHsgSXRlbVN0YWNrLCBEZWZhdWx0SXRlbVN0YWNrUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7XG4gIEVxdWlwbWVudFNsb3QsXG4gIExldmVsU291bmRFdmVudCxcbiAgTGV2ZWxTb3VuZEV2ZW50UGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBJdGVtSWRlbnRpZmllciwgSXRlbVVzZU1ldGhvZCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHtcbiAgRW50aXR5RXF1aXBtZW50VHJhaXQsXG4gIEVudGl0eUludmVudG9yeVRyYWl0LFxuICBQbGF5ZXJcbn0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuaW1wb3J0IHsgSXRlbVVzZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgSXRlbVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgSXRlbUVxdWlwcGFibGVUcmFpdDxUIGV4dGVuZHMgSXRlbUlkZW50aWZpZXI+IGV4dGVuZHMgSXRlbVRyYWl0PFQ+IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJlcXVpcHBhYmxlXCI7XG4gIHB1YmxpYyBzbG90PzogRXF1aXBtZW50U2xvdCA9IEVxdWlwbWVudFNsb3QuQ2hlc3Q7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZXM6IEFycmF5PEl0ZW1JZGVudGlmaWVyPiA9IFtcbiAgICBJdGVtSWRlbnRpZmllci5EaWFtb25kQ2hlc3RwbGF0ZVxuICBdO1xuXG4gIHB1YmxpYyBvblVzZShcbiAgICBwbGF5ZXI6IFBsYXllcixcbiAgICBvcHRpb25zOiBQYXJ0aWFsPEl0ZW1Vc2VPcHRpb25zPlxuICApOiBib29sZWFuIHwgdm9pZCB7XG4gICAgaWYgKG9wdGlvbnMubWV0aG9kICE9IEl0ZW1Vc2VNZXRob2QuQ2xpY2sgfHwgdGhpcy5zbG90ID09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBwbGF5ZXJFcXVpcG1lbnQgPSBwbGF5ZXIuZ2V0VHJhaXQoRW50aXR5RXF1aXBtZW50VHJhaXQpO1xuXG4gICAgaWYgKCFwbGF5ZXJFcXVpcG1lbnQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBwbGF5ZXJJbnZlbnRvcnkgPSBwbGF5ZXIuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuICAgIGNvbnN0IHNvdW5kUGFja2V0ID0gbmV3IExldmVsU291bmRFdmVudFBhY2tldCgpO1xuICAgIHNvdW5kUGFja2V0LmV2ZW50ID0gTGV2ZWxTb3VuZEV2ZW50LkVxdWlwR2VuZXJpYztcbiAgICBzb3VuZFBhY2tldC5wb3NpdGlvbiA9IHBsYXllci5wb3NpdGlvbjtcbiAgICBzb3VuZFBhY2tldC5hY3RvcklkZW50aWZpZXIgPSBwbGF5ZXIudHlwZS5pZGVudGlmaWVyO1xuICAgIHNvdW5kUGFja2V0LmRhdGEgPSAtMTtcbiAgICBzb3VuZFBhY2tldC5pc0JhYnlNb2IgPSBmYWxzZTtcbiAgICBzb3VuZFBhY2tldC5pc0dsb2JhbCA9IGZhbHNlO1xuXG4gICAgcGxheWVyLnNlbmQoc291bmRQYWNrZXQpO1xuXG4gICAgcGxheWVySW52ZW50b3J5LmNvbnRhaW5lci5zd2FwSXRlbXMoXG4gICAgICBwbGF5ZXJJbnZlbnRvcnkuc2VsZWN0ZWRTbG90LFxuICAgICAgdGhpcy5zbG90LFxuICAgICAgcGxheWVyRXF1aXBtZW50LmNvbnRhaW5lclxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IHsgSXRlbUVxdWlwcGFibGVUcmFpdCB9O1xuIiwgImltcG9ydCB7IENvbXBvdW5kVGFnLCBMaXN0VGFnLCBTaG9ydFRhZywgVGFnIH0gZnJvbSBcIkBzZXJlbml0eWpzL25idFwiO1xuaW1wb3J0IHsgRW5jaGFudG1lbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgSXRlbUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgSXRlbVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuaW50ZXJmYWNlIEVuY2hhbnRtZW50VmFsdWUge1xuICBpZDogU2hvcnRUYWc7XG4gIGx2bDogU2hvcnRUYWc7XG59XG5cbmNsYXNzIEl0ZW1FbmNoYW50YWJsZVRyYWl0PFQgZXh0ZW5kcyBJdGVtSWRlbnRpZmllcj4gZXh0ZW5kcyBJdGVtVHJhaXQ8VD4ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImVuY2hhbnRhYmxlXCI7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVuY2hhbnRtZW50cyBvbiB0aGUgaXRlbSBzdGFjay5cbiAgICogQHJldHVybnMgVGhlIG1hcCBvZiBlbmNoYW50bWVudHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0RW5jaGFudG1lbnRzKCk6IE1hcDxFbmNoYW50bWVudCwgbnVtYmVyPiB7XG4gICAgLy8gR2V0IHRoZSBlbmNoYW50bWVudCBsaXN0IHRhZyBmcm9tIHRoZSBpdGVtIHN0YWNrJ3MgTkJUXG4gICAgY29uc3QgZW5jaCA9XG4gICAgICB0aGlzLml0ZW0ubmJ0LmdldDxMaXN0VGFnPENvbXBvdW5kVGFnPEVuY2hhbnRtZW50VmFsdWU+Pj4oXCJlbmNoXCIpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG1hcCB0byBzdG9yZSB0aGUgZW5jaGFudG1lbnRzXG4gICAgY29uc3QgZW5jaGFudG1lbnRzID0gbmV3IE1hcDxFbmNoYW50bWVudCwgbnVtYmVyPigpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVuY2hhbnRtZW50IGxpc3QgdGFnIGV4aXN0c1xuICAgIGlmIChlbmNoKVxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggZW5jaGFudG1lbnQgaW4gdGhlIGxpc3QgdGFnXG4gICAgICBmb3IgKGNvbnN0IHsgdmFsdWUgfSBvZiBlbmNoLnZhbHVlKVxuICAgICAgICBlbmNoYW50bWVudHMuc2V0KHZhbHVlLmlkLnZhbHVlLCB2YWx1ZS5sdmwudmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBtYXAgb2YgZW5jaGFudG1lbnRzXG4gICAgcmV0dXJuIGVuY2hhbnRtZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGVuY2hhbnRtZW50IGxldmVsIGZyb20gdGhlIGl0ZW0gc3RhY2suXG4gICAqIEBwYXJhbSBpZCBUaGUgZW5jaGFudG1lbnQgaWQuXG4gICAqIEByZXR1cm5zIFRoZSBlbmNoYW50bWVudCBsZXZlbCBpZiBpdCBleGlzdHM7IG90aGVyd2lzZSwgbnVsbC5cbiAgICovXG4gIHB1YmxpYyBnZXRFbmNoYW50bWVudChpZDogRW5jaGFudG1lbnQpOiBudW1iZXIgfCBudWxsIHtcbiAgICAvLyBHZXQgdGhlIGVuY2hhbnRtZW50IGxpc3QgdGFnIGZyb20gdGhlIGl0ZW0gc3RhY2sncyBOQlRcbiAgICBjb25zdCBlbmNoYW50bWVudHMgPSB0aGlzLmdldEVuY2hhbnRtZW50cygpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBlbmNoYW50bWVudCBsZXZlbCBpZiB0aGUgZW5jaGFudG1lbnQgZXhpc3RzXG4gICAgcmV0dXJuIGVuY2hhbnRtZW50cy5nZXQoaWQpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpdGVtIHN0YWNrIGhhcyBhbiBlbmNoYW50bWVudC5cbiAgICogQHBhcmFtIGlkIFRoZSBlbmNoYW50bWVudCBpZC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgaXRlbSBzdGFjayBoYXMgdGhlIGVuY2hhbnRtZW50LlxuICAgKi9cbiAgcHVibGljIGhhc0VuY2hhbnRtZW50KGlkOiBFbmNoYW50bWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEVuY2hhbnRtZW50KGlkKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVuY2hhbnRtZW50IHRvIHRoZSBpdGVtIHN0YWNrLlxuICAgKiBAcGFyYW0gaWQgVGhlIGVuY2hhbnRtZW50IGlkLlxuICAgKiBAcGFyYW0gbGV2ZWwgVGhlIGVuY2hhbnRtZW50IGxldmVsLlxuICAgKi9cbiAgcHVibGljIGFkZEVuY2hhbnRtZW50KGlkOiBFbmNoYW50bWVudCwgbGV2ZWw6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgZW5jaGFudG1lbnQgbGlzdCB0YWcgZnJvbSB0aGUgaXRlbSBzdGFjaydzIE5CVFxuICAgIGNvbnN0IGVuY2ggPVxuICAgICAgdGhpcy5pdGVtLm5idC5nZXQ8TGlzdFRhZzxDb21wb3VuZFRhZzxFbmNoYW50bWVudFZhbHVlPj4+KFwiZW5jaFwiKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbmNoYW50bWVudCBsaXN0IHRhZyBleGlzdHNcbiAgICBpZiAoZW5jaCkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGVuY2hhbnRtZW50IHZhbHVlXG4gICAgICBjb25zdCB2YWx1ZSA9IG5ldyBDb21wb3VuZFRhZzxFbmNoYW50bWVudFZhbHVlPigpO1xuXG4gICAgICAvLyBTZXQgdGhlIGVuY2hhbnRtZW50IHZhbHVlJ3MgaWQgYW5kIGxldmVsXG4gICAgICB2YWx1ZS5jcmVhdGVTaG9ydFRhZyhcImlkXCIsIGlkKTtcbiAgICAgIHZhbHVlLmNyZWF0ZVNob3J0VGFnKFwibHZsXCIsIGxldmVsKTtcblxuICAgICAgLy8gQWRkIHRoZSBlbmNoYW50bWVudCB2YWx1ZSB0byB0aGUgbGlzdCB0YWdcbiAgICAgIGVuY2gucHVzaCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBuYnQncyBlbmNoYW50bWVudCBsaXN0IHRhZ1xuICAgIHRoaXMuaXRlbS5uYnQuc2V0KFwiZW5jaFwiLCBlbmNoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBlbmNoYW50bWVudCBsaXN0IHRhZyBmcm9tIHRoZSBpdGVtIHN0YWNrJ3MgTkJULlxuICAgKiBAcmV0dXJucyBUaGUgZW5jaGFudG1lbnQgbGlzdCB0YWcuXG4gICAqL1xuICBwdWJsaWMgZ2V0TmJ0KCk6IExpc3RUYWc8Q29tcG91bmRUYWc8RW5jaGFudG1lbnRWYWx1ZT4+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLm5idC5nZXQ8TGlzdFRhZzxDb21wb3VuZFRhZzxFbmNoYW50bWVudFZhbHVlPj4+KFwiZW5jaFwiKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkFkZCgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBoYXMgdGhlIGVuY2hhbnRtZW50IGxpc3QgdGFnXG4gICAgaWYgKCF0aGlzLml0ZW0ubmJ0LmhhcyhcImVuY2hcIikpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgZW5jaGFudG1lbnQgbGlzdCB0YWdcbiAgICAgIGNvbnN0IGVuY2ggPSBuZXcgTGlzdFRhZyhcImVuY2hcIiwgW10sIFRhZy5Db21wb3VuZCk7XG5cbiAgICAgIC8vIEFkZCB0aGUgZW5jaGFudG1lbnQgbGlzdCB0YWcgdG8gdGhlIGl0ZW0gc3RhY2sncyBOQlRcbiAgICAgIHRoaXMuaXRlbS5uYnQuYWRkKGVuY2gpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblJlbW92ZSgpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgdGhlIGVuY2hhbnRtZW50IGxpc3QgdGFnIGZyb20gdGhlIGl0ZW0gc3RhY2sncyBOQlRcbiAgICB0aGlzLml0ZW0ubmJ0LmRlbGV0ZShcImVuY2hcIik7XG4gIH1cbn1cblxuZXhwb3J0IHsgSXRlbUVuY2hhbnRhYmxlVHJhaXQgfTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi9pZGVudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGFsZXR0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHJhaXRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdGFja1wiO1xuXG5pbXBvcnQgKiBhcyBUcmFpdHMgZnJvbSBcIi4vdHJhaXRzXCI7XG5cbi8qKlxuICogQSBsaXN0IG9mIGFsbCBpdGVtIHN0YWNrIHRyYWl0c1xuICovXG5jb25zdCBJdGVtVHJhaXRzID0gQXJyYXk8dHlwZW9mIFRyYWl0cy5JdGVtVHJhaXQ+KCk7XG5cbi8vIEl0ZXJhdGUgb3ZlciBlYWNoIHRyYWl0XG5mb3IgKGNvbnN0IGtleSBpbiBUcmFpdHMpIHtcbiAgLy8gR2V0IHRoZSBpdGVtIHRyYWl0XG4gIGNvbnN0IHRyYWl0ID0gVHJhaXRzW2tleSBhcyBrZXlvZiB0eXBlb2YgVHJhaXRzXTtcblxuICAvLyBQdXNoIHRoZSBpdGVtIHRyYWl0IHRvIHRoZSBsaXN0XG4gIEl0ZW1UcmFpdHMucHVzaCh0cmFpdCk7XG59XG5cbmV4cG9ydCB7IEl0ZW1UcmFpdHMgfTtcbiIsICJleHBvcnQgKiBmcm9tIFwiLi90cmFpdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXR0cmlidXRlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wbGF5ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dyYXZpdHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbGxpc2lvblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYWlyLXN1cHBseVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmFtZXRhZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW52ZW50b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pdGVtLXN0YWNrXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9waHlzaWNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lZmZlY3RzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92aXNpYmlsaXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcXVpcG1lbnRcIjtcbiIsICJpbXBvcnQgeyBUcmFpdCB9IGZyb20gXCIuLi8uLi90cmFpdFwiO1xuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciwgRW50aXR5SW50ZXJhY3RNZXRob2QgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9wbGF5ZXJcIjtcbmltcG9ydCB7IENvbW1hbmRFeGVjdXRpb25TdGF0ZSB9IGZyb20gXCIuLi8uLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4uLy4uL2NvbnRhaW5lclwiO1xuXG5jbGFzcyBFbnRpdHlUcmFpdCBleHRlbmRzIFRyYWl0IHtcbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdHlwZSBpZGVudGlmaWVycyB0aGF0IHRoaXMgdHJhaXQgaXMgY29tcGF0aWJsZSB3aXRoIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxFbnRpdHlJZGVudGlmaWVyPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgdGhpcyB0cmFpdCBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBlbnRpdHk6IEVudGl0eTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgdGhhdCB0aGlzIHRyYWl0IHdpbGwgYmUgYXR0YWNoZWQgdG8uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuXG4gICAgLy8gQWRkIHRoZSB0cmFpdCB0byB0aGUgZW50aXR5LlxuICAgIGVudGl0eS5hZGRUcmFpdCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgdGhlbiB0aGUgZW50aXR5IHRoYXQgdGhpcyB0cmFpdCBpcyBhdHRhY2hlZCB0byBpcyBzcGF3bmVkIGludG8gYSBkaW1lbnNpb24uXG4gICAqL1xuICBwdWJsaWMgb25TcGF3bj8oKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVudGl0eSB0aGF0IHRoaXMgdHJhaXQgaXMgYXR0YWNoZWQgdG8gaXMgZGVzcGF3bmVkIGZyb20gYSBkaW1lbnNpb24uXG4gICAqL1xuICBwdWJsaWMgb25EZXNwYXduPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZW50aXR5IHRoYXQgdGhpcyB0cmFpdCBpcyBhdHRhY2hlZCB0byBpcyBpbnRlcmFjdGVkIHdpdGggYnkgYSBwbGF5ZXIuXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IGludGVyYWN0ZWQgd2l0aCB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdGhhdCB0aGUgcGxheWVyIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIG9uSW50ZXJhY3Q/KHBsYXllcjogUGxheWVyLCBtZXRob2Q6IEVudGl0eUludGVyYWN0TWV0aG9kKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGVudGl0eSB0aGF0IHRoaXMgdHJhaXQgaXMgYXR0YWNoZWQgZXhlY3V0ZXMgYSBjb21tYW5kLlxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIGNvbW1hbmQgZXhlY3V0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjb21tYW5kIHdhcyBzdWNjZXNzZnVsOyBkZWZhdWx0IGlzIHRydWUuXG4gICAqL1xuICBwdWJsaWMgb25Db21tYW5kPyhzdGF0ZTogQ29tbWFuZEV4ZWN1dGlvblN0YXRlKTogYm9vbGVhbiB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgY29udGFpbmVyIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIGVudGl0eSBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgdGhhdCB3YXMgdXBkYXRlZC5cbiAgICovXG4gIHB1YmxpYyBvbkNvbnRhaW5lclVwZGF0ZT8oY29udGFpbmVyOiBDb250YWluZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDbG9uZXMgdGhlIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRvIGNsb25lIHRoZSB0cmFpdCB0by5cbiAgICogQHJldHVybnMgQSBuZXcgZW50aXR5IHRyYWl0LlxuICAgKi9cbiAgcHVibGljIGNsb25lKGVudGl0eTogRW50aXR5KTogdGhpcyB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0cmFpdC5cbiAgICBjb25zdCB0cmFpdCA9IG5ldyAodGhpcy5jb25zdHJ1Y3RvciBhcyBuZXcgKFxuICAgICAgZW50aXR5OiBFbnRpdHksXG4gICAgICBpZGVudGlmaWVyOiBzdHJpbmdcbiAgICApID0+IEVudGl0eVRyYWl0KShlbnRpdHksIHRoaXMuaWRlbnRpZmllcikgYXMgdGhpcztcblxuICAgIC8vIENvcHkgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzKSkge1xuICAgICAgLy8gU2tpcCB0aGUgZW50aXR5LlxuICAgICAgaWYgKGtleSA9PT0gXCJlbnRpdHlcIikgY29udGludWU7XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgIHRyYWl0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIHRyYWl0LlxuICAgIHJldHVybiB0cmFpdDtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlUcmFpdCB9O1xuIiwgImltcG9ydCB7IEF0dHJpYnV0ZSwgQXR0cmlidXRlTmFtZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlUcmFpdCB9IGZyb20gXCIuLi90cmFpdFwiO1xuaW1wb3J0IHsgSlNPTkxpa2VPYmplY3QgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcblxuaW50ZXJmYWNlIEF0dHJpYnV0ZVByb3BlcnRpZXMgZXh0ZW5kcyBKU09OTGlrZU9iamVjdCB7XG4gIGF0dHJpYnV0ZTogQXR0cmlidXRlTmFtZTtcbiAgY3VycmVudDogbnVtYmVyO1xuICBlZmZlY3RpdmVNaW46IG51bWJlcjtcbiAgZWZmZWN0aXZlTWF4OiBudW1iZXI7XG4gIGRlZmF1bHRWYWx1ZTogbnVtYmVyO1xufVxuXG5jbGFzcyBFbnRpdHlBdHRyaWJ1dGVUcmFpdCBleHRlbmRzIEVudGl0eVRyYWl0IHtcbiAgLyoqXG4gICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWl0XG4gICAqL1xuICBwdWJsaWMgYXR0cmlidXRlITogQXR0cmlidXRlTmFtZTtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIGVmZmVjdGl2ZU1pbjogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIGVmZmVjdGl2ZU1heDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIGRlZmF1bHRWYWx1ZTogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCk/LmN1cnJlbnQgPz8gdGhpcy5kZWZhdWx0VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGN1cnJlbnRWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBlbmFibGVkIG9yIG5vdFxuICAgKi9cbiAgcHVibGljIGdldCgpOiBBdHRyaWJ1dGUgfCB1bmRlZmluZWQge1xuICAgIC8vIEdldCB0aGUgY29tcG9uZW50IHZhbHVlIGZyb20gdGhlIGVudGl0eVxuICAgIHJldHVybiB0aGlzLmVudGl0eS5hdHRyaWJ1dGVzLmdldCh0aGlzLmF0dHJpYnV0ZSk7XG4gIH1cblxuICAvKipcbiAgICogSW5jcmVhc2VzIHRoZSBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBpbmNyZWFzZSB0aGUgYXR0cmlidXRlIGN1cnJlbnQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgaW5jcmVhc2UoYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldCh0aGlzLmN1cnJlbnRWYWx1ZSArIGFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjcmVhc2VzIHRoZSBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBkZWNyZWFzZSB0aGUgYXR0cmlidXRlIGN1cnJlbnQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZGVjcmVhc2UoYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNldCh0aGlzLmN1cnJlbnRWYWx1ZSAtIGFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAgICogQHBhcmFtIHZhbHVlIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBlbmFibGVkIG9yIG5vdFxuICAgKiBAcGFyYW0gdXBkYXRlIFdoZXRoZXIgdG8gdXBkYXRlIHRoZSBlbnRpdHkncyBhY3RvciBkYXRhOyBkZWZhdWx0IGlzIHRydWVcbiAgICovXG4gIHB1YmxpYyBzZXQodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgcHJvcGVydGllcyBvYmplY3RcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBBdHRyaWJ1dGVQcm9wZXJ0aWVzID0ge1xuICAgICAgYXR0cmlidXRlOiB0aGlzLmF0dHJpYnV0ZSxcbiAgICAgIGN1cnJlbnQ6IHZhbHVlLFxuICAgICAgZWZmZWN0aXZlTWluOiB0aGlzLmVmZmVjdGl2ZU1pbixcbiAgICAgIGVmZmVjdGl2ZU1heDogdGhpcy5lZmZlY3RpdmVNYXgsXG4gICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgb2JqZWN0XG4gICAgY29uc3QgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZShcbiAgICAgIHRoaXMuZWZmZWN0aXZlTWluLFxuICAgICAgdGhpcy5lZmZlY3RpdmVNYXgsXG4gICAgICB2YWx1ZSxcbiAgICAgIC1JbmZpbml0eSxcbiAgICAgIEluZmluaXR5LFxuICAgICAgdGhpcy5kZWZhdWx0VmFsdWUsXG4gICAgICB0aGlzLmF0dHJpYnV0ZSxcbiAgICAgIFtdXG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29tcG9uZW50IHZhbHVlXG4gICAgdGhpcy5lbnRpdHkuY29tcG9uZW50cy5zZXQodGhpcy5pZGVudGlmaWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLmVudGl0eS5hdHRyaWJ1dGVzLnNldCh0aGlzLmF0dHJpYnV0ZSwgYXR0cmlidXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBvblNwYXduKCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIHRoZSBjb21wb25lbnRcbiAgICBpZiAodGhpcy5lbnRpdHkuY29tcG9uZW50cy5oYXModGhpcy5pZGVudGlmaWVyKSkge1xuICAgICAgLy8gR2V0IHRoZSBjb21wb25lbnQgdmFsdWUgZnJvbSB0aGUgZW50aXR5XG4gICAgICBjb25zdCBlbmFibGVkID0gdGhpcy5lbnRpdHkuY29tcG9uZW50cy5nZXQoXG4gICAgICAgIHRoaXMuaWRlbnRpZmllclxuICAgICAgKSBhcyBBdHRyaWJ1dGVQcm9wZXJ0aWVzO1xuXG4gICAgICAvLyBTZXQgdGhlIGVudGl0eSBmbGFnXG4gICAgICB0aGlzLnNldChlbmFibGVkLmN1cnJlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXQgdGhlIGNvbXBvbmVudCB2YWx1ZSB0byB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgdGhpcy5zZXQodGhpcy5kZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlBdHRyaWJ1dGVUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIEF0dHJpYnV0ZU5hbWUsXG4gIE1vdmVBY3RvckRlbHRhUGFja2V0LFxuICBNb3ZlRGVsdGFGbGFnc1xufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFbnRpdHlBdHRyaWJ1dGVUcmFpdCB9IGZyb20gXCIuL2F0dHJpYnV0ZVwiO1xuXG5jbGFzcyBFbnRpdHlNb3ZlbWVudFRyYWl0IGV4dGVuZHMgRW50aXR5QXR0cmlidXRlVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcIm1vdmVtZW50XCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIHB1YmxpYyByZWFkb25seSBhdHRyaWJ1dGUgPSBBdHRyaWJ1dGVOYW1lLk1vdmVtZW50O1xuICBwdWJsaWMgcmVhZG9ubHkgZWZmZWN0aXZlTWluID0gMDtcbiAgcHVibGljIHJlYWRvbmx5IGVmZmVjdGl2ZU1heCA9IDMuNDAyXzgyM180NjZlKzM4O1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFZhbHVlID0gMC4xO1xuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBtb3ZpbmdcbiAgICBpZiAoIXRoaXMuZW50aXR5LmlzTW92aW5nKSByZXR1cm47XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgTW92ZUFjdG9yRGVsdGFQYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgTW92ZUFjdG9yRGVsdGFQYWNrZXQoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcGFja2V0IHByb3BlcnRpZXNcbiAgICBwYWNrZXQucnVudGltZUlkID0gdGhpcy5lbnRpdHkucnVudGltZUlkO1xuICAgIHBhY2tldC5mbGFncyA9IE1vdmVEZWx0YUZsYWdzLkFsbDtcbiAgICBwYWNrZXQueCA9IHRoaXMuZW50aXR5LnBvc2l0aW9uLng7XG4gICAgcGFja2V0LnkgPSB0aGlzLmVudGl0eS5wb3NpdGlvbi55O1xuICAgIHBhY2tldC56ID0gdGhpcy5lbnRpdHkucG9zaXRpb24uejtcbiAgICBwYWNrZXQueWF3ID0gdGhpcy5lbnRpdHkucm90YXRpb24ueWF3O1xuICAgIHBhY2tldC5oZWFkWWF3ID0gdGhpcy5lbnRpdHkucm90YXRpb24uaGVhZFlhdztcbiAgICBwYWNrZXQucGl0Y2ggPSB0aGlzLmVudGl0eS5yb3RhdGlvbi5waXRjaDtcblxuICAgIC8vIEFkanVzdCB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgZW50aXR5XG4gICAgaWYgKCF0aGlzLmVudGl0eS5pc1BsYXllcigpICYmICF0aGlzLmVudGl0eS5pc0l0ZW0oKSkgcGFja2V0LnkgLT0gMC4yNTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgb24gdGhlIGdyb3VuZFxuICAgIGlmICh0aGlzLmVudGl0eS5vbkdyb3VuZCkgcGFja2V0LmZsYWdzIHw9IE1vdmVEZWx0YUZsYWdzLk9uR3JvdW5kO1xuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gYWxsIHBsYXllcnNcbiAgICBpZiAodGhpcy5lbnRpdHkuaXNQbGF5ZXIoKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG1vdmluZyBlbnRpdHkgaXMgYSBwbGF5ZXJcbiAgICAgIC8vIElmIHNvLCBicm9hZGNhc3QgdGhlIHBhY2tldCB0byBhbGwgcGxheWVycyBleGNlcHQgdGhlIG1vdmluZyBlbnRpdHlcbiAgICAgIHRoaXMuZW50aXR5LmRpbWVuc2lvbi5icm9hZGNhc3RFeGNlcHQodGhpcy5lbnRpdHksIHBhY2tldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW50aXR5LmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5TW92ZW1lbnRUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIEFiaWxpdHlJbmRleCxcbiAgQWN0b3JEYW1hZ2VDYXVzZSxcbiAgQWN0b3JFdmVudElkcyxcbiAgQWN0b3JFdmVudFBhY2tldCxcbiAgQXR0cmlidXRlTmFtZSxcbiAgR2FtZW1vZGUsXG4gIFZlY3RvcjNmXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyLCBFbnRpdHlJbnRlcmFjdE1ldGhvZCB9IGZyb20gXCIuLi8uLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL3BsYXllclwiO1xuaW1wb3J0IHsgRW50aXR5SGVhbHRoQ2hhbmdlZFNpZ25hbCwgRW50aXR5SHVydFNpZ25hbCB9IGZyb20gXCIuLi8uLi8uLi9ldmVudHNcIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHlcIjtcblxuaW1wb3J0IHsgRW50aXR5QXR0cmlidXRlVHJhaXQgfSBmcm9tIFwiLi9hdHRyaWJ1dGVcIjtcblxuY2xhc3MgRW50aXR5SGVhbHRoVHJhaXQgZXh0ZW5kcyBFbnRpdHlBdHRyaWJ1dGVUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiaGVhbHRoXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIHB1YmxpYyByZWFkb25seSBhdHRyaWJ1dGUgPSBBdHRyaWJ1dGVOYW1lLkhlYWx0aDtcbiAgcHVibGljIHJlYWRvbmx5IGVmZmVjdGl2ZU1pbiA9IDA7XG4gIHB1YmxpYyByZWFkb25seSBlZmZlY3RpdmVNYXggPSAyMDtcbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZSA9IDIwO1xuXG4gIHB1YmxpYyBhcHBseURhbWFnZShcbiAgICBhbW91bnQ6IG51bWJlcixcbiAgICBkYW1hZ2VyPzogRW50aXR5LFxuICAgIGNhdXNlPzogQWN0b3JEYW1hZ2VDYXVzZVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBzaWduYWwgPSBuZXcgRW50aXR5SHVydFNpZ25hbChcbiAgICAgIHRoaXMuZW50aXR5LFxuICAgICAgYW1vdW50LFxuICAgICAgY2F1c2UsXG4gICAgICBkYW1hZ2VyXG4gICAgKTtcblxuICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuO1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IGhlYWx0aCB2YWx1ZVxuICAgIHRoaXMuY3VycmVudFZhbHVlIC09IGFtb3VudDtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBBY3RvckV2ZW50UGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IEFjdG9yRXZlbnRQYWNrZXQoKTtcbiAgICBwYWNrZXQuYWN0b3JSdW50aW1lSWQgPSB0aGlzLmVudGl0eS5ydW50aW1lSWQ7XG4gICAgcGFja2V0LmV2ZW50SWQgPSBBY3RvckV2ZW50SWRzLkhVUlRfQU5JTUFUSU9OO1xuICAgIHBhY2tldC5ldmVudERhdGEgPSBjYXVzZSA/PyBBY3RvckRhbWFnZUNhdXNlLk5vbmU7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIHBhY2tldCB0byBhbGwgcGxheWVyc1xuICAgIHRoaXMuZW50aXR5LmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBoZWFsdGggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDBcbiAgICAvLyBJZiBzbywgdGhlIGVudGl0eSBpcyBkZWFkXG4gICAgaWYgKHRoaXMuY3VycmVudFZhbHVlIDw9IDApIHRoaXMuZW50aXR5LmtpbGwoZGFtYWdlciwgY2F1c2UpO1xuICB9XG5cbiAgcHVibGljIHNldCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IEVudGl0eUhlYWx0aENoYW5nZWRTaWduYWwoXG4gICAgICB0aGlzLmVudGl0eSxcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlLFxuICAgICAgdmFsdWVcbiAgICApO1xuXG4gICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm47XG4gICAgc3VwZXIuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkludGVyYWN0KHBsYXllcjogUGxheWVyLCBtZXRob2Q6IEVudGl0eUludGVyYWN0TWV0aG9kKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG1ldGhvZCBpcyBub3QgYW4gYXR0YWNrOyBpZiBpdCBpcyBub3QsIHJldHVyblxuICAgIGlmIChtZXRob2QgIT09IEVudGl0eUludGVyYWN0TWV0aG9kLkF0dGFjaykgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgdGhlIGFiaWxpdHkgdG8gYXR0YWNrIHBsYXllcnM7IGlmIGl0IGRvZXMgbm90LCByZXR1cm5cbiAgICBpZiAoXG4gICAgICAhcGxheWVyLmFiaWxpdGllcy5nZXQoQWJpbGl0eUluZGV4LkF0dGFja1BsYXllcnMpICYmXG4gICAgICB0aGlzLmVudGl0eS5pc1BsYXllcigpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgdGhlIGFiaWxpdHkgdG8gYXR0YWNrIG1vYnM7IGlmIGl0IGRvZXMgbm90LCByZXR1cm5cbiAgICBpZiAoXG4gICAgICAhcGxheWVyLmFiaWxpdGllcy5nZXQoQWJpbGl0eUluZGV4LkF0dGFja01vYnMpICYmXG4gICAgICAhdGhpcy5lbnRpdHkuaXNQbGF5ZXIoKVxuICAgIClcbiAgICAgIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgZW50aXR5IGlzIGEgcGxheWVyIGFuZCBpcyBpbiBjcmVhdGl2ZSBtb2RlOyBpZiBpdCBpcywgcmV0dXJuXG4gICAgaWYgKHRoaXMuZW50aXR5LmlzUGxheWVyKCkgJiYgdGhpcy5lbnRpdHkuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLkNyZWF0aXZlKVxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8gV2Ugd2FudCB0byBhcHBseSBrbm9jayBiYWNrIHRvIHRoZSBlbnRpdHkgd2hlbiBpdCBpcyBhdHRhY2tlZCwgYmFzZWQgb24gdGhlIGRpcmVjdGlvbiB0aGUgcGxheWVyIGlzIGZhY2luZy5cbiAgICAvLyBHZXQgdGhlIGRpcmVjdGlvbiB0aGUgcGxheWVyIGlzIGZhY2luZ1xuICAgIGNvbnN0IHsgaGVhZFlhdywgcGl0Y2ggfSA9IHBsYXllci5yb3RhdGlvbjtcblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGl0Y2ggJiBoZWFkWWF3LCBzbyB0aGUgZW50aXR5IHdpbGwgYmUgc3Bhd25lZCBpbiB0aGUgY29ycmVjdCBkaXJlY3Rpb25cbiAgICBjb25zdCBoZWFkWWF3UmFkID0gKGhlYWRZYXcgKiBNYXRoLlBJKSAvIDE4MDtcbiAgICBjb25zdCBwaXRjaFJhZCA9IChwaXRjaCAqIE1hdGguUEkpIC8gMTgwO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSB2ZWxvY2l0eSBvZiB0aGUgZW50aXR5IGJhc2VkIG9uIHRoZSBwbGF5ZXIncyByb3RhdGlvblxuICAgIC8vIE5PVEU6IFRoZXNlIG51bWJlcnMgYXJlIG5vdCBvZmZpY2lhbC92YW5pbGxhIHZhbHVlcywgdGhlc2Ugc2VlbSB0byB3b3JrIHNpbWlsYXIgdG8gdGhlIHZhbmlsbGEgdmFsdWVzLlxuICAgIC8vIElmIHdlIGNhbiBnZXQgdGhlIG9mZmljaWFsIHZhbHVlcywgd2Ugc2hvdWxkIHJlcGxhY2UgdGhlc2Ugd2l0aCB0aGUgb2ZmaWNpYWwgdmFsdWVzLlxuICAgIGNvbnN0IHggPSAoLU1hdGguc2luKGhlYWRZYXdSYWQpICogTWF0aC5jb3MocGl0Y2hSYWQpKSAvIDMuNzU7XG4gICAgY29uc3QgeSA9IDAuMjtcbiAgICBjb25zdCB6ID0gKE1hdGguY29zKGhlYWRZYXdSYWQpICogTWF0aC5jb3MocGl0Y2hSYWQpKSAvIDMuNzU7XG5cbiAgICAvLyBTZXQgdGhlIHZlbG9jaXR5IG9mIHRoZSBlbnRpdHlcbiAgICB0aGlzLmVudGl0eS5zZXRNb3Rpb24obmV3IFZlY3RvcjNmKHgsIHksIHopKTtcblxuICAgIC8vIEFwcGx5IGRhbWFnZSB0byB0aGUgZW50aXR5XG4gICAgLy8gVE9ETzogQ2FsY3VsYXRlIHRoZSBkYW1hZ2UgYmFzZWQgb24gdGhlIHBsYXllcidzIGl0ZW1cbiAgICB0aGlzLmFwcGx5RGFtYWdlKDEsIHBsYXllciwgQWN0b3JEYW1hZ2VDYXVzZS5FbnRpdHlBdHRhY2spO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUhlYWx0aFRyYWl0IH07XG4iLCAiaW1wb3J0IHsgR2FtZW1vZGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uLy4uL3BsYXllclwiO1xuaW1wb3J0IHsgRW50aXR5VHJhaXQgfSBmcm9tIFwiLi4vdHJhaXRcIjtcblxuY2xhc3MgUGxheWVyVHJhaXQgZXh0ZW5kcyBFbnRpdHlUcmFpdCB7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgdGhpcyB0cmFpdCBpcyBhdHRhY2hlZCB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXIgPSB0aGlzLmVudGl0eSBhcyBQbGF5ZXI7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5ZXIgc2VuZHMgYSBjaGF0IG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRoYXQgdGhlIHBsYXllciBzZW50LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjaGF0IG1lc3NhZ2Ugd2FzIHN1Y2Nlc3NmdWw7IGRlZmF1bHQgaXMgdHJ1ZVxuICAgKi9cbiAgcHVibGljIG9uQ2hhdD8obWVzc2FnZTogc3RyaW5nKTogYm9vbGVhbiB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgcGxheWVycyBnYW1lbW9kZSBpcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gcHJldmlvdXMgVGhlIHByZXZpb3VzIGdhbWVtb2RlIG9mIHRoZSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgb25HYW1lbW9kZUNoYW5nZT8ocHJldmlvdXM6IEdhbWVtb2RlKTogdm9pZDtcbn1cblxuZXhwb3J0IHsgUGxheWVyVHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBDaHVua0Nvb3JkcyxcbiAgTGV2ZWxDaHVua1BhY2tldCxcbiAgTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBDaHVuayB9IGZyb20gXCIuLi8uLi8uLi93b3JsZC9jaHVua1wiO1xuXG5pbXBvcnQgeyBQbGF5ZXJUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIFBsYXllckNodW5rUmVuZGVyaW5nVHJhaXQgZXh0ZW5kcyBQbGF5ZXJUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiY2h1bmtfcmVuZGVyaW5nXCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGNodW5rIGhhc2hlcyB0aGF0IGhhdmUgYmVlbiBzZW50IHRvIHRoZSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2h1bmtzID0gbmV3IFNldDxiaWdpbnQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSB2aWV3IGRpc3RhbmNlIG9mIHRoZSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgdmlld0Rpc3RhbmNlID0gdGhpcy5wbGF5ZXIuZGltZW5zaW9uLnZpZXdEaXN0YW5jZTtcblxuICAvKipcbiAgICogU2VuZHMgYSBjaHVuayB0byB0aGUgcGxheWVyLlxuICAgKiBAcGFyYW0gY2h1bmtzIFRoZSBjaHVua3MgdG8gc2VuZCB0byB0aGUgcGxheWVyLlxuICAgKi9cbiAgcHVibGljIHNlbmQoLi4uY2h1bmtzOiBBcnJheTxDaHVuaz4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGFtb3VudCBvZiBjaHVua3MgdG8gc2VuZFxuICAgIGNvbnN0IGFtb3VudCA9IGNodW5rcy5sZW5ndGg7XG5cbiAgICAvLyBXZSB3YW50IHRvIHNlbmQgdGhlIGNodW5rcyBpbiBiYXRjaGVzIG9mIDhcbiAgICBjb25zdCBiYXRjaGVzID0gTWF0aC5jZWlsKGFtb3VudCAvIDgpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBiYXRjaGVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGJhdGNoZXM7IGluZGV4KyspIHtcbiAgICAgIC8vIEdldCB0aGUgc3RhcnQgYW5kIGVuZCBpbmRleCBvZiB0aGUgYmF0Y2hcbiAgICAgIGNvbnN0IHN0YXJ0ID0gaW5kZXggKiA4O1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RhcnQgKyA4LCBhbW91bnQpO1xuXG4gICAgICAvLyBHZXQgdGhlIGNodW5rcyB0byBzZW5kXG4gICAgICBjb25zdCBiYXRjaCA9IGNodW5rcy5zbGljZShzdGFydCwgZW5kKTtcblxuICAgICAgY29uc3QgbGV2ZWxDaHVua3MgPSBiYXRjaC5tYXAoKGNodW5rKSA9PiB7XG4gICAgICAgIHRoaXMuY2h1bmtzLmFkZChjaHVuay5oYXNoKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTGV2ZWxDaHVua1BhY2tldFxuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgTGV2ZWxDaHVua1BhY2tldCgpO1xuXG4gICAgICAgIC8vIEFzc2lnbiB0aGUgY2h1bmsgZGF0YSB0byB0aGUgcGFja2V0XG4gICAgICAgIHBhY2tldC54ID0gY2h1bmsueDtcbiAgICAgICAgcGFja2V0LnogPSBjaHVuay56O1xuICAgICAgICBwYWNrZXQuZGltZW5zaW9uID0gY2h1bmsudHlwZTtcbiAgICAgICAgcGFja2V0LnN1YkNodW5rQ291bnQgPSBjaHVuay5nZXRTdWJDaHVua1NlbmRDb3VudCgpO1xuICAgICAgICBwYWNrZXQuY2FjaGVFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5kYXRhID0gQ2h1bmsuc2VyaWFsaXplKGNodW5rKTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIHBhY2tldFxuICAgICAgICByZXR1cm4gcGFja2V0O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNlbmQgdGhlIHBhY2tldHMgdG8gdGhlIHBsYXllclxuICAgICAgdGhpcy5wbGF5ZXIuc2VuZCguLi5sZXZlbENodW5rcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGNodW5rIGhhcyBiZWVuIHNlbnQgdG8gdGhlIHBsYXllci5cbiAgICogQHBhcmFtIGhhc2ggVGhlIGhhc2ggb2YgdGhlIGNodW5rIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjaHVuayBoYXMgYmVlbiBzZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgc2VudChoYXNoOiBiaWdpbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jaHVua3MuaGFzKGhhc2gpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBsYXllciBhbmQgYSBjaHVuay5cbiAgICogQHBhcmFtIGNodW5rIFRoZSBoYXNoIG9mIHRoZSBjaHVuayB0byBnZXQgdGhlIGRpc3RhbmNlIHRvLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxheWVyIGFuZCB0aGUgY2h1bmsuXG4gICAqL1xuICBwdWJsaWMgZGlzdGFuY2UoaGFzaDogYmlnaW50KTogbnVtYmVyIHtcbiAgICAvLyBDb252ZXJ0IHRoZSBjaHVuayBoYXNoIHRvIGEgY2h1bmsgcG9zaXRpb25cbiAgICBjb25zdCB7IHg6IGN4LCB6OiBjeiB9ID0gQ2h1bmtDb29yZHMudW5oYXNoKGhhc2gpO1xuXG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIncyBjaHVuayBwb3NpdGlvblxuICAgIGNvbnN0IHB4ID0gdGhpcy5wbGF5ZXIucG9zaXRpb24ueCA+PiA0O1xuICAgIGNvbnN0IHB6ID0gdGhpcy5wbGF5ZXIucG9zaXRpb24ueiA+PiA0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxheWVyIGFuZCB0aGUgY2h1bmtcbiAgICByZXR1cm4gTWF0aC5oeXBvdChjeCAtIHB4LCBjeiAtIHB6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBuZXh0IHNldCBvZiBjaHVuayBoYXNoZXMgdG8gc2VuZCB0byB0aGUgcGxheWVyLlxuICAgKiBAbm90ZSBUaGlzIG1ldGhvZCBvYnRhaW5zIHRoZSBjaHVua3MgdGhhdCBhcmUgd2l0aGluIHRoZSBwbGF5ZXIncyB2aWV3IGRpc3RhbmNlLlxuICAgKiBAcGFyYW0gZGlzdGFuY2UgVGhlIGRpc3RhbmNlIHRvIGNhbGN1bGF0ZSB0aGUgY2h1bmtzIGZvci5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgY2h1bmsgaGFzaGVzIHRvIHNlbmQgdG8gdGhlIHBsYXllci5cbiAgICovXG4gIHB1YmxpYyBuZXh0KGRpc3RhbmNlPzogbnVtYmVyKTogQXJyYXk8YmlnaW50PiB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBjaHVuayBwb3NpdGlvbiBvZiB0aGUgZW50aXR5XG4gICAgY29uc3QgY3ggPSB0aGlzLnBsYXllci5wb3NpdGlvbi54ID4+IDQ7XG4gICAgY29uc3QgY3ogPSB0aGlzLnBsYXllci5wb3NpdGlvbi56ID4+IDQ7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9yIHVzZSB0aGUgc2ltdWxhdGlvbiBkaXN0YW5jZSBvZiB0aGUgZGltZW5zaW9uXG4gICAgY29uc3QgZCA9IGRpc3RhbmNlID8/IHRoaXMudmlld0Rpc3RhbmNlO1xuXG4gICAgLy8gUHJlcGFyZSBhbiBhcnJheSB0byBzdG9yZSB0aGUgY2h1bmtzIHRoYXQgbmVlZCB0byBiZSBzZW50IHRvIHRoZSBwbGF5ZXIuXG4gICAgY29uc3QgaGFzaGVzOiBBcnJheTxiaWdpbnQ+ID0gW107XG5cbiAgICAvLyBHZXQgdGhlIGNodW5rcyB0byByZW5kZXIsIHdlIHdhbnQgdG8gZ2V0IHRoZSBjaHVua3MgZnJvbSB0aGUgaW5zaWRlIG91dFxuICAgIGZvciAobGV0IGR4ID0gLWQ7IGR4IDw9IGQ7IGR4KyspIHtcbiAgICAgIGZvciAobGV0IGR6ID0gLWQ7IGR6IDw9IGQ7IGR6KyspIHtcbiAgICAgICAgLy8gR2V0IHRoZSBoYXNoIG9mIHRoZSBjaHVua1xuICAgICAgICBjb25zdCBoYXNoID0gQ2h1bmtDb29yZHMuaGFzaCh7IHg6IGN4ICsgZHgsIHo6IGN6ICsgZHogfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNodW5rIGlzIGFscmVhZHkgcmVuZGVyZWRcbiAgICAgICAgaWYgKHRoaXMuY2h1bmtzLmhhcyhoYXNoKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwbGF5ZXIgYW5kIHRoZSBjaHVua1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguaHlwb3QoZHgsIGR6KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2h1bmsgaXMgd2l0aGluIHRoZSB2aWV3IGRpc3RhbmNlXG4gICAgICAgIGlmIChkaXN0YW5jZSA8PSBkICsgMC41KSBoYXNoZXMucHVzaChoYXNoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGhhc2hlc1xuICAgIHJldHVybiBoYXNoZXM7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBjaHVua3MgZnJvbSB0aGUgcGxheWVyJ3Mgdmlldy5cbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgY2h1bmsgdG8gY2xlYXIuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIocG9zaXRpb24/OiBDaHVua0Nvb3Jkcyk6IHZvaWQge1xuICAgIC8vIENvbnZlcnQgdGhlIGhhc2hlcyB0byBjb29yZGluYXRlc1xuICAgIGNvbnN0IGNvb3JkcyA9IHBvc2l0aW9uXG4gICAgICA/IFtwb3NpdGlvbl1cbiAgICAgIDogWy4uLnRoaXMuY2h1bmtzXS5tYXAoKGhhc2gpID0+IENodW5rQ29vcmRzLnVuaGFzaChoYXNoKSk7XG5cbiAgICAvLyBDcmVhdGUgYW4gZW1wdHkgY2h1bmtcbiAgICBjb25zdCBlbXB0eSA9IG5ldyBDaHVuaygwLCAwLCB0aGlzLnBsYXllci5kaW1lbnNpb24udHlwZSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGNvb3JkaW5hdGVzXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBMZXZlbENodW5rUGFja2V0XG4gICAgICBjb25zdCBwYWNrZXQgPSBuZXcgTGV2ZWxDaHVua1BhY2tldCgpO1xuXG4gICAgICAvLyBBc3NpZ24gdGhlIGNodW5rIGRhdGEgdG8gdGhlIHBhY2tldFxuICAgICAgcGFja2V0LnggPSBjb29yZC54O1xuICAgICAgcGFja2V0LnogPSBjb29yZC56O1xuICAgICAgcGFja2V0LmRpbWVuc2lvbiA9IHRoaXMucGxheWVyLmRpbWVuc2lvbi50eXBlO1xuICAgICAgcGFja2V0LnN1YkNodW5rQ291bnQgPSBlbXB0eS5nZXRTdWJDaHVua1NlbmRDb3VudCgpO1xuICAgICAgcGFja2V0LmNhY2hlRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgcGFja2V0LmRhdGEgPSBDaHVuay5zZXJpYWxpemUoZW1wdHkpO1xuXG4gICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgdGhpcy5wbGF5ZXIuc2VuZChwYWNrZXQpO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIGNodW5rIGZyb20gdGhlIHBsYXllcidzIHZpZXdcbiAgICAgIHRoaXMuY2h1bmtzLmRlbGV0ZShDaHVua0Nvb3Jkcy5oYXNoKGNvb3JkKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uVGljaygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIHNwYXduZWRcbiAgICBpZiAoIXRoaXMucGxheWVyLmlzQWxpdmUpIHJldHVybjtcblxuICAgIC8vIEdldCB0aGUgbmV4dCBjaHVua3MgdG8gc2VuZCB0byB0aGUgcGxheWVyXG4gICAgY29uc3QgaGFzaGVzID0gWy4uLnRoaXMubmV4dCgpLCAuLi50aGlzLmNodW5rc10uZmlsdGVyKFxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgY2h1bmtzIHRoYXQgYXJlIGFscmVhZHkgcmVuZGVyZWRcbiAgICAgIChoYXNoKSA9PiAhdGhpcy5jaHVua3MuaGFzKGhhc2gpXG4gICAgKTtcblxuICAgIC8vIEdldCB0aGUgY29vcmRzIG9mIHRoZSBjaHVua3NcbiAgICBjb25zdCBjb29yZHMgPSBoYXNoZXMubWFwKChoYXNoKSA9PiBDaHVua0Nvb3Jkcy51bmhhc2goaGFzaCkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBjaHVua3MgdG8gc2VuZFxuICAgIGlmIChjb29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gR2V0IHRoZSBjaHVua3MgdG8gc2VuZFxuICAgICAgY29uc3QgY2h1bmtzID0gY29vcmRzXG4gICAgICAgIC5tYXAoKGNvb3JkKSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNodW5rIGlzIGFscmVhZHkgcmVuZGVyZWRcbiAgICAgICAgICBpZiAodGhpcy5jaHVua3MuaGFzKENodW5rQ29vcmRzLmhhc2goY29vcmQpKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGNodW5rIGZyb20gdGhlIGRpbWVuc2lvblxuICAgICAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5wbGF5ZXIuZGltZW5zaW9uLmdldENodW5rKGNvb3JkLngsIGNvb3JkLnopO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNodW5rIGlzIHJlYWR5XG4gICAgICAgICAgaWYgKCFjaHVuay5yZWFkeSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNodW5rXG4gICAgICAgICAgcmV0dXJuIGNodW5rO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChjaHVuaykgPT4gY2h1bmsgIT09IG51bGwpIGFzIEFycmF5PENodW5rPjtcblxuICAgICAgLy8gU2VuZCB0aGUgY2h1bmtzIHRvIHRoZSBwbGF5ZXJcbiAgICAgIHRoaXMuc2VuZCguLi5jaHVua3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDaGVjayBpZiBhbnkgY2h1bmtzIG5lZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBwbGF5ZXIncyB2aWV3XG4gICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgdGhpcy5jaHVua3MpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwbGF5ZXIgYW5kIHRoZSBjaHVua1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMuZGlzdGFuY2UoaGFzaCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNodW5rIGlzIG91dHNpZGUgb2YgdGhlIHBsYXllcidzIHZpZXcgZGlzdGFuY2VcbiAgICAgICAgaWYgKGRpc3RhbmNlID4gdGhpcy52aWV3RGlzdGFuY2UgKyAwLjUpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGNodW5rIHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgeyB4LCB6IH0gPSBDaHVua0Nvb3Jkcy51bmhhc2goaGFzaCk7XG5cbiAgICAgICAgICAvLyBDbGVhciB0aGUgY2h1bmsgZnJvbSB0aGUgcGxheWVyJ3Mgdmlld1xuICAgICAgICAgIHRoaXMuY2xlYXIoeyB4LCB6IH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBOZXR3b3JrQ2h1bmtQdWJsaXNoZXJVcGRhdGVQYWNrZXRcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IG5ldyBOZXR3b3JrQ2h1bmtQdWJsaXNoZXJVcGRhdGVQYWNrZXQoKTtcblxuICAgICAgLy8gQXNzaWduIHRoZSB2YWx1ZXMgdG8gdGhlIHBhY2tldFxuICAgICAgdXBkYXRlLnJhZGl1cyA9IHRoaXMudmlld0Rpc3RhbmNlIDw8IDQ7XG4gICAgICB1cGRhdGUuY29vcmRpbmF0ZSA9IHRoaXMucGxheWVyLnBvc2l0aW9uLmZsb29yKCk7XG4gICAgICB1cGRhdGUuc2F2ZWRDaHVua3MgPSBbLi4udGhpcy5jaHVua3NdLm1hcCgoaGFzaCkgPT5cbiAgICAgICAgQ2h1bmtDb29yZHMudW5oYXNoKGhhc2gpXG4gICAgICApO1xuXG4gICAgICAvLyBTZW5kIHRoZSBwYWNrZXRzIHRvIHRoZSBwbGF5ZXJcbiAgICAgIHRoaXMucGxheWVyLnNlbmQodXBkYXRlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25EZXNwYXduKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSBjaHVua3MgZnJvbSB0aGUgcGxheWVyJ3Mgdmlld1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJDaHVua1JlbmRlcmluZ1RyYWl0IH07XG4iLCAiaW1wb3J0IHtcbiAgQWJpbGl0eUxheWVyVHlwZSxcbiAgQWJpbGl0eVNldCxcbiAgQWRkRW50aXR5UGFja2V0LFxuICBBZGRJdGVtQWN0b3JQYWNrZXQsXG4gIEFkZFBsYXllclBhY2tldCxcbiAgTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3IsXG4gIFByb3BlcnR5U3luY0RhdGEsXG4gIFJlbW92ZUVudGl0eVBhY2tldCxcbiAgVmVjdG9yM2Zcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eUludmVudG9yeVRyYWl0IH0gZnJvbSBcIi4uL2ludmVudG9yeVwiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uLy4uLy4uL2l0ZW1cIjtcbmltcG9ydCB7IEVudGl0eUl0ZW1TdGFja1RyYWl0IH0gZnJvbSBcIi4uL2l0ZW0tc3RhY2tcIjtcblxuaW1wb3J0IHsgUGxheWVyVHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuaW1wb3J0IHsgUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCB9IGZyb20gXCIuL2NodW5rLXJlbmRlcmluZ1wiO1xuXG5jbGFzcyBQbGF5ZXJFbnRpdHlSZW5kZXJpbmdUcmFpdCBleHRlbmRzIFBsYXllclRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJlbnRpdHlfcmVuZGVyaW5nXCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgLyoqXG4gICAqIEEgY29sbGVjdGl2ZSBtYXAgb2YgYWxsIHRoZSBlbnRpdGllcyB0aGF0IGhhdmUgYmVlbiByZW5kZXJlZCBmb3IgdGhlIHBsYXllci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnRpdGllczogU2V0PGJpZ2ludD4gPSBuZXcgU2V0KCk7XG5cbiAgcHVibGljIG9uVGljaygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIHNwYXduZWRcbiAgICBpZiAoIXRoaXMucGxheWVyLmlzQWxpdmUpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIGEgY2h1bmsgcmVuZGVyaW5nIGNvbXBvbmVudFxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucGxheWVyLmdldFRyYWl0KFBsYXllckNodW5rUmVuZGVyaW5nVHJhaXQpO1xuICAgIGlmICghY29tcG9uZW50KSByZXR1cm47XG5cbiAgICAvLyBHZXQgdGhlIHBsYXllcidzIHZpZXcgZGlzdGFuY2VcbiAgICBjb25zdCB2aWV3RGlzdGFuY2UgPSBjb21wb25lbnQudmlld0Rpc3RhbmNlIDw8IDQ7XG5cbiAgICAvLyBHZXQgYWxsIHRoZSBlbnRpdGllcyBpbiB0aGUgcGxheWVyJ3MgZGltZW5zaW9uXG4gICAgY29uc3QgZW50aXRpZXMgPSB0aGlzLnBsYXllci5kaW1lbnNpb24uZW50aXRpZXM7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGVudGl0aWVzXG4gICAgZm9yIChjb25zdCBbdW5pcXVlLCBlbnRpdHldIG9mIGVudGl0aWVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIHRoZSBwbGF5ZXIgb3IgaWYgdGhlIGVudGl0eSBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkXG4gICAgICBpZiAodGhpcy5lbnRpdGllcy5oYXModW5pcXVlKSB8fCBlbnRpdHkgPT09IHRoaXMucGxheWVyKSBjb250aW51ZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBhbGl2ZVxuICAgICAgaWYgKCFlbnRpdHkuaXNBbGl2ZSkgY29udGludWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgd2l0aGluIHRoZSBwbGF5ZXIncyB2aWV3IGRpc3RhbmNlXG4gICAgICBpZiAodGhpcy5kaXN0YW5jZShlbnRpdHkucG9zaXRpb24sIHRoaXMucGxheWVyLnBvc2l0aW9uKSA+IHZpZXdEaXN0YW5jZSlcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIC8vIEFkZCB0aGUgZW50aXR5IHRvIHRoZSByZW5kZXJlZCBlbnRpdGllc1xuICAgICAgdGhpcy5lbnRpdGllcy5hZGQodW5pcXVlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBhIHBsYXllclxuICAgICAgaWYgKGVudGl0eS5pc1BsYXllcigpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBBZGRQbGF5ZXJQYWNrZXRcbiAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IEFkZFBsYXllclBhY2tldCgpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGxheWVycyBpbnZlbnRvcnlcbiAgICAgICAgY29uc3QgaW52ZW50b3J5ID0gZW50aXR5LmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgICAgICAvLyBHZXQgdGhlIHBsYXllcnMgaGVsZCBpdGVtXG4gICAgICAgIGNvbnN0IGhlbGRJdGVtID0gaW52ZW50b3J5LmdldEhlbGRJdGVtKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwYWNrZXQgcHJvcGVydGllc1xuICAgICAgICBwYWNrZXQudXVpZCA9IGVudGl0eS51dWlkO1xuICAgICAgICBwYWNrZXQudXNlcm5hbWUgPSBlbnRpdHkudXNlcm5hbWU7XG4gICAgICAgIHBhY2tldC5ydW50aW1lSWQgPSBlbnRpdHkucnVudGltZUlkO1xuICAgICAgICBwYWNrZXQucGxhdGZvcm1DaGF0SWQgPSBTdHJpbmcoKTsgLy8gVE9ETzogTm90IHN1cmUgd2hhdCB0aGlzIGlzXG4gICAgICAgIHBhY2tldC5wb3NpdGlvbiA9IGVudGl0eS5wb3NpdGlvbjtcbiAgICAgICAgcGFja2V0LnZlbG9jaXR5ID0gZW50aXR5LnZlbG9jaXR5O1xuICAgICAgICBwYWNrZXQucGl0Y2ggPSBlbnRpdHkucm90YXRpb24ucGl0Y2g7XG4gICAgICAgIHBhY2tldC55YXcgPSBlbnRpdHkucm90YXRpb24ueWF3O1xuICAgICAgICBwYWNrZXQuaGVhZFlhdyA9IGVudGl0eS5yb3RhdGlvbi5oZWFkWWF3O1xuICAgICAgICBwYWNrZXQuaGVsZEl0ZW0gPVxuICAgICAgICAgIGhlbGRJdGVtID09PSBudWxsXG4gICAgICAgICAgICA/IG5ldyBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvcigwKVxuICAgICAgICAgICAgOiBJdGVtU3RhY2sudG9OZXR3b3JrU3RhY2soaGVsZEl0ZW0pO1xuICAgICAgICBwYWNrZXQuZ2FtZW1vZGUgPSAwO1xuICAgICAgICBwYWNrZXQuZGF0YSA9IFsuLi5lbnRpdHkubWV0YWRhdGEudmFsdWVzKCldO1xuICAgICAgICBwYWNrZXQucHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0eVN5bmNEYXRhKFtdLCBbXSk7XG4gICAgICAgIHBhY2tldC51bmlxdWVFbnRpdHlJZCA9IGVudGl0eS51bmlxdWVJZDtcbiAgICAgICAgcGFja2V0LnByZW1pc3Npb25MZXZlbCA9IGVudGl0eS5wZXJtaXNzaW9uO1xuICAgICAgICBwYWNrZXQuY29tbWFuZFBlcm1pc3Npb24gPSBlbnRpdHkucGVybWlzc2lvbiA9PT0gMiA/IDEgOiAwO1xuICAgICAgICBwYWNrZXQuYWJpbGl0aWVzID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IEFiaWxpdHlMYXllclR5cGUuQmFzZSxcbiAgICAgICAgICAgIGFiaWxpdGllczogWy4uLmVudGl0eS5hYmlsaXRpZXMuZW50cmllcygpXS5tYXAoXG4gICAgICAgICAgICAgIChbYWJpbGl0eSwgdmFsdWVdKSA9PiBuZXcgQWJpbGl0eVNldChhYmlsaXR5LCB2YWx1ZSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB3YWxrU3BlZWQ6IDAuMSxcbiAgICAgICAgICAgIGZseVNwZWVkOiAwLjA1XG4gICAgICAgICAgfVxuICAgICAgICBdO1xuICAgICAgICBwYWNrZXQubGlua3MgPSBbXTtcbiAgICAgICAgcGFja2V0LmRldmljZUlkID0gXCJcIjtcbiAgICAgICAgcGFja2V0LmRldmljZU9TID0gMDtcblxuICAgICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgICB0aGlzLnBsYXllci5zZW5kKHBhY2tldCk7XG5cbiAgICAgICAgLy8gQ29udGludWUgdG8gdGhlIG5leHQgZW50aXR5XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIGFuIGl0ZW1cbiAgICAgIGlmIChlbnRpdHkuaXNJdGVtKCkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBpdGVtIGNvbXBvbmVudFxuICAgICAgICBjb25zdCBpdGVtQ29tcG9uZW50ID0gZW50aXR5LmdldFRyYWl0KEVudGl0eUl0ZW1TdGFja1RyYWl0KTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgQWRkSXRlbUFjdG9yUGFja2V0XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBBZGRJdGVtQWN0b3JQYWNrZXQoKTtcblxuICAgICAgICAvLyBTZXQgdGhlIHBhY2tldCBwcm9wZXJ0aWVzXG4gICAgICAgIHBhY2tldC51bmlxdWVJZCA9IGVudGl0eS51bmlxdWVJZDtcbiAgICAgICAgcGFja2V0LnJ1bnRpbWVJZCA9IGVudGl0eS5ydW50aW1lSWQ7XG4gICAgICAgIHBhY2tldC5pdGVtID0gSXRlbVN0YWNrLnRvTmV0d29ya1N0YWNrKGl0ZW1Db21wb25lbnQuaXRlbVN0YWNrKTtcbiAgICAgICAgcGFja2V0LnBvc2l0aW9uID0gZW50aXR5LnBvc2l0aW9uO1xuICAgICAgICBwYWNrZXQudmVsb2NpdHkgPSBlbnRpdHkudmVsb2NpdHk7XG4gICAgICAgIHBhY2tldC5kYXRhID0gWy4uLmVudGl0eS5tZXRhZGF0YS52YWx1ZXMoKV07XG4gICAgICAgIHBhY2tldC5mcm9tRmlzaGluZyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgICAgIHRoaXMucGxheWVyLnNlbmQocGFja2V0KTtcblxuICAgICAgICAvLyBDb250aW51ZSB0byB0aGUgbmV4dCBlbnRpdHlcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBBZGRFbnRpdHlQYWNrZXRcbiAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBBZGRFbnRpdHlQYWNrZXQoKTtcblxuICAgICAgLy8gU2V0IHRoZSBwYWNrZXQgcHJvcGVydGllc1xuICAgICAgcGFja2V0LnVuaXF1ZUVudGl0eUlkID0gZW50aXR5LnVuaXF1ZUlkO1xuICAgICAgcGFja2V0LnJ1bnRpbWVJZCA9IGVudGl0eS5ydW50aW1lSWQ7XG4gICAgICBwYWNrZXQuaWRlbnRpZmllciA9IGVudGl0eS50eXBlLmlkZW50aWZpZXI7XG4gICAgICBwYWNrZXQucG9zaXRpb24gPSBlbnRpdHkucG9zaXRpb247XG4gICAgICBwYWNrZXQudmVsb2NpdHkgPSBlbnRpdHkudmVsb2NpdHk7XG4gICAgICBwYWNrZXQucGl0Y2ggPSBlbnRpdHkucm90YXRpb24ucGl0Y2g7XG4gICAgICBwYWNrZXQueWF3ID0gZW50aXR5LnJvdGF0aW9uLnlhdztcbiAgICAgIHBhY2tldC5oZWFkWWF3ID0gZW50aXR5LnJvdGF0aW9uLmhlYWRZYXc7XG4gICAgICBwYWNrZXQuYm9keVlhdyA9IGVudGl0eS5yb3RhdGlvbi55YXc7XG4gICAgICBwYWNrZXQuYXR0cmlidXRlcyA9IFtdO1xuICAgICAgcGFja2V0LmRhdGEgPSBbLi4uZW50aXR5Lm1ldGFkYXRhLnZhbHVlcygpXTtcbiAgICAgIHBhY2tldC5wcm9wZXJ0aWVzID0gbmV3IFByb3BlcnR5U3luY0RhdGEoW10sIFtdKTtcbiAgICAgIHBhY2tldC5saW5rcyA9IFtdO1xuXG4gICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgdGhpcy5wbGF5ZXIuc2VuZChwYWNrZXQpO1xuXG4gICAgICAvLyBTeW5jIHRoZSBlbnRpdHlcbiAgICAgIC8vIGVudGl0eS5zeW5jKCk7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBlbnRpdGllc1xuICAgIGZvciAoY29uc3QgdW5pcXVlIG9mIHRoaXMuZW50aXRpZXMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgc3RpbGwgaW4gdGhlIHBsYXllcidzIGRpbWVuc2lvblxuICAgICAgaWYgKHRoaXMucGxheWVyLmRpbWVuc2lvbi5lbnRpdGllcy5oYXModW5pcXVlKSkge1xuICAgICAgICAvLyBHZXQgdGhlIGVudGl0eVxuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLnBsYXllci5kaW1lbnNpb24uZW50aXRpZXMuZ2V0KHVuaXF1ZSk7XG4gICAgICAgIGlmICghZW50aXR5KSBjb250aW51ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIGluIHRoZSBwbGF5ZXIncyB2aWV3IGRpc3RhbmNlXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmRpc3RhbmNlKGVudGl0eS5wb3NpdGlvbiwgdGhpcy5wbGF5ZXIucG9zaXRpb24pIDw9IHZpZXdEaXN0YW5jZVxuICAgICAgICApXG4gICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHJlbW92ZSBlbnRpdHkgcGFja2V0XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBSZW1vdmVFbnRpdHlQYWNrZXQoKTtcblxuICAgICAgICAvLyBTZXQgdGhlIHVuaXF1ZSBlbnRpdHkgaWRcbiAgICAgICAgcGFja2V0LnVuaXF1ZUVudGl0eUlkID0gdW5pcXVlO1xuXG4gICAgICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgICAgIHRoaXMucGxheWVyLnNlbmQocGFja2V0KTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIGVudGl0eSBmcm9tIHRoZSByZW5kZXJlZCBlbnRpdGllc1xuICAgICAgICB0aGlzLmVudGl0aWVzLmRlbGV0ZSh1bmlxdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHJlbW92ZSBlbnRpdHkgcGFja2V0XG4gICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBSZW1vdmVFbnRpdHlQYWNrZXQoKTtcbiAgICAgICAgcGFja2V0LnVuaXF1ZUVudGl0eUlkID0gdW5pcXVlO1xuXG4gICAgICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgICAgIHRoaXMucGxheWVyLnNlbmQocGFja2V0KTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIGVudGl0eSBmcm9tIHRoZSByZW5kZXJlZCBlbnRpdGllc1xuICAgICAgICB0aGlzLmVudGl0aWVzLmRlbGV0ZSh1bmlxdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkRlc3Bhd24oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIGVudGl0aWVzXG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgdGhlIGVudGl0aWVzIHRoYXQgaGF2ZSBiZWVuIHJlbmRlcmVkIGZvciB0aGUgcGxheWVyLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgZW50aXRpZXNcbiAgICBmb3IgKGNvbnN0IHVuaXF1ZSBvZiB0aGlzLmVudGl0aWVzKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgcmVtb3ZlIGVudGl0eSBwYWNrZXRcbiAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBSZW1vdmVFbnRpdHlQYWNrZXQoKTtcbiAgICAgIHBhY2tldC51bmlxdWVFbnRpdHlJZCA9IHVuaXF1ZTtcblxuICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgIHRoaXMucGxheWVyLnNlbmQocGFja2V0KTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciB0aGUgZW50aXRpZXNcbiAgICB0aGlzLmVudGl0aWVzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgZGlzdGFuY2UoYTogVmVjdG9yM2YsIGI6IFZlY3RvcjNmKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KFxuICAgICAgTWF0aC5wb3coYS54IC0gYi54LCAyKSArIE1hdGgucG93KGEueSAtIGIueSwgMikgKyBNYXRoLnBvdyhhLnogLSBiLnosIDIpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJFbnRpdHlSZW5kZXJpbmdUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIENvbnRhaW5lcklkLFxuICBDb250YWluZXJUeXBlLFxuICBNb2JFcXVpcG1lbnRQYWNrZXQsXG4gIE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHlDb250YWluZXIgfSBmcm9tIFwiLi4vY29udGFpbmVyXCI7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vLi4vaXRlbVwiO1xuaW1wb3J0IHsgSXRlbVN0YWNrRW50cnksIEpTT05MaWtlT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEVudGl0eVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuaW50ZXJmYWNlIEludmVudG9yeUNvbXBvbmVudCBleHRlbmRzIEpTT05MaWtlT2JqZWN0IHtcbiAgc2l6ZTogbnVtYmVyO1xuICBpdGVtczogQXJyYXk8W251bWJlciwgSXRlbVN0YWNrRW50cnldPjtcbn1cblxuY2xhc3MgRW50aXR5SW52ZW50b3J5VHJhaXQgZXh0ZW5kcyBFbnRpdHlUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiaW52ZW50b3J5XCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIgdGhhdCBob2xkcyB0aGUgaW52ZW50b3J5IGl0ZW1zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lcjogRW50aXR5Q29udGFpbmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBjb250YWluZXIgdGhhdCB0aGlzIHRyYWl0IHJlcHJlc2VudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZSA9IENvbnRhaW5lclR5cGUuSW52ZW50b3J5O1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyIHRoYXQgdGhpcyB0cmFpdCByZXByZXNlbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lcklkOiBDb250YWluZXJJZCA9IENvbnRhaW5lcklkLkludmVudG9yeTtcblxuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBzbG90cyBpbiB0aGUgaW52ZW50b3J5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludmVudG9yeVNpemU6IG51bWJlciA9IDM2O1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0ZWQgc2xvdCBpbiB0aGUgaW52ZW50b3J5LlxuICAgKi9cbiAgcHVibGljIHNlbGVjdGVkU2xvdDogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBzdXBlcihlbnRpdHkpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNvbnRhaW5lclxuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IEVudGl0eUNvbnRhaW5lcihcbiAgICAgIGVudGl0eSxcbiAgICAgIHRoaXMuY29udGFpbmVyVHlwZSxcbiAgICAgIHRoaXMuY29udGFpbmVySWQsXG4gICAgICB0aGlzLmludmVudG9yeVNpemVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGhlbGQgaXRlbSBpbiB0aGUgaW52ZW50b3J5LlxuICAgKiBAcmV0dXJucyBUaGUgaGVsZCBpdGVtIGluIHRoZSBpbnZlbnRvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0SGVsZEl0ZW0oKTogSXRlbVN0YWNrIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmdldEl0ZW0odGhpcy5zZWxlY3RlZFNsb3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGhlbGQgaXRlbSBpbiB0aGUgaW52ZW50b3J5LlxuICAgKiBAcGFyYW0gc2xvdCBUaGUgc2xvdCB0byBzZXQgdGhlIGhlbGQgaXRlbSB0by5cbiAgICovXG4gIHB1YmxpYyBzZXRIZWxkSXRlbShzbG90OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIG5vdCBhIHBsYXllclxuICAgIGlmICghdGhpcy5lbnRpdHkuaXNQbGF5ZXIoKSkgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IE1vYkVxdWlwbWVudFBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBNb2JFcXVpcG1lbnRQYWNrZXQoKTtcblxuICAgIC8vIEdldCB0aGUgaGVsZCBpdGVtIGZyb20gdGhlIGludmVudG9yeVxuICAgIGNvbnN0IGhlbGRJdGVtID0gdGhpcy5nZXRIZWxkSXRlbSgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0gZGVzY3JpcHRvciBmcm9tIHRoZSBoZWxkIGl0ZW1cbiAgICBjb25zdCBpdGVtRGVzY3JpcHRvciA9IGhlbGRJdGVtXG4gICAgICA/IEl0ZW1TdGFjay50b05ldHdvcmtTdGFjayhoZWxkSXRlbSlcbiAgICAgIDogbmV3IE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yKDApO1xuXG4gICAgLy8gQXNzaWduIHRoZSBwYWNrZXQgcHJvcGVydGllc1xuICAgIHBhY2tldC5ydW50aW1lRW50aXR5SWQgPSB0aGlzLmVudGl0eS5ydW50aW1lSWQ7XG4gICAgcGFja2V0LmNvbnRhaW5lcklkID0gdGhpcy5jb250YWluZXJJZDtcbiAgICBwYWNrZXQuc2VsZWN0ZWRTbG90ID0gc2xvdDtcbiAgICBwYWNrZXQuc2xvdCA9IHNsb3Q7XG4gICAgcGFja2V0Lml0ZW0gPSBpdGVtRGVzY3JpcHRvcjtcblxuICAgIC8vIFNldCB0aGUgc2VsZWN0ZWQgc2xvdCB0byB0aGUgc2xvdFxuICAgIHRoaXMuc2VsZWN0ZWRTbG90ID0gc2xvdDtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgdGhpcy5lbnRpdHkuc2VuZChwYWNrZXQpO1xuICB9XG5cbiAgcHVibGljIG9uU3Bhd24oKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYW4gaW52ZW50b3J5IGNvbXBvbmVudFxuICAgIGlmICh0aGlzLmVudGl0eS5jb21wb25lbnRzLmhhcyhcImludmVudG9yeVwiKSkge1xuICAgICAgLy8gR2V0IHRoZSBpbnZlbnRvcnkgY29tcG9uZW50IGZyb20gdGhlIGVudGl0eVxuICAgICAgY29uc3QgaW52ZW50b3J5ID0gdGhpcy5lbnRpdHkuY29tcG9uZW50cy5nZXQoXG4gICAgICAgIFwiaW52ZW50b3J5XCJcbiAgICAgICkgYXMgSW52ZW50b3J5Q29tcG9uZW50O1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgZWFjaCBpdGVtIGluIHRoZSBpbnZlbnRvcnlcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpbnZlbnRvcnkuaXRlbXMpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBzbG90IGFuZCBlbnRyeSBmcm9tIHRoZSBpdGVtXG4gICAgICAgIGNvbnN0IHNsb3QgPSBpdGVtWzBdIGFzIG51bWJlcjtcbiAgICAgICAgY29uc3QgZW50cnkgPSBpdGVtWzFdIGFzIEl0ZW1TdGFja0VudHJ5O1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpdGVtIHN0YWNrXG4gICAgICAgIGNvbnN0IHN0YWNrID0gbmV3IEl0ZW1TdGFjayhlbnRyeS5pZGVudGlmaWVyLCB7XG4gICAgICAgICAgYW1vdW50OiBlbnRyeS5hbW91bnQsXG4gICAgICAgICAgYXV4aWxsYXJ5OiBlbnRyeS5hdXhpbGxhcnksXG4gICAgICAgICAgd29ybGQ6IHRoaXMuZW50aXR5LmdldFdvcmxkKCksXG4gICAgICAgICAgZW50cnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBpdGVtIHN0YWNrIHRvIHRoZSBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIuc2V0SXRlbShzbG90LCBzdGFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250YWluZXIgaWYgdGhlIGVudGl0eSBpcyBhIHBsYXllclxuICAgIGlmICh0aGlzLmVudGl0eS5pc1BsYXllcigpKSB0aGlzLmNvbnRhaW5lci51cGRhdGUodGhpcy5lbnRpdHkpO1xuICB9XG5cbiAgcHVibGljIG9uRGVzcGF3bigpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgaW52ZW50b3J5IGNvbXBvbmVudFxuICAgIGNvbnN0IGludmVudG9yeTogSW52ZW50b3J5Q29tcG9uZW50ID0ge1xuICAgICAgc2l6ZTogdGhpcy5pbnZlbnRvcnlTaXplLFxuICAgICAgaXRlbXM6IFtdXG4gICAgfTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBlYWNoIGl0ZW0gaW4gdGhlIGNvbnRhaW5lclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnZlbnRvcnlTaXplOyBpKyspIHtcbiAgICAgIC8vIEdldCB0aGUgaXRlbSBzdGFjayBhdCB0aGUgaW5kZXhcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNvbnRhaW5lci5nZXRJdGVtKGkpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyBudWxsXG4gICAgICBpZiAoaXRlbSA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgIC8vIEdldCB0aGUgZGF0YSBlbnRyeSBvZiB0aGUgaXRlbSBzdGFja1xuICAgICAgY29uc3QgZW50cnkgPSBpdGVtLmdldERhdGFFbnRyeSgpO1xuXG4gICAgICAvLyBQdXNoIHRoZSBpdGVtIHN0YWNrIGVudHJ5IHRvIHRoZSBpbnZlbnRvcnkgaXRlbXNcbiAgICAgIGludmVudG9yeS5pdGVtcy5wdXNoKFtpLCBlbnRyeV0pO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgaW52ZW50b3J5IGNvbXBvbmVudCB0byB0aGUgZW50aXR5XG4gICAgdGhpcy5lbnRpdHkuY29tcG9uZW50cy5zZXQoXCJpbnZlbnRvcnlcIiwgaW52ZW50b3J5KTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlJbnZlbnRvcnlUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIENvbnRhaW5lcklkLFxuICBDb250YWluZXJPcGVuUGFja2V0LFxuICBDb250YWluZXJUeXBlXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi4vY29udGFpbmVyXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuaW1wb3J0IHsgUGxheWVyT3BlbmVkQ29udGFpbmVyU2lnbmFsIH0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHlcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuL3BsYXllclwiO1xuXG5jbGFzcyBFbnRpdHlDb250YWluZXIgZXh0ZW5kcyBDb250YWluZXIge1xuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IHRoaXMgY29udGFpbmVyIGlzIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICB0eXBlOiBDb250YWluZXJUeXBlLFxuICAgIGlkZW50aWZpZXI6IENvbnRhaW5lcklkLFxuICAgIHNpemU6IG51bWJlclxuICApIHtcbiAgICBzdXBlcih0eXBlLCBpZGVudGlmaWVyLCBzaXplKTtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRJdGVtKHNsb3Q6IG51bWJlciwgaXRlbVN0YWNrOiBJdGVtU3RhY2spOiB2b2lkIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzZXRJdGVtIG1ldGhvZFxuICAgIHN1cGVyLnNldEl0ZW0oc2xvdCwgaXRlbVN0YWNrKTtcblxuICAgIC8vIFNldCB0aGUgd29ybGQgaW4gdGhlIGl0ZW0gc3RhY2sgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIGlmICghaXRlbVN0YWNrLndvcmxkKSBpdGVtU3RhY2sud29ybGQgPSB0aGlzLmVudGl0eS5nZXRXb3JsZCgpO1xuICAgIGl0ZW1TdGFjay5pbml0aWFsaXplKCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbnRhaW5lciBpZiB0aGUgZW50aXR5IGlzIGEgcGxheWVyXG4gICAgaWYgKHRoaXMuZW50aXR5LmlzUGxheWVyKCkpIHRoaXMudXBkYXRlKHRoaXMuZW50aXR5KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNsb3Qoc2xvdDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgY2xlYXJTbG90IG1ldGhvZFxuICAgIHN1cGVyLmNsZWFyU2xvdChzbG90KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyIGlmIHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXJcbiAgICBpZiAodGhpcy5lbnRpdHkuaXNQbGF5ZXIoKSkgdGhpcy51cGRhdGUodGhpcy5lbnRpdHkpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZShwbGF5ZXI/OiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCB1cGRhdGUgbWV0aG9kXG4gICAgc3VwZXIudXBkYXRlKHBsYXllcik7XG5cbiAgICAvLyBDYWxsIHRoZSBvbkNvbnRhaW5lclVwZGF0ZSBtZXRob2QgZm9yIHRoZSBibG9jayB0cmFpdHNcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHRoaXMuZW50aXR5LnRyYWl0cy52YWx1ZXMoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2FsbCB0aGUgdHJhaXQgbWV0aG9kXG4gICAgICAgIHRyYWl0Lm9uQ29udGFpbmVyVXBkYXRlPy4odGhpcyk7XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciB0byB0aGUgY29uc29sZVxuICAgICAgICB0aGlzLmVudGl0eVxuICAgICAgICAgIC5nZXRXb3JsZCgpXG4gICAgICAgICAgLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gdHJpZ2dlciBvbkNvbnRhaW5lclVwZGF0ZSB0cmFpdCBldmVudCBmb3IgZW50aXR5IFwiJHt0aGlzLmVudGl0eS50eXBlLmlkZW50aWZpZXJ9OiR7dGhpcy5lbnRpdHkudW5pcXVlSWR9XCIgaW4gZGltZW5zaW9uIFwiJHt0aGlzLmVudGl0eS5kaW1lbnNpb24uaWRlbnRpZmllcn1cImAsXG4gICAgICAgICAgICByZWFzb25cbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgZW50aXR5XG4gICAgICAgIHRoaXMuZW50aXR5LnRyYWl0cy5kZWxldGUodHJhaXQuaWRlbnRpZmllcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNob3cocGxheWVyOiBQbGF5ZXIpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyT3BlbmVkQ29udGFpbmVyU2lnbmFsXG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IFBsYXllck9wZW5lZENvbnRhaW5lclNpZ25hbChwbGF5ZXIsIHRoaXMpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHNpZ25hbCB3YXMgY2FuY2VsbGVkXG4gICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm47XG5cbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzaG93IG1ldGhvZFxuICAgIHN1cGVyLnNob3cocGxheWVyKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBDb250YWluZXJPcGVuUGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IENvbnRhaW5lck9wZW5QYWNrZXQoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllc1xuICAgIHBhY2tldC5pZGVudGlmaWVyID0gdGhpcy5pZGVudGlmaWVyO1xuICAgIHBhY2tldC50eXBlID0gdGhpcy50eXBlO1xuICAgIHBhY2tldC5wb3NpdGlvbiA9IHRoaXMuZW50aXR5LnBvc2l0aW9uO1xuICAgIHBhY2tldC51bmlxdWVJZCA9IHRoaXMuZW50aXR5LnVuaXF1ZUlkO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICBwbGF5ZXIuc2VuZChwYWNrZXQpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250YWluZXJcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUNvbnRhaW5lciB9O1xuIiwgImltcG9ydCB7XG4gIEFjdG9yRXZlbnRJZHMsXG4gIEFjdG9yRXZlbnRQYWNrZXQsXG4gIExldmVsU291bmRFdmVudCxcbiAgTGV2ZWxTb3VuZEV2ZW50UGFja2V0LFxuICBUYWtlSXRlbUFjdG9yUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyLCBJdGVtSWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uLy4uL2l0ZW1cIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9wbGF5ZXJcIjtcbmltcG9ydCB7IEl0ZW1TdGFja0VudHJ5IH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEVudGl0eVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcbmltcG9ydCB7IEVudGl0eUludmVudG9yeVRyYWl0IH0gZnJvbSBcIi4vaW52ZW50b3J5XCI7XG5cbmNsYXNzIEVudGl0eUl0ZW1TdGFja1RyYWl0IGV4dGVuZHMgRW50aXR5VHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcIml0ZW1zdGFja1wiO1xuXG4gIC8qKlxuICAgKiBUaGUgYmlydGggdGljayBvZiB0aGUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBiaXJ0aFRpY2s6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gc3RhY2sgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBpdGVtU3RhY2s6IEl0ZW1TdGFjaztcblxuICAvKipcbiAgICogVGhlIGxpZmVzcGFuIG9mIHRoZSBpdGVtIGluIHRpY2tzLlxuICAgKi9cbiAgcHVibGljIGxpZmVTcGFuOiBudW1iZXIgPSA2MDAwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGlja3VwIHRpY2sgb2YgdGhlIGl0ZW0uXG4gICAqL1xuICBwcm90ZWN0ZWQgcGlja3VwVGljazogYmlnaW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgcGxheWVyIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRhcmdldDogUGxheWVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXJnaW5nIHN0YXRlIG9mIHRoZSBpdGVtLlxuICAgKi9cbiAgcHJvdGVjdGVkIG1lcmdpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBlbnRpdHkgaW52ZW50b3J5IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IG9mIHRoZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBpdGVtU3RhY2sgVGhlIGl0ZW0gc3RhY2sgb2YgdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgQSBuZXcgZW50aXR5IGludmVudG9yeSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBzdXBlcihlbnRpdHkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSB0eXBlIGlzIGFuIGl0ZW1cbiAgICAvLyBJZiBub3Qgd2UgdGhyb3cgYW4gZXJyb3JcbiAgICBpZiAoZW50aXR5LnR5cGUuaWRlbnRpZmllciAhPT0gRW50aXR5SWRlbnRpZmllci5JdGVtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbnRpdHkgbXVzdCBiZSBhbiBpdGVtXCIpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgY29tcG9uZW50IG9mIHRoZSBpdGVtIHN0YWNrIGZyb20gdGhlIGVudGl0eVxuICAgIGNvbnN0IGVudHJ5ID0gZW50aXR5LmNvbXBvbmVudHMuZ2V0KFwiaXRlbXN0YWNrXCIpIGFzIEl0ZW1TdGFja0VudHJ5O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudHJ5IGV4aXN0c1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgLy8gU2V0IHRoZSBpdGVtIHN0YWNrIG9mIHRoZSBjb21wb25lbnRcbiAgICAgIHRoaXMuaXRlbVN0YWNrID0gbmV3IEl0ZW1TdGFjayhlbnRyeS5pZGVudGlmaWVyLCB7IGVudHJ5IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXQgdGhlIGl0ZW0gc3RhY2sgb2YgdGhlIGNvbXBvbmVudFxuICAgICAgdGhpcy5pdGVtU3RhY2sgPSBuZXcgSXRlbVN0YWNrKEl0ZW1JZGVudGlmaWVyLkFpcik7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBiaXJ0aCB0aWNrIG9mIHRoZSBpdGVtXG4gICAgdGhpcy5iaXJ0aFRpY2sgPSBlbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpZmVzcGFuIG9mIHRoZSBpdGVtLlxuICAgKiBAcmV0dXJucyBUaGUgbGlmZXNwYW4gb2YgdGhlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0TGlmZVNwYW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5saWZlU3BhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBsaWZlc3BhbiBvZiB0aGUgaXRlbS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSBsaWZlc3BhbiBvZiB0aGUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBzZXRMaWZlU3Bhbih2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5saWZlU3BhbiA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIHVwIHRoZSBpdGVtIGJ5IGEgcGxheWVyLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBwaWNrZWQgdXAgdGhlIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgcGlja3VwKHBsYXllcjogUGxheWVyKTogdm9pZCB7XG4gICAgLy8gVGVsZXBvcnQgdGhlIGl0ZW0gdG8gdGhlIHBsYXllclxuICAgIHRoaXMuZW50aXR5LnRlbGVwb3J0KHBsYXllci5wb3NpdGlvbik7XG5cbiAgICAvLyBTZXQgdGhlIHBsYXllciBhcyB0aGUgdGFyZ2V0XG4gICAgdGhpcy50YXJnZXQgPSBwbGF5ZXI7XG5cbiAgICAvLyBTZXQgdGhlIHBpY2t1cCB0aWNrXG4gICAgdGhpcy5waWNrdXBUaWNrID0gdGhpcy5lbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrO1xuICB9XG5cbiAgcHVibGljIGluY3JlbWVudChhbW91bnQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TdGFjay5pbmNyZW1lbnQoYW1vdW50KTtcblxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBBY3RvckV2ZW50UGFja2V0KCk7XG4gICAgcGFja2V0LmV2ZW50SWQgPSBBY3RvckV2ZW50SWRzLklURU1fRU5USVRZX01FUkdFO1xuICAgIHBhY2tldC5ldmVudERhdGEgPSB0aGlzLml0ZW1TdGFjay5hbW91bnQ7XG4gICAgcGFja2V0LmFjdG9yUnVudGltZUlkID0gdGhpcy5lbnRpdHkucnVudGltZUlkO1xuXG4gICAgdGhpcy5lbnRpdHkuZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuICB9XG5cbiAgcHVibGljIGRlY3JlbWVudChhbW91bnQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TdGFjay5kZWNyZW1lbnQoYW1vdW50KTtcblxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBBY3RvckV2ZW50UGFja2V0KCk7XG4gICAgcGFja2V0LmV2ZW50SWQgPSBBY3RvckV2ZW50SWRzLklURU1fRU5USVRZX01FUkdFO1xuICAgIHBhY2tldC5ldmVudERhdGEgPSB0aGlzLml0ZW1TdGFjay5hbW91bnQ7XG4gICAgcGFja2V0LmFjdG9yUnVudGltZUlkID0gdGhpcy5lbnRpdHkucnVudGltZUlkO1xuXG4gICAgdGhpcy5lbnRpdHkuZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuICB9XG5cbiAgcHVibGljIG9uVGljaygpOiB2b2lkIHtcbiAgICAvLyBTZXQgdGhlIGl0ZW0gc3RhY2sgY29tcG9uZW50IG9mIHRoZSBlbnRpdHlcbiAgICB0aGlzLmVudGl0eS5jb21wb25lbnRzLnNldChcIml0ZW1zdGFja1wiLCB0aGlzLml0ZW1TdGFjay5nZXREYXRhRW50cnkoKSk7XG5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdGlja1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmVudGl0eS5kaW1lbnNpb24ud29ybGQuY3VycmVudFRpY2s7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpcyBvbiB0aGUgZ3JvdW5kIGFuZCB0aGUgY3VycmVudCB0aWNrIGlzIGEgbXVsdGlwbGUgb2YgMjVcbiAgICBpZiAoXG4gICAgICB0aGlzLmVudGl0eS5vbkdyb3VuZCAmJlxuICAgICAgdGhpcy5lbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrICUgMjVuID09PSAwbiAmJlxuICAgICAgdGhpcy5waWNrdXBUaWNrID09PSBudWxsXG4gICAgKSB7XG4gICAgICAvLyBHZXQgYWxsIHRoZSBpdGVtIGVudGl0aWVzIGluIHRoZSBkaW1lbnNpb25cbiAgICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5lbnRpdHkuZGltZW5zaW9uXG4gICAgICAgIC5nZXRFbnRpdGllcygpXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguaXNJdGVtKCkpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIGV4aXN0aW5nIGl0ZW0gc3RhY2sgbmVhcmJ5IHdpdGhpbiBhIDAuNSBibG9jayByYWRpdXNcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBlbnRpdHldIG9mIGVudGl0aWVzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyBDb250aW51ZSBpZiB0aGUgaXRlbSBpcyBiZWluZyBtZXJnZWRcbiAgICAgICAgaWYgKHRoaXMubWVyZ2luZyAmJiBpbmRleCAhPT0gZW50aXRpZXMubGVuZ3RoIC0gMSkgY29udGludWU7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIGlzIGJlaW5nIG1lcmdlZCBhbmQgdGhlIGVudGl0eSBpcyB0aGUgbGFzdCBpdGVtXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubWVyZ2luZyAmJiBpbmRleCA9PT0gZW50aXRpZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAvLyBTZXQgbWVyZ2luZyB0byBmYWxzZSBhcyBpdHMgZG9uZVxuICAgICAgICAgIHRoaXMubWVyZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgdGhlIHNhbWUgYXMgdGhlIGl0ZW1cbiAgICAgICAgaWYgKGVudGl0eSA9PT0gdGhpcy5lbnRpdHkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgZW50aXRpZXNcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBlbnRpdHkucG9zaXRpb24uc3VidHJhY3QodGhpcy5lbnRpdHkucG9zaXRpb24pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBkaXN0YW5jZSBpcyBsZXNzIHRoYW4gMC41IGJsb2Nrc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UueCkgPD0gMC45ICYmXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UueSkgPD0gMC45ICYmXG4gICAgICAgICAgTWF0aC5hYnMoZGlzdGFuY2UueikgPD0gMC45XG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEdldCB0aGUgaXRlbSBjb21wb25lbnQgb2YgdGhlIGVudGl0eVxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGVudGl0eS5nZXRUcmFpdChFbnRpdHlJdGVtU3RhY2tUcmFpdCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJdGVtID0gY29tcG9uZW50Lml0ZW1TdGFjaztcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBleGlzdGluZyBpdGVtIHN0YWNrIGlzIGZ1bGxcbiAgICAgICAgICBpZiAoZXhpc3RpbmdJdGVtLmFtb3VudCA+PSBleGlzdGluZ0l0ZW0ubWF4QW1vdW50KSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpdGVtIHN0YWNrcyBhcmUgdGhlIHNhbWVcbiAgICAgICAgICBpZiAoIWV4aXN0aW5nSXRlbS5lcXVhbHModGhpcy5pdGVtU3RhY2spKSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIEluY3JlbWVudCB0aGUgaXRlbSBzdGFjayBhbmQgZGVzcGF3biB0aGUgZXhpc3RpbmcgaXRlbVxuICAgICAgICAgIHRoaXMuaW5jcmVtZW50KGV4aXN0aW5nSXRlbS5hbW91bnQpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbnRpdHkuZGVzcGF3bigpO1xuXG4gICAgICAgICAgLy8gU2V0IG1lcmdpbmcgdG8gdHJ1ZVxuICAgICAgICAgIHRoaXMubWVyZ2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHRhcmdldCBwbGF5ZXJcbiAgICBpZiAoXG4gICAgICB0aGlzLnRhcmdldCAmJiAvLyBDaGVjayBpZiB0aGUgcGlja3VwIHRpY2sgaXMgbm90IG51bGxcbiAgICAgIHRoaXMucGlja3VwVGljayAmJiAvLyBDaGVjayBpZiB0aGUgY3VycmVudCB0aWNrIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGlja3VwIHRpY2tcbiAgICAgIGN1cnJlbnQgLSB0aGlzLnBpY2t1cFRpY2sgPj0gNW5cbiAgICApIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyB0YWtlIGl0ZW0gYWN0b3IgcGFja2V0XG4gICAgICBjb25zdCB0YWtlID0gbmV3IFRha2VJdGVtQWN0b3JQYWNrZXQoKTtcbiAgICAgIHRha2UuaXRlbVJ1bnRpbWVJZCA9IHRoaXMuZW50aXR5LnJ1bnRpbWVJZDtcbiAgICAgIHRha2UudGFyZ2V0UnVudGltZUlkID0gdGhpcy50YXJnZXQucnVudGltZUlkO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgbGV2ZWwgc291bmQgZXZlbnQgcGFja2V0XG4gICAgICBjb25zdCBzb3VuZCA9IG5ldyBMZXZlbFNvdW5kRXZlbnRQYWNrZXQoKTtcbiAgICAgIHNvdW5kLmV2ZW50ID0gTGV2ZWxTb3VuZEV2ZW50LlBvcDtcbiAgICAgIHNvdW5kLnBvc2l0aW9uID0gdGhpcy50YXJnZXQucG9zaXRpb247XG4gICAgICBzb3VuZC5hY3RvcklkZW50aWZpZXIgPSB0aGlzLmVudGl0eS50eXBlLmlkZW50aWZpZXI7XG4gICAgICBzb3VuZC5kYXRhID0gLTE7XG4gICAgICBzb3VuZC5pc0JhYnlNb2IgPSBmYWxzZTtcbiAgICAgIHNvdW5kLmlzR2xvYmFsID0gZmFsc2U7XG5cbiAgICAgIC8vIFNlbmQgdGhlIHBhY2tldHMgdG8gdGhlIHBsYXllclxuICAgICAgdGhpcy50YXJnZXQuc2VuZChzb3VuZCk7XG4gICAgICB0aGlzLnRhcmdldC5kaW1lbnNpb24uYnJvYWRjYXN0KHRha2UpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsYXllcnMgaW52ZW50b3J5IGNvbXBvbmVudFxuICAgICAgY29uc3QgaW52ZW50b3J5ID0gdGhpcy50YXJnZXQuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgICAvLyBBZGQgdGhlIGl0ZW0gdG8gdGhlIHBsYXllcnMgaW52ZW50b3J5XG4gICAgICBpbnZlbnRvcnkuY29udGFpbmVyLmFkZEl0ZW0odGhpcy5pdGVtU3RhY2spO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgZGltZW5zaW9uXG4gICAgICB0aGlzLmVudGl0eS5kZXNwYXduKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnRhcmdldCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaGFzIGJlZW4gYWxpdmUgZm9yIDEwIHRpY2tzXG4gICAgLy8gVGhpcyBpcyB0byBwcmV2ZW50IHRoZSBpdGVtIGZyb20gYmVpbmcgcGlja2VkIHVwIGltbWVkaWF0ZWx5XG4gICAgaWYgKGN1cnJlbnQgLSB0aGlzLmJpcnRoVGljayA8PSAxMG4pIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHRpY2sgaXMgYSBtdWx0aXBsZSBvZiA1XG4gICAgaWYgKGN1cnJlbnQgJSA1biAhPT0gMG4pIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcGxheWVyIG5lYXJieSB3aXRoaW4gYSAxIGJsb2NrIHJhZGl1c1xuICAgIGNvbnN0IHBsYXllcnMgPSB0aGlzLmVudGl0eS5kaW1lbnNpb24uZ2V0UGxheWVycygpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVudGl0eS5wb3NpdGlvbjtcblxuICAgIC8vIENoZWNrIGlmIGEgcGxheWVyIGlzIHdpdGhpbiBhIDEgYmxvY2sgcmFkaXVzXG4gICAgZm9yIChjb25zdCBwbGF5ZXIgb2YgcGxheWVycykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBhbGl2ZVxuICAgICAgaWYgKCFwbGF5ZXIuaXNBbGl2ZSkgY29udGludWU7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxheWVyIGFuZCB0aGUgaXRlbVxuICAgICAgY29uc3QgcGxheWVyUG9zID0gcGxheWVyLnBvc2l0aW9uO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBwbGF5ZXJQb3Muc3VidHJhY3QoaXRlbSk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGxheWVyIGFuZCB0aGUgaXRlbVxuICAgICAgaWYgKFxuICAgICAgICBNYXRoLmFicyhkaXN0YW5jZS54KSA8PSAxICYmXG4gICAgICAgIE1hdGguYWJzKGRpc3RhbmNlLnkgLSAxKSA8PSAxICYmXG4gICAgICAgIE1hdGguYWJzKGRpc3RhbmNlLnopIDw9IDFcbiAgICAgICkge1xuICAgICAgICAvLyBTZXQgdGhlIHBsYXllciBhcyB0aGUgdGFyZ2V0XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gcGxheWVyO1xuXG4gICAgICAgIC8vIFNldCB0aGUgcGlja3VwIHRpY2tcbiAgICAgICAgdGhpcy5waWNrdXBUaWNrID0gY3VycmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBoYXMgYmVlbiBhbGl2ZSBmb3IgdGhlIGxpZmVzcGFuXG4gICAgaWYgKGN1cnJlbnQgLSB0aGlzLmJpcnRoVGljayA+PSBCaWdJbnQodGhpcy5saWZlU3BhbikpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSBkaW1lbnNpb25cbiAgICAgIHRoaXMuZW50aXR5LmRlc3Bhd24oKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5SXRlbVN0YWNrVHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBQbGF5ZXJMaXN0QWN0aW9uLFxuICBQbGF5ZXJMaXN0UGFja2V0LFxuICBQbGF5ZXJMaXN0UmVjb3JkXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IFBsYXllclRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgUGxheWVyTGlzdFRyYWl0IGV4dGVuZHMgUGxheWVyVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsYXllcl9saXN0XCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXJzIHRoYXQgYXJlIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgcGxheWVyIGxpc3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHBsYXllciBsaXN0LlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBhbGwgdGhlIHBsYXllcnMgZnJvbSB0aGUgcGxheWVyIGxpc3RcbiAgICBjb25zdCByZW1vdmUgPSBuZXcgUGxheWVyTGlzdFBhY2tldCgpO1xuICAgIHJlbW92ZS5hY3Rpb24gPSBQbGF5ZXJMaXN0QWN0aW9uLlJlbW92ZTtcbiAgICByZW1vdmUucmVjb3JkcyA9IFsuLi50aGlzLnBsYXllcnNdLm1hcChcbiAgICAgICh1dWlkKSA9PiBuZXcgUGxheWVyTGlzdFJlY29yZCh1dWlkKVxuICAgICk7XG5cbiAgICAvLyBDbGVhciB0aGUgcGxheWVyIGxpc3RcbiAgICB0aGlzLnBsYXllcnMuY2xlYXIoKTtcblxuICAgIC8vIFNlbmQgdGhlIHJlbW92ZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgIHRoaXMucGxheWVyLnNlbmQocmVtb3ZlKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBzcGF3bmVkXG4gICAgaWYgKCF0aGlzLnBsYXllci5pc0FsaXZlKSByZXR1cm47XG5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdGljayBvZiB0aGUgd29ybGRcbiAgICBjb25zdCBjdXJyZW50VGljayA9IHRoaXMucGxheWVyLmRpbWVuc2lvbi53b3JsZC5jdXJyZW50VGljaztcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHRpY2sgaXMgZGl2aXNpYmxlIGJ5IDIwXG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGlzIHJ1bm5pbmcgZXZlcnkgdGlja1xuICAgIGlmIChjdXJyZW50VGljayAlIDIwbiAhPT0gMG4pIHJldHVybjtcblxuICAgIC8vIEdldCBhbGwgdGhlIHBsYXllcnMgaW4gdGhlIHBsYXllcidzIHdvcmxkXG4gICAgY29uc3QgcGxheWVycyA9IHRoaXMucGxheWVyLmRpbWVuc2lvbi53b3JsZC5nZXRQbGF5ZXJzKCk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IHRoZSBwbGF5ZXJzIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIHBsYXllciBsaXN0ICYgaWYgdGhlIHBsYXllciBpcyBzcGF3bmVkXG4gICAgY29uc3QgYWRkaW5nID0gcGxheWVycy5maWx0ZXIoXG4gICAgICAocGxheWVyKSA9PiAhdGhpcy5wbGF5ZXJzLmhhcyhwbGF5ZXIudXVpZCkgJiYgcGxheWVyLmlzQWxpdmVcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHBsYXllciBsaXN0IHBhY2tldCBmb3IgdGhlIHBsYXllcnMgdGhhdCBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSBwbGF5ZXIgbGlzdFxuICAgIGNvbnN0IGFkZCA9IG5ldyBQbGF5ZXJMaXN0UGFja2V0KCk7XG4gICAgYWRkLmFjdGlvbiA9IFBsYXllckxpc3RBY3Rpb24uQWRkO1xuICAgIGFkZC5yZWNvcmRzID0gYWRkaW5nLm1hcCgocGxheWVyKSA9PiAoe1xuICAgICAgdW5pcXVlSWQ6IHBsYXllci51bmlxdWVJZCxcbiAgICAgIHV1aWQ6IHBsYXllci51dWlkLFxuICAgICAgeHVpZDogcGxheWVyLnh1aWQsXG4gICAgICB1c2VybmFtZTogcGxheWVyLnVzZXJuYW1lLFxuICAgICAgc2tpbjogcGxheWVyLnNraW4sXG4gICAgICBwbGF0Zm9ybUJ1aWxkOiAwLCAvLyBUT0RPOiBHZXQgdGhlIHBsYXRmb3JtIGJ1aWxkIGZyb20gdGhlIHBsYXllclxuICAgICAgcGxhdGZvcm1DaGF0SWRlbnRpZmllcjogXCJcIixcbiAgICAgIGlzSG9zdDogZmFsc2UsXG4gICAgICBpc1Zpc2l0b3I6IGZhbHNlLFxuICAgICAgaXNUZWFjaGVyOiBmYWxzZVxuICAgIH0pKTtcblxuICAgIC8vIEZpbHRlciBvdXQgdGhlIHBsYXllcnMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcGxheWVyIGxpc3RcbiAgICBjb25zdCByZW1vdmluZyA9IFsuLi50aGlzLnBsYXllcnNdLmZpbHRlcihcbiAgICAgICh1dWlkKSA9PiAhcGxheWVycy5zb21lKCh4KSA9PiB4LnV1aWQgPT09IHV1aWQpXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBwbGF5ZXIgbGlzdCBwYWNrZXQgZm9yIHRoZSBwbGF5ZXJzIHRoYXQgbmVlZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIHBsYXllciBsaXN0XG4gICAgY29uc3QgcmVtb3ZlID0gbmV3IFBsYXllckxpc3RQYWNrZXQoKTtcbiAgICByZW1vdmUuYWN0aW9uID0gUGxheWVyTGlzdEFjdGlvbi5SZW1vdmU7XG4gICAgcmVtb3ZlLnJlY29yZHMgPSByZW1vdmluZy5tYXAoKHV1aWQpID0+IG5ldyBQbGF5ZXJMaXN0UmVjb3JkKHV1aWQpKTtcblxuICAgIC8vIFNlbmQgdGhlIHBsYXllciBsaXN0IHBhY2tldHMgdG8gdGhlIHBsYXllclxuICAgIGlmIChhZGQucmVjb3Jkcy5sZW5ndGggPiAwKSB0aGlzLnBsYXllci5zZW5kKGFkZCk7XG4gICAgaWYgKHJlbW92ZS5yZWNvcmRzLmxlbmd0aCA+IDApIHRoaXMucGxheWVyLnNlbmQocmVtb3ZlKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgcGxheWVyIGxpc3RcbiAgICBmb3IgKGNvbnN0IHBsYXllciBvZiBhZGRpbmcpIHtcbiAgICAgIC8vIEFkZCB0aGUgcGxheWVyIHRvIHRoZSBwbGF5ZXIgbGlzdFxuICAgICAgdGhpcy5wbGF5ZXJzLmFkZChwbGF5ZXIudXVpZCk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgcGxheWVyJ3MgbWV0YWRhdGEgYW5kIGFiaWxpdGllc1xuICAgICAgcGxheWVyLm1ldGFkYXRhLnVwZGF0ZSgpO1xuICAgICAgcGxheWVyLmFiaWxpdGllcy51cGRhdGUoKTtcbiAgICAgIHBsYXllci5hYmlsaXRpZXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBwbGF5ZXIgbGlzdFxuICAgIGZvciAoY29uc3QgdXVpZCBvZiByZW1vdmluZykgdGhpcy5wbGF5ZXJzLmRlbGV0ZSh1dWlkKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkRlc3Bhd24oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIHBsYXllciBsaXN0XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllckxpc3RUcmFpdCB9O1xuIiwgImltcG9ydCB7IENvbnRhaW5lcklkLCBDb250YWluZXJUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eUNvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9jb250YWluZXJcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi8uLi9wbGF5ZXJcIjtcblxuaW1wb3J0IHsgUGxheWVyVHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5jbGFzcyBQbGF5ZXJDdXJzb3JUcmFpdCBleHRlbmRzIFBsYXllclRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJjdXJzb3JcIjtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW0VudGl0eUlkZW50aWZpZXIuUGxheWVyXTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lciB0aGF0IGhvbGRzIHRoZSBpbnZlbnRvcnkgaXRlbXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyOiBFbnRpdHlDb250YWluZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGNvbnRhaW5lciB0aGF0IHRoaXMgdHJhaXQgcmVwcmVzZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJUeXBlOiBDb250YWluZXJUeXBlID0gQ29udGFpbmVyVHlwZS5JbnZlbnRvcnk7XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb250YWluZXIgdGhhdCB0aGlzIHRyYWl0IHJlcHJlc2VudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVySWQ6IENvbnRhaW5lcklkID0gQ29udGFpbmVySWQuVWk7XG5cbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2Ygc2xvdHMgaW4gdGhlIGludmVudG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnZlbnRvcnlTaXplOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0ZWQgc2xvdCBpbiB0aGUgaW52ZW50b3J5LlxuICAgKi9cbiAgcHVibGljIHNlbGVjdGVkU2xvdDogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIpIHtcbiAgICBzdXBlcihwbGF5ZXIpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGNvbnRhaW5lclxuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IEVudGl0eUNvbnRhaW5lcihcbiAgICAgIHBsYXllcixcbiAgICAgIHRoaXMuY29udGFpbmVyVHlwZSxcbiAgICAgIHRoaXMuY29udGFpbmVySWQsXG4gICAgICB0aGlzLmludmVudG9yeVNpemVcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllckN1cnNvclRyYWl0IH07XG4iLCAiaW1wb3J0IHsgQXR0cmlidXRlTmFtZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBFbnRpdHlBdHRyaWJ1dGVUcmFpdCB9IGZyb20gXCIuLi9hdHRyaWJ1dGVcIjtcblxuY2xhc3MgUGxheWVyU2F0dXJhdGlvblRyYWl0IGV4dGVuZHMgRW50aXR5QXR0cmlidXRlVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInNhdHVyYXRpb25cIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgcHVibGljIGF0dHJpYnV0ZTogQXR0cmlidXRlTmFtZSA9IEF0dHJpYnV0ZU5hbWUuUGxheWVyU2F0dXJhdGlvbjtcbiAgcHVibGljIGVmZmVjdGl2ZU1heDogbnVtYmVyID0gMjA7XG4gIHB1YmxpYyBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDIwO1xuICBwdWJsaWMgZWZmZWN0aXZlTWluOiBudW1iZXIgPSAwO1xufVxuXG5leHBvcnQgeyBQbGF5ZXJTYXR1cmF0aW9uVHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBBY3RvckRhbWFnZUNhdXNlLFxuICBBdHRyaWJ1dGVOYW1lLFxuICBHYW1lbW9kZVxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgRW50aXR5QXR0cmlidXRlVHJhaXQsIEVudGl0eUhlYWx0aFRyYWl0IH0gZnJvbSBcIi4uL2F0dHJpYnV0ZVwiO1xuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eVwiO1xuXG5pbXBvcnQgeyBQbGF5ZXJFeGhhdXN0aW9uVHJhaXQgfSBmcm9tIFwiLi9leGhhdXN0aW9uXCI7XG5pbXBvcnQgeyBQbGF5ZXJTYXR1cmF0aW9uVHJhaXQgfSBmcm9tIFwiLi9zYXR1cmF0aW9uXCI7XG5cbmNsYXNzIFBsYXllckh1bmdlclRyYWl0IGV4dGVuZHMgRW50aXR5QXR0cmlidXRlVHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImh1bmdlclwiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxFbnRpdHlJZGVudGlmaWVyPiA9IFtcbiAgICBFbnRpdHlJZGVudGlmaWVyLlBsYXllclxuICBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhcnZlYWJsZUdhbWVtb2RlcyA9IFtcbiAgICBHYW1lbW9kZS5BZHZlbnR1cmUsXG4gICAgR2FtZW1vZGUuU3Vydml2YWxcbiAgXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZWZmZWN0aXZlTWF4OiBudW1iZXIgPSAyMDtcbiAgcHVibGljIHJlYWRvbmx5IGVmZmVjdGl2ZU1pbjogbnVtYmVyID0gMDtcbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogbnVtYmVyID0gMjA7XG4gIHB1YmxpYyByZWFkb25seSBhdHRyaWJ1dGU6IEF0dHJpYnV0ZU5hbWUgPSBBdHRyaWJ1dGVOYW1lLlBsYXllckh1bmdlcjtcblxuICBwcml2YXRlIGV4aGF1c3Rpb25UcmFpdD86IFBsYXllckV4aGF1c3Rpb25UcmFpdDtcbiAgcHJpdmF0ZSBzYXR1cmF0aW9uVHJhaXQ/OiBQbGF5ZXJTYXR1cmF0aW9uVHJhaXQ7XG4gIHByaXZhdGUgdGltZXI6IG51bWJlciA9IDA7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudGl0eTogRW50aXR5KSB7XG4gICAgc3VwZXIoZW50aXR5KTtcbiAgICBpZiAoIWVudGl0eS5pc1BsYXllcigpKSBlbnRpdHkucmVtb3ZlVHJhaXQoUGxheWVySHVuZ2VyVHJhaXQpO1xuICB9XG5cbiAgcHVibGljIG9uVGljaygpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5lbnRpdHkuaXNBbGl2ZSB8fFxuICAgICAgIXRoaXMuZW50aXR5LmlzUGxheWVyKCkgfHxcbiAgICAgICF0aGlzLnN0YXJ2ZWFibGVHYW1lbW9kZXMuaW5jbHVkZXModGhpcy5lbnRpdHkuZ2FtZW1vZGUpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHBsYXllckhlYWx0aFRyYWl0ID0gdGhpcy5lbnRpdHkuZ2V0VHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpO1xuXG4gICAgdGhpcy50aW1lcisrO1xuXG4gICAgaWYgKHRoaXMudGltZXIgPj0gODApIHRoaXMudGltZXIgPSAwO1xuICAgIGlmICh0aGlzLnRpbWVyID09IDApIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPj0gMTggJiZcbiAgICAgICAgcGxheWVySGVhbHRoVHJhaXQuY3VycmVudFZhbHVlIDwgcGxheWVySGVhbHRoVHJhaXQuZWZmZWN0aXZlTWF4XG4gICAgICApIHtcbiAgICAgICAgcGxheWVySGVhbHRoVHJhaXQuc2V0KHBsYXllckhlYWx0aFRyYWl0LmN1cnJlbnRWYWx1ZSArIDEpO1xuICAgICAgICB0aGlzLmV4aGF1c3QoNik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZhbHVlIDw9IDApIHtcbiAgICAgICAgcGxheWVySGVhbHRoVHJhaXQuYXBwbHlEYW1hZ2UoMSwgdW5kZWZpbmVkLCBBY3RvckRhbWFnZUNhdXNlLlN0YXJ2ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU3Bhd24oKTogdm9pZCB7XG4gICAgdGhpcy5leGhhdXN0aW9uVHJhaXQgPSB0aGlzLmVudGl0eS5nZXRUcmFpdChQbGF5ZXJFeGhhdXN0aW9uVHJhaXQpO1xuICAgIHRoaXMuc2F0dXJhdGlvblRyYWl0ID0gdGhpcy5lbnRpdHkuZ2V0VHJhaXQoUGxheWVyU2F0dXJhdGlvblRyYWl0KTtcblxuICAgIGlmICghdGhpcy5leGhhdXN0aW9uVHJhaXQgfHwgIXRoaXMuc2F0dXJhdGlvblRyYWl0KVxuICAgICAgdGhpcy5lbnRpdHkucmVtb3ZlVHJhaXQoUGxheWVySHVuZ2VyVHJhaXQpO1xuICB9XG5cbiAgcHVibGljIGV4aGF1c3QoYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2F0dXJhdGlvblRyYWl0IHx8ICF0aGlzLmV4aGF1c3Rpb25UcmFpdCkgcmV0dXJuO1xuICAgIHRoaXMuZXhoYXVzdGlvblRyYWl0LmluY3JlYXNlKGFtb3VudCk7XG5cbiAgICB3aGlsZSAodGhpcy5leGhhdXN0aW9uVHJhaXQuY3VycmVudFZhbHVlID49IDQpIHtcbiAgICAgIHRoaXMuZXhoYXVzdGlvblRyYWl0LmRlY3JlYXNlKDQpO1xuXG4gICAgICBpZiAodGhpcy5zYXR1cmF0aW9uVHJhaXQuY3VycmVudFZhbHVlID4gMCkge1xuICAgICAgICB0aGlzLnNhdHVyYXRpb25UcmFpdC5zZXQoXG4gICAgICAgICAgTWF0aC5tYXgoMCwgdGhpcy5zYXR1cmF0aW9uVHJhaXQuY3VycmVudFZhbHVlIC0gMSlcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jdXJyZW50VmFsdWUgPiAwKSB0aGlzLmN1cnJlbnRWYWx1ZS0tO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0h1bmdyeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWUgPCB0aGlzLmVmZmVjdGl2ZU1heDtcbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJIdW5nZXJUcmFpdCB9O1xuIiwgImltcG9ydCB7IEF0dHJpYnV0ZU5hbWUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgRW50aXR5QXR0cmlidXRlVHJhaXQgfSBmcm9tIFwiLi4vYXR0cmlidXRlXCI7XG5cbmNsYXNzIFBsYXllckV4aGF1c3Rpb25UcmFpdCBleHRlbmRzIEVudGl0eUF0dHJpYnV0ZVRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJleGhhdXN0aW9uXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIHB1YmxpYyBhdHRyaWJ1dGU6IEF0dHJpYnV0ZU5hbWUgPSBBdHRyaWJ1dGVOYW1lLlBsYXllckV4aGF1c3Rpb247XG4gIHB1YmxpYyBlZmZlY3RpdmVNYXg6IG51bWJlciA9IDU7XG4gIHB1YmxpYyBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBlZmZlY3RpdmVNaW46IG51bWJlciA9IDA7XG59XG5cbmV4cG9ydCB7IFBsYXllckV4aGF1c3Rpb25UcmFpdCB9O1xuIiwgImltcG9ydCB7IEFjdG9yRmxhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEVudGl0eVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgRW50aXR5R3Jhdml0eVRyYWl0IGV4dGVuZHMgRW50aXR5VHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcImdyYXZpdHlcIjtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW0VudGl0eUlkZW50aWZpZXIuUGxheWVyXTtcblxuICBwdWJsaWMgb25TcGF3bigpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIG1ldGFkYXRhIGZsYWcgdmFsdWUgZm9yIGdyYXZpdHlcbiAgICBpZiAoIXRoaXMuZW50aXR5LmZsYWdzLmhhcyhBY3RvckZsYWcuSGFzR3Jhdml0eSkpIHtcbiAgICAgIC8vIFNldCB0aGUgZW50aXR5IGZsYWcgZm9yIGdyYXZpdHlcbiAgICAgIHRoaXMuZW50aXR5LmZsYWdzLnNldChBY3RvckZsYWcuSGFzR3Jhdml0eSwgdHJ1ZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUdyYXZpdHlUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIEFjdG9yRGF0YUlkLFxuICBBY3RvckRhdGFUeXBlLFxuICBBY3RvckZsYWcsXG4gIERhdGFJdGVtLFxuICBHYW1lbW9kZVxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBFbnRpdHlUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEVudGl0eUNvbGxpc2lvbiBleHRlbmRzIEVudGl0eVRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJjb2xsaXNpb25cIjtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW0VudGl0eUlkZW50aWZpZXIuUGxheWVyXTtcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgZW50aXR5IGNvbGxpc2lvbiBib3guXG4gICAqL1xuICBwdWJsaWMgaGVpZ2h0OiBudW1iZXIgPSAxLjc7XG5cbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgZW50aXR5IGNvbGxpc2lvbiBib3guXG4gICAqL1xuICBwdWJsaWMgd2lkdGg6IG51bWJlciA9IDAuNjtcblxuICBwdWJsaWMgb25TcGF3bigpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIG1ldGFkYXRhIGZsYWcgdmFsdWUgZm9yIGdyYXZpdHlcbiAgICBpZiAoIXRoaXMuZW50aXR5LmZsYWdzLmhhcyhBY3RvckZsYWcuSGFzQ29sbGlzaW9uKSkge1xuICAgICAgLy8gU2V0IHRoZSBlbnRpdHkgZmxhZyBmb3IgZ3Jhdml0eVxuICAgICAgdGhpcy5lbnRpdHkuZmxhZ3Muc2V0KEFjdG9yRmxhZy5IYXNDb2xsaXNpb24sIHRydWUpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaGFzIGEgbWV0YWRhdGEgdmFsdWUgZm9yIGNvbGxpc2lvbiBoZWlnaHRcbiAgICBpZiAoIXRoaXMuZW50aXR5Lm1ldGFkYXRhLmhhcyhBY3RvckRhdGFJZC5SZXNlcnZlZDA1NCkpIHtcbiAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBoZWlnaHQgdmFsdWVcbiAgICAgIHRoaXMuc2V0SGVpZ2h0KHRoaXMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIG1ldGFkYXRhIHZhbHVlIGZvciBjb2xsaXNpb24gd2lkdGhcbiAgICBpZiAoIXRoaXMuZW50aXR5Lm1ldGFkYXRhLmhhcyhBY3RvckRhdGFJZC5SZXNlcnZlZDA1MykpIHtcbiAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCB3aWR0aCB2YWx1ZVxuICAgICAgdGhpcy5zZXRXaWR0aCh0aGlzLndpZHRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25HYW1lbW9kZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIG5vdCBhIHBsYXllclxuICAgIGlmICghdGhpcy5lbnRpdHkuaXNQbGF5ZXIoKSkgcmV0dXJuO1xuXG4gICAgLy8gSWYgdGhlIHBsYXllciBpcyBub3cgaW4gc3BlY3RhdG9yIG1vZGUsIGNvbGxpc2lvbiBzaG91bGQgYmUgZGlzYWJsZWRcbiAgICBpZiAodGhpcy5lbnRpdHkuZ2FtZW1vZGUgPT09IEdhbWVtb2RlLlNwZWN0YXRvcilcbiAgICAgIHRoaXMuZW50aXR5LmZsYWdzLnNldChBY3RvckZsYWcuSGFzQ29sbGlzaW9uLCBmYWxzZSk7XG4gICAgLy8gSWYgdGhlIHBsYXllciBpcyBub3QgaW4gc3BlY3RhdG9yIG1vZGUsIGNvbGxpc2lvbiBzaG91bGQgYmUgZW5hYmxlZFxuICAgIGVsc2UgdGhpcy5lbnRpdHkuZmxhZ3Muc2V0KEFjdG9yRmxhZy5IYXNDb2xsaXNpb24sIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgZW50aXR5IGNvbGxpc2lvbiBib3guXG4gICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgZW50aXR5IGNvbGxpc2lvbiBib3guXG4gICAqL1xuICBwdWJsaWMgc2V0SGVpZ2h0KGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IERhdGFJdGVtIG9iamVjdFxuICAgIGNvbnN0IGRhdGEgPSBuZXcgRGF0YUl0ZW0oXG4gICAgICBBY3RvckRhdGFJZC5SZXNlcnZlZDA1NCxcbiAgICAgIEFjdG9yRGF0YVR5cGUuRmxvYXQsXG4gICAgICBoZWlnaHRcbiAgICApO1xuXG4gICAgLy8gU2V0IHRoZSBlbnRpdHkgY29sbGlzaW9uIGhlaWdodFxuICAgIHRoaXMuZW50aXR5Lm1ldGFkYXRhLnNldChBY3RvckRhdGFJZC5SZXNlcnZlZDA1NCwgZGF0YSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGhlaWdodCB2YWx1ZVxuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBlbnRpdHkgY29sbGlzaW9uIGJveC5cbiAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgZW50aXR5IGNvbGxpc2lvbiBib3guXG4gICAqL1xuICBwdWJsaWMgc2V0V2lkdGgod2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBEYXRhSXRlbSBvYmplY3RcbiAgICBjb25zdCBkYXRhID0gbmV3IERhdGFJdGVtKFxuICAgICAgQWN0b3JEYXRhSWQuUmVzZXJ2ZWQwNTMsXG4gICAgICBBY3RvckRhdGFUeXBlLkZsb2F0LFxuICAgICAgd2lkdGhcbiAgICApO1xuXG4gICAgLy8gU2V0IHRoZSBlbnRpdHkgY29sbGlzaW9uIHdpZHRoXG4gICAgdGhpcy5lbnRpdHkubWV0YWRhdGEuc2V0KEFjdG9yRGF0YUlkLlJlc2VydmVkMDUzLCBkYXRhKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgd2lkdGggdmFsdWVcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5Q29sbGlzaW9uIH07XG4iLCAiaW1wb3J0IHtcbiAgQWN0b3JEYW1hZ2VDYXVzZSxcbiAgQWN0b3JEYXRhSWQsXG4gIEFjdG9yRGF0YVR5cGUsXG4gIEFjdG9yRmxhZyxcbiAgRGF0YUl0ZW0sXG4gIEVmZmVjdFR5cGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRW50aXR5VHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuaW1wb3J0IHsgRW50aXR5SGVhbHRoVHJhaXQgfSBmcm9tIFwiLi9hdHRyaWJ1dGVcIjtcblxuY2xhc3MgRW50aXR5QWlyU3VwcGx5VHJhaXQgZXh0ZW5kcyBFbnRpdHlUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiYWlyX3N1cHBseVwiO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZXMgPSBbRW50aXR5SWRlbnRpZmllci5QbGF5ZXJdO1xuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBub3QgYWxpdmUgb3IgaXMgbm90IGJyZWF0aGluZy5cbiAgICBpZiAoIXRoaXMuZW50aXR5LmlzQWxpdmUgfHwgIXRoaXMuZW50aXR5LmZsYWdzLmdldChBY3RvckZsYWcuQnJlYXRoaW5nKSlcbiAgICAgIHJldHVybjtcblxuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgYSBwbGF5ZXIgYW5kIGlzIGluIGEgbm90IGRyb3duYWJsZSBnYW1lbW9kZS5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgYWlyIHRpY2tzIG9mIHRoZSBlbnRpdHkuXG4gICAgY29uc3QgY3VycmVudEFpclRpY2tzID0gdGhpcy5nZXRBaXJTdXBwbHlUaWNrcygpO1xuICAgIGlmICghdGhpcy5jYW5CcmVhdGhlKCkpIHtcbiAgICAgIC8vIFRoZSBhaXIgc3VwcGx5IGlzIHJlZHVjZWQgYnkgMSB0aWNrLlxuICAgICAgLy8gSWYgdGhlIGVudGl0eSBhaXIgc3VwcGx5IHJlYWNoZXMgLTIwLCBpdCBzdGFydHMgZHJvd25pbmdcblxuICAgICAgdGhpcy5zZXRBaXJTdXBwbHlUaWNrcyhjdXJyZW50QWlyVGlja3MgLSAxKTtcbiAgICAgIGlmIChjdXJyZW50QWlyVGlja3MgPiAtMjApIHJldHVybjtcbiAgICAgIC8vIFJlc2V0IHRoZSBhaXIgc3VwcGx5IHRvIDAuXG4gICAgICB0aGlzLnNldEFpclN1cHBseVRpY2tzKDApO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIGhlYWx0aCB0cmFpdC5cbiAgICAgIC8vIElmIHRoZSBlbnRpdHkgaGFzIGEgaGVhbHRoIHRyYWl0LCBhcHBseSBkYW1hZ2UgdG8gdGhlIGVudGl0eS5cbiAgICAgIGlmICghdGhpcy5lbnRpdHkuaGFzVHJhaXQoRW50aXR5SGVhbHRoVHJhaXQpKSByZXR1cm47XG5cbiAgICAgIC8vIEdldCB0aGUgaGVhbHRoIHRyYWl0IG9mIHRoZSBlbnRpdHkuXG4gICAgICBjb25zdCBoZWFsdGggPSB0aGlzLmVudGl0eS5nZXRUcmFpdChFbnRpdHlIZWFsdGhUcmFpdCk7XG5cbiAgICAgIC8vIEFwcGx5IGRhbWFnZSB0byB0aGUgZW50aXR5IGJhc2VkIG9uIHRoZSBlbnRpdHkncyBjdXJyZW50IHN0YXRlLlxuICAgICAgaGVhbHRoLmFwcGx5RGFtYWdlKFxuICAgICAgICAwLjUsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5lbnRpdHkuaXNTd2ltbWluZ1xuICAgICAgICAgID8gQWN0b3JEYW1hZ2VDYXVzZS5Ecm93bmluZ1xuICAgICAgICAgIDogQWN0b3JEYW1hZ2VDYXVzZS5TdWZmb2NhdGlvblxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgZW50aXR5IGFpciBzdXBwbHkgaXMgZnVsbCB0aGVuIHJldHVybi5cbiAgICBpZiAoY3VycmVudEFpclRpY2tzID49IDMwMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0QWlyU3VwcGx5VGlja3MoY3VycmVudEFpclRpY2tzICsgNSk7XG4gICAgLy8gVGhlIGVudGl0eSBjYW4gYnJlYXRoZSwgc28gd2UgbmVlZCB0byBpbmNyZW1lbnQgdGhlIGFpciBzdXBwbHkuXG4gIH1cblxuICBwcml2YXRlIGNhbkJyZWF0aGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmxvY2tBdEhlYWQgPSB0aGlzLmVudGl0eS5kaW1lbnNpb24uZ2V0QmxvY2soXG4gICAgICB0aGlzLmVudGl0eS5wb3NpdGlvbi5mbG9vcigpXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICAoIWJsb2NrQXRIZWFkLmlzTGlxdWlkKCkgJiYgIWJsb2NrQXRIZWFkLmlzU29saWQoKSkgfHxcbiAgICAgIHRoaXMuZW50aXR5Lmhhc0VmZmVjdChFZmZlY3RUeXBlLldhdGVyQnJlYXRoaW5nKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgb25TcGF3bigpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIG1ldGFkYXRhIGZsYWcgdmFsdWUgZm9yIGdyYXZpdHlcbiAgICBpZiAoIXRoaXMuZW50aXR5LmZsYWdzLmhhcyhBY3RvckZsYWcuQnJlYXRoaW5nKSkge1xuICAgICAgLy8gU2V0IHRoZSBlbnRpdHkgZmxhZyBmb3IgZ3Jhdml0eVxuICAgICAgdGhpcy5lbnRpdHkuZmxhZ3Muc2V0KEFjdG9yRmxhZy5CcmVhdGhpbmcsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5lbnRpdHkubWV0YWRhdGEuaGFzKEFjdG9yRGF0YUlkLkFpclN1cHBseSkpIHtcbiAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBhaXIgc3VwcGx5IHZhbHVlXG4gICAgICB0aGlzLnNldEFpclN1cHBseVRpY2tzKDMwMCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEFpclN1cHBseVRpY2tzKCk6IG51bWJlciB7XG4gICAgY29uc3QgYWlyU3VwcGx5RGF0YSA9IHRoaXMuZW50aXR5Lm1ldGFkYXRhLmdldChBY3RvckRhdGFJZC5BaXJTdXBwbHkpO1xuXG4gICAgaWYgKGFpclN1cHBseURhdGEpIHtcbiAgICAgIHJldHVybiBhaXJTdXBwbHlEYXRhLnZhbHVlIGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBaXJTdXBwbHlUaWNrcyh0aWNrczogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIHRoZSBhaXIgc3VwcGx5IGRhdGEgaXRlbS5cbiAgICBjb25zdCBhaXJTdXBwbHlEYXRhID0gbmV3IERhdGFJdGVtKFxuICAgICAgQWN0b3JEYXRhSWQuQWlyU3VwcGx5LFxuICAgICAgQWN0b3JEYXRhVHlwZS5TaG9ydCxcbiAgICAgIHRpY2tzXG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBhaXIgc3VwcGx5IGRhdGFcbiAgICB0aGlzLmVudGl0eS5tZXRhZGF0YS5zZXQoQWN0b3JEYXRhSWQuQWlyU3VwcGx5LCBhaXJTdXBwbHlEYXRhKTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlBaXJTdXBwbHlUcmFpdCB9O1xuIiwgImltcG9ydCB7XG4gIEFjdG9yRGF0YUlkLFxuICBBY3RvckRhdGFUeXBlLFxuICBBY3RvckZsYWcsXG4gIERhdGFJdGVtXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEVudGl0eVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgRW50aXR5TmFtZVRhZ1RyYWl0IGV4dGVuZHMgRW50aXR5VHJhaXQge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcIm5hbWV0YWdcIjtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzID0gW0VudGl0eUlkZW50aWZpZXIuUGxheWVyXTtcblxuICBwdWJsaWMgb25TcGF3bigpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgZW50aXR5IG5hbWUgdGFnXG4gICAgaWYgKCF0aGlzLmVudGl0eS5tZXRhZGF0YS5oYXMoQWN0b3JEYXRhSWQuTmFtZSkpIHtcbiAgICAgIC8vIEdldCB0aGUgZGVmYXVsdCBuYW1lIHRhZyB2YWx1ZVxuICAgICAgY29uc3QgbmFtZXRhZyA9IHRoaXMuZW50aXR5LmlzUGxheWVyKCkgPyB0aGlzLmVudGl0eS51c2VybmFtZSA6IFN0cmluZygpO1xuXG4gICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgbmFtZSB0YWcgdmFsdWVcbiAgICAgIHRoaXMuc2V0TmFtZVRhZyhuYW1ldGFnKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGhhcyBhIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgZW50aXR5IG5hbWUgdGFnIHZpc2liaWxpdHlcbiAgICBpZiAoIXRoaXMuZW50aXR5Lm1ldGFkYXRhLmhhcyhBY3RvckRhdGFJZC5OYW1ldGFnQWx3YXlzU2hvdykpIHtcbiAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBuYW1lIHRhZyB2aXNpYmlsaXR5IHZhbHVlXG4gICAgICBpZiAodGhpcy5lbnRpdHkuaXNQbGF5ZXIoKSkge1xuICAgICAgICAvLyBQbGF5ZXIgbmFtZSB0YWdzIGFyZSBhbHdheXMgdmlzaWJsZVxuICAgICAgICB0aGlzLnNldFZpc2liaWxpdHkodHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlciBlbnRpdHkgbmFtZSB0YWdzIGFyZSBub3QgYWx3YXlzIHZpc2libGVcbiAgICAgICAgdGhpcy5zZXRWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmFtZSB0YWcgb2YgdGhlIGVudGl0eS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdGFnIG9mIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgc2V0TmFtZVRhZyhuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRGF0YUl0ZW0gb2JqZWN0XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhSXRlbShBY3RvckRhdGFJZC5OYW1lLCBBY3RvckRhdGFUeXBlLlN0cmluZywgbmFtZSk7XG5cbiAgICAvLyBTZXQgdGhlIGVudGl0eSBjb2xsaXNpb24gaGVpZ2h0XG4gICAgdGhpcy5lbnRpdHkubWV0YWRhdGEuc2V0KEFjdG9yRGF0YUlkLk5hbWUsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWUgdGFnIG9mIHRoZSBlbnRpdHkuXG4gICAqIEByZXR1cm5zIFRoZSBuYW1lIHRhZyBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIGdldE5hbWVUYWcoKTogc3RyaW5nIHtcbiAgICAvLyBHZXQgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgZW50aXR5IG5hbWUgdGFnXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZW50aXR5Lm1ldGFkYXRhLmdldChBY3RvckRhdGFJZC5OYW1lKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBtZXRhZGF0YSB2YWx1ZSBpcyB2YWxpZFxuICAgIHJldHVybiBkYXRhID8gKGRhdGEudmFsdWUgYXMgc3RyaW5nKSA6IFN0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgbmFtZSB0YWcgb2YgdGhlIGVudGl0eSBpcyBhbHdheXMgdmlzaWJsZS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgbmFtZSB0YWcgb2YgdGhlIGVudGl0eSBpcyBhbHdheXMgdmlzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRWaXNpYmlsaXR5KCk6IGJvb2xlYW4ge1xuICAgIC8vIEdldCB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBlbnRpdHkgbmFtZSB0YWcgdmlzaWJpbGl0eVxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmVudGl0eS5tZXRhZGF0YS5nZXQoQWN0b3JEYXRhSWQuTmFtZXRhZ0Fsd2F5c1Nob3cpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIG1ldGFkYXRhIHZhbHVlIGlzIHZhbGlkXG4gICAgcmV0dXJuIGRhdGEgPyAoZGF0YS52YWx1ZSBhcyBudW1iZXIpID09PSAxIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIHRoZSBuYW1lIHRhZyBvZiB0aGUgZW50aXR5IGlzIGFsd2F5cyB2aXNpYmxlLlxuICAgKiBAcGFyYW0gdmlzaWJsZSBXaGV0aGVyIHRoZSBuYW1lIHRhZyBvZiB0aGUgZW50aXR5IGlzIGFsd2F5cyB2aXNpYmxlLlxuICAgKi9cbiAgcHVibGljIHNldFZpc2liaWxpdHkodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBEYXRhSXRlbSBvYmplY3RcbiAgICBjb25zdCBkYXRhID0gbmV3IERhdGFJdGVtKFxuICAgICAgQWN0b3JEYXRhSWQuTmFtZXRhZ0Fsd2F5c1Nob3csXG4gICAgICBBY3RvckRhdGFUeXBlLkJ5dGUsXG4gICAgICB2aXNpYmxlID8gMSA6IDBcbiAgICApO1xuXG4gICAgLy8gU2V0IHRoZSBlbnRpdHkgY29sbGlzaW9uIGhlaWdodFxuICAgIHRoaXMuZW50aXR5Lm1ldGFkYXRhLnNldChBY3RvckRhdGFJZC5OYW1ldGFnQWx3YXlzU2hvdywgZGF0YSk7XG4gICAgdGhpcy5lbnRpdHkuZmxhZ3Muc2V0KEFjdG9yRmxhZy5BbHdheXNTaG93TmFtZSwgdmlzaWJsZSk7IC8vID8gTm90IHN1cmUgd2h5IHRoaXMgaXMgYm90aCBpbiBtZXRhZGF0YSBhbmQgZmxhZ3NcbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlOYW1lVGFnVHJhaXQgfTtcbiIsICJpbXBvcnQgeyBFbnRpdHlHcmF2aXR5VHJhaXQgfSBmcm9tIFwiLi9ncmF2aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmNsYXNzIEVudGl0eVBoeXNpY3NUcmFpdCBleHRlbmRzIEVudGl0eVRyYWl0IHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwaHlzaWNzXCI7XG5cbiAgcHVibGljIGdyYXZpdHkgPSAwLjA1O1xuXG4gIHB1YmxpYyBvblRpY2soKTogdm9pZCB7XG4gICAgLy8gTm9ydGggPSAteiwgU291dGggPSAreiwgRWFzdCA9ICt4LCBXZXN0ID0gLXhcblxuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgaXMgYWxpdmVcbiAgICBpZiAodGhpcy5lbnRpdHkuaXNBbGl2ZSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgIGNvbnN0IGhhc0dyYXZpdHkgPSB0aGlzLmVudGl0eS5oYXNUcmFpdChFbnRpdHlHcmF2aXR5VHJhaXQpO1xuXG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5lbnRpdHkuZGltZW5zaW9uO1xuXG4gICAgY29uc3QgdmVsb2NpdHkgPSB0aGlzLmVudGl0eS52ZWxvY2l0eTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZW50aXR5LnBvc2l0aW9uO1xuXG4gICAgY29uc3QgaGl0Ym94V2lkdGggPSAwLjE1O1xuICAgIGNvbnN0IGhpdGJveEhlaWdodCA9IDAuMTU7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IGlzIG1vdmluZ1xuICAgIGlmICh2ZWxvY2l0eS5pc1plcm8oKSkgdGhpcy5lbnRpdHkuaXNNb3ZpbmcgPSBmYWxzZTtcbiAgICBlbHNlIHRoaXMuZW50aXR5LmlzTW92aW5nID0gdHJ1ZTtcblxuICAgIGlmICh2ZWxvY2l0eS55ICE9PSAwKSB7XG4gICAgICBjb25zdCBuZWdhdGUgPSB2ZWxvY2l0eS55IDwgMCA/IC0xIDogMTtcblxuICAgICAgLy8gR2V0IHRoZSBibG9jayBpbiB0aGUgZGlyZWN0aW9uIHRoZSBlbnRpdHkgaXMgbW92aW5nXG4gICAgICBjb25zdCBieCA9IE1hdGguZmxvb3IocG9zaXRpb24ueCAtIGhpdGJveFdpZHRoKTtcbiAgICAgIGNvbnN0IGJ5ID0gTWF0aC5mbG9vcihwb3NpdGlvbi55ICsgdmVsb2NpdHkueSArIGhpdGJveEhlaWdodCAqIG5lZ2F0ZSk7XG4gICAgICBjb25zdCBieiA9IE1hdGguZmxvb3IocG9zaXRpb24ueiAtIGhpdGJveFdpZHRoKTtcbiAgICAgIGNvbnN0IGJsb2NrID0gZGltZW5zaW9uLmdldEJsb2NrKHsgeDogYngsIHk6IGJ5LCB6OiBieiB9KTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIGlzIHNvbGlkIG9yIGlmIHRoZSB2ZWxvY2l0eSBpcyBhcHByb2FjaGluZyAwXG4gICAgICBpZiAoYmxvY2suaXNTb2xpZCgpIHx8IE1hdGguYWJzKHZlbG9jaXR5LnkpIDwgMC4wMSkge1xuICAgICAgICB0aGlzLmVudGl0eS52ZWxvY2l0eS55ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdldCB0aGUgZnJpY3Rpb24gb2YgdGhlIGJsb2NrIGJlbG93IHRoZSBlbnRpdHlcbiAgICAgICAgY29uc3QgYmVsb3cgPSBkaW1lbnNpb24uZ2V0QmxvY2soeyB4OiBieCwgeTogYnkgLSAxLCB6OiBieiB9KTtcblxuICAgICAgICAvLyBBcHBseSBncmF2aXR5IHRvIHRoZSBlbnRpdHlcbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueSAqPSBoYXNHcmF2aXR5XG4gICAgICAgICAgPyAxIC0gdGhpcy5ncmF2aXR5XG4gICAgICAgICAgOiBiZWxvdy5nZXRUeXBlKCkuZnJpY3Rpb247XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBlbnRpdHkncyBwb3NpdGlvblxuICAgICAgICB0aGlzLmVudGl0eS5wb3NpdGlvbi55ICs9IHZlbG9jaXR5Lnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBtb3Zpbmcgbm9ydGhcbiAgICBpZiAodmVsb2NpdHkueiAhPT0gMCkge1xuICAgICAgY29uc3QgbmVnYXRlID0gdmVsb2NpdHkueiA8IDAgPyAtMSA6IDE7XG5cbiAgICAgIC8vIEdldCB0aGUgYmxvY2sgaW4gdGhlIGRpcmVjdGlvbiB0aGUgZW50aXR5IGlzIG1vdmluZ1xuICAgICAgY29uc3QgYnggPSBNYXRoLmZsb29yKHBvc2l0aW9uLnggKyBoaXRib3hXaWR0aCk7XG4gICAgICBjb25zdCBieSA9IE1hdGguZmxvb3IocG9zaXRpb24ueSArIGhpdGJveEhlaWdodCk7XG4gICAgICBjb25zdCBieiA9IE1hdGguZmxvb3IocG9zaXRpb24ueiArIHZlbG9jaXR5LnogKyBoaXRib3hXaWR0aCAqIG5lZ2F0ZSk7XG4gICAgICBjb25zdCBibG9jayA9IGRpbWVuc2lvbi5nZXRCbG9jayh7IHg6IGJ4LCB5OiBieSwgejogYnogfSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBpcyBzb2xpZCBvciBpZiB0aGUgdmVsb2NpdHkgaXMgYXBwcm9hY2hpbmcgMFxuICAgICAgaWYgKGJsb2NrLmlzU29saWQoKSkge1xuICAgICAgICAvLyBTZXQgdGhlIGVudGl0eSdzIHZlbG9jaXR5IHRvIDBcbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueiA9IDA7XG5cbiAgICAgICAgLy8gU2xpZ2h0bHkgcHVzaCB0aGUgZW50aXR5IGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb25cbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueiArPSAwLjE2ICogLW5lZ2F0ZTtcbiAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnModmVsb2NpdHkueikgPCAwLjAxKSB7XG4gICAgICAgIC8vIFNldCB0aGUgZW50aXR5J3MgdmVsb2NpdHkgdG8gMFxuICAgICAgICB0aGlzLmVudGl0eS52ZWxvY2l0eS56ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdldCB0aGUgZnJpY3Rpb24gb2YgdGhlIGJsb2NrIGJlbG93IHRoZSBlbnRpdHlcbiAgICAgICAgY29uc3QgYmVsb3cgPSBkaW1lbnNpb24uZ2V0QmxvY2soe1xuICAgICAgICAgIHg6IE1hdGguZmxvb3IocG9zaXRpb24ueCksXG4gICAgICAgICAgeTogTWF0aC5mbG9vcihwb3NpdGlvbi55ICsgaGl0Ym94SGVpZ2h0KSxcbiAgICAgICAgICB6OiBNYXRoLmZsb29yKHBvc2l0aW9uLnopXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEdldCB0aGUgZnJpY3Rpb24gb2YgdGhlIGJsb2NrIGJlbG93IHRoZSBlbnRpdHlcbiAgICAgICAgY29uc3QgZnJpY3Rpb24gPSBiZWxvdy5nZXRUeXBlKCkuZnJpY3Rpb247XG5cbiAgICAgICAgLy8gQXBwbHkgZ3Jhdml0eSB0byB0aGUgZW50aXR5XG4gICAgICAgIHRoaXMuZW50aXR5LnZlbG9jaXR5LnogKj0gZnJpY3Rpb247XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBlbnRpdHkncyBwb3NpdGlvblxuICAgICAgICB0aGlzLmVudGl0eS5wb3NpdGlvbi56ICs9IHZlbG9jaXR5Lno7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBpcyBtb3ZpbmcgZWFzdFxuICAgIGlmICh2ZWxvY2l0eS54ICE9PSAwKSB7XG4gICAgICBjb25zdCBuZWdhdGUgPSB2ZWxvY2l0eS54IDwgMCA/IC0xIDogMTtcblxuICAgICAgLy8gR2V0IHRoZSBibG9jayBpbiB0aGUgZGlyZWN0aW9uIHRoZSBlbnRpdHkgaXMgbW92aW5nXG4gICAgICBjb25zdCBieCA9IE1hdGguZmxvb3IocG9zaXRpb24ueCArIHZlbG9jaXR5LnggKyBoaXRib3hXaWR0aCAqIG5lZ2F0ZSk7XG4gICAgICBjb25zdCBieSA9IE1hdGguZmxvb3IocG9zaXRpb24ueSArIGhpdGJveEhlaWdodCk7XG4gICAgICBjb25zdCBieiA9IE1hdGguZmxvb3IocG9zaXRpb24ueiArIGhpdGJveFdpZHRoKTtcbiAgICAgIGNvbnN0IGJsb2NrID0gZGltZW5zaW9uLmdldEJsb2NrKHsgeDogYngsIHk6IGJ5LCB6OiBieiB9KTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrIGlzIHNvbGlkIG9yIGlmIHRoZSB2ZWxvY2l0eSBpcyBhcHByb2FjaGluZyAwXG4gICAgICBpZiAoYmxvY2suaXNTb2xpZCgpKSB7XG4gICAgICAgIC8vIFNldCB0aGUgZW50aXR5J3MgdmVsb2NpdHkgdG8gMFxuICAgICAgICB0aGlzLmVudGl0eS52ZWxvY2l0eS54ID0gMDtcblxuICAgICAgICAvLyBTbGlnaGx5IHB1c2ggdGhlIGVudGl0eSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uXG4gICAgICAgIHRoaXMuZW50aXR5LnZlbG9jaXR5LnggKz0gMC4xNiAqIC1uZWdhdGU7XG4gICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKHZlbG9jaXR5LngpIDwgMC4wMSkge1xuICAgICAgICAvLyBTZXQgdGhlIGVudGl0eSdzIHZlbG9jaXR5IHRvIDBcbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBHZXQgdGhlIGZyaWN0aW9uIG9mIHRoZSBibG9jayBiZWxvdyB0aGUgZW50aXR5XG4gICAgICAgIGNvbnN0IGJlbG93ID0gZGltZW5zaW9uLmdldEJsb2NrKHtcbiAgICAgICAgICB4OiBNYXRoLmZsb29yKHBvc2l0aW9uLngpLFxuICAgICAgICAgIHk6IE1hdGguZmxvb3IocG9zaXRpb24ueSArIGhpdGJveEhlaWdodCksXG4gICAgICAgICAgejogTWF0aC5mbG9vcihwb3NpdGlvbi56KVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBHZXQgdGhlIGZyaWN0aW9uIG9mIHRoZSBibG9jayBiZWxvdyB0aGUgZW50aXR5XG4gICAgICAgIGNvbnN0IGZyaWN0aW9uID0gYmVsb3cuZ2V0VHlwZSgpLmZyaWN0aW9uO1xuXG4gICAgICAgIC8vIEFwcGx5IGdyYXZpdHkgdG8gdGhlIGVudGl0eVxuICAgICAgICB0aGlzLmVudGl0eS52ZWxvY2l0eS54ICo9IGZyaWN0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgZW50aXR5J3MgcG9zaXRpb25cbiAgICAgICAgdGhpcy5lbnRpdHkucG9zaXRpb24ueCArPSB2ZWxvY2l0eS54O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNHcmF2aXR5KSB7XG4gICAgICAvLyBHZXQgdGhlIGJsb2NrIGJlbG93IHRoZSBlbnRpdHlcbiAgICAgIGNvbnN0IGJlbG93ID0gZGltZW5zaW9uLmdldEJsb2NrKHtcbiAgICAgICAgeDogTWF0aC5mbG9vcihwb3NpdGlvbi54KSxcbiAgICAgICAgeTogTWF0aC5yb3VuZChwb3NpdGlvbi55ICsgaGl0Ym94SGVpZ2h0IC0gMSksXG4gICAgICAgIHo6IE1hdGguZmxvb3IocG9zaXRpb24ueilcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgYmxvY2sgYmVsb3cgdGhlIGVudGl0eSBpcyBzb2xpZFxuICAgICAgaWYgKGJlbG93LmlzU29saWQoKSkge1xuICAgICAgICAvLyBBcHBseSBncmF2aXR5IHRvIHRoZSBlbnRpdHlcbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueSA9IDA7XG5cbiAgICAgICAgLy8gQXBwbHkgZnJpY3Rpb24gdG8gdGhlIGVudGl0eVxuICAgICAgICBpZiAodGhpcy5lbnRpdHkudmVsb2NpdHkueiAhPT0gMClcbiAgICAgICAgICB0aGlzLmVudGl0eS52ZWxvY2l0eS56ICo9IGJlbG93LmdldFR5cGUoKS5mcmljdGlvbjtcblxuICAgICAgICAvLyBBcHBseSBmcmljdGlvbiB0byB0aGUgZW50aXR5XG4gICAgICAgIGlmICh0aGlzLmVudGl0eS52ZWxvY2l0eS54ICE9PSAwKVxuICAgICAgICAgIHRoaXMuZW50aXR5LnZlbG9jaXR5LnggKj0gYmVsb3cuZ2V0VHlwZSgpLmZyaWN0aW9uO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZW50aXR5IHRvIG9uIGdyb3VuZFxuICAgICAgICB0aGlzLmVudGl0eS5vbkdyb3VuZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBcHBseSBncmF2aXR5IHRvIHRoZSBlbnRpdHlcbiAgICAgICAgdGhpcy5lbnRpdHkudmVsb2NpdHkueSAtPSB0aGlzLmdyYXZpdHk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBlbnRpdHkgdG8gbm90IG9uIGdyb3VuZFxuICAgICAgICB0aGlzLmVudGl0eS5vbkdyb3VuZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBFbnRpdHlQaHlzaWNzVHJhaXQgfTtcbiIsICJpbXBvcnQge1xuICBFZmZlY3RUeXBlLFxuICBMZXZlbEV2ZW50LFxuICBMZXZlbEV2ZW50UGFja2V0LFxuICBNb2JFZmZlY3RFdmVudHMsXG4gIE1vYkVmZmVjdFBhY2tldCxcbiAgVmVjdG9yM2Zcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCIuLi8uLi9lZmZlY3RcIjtcbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eUVmZmVjdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVmZmVjdEFkZFNpZ25hbCwgRWZmZWN0UmVtb3ZlU2lnbmFsIH0gZnJvbSBcIi4uLy4uL2V2ZW50c1wiO1xuXG5pbXBvcnQgeyBFbnRpdHlUcmFpdCB9IGZyb20gXCIuL3RyYWl0XCI7XG5cbmludGVyZmFjZSBzYXZlZEVmZmVjdCB7XG4gIGVmZmVjdFR5cGU6IEVmZmVjdFR5cGU7XG4gIGR1cmF0aW9uOiBudW1iZXI7XG4gIGFtcGxpZmllcjogbnVtYmVyO1xuICBzaG93UGFydGljbGVzOiBib29sZWFuO1xufVxuXG5jbGFzcyBFbnRpdHlFZmZlY3RzVHJhaXQgZXh0ZW5kcyBFbnRpdHlUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHlwZSA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiZWZmZWN0c1wiO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWZmZWN0czogTWFwPEVmZmVjdFR5cGUsIEVmZmVjdD4gPSBuZXcgTWFwKCk7XG5cbiAgcHVibGljIG9uVGljaygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBlZmZlY3RdIG9mIHRoaXMuZWZmZWN0cykge1xuICAgICAgZWZmZWN0Lm9uVGljaz8uKHRoaXMuZW50aXR5KTtcblxuICAgICAgaWYgKCFlZmZlY3QuaXNFeHBpcmVkKCkpIHtcbiAgICAgICAgLy8gUmVkdWNlIHRoZSBlZmZlY3QgZHVyYXRpb24gYnkgdHdvIHRpY2tzLlxuICAgICAgICBlZmZlY3QuZHVyYXRpb24gLT0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbW92ZSh0eXBlKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWNsZUludGVydmFsID0gdGhpcy5lZmZlY3RzLnNpemUgPiAxID8gOG4gOiAybjtcbiAgICAvLyBTcGF3biBhIHBhcnRpY2xlIGJhc2VkIG9uIHRoZSBlZmZlY3Qgc2l6ZSBpbnRlcnZhbC5cbiAgICBpZiAodGhpcy5lbnRpdHkuZ2V0V29ybGQoKS5jdXJyZW50VGljayAlIHBhcnRpY2xlSW50ZXJ2YWwgPT0gMG4pIHtcbiAgICAgIGNvbnN0IGVmZmVjdCA9IHRoaXMuZ2V0UGFydGljbGVFZmZlY3QoKTtcblxuICAgICAgaWYgKCFlZmZlY3QpIHJldHVybjtcbiAgICAgIC8vIFNwYXduIHRoZSBwYXJ0aWNsZS5cbiAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMZXZlbEV2ZW50UGFja2V0KCk7XG4gICAgICBwYWNrZXQuZXZlbnQgPSBMZXZlbEV2ZW50LlBhcnRpY2xlTGVnYWN5RXZlbnQgfCAzNDtcbiAgICAgIHBhY2tldC5kYXRhID0gZWZmZWN0LmNvbG9yLnRvSW50KCk7XG4gICAgICBwYWNrZXQucG9zaXRpb24gPSB0aGlzLmVudGl0eS5wb3NpdGlvbi5zdWJ0cmFjdChuZXcgVmVjdG9yM2YoMCwgMSwgMCkpO1xuXG4gICAgICB0aGlzLmVudGl0eS5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZShlZmZlY3RUeXBlOiBFZmZlY3RUeXBlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVmZmVjdHMuaGFzKGVmZmVjdFR5cGUpKSByZXR1cm47XG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IEVmZmVjdFJlbW92ZVNpZ25hbCh0aGlzLmVudGl0eSwgZWZmZWN0VHlwZSk7XG5cbiAgICBzaWduYWwuZW1pdCgpO1xuICAgIHRoaXMuZWZmZWN0cy5nZXQoZWZmZWN0VHlwZSk/Lm9uUmVtb3ZlPy4odGhpcy5lbnRpdHkpO1xuICAgIHRoaXMuZWZmZWN0cy5kZWxldGUoZWZmZWN0VHlwZSk7XG5cbiAgICBpZiAoIXRoaXMuZW50aXR5LmlzUGxheWVyKCkpIHJldHVybjtcbiAgICAvLyBDcmVhdGUgdGhlIGVmZmVjdCByZW1vdmFsIHBhY2tldC5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgTW9iRWZmZWN0UGFja2V0KCk7XG4gICAgcGFja2V0LnJ1bnRpbWVJZCA9IHRoaXMuZW50aXR5LnJ1bnRpbWVJZDtcbiAgICBwYWNrZXQuZXZlbnRJZCA9IE1vYkVmZmVjdEV2ZW50cy5FZmZlY3RSZW1vdmU7XG4gICAgcGFja2V0LmVmZmVjdElkID0gZWZmZWN0VHlwZTtcbiAgICBwYWNrZXQucGFydGljbGVzID0gZmFsc2U7XG4gICAgcGFja2V0LmFtcGxpZmllciA9IDA7XG4gICAgcGFja2V0LmR1cmF0aW9uID0gMDtcbiAgICBwYWNrZXQuaW5wdXRUaWNrID0gdGhpcy5lbnRpdHkuZ2V0V29ybGQoKS5jdXJyZW50VGljaztcblxuICAgIHRoaXMuZW50aXR5LnNlbmQocGFja2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGVudGl0eSBoYXMgYW4gYWN0aXZlIGVmZmVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBlZmZlY3RUeXBlIC0gVGhlIHR5cGUgb2YgdGhlIGVmZmVjdCB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRpdHkgaGFzIGFuIGFjdGl2ZSBlZmZlY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlOyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAqL1xuICBwdWJsaWMgaGFzKGVmZmVjdFR5cGU6IEVmZmVjdFR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZmZlY3RzLmhhcyhlZmZlY3RUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGVmZmVjdCB0byB0aGUgZW50aXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZWZmZWN0VHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBlZmZlY3QgdG8gYWRkLlxuICAgKiBAcGFyYW0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGVmZmVjdCBpbiB0aWNrcy5cbiAgICogQHBhcmFtIGFtcGxpZmllciAtIFRoZSBhbXBsaWZpZXIgb2YgdGhlIGVmZmVjdC4gT3B0aW9uYWwsIGRlZmF1bHRzIHRvIDAuXG4gICAqIEBwYXJhbSBzaG93UGFydGljbGVzIC0gV2hldGhlciB0aGUgZWZmZWN0IHNob3VsZCBzaG93IHBhcnRpY2xlcy4gT3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICBwdWJsaWMgYWRkKFxuICAgIGVmZmVjdFR5cGU6IEVmZmVjdFR5cGUsXG4gICAgZHVyYXRpb246IG51bWJlcixcbiAgICBvcHRpb25zPzogRW50aXR5RWZmZWN0T3B0aW9uc1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBzaG93UGFydGljbGVzID0gb3B0aW9ucz8uc2hvd1BhcnRpY2xlcyA/PyB0cnVlO1xuICAgIGNvbnN0IGFtcGxpZmllciA9IG9wdGlvbnM/LmFtcGxpZmllciA/PyAwO1xuXG4gICAgLy8gR2V0IHRoZSBlZmZlY3QgdHlwZSBidWlsZGVyXG4gICAgY29uc3QgZWZmZWN0QnVpbGRlciA9IHRoaXMuZW50aXR5XG4gICAgICAuZ2V0V29ybGQoKVxuICAgICAgLmVmZmVjdFBhbGV0dGUuZ2V0RWZmZWN0KGVmZmVjdFR5cGUpO1xuICAgIGxldCBlZmZlY3QgPSB0aGlzLmVmZmVjdHMuZ2V0KGVmZmVjdFR5cGUpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBhY3RpdmUgZWZmZWN0IGFuZCB0aGVyZSdzIGVmZmVjdCBidWlsZGVyLCBjcmVhdGUgYSBuZXcgZWZmZWN0XG4gICAgaWYgKCFlZmZlY3QgJiYgZWZmZWN0QnVpbGRlcilcbiAgICAgIGVmZmVjdCA9IG5ldyBlZmZlY3RCdWlsZGVyKGR1cmF0aW9uLCBhbXBsaWZpZXIsIHNob3dQYXJ0aWNsZXMpO1xuICAgIGVsc2UgaWYgKGVmZmVjdCkge1xuICAgICAgLy8gQWRqdXN0IHRoZSBjdXJyZW50IGVmZmVjdCBwcm9wZXJ0aWVzXG4gICAgICBlZmZlY3QuZHVyYXRpb24gPSBlZmZlY3QuZHVyYXRpb24gKyBkdXJhdGlvbjtcbiAgICAgIGVmZmVjdC5hbXBsaWZpZXIgPSBNYXRoLm1heChlZmZlY3QuYW1wbGlmaWVyLCBhbXBsaWZpZXIgPz8gMCk7XG4gICAgICBlZmZlY3Quc2hvd1BhcnRpY2xlcyA9IHNob3dQYXJ0aWNsZXMgPz8gdHJ1ZTtcbiAgICB9XG4gICAgLy8gZXNsaW50IGZpeFxuICAgIGlmICghZWZmZWN0KSByZXR1cm47XG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IEVmZmVjdEFkZFNpZ25hbCh0aGlzLmVudGl0eSwgZWZmZWN0KTtcblxuICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuO1xuXG4gICAgZWZmZWN0Lm9uQWRkPy4odGhpcy5lbnRpdHkpO1xuICAgIHRoaXMuZWZmZWN0cy5zZXQoZWZmZWN0VHlwZSwgZWZmZWN0KTtcblxuICAgIC8vIElmIHRoZSBlbnRpdHkgaXMgbm90IGEgcGxheWVyLCBleGl0LlxuICAgIGlmICghdGhpcy5lbnRpdHkuaXNQbGF5ZXIoKSkgcmV0dXJuO1xuICAgIC8vIENyZWF0ZSB0aGUgZWZmZWN0IGFkZGl0aW9uIHBhY2tldC5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgTW9iRWZmZWN0UGFja2V0KCk7XG4gICAgcGFja2V0LnJ1bnRpbWVJZCA9IHRoaXMuZW50aXR5LnJ1bnRpbWVJZDtcbiAgICBwYWNrZXQuZXZlbnRJZCA9IE1vYkVmZmVjdEV2ZW50cy5FZmZlY3RBZGQ7XG4gICAgcGFja2V0LmVmZmVjdElkID0gZWZmZWN0VHlwZTtcbiAgICBwYWNrZXQucGFydGljbGVzID0gZWZmZWN0LnNob3dQYXJ0aWNsZXM7XG4gICAgcGFja2V0LmFtcGxpZmllciA9IGVmZmVjdC5hbXBsaWZpZXI7XG4gICAgcGFja2V0LmR1cmF0aW9uID0gZWZmZWN0LmR1cmF0aW9uO1xuICAgIHBhY2tldC5pbnB1dFRpY2sgPSB0aGlzLmVudGl0eS5nZXRXb3JsZCgpLmN1cnJlbnRUaWNrO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXIuXG4gICAgdGhpcy5lbnRpdHkuc2VuZChwYWNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHJhbmRvbSBwYXJ0aWNsZSBlZmZlY3QgZnJvbSB0aGUgZW50aXR5J3MgYWN0aXZlIGVmZmVjdHMgbGlzdC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJhbmRvbWx5IHNlbGVjdGVkIHBhcnRpY2xlIGVmZmVjdCBvciBgdW5kZWZpbmVkYCBpZiBubyBwYXJ0aWNsZSBlZmZlY3RzIGFyZSBhdmFpbGFibGUuXG4gICAqL1xuICBwcml2YXRlIGdldFBhcnRpY2xlRWZmZWN0KCk6IEVmZmVjdCB7XG4gICAgLy8gRmlsdGVyIHRoZSBlZmZlY3RzIHRvIG9ubHkgaW5jbHVkZSB0aG9zZSB3aXRoIHNob3dQYXJ0aWNsZXMgc2V0IHRvIHRydWUuXG4gICAgY29uc3QgZWZmZWN0cyA9IFsuLi50aGlzLmVmZmVjdHMudmFsdWVzKCldLmZpbHRlcihcbiAgICAgIChlZmZlY3QpID0+IGVmZmVjdC5zaG93UGFydGljbGVzXG4gICAgKTtcblxuICAgIC8vIFJldHVybiB0aGUgc2VsZWN0ZWQgZWZmZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBwYXJ0aWNsZSBlZmZlY3RzIGFyZSBhdmFpbGFibGUuXG4gICAgcmV0dXJuIGVmZmVjdHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZWZmZWN0cy5sZW5ndGgpXSE7XG4gIH1cblxuICAvKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgc2F2ZWQgZWZmZWN0cyBmcm9tIHRoZSBlbnRpdHkncyBjb21wb25lbnRzLFxuICAgKiBjcmVhdGVzIG5ldyBpbnN0YW5jZXMgb2YgdGhlIGVmZmVjdHMgdXNpbmcgdGhlIGRhdGEsIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGVudGl0eSdzIGVmZmVjdHMgbGlzdC5cbiAgICogVGhlIHNhdmVkIGVmZmVjdHMgYXJlIGxvYWRlZCBmcm9tIHRoZSBcImVudGl0eV9lZmZlY3RzXCIgY29tcG9uZW50LCB3aGljaCBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheSBvZiBvYmplY3RzXG4gICAqL1xuICBwdWJsaWMgb25TcGF3bigpOiB2b2lkIHtcbiAgICAvLyBMb2FkIHRoZSBlZmZlY3RzIGZyb20gdGhlIHNhdmVkIGRhdGEuXG4gICAgY29uc3QgZW50aXR5RWZmZWN0cyA9ICh0aGlzLmVudGl0eS5jb21wb25lbnRzLmdldChcImVudGl0eV9lZmZlY3RzXCIpID8/XG4gICAgICBbXSkgYXMgQXJyYXk8dW5rbm93bj4gYXMgQXJyYXk8c2F2ZWRFZmZlY3Q+O1xuXG4gICAgZm9yIChjb25zdCBlZmZlY3RFbnRyeSBvZiBlbnRpdHlFZmZlY3RzKSB7XG4gICAgICBjb25zdCB7IGVmZmVjdFR5cGUsIGR1cmF0aW9uLCBhbXBsaWZpZXIsIHNob3dQYXJ0aWNsZXMgfSA9IGVmZmVjdEVudHJ5O1xuICAgICAgY29uc3QgZWZmZWN0ID0gdGhpcy5lbnRpdHkuZ2V0V29ybGQoKS5lZmZlY3RQYWxldHRlLmdldEVmZmVjdChlZmZlY3RUeXBlKTtcblxuICAgICAgaWYgKCFlZmZlY3QpIHJldHVybjtcbiAgICAgIHRoaXMuZWZmZWN0cy5zZXQoXG4gICAgICAgIGVmZmVjdFR5cGUsXG4gICAgICAgIG5ldyBlZmZlY3QoZHVyYXRpb24sIGFtcGxpZmllciwgc2hvd1BhcnRpY2xlcylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRGVzcGF3bigpOiB2b2lkIHtcbiAgICB0aGlzLmVudGl0eS5jb21wb25lbnRzLnNldChcbiAgICAgIFwiZW50aXR5X2VmZmVjdHNcIixcbiAgICAgIFsuLi50aGlzLmVmZmVjdHMudmFsdWVzKCldLm1hcCgoZWZmZWN0KSA9PiBlZmZlY3QudG9TdHJpbmcoKSlcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUVmZmVjdHNUcmFpdCB9O1xuIiwgImltcG9ydCB7IEFjdG9yRmxhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHlJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEVudGl0eVRyYWl0IH0gZnJvbSBcIi4vdHJhaXRcIjtcblxuY2xhc3MgRW50aXR5SW52aXNpYmlsaXR5VHJhaXQgZXh0ZW5kcyBFbnRpdHlUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwidmlzaWJpbGl0eVwiO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxFbnRpdHlJZGVudGlmaWVyPiA9IFtcbiAgICBFbnRpdHlJZGVudGlmaWVyLlBsYXllclxuICBdO1xuXG4gIHB1YmxpYyBvblNwYXduKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbnRpdHkuZmxhZ3MuaGFzKEFjdG9yRmxhZy5JbnZpc2libGUpKSB7XG4gICAgICB0aGlzLmVudGl0eS5mbGFncy5zZXQoQWN0b3JGbGFnLkludmlzaWJsZSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQncyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZW50aXR5LlxuICAgKiBAcGFyYW0gdmFsdWUgV2V0aGVyIG9yIG5vdCB0aGUgZW50aXR5IHdpbGwgYmUgdmlzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBzZXRJbnZpc2liaWxpdHkodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmVudGl0eS5mbGFncy5zZXQoQWN0b3JGbGFnLkludmlzaWJsZSwgdmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUludmlzaWJpbGl0eVRyYWl0IH07XG4iLCAiaW1wb3J0IHtcbiAgQ29udGFpbmVySWQsXG4gIENvbnRhaW5lclR5cGUsXG4gIEVxdWlwbWVudFNsb3Rcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eUNvbnRhaW5lciB9IGZyb20gXCIuLi9jb250YWluZXJcIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi8uLi9pdGVtXCI7XG5pbXBvcnQgeyBJdGVtU3RhY2tFbnRyeSwgSlNPTkxpa2VPYmplY3QgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgRW50aXR5VHJhaXQgfSBmcm9tIFwiLi90cmFpdFwiO1xuXG5pbnRlcmZhY2UgRXF1aXBtZW50RW50cnkgZXh0ZW5kcyBKU09OTGlrZU9iamVjdCB7XG4gIFt4OiBudW1iZXJdOiBJdGVtU3RhY2tFbnRyeTtcbn1cblxuY2xhc3MgRW50aXR5RXF1aXBtZW50VHJhaXQgZXh0ZW5kcyBFbnRpdHlUcmFpdCB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwiZXF1aXBtZW50XCI7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0eXBlcyA9IFtFbnRpdHlJZGVudGlmaWVyLlBsYXllcl07XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lcjogRW50aXR5Q29udGFpbmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlbnRpdHk6IEVudGl0eSkge1xuICAgIHN1cGVyKGVudGl0eSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IG5ldyBFbnRpdHlDb250YWluZXIoXG4gICAgICBlbnRpdHksXG4gICAgICBDb250YWluZXJUeXBlLkFybW9yLFxuICAgICAgQ29udGFpbmVySWQuQXJtb3IsXG4gICAgICA0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFcXVpcHMgdGhlIGdpdmVuIGl0ZW0gdG8gZ2l2ZW4gc2xvdCBpbiB0aGUgZW50aXR5IGVxdWlwbWVudC5cbiAgICogQHBhcmFtIHNsb3QgVGhlIGl0ZW0gd2hlcmUgdGhlIGl0ZW0gd2lsbCBiZSBwbGFjZWRcbiAgICogQHBhcmFtIGl0ZW1TdGFjayBUaGUgaXRlbSB0aGF0IHdpbGwgYmUgcGxhY2VkXG4gICAqL1xuICBwdWJsaWMgc2V0RXF1aXBtZW50KHNsb3Q6IEVxdWlwbWVudFNsb3QsIGl0ZW1TdGFjazogSXRlbVN0YWNrKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXIuc2V0SXRlbShzbG90LCBpdGVtU3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVxdWlwbWVudCBpdGVtIGF0IHRoZSBnaXZlbiBzbG90LlxuICAgKiBAcGFyYW0gc2xvdCBUaGUgc2xvdCB0byBnZXQgdGhlIGVxdWlwbWVudFxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSBpbiB0aGUgZGVzaXJlZCBzbG90IGlmIGV4aXN0aW5nLlxuICAgKi9cbiAgcHVibGljIGdldEVxdWlwbWVudChzbG90OiBFcXVpcG1lbnRTbG90KTogSXRlbVN0YWNrIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmdldEl0ZW0oc2xvdCk7XG4gIH1cblxuICBwdWJsaWMgb25TcGF3bigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW50aXR5LmNvbXBvbmVudHMuaGFzKFwiZXF1aXBtZW50XCIpKSByZXR1cm47XG4gICAgY29uc3QgZXF1aXBtZW50ID0gdGhpcy5lbnRpdHkuY29tcG9uZW50cy5nZXQoXCJlcXVpcG1lbnRcIikgYXMgRXF1aXBtZW50RW50cnk7XG5cbiAgICBmb3IgKGNvbnN0IHNsb3QgaW4gZXF1aXBtZW50KSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVxdWlwbWVudFtzbG90XSBhcyBJdGVtU3RhY2tFbnRyeTtcblxuICAgICAgY29uc3QgaXRlbVN0YWNrID0gbmV3IEl0ZW1TdGFjayhlbnRyeS5pZGVudGlmaWVyLCB7XG4gICAgICAgIGFtb3VudDogZW50cnkuYW1vdW50LFxuICAgICAgICBhdXhpbGxhcnk6IGVudHJ5LmF1eGlsbGFyeSxcbiAgICAgICAgd29ybGQ6IHRoaXMuZW50aXR5LmdldFdvcmxkKCksXG4gICAgICAgIGVudHJ5XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0RXF1aXBtZW50KE51bWJlci5wYXJzZUludChzbG90KSwgaXRlbVN0YWNrKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25EZXNwYXduKCk6IHZvaWQge1xuICAgIGNvbnN0IGVxdWlwbWVudDogRXF1aXBtZW50RW50cnkgPSB7fTtcblxuICAgIGZvciAoY29uc3QgaXRlbVN0YWNrIG9mIHRoaXMuY29udGFpbmVyLnN0b3JhZ2UpIHtcbiAgICAgIGlmICghaXRlbVN0YWNrKSBjb250aW51ZTtcbiAgICAgIGVxdWlwbWVudFt0aGlzLmNvbnRhaW5lci5zdG9yYWdlLmluZGV4T2YoaXRlbVN0YWNrKV0gPVxuICAgICAgICBpdGVtU3RhY2suZ2V0RGF0YUVudHJ5KCk7XG4gICAgfVxuICAgIHRoaXMuZW50aXR5LmNvbXBvbmVudHMuc2V0KFwiZXF1aXBtZW50XCIsIGVxdWlwbWVudCk7XG4gICAgY29uc29sZS5kaXIodGhpcy5lbnRpdHkuY29tcG9uZW50cy5nZXQoXCJlcXVpcG1lbnRcIiksIHtcbiAgICAgIGRlcHRoOiBJbmZpbml0eSxcbiAgICAgIGNvbG9yczogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IEVudGl0eUVxdWlwbWVudFRyYWl0IH07XG4iLCAiaW1wb3J0IHtcbiAgQWN0b3JEYXRhSWQsXG4gIERhdGFJdGVtLFxuICBQcm9wZXJ0eVN5bmNEYXRhLFxuICBTZXRBY3RvckRhdGFQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhVXBkYXRlU2lnbmFsIH0gZnJvbSBcIi4uLy4uL2V2ZW50c1wiO1xuXG5jbGFzcyBNZXRhZGF0YU1hcCBleHRlbmRzIE1hcDxBY3RvckRhdGFJZCwgRGF0YUl0ZW0+IHtcbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCB0aGlzIG1ldGFkYXRhIHNldCBpcyBhdHRhY2hlZCB0b1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgbWV0YWRhdGEgc2V0XG4gICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0aGF0IHRoaXMgbWV0YWRhdGEgc2V0IGlzIGF0dGFjaGVkIHRvXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IEFjdG9yRGF0YUlkLCB2YWx1ZTogRGF0YUl0ZW08dW5rbm93bj4pOiB0aGlzIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRW50aXR5TWV0YWRhdGFVcGRhdGVTaWduYWxcbiAgICBjb25zdCBzaWduYWwgPSBuZXcgRW50aXR5TWV0YWRhdGFVcGRhdGVTaWduYWwodGhpcy5lbnRpdHksIGtleSwgdmFsdWUpO1xuXG4gICAgLy8gSWYgdGhlIHNpZ25hbCB3YXMgY2FuY2VsbGVkLCByZXR1cm4gdGhpc1xuICAgIGlmICghc2lnbmFsLmVtaXQoKSkgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzZXQgbWV0aG9kXG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuc2V0KGtleSwgc2lnbmFsLmRhdGFJdGVtKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWN0b3IgZGF0YSB3aGVuIGEgbmV3IHZhbHVlIGlzIGFkZGVkXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUoa2V5OiBBY3RvckRhdGFJZCk6IGJvb2xlYW4ge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGRlbGV0ZSBtZXRob2RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5kZWxldGUoa2V5KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWN0b3IgZGF0YSB3aGVuIGEgdmFsdWUgaXMgZGVsZXRlZFxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgY2xlYXIgbWV0aG9kXG4gICAgc3VwZXIuY2xlYXIoKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWN0b3IgZGF0YSB3aGVuIHRoZSBzZXQgaXMgY2xlYXJlZFxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBhY3RvciBkYXRhIG9mIHRoZSBlbnRpdHkuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlKCk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBTZXRBY3RvckRhdGFQYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgU2V0QWN0b3JEYXRhUGFja2V0KCk7XG4gICAgcGFja2V0LnJ1bnRpbWVFbnRpdHlJZCA9IHRoaXMuZW50aXR5LnJ1bnRpbWVJZDtcbiAgICBwYWNrZXQuaW5wdXRUaWNrID0gdGhpcy5lbnRpdHkuaXNQbGF5ZXIoKVxuICAgICAgPyB0aGlzLmVudGl0eS5pbnB1dFRpY2tcbiAgICAgIDogdGhpcy5lbnRpdHkuZGltZW5zaW9uLndvcmxkLmN1cnJlbnRUaWNrO1xuICAgIHBhY2tldC5kYXRhID0gWy4uLnRoaXMuZW50aXR5Lm1ldGFkYXRhLnZhbHVlcygpXTtcbiAgICBwYWNrZXQucHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0eVN5bmNEYXRhKFtdLCBbXSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGZsYWdzIHNldCBvbiB0aGUgZW50aXR5XG4gICAgZm9yIChjb25zdCBbZmxhZywgZW5hYmxlZF0gb2YgdGhpcy5lbnRpdHkuZmxhZ3MpXG4gICAgICBwYWNrZXQuc2V0RmxhZyhmbGFnLCBlbmFibGVkKTtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgZGltZW5zaW9uXG4gICAgdGhpcy5lbnRpdHkuZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuICB9XG59XG5cbmV4cG9ydCB7IE1ldGFkYXRhTWFwIH07XG4iLCAiaW1wb3J0IHtcbiAgQWN0b3JGbGFnLFxuICBQcm9wZXJ0eVN5bmNEYXRhLFxuICBTZXRBY3RvckRhdGFQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eUZsYWdVcGRhdGVTaWduYWwgfSBmcm9tIFwiLi4vLi4vZXZlbnRzXCI7XG5cbmNsYXNzIEFjdG9yRmxhZ01hcCBleHRlbmRzIE1hcDxBY3RvckZsYWcsIGJvb2xlYW4+IHtcbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCB0aGlzIGFjdG9yIGZsYWdzIG1hcCBpcyBhdHRhY2hlZCB0b1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYWN0b3IgZmxhZ3MgbWFwXG4gICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0aGF0IHRoaXMgYWN0b3IgZmxhZ3MgbWFwIGlzIGF0dGFjaGVkIHRvXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IEFjdG9yRmxhZywgdmFsdWU6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRW50aXR5RmxhZ1VwZGF0ZVNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBFbnRpdHlGbGFnVXBkYXRlU2lnbmFsKHRoaXMuZW50aXR5LCBrZXksIHZhbHVlKTtcblxuICAgIC8vIElmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGxlZCwgcmV0dXJuIHRoaXNcbiAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgc2V0IG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnNldChrZXksIHNpZ25hbC52YWx1ZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFjdG9yIGRhdGEgd2hlbiBhIG5ldyB2YWx1ZSBpcyBhZGRlZFxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKGtleTogQWN0b3JGbGFnKTogYm9vbGVhbiB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgZGVsZXRlIG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLmRlbGV0ZShrZXkpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBhY3RvciBkYXRhIHdoZW4gYSB2YWx1ZSBpcyBkZWxldGVkXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBjbGVhciBtZXRob2RcbiAgICBzdXBlci5jbGVhcigpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBhY3RvciBkYXRhIHdoZW4gdGhlIG1hcCBpcyBjbGVhcmVkXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGFjdG9yIGRhdGEgb2YgdGhlIGVudGl0eS5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGUoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IFNldEFjdG9yRGF0YVBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBTZXRBY3RvckRhdGFQYWNrZXQoKTtcbiAgICBwYWNrZXQucnVudGltZUVudGl0eUlkID0gdGhpcy5lbnRpdHkucnVudGltZUlkO1xuICAgIHBhY2tldC5pbnB1dFRpY2sgPSB0aGlzLmVudGl0eS5pc1BsYXllcigpXG4gICAgICA/IHRoaXMuZW50aXR5LmlucHV0VGlja1xuICAgICAgOiB0aGlzLmVudGl0eS5kaW1lbnNpb24ud29ybGQuY3VycmVudFRpY2s7XG4gICAgcGFja2V0LmRhdGEgPSBbLi4udGhpcy5lbnRpdHkubWV0YWRhdGEudmFsdWVzKCldO1xuICAgIHBhY2tldC5wcm9wZXJ0aWVzID0gbmV3IFByb3BlcnR5U3luY0RhdGEoW10sIFtdKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgZmxhZ3Mgc2V0IG9uIHRoZSBlbnRpdHlcbiAgICBmb3IgKGNvbnN0IFtmbGFnLCBlbmFibGVkXSBvZiB0aGlzLmVudGl0eS5mbGFncylcbiAgICAgIHBhY2tldC5zZXRGbGFnKGZsYWcsIGVuYWJsZWQpO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBkaW1lbnNpb25cbiAgICB0aGlzLmVudGl0eS5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgQWN0b3JGbGFnTWFwIH07XG4iLCAiaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVOYW1lLFxuICBVcGRhdGVBdHRyaWJ1dGVzUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlBdHRyaWJ1dGVVcGRhdGVTaWduYWwgfSBmcm9tIFwiLi4vLi4vZXZlbnRzXCI7XG5cbmNsYXNzIEF0dHJpYnV0ZU1hcCBleHRlbmRzIE1hcDxBdHRyaWJ1dGVOYW1lLCBBdHRyaWJ1dGU+IHtcbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCB0aGlzIG1ldGFkYXRhIHNldCBpcyBhdHRhY2hlZCB0b1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVudGl0eTogRW50aXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgbWV0YWRhdGEgc2V0XG4gICAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0aGF0IHRoaXMgbWV0YWRhdGEgc2V0IGlzIGF0dGFjaGVkIHRvXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IEF0dHJpYnV0ZU5hbWUsIHZhbHVlOiBBdHRyaWJ1dGUpOiB0aGlzIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRW50aXR5QXR0cmlidXRlVXBkYXRlU2lnbmFsXG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IEVudGl0eUF0dHJpYnV0ZVVwZGF0ZVNpZ25hbCh0aGlzLmVudGl0eSwga2V5LCB2YWx1ZSk7XG5cbiAgICAvLyBJZiB0aGUgc2lnbmFsIHdhcyBjYW5jZWxsZWQsIHJldHVybiB0aGlzXG4gICAgaWYgKCFzaWduYWwuZW1pdCgpKSByZXR1cm4gdGhpcztcblxuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIHNldCBtZXRob2RcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5zZXQoa2V5LCBzaWduYWwudmFsdWUpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBhY3RvciBkYXRhIHdoZW4gYSBuZXcgdmFsdWUgaXMgYWRkZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZShrZXk6IEF0dHJpYnV0ZU5hbWUpOiBib29sZWFuIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBkZWxldGUgbWV0aG9kXG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZGVsZXRlKGtleSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFjdG9yIGRhdGEgd2hlbiBhIHZhbHVlIGlzIGRlbGV0ZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIGNsZWFyIG1ldGhvZFxuICAgIHN1cGVyLmNsZWFyKCk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFjdG9yIGRhdGEgd2hlbiB0aGUgc2V0IGlzIGNsZWFyZWRcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgYWN0b3IgZGF0YSBvZiB0aGUgZW50aXR5LlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgVXBkYXRlQXR0cmlidXRlc1BhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVzUGFja2V0KCk7XG4gICAgcGFja2V0LnJ1bnRpbWVBY3RvcklkID0gdGhpcy5lbnRpdHkucnVudGltZUlkO1xuICAgIHBhY2tldC5pbnB1dFRpY2sgPSB0aGlzLmVudGl0eS5pc1BsYXllcigpXG4gICAgICA/IHRoaXMuZW50aXR5LmlucHV0VGlja1xuICAgICAgOiB0aGlzLmVudGl0eS5kaW1lbnNpb24ud29ybGQuY3VycmVudFRpY2s7XG4gICAgcGFja2V0LmF0dHJpYnV0ZXMgPSBbLi4udGhpcy5lbnRpdHkuYXR0cmlidXRlcy52YWx1ZXMoKV07XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIGRpbWVuc2lvblxuICAgIHRoaXMuZW50aXR5LmRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcbiAgfVxufVxuXG5leHBvcnQgeyBBdHRyaWJ1dGVNYXAgfTtcbiIsICJpbXBvcnQge1xuICBBYmlsaXR5SW5kZXgsXG4gIEFiaWxpdHlMYXllclR5cGUsXG4gIEFiaWxpdHlTZXQsXG4gIFNldFBsYXllckdhbWVUeXBlUGFja2V0LFxuICBVcGRhdGVBYmlsaXRpZXNQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9wbGF5ZXJcIjtcbmltcG9ydCB7IFBsYXllckFiaWxpdHlVcGRhdGVTaWduYWwgfSBmcm9tIFwiLi4vLi4vZXZlbnRzXCI7XG5cbmNsYXNzIEFiaWxpdHlNYXAgZXh0ZW5kcyBNYXA8QWJpbGl0eUluZGV4LCBib29sZWFuPiB7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIHRoYXQgdGhlIGFiaWxpdGllcyBhcmUgYXR0YWNoZWQgdG9cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGFiaWxpdHkgbWFwXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IHRoZSBhYmlsaXRpZXMgYXJlIGF0dGFjaGVkIHRvXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IEFiaWxpdHlJbmRleCwgdmFsdWU6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyQWJpbGl0eVVwZGF0ZVNpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJBYmlsaXR5VXBkYXRlU2lnbmFsKHRoaXMucGxheWVyLCBrZXksIHZhbHVlKTtcblxuICAgIC8vIElmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGxlZCwgcmV0dXJuIHRoaXNcbiAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgc2V0IG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdCA9IHN1cGVyLnNldChrZXksIHNpZ25hbC52YWx1ZSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFiaWxpdGllcyB3aGVuIGEgbmV3IHZhbHVlIGlzIGFkZGVkXG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIC8vIFJldHVybiB0aGUgcmVzdWx0XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUoa2V5OiBBYmlsaXR5SW5kZXgpOiBib29sZWFuIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBkZWxldGUgbWV0aG9kXG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIuZGVsZXRlKGtleSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFiaWxpdGllcyB3aGVuIGEgdmFsdWUgaXMgZGVsZXRlZFxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgY2xlYXIgbWV0aG9kXG4gICAgc3VwZXIuY2xlYXIoKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWJpbGl0aWVzIHdoZW4gdGhlIG1hcCBpcyBjbGVhcmVkXG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoZSBvcmlnaW5hbCBzZXQgbWV0aG9kXG4gICAqIEBwYXJhbSBrZXkgVGhlIGFiaWxpdHkgaW5kZXhcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZVxuICAgKiBAcmV0dXJucyBUaGUgYWJpbGl0eSBtYXBcbiAgICovXG4gIHB1YmxpYyBzdXBlclNldChrZXk6IEFiaWxpdHlJbmRleCwgdmFsdWU6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAvLyBDYWxsIHRoZSBvcmlnaW5hbCBzZXQgbWV0aG9kXG4gICAgcmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGFiaWxpdGllcyBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlKCk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBVcGRhdGVBYmlsaXRpZXNQYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgVXBkYXRlQWJpbGl0aWVzUGFja2V0KCk7XG4gICAgcGFja2V0LnBlcm1pc3Npb25MZXZlbCA9IHRoaXMucGxheWVyLnBlcm1pc3Npb247XG4gICAgcGFja2V0LmNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgPSB0aGlzLnBsYXllci5wZXJtaXNzaW9uID09PSAyID8gMSA6IDA7XG4gICAgcGFja2V0LmVudGl0eVVuaXF1ZUlkID0gdGhpcy5wbGF5ZXIudW5pcXVlSWQ7XG4gICAgcGFja2V0LmFiaWxpdGllcyA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogQWJpbGl0eUxheWVyVHlwZS5CYXNlLFxuICAgICAgICBhYmlsaXRpZXM6IFsuLi50aGlzLnBsYXllci5hYmlsaXRpZXMuZW50cmllcygpXS5tYXAoXG4gICAgICAgICAgKFthYmlsaXR5LCB2YWx1ZV0pID0+IG5ldyBBYmlsaXR5U2V0KGFiaWxpdHksIHZhbHVlKVxuICAgICAgICApLFxuICAgICAgICB3YWxrU3BlZWQ6IDAuMSxcbiAgICAgICAgZmx5U3BlZWQ6IDAuMDVcbiAgICAgIH1cbiAgICBdO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLnBsYXllci5kaW1lbnNpb24uYnJvYWRjYXN0KHBhY2tldCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIGFsaXZlXG4gICAgaWYgKCF0aGlzLnBsYXllci5pc0FsaXZlKSByZXR1cm47XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgU2V0UGxheWVyR2FtZVR5cGVQYWNrZXRcbiAgICBjb25zdCBnYW1lbW9kZSA9IG5ldyBTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCgpO1xuICAgIGdhbWVtb2RlLmdhbWVtb2RlID0gdGhpcy5wbGF5ZXIuZ2FtZW1vZGU7XG5cbiAgICAvLyBTZW5kIHRoZSBnYW1lbW9kZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgIHRoaXMucGxheWVyLnNlbmQoZ2FtZW1vZGUpO1xuICB9XG59XG5cbmV4cG9ydCB7IEFiaWxpdHlNYXAgfTtcbiIsICJpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuaW1wb3J0IHtcbiAgQWJpbGl0eUluZGV4LFxuICBCbG9ja1Bvc2l0aW9uLFxuICBDaGFuZ2VEaW1lbnNpb25QYWNrZXQsXG4gIENvbnRhaW5lck5hbWUsXG4gIENyZWF0aXZlQ29udGVudFBhY2tldCxcbiAgRGF0YVBhY2tldCxcbiAgRGVmYXVsdEFiaWxpdHlWYWx1ZXMsXG4gIERpc2Nvbm5lY3RNZXNzYWdlLFxuICBEaXNjb25uZWN0UGFja2V0LFxuICBEaXNjb25uZWN0UmVhc29uLFxuICBHYW1lbW9kZSxcbiAgTW92ZU1vZGUsXG4gIE1vdmVQbGF5ZXJQYWNrZXQsXG4gIFBlcm1pc3Npb25MZXZlbCxcbiAgU2VyaWFsaXplZFNraW4sXG4gIFNldFBsYXllckdhbWVUeXBlUGFja2V0LFxuICBUZWxlcG9ydENhdXNlLFxuICBUZXh0UGFja2V0LFxuICBUZXh0UGFja2V0VHlwZSxcbiAgVHJhbnNmZXJQYWNrZXQsXG4gIFZlY3RvcjNmXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQbGF5ZXJFbnRyeSwgUGxheWVyUHJvcGVydGllcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRGltZW5zaW9uLCBXb3JsZCB9IGZyb20gXCIuLi93b3JsZFwiO1xuaW1wb3J0IHsgRW50aXR5SWRlbnRpZmllciB9IGZyb20gXCIuLi9lbnVtc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4uL2NvbnRhaW5lclwiO1xuaW1wb3J0IHsgSXRlbUJ1bmRsZVRyYWl0LCBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuaW1wb3J0IHtcbiAgRW50aXR5RGltZW5zaW9uQ2hhbmdlU2lnbmFsLFxuICBQbGF5ZXJHYW1lbW9kZUNoYW5nZVNpZ25hbFxufSBmcm9tIFwiLi4vZXZlbnRzXCI7XG5cbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuL2VudGl0eVwiO1xuaW1wb3J0IHsgQWJpbGl0eU1hcCB9IGZyb20gXCIuL21hcHNcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5VHJhaXQsIFBsYXllckN1cnNvclRyYWl0LCBQbGF5ZXJUcmFpdCB9IGZyb20gXCIuL3RyYWl0c1wiO1xuaW1wb3J0IHsgRGV2aWNlIH0gZnJvbSBcIi4vZGV2aWNlXCI7XG5cbmNvbnN0IERlZmF1bHRQbGF5ZXJQcm9wZXJ0aWVzOiBQbGF5ZXJQcm9wZXJ0aWVzID0ge1xuICB1c2VybmFtZTogXCJTZXJlbml0eUpTXCIsXG4gIHh1aWQ6IFwiMDAwMDAwMDAwMDAwMDAwMFwiLFxuICB1dWlkOiBcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICB1bmlxdWVJZDogMG4sXG4gIGRldmljZTogRGV2aWNlLmVtcHR5KCksXG4gIHNraW46IFNlcmlhbGl6ZWRTa2luLmVtcHR5KClcbn07XG5cbmNsYXNzIFBsYXllciBleHRlbmRzIEVudGl0eSB7XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCByYWtuZXQgY29ubmVjdGlvbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcblxuICAvKipcbiAgICogVGhlIHVzZXJuYW1lIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VybmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgeGJveCB1c2VyIGlkIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB4dWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1dWlkIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1dWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0cmFpdHMgdGhhdCBhcmUgYXR0YWNoZWQgdG8gdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0cyA9IG5ldyBNYXA8c3RyaW5nLCBQbGF5ZXJUcmFpdD4oKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgYWJpbGl0aWVzIG9mIHRoZSBwbGF5ZXIsIGFuZCB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhYmlsaXRpZXMgPSBuZXcgQWJpbGl0eU1hcCh0aGlzKTtcblxuICAvKipcbiAgICogVGhlIGRldmljZSBpbmZvcm1hdGlvbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGV2aWNlOiBEZXZpY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBza2luIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBza2luOiBTZXJpYWxpemVkU2tpbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgaW5wdXQgdGljayBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgaW5wdXRUaWNrID0gMG47XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9uIGxldmVsIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIgdGhhdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSB2aWV3aW5nLlxuICAgKi9cbiAgcHVibGljIG9wZW5lZENvbnRhaW5lcjogQ29udGFpbmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgYmxvY2sgdGhhdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBicmVha2luZy5cbiAgICovXG4gIHB1YmxpYyBibG9ja1RhcmdldDogQmxvY2tQb3NpdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IGl0ZW0gdGhhdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSB1c2luZy5cbiAgICovXG4gIHB1YmxpYyBpdGVtVGFyZ2V0OiBJdGVtU3RhY2sgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBlbnRpdHkgdGhhdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBsb29raW5nIGF0LlxuICAgKi9cbiAgcHVibGljIGVudGl0eVRhcmdldDogRW50aXR5IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBnYW1lbW9kZSBvZiB0aGUgcGxheWVyLlxuICAgKi9cbiAgcHVibGljIGdldCBnYW1lbW9kZSgpOiBHYW1lbW9kZSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgdGhlIGdhbWVtb2RlIGNvbXBvbmVudFxuICAgIGlmICghdGhpcy5jb21wb25lbnRzLmhhcyhcImdhbWVtb2RlXCIpKVxuICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IGdhbWVtb2RlIGZvciB0aGUgcGxheWVyXG4gICAgICB0aGlzLmNvbXBvbmVudHMuc2V0KFwiZ2FtZW1vZGVcIiwgR2FtZW1vZGUuU3Vydml2YWwpOyAvLyBUT0RPOiBHZXQgdGhlIGRlZmF1bHQgZ2FtZW1vZGUgZnJvbSB0aGUgd29ybGRcblxuICAgIC8vIFJldHVybiB0aGUgZ2FtZW1vZGUgb2YgdGhlIHBsYXllclxuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHMuZ2V0KFwiZ2FtZW1vZGVcIikgYXMgR2FtZW1vZGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGdhbWVtb2RlIG9mIHRoZSBwbGF5ZXIuXG4gICAqL1xuICBwdWJsaWMgc2V0IGdhbWVtb2RlKHZhbHVlOiBHYW1lbW9kZSkge1xuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJHYW1lbW9kZUNoYW5nZVNpZ25hbCh0aGlzLCB0aGlzLmdhbWVtb2RlLCB2YWx1ZSk7XG5cbiAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybjtcblxuICAgIC8vIFNldCB0aGUgZ2FtZW1vZGUgb2YgdGhlIHBsYXllclxuICAgIHRoaXMuY29tcG9uZW50cy5zZXQoXCJnYW1lbW9kZVwiLCB2YWx1ZSk7XG5cbiAgICAvLyBDYWxsIHRoZSBvbkdhbWVtb2RlQ2hhbmdlIGV2ZW50IGZvciB0aGUgcGxheWVyXG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiB0aGlzLnRyYWl0cy52YWx1ZXMoKSkgdHJhaXQub25HYW1lbW9kZUNoYW5nZT8uKHZhbHVlKTtcblxuICAgIC8vIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBhYmlsaXR5IHRvIGZseSBiYXNlZCBvbiB0aGUgZ2FtZW1vZGVcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlIEdhbWVtb2RlLlN1cnZpdmFsOlxuICAgICAgY2FzZSBHYW1lbW9kZS5BZHZlbnR1cmU6IHtcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgYWJpbGl0eSB0byBmbHlcbiAgICAgICAgdGhpcy5hYmlsaXRpZXMuc2V0KEFiaWxpdHlJbmRleC5NYXlGbHksIGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgR2FtZW1vZGUuQ3JlYXRpdmU6XG4gICAgICBjYXNlIEdhbWVtb2RlLlNwZWN0YXRvcjoge1xuICAgICAgICAvLyBFbmFibGUgdGhlIGFiaWxpdHkgdG8gZmx5XG4gICAgICAgIHRoaXMuYWJpbGl0aWVzLnNldChBYmlsaXR5SW5kZXguTWF5Rmx5LCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHNldCBwbGF5ZXIgZ2FtZSB0eXBlIHBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCgpO1xuICAgIHBhY2tldC5nYW1lbW9kZSA9IHZhbHVlO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLnNlbmQocGFja2V0KTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBkaW1lbnNpb246IERpbWVuc2lvbixcbiAgICBjb25uZWN0aW9uOiBDb25uZWN0aW9uLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBsYXllclByb3BlcnRpZXM+XG4gICkge1xuICAgIHN1cGVyKGRpbWVuc2lvbiwgRW50aXR5SWRlbnRpZmllci5QbGF5ZXIsIHByb3BlcnRpZXMpO1xuXG4gICAgLy8gQXNzaWduIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXG4gICAgLy8gU3ByZWFkIHRoZSBkZWZhdWx0IHByb3BlcnRpZXMgYW5kIHRoZSBwcm92aWRlZCBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLkRlZmF1bHRQbGF5ZXJQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XG5cbiAgICAvLyBBc3NpZ24gdGhlIHByb3BlcnRpZXMgdG8gdGhlIHBsYXllclxuICAgIHRoaXMudXNlcm5hbWUgPSBwcm9wcy51c2VybmFtZTtcbiAgICB0aGlzLnh1aWQgPSBwcm9wcy54dWlkO1xuICAgIHRoaXMudXVpZCA9IHByb3BzLnV1aWQ7XG4gICAgdGhpcy5kZXZpY2UgPSBwcm9wcy5kZXZpY2U7XG4gICAgdGhpcy5za2luID0gcHJvcHMuc2tpbjtcblxuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgcGVybWlzc2lvbiBsZXZlbCBmcm9tIHRoZSBwZXJtaXNzaW9ucyBtYXBcbiAgICB0aGlzLnBlcm1pc3Npb24gPSB0aGlzLnNlcmVuaXR5LnBlcm1pc3Npb25zLmdldCh0aGlzLnV1aWQpO1xuXG4gICAgLy8gSWYgdGhlIHBsYXllciBwcm9wZXJ0aWVzIGNvbnRhaW5zIGFuIGVudHJ5LCBsb2FkIGl0XG4gICAgaWYgKHByb3BlcnRpZXM/LmVudHJ5KVxuICAgICAgdGhpcy5sb2FkRGF0YUVudHJ5KGRpbWVuc2lvbi53b3JsZCwgcHJvcGVydGllcy5lbnRyeSk7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBwbGF5ZXJcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgdHJhaXRzIGZvciB0aGUgcGxheWVyXG4gICAgY29uc3QgdHJhaXRzID0gdGhpcy5kaW1lbnNpb24ud29ybGQuZW50aXR5UGFsZXR0ZS5nZXRSZWdpc3RyeUZvcihcbiAgICAgIHRoaXMudHlwZS5pZGVudGlmaWVyXG4gICAgKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSB0cmFpdHMgdG8gdGhlIHBsYXllciwgaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdHJhaXRzKSBpZiAoIXRoaXMuaGFzVHJhaXQodHJhaXQpKSB0aGlzLmFkZFRyYWl0KHRyYWl0KTtcblxuICAgIC8vIEFkZCB0aGUgZGVmYXVsdCBhYmlsaXRpZXMgdG8gdGhlIHBsYXllciwgaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgW2FiaWxpdHksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhEZWZhdWx0QWJpbGl0eVZhbHVlcykpIHtcbiAgICAgIGlmICghdGhpcy5hYmlsaXRpZXMuaGFzKCthYmlsaXR5IGFzIEFiaWxpdHlJbmRleCkpXG4gICAgICAgIHRoaXMuYWJpbGl0aWVzLnNldCgrYWJpbGl0eSBhcyBBYmlsaXR5SW5kZXgsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBwYWNrZXRzIHRvIHRoZSBwbGF5ZXIgKE5vcm1hbCBQcmlvcml0eSlcbiAgICogQHBhcmFtIHBhY2tldHMgVGhlIHBhY2tldHMgdG8gc2VuZCB0byB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgc2VuZCguLi5wYWNrZXRzOiBBcnJheTxEYXRhUGFja2V0Pik6IHZvaWQge1xuICAgIC8vIFNlbmQgdGhlIHBhY2tldHMgdG8gdGhlIHBsYXllclxuICAgIHRoaXMuc2VyZW5pdHkubmV0d29yay5zZW5kTm9ybWFsKHRoaXMuY29ubmVjdGlvbiwgLi4ucGFja2V0cyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBwYWNrZXRzIHRvIHRoZSBwbGF5ZXIgKEltbWVkaWF0ZSBQcmlvcml0eSlcbiAgICogQHBhcmFtIHBhY2tldHMgVGhlIHBhY2tldHMgdG8gc2VuZCB0byB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgc2VuZEltbWVkaWF0ZSguLi5wYWNrZXRzOiBBcnJheTxEYXRhUGFja2V0Pik6IHZvaWQge1xuICAgIC8vIFNlbmQgdGhlIHBhY2tldHMgdG8gdGhlIHBsYXllclxuICAgIHRoaXMuc2VyZW5pdHkubmV0d29yay5zZW5kSW1tZWRpYXRlKHRoaXMuY29ubmVjdGlvbiwgLi4ucGFja2V0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBhbiBvcGVyYXRvclxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwbGF5ZXIgaXMgYW4gb3BlcmF0b3JcbiAgICovXG4gIHB1YmxpYyBpc09wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBlcm1pc3Npb24gPT09IFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIG9wZXJhdG9yIHN0YXR1cyB0byB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgb3AoKTogdm9pZCB7XG4gICAgLy8gU2V0IHRoZSBwbGF5ZXIncyBwZXJtaXNzaW9uIGxldmVsIHRvIG9wZXJhdG9yXG4gICAgdGhpcy5wZXJtaXNzaW9uID0gUGVybWlzc2lvbkxldmVsLk9wZXJhdG9yO1xuXG4gICAgLy8gU2V0IHRoZSBwbGF5ZXIncyBwZXJtaXNzaW9uIGxldmVsIHRvIG9wZXJhdG9yIGluIHRoZSBwZXJtaXNzaW9ucyBtYXBcbiAgICB0aGlzLnNlcmVuaXR5LnBlcm1pc3Npb25zLnNldCh0aGlzLnV1aWQsIFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcik7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBsYXllcidzIGFiaWxpdGllc1xuICAgIHRoaXMuYWJpbGl0aWVzLnNldChBYmlsaXR5SW5kZXguT3BlcmF0b3JDb21tYW5kcywgdHJ1ZSk7XG4gICAgdGhpcy5hYmlsaXRpZXMuc2V0KEFiaWxpdHlJbmRleC5UZWxlcG9ydCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBvcGVyYXRvciBzdGF0dXMgZnJvbSB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZGVvcCgpOiB2b2lkIHtcbiAgICAvLyBTZXQgdGhlIHBsYXllcidzIHBlcm1pc3Npb24gbGV2ZWwgdG8gbWVtYmVyXG4gICAgdGhpcy5wZXJtaXNzaW9uID0gUGVybWlzc2lvbkxldmVsLk1lbWJlcjtcblxuICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgcGVybWlzc2lvbiBsZXZlbCB0byBtZW1iZXIgaW4gdGhlIHBlcm1pc3Npb25zIG1hcFxuICAgIHRoaXMuc2VyZW5pdHkucGVybWlzc2lvbnMuc2V0KHRoaXMudXVpZCwgUGVybWlzc2lvbkxldmVsLk1lbWJlcik7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBsYXllcidzIGFiaWxpdGllc1xuICAgIHRoaXMuYWJpbGl0aWVzLnNldChBYmlsaXR5SW5kZXguT3BlcmF0b3JDb21tYW5kcywgZmFsc2UpO1xuICAgIHRoaXMuYWJpbGl0aWVzLnNldChBYmlsaXR5SW5kZXguVGVsZXBvcnQsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgc2VydmVyXG4gICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3IgdGhlIGRpc2Nvbm5lY3Rpb25cbiAgICogQHBhcmFtIGNvZGUgVGhlIGRpc2Nvbm5lY3QgcmVhc29uIGNvZGVcbiAgICogQHBhcmFtIGhpZGVEaXNjb25uZWN0U2NyZWVuIFdoZXRoZXIgdG8gaGlkZSB0aGUgZGlzY29ubmVjdCBzY3JlZW5cbiAgICovXG4gIHB1YmxpYyBkaXNjb25uZWN0KFxuICAgIHJlYXNvbjogc3RyaW5nLFxuICAgIGNvZGU/OiBEaXNjb25uZWN0UmVhc29uLFxuICAgIGhpZGVEaXNjb25uZWN0U2NyZWVuPzogZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGRpc2Nvbm5lY3QgcGFja2V0IHdpdGggdGhlIHNwZWNpZmllZCByZWFzb25cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgRGlzY29ubmVjdFBhY2tldCgpO1xuICAgIHBhY2tldC5tZXNzYWdlID0gbmV3IERpc2Nvbm5lY3RNZXNzYWdlKHJlYXNvbiwgcmVhc29uKTtcbiAgICBwYWNrZXQucmVhc29uID0gY29kZSA/PyBEaXNjb25uZWN0UmVhc29uLktpY2tlZDtcbiAgICBwYWNrZXQuaGlkZURpc2Nvbm5lY3RTY3JlZW4gPSBoaWRlRGlzY29ubmVjdFNjcmVlbiA/PyBmYWxzZTtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgdGhpcy5zZW5kSW1tZWRpYXRlKHBhY2tldCk7XG5cbiAgICAvLyBEZXNwYXduIHRoZSBwbGF5ZXIgZnJvbSB0aGUgd29ybGRcbiAgICB0aGlzLmRlc3Bhd24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgc2VudC5cbiAgICovXG4gIHB1YmxpYyBzZW5kTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb25zdHJ1Y3QgdGhlIHRleHQgcGFja2V0LlxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBUZXh0UGFja2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHBhY2tldCBkYXRhLlxuICAgIHBhY2tldC50eXBlID0gVGV4dFBhY2tldFR5cGUuUmF3O1xuICAgIHBhY2tldC5uZWVkc1RyYW5zbGF0aW9uID0gZmFsc2U7XG4gICAgcGFja2V0LnNvdXJjZSA9IG51bGw7XG4gICAgcGFja2V0Lm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHBhY2tldC5wYXJhbWV0ZXJzID0gbnVsbDtcbiAgICBwYWNrZXQueHVpZCA9IFwiXCI7XG4gICAgcGFja2V0LnBsYXRmb3JtQ2hhdElkID0gXCJcIjtcbiAgICBwYWNrZXQuZmlsdGVyZWQgPSBcIlwiO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0LlxuICAgIHRoaXMuc2VuZChwYWNrZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGNvbnRhaW5lciBmcm9tIHRoZSBwbGF5ZXIuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gZ2V0LlxuICAgKi9cbiAgcHVibGljIGdldENvbnRhaW5lcihcbiAgICBuYW1lOiBDb250YWluZXJOYW1lLFxuICAgIGR5bmFtaWNJZD86IG51bWJlclxuICApOiBDb250YWluZXIgfCBudWxsIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgc3VwZXIgaW5zdGFuY2Ugd2lsbCBmZXRjaCB0aGUgY29udGFpbmVyXG4gICAgY29uc3QgY29udGFpbmVyID0gc3VwZXIuZ2V0Q29udGFpbmVyKG5hbWUsIGR5bmFtaWNJZCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29udGFpbmVyIGlzIG51bGwgYW5kIHRoZSBuYW1lIGlzIGR5bmFtaWNcbiAgICBpZiAoY29udGFpbmVyID09PSBudWxsICYmIG5hbWUgPT09IENvbnRhaW5lck5hbWUuRHluYW1pYykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgdGhlIGN1cnNvciB0cmFpdFxuICAgICAgaWYgKCF0aGlzLmhhc1RyYWl0KFBsYXllckN1cnNvclRyYWl0KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBsYXllciBkb2VzIG5vdCBoYXZlIGEgY3Vyc29yIHRyYWl0LlwiKTtcblxuICAgICAgLy8gR2V0IHRoZSBjdXJzb3IgdHJhaXRcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSB0aGlzLmdldFRyYWl0KFBsYXllckN1cnNvclRyYWl0KTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBpdGVtcyBpbiB0aGUgY29udGFpbmVyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29udGFpbmVyLnN0b3JhZ2UpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGl0ZW0gaXMgdmFsaWRcbiAgICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBoYXMgYSBJdGVtQnVuZGxlVHJhaXRcbiAgICAgICAgaWYgKGl0ZW0uaGFzVHJhaXQoSXRlbUJ1bmRsZVRyYWl0KSkge1xuICAgICAgICAgIC8vIEdldCB0aGUgYnVuZGxlIHRyYWl0XG4gICAgICAgICAgY29uc3QgYnVuZGxlID0gaXRlbS5nZXRUcmFpdChJdGVtQnVuZGxlVHJhaXQpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1bmRsZSBoYXMgdGhlIGR5bmFtaWMgaWRcbiAgICAgICAgICBpZiAoYnVuZGxlLmR5bmFtaWNJZCA9PT0gZHluYW1pY0lkKSByZXR1cm4gYnVuZGxlLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBzdXBlciBpbnN0YW5jZSBmb3VuZCB0aGUgY29udGFpbmVyXG4gICAgaWYgKGNvbnRhaW5lciAhPT0gbnVsbCkgcmV0dXJuIGNvbnRhaW5lcjtcblxuICAgIC8vIFN3aXRjaCB0aGUgY29udGFpbmVyIG5hbWVcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBvcGVuZWQgY29udGFpbmVyIGlmIGl0IGV4aXN0c1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuZWRDb250YWluZXI7XG4gICAgICB9XG5cbiAgICAgIC8vIGNhc2UgQ29udGFpbmVyTmFtZS5DcmFmdGluZ0lucHV0OiB7XG4gICAgICAvLyAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIHRoZSBjcmFmdGluZyBpbnB1dCBjb21wb25lbnRcbiAgICAgIC8vICAgaWYgKCF0aGlzLmhhc0NvbXBvbmVudChcIm1pbmVjcmFmdDpjcmFmdGluZ19pbnB1dFwiKSlcbiAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGxheWVyIGRvZXMgbm90IGhhdmUgYSBjcmFmdGluZyBpbnB1dC5cIik7XG5cbiAgICAgIC8vICAgLy8gR2V0IHRoZSBjcmFmdGluZyBpbnB1dCBjb21wb25lbnRcbiAgICAgIC8vICAgY29uc3QgY3JhZnRpbmdJbnB1dCA9IHRoaXMuZ2V0Q29tcG9uZW50KFwibWluZWNyYWZ0OmNyYWZ0aW5nX2lucHV0XCIpO1xuXG4gICAgICAvLyAgIC8vIFJldHVybiB0aGUgY3JhZnRpbmcgaW5wdXQgY29udGFpbmVyXG4gICAgICAvLyAgIHJldHVybiBjcmFmdGluZ0lucHV0LmNvbnRhaW5lcjtcbiAgICAgIC8vIH1cblxuICAgICAgY2FzZSBDb250YWluZXJOYW1lLkN1cnNvcjoge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyB0aGUgY3Vyc29yIHRyYWl0XG4gICAgICAgIGlmICghdGhpcy5oYXNUcmFpdChQbGF5ZXJDdXJzb3JUcmFpdCkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHBsYXllciBkb2VzIG5vdCBoYXZlIGEgY3Vyc29yIHRyYWl0LlwiKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGN1cnNvciB0cmFpdFxuICAgICAgICBjb25zdCBjdXJzb3IgPSB0aGlzLmdldFRyYWl0KFBsYXllckN1cnNvclRyYWl0KTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIGN1cnNvciBjb250YWluZXJcbiAgICAgICAgcmV0dXJuIGN1cnNvci5jb250YWluZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXduIHRoZSBwbGF5ZXIgaW4gdGhlIGRpbWVuc2lvblxuICAgKi9cbiAgcHVibGljIHNwYXduKCk6IHRoaXMge1xuICAgIC8vIENhbGwgdGhlIHN1cGVyIG1ldGhvZCB0byBzcGF3biB0aGUgcGxheWVyXG4gICAgc3VwZXIuc3Bhd24oKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYWJpbGl0aWVzIG9mIHRoZSBwbGF5ZXJcbiAgICB0aGlzLmFiaWxpdGllcy51cGRhdGUoKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBDcmVhdGl2ZUNvbnRlbnRQYWNrZXQsIGFuZCBtYXAgdGhlIGNyZWF0aXZlIGNvbnRlbnQgdG8gdGhlIHBhY2tldFxuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXcgQ3JlYXRpdmVDb250ZW50UGFja2V0KCk7XG4gICAgY29udGVudC5pdGVtcyA9IHRoaXMuZ2V0V29ybGQoKVxuICAgICAgLml0ZW1QYWxldHRlLmdldENyZWF0aXZlQ29udGVudCgpXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV0d29yazogaXRlbS50eXBlLm5ldHdvcmssXG4gICAgICAgICAgbWV0YWRhdGE6IGl0ZW0ubWV0YWRhdGEsXG4gICAgICAgICAgc3RhY2tTaXplOiAxLFxuICAgICAgICAgIG5ldHdvcmtCbG9ja0lkOlxuICAgICAgICAgICAgaXRlbS50eXBlLmJsb2NrPy5wZXJtdXRhdGlvbnNbaXRlbS5tZXRhZGF0YV0/Lm5ldHdvcmsgPz8gMCxcbiAgICAgICAgICBleHRyYXM6IHtcbiAgICAgICAgICAgIGNhbkRlc3Ryb3k6IFtdLFxuICAgICAgICAgICAgY2FuUGxhY2VPbjogW10sXG4gICAgICAgICAgICBuYnQ6IGl0ZW0ubmJ0XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAvLyBTZXJpYWxpemUgdGhlIGF2YWlsYWJsZSBjb21tYW5kcyBmb3IgdGhlIHBsYXllclxuICAgIGNvbnN0IGNvbW1hbmRzID0gdGhpcy5nZXRXb3JsZCgpLmNvbW1hbmRzLnNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gRmlsdGVyIHRoZSBjb21tYW5kcyBieSB0aGUgcGxheWVyJ3MgcGVybWlzc2lvbiBsZXZlbFxuICAgIGNvbW1hbmRzLmNvbW1hbmRzID0gY29tbWFuZHMuY29tbWFuZHMuZmlsdGVyKFxuICAgICAgKHgpID0+IHgucGVybWlzc2lvbkxldmVsIDw9IHRoaXMucGVybWlzc2lvblxuICAgICk7XG5cbiAgICAvLyBTZW5kIHRoZSBhdmFpbGFibGUgY29tbWFuZHMgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICB0aGlzLnNlbmQoY29udGVudCwgY29tbWFuZHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBwbGF5ZXJcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2ZlcnMgdGhlIHBsYXllciB0byBhIGRpZmZlcmVudCBzZXJ2ZXIuXG4gICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIHRyYW5zZmVyIHRoZSBwbGF5ZXIgdG8uXG4gICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIHRyYW5zZmVyIHRoZSBwbGF5ZXIgdG8uXG4gICAqIEBwYXJhbSByZWxvYWQgSWYgdGhlIHdvcmxkIHNob3VsZCBiZSByZWxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyB0cmFuc2ZlcihhZGRyZXNzOiBzdHJpbmcsIHBvcnQ6IG51bWJlciwgcmVsb2FkID0gZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgVHJhbnNmZXJQYWNrZXRcbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgVHJhbnNmZXJQYWNrZXQoKTtcblxuICAgIC8vIFNldCB0aGUgcGFja2V0IHByb3BlcnRpZXNcbiAgICBwYWNrZXQuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgcGFja2V0LnBvcnQgPSBwb3J0O1xuICAgIHBhY2tldC5yZWxvYWRXb3JsZCA9IHJlbG9hZDtcblxuICAgIC8vIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgcGxheWVyXG4gICAgdGhpcy5zZW5kKHBhY2tldCk7XG4gIH1cblxuICAvKipcbiAgICogVGVsZXBvcnRzIHRoZSBwbGF5ZXIgdG8gYSBzcGVjaWZpYyBwb3NpdGlvbi5cbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byB0ZWxlcG9ydCB0aGUgcGxheWVyIHRvLlxuICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gdGVsZXBvcnQgdGhlIHBsYXllciB0by5cbiAgICovXG4gIHB1YmxpYyB0ZWxlcG9ydChwb3NpdGlvbjogVmVjdG9yM2YsIGRpbWVuc2lvbj86IERpbWVuc2lvbik6IHZvaWQge1xuICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgcG9zaXRpb25cbiAgICB0aGlzLnBvc2l0aW9uLnggPSBwb3NpdGlvbi54O1xuICAgIHRoaXMucG9zaXRpb24ueSA9IHBvc2l0aW9uLnk7XG4gICAgdGhpcy5wb3NpdGlvbi56ID0gcG9zaXRpb24uejtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBkaW1lbnNpb24gaXMgcHJvdmlkZWRcbiAgICBpZiAoZGltZW5zaW9uKSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBuZXcgRW50aXR5RGltZW5zaW9uQ2hhbmdlU2lnbmFsKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmRpbWVuc2lvbixcbiAgICAgICAgZGltZW5zaW9uXG4gICAgICApO1xuXG4gICAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybjtcbiAgICAgIC8vIERlc3Bhd24gdGhlIHBsYXllciBmcm9tIHRoZSBjdXJyZW50IGRpbWVuc2lvblxuICAgICAgdGhpcy5kZXNwYXduKCk7XG5cbiAgICAgIGlmIChkaW1lbnNpb24ud29ybGQgIT09IHRoaXMuZGltZW5zaW9uLndvcmxkKSB7XG4gICAgICAgIC8vIFNhdmUgdGhlIHBsYXllcnMgY3VycmVudCBkYXRhXG4gICAgICAgIHRoaXMuZ2V0V29ybGQoKS5wcm92aWRlci53cml0ZVBsYXllcihcbiAgICAgICAgICB0aGlzLmdldERhdGFFbnRyeSgpLFxuICAgICAgICAgIHRoaXMuZGltZW5zaW9uXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcGxheWVyIGRhdGEgZnJvbSB0aGUgbmV3IHdvcmxkXG4gICAgICAgIGNvbnN0IGRhdGEgPSBkaW1lbnNpb24ud29ybGQucHJvdmlkZXIucmVhZFBsYXllcih0aGlzLnV1aWQsIGRpbWVuc2lvbik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBkYXRhIGV4aXN0c1xuICAgICAgICBpZiAoZGF0YSkgdGhpcy5sb2FkRGF0YUVudHJ5KGRpbWVuc2lvbi53b3JsZCwgZGF0YSwgdHJ1ZSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIENsZWFyIHRoZSBwbGF5ZXIncyBkYXRhXG4gICAgICAgICAgdGhpcy5jb21wb25lbnRzLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy50cmFpdHMuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLmFiaWxpdGllcy5jbGVhcigpO1xuICAgICAgICAgIHRoaXMubWV0YWRhdGEuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLmZsYWdzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbGF5ZXJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBkaW1lbnNpb24gdHlwZXMgYXJlIGRpZmZlcmVudFxuICAgICAgLy8gVGhpcyBhbGxvd3MgZm9yIGEgZmFzdGVyIGRpbWVuc2lvbiBjaGFuZ2UgaWYgdGhlIHR5cGVzIGFyZSB0aGUgc2FtZVxuICAgICAgaWYgKHRoaXMuZGltZW5zaW9uLnR5cGUgIT09IGRpbWVuc2lvbi50eXBlKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBDaGFuZ2VEaW1lbnNpb25QYWNrZXRcbiAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IENoYW5nZURpbWVuc2lvblBhY2tldCgpO1xuICAgICAgICBwYWNrZXQuZGltZW5zaW9uID0gZGltZW5zaW9uLnR5cGU7XG4gICAgICAgIHBhY2tldC5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICBwYWNrZXQucmVzcGF3biA9IHRydWU7XG4gICAgICAgIHBhY2tldC5oYXNMb2FkaW5nU2NyZWVuID0gZmFsc2U7XG5cbiAgICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgdGhpcy5zZW5kSW1tZWRpYXRlKHBhY2tldCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgbmV3IGRpbWVuc2lvblxuICAgICAgdGhpcy5kaW1lbnNpb24gPSBkaW1lbnNpb247XG5cbiAgICAgIC8vIFNwYXduIHRoZSBwbGF5ZXIgaW4gdGhlIG5ldyBkaW1lbnNpb25cbiAgICAgIHRoaXMuc3Bhd24oKTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5ZXIncyBwb3NpdGlvblxuICAgICAgcmV0dXJuIHRoaXMudGVsZXBvcnQocG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgTW92ZVBsYXllclBhY2tldFxuICAgICAgY29uc3QgcGFja2V0ID0gbmV3IE1vdmVQbGF5ZXJQYWNrZXQoKTtcblxuICAgICAgLy8gU2V0IHRoZSBwYWNrZXQgcHJvcGVydGllc1xuICAgICAgcGFja2V0LnJ1bnRpbWVJZCA9IHRoaXMucnVudGltZUlkO1xuICAgICAgcGFja2V0LnBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICBwYWNrZXQucGl0Y2ggPSB0aGlzLnJvdGF0aW9uLnBpdGNoO1xuICAgICAgcGFja2V0LnlhdyA9IHRoaXMucm90YXRpb24ueWF3O1xuICAgICAgcGFja2V0LmhlYWRZYXcgPSB0aGlzLnJvdGF0aW9uLmhlYWRZYXc7XG4gICAgICBwYWNrZXQubW9kZSA9IE1vdmVNb2RlLlRlbGVwb3J0O1xuICAgICAgcGFja2V0Lm9uR3JvdW5kID0gdGhpcy5vbkdyb3VuZDtcbiAgICAgIHBhY2tldC5yaWRkZW5SdW50aW1lSWQgPSAwbjtcbiAgICAgIHBhY2tldC5jYXVzZSA9IG5ldyBUZWxlcG9ydENhdXNlKDQsIDApO1xuICAgICAgcGFja2V0LmlucHV0VGljayA9IHRoaXMuaW5wdXRUaWNrO1xuXG4gICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgdGhpcy5zZW5kKHBhY2tldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBsYXllcidzIGRhdGEgYXMgYSBkYXRhYmFzZSBlbnRyeVxuICAgKiBAcmV0dXJucyBUaGUgcGxheWVyIGVudHJ5XG4gICAqL1xuICBwdWJsaWMgZ2V0RGF0YUVudHJ5KCk6IFBsYXllckVudHJ5IHtcbiAgICAvLyBDcmVhdGUgdGhlIHBsYXllciBlbnRyeSB0byBzYXZlXG4gICAgY29uc3QgZW50cnk6IFBsYXllckVudHJ5ID0ge1xuICAgICAgdXNlcm5hbWU6IHRoaXMudXNlcm5hbWUsXG4gICAgICB4dWlkOiB0aGlzLnh1aWQsXG4gICAgICB1dWlkOiB0aGlzLnV1aWQsXG4gICAgICB1bmlxdWVJZDogdGhpcy51bmlxdWVJZCxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMudHlwZS5pZGVudGlmaWVyLFxuICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbixcbiAgICAgIGNvbXBvbmVudHM6IFsuLi50aGlzLmNvbXBvbmVudHMuZW50cmllcygpXSxcbiAgICAgIHRyYWl0czogWy4uLnRoaXMudHJhaXRzLmtleXMoKV0sXG4gICAgICBtZXRhZGF0YTogWy4uLnRoaXMubWV0YWRhdGEuZW50cmllcygpXSxcbiAgICAgIGZsYWdzOiBbLi4udGhpcy5mbGFncy5lbnRyaWVzKCldLFxuICAgICAgYXR0cmlidXRlczogWy4uLnRoaXMuYXR0cmlidXRlcy5lbnRyaWVzKCldLFxuICAgICAgYWJpbGl0aWVzOiBbLi4udGhpcy5hYmlsaXRpZXMuZW50cmllcygpXSxcbiAgICAgIHNjb3JlYm9hcmRJZGVudGl0eTogdGhpcy5zY29yZWJvYXJkSWRlbnRpdHkuaWRlbnRpZmllclxuICAgIH07XG5cbiAgICAvLyBSZXR1cm4gdGhlIHBsYXllciBlbnRyeVxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBwbGF5ZXIgZnJvbSB0aGUgcHJvdmlkZWQgcGxheWVyIGVudHJ5XG4gICAqIEBwYXJhbSB3b3JsZCBUaGUgd29ybGQgdGhlIHBsYXllciBkYXRhIGlzIGNvbWluZyBmcm9tXG4gICAqIEBwYXJhbSBlbnRyeSBUaGUgcGxheWVyIGVudHJ5IHRvIGxvYWRcbiAgICogQHBhcmFtIG92ZXJ3cml0ZSBXaGV0aGVyIHRvIG92ZXJ3cml0ZSB0aGUgY3VycmVudCBwbGF5ZXIgZGF0YTsgZGVmYXVsdCBpcyB0cnVlXG4gICAqL1xuICBwdWJsaWMgbG9hZERhdGFFbnRyeShcbiAgICB3b3JsZDogV29ybGQsXG4gICAgZW50cnk6IFBsYXllckVudHJ5LFxuICAgIG92ZXJ3cml0ZSA9IHRydWVcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgdXNlcm5hbWUgbWF0Y2hlcyB0aGUgcGxheWVyJ3MgdXNlcm5hbWVcbiAgICBpZiAoZW50cnkudXNlcm5hbWUgIT09IHRoaXMudXNlcm5hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgcGxheWVyIGVudHJ5IGFzIHRoZSB1c2VybmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGxheWVyJ3MgdXNlcm5hbWUhXCJcbiAgICAgICk7XG5cbiAgICAvLyBDaGVjayB0aGF0IHRoZSB1dWlkIG1hdGNoZXMgdGhlIHBsYXllcidzIHV1aWRcbiAgICBpZiAoZW50cnkudXVpZCAhPT0gdGhpcy51dWlkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBsb2FkIHBsYXllciBlbnRyeSBhcyB0aGUgdXVpZCBkb2VzIG5vdCBtYXRjaCB0aGUgcGxheWVyJ3MgdXVpZCFcIlxuICAgICAgKTtcblxuICAgIC8vIENoZWNrIHRoYXQgdGhlIHh1aWQgbWF0Y2hlcyB0aGUgcGxheWVyJ3MgeHVpZFxuICAgIGlmIChlbnRyeS54dWlkICE9PSB0aGlzLnh1aWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgcGxheWVyIGVudHJ5IGFzIHRoZSB4dWlkIGRvZXMgbm90IG1hdGNoIHRoZSBwbGF5ZXIncyB4dWlkIVwiXG4gICAgICApO1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgdW5pcXVlIGlkIG1hdGNoZXMgdGhlIHBsYXllcidzIHVuaXF1ZSBpZFxuICAgIGlmIChlbnRyeS51bmlxdWVJZCAhPT0gdGhpcy51bmlxdWVJZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gbG9hZCBwbGF5ZXIgZW50cnkgYXMgdGhlIHVuaXF1ZSBpZCBkb2VzIG5vdCBtYXRjaCB0aGUgcGxheWVyJ3MgdW5pcXVlIGlkIVwiXG4gICAgICApO1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgaWRlbnRpZmllciBtYXRjaGVzIHRoZSBwbGF5ZXIncyBpZGVudGlmaWVyXG4gICAgaWYgKGVudHJ5LmlkZW50aWZpZXIgIT09IHRoaXMudHlwZS5pZGVudGlmaWVyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBsb2FkIHBsYXllciBlbnRyeSBhcyB0aGUgaWRlbnRpZmllciBkb2VzIG5vdCBtYXRjaCB0aGUgcGxheWVyJ3MgaWRlbnRpZmllciFcIlxuICAgICAgKTtcblxuICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgcG9zaXRpb24gYW5kIHJvdGF0aW9uXG4gICAgdGhpcy5wb3NpdGlvbi5zZXQoZW50cnkucG9zaXRpb24pO1xuICAgIHRoaXMucm90YXRpb24uc2V0KGVudHJ5LnJvdGF0aW9uKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgc2hvdWxkIG92ZXJ3cml0ZSB0aGUgY3VycmVudCBkYXRhXG4gICAgaWYgKG92ZXJ3cml0ZSkge1xuICAgICAgdGhpcy5jb21wb25lbnRzLmNsZWFyKCk7XG4gICAgICB0aGlzLnRyYWl0cy5jbGVhcigpO1xuICAgICAgdGhpcy5hYmlsaXRpZXMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGNvbXBvbmVudHMgdG8gdGhlIHBsYXllciwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJ5LmNvbXBvbmVudHMpIHtcbiAgICAgIGlmICghdGhpcy5jb21wb25lbnRzLmhhcyhrZXkpKSB0aGlzLmNvbXBvbmVudHMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGUgdHJhaXRzIHRvIHRoZSBwbGF5ZXIsIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RcbiAgICAvLyBBZGQgdGhlIHRyYWl0cyB0byB0aGUgZW50aXR5LCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiBlbnRyeS50cmFpdHMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWxldHRlIGhhcyB0aGUgdHJhaXRcbiAgICAgIGNvbnN0IHRyYWl0VHlwZSA9IHdvcmxkLmVudGl0eVBhbGV0dGUudHJhaXRzLmdldCh0cmFpdCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBleGlzdHMgaW4gdGhlIHBhbGV0dGVcbiAgICAgIGlmICghdHJhaXRUeXBlKSB7XG4gICAgICAgIHdvcmxkLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgdHJhaXQgXCIke3RyYWl0fVwiIGZvciBwbGF5ZXIgXCIke3RoaXMudXNlcm5hbWV9OiR7dGhpcy51bmlxdWVJZH1cIiBhcyBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcGFsZXR0ZWBcbiAgICAgICAgKTtcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQXR0ZW1wdCB0byBhZGQgdGhlIHRyYWl0IHRvIHRoZSBlbnRpdHlcbiAgICAgIHRoaXMuYWRkVHJhaXQodHJhaXRUeXBlIGFzIHR5cGVvZiBFbnRpdHlUcmFpdCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBtZXRhZGF0YSB0byB0aGUgcGxheWVyLCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cnkubWV0YWRhdGEpIHtcbiAgICAgIGlmICghdGhpcy5tZXRhZGF0YS5oYXMoa2V5KSkgdGhpcy5tZXRhZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBmbGFncyB0byB0aGUgcGxheWVyLCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgZm9yIChjb25zdCBbZmxhZywgdmFsdWVdIG9mIGVudHJ5LmZsYWdzKSB7XG4gICAgICBpZiAoIXRoaXMuZmxhZ3MuaGFzKGZsYWcpKSB0aGlzLmZsYWdzLnNldChmbGFnLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBhdHRyaWJ1dGVzIHRvIHRoZSBwbGF5ZXIsIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3RcbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGUsIHZhbHVlXSBvZiBlbnRyeS5hdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoIXRoaXMuYXR0cmlidXRlcy5oYXMoYXR0cmlidXRlKSlcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnNldChhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIGFiaWxpdGllcyB0byB0aGUgcGxheWVyLCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0XG4gICAgZm9yIChjb25zdCBbYWJpbGl0eSwgdmFsdWVdIG9mIGVudHJ5LmFiaWxpdGllcykge1xuICAgICAgaWYgKCF0aGlzLmFiaWxpdGllcy5oYXMoYWJpbGl0eSkpIHRoaXMuYWJpbGl0aWVzLnNldChhYmlsaXR5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFBsYXllciB9O1xuIiwgImltcG9ydCB7XG4gIERldmljZU9TLFxuICBJbnB1dE1vZGUsXG4gIEludGVyYWN0aW9uTW9kZSxcbiAgTWVtb3J5VGllcixcbiAgUGxheU1vZGVcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmNsYXNzIERldmljZSB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGV2aWNlLlxuICAgKiBUaGlzIGlzIGEgdXVpZCBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgb2YgdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSBvZiB0aGUgZGV2aWNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9zOiBEZXZpY2VPUztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdmlldyBkaXN0YW5jZSBvZiB0aGUgZGV2aWNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heFZpZXdEaXN0YW5jZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtb3J5IHRpZXIgb2YgdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZW1vcnlUaWVyOiBNZW1vcnlUaWVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbW9kZSBvZiB0aGUgZGV2aWNlLlxuICAgKi9cbiAgcHVibGljIGlucHV0TW9kZTogSW5wdXRNb2RlID0gSW5wdXRNb2RlLlVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcmFjdGlvbiBtb2RlIG9mIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwdWJsaWMgaW50ZXJhY3Rpb25Nb2RlOiBJbnRlcmFjdGlvbk1vZGUgPSBJbnRlcmFjdGlvbk1vZGUuQ2xhc3NpYztcblxuICAvKipcbiAgICogVGhlIHBsYXkgbW9kZSBvZiB0aGUgZGV2aWNlLlxuICAgKi9cbiAgcHVibGljIHBsYXlNb2RlOiBQbGF5TW9kZSA9IFBsYXlNb2RlLk5vcm1hbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBkZXZpY2UgaW5mb3JtYXRpb24gb2JqZWN0LlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIG9mIHRoZSBkZXZpY2UuXG4gICAqIEBwYXJhbSBvcyBUaGUgb3BlcmF0aW5nIHN5c3RlbSBvZiB0aGUgZGV2aWNlLlxuICAgKiBAcGFyYW0gbWF4Vmlld0Rpc3RhbmNlIFRoZSBtYXhpbXVtIHZpZXcgZGlzdGFuY2Ugb2YgdGhlIGRldmljZS5cbiAgICogQHBhcmFtIG1lbW9yeVRpZXIgVGhlIG1lbW9yeSB0aWVyIG9mIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIG1vZGVsOiBzdHJpbmcsXG4gICAgb3M6IERldmljZU9TLFxuICAgIG1heFZpZXdEaXN0YW5jZTogbnVtYmVyLFxuICAgIG1lbW9yeVRpZXI6IE1lbW9yeVRpZXJcbiAgKSB7XG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5vcyA9IG9zO1xuICAgIHRoaXMubWF4Vmlld0Rpc3RhbmNlID0gbWF4Vmlld0Rpc3RhbmNlO1xuICAgIHRoaXMubWVtb3J5VGllciA9IG1lbW9yeVRpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBlbXB0eSBkZXZpY2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJucyBBbiBlbXB0eSBkZXZpY2Ugb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBlbXB0eSgpOiBEZXZpY2Uge1xuICAgIHJldHVybiBuZXcgRGV2aWNlKFwiXCIsIFwiXCIsIERldmljZU9TLlVuZGVmaW5lZCwgMCwgTWVtb3J5VGllci5VbmRldGVybWluZWQpO1xuICB9XG59XG5cbmV4cG9ydCB7IERldmljZSB9O1xuIiwgImltcG9ydCB7IEVudGl0eUlkZW50aWZpZXIgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7IEVudGl0eUVudW0gfSBmcm9tIFwiLi4vY29tbWFuZHNcIjtcblxuaW1wb3J0IHsgQ3VzdG9tRW50aXR5VHlwZSwgRW50aXR5VHlwZSB9IGZyb20gXCIuL2lkZW50aXR5XCI7XG5cbmltcG9ydCB7IEVudGl0eVRyYWl0cyB9IGZyb20gXCIuXCI7XG5cbmltcG9ydCB0eXBlIHsgRW50aXR5VHJhaXQsIFBsYXllclRyYWl0IH0gZnJvbSBcIi4vdHJhaXRzXCI7XG5cbmNsYXNzIEVudGl0eVBhbGV0dGUge1xuICAvKipcbiAgICogVGhlIHR5cGVzIG9mIGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXMgPSBFbnRpdHlUeXBlLnR5cGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJhaXRzIHJlZ2lzdGVyZWQgaW4gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgdHlwZW9mIEVudGl0eVRyYWl0IHwgdHlwZW9mIFBsYXllclRyYWl0XG4gID4oKTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdHJ5IGZvciB0aGUgZW50aXR5IHRyYWl0cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpc3RyeSA9IG5ldyBNYXA8XG4gICAgRW50aXR5SWRlbnRpZmllcixcbiAgICBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQgfCB0eXBlb2YgUGxheWVyVHJhaXQ+XG4gID4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBlbnRpdHkgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBSZWdpc3RlciBhbGwgZW50aXR5IHRyYWl0cy5cbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIEVudGl0eVRyYWl0cykgdGhpcy5yZWdpc3RlclRyYWl0KHRyYWl0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCBlbnRpdHkgdHlwZXMgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICogQHJldHVybnMgQWxsIGVudGl0eSB0eXBlcyBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIGdldEFsbFR5cGVzKCk6IEFycmF5PEVudGl0eVR5cGU+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMudHlwZXMudmFsdWVzKCldO1xuICB9XG5cbiAgcHVibGljIGdldEFsbEN1c3RvbVR5cGVzKCk6IEFycmF5PEN1c3RvbUVudGl0eVR5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxUeXBlcygpLmZpbHRlcihcbiAgICAgICh0eXBlKSA9PiB0eXBlIGluc3RhbmNlb2YgQ3VzdG9tRW50aXR5VHlwZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBlbnRpdHkgdHlwZSBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZW50aXR5IGlkZW50aWZpZXIgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBUaGUgZW50aXR5IHR5cGUgZnJvbSB0aGUgcGFsZXR0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRUeXBlKGlkZW50aWZpZXI6IHN0cmluZyk6IEVudGl0eVR5cGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50eXBlcy5nZXQoaWRlbnRpZmllcikgYXMgRW50aXR5VHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGVudGl0eSB0eXBlIGZyb20gdGhlIHBhbGV0dGUgYnkgaXRzIHVuaXF1ZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gdW5pcXVlIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZW50aXR5IHR5cGUuXG4gICAqIEByZXR1cm5zIFRoZSBlbnRpdHkgdHlwZSBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIGdldFR5cGVCeVVuaXF1ZSh1bmlxdWU6IGJpZ2ludCk6IEVudGl0eVR5cGUgfCBudWxsIHtcbiAgICAvLyBDb252ZXJ0IHRoZSB1bmlxdWUgaWRlbnRpZmllciB0byBhIG5ldHdvcmsgaWRlbnRpZmllci5cbiAgICBjb25zdCBuZXR3b3JrID0gTnVtYmVyKHVuaXF1ZSA+PiAxOW4pO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBlbnRpdHkgdHlwZXMuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIHRoaXMudHlwZXMudmFsdWVzKCkpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBuZXR3b3JrIGlkZW50aWZpZXIgbWF0Y2hlcy5cbiAgICAgIGlmICh0eXBlLm5ldHdvcmsgPT09IG5ldHdvcmspIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBudWxsIGlmIHRoZSBlbnRpdHkgdHlwZSB3YXMgbm90IGZvdW5kLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIGVudGl0eSB0eXBlIHRvIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgZW50aXR5IHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVudGl0eSB0eXBlIHdhcyByZWdpc3RlcmVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKHR5cGU6IEVudGl0eVR5cGUpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZW50aXR5IHR5cGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgIGlmICh0aGlzLnR5cGVzLmhhcyh0eXBlLmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZWdpc3RlciB0aGUgZW50aXR5IHR5cGUuXG4gICAgdGhpcy50eXBlcy5zZXQodHlwZS5pZGVudGlmaWVyLCB0eXBlKTtcblxuICAgIC8vIEFkZCB0aGUgZW50aXR5IHR5cGUgdG8gdGhlIGVudGl0eSBlbnVtLlxuICAgIEVudGl0eUVudW0ub3B0aW9ucy5wdXNoKHR5cGUuaWRlbnRpZmllcik7XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZW50aXR5IHR5cGUgd2FzIHJlZ2lzdGVyZWQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZW50aXR5IGlkZW50aWZpZXIgdG8gZ2V0IHRoZSByZWdpc3RyeSBmb3IuXG4gICAqIEByZXR1cm5zIFRoZSByZWdpc3RyeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBpZGVudGlmaWVyLlxuICAgKi9cbiAgcHVibGljIGdldFJlZ2lzdHJ5Rm9yKFxuICAgIGlkZW50aWZpZXI6IEVudGl0eUlkZW50aWZpZXJcbiAgKTogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PiB7XG4gICAgLy8gR2V0IHRoZSByZWdpc3RyeSBmb3IgdGhlIGdpdmVuIGVudGl0eSBpZGVudGlmaWVyLlxuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyeS5nZXQoaWRlbnRpZmllcikgfHwgW107XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJlZ2lzdHJ5LlxuICAgIHJldHVybiByZWdpc3RyeSBhcyBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgdHJhaXQgdG8gdGhlIHBhbGV0dGUuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHRyYWl0IHdhcyByZWdpc3RlcmVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdChcbiAgICB0cmFpdDogdHlwZW9mIEVudGl0eVRyYWl0IHwgdHlwZW9mIFBsYXllclRyYWl0XG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgdHJhaXQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgIGlmICh0aGlzLnRyYWl0cy5oYXModHJhaXQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBlbnRpdHkgdHJhaXQuXG4gICAgdGhpcy50cmFpdHMuc2V0KHRyYWl0LmlkZW50aWZpZXIsIHRyYWl0KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgdHlwZXMgb2YgdGhlIHRyYWl0LlxuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0cmFpdC50eXBlcyA/PyBbXSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlZ2lzdHJ5IGhhcyB0aGUgZW50aXR5IGlkZW50aWZpZXIuXG4gICAgICBpZiAoIXRoaXMucmVnaXN0cnkuaGFzKHR5cGUgYXMgRW50aXR5SWRlbnRpZmllcikpXG4gICAgICAgIC8vIFNldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBlbnRpdHkgaWRlbnRpZmllci5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5zZXQodHlwZSBhcyBFbnRpdHlJZGVudGlmaWVyLCBbXSk7XG5cbiAgICAgIC8vIEdldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBlbnRpdHkgaWRlbnRpZmllci5cbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5yZWdpc3RyeS5nZXQodHlwZSBhcyBFbnRpdHlJZGVudGlmaWVyKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlZ2lzdHJ5IGV4aXN0cy5cbiAgICAgIGlmIChyZWdpc3RyeSkge1xuICAgICAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgcmVnaXN0cnkuXG4gICAgICAgIHJlZ2lzdHJ5LnB1c2godHJhaXQpO1xuXG4gICAgICAgIC8vIFNldCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBlbnRpdHkgaWRlbnRpZmllci5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5zZXQodHlwZSBhcyBFbnRpdHlJZGVudGlmaWVyLCByZWdpc3RyeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVudGl0eSB0cmFpdCB3YXMgcmVnaXN0ZXJlZC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0cmFpdCBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgdHJhaXQuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHRyYWl0IHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVHJhaXQoaWRlbnRpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRyYWl0IGV4aXN0cy5cbiAgICBpZiAoIXRoaXMudHJhaXRzLmhhcyhpZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gR2V0IHRoZSB0cmFpdC5cbiAgICBjb25zdCB0cmFpdCA9IHRoaXMudHJhaXRzLmdldChpZGVudGlmaWVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0cmFpdCBleGlzdHMuXG4gICAgaWYgKCF0cmFpdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0eXBlcyBvZiB0aGUgdHJhaXQuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIHRyYWl0LnR5cGVzID8/IFtdKSB7XG4gICAgICAvLyBHZXQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgZW50aXR5IGlkZW50aWZpZXIuXG4gICAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMucmVnaXN0cnkuZ2V0KHR5cGUgYXMgRW50aXR5SWRlbnRpZmllcik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSByZWdpc3RyeSBleGlzdHMuXG4gICAgICBpZiAocmVnaXN0cnkpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICAgICAgdGhpcy5yZWdpc3RyeS5zZXQoXG4gICAgICAgICAgdHlwZSBhcyBFbnRpdHlJZGVudGlmaWVyLFxuICAgICAgICAgIHJlZ2lzdHJ5LmZpbHRlcigoYykgPT4gYyAhPT0gdHJhaXQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSBwYWxldHRlLlxuICAgIHRoaXMudHJhaXRzLmRlbGV0ZShpZGVudGlmaWVyKTtcblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSB0cmFpdCB3YXMgcmVtb3ZlZC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRyYWl0cyBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGdldEFsbFRyYWl0cygpOiBBcnJheTx0eXBlb2YgRW50aXR5VHJhaXQgfCB0eXBlb2YgUGxheWVyVHJhaXQ+IHtcbiAgICByZXR1cm4gWy4uLnRoaXMudHJhaXRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFpdCBmcm9tIHRoZSBwYWxldHRlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgdHJhaXQuXG4gICAqIEByZXR1cm5zIFRoZSB0cmFpdCBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIGdldFRyYWl0KFxuICAgIGlkZW50aWZpZXI6IHN0cmluZ1xuICApOiB0eXBlb2YgRW50aXR5VHJhaXQgfCB0eXBlb2YgUGxheWVyVHJhaXQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50cmFpdHMuZ2V0KGlkZW50aWZpZXIpIHx8IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHsgRW50aXR5UGFsZXR0ZSB9O1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL2lkZW50aXR5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnRpdHlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BsYXllclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHJhaXRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tYXBzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wYWxldHRlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb250YWluZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RldmljZVwiO1xuXG5pbXBvcnQgKiBhcyBUcmFpdHMgZnJvbSBcIi4vdHJhaXRzXCI7XG5cbi8qKlxuICogQSBsaXN0IG9mIGFsbCBlbnRpdHkgdHJhaXRzXG4gKi9cbmNvbnN0IEVudGl0eVRyYWl0cyA9IEFycmF5PHR5cGVvZiBUcmFpdHMuRW50aXR5VHJhaXQ+KCk7XG5cbi8vIEl0ZXJhdGUgb3ZlciBlYWNoIHRyYWl0XG5mb3IgKGNvbnN0IGtleSBpbiBUcmFpdHMpIHtcbiAgLy8gR2V0IHRoZSBlbnRpdHkgdHJhaXRcbiAgY29uc3QgdHJhaXQgPSBUcmFpdHNba2V5IGFzIGtleW9mIHR5cGVvZiBUcmFpdHNdO1xuXG4gIC8vIFB1c2ggdGhlIGVudGl0eSB0cmFpdCB0byB0aGUgbGlzdFxuICBFbnRpdHlUcmFpdHMucHVzaCh0cmFpdCk7XG59XG5cbmV4cG9ydCB7IEVudGl0eVRyYWl0cyB9O1xuIiwgImltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5pbXBvcnQge1xuICBDb250YWluZXJOYW1lLFxuICBJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uLFxuICBJdGVtU3RhY2tSZXF1ZXN0UGFja2V0LFxuICBQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IEl0ZW1TdGFjayB9IGZyb20gXCIuLi9pdGVtXCI7XG5pbXBvcnQgeyBFbnRpdHlJbnZlbnRvcnlUcmFpdCwgUGxheWVyQ3Vyc29yVHJhaXQgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5cbmNsYXNzIEl0ZW1TdGFja1JlcXVlc3RIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5JdGVtU3RhY2tSZXF1ZXN0O1xuXG4gIHB1YmxpYyBoYW5kbGUocGFja2V0OiBJdGVtU3RhY2tSZXF1ZXN0UGFja2V0LCBjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkucGxheWVycy5nZXQoY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcmVxdWVzdHMuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHBhY2tldC5yZXF1ZXN0cykge1xuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBhY3Rpb25zLlxuICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgcmVxdWVzdC5hY3Rpb25zKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgYSB0YWtlIG9yIHBsYWNlIGFjdGlvbi5cbiAgICAgICAgaWYgKGFjdGlvbi50YWtlT3JQbGFjZSkge1xuICAgICAgICAgIC8vIEdldCB0aGUgcmVxdWVzdC5cbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gYWN0aW9uLnRha2VPclBsYWNlO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgdHlwZSBhbmQgZGVzdGluYXRpb24gdHlwZS5cbiAgICAgICAgICBjb25zdCBzb3VyY2VDb250YWluZXIgPSByZXF1ZXN0LnNvdXJjZS5jb250YWluZXI7XG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db250YWluZXIgPSByZXF1ZXN0LmRlc3RpbmF0aW9uLmNvbnRhaW5lcjtcblxuICAgICAgICAgIGNvbnN0IHNvdXJjZVNsb3QgPSByZXF1ZXN0LnNvdXJjZS5zbG90O1xuICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uU2xvdCA9IHJlcXVlc3QuZGVzdGluYXRpb24uc2xvdDtcbiAgICAgICAgICBjb25zdCBhbW91bnQgPSByZXF1ZXN0LmFtb3VudCA/PyAxO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNvdXJjZSB0eXBlIGlzIGEgY3JlYXRpdmUgb3V0cHV0LlxuICAgICAgICAgIGlmIChzb3VyY2VDb250YWluZXIuaWRlbnRpZmllciA9PT0gQ29udGFpbmVyTmFtZS5DcmVhdGl2ZU91dHB1dClcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgLy8gRmV0Y2ggdGhlIHNvdXJjZSBjb250YWluZXIgZnJvbSB0aGUgcGxheWVyLlxuICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHBsYXllci5nZXRDb250YWluZXIoXG4gICAgICAgICAgICBzb3VyY2VDb250YWluZXIuaWRlbnRpZmllcixcbiAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5keW5hbWljSWRlbnRpZmllclxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc291cmNlIGNvbnRhaW5lciBleGlzdHMuXG4gICAgICAgICAgaWYgKCFzb3VyY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHNvdXJjZSB0eXBlOiAke0NvbnRhaW5lck5hbWVbc291cmNlQ29udGFpbmVyLmlkZW50aWZpZXJdfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBGZXRjaCB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyIGZyb20gdGhlIHBsYXllci5cbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHBsYXllci5nZXRDb250YWluZXIoXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkNvbnRhaW5lci5pZGVudGlmaWVyLFxuICAgICAgICAgICAgZGVzdGluYXRpb25Db250YWluZXIuZHluYW1pY0lkZW50aWZpZXJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciBleGlzdHMuXG4gICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgZGVzdGluYXRpb24gdHlwZTogJHtDb250YWluZXJOYW1lW2Rlc3RpbmF0aW9uQ29udGFpbmVyLmlkZW50aWZpZXJdfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBpdGVtLlxuICAgICAgICAgIGNvbnN0IHNvdXJjZUl0ZW0gPSBzb3VyY2UuZ2V0SXRlbShzb3VyY2VTbG90KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzb3VyY2UgaXRlbSBleGlzdHMuXG4gICAgICAgICAgaWYgKCFzb3VyY2VJdGVtKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNvdXJjZSBpdGVtLlwiKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGVzdGluYXRpb24gaXRlbS5cbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkl0ZW0gPSBkZXN0aW5hdGlvbi5nZXRJdGVtKGRlc3RpbmF0aW9uU2xvdCk7XG5cbiAgICAgICAgICBpZiAoYW1vdW50IDw9IHNvdXJjZUl0ZW0uYW1vdW50KSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gc291cmNlLnRha2VJdGVtKHNvdXJjZVNsb3QsIGFtb3VudCk7XG4gICAgICAgICAgICBpZiAoIWl0ZW0pIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaXRlbS5cIik7XG4gICAgICAgICAgICBpZiAoZGVzdGluYXRpb25JdGVtKSB7XG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uSXRlbS5pbmNyZW1lbnQoaXRlbS5hbW91bnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVzdGluYXRpb24uc2V0SXRlbShkZXN0aW5hdGlvblNsb3QsIGl0ZW0pO1xuICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY3Vyc29yLCB0aGlzIGFwcGVhcnMgdG8gYmUgYSBidWcgaW4gdGhlIHByb3RvY29sLlxuICAgICAgICAgICAgICBjb25zdCBjdXJzb3IgPSBwbGF5ZXIuZ2V0VHJhaXQoUGxheWVyQ3Vyc29yVHJhaXQpO1xuICAgICAgICAgICAgICBpZiAoIWN1cnNvcikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjdXJzb3IuXCIpO1xuICAgICAgICAgICAgICBpZiAoY3Vyc29yLmNvbnRhaW5lci5nZXRJdGVtKDApID09PSBudWxsKVxuICAgICAgICAgICAgICAgIGN1cnNvci5jb250YWluZXIuY2xlYXJTbG90KDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvdW50IHBvc3NpYmxlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3Rpb24uZHJvcCkge1xuICAgICAgICAgIC8vIEdldCB0aGUgcmVxdWVzdC5cbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gYWN0aW9uLmRyb3A7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBhbmQgc2xvdC5cbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSByZXF1ZXN0LnNvdXJjZTtcbiAgICAgICAgICBjb25zdCBzbG90ID0gc291cmNlLnNsb3Q7XG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gcmVxdWVzdC5hbW91bnQ7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBjb250YWluZXIuXG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gcGxheWVyLmdldENvbnRhaW5lcihzb3VyY2UuY29udGFpbmVyLmlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBleGlzdHMuXG4gICAgICAgICAgaWYgKCFjb250YWluZXIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIGNvbnRhaW5lcjogJHtzb3VyY2UuY29udGFpbmVyLmlkZW50aWZpZXJ9YFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEZvcmNlIHRoZSBwbGF5ZXIgdG8gZHJvcCB0aGUgaXRlbS5cbiAgICAgICAgICBwbGF5ZXIuZHJvcEl0ZW0oc2xvdCwgYW1vdW50LCBjb250YWluZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGlvbi5zd2FwKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSByZXF1ZXN0LlxuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBhY3Rpb24uc3dhcDtcblxuICAgICAgICAgIC8vIEdldCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbi5cbiAgICAgICAgICBjb25zdCBzb3VyY2VDb250YWluZXIgPSByZXF1ZXN0LnNvdXJjZS5jb250YWluZXI7XG4gICAgICAgICAgY29uc3Qgc291cmNlU2xvdCA9IHJlcXVlc3Quc291cmNlLnNsb3Q7XG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db250YWluZXIgPSByZXF1ZXN0LmRlc3RpbmF0aW9uLmNvbnRhaW5lcjtcbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblNsb3QgPSByZXF1ZXN0LmRlc3RpbmF0aW9uLnNsb3Q7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBjb250YWluZXIuXG4gICAgICAgICAgY29uc3Qgc291cmNlID0gcGxheWVyLmdldENvbnRhaW5lcihcbiAgICAgICAgICAgIHNvdXJjZUNvbnRhaW5lci5pZGVudGlmaWVyLFxuICAgICAgICAgICAgc291cmNlQ29udGFpbmVyLmR5bmFtaWNJZGVudGlmaWVyXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzb3VyY2UgY29udGFpbmVyIGV4aXN0cy5cbiAgICAgICAgICBpZiAoIXNvdXJjZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgc291cmNlIGNvbnRhaW5lcjogJHtzb3VyY2VDb250YWluZXIuaWRlbnRpZmllcn1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIuXG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBwbGF5ZXIuZ2V0Q29udGFpbmVyKFxuICAgICAgICAgICAgZGVzdGluYXRpb25Db250YWluZXIuaWRlbnRpZmllcixcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29udGFpbmVyLmR5bmFtaWNJZGVudGlmaWVyXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBkZXN0aW5hdGlvbiBjb250YWluZXIgZXhpc3RzLlxuICAgICAgICAgIGlmICghZGVzdGluYXRpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIGRlc3RpbmF0aW9uIGNvbnRhaW5lcjogJHtkZXN0aW5hdGlvbkNvbnRhaW5lci5pZGVudGlmaWVyfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZSBpdGVtLlxuICAgICAgICAgIGNvbnN0IHNvdXJjZUl0ZW0gPSBzb3VyY2UuZ2V0SXRlbShzb3VyY2VTbG90KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzb3VyY2UgaXRlbSBleGlzdHMuXG4gICAgICAgICAgaWYgKCFzb3VyY2VJdGVtKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNvdXJjZSBpdGVtLlwiKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGVzdGluYXRpb24gaXRlbS5cbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkl0ZW0gPSBkZXN0aW5hdGlvbi5nZXRJdGVtKGRlc3RpbmF0aW9uU2xvdCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZGVzdGluYXRpb24gaXRlbSBleGlzdHMuXG4gICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbkl0ZW0pIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGVzdGluYXRpb24gaXRlbS5cIik7XG5cbiAgICAgICAgICAvLyBTd2FwIHRoZSBpdGVtcy5cbiAgICAgICAgICBzb3VyY2Uuc3dhcEl0ZW1zKHNvdXJjZVNsb3QsIGRlc3RpbmF0aW9uU2xvdCwgZGVzdGluYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBhIGRlc3Ryb3kgb3IgY29uc3VtZSBhY3Rpb24uXG4gICAgICAgIGlmIChhY3Rpb24uZGVzdHJveU9yQ29uc3VtZSkge1xuICAgICAgICAgIC8vIEdldCB0aGUgcmVxdWVzdC5cbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gYWN0aW9uLmRlc3Ryb3lPckNvbnN1bWU7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdXJjZS5cbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSByZXF1ZXN0LnNvdXJjZTtcbiAgICAgICAgICBpZiAoIXNvdXJjZSkgY29udGludWU7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc291cmNlIGlzIHRoZSBjdXJzb3IuXG4gICAgICAgICAgaWYgKHNvdXJjZS5jb250YWluZXIuaWRlbnRpZmllciA9PT0gQ29udGFpbmVyTmFtZS5DdXJzb3IpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY3Vyc29yIGNvbXBvbmVudC5cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvciA9IHBsYXllci5nZXRUcmFpdChQbGF5ZXJDdXJzb3JUcmFpdCk7XG5cbiAgICAgICAgICAgIC8vIENsZWFyIHRoZSBjdXJzb3IuXG4gICAgICAgICAgICBjdXJzb3IuY29udGFpbmVyLmNsZWFyU2xvdCgwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBpbnZlbnRvcnkgY29tcG9uZW50XG4gICAgICAgICAgICBjb25zdCBpbnZlbnRvcnkgPSBwbGF5ZXIuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgICAgICAgICAvLyBDbGVhciB0aGUgc291cmNlLlxuICAgICAgICAgICAgaW52ZW50b3J5LmNvbnRhaW5lci5jbGVhclNsb3Qoc291cmNlLnNsb3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3Rpb24uY3JhZnRSZWNpcGUpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGl0ZW0gaW5zdGFuY2UgYWN0aW9uLlxuICAgICAgICAgIGNvbnN0IGl0ZW1JbnN0YW5jZUFjdGlvbiA9IHJlcXVlc3RcbiAgICAgICAgICAgIC5hY3Rpb25zWzFdIGFzIEl0ZW1TdGFja1JlcXVlc3RBY3Rpb247XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBpbnN0YW5jZSBhY3Rpb24gZXhpc3RzLlxuICAgICAgICAgIGlmICghaXRlbUluc3RhbmNlQWN0aW9uLnJlc3VsdHNEZXByZWNhdGVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpdGVtIGluc3RhbmNlIGFjdGlvbi5cIik7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGl0ZW1zIGJlaW5nIGNyYWZ0ZWQuXG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSBpdGVtSW5zdGFuY2VBY3Rpb24ucmVzdWx0c0RlcHJlY2F0ZWQucmVzdWx0YW50cztcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGVzdGluYXRpb24gYWN0aW9uLlxuICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQWN0aW9uID0gcmVxdWVzdC5hY3Rpb25zLmF0KFxuICAgICAgICAgICAgLTFcbiAgICAgICAgICApIGFzIEl0ZW1TdGFja1JlcXVlc3RBY3Rpb247XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZGVzdGluYXRpb24gYWN0aW9uIGV4aXN0cy5cbiAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uQWN0aW9uLnRha2VPclBsYWNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkZXN0aW5hdGlvbiBhY3Rpb24uXCIpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBkZXN0aW5hdGlvbi5cbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHBsYXllci5nZXRDb250YWluZXIoXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFjdGlvbi50YWtlT3JQbGFjZS5kZXN0aW5hdGlvbi5jb250YWluZXIuaWRlbnRpZmllclxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZGVzdGluYXRpb24gZXhpc3RzLlxuICAgICAgICAgIGlmICghZGVzdGluYXRpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIGRlc3RpbmF0aW9uOiAke2Rlc3RpbmF0aW9uQWN0aW9uLnRha2VPclBsYWNlLmRlc3RpbmF0aW9uLmNvbnRhaW5lci5pZGVudGlmaWVyfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIGl0ZW1zIHRvIHRoZSBkZXN0aW5hdGlvbi5cbiAgICAgICAgICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgZGVzY3JpcHRvcnMpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gYW4gaXRlbSBzdGFjay5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1TdGFjayA9IEl0ZW1TdGFjay5mcm9tTmV0d29ya0luc3RhbmNlKGRlc2NyaXB0b3IpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgaXRlbSBzdGFjayBleGlzdHNcbiAgICAgICAgICAgIGlmICghaXRlbVN0YWNrKVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJGYWlsZWQgdG8gY29udmVydCBuZXR3b3JrIGRlc2NyaXB0b3IgdG8gaXRlbSBzdGFjay5cIlxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIGFtb3VudCBvZiB0aGUgaXRlbSBzdGFjay5cbiAgICAgICAgICAgIGl0ZW1TdGFjay5zZXRBbW91bnQoaXRlbVN0YWNrLmFtb3VudCAqIGFjdGlvbi5jcmFmdFJlY2lwZS5hbW91bnQpO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGl0ZW0gc3RhY2sgdG8gdGhlIGRlc3RpbmF0aW9uLlxuICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkSXRlbShpdGVtU3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3Rpb24uY3JhZnRDcmVhdGl2ZSkge1xuICAgICAgICAgIC8vIEdldCB0aGUgZGVzdGluYXRpb24gcmVxdWVzdC5cbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkFjdGlvbiA9IHJlcXVlc3RcbiAgICAgICAgICAgIC5hY3Rpb25zWzJdIGFzIEl0ZW1TdGFja1JlcXVlc3RBY3Rpb247XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZGVzdGluYXRpb24gZXhpc3RzLlxuICAgICAgICAgIGlmICghZGVzdGluYXRpb25BY3Rpb24udGFrZU9yUGxhY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRlc3RpbmF0aW9uLlwiKTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgZGVzdGluYXRpb24uXG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbkFjdGlvbi50YWtlT3JQbGFjZS5kZXN0aW5hdGlvbjtcbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBkZXN0aW5hdGlvbkFjdGlvbi50YWtlT3JQbGFjZS5hbW91bnQ7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGNvbnRhaW5lci5cbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBwbGF5ZXIuZ2V0Q29udGFpbmVyKFxuICAgICAgICAgICAgZGVzdGluYXRpb24uY29udGFpbmVyLmlkZW50aWZpZXJcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBleGlzdHMuXG4gICAgICAgICAgaWYgKCFjb250YWluZXIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIGNvbnRhaW5lcjogJHtkZXN0aW5hdGlvbi5jb250YWluZXIuaWRlbnRpZmllcn1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSByZXF1ZXN0LlxuICAgICAgICAgIGNvbnN0IGNyYWZ0ID0gYWN0aW9uLmNyYWZ0Q3JlYXRpdmU7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHdvcmxkIG9mIHRoZSBwbGF5ZXIsIGFuZCB0aGUgY3JlYXRpdmUgaXRlbS5cbiAgICAgICAgICBjb25zdCB3b3JsZCA9IHBsYXllci5kaW1lbnNpb24ud29ybGQ7XG4gICAgICAgICAgY29uc3QgY3JlYXRpdmVJdGVtID0gd29ybGQuaXRlbVBhbGV0dGUuZ2V0Q3JlYXRpdmVDb250ZW50QnlJbmRleChcbiAgICAgICAgICAgIGNyYWZ0LmNyZWF0aXZlSW5kZXhcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNyZWF0aXZlIGl0ZW0gZXhpc3RzXG4gICAgICAgICAgaWYgKCFjcmVhdGl2ZUl0ZW0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBSZWNlaXZlZCBpbnZhbGlkIGNyZWF0aXZlIGl0ZW06ICR7Y3JhZnQuY3JlYXRpdmVJbmRleH1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBpdGVtIHN0YWNrLlxuICAgICAgICAgIGNvbnN0IGl0ZW1TdGFjayA9IG5ldyBJdGVtU3RhY2soY3JlYXRpdmVJdGVtLnR5cGUsIHsgYW1vdW50LCB3b3JsZCB9KTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgaXRlbSBzdGFjayBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgICAgY29udGFpbmVyLnNldEl0ZW0oZGVzdGluYXRpb24uc2xvdCwgaXRlbVN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBJdGVtU3RhY2tSZXF1ZXN0SGFuZGxlciB9O1xuIiwgImltcG9ydCB7XG4gIENsaWVudERhdGEsXG4gIERpc2Nvbm5lY3RSZWFzb24sXG4gIElkZW50aXR5RGF0YSxcbiAgTG9naW5QYWNrZXQsXG4gIExvZ2luVG9rZW5EYXRhLFxuICBMb2dpblRva2VucyxcbiAgUGFja2V0LFxuICBQbGF5U3RhdHVzLFxuICBQbGF5U3RhdHVzUGFja2V0LFxuICBSZXNvdXJjZVBhY2tzSW5mb1BhY2tldCxcbiAgU2VyaWFsaXplZFNraW5cbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuaW1wb3J0IHsgY3JlYXRlRGVjb2RlciB9IGZyb20gXCJmYXN0LWp3dFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBEZXZpY2UsIFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IFBsYXllclByb3BlcnRpZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsYXllckpvaW5TaWduYWwgfSBmcm9tIFwiLi4vZXZlbnRzXCI7XG5cbmNsYXNzIExvZ2luSGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuTG9naW47XG5cbiAgcHVibGljIHN0YXRpYyBkZWNvZGVyID0gY3JlYXRlRGVjb2RlcigpO1xuXG4gIHB1YmxpYyBoYW5kbGUocGFja2V0OiBMb2dpblBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIERlY29kZSB0aGUgdG9rZW5zIGdpdmVuIGJ5IHRoZSBjbGllbnQuXG4gICAgLy8gVGhpcyBjb250YWlucyB0aGUgY2xpZW50IGRhdGEsIGlkZW50aXR5IGRhdGEsIGFuZCBwdWJsaWMga2V5LlxuICAgIC8vIEFsb25nIHdpdGggdGhlIHBsYXllcnMgWFVJRCwgZGlzcGxheSBuYW1lLCBhbmQgdXVpZC5cbiAgICBjb25zdCB0b2tlbnMgPSBMb2dpbkhhbmRsZXIuZGVjb2RlKHBhY2tldC50b2tlbnMpO1xuXG4gICAgLy8gR2V0IHRoZSBjbGllbnRzIHh1aWQgYW5kIHVzZXJuYW1lLlxuICAgIGNvbnN0IHh1aWQgPSB0b2tlbnMuaWRlbnRpdHlEYXRhLlhVSUQ7XG4gICAgY29uc3QgdXVpZCA9IHRva2Vucy5pZGVudGl0eURhdGEuaWRlbnRpdHk7XG4gICAgY29uc3QgdXNlcm5hbWUgPSB0b2tlbnMuaWRlbnRpdHlEYXRhLmRpc3BsYXlOYW1lO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHh1aWQgaXMgc21hbGxlciB0aGFuIDE2IGNoYXJhY3RlcnMuXG4gICAgLy8gSWYgc28gdGhlbiB0aGUgeHVpZCBpcyBpbnZhbGlkLlxuICAgIC8vIE5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGNoZWNrIGlmIHRoZSB4dWlkIGlzIHZhbGlkLCBidXQgaXQgd29ya3MgZm9yIG5vdy5cbiAgICAvLyBQb3NzaWJseSBhZGQgYSB4dWlkIHJlc29sdmVyIGluIHRoZSBmdXR1cmUsIGJ1dCBtYXkgbGVhdmUgdGhhdCB1cCB0byBwbHVnaW5zLlxuICAgIGlmICh4dWlkLmxlbmd0aCA8IDE2KSB7XG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBwbGF5ZXIuXG4gICAgICByZXR1cm4gdGhpcy5uZXR3b3JrLmRpc2Nvbm5lY3RDb25uZWN0aW9uKFxuICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICBcIkZhaWxlZCB0byBjb25uZWN0IGR1ZSB0byBoYXZpbmcgYW4gaW52YWxpZCB4dWlkLiBNYWtlIHN1cmUgeW91IGFyZSBjb25uZWN0ZWQgdG8gWGJveCBMaXZlIGJlZm9yZSBqb2luaW5nIHRoZSBzZXJ2ZXIuXCIsXG4gICAgICAgIERpc2Nvbm5lY3RSZWFzb24uSW52YWxpZFRlbmFudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIGFscmVhZHkgY29ubmVjdGVkLlxuICAgIC8vIEFuZCBpZiBzbywgZGlzY29ubmVjdCB0aGUgcGxheWVyIHRoZSBwbGF5ZXIgY3VycmVudGx5IGNvbm5lY3RlZC5cbiAgICBpZiAodGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeVh1aWQoeHVpZCkpIHtcbiAgICAgIC8vIEdldCB0aGUgcGxheWVyIHRvIGRpc2Nvbm5lY3QuXG4gICAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LmdldFBsYXllckJ5WHVpZCh4dWlkKSBhcyBQbGF5ZXI7XG5cbiAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIHBsYXllci5cbiAgICAgIHBsYXllci5kaXNjb25uZWN0KFxuICAgICAgICBcIllvdSBoYXZlIGJlZW4gZGlzY29ubmVjdGVkIGZyb20gdGhlIHNlcnZlciBiZWNhdXNlIHlvdSBsb2dnZWQgaW4gZnJvbSBhbm90aGVyIGxvY2F0aW9uLlwiLFxuICAgICAgICBEaXNjb25uZWN0UmVhc29uLkxvZ2dlZEluT3RoZXJMb2NhdGlvblxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGRlZmF1bHQgd29ybGQsIGFuZCBjaGVjayBpZiBpdCBpcyB1bmRlZmluZWQuXG4gICAgLy8gSWYgc28sIHRoZW4gZGlzY29ubmVjdCB0aGUgcGxheWVyLlxuICAgIGNvbnN0IHdvcmxkID0gdGhpcy5zZXJlbml0eS5nZXRXb3JsZCgpO1xuICAgIGlmICghd29ybGQpXG4gICAgICByZXR1cm4gdGhpcy5uZXR3b3JrLmRpc2Nvbm5lY3RDb25uZWN0aW9uKFxuICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICBcIlRoZXJlIGFyZSBubyB3b3JsZHMgcmVnaXN0ZXJlZCB3aXRoaW4gdGhlIHNlcnZlciBwcm9jZXNzLlwiLFxuICAgICAgICBEaXNjb25uZWN0UmVhc29uLldvcmxkQ29ycnVwdGlvblxuICAgICAgKTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCBkaW1lbnNpb24sIGFuZCBjaGVjayBpZiBpdCBpcyB1bmRlZmluZWQuXG4gICAgLy8gSWYgc28sIHRoZW4gZGlzY29ubmVjdCB0aGUgcGxheWVyLlxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHdvcmxkLmdldERpbWVuc2lvbigpO1xuICAgIGlmICghZGltZW5zaW9uKVxuICAgICAgcmV0dXJuIHRoaXMubmV0d29yay5kaXNjb25uZWN0Q29ubmVjdGlvbihcbiAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgXCJUaGVyZSBhcmUgbm8gZGltZW5zaW9ucyByZWdpc3RlcmVkIHdpdGhpbiB0aGUgd29ybGQgaW5zdGFuY2UuXCIsXG4gICAgICAgIERpc2Nvbm5lY3RSZWFzb24uV29ybGRDb3JydXB0aW9uXG4gICAgICApO1xuXG4gICAgLy8gLy8gR2V0IHRoZSBwZXJtaXNzaW9uIGxldmVsIG9mIHRoZSBwbGF5ZXIuXG4gICAgLy8gY29uc3QgcGVybWlzc2lvbiA9IHRoaXMuc2VyZW5pdHkucGVybWlzc2lvbnMuZ2V0KHh1aWQsIHVzZXJuYW1lKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBEZXZpY2UgaW5zdGFuY2UuXG4gICAgY29uc3QgZGV2aWNlID0gbmV3IERldmljZShcbiAgICAgIHRva2Vucy5jbGllbnREYXRhLkRldmljZUlkLFxuICAgICAgdG9rZW5zLmNsaWVudERhdGEuRGV2aWNlTW9kZWwsXG4gICAgICB0b2tlbnMuY2xpZW50RGF0YS5EZXZpY2VPUyxcbiAgICAgIHRva2Vucy5jbGllbnREYXRhLk1heFZpZXdEaXN0YW5jZSxcbiAgICAgIHRva2Vucy5jbGllbnREYXRhLk1lbW9yeVRpZXJcbiAgICApO1xuXG4gICAgLy8gUmVhZCB0aGUgcGxheWVyIGRhdGEgZnJvbSB0aGUgd29ybGQgcHJvdmlkZXIuXG4gICAgY29uc3QgZGF0YSA9IHdvcmxkLnByb3ZpZGVyLnJlYWRQbGF5ZXIodXVpZCwgZGltZW5zaW9uKTtcblxuICAgIC8vIEdldCB0aGUgc2tpbiBmcm9tIHRoZSBjbGllbnQgZGF0YS5cbiAgICBjb25zdCBza2luID0gU2VyaWFsaXplZFNraW4uZnJvbSh0b2tlbnMuY2xpZW50RGF0YSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwbGF5ZXJcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBQYXJ0aWFsPFBsYXllclByb3BlcnRpZXM+ID0ge1xuICAgICAgdXNlcm5hbWUsXG4gICAgICB4dWlkLFxuICAgICAgdXVpZCxcbiAgICAgIGRldmljZSxcbiAgICAgIHNraW5cbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBkYXRhIGV4aXN0c1xuICAgIGlmIChkYXRhKSB7XG4gICAgICAvLyBTZXQgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcGxheWVyXG4gICAgICBwcm9wZXJ0aWVzLnVuaXF1ZUlkID0gZGF0YS51bmlxdWVJZDtcblxuICAgICAgLy8gQXNzaWduIHRoZSBwbGF5ZXIgZW50cnkgdG8gdGhlIHByb3BlcnRpZXNcbiAgICAgIHByb3BlcnRpZXMuZW50cnkgPSBkYXRhO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG5ldyBwbGF5ZXIgaW5zdGFuY2UuXG4gICAgY29uc3QgcGxheWVyID0gbmV3IFBsYXllcihkaW1lbnNpb24sIGNvbm5lY3Rpb24sIHByb3BlcnRpZXMpO1xuXG4gICAgLy8gU2V0IHRoZSBwbGF5ZXJzIHh1aWQgYW5kIHVzZXJuYW1lLlxuICAgIHRoaXMuc2VyZW5pdHkucGxheWVycy5zZXQoY29ubmVjdGlvbiwgcGxheWVyKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBQbGF5ZXJKb2luU2lnbmFsXG4gICAgY29uc3Qgc2lnbmFsID0gbmV3IFBsYXllckpvaW5TaWduYWwocGxheWVyKS5lbWl0KCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgc2lnbmFsIHdhcyBjYW5jZWxsZWQuXG4gICAgaWYgKCFzaWduYWwpXG4gICAgICByZXR1cm4gcGxheWVyLmRpc2Nvbm5lY3QoXG4gICAgICAgIFwiRmFpbGVkIHRvIGpvaW4gdGhlIHNlcnZlci5cIixcbiAgICAgICAgRGlzY29ubmVjdFJlYXNvbi5LaWNrZWRcbiAgICAgICk7XG5cbiAgICAvLyBUT0RPOiBFbmFibGUgZW5jcnlwdGlvbiwgdGhlIHB1YmxpYyBrZXkgaXMgZ2l2ZW4gaW4gdGhlIHRva2Vuc1xuICAgIC8vIFRoaXMgaXMgd2l0aCB0aGUgQ2xpZW50VG9TZXZlckhhbmRzaGFrZSBwYWNrZXQgJiB0aGUgU2VydmVyVG9DbGllbnRIYW5kc2hha2UgcGFja2V0XG4gICAgLy8gQnV0IGZvciBub3csIHdlIHdpbGwganVzdCBzZW5kIHRoZSBwbGF5ZXIgdGhlIGxvZ2luIHN0YXR1cywgdGhpcyB3aWxsIHNraXAgdGhlIGVuY3J5cHRpb25cbiAgICBjb25zdCBsb2dpbiA9IG5ldyBQbGF5U3RhdHVzUGFja2V0KCk7XG4gICAgbG9naW4uc3RhdHVzID0gUGxheVN0YXR1cy5Mb2dpblN1Y2Nlc3M7XG5cbiAgICBjb25zdCBwYWNrcyA9IG5ldyBSZXNvdXJjZVBhY2tzSW5mb1BhY2tldCgpO1xuICAgIHBhY2tzLm11c3RBY2NlcHQgPSBmYWxzZTsgLy8gdGhpcy5zZXJlbml0eS5yZXNvdXJjZVBhY2tzLm11c3RBY2NlcHRSZXNvdXJjZVBhY2tzO1xuXG4gICAgcGFja3MuaGFzQWRkb25zID0gZmFsc2U7XG4gICAgcGFja3MuaGFzU2NyaXB0cyA9IGZhbHNlO1xuICAgIHBhY2tzLnBhY2tzID0gW107XG4gICAgLy8gZm9yIChjb25zdCBwYWNrIG9mIHRoaXMuc2VyZW5pdHkucmVzb3VyY2VQYWNrcy5nZXRQYWNrcygpKSB7XG4gICAgLy8gICBjb25zdCBwYWNrSW5mbyA9IG5ldyBUZXh0dXJlUGFja0luZm8oXG4gICAgLy8gICAgIHBhY2sudXVpZCxcbiAgICAvLyAgICAgcGFjay5jb250ZW50S2V5LFxuICAgIC8vICAgICBwYWNrLmhhc1NjcmlwdHMsXG4gICAgLy8gICAgIHBhY2suaXNSdHgsXG4gICAgLy8gICAgIHBhY2sub3JpZ2luYWxTaXplLFxuICAgIC8vICAgICBwYWNrLnNlbGVjdGVkU3VicGFjayxcbiAgICAvLyAgICAgcGFjay51dWlkLFxuICAgIC8vICAgICBwYWNrLnZlcnNpb24sXG4gICAgLy8gICAgIGZhbHNlXG4gICAgLy8gICApO1xuXG4gICAgLy8gICBwYWNrcy5wYWNrcy5wdXNoKHBhY2tJbmZvKTtcbiAgICAvLyB9XG5cbiAgICAvLyBMb2cgdGhlIGpvaW4gZXZlbnQgdG8gdGhlIGNvbnNvbGVcbiAgICB3b3JsZC5sb2dnZXIuaW5mbyhcbiAgICAgIGDCpzhbwqc5JHtwbGF5ZXIudXNlcm5hbWV9wqc4XSBFdmVudDrCp3IgUGxheWVyIGpvaW5lZCB0aGUgc2VydmVyLmBcbiAgICApO1xuXG4gICAgLy8gU2VuZCB0aGUgcGxheWVyIHRoZSBsb2dpbiBzdGF0dXMgcGFja2V0IGFuZCB0aGUgcmVzb3VyY2UgcGFjayBpbmZvIHBhY2tldC5cbiAgICBwbGF5ZXIuc2VuZChsb2dpbiwgcGFja3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgdGhlIGxvZ2luIHRva2VucyBhbmQgcmV0dXJucyB0aGUgZGF0YVxuICAgKiBAcGFyYW0gdG9rZW5zIFRoZSBsb2dpbiB0b2tlbnNcbiAgICogQHJldHVybnMgVGhlIGRlY29kZWQgbG9naW4gdG9rZW4gZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWNvZGUodG9rZW5zOiBMb2dpblRva2Vucyk6IExvZ2luVG9rZW5EYXRhIHtcbiAgICAvLyBDb250YWlucyBkYXRhIGFib3V0IHRoZSB1c2VycyBjbGllbnQuIChEZXZpY2UsIGdhbWUgdmVyc2lvbiwgZXRjLilcbiAgICBjb25zdCBjbGllbnREYXRhOiBDbGllbnREYXRhID0gdGhpcy5kZWNvZGVyKHRva2Vucy5jbGllbnQpO1xuXG4gICAgLy8gUGFyc2UgdGhlIGlkZW50aXR5IGNoYWluIGRhdGFcbiAgICBjb25zdCBjaGFpbnM6IEFycmF5PHN0cmluZz4gPSBKU09OLnBhcnNlKHRva2Vucy5pZGVudGl0eSkuY2hhaW47XG5cbiAgICAvLyBEZWNvZGUgdGhlIGNoYWluc1xuICAgIGNvbnN0IGRlY29kZWRDaGFpbnMgPSBjaGFpbnMubWFwKChjaGFpbikgPT4gdGhpcy5kZWNvZGVyKGNoYWluKSk7XG5cbiAgICAvLyBDb250YWlucyBtYWlubHkgbWV0YWRhdGEsIGJ1dCBhbHNvIGluY2x1ZGVzIGltcG9ydGFudCBYQkwgZGF0YSAoZGlzcGxheU5hbWUsIHh1aWQsIGlkZW50aXR5IHV1aWQsIGV0Yy4pXG4gICAgY29uc3QgaWRlbnRpdHlEYXRhOiBJZGVudGl0eURhdGEgPSBkZWNvZGVkQ2hhaW5zLmZpbmQoXG4gICAgICAoY2hhaW4pID0+IGNoYWluLmV4dHJhRGF0YSAhPT0gdW5kZWZpbmVkXG4gICAgKT8uZXh0cmFEYXRhO1xuXG4gICAgLy8gUHVibGljIGtleSBmb3IgZW5jcnlwdGlvblxuICAgIC8vIFRPRE86IEltcGxlbWVudCBlbmNyeXB0aW9uXG4gICAgY29uc3QgcHVibGljS2V5ID0gZGVjb2RlZENoYWlucy5maW5kKFxuICAgICAgKGNoYWluKSA9PiBjaGFpbi5pZGVudGl0eVB1YmxpY0tleSAhPT0gdW5kZWZpbmVkXG4gICAgKT8uaWRlbnRpdHlQdWJsaWNLZXk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50RGF0YSxcbiAgICAgIGlkZW50aXR5RGF0YSxcbiAgICAgIHB1YmxpY0tleVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IHsgTG9naW5IYW5kbGVyIH07XG4iLCAiaW1wb3J0IHtcbiAgTW9iRXF1aXBtZW50UGFja2V0LFxuICBOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvcixcbiAgUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuaW1wb3J0IHsgRW50aXR5SW52ZW50b3J5VHJhaXQgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5pbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuXG5jbGFzcyBNb2JFcXVpcG1lbnRIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5Nb2JFcXVpcG1lbnQ7XG5cbiAgcHVibGljIGhhbmRsZShwYWNrZXQ6IE1vYkVxdWlwbWVudFBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LmdldFBsYXllckJ5Q29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIncyBpbnZlbnRvcnkgdHJhaXRcbiAgICBjb25zdCBpbnZlbnRvcnkgPSBwbGF5ZXIuZ2V0VHJhaXQoRW50aXR5SW52ZW50b3J5VHJhaXQpO1xuXG4gICAgLy8gU2V0IHRoZSBwbGF5ZXIncyBzZWxlY3RlZCBpdGVtXG4gICAgaW52ZW50b3J5LnNlbGVjdGVkU2xvdCA9IHBhY2tldC5zZWxlY3RlZFNsb3Q7XG5cbiAgICAvLyBHZXQgdGhlIHBsYXllcidzIGhlbGQgaXRlbVxuICAgIGNvbnN0IGl0ZW0gPSBpbnZlbnRvcnkuZ2V0SGVsZEl0ZW0oKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBNb2JFcXVpcG1lbnRQYWNrZXRcbiAgICBjb25zdCB1cGRhdGUgPSBuZXcgTW9iRXF1aXBtZW50UGFja2V0KCk7XG4gICAgdXBkYXRlLnJ1bnRpbWVFbnRpdHlJZCA9IHBsYXllci5ydW50aW1lSWQ7XG4gICAgdXBkYXRlLnNsb3QgPSBwYWNrZXQuc2VsZWN0ZWRTbG90O1xuICAgIHVwZGF0ZS5zZWxlY3RlZFNsb3QgPSBwYWNrZXQuc2VsZWN0ZWRTbG90O1xuICAgIHVwZGF0ZS5jb250YWluZXJJZCA9IGludmVudG9yeS5jb250YWluZXIuaWRlbnRpZmllcjtcbiAgICB1cGRhdGUuaXRlbSA9XG4gICAgICBpdGVtID09PSBudWxsXG4gICAgICAgID8gbmV3IE5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yKDApXG4gICAgICAgIDogSXRlbVN0YWNrLnRvTmV0d29ya1N0YWNrKGl0ZW0pO1xuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gYWxsIHBsYXllcnMsIGV4Y2VwdCB0aGUgcGxheWVyIGluIGNvbnRleHRcbiAgICBwbGF5ZXIuZGltZW5zaW9uLmJyb2FkY2FzdEV4Y2VwdChwbGF5ZXIsIHVwZGF0ZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTW9iRXF1aXBtZW50SGFuZGxlciB9O1xuIiwgImltcG9ydCB7XG4gIFBsYXllckFjdGlvblBhY2tldCxcbiAgUGFja2V0LFxuICBQbGF5ZXJBY3Rpb25UeXBlXG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuXG5jbGFzcyBQbGF5ZXJBY3Rpb25IYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5QbGF5ZXJBY3Rpb247XG5cbiAgcHVibGljIGhhbmRsZShwYWNrZXQ6IFBsYXllckFjdGlvblBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LmdldFBsYXllckJ5Q29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gU3dpdGNoIHRoZSBhY3Rpb24gdHlwZVxuICAgIHN3aXRjaCAocGFja2V0LmFjdGlvbikge1xuICAgICAgLy8gTG9nIHVuaW1wbGVtZW50ZWQgYWN0aW9uIHR5cGVzXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIERlYnVnIGxvZyB0aGUgdW5pbXBsZW1lbnRlZCBhY3Rpb24gdHlwZVxuICAgICAgICB0aGlzLnNlcmVuaXR5LmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgUGxheWVyQWN0aW9uSGFuZGxlcjogVW5pbXBsZW1lbnRlZCBQbGF5ZXJBY3Rpb25UeXBlOiAke1BsYXllckFjdGlvblR5cGVbcGFja2V0LmFjdGlvbl19YFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlcyB3aGVuIGEgcGxheWVyIHN0YXJ0cyB1c2luZyBhbiBpdGVtIG9uIGEgYmxvY2sgb3IgZW50aXR5XG4gICAgICBjYXNlIFBsYXllckFjdGlvblR5cGUuU3RhcnRJdGVtVXNlT246IHtcbiAgICAgICAgLy8gU2V0IHRoZSBwbGF5ZXIncyB0YXJnZXQgaXRlbVxuICAgICAgICBwbGF5ZXIuaXRlbVRhcmdldCA9IHBsYXllci5nZXRIZWxkSXRlbSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBQbGF5ZXJBY3Rpb25UeXBlLlN0b3BJdGVtVXNlT246IHtcbiAgICAgICAgLy8gU2V0IHRoZSBwbGF5ZXIncyB0YXJnZXQgaXRlbSB0byBudWxsXG4gICAgICAgIHBsYXllci5pdGVtVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIERFUFJFQ0FURUQ6IEhhbmRsZXMgd2hlbiBhIHBsYXllciBkZXN0cm95cyBhIGJsb2NrIGluIGNyZWF0aXZlIG1vZGVcbiAgICAgIGNhc2UgUGxheWVyQWN0aW9uVHlwZS5DcmVhdGl2ZURlc3Ryb3lCbG9jazoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUGxheWVyQWN0aW9uSGFuZGxlciB9O1xuIiwgImltcG9ydCB7XG4gIEFiaWxpdHlJbmRleCxcbiAgQWN0b3JGbGFnLFxuICBCbG9ja1Bvc2l0aW9uLFxuICBHYW1lbW9kZSxcbiAgSW5wdXREYXRhLFxuICBJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uTWluZUJsb2NrLFxuICBJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uVHlwZSxcbiAgTGV2ZWxFdmVudCxcbiAgTGV2ZWxFdmVudFBhY2tldCxcbiAgUGFja2V0LFxuICBQbGF5ZXJBY3Rpb25UeXBlLFxuICBQbGF5ZXJBdXRoSW5wdXRQYWNrZXQsXG4gIFBsYXllckJsb2NrQWN0aW9uRGF0YSxcbiAgVXBkYXRlQmxvY2tGbGFnc1R5cGUsXG4gIFVwZGF0ZUJsb2NrTGF5ZXJUeXBlLFxuICBVcGRhdGVCbG9ja1BhY2tldFxufSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcbmltcG9ydCB7IEl0ZW1Vc2VNZXRob2QgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7XG4gIFBsYXllckJyZWFrQmxvY2tTaWduYWwsXG4gIFBsYXllclN0YXJ0VXNpbmdJdGVtU2lnbmFsLFxuICBQbGF5ZXJTdG9wVXNpbmdJdGVtU2lnbmFsLFxuICBQbGF5ZXJVc2VJdGVtU2lnbmFsXG59IGZyb20gXCIuLi9ldmVudHNcIjtcblxuY2xhc3MgUGxheWVyQXV0aElucHV0SGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuUGxheWVyQXV0aElucHV0O1xuXG4gIHB1YmxpYyBoYW5kbGUocGFja2V0OiBQbGF5ZXJBdXRoSW5wdXRQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgcG9zaXRpb25cbiAgICBwbGF5ZXIucG9zaXRpb24ueCA9IHBhY2tldC5wb3NpdGlvbi54O1xuICAgIHBsYXllci5wb3NpdGlvbi55ID0gcGFja2V0LnBvc2l0aW9uLnk7XG4gICAgcGxheWVyLnBvc2l0aW9uLnogPSBwYWNrZXQucG9zaXRpb24uejtcblxuICAgIC8vIFNldCB0aGUgcGxheWVyJ3Mgcm90YXRpb25cbiAgICBwbGF5ZXIucm90YXRpb24ucGl0Y2ggPSBwYWNrZXQucm90YXRpb24ueDtcbiAgICBwbGF5ZXIucm90YXRpb24ueWF3ID0gcGFja2V0LnJvdGF0aW9uLnk7XG4gICAgcGxheWVyLnJvdGF0aW9uLmhlYWRZYXcgPSBwYWNrZXQuaGVhZFlhdztcblxuICAgIC8vIFNldCB0aGUgcGxheWVyIGRldmljZSBpbmZvcm1hdGlvblxuICAgIHBsYXllci5kZXZpY2UuaW5wdXRNb2RlID0gcGFja2V0LmlucHV0TW9kZTtcbiAgICBwbGF5ZXIuZGV2aWNlLmludGVyYWN0aW9uTW9kZSA9IHBhY2tldC5pbnRlcmFjdGlvbk1vZGU7XG4gICAgcGxheWVyLmRldmljZS5wbGF5TW9kZSA9IHBhY2tldC5wbGF5TW9kZTtcblxuICAgIC8vIENvbnZlcnQgdGhlIHBsYXllcidzIHBvc2l0aW9uIHRvIGEgYmxvY2sgcG9zaXRpb25cbiAgICBjb25zdCBwb3NpdGlvbiA9IHBsYXllci5wb3NpdGlvbi5mbG9vcigpO1xuXG4gICAgLy8gR2V0IHRoZSBibG9jayBwZXJtdXRhdGlvbiBiZWxvdyB0aGUgcGxheWVyXG4gICAgLy8gR2V0dGluZyB0aGUgcGVybXV0YXRpb24gcmF0aGVyIHRoYW4gdGhlIGJsb2NrIHdpbGwgcmVkdWNlIHNlcnZlciBsb2FkXG4gICAgLy8gQXMgZ2V0dGluZyB0aGUgYmxvY2sgd2lsbCBjb25zdHJ1Y3QgYSBibG9jayBpbnN0YW5jZSwgdGhlIHBlcm11dGF0aW9uIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgY29uc3QgcGVybXV0YXRpb24gPSBwbGF5ZXIuZGltZW5zaW9uLmdldFBlcm11dGF0aW9uKHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeTogcG9zaXRpb24ueSAtIDJcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgcGxheWVyJ3Mgb25Hcm91bmQgc3RhdHVzICYgaW5wdXRUaWNrXG4gICAgcGxheWVyLm9uR3JvdW5kID0gcGVybXV0YXRpb24udHlwZS5zb2xpZDtcbiAgICBwbGF5ZXIuaW5wdXRUaWNrID0gcGFja2V0LmlucHV0VGljaztcblxuICAgIC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGlzXG4gICAgcGxheWVyLmlzTW92aW5nID0gdHJ1ZTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgY29udGFpbnMgYmxvY2sgYWN0aW9uc1xuICAgIGlmIChwYWNrZXQuYmxvY2tBY3Rpb25zKSB7XG4gICAgICAvLyBDaGVjayBpZiBhbiBpdGVtIHN0YWNrIHJlcXVlc3Qgd2FzIHByb3ZpZGVkXG4gICAgICBpZiAocGFja2V0Lml0ZW1TdGFja1JlcXVlc3QpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbnMgaW5jbHVkZSBtaW5pbmcgYSBibG9ja1xuICAgICAgICAvLyBJZiBzbywgdGhpcyBpbmRpY2F0ZXMgdGhlIHBsYXllciBpcyB1c2luZyBhIHRvb2wgdG8gbWluZSBhIGJsb2NrXG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IHBhY2tldC5pdGVtU3RhY2tSZXF1ZXN0LmFjdGlvbnMuZmluZChcbiAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgIHguYWN0aW9uID09PSBJdGVtU3RhY2tSZXF1ZXN0QWN0aW9uVHlwZS5TY3JlZW5IVURNaW5lQmxvY2sgJiZcbiAgICAgICAgICAgIHgubWluZUJsb2NrXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHBsYXllciBpcyBtaW5pbmcgYSBibG9jaywgaGFuZGxlIHRoZSBibG9jayBhY3Rpb25zXG4gICAgICAgIGlmIChhY3Rpb24pXG4gICAgICAgICAgdGhpcy5oYW5kbGVCbG9ja0FjdGlvbnMoXG4gICAgICAgICAgICBwbGF5ZXIsXG4gICAgICAgICAgICBwYWNrZXQuYmxvY2tBY3Rpb25zLmFjdGlvbnMsXG4gICAgICAgICAgICBhY3Rpb24ubWluZUJsb2NrIGFzIEl0ZW1TdGFja1JlcXVlc3RBY3Rpb25NaW5lQmxvY2tcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBibG9jayBhY3Rpb25zXG4gICAgICAgIHRoaXMuaGFuZGxlQmxvY2tBY3Rpb25zKHBsYXllciwgcGFja2V0LmJsb2NrQWN0aW9ucy5hY3Rpb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIHBsYXllcidzIGFjdGlvbnNcbiAgICB0aGlzLmhhbmRsZUFjdG9yQWN0aW9ucyhwbGF5ZXIsIHBhY2tldC5pbnB1dERhdGEuZ2V0RmxhZ3MoKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhY3RvciBhY3Rpb25zIGZyb20gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBwZXJmb3JtZWQgdGhlIGFjdGlvbnNcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGFjdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVBY3RvckFjdGlvbnMocGxheWVyOiBQbGF5ZXIsIGFjdGlvbnM6IEFycmF5PElucHV0RGF0YT4pOiB2b2lkIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGFjdGlvbnNcbiAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAvLyBIYW5kbGUgdGhlIGFjdGlvblxuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgLy8gSGFuZGxlIHdoZW4gYSBwbGF5ZXIgc25lYWtzXG4gICAgICAgIGNhc2UgSW5wdXREYXRhLlN0YXJ0U25lYWtpbmc6XG4gICAgICAgIGNhc2UgSW5wdXREYXRhLlN0b3BTbmVha2luZzoge1xuICAgICAgICAgIC8vIEdldCB0aGUgc25lYWtpbmcgZmxhZyBmcm9tIHRoZSBwbGF5ZXJcbiAgICAgICAgICBjb25zdCBzbmVha2luZyA9IHBsYXllci5mbGFncy5nZXQoQWN0b3JGbGFnLlNuZWFraW5nKSA/PyBmYWxzZTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgc25lYWtpbmcgZmxhZyBiYXNlZCBvbiB0aGUgYWN0aW9uXG4gICAgICAgICAgcGxheWVyLmZsYWdzLnNldChBY3RvckZsYWcuU25lYWtpbmcsICFzbmVha2luZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgd2hlbiBhIHBsYXllciBzcHJpbnRzXG4gICAgICAgIGNhc2UgSW5wdXREYXRhLlN0YXJ0U3ByaW50aW5nOlxuICAgICAgICBjYXNlIElucHV0RGF0YS5TdG9wU3ByaW50aW5nOiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBzcHJpbnRpbmcgZmxhZyBmcm9tIHRoZSBwbGF5ZXJcbiAgICAgICAgICBjb25zdCBzcHJpbnRpbmcgPSBwbGF5ZXIuZmxhZ3MuZ2V0KEFjdG9yRmxhZy5TcHJpbnRpbmcpID8/IGZhbHNlO1xuXG4gICAgICAgICAgLy8gU2V0IHRoZSBzcHJpbnRpbmcgZmxhZyBiYXNlZCBvbiB0aGUgYWN0aW9uXG4gICAgICAgICAgcGxheWVyLmZsYWdzLnNldChBY3RvckZsYWcuU3ByaW50aW5nLCAhc3ByaW50aW5nKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSB0aGVuIGEgcGxheWVyIHN3aW1zXG4gICAgICAgIGNhc2UgSW5wdXREYXRhLlN0YXJ0U3dpbW1pbmc6XG4gICAgICAgIGNhc2UgSW5wdXREYXRhLlN0b3BTd2ltbWluZzoge1xuICAgICAgICAgIC8vIEdldCB0aGUgc3dpbW1pbmcgZmxhZyBmcm9tIHRoZSBwbGF5ZXJcbiAgICAgICAgICBjb25zdCBzd2ltbWluZyA9IHBsYXllci5mbGFncy5nZXQoQWN0b3JGbGFnLlN3aW1taW5nKSA/PyBmYWxzZTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgc3dpbW1pbmcgZmxhZyBiYXNlZCBvbiB0aGUgYWN0aW9uXG4gICAgICAgICAgcGxheWVyLmZsYWdzLnNldChBY3RvckZsYWcuU3dpbW1pbmcsICFzd2ltbWluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgd2hlbiBhIHBsYXllciBjcmF3bHNcbiAgICAgICAgY2FzZSBJbnB1dERhdGEuU3RhcnRDcmF3bGluZzpcbiAgICAgICAgY2FzZSBJbnB1dERhdGEuU3RvcENyYXdsaW5nOiB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBjcmF3bGluZyBmbGFnIGZyb20gdGhlIHBsYXllclxuICAgICAgICAgIGNvbnN0IGNyYXdsaW5nID0gcGxheWVyLmZsYWdzLmdldChBY3RvckZsYWcuQ3Jhd2xpbmcpID8/IGZhbHNlO1xuXG4gICAgICAgICAgLy8gU2V0IHRoZSBjcmF3bGluZyBmbGFnIGJhc2VkIG9uIHRoZSBhY3Rpb25cbiAgICAgICAgICBwbGF5ZXIuZmxhZ3Muc2V0KEFjdG9yRmxhZy5DcmF3bGluZywgIWNyYXdsaW5nKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSB3aGVuIGEgcGxheWVyIGlzIGdsaWRpbmdcbiAgICAgICAgY2FzZSBJbnB1dERhdGEuU3RhcnRHbGlkaW5nOlxuICAgICAgICBjYXNlIElucHV0RGF0YS5TdG9wR2xpZGluZzoge1xuICAgICAgICAgIC8vIEdldCB0aGUgZ2xpZGluZyBmbGFnIGZyb20gdGhlIHBsYXllclxuICAgICAgICAgIGNvbnN0IGdsaWRpbmcgPSBwbGF5ZXIuZmxhZ3MuZ2V0KEFjdG9yRmxhZy5HbGlkaW5nKSA/PyBmYWxzZTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgZ2xpZGluZyBmbGFnIGJhc2VkIG9uIHRoZSBhY3Rpb25cbiAgICAgICAgICBwbGF5ZXIuZmxhZ3Muc2V0KEFjdG9yRmxhZy5HbGlkaW5nLCAhZ2xpZGluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIElucHV0RGF0YS5TdGFydEZseWluZzpcbiAgICAgICAgY2FzZSBJbnB1dERhdGEuU3RvcEZseWluZzoge1xuICAgICAgICAgIC8vIEdldCB0aGUgZmx5aW5nIGFiaWxpdHkgZnJvbSB0aGUgcGxheWVyXG4gICAgICAgICAgY29uc3QgZmx5aW5nID0gcGxheWVyLmFiaWxpdGllcy5nZXQoQWJpbGl0eUluZGV4LkZseWluZykgPz8gZmFsc2U7XG4gICAgICAgICAgY29uc3QgbWF5Rmx5ID0gcGxheWVyLmFiaWxpdGllcy5nZXQoQWJpbGl0eUluZGV4Lk1heUZseSkgPz8gZmFsc2U7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIG5vdCBhbGxvd2VkIHRvIGZseVxuICAgICAgICAgIC8vIFRoaXMgc3RvcHMgdGhlIEhvcmlvbiBmbHkgZXhwbG9pdFxuICAgICAgICAgIGlmICghZmx5aW5nICYmICFtYXlGbHkpIHtcbiAgICAgICAgICAgIC8vIERpc2FibGUgZmx5aW5nIGlmIHRoZSBwbGF5ZXIgZG9lcyBub3QgaGF2ZSB0aGUgbWF5IGZseSBhYmlsaXR5XG4gICAgICAgICAgICBwbGF5ZXIuYWJpbGl0aWVzLnNldChBYmlsaXR5SW5kZXguRmx5aW5nLCBmYWxzZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZmx5aW5nIGFiaWxpdHkgYmFzZWQgb24gdGhlIGFjdGlvblxuICAgICAgICAgICAgcGxheWVyLmFiaWxpdGllcy5zZXQoQWJpbGl0eUluZGV4LkZseWluZywgIWZseWluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYmxvY2sgYWN0aW9ucyBmcm9tIHRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgcGVyZm9ybWVkIHRoZSBibG9jayBhY3Rpb25zXG4gICAqIEBwYXJhbSBhY3Rpb25zIFRoZSBibG9jayBhY3Rpb25zIHBlcmZvcm1lZCBieSB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlQmxvY2tBY3Rpb25zKFxuICAgIHBsYXllcjogUGxheWVyLFxuICAgIGFjdGlvbnM6IEFycmF5PFBsYXllckJsb2NrQWN0aW9uRGF0YT4sXG4gICAgcmVxdWVzdD86IEl0ZW1TdGFja1JlcXVlc3RBY3Rpb25NaW5lQmxvY2tcbiAgKTogdm9pZCB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBhY3Rpb25zXG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gZnJvbSB0aGUgcGxheWVyXG4gICAgICBjb25zdCBkaW1lbnNpb24gPSBwbGF5ZXIuZGltZW5zaW9uO1xuXG4gICAgICAvLyBTd2l0Y2ggb24gdGhlIGFjdGlvbiB0eXBlXG4gICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIC8vIExvZyB1bmltcGxlbWVudGVkIGFjdGlvbnNcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRoaXMuc2VyZW5pdHkubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFBsYXllckF1dGhJbnB1dEhhbmRsZXI6IFVuaW1wbGVtZW50ZWQgYmxvY2sgYWN0aW9uOiAke1BsYXllckFjdGlvblR5cGVbYWN0aW9uLnR5cGVdfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBQbGF5ZXJBY3Rpb25UeXBlLkNvbnRpbnVlRGVzdHJveUJsb2NrOlxuICAgICAgICBjYXNlIFBsYXllckFjdGlvblR5cGUuU3RhcnREZXN0cm95QmxvY2s6IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIGluIGNyZWF0aXZlIG1vZGVcbiAgICAgICAgICAvLyBJZiBzbywgc2tpcCB0aGUgYmxvY2sgYnJlYWtcbiAgICAgICAgICBpZiAocGxheWVyLmdhbWVtb2RlID09PSBHYW1lbW9kZS5DcmVhdGl2ZSkgY29udGludWU7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGFscmVhZHkgaGFzIGEgYmxvY2sgdGFyZ2V0XG4gICAgICAgICAgaWYgKHBsYXllci5ibG9ja1RhcmdldCkge1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgYmxvY2sgb25TdG9wQnJlYWsgdHJhaXQgbWV0aG9kc1xuICAgICAgICAgICAgLy8gV2Ugd2lsbCBpZ25vcmUgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIGRpbWVuc2lvblxuICAgICAgICAgICAgICAuZ2V0QmxvY2socGxheWVyLmJsb2NrVGFyZ2V0KVxuICAgICAgICAgICAgICAudHJhaXRzLnZhbHVlcygpKVxuICAgICAgICAgICAgICB0cmFpdC5vblN0b3BCcmVhaz8uKHBsYXllcik7XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBMZXZlbEV2ZW50UGFja2V0IGZvciB0aGUgYmxvY2sgYnJlYWtcbiAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMZXZlbEV2ZW50UGFja2V0KCk7XG4gICAgICAgICAgICBwYWNrZXQuZXZlbnQgPSBMZXZlbEV2ZW50LlN0b3BCbG9ja0NyYWNraW5nO1xuICAgICAgICAgICAgcGFja2V0LnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi50b1ZlY3RvcjNmKHBsYXllci5ibG9ja1RhcmdldCk7XG4gICAgICAgICAgICBwYWNrZXQuZGF0YSA9IDA7XG5cbiAgICAgICAgICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIHRoZSBkaW1lbnNpb25cbiAgICAgICAgICAgIGRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcblxuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHBsYXllcnMgYmxvY2sgdGFyZ2V0XG4gICAgICAgICAgICBwbGF5ZXIuYmxvY2tUYXJnZXQgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdldCB0aGUgYmxvY2sgZnJvbSB0aGUgYWN0aW9uIHBvc2l0aW9uXG4gICAgICAgICAgY29uc3QgYmxvY2sgPSBkaW1lbnNpb24uZ2V0QmxvY2soYWN0aW9uLnBvc2l0aW9uKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBibG9jayBpcyBhaXIsIGlmIHNvLCB0aGUgY2xpZW50IGhhcyBhIGdob3N0IGJsb2NrXG4gICAgICAgICAgaWYgKGJsb2NrLmlzQWlyKCkpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgYmxvY2sgcGVybXV0YXRpb24gZnJvbSB0aGUgZGltZW5zaW9uXG4gICAgICAgICAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGJsb2NrLnBlcm11dGF0aW9uO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGJsb2NrIHBlcm11dGF0aW9uIHRvIHRoZSBjbGllbnRcbiAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBVcGRhdGVCbG9ja1BhY2tldCgpO1xuICAgICAgICAgICAgcGFja2V0LnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi50b1ZlY3RvcjNmKGJsb2NrLnBvc2l0aW9uKTtcbiAgICAgICAgICAgIHBhY2tldC5sYXllciA9IFVwZGF0ZUJsb2NrTGF5ZXJUeXBlLk5vcm1hbDtcbiAgICAgICAgICAgIHBhY2tldC5mbGFncyA9IFVwZGF0ZUJsb2NrRmxhZ3NUeXBlLk5ldHdvcms7XG4gICAgICAgICAgICBwYWNrZXQubmV0d29ya0Jsb2NrSWQgPSBwZXJtdXRhdGlvbi5uZXR3b3JrO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgICAgICAgcGxheWVyLnNlbmQocGFja2V0KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENhbGwgdGhlIGJsb2NrIG9uU3RhcnRCcmVhayB0cmFpdCBtZXRob2RzXG4gICAgICAgICAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gICAgICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiBibG9jay50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBicmVhayB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRyYWl0Lm9uU3RhcnRCcmVhaz8uKHBsYXllcik7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLCBjb250aW51ZVxuICAgICAgICAgICAgLy8gQXMgdGhlIHRyYWl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgbWV0aG9kXG4gICAgICAgICAgICBpZiAoc3VjY2VzcyA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBmYWxzZSwgY2FuY2VsIHRoZSBicmVha1xuICAgICAgICAgICAgY2FuY2VsZWQgPSAhc3VjY2VzcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB0aGUgYnJlYWsgd2FzIGNhbmNlbGVkLCBza2lwIHRoZSBibG9jayBicmVha1xuICAgICAgICAgIGlmIChjYW5jZWxlZCkgY29udGludWU7XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHBsYXllcnMgdGFyZ2V0ZWQgYmxvY2sgdG8gdGhlIGJsb2NrXG4gICAgICAgICAgcGxheWVyLmJsb2NrVGFyZ2V0ID0gYmxvY2sucG9zaXRpb247XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsYXllcnMgaGVsZCBpdGVtLCBhbmQgY2FsY3VsYXRlIHRoZSBicmVhayB0aW1lXG4gICAgICAgICAgY29uc3QgaGVsZEl0ZW0gPSBwbGF5ZXIuZ2V0SGVsZEl0ZW0oKTtcbiAgICAgICAgICBjb25zdCBicmVha1RpbWUgPSBibG9jay5nZXRCcmVha1RpbWUoaGVsZEl0ZW0pO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IExldmVsRXZlbnRQYWNrZXQgZm9yIHRoZSBibG9jayBicmVha1xuICAgICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBMZXZlbEV2ZW50UGFja2V0KCk7XG4gICAgICAgICAgcGFja2V0LmV2ZW50ID0gTGV2ZWxFdmVudC5TdGFydEJsb2NrQ3JhY2tpbmc7XG4gICAgICAgICAgcGFja2V0LnBvc2l0aW9uID0gQmxvY2tQb3NpdGlvbi50b1ZlY3RvcjNmKGJsb2NrLnBvc2l0aW9uKTtcbiAgICAgICAgICBwYWNrZXQuZGF0YSA9IDY1NTM1IC8gYnJlYWtUaW1lO1xuXG4gICAgICAgICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gdGhlIGRpbWVuc2lvblxuICAgICAgICAgIGRpbWVuc2lvbi5icm9hZGNhc3QocGFja2V0KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgd2FzIGhvbGRpbmcgYW4gaXRlbVxuICAgICAgICAgIGlmIChoZWxkSXRlbSkge1xuICAgICAgICAgICAgLy8gU2V0IHRoZSB1c2UgbWV0aG9kIGZvciB0aGUgdHJhaXRcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IEl0ZW1Vc2VNZXRob2QuQnJlYWs7XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBQbGF5ZXJTdGFydFVzaW5nSXRlbVNpZ25hbFxuICAgICAgICAgICAgbGV0IGNhbmNlbGVkID0gIW5ldyBQbGF5ZXJTdGFydFVzaW5nSXRlbVNpZ25hbChcbiAgICAgICAgICAgICAgcGxheWVyLFxuICAgICAgICAgICAgICBoZWxkSXRlbSxcbiAgICAgICAgICAgICAgbWV0aG9kXG4gICAgICAgICAgICApLmVtaXQoKTtcblxuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgaXRlbSBvblN0YXJ0VXNlIHRyYWl0IG1ldGhvZHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgaGVsZEl0ZW0udHJhaXRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCB1c2Ugd2FzIHN1Y2Nlc3NmdWxcbiAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRyYWl0Lm9uU3RhcnRVc2U/LihwbGF5ZXIsIHsgbWV0aG9kIH0pO1xuXG4gICAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLCBjb250aW51ZVxuICAgICAgICAgICAgICAvLyBBcyB0aGUgdHJhaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBtZXRob2RcbiAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBmYWxzZSwgY2FuY2VsIHRoZSB1c2VcbiAgICAgICAgICAgICAgY2FuY2VsZWQgPSAhc3VjY2VzcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIHVzZSB3YXMgY2FuY2VsZWQsIHNraXAgdGhlIGl0ZW0gdXNlXG4gICAgICAgICAgICBpZiAoY2FuY2VsZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHBsYXllcnMgaXRlbSB1c2UgdGltZVxuICAgICAgICAgICAgcGxheWVyLml0ZW1UYXJnZXQgPSBoZWxkSXRlbTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUGxheWVyQWN0aW9uVHlwZS5BYm9ydERlc3Ryb3lCbG9jazoge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbGF5ZXIgYWxyZWFkeSBoYXMgYSBibG9jayB0YXJnZXRcbiAgICAgICAgICBpZiAocGxheWVyLmJsb2NrVGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSBibG9jayBvblN0b3BCcmVhayB0cmFpdCBtZXRob2RzXG4gICAgICAgICAgICAvLyBXZSB3aWxsIGlnbm9yZSB0aGUgcmVzdWx0IG9mIHRoZSBtZXRob2RcbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJhaXQgb2YgZGltZW5zaW9uXG4gICAgICAgICAgICAgIC5nZXRCbG9jayhwbGF5ZXIuYmxvY2tUYXJnZXQpXG4gICAgICAgICAgICAgIC50cmFpdHMudmFsdWVzKCkpXG4gICAgICAgICAgICAgIHRyYWl0Lm9uU3RvcEJyZWFrPy4ocGxheWVyKTtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IExldmVsRXZlbnRQYWNrZXQgZm9yIHRoZSBibG9jayBicmVha1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IExldmVsRXZlbnRQYWNrZXQoKTtcbiAgICAgICAgICAgIHBhY2tldC5ldmVudCA9IExldmVsRXZlbnQuU3RvcEJsb2NrQ3JhY2tpbmc7XG4gICAgICAgICAgICBwYWNrZXQucG9zaXRpb24gPSBCbG9ja1Bvc2l0aW9uLnRvVmVjdG9yM2YocGxheWVyLmJsb2NrVGFyZ2V0KTtcbiAgICAgICAgICAgIHBhY2tldC5kYXRhID0gMDtcblxuICAgICAgICAgICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgdG8gdGhlIGRpbWVuc2lvblxuICAgICAgICAgICAgZGltZW5zaW9uLmJyb2FkY2FzdChwYWNrZXQpO1xuXG4gICAgICAgICAgICAvLyBSZXNldCB0aGUgcGxheWVycyBibG9jayB0YXJnZXRcbiAgICAgICAgICAgIHBsYXllci5ibG9ja1RhcmdldCA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciB3YXMgaG9sZGluZyBhbiBpdGVtXG4gICAgICAgICAgaWYgKHBsYXllci5pdGVtVGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyU3RvcFVzaW5nSXRlbVNpZ25hbFxuICAgICAgICAgICAgbmV3IFBsYXllclN0b3BVc2luZ0l0ZW1TaWduYWwocGxheWVyLCBwbGF5ZXIuaXRlbVRhcmdldCkuZW1pdCgpO1xuXG4gICAgICAgICAgICAvLyBDYWxsIHRoZSBpdGVtIG9uU3RvcFVzZSB0cmFpdCBtZXRob2RzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHBsYXllci5pdGVtVGFyZ2V0LnRyYWl0cy52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgdHJhaXQub25TdG9wVXNlPy4ocGxheWVyLCB7IG1ldGhvZDogSXRlbVVzZU1ldGhvZC5CcmVhayB9KTtcblxuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHBsYXllcnMgaXRlbSB1c2UgdGltZVxuICAgICAgICAgICAgcGxheWVyLml0ZW1UYXJnZXQgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBQbGF5ZXJBY3Rpb25UeXBlLlByZWRpY3REZXN0cm95QmxvY2s6IHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGJsb2NrIGZyb20gdGhlIGFjdGlvbiBwb3NpdGlvblxuICAgICAgICAgIGNvbnN0IGJsb2NrID0gZGltZW5zaW9uLmdldEJsb2NrKGFjdGlvbi5wb3NpdGlvbik7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyQnJlYWtCbG9ja1NpZ25hbFxuICAgICAgICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJCcmVha0Jsb2NrU2lnbmFsKFxuICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICBwbGF5ZXIsXG4gICAgICAgICAgICBwbGF5ZXIuZ2V0SGVsZEl0ZW0oKVxuICAgICAgICAgICkuZW1pdCgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBkb2VzIG5vdCBoYXZlIGEgYmxvY2sgdGFyZ2V0XG4gICAgICAgICAgLy8gQW5kIGlmIHRoZSBwbGF5ZXIgaXMgbm90IGluIGNyZWF0aXZlIG1vZGU7IGFsc28gY2hlY2sgaWYgdGhlIHNpZ25hbCB3YXMgY2FuY2VsZWRcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoIXBsYXllci5ibG9ja1RhcmdldCAmJiBwbGF5ZXIuZ2FtZW1vZGUgIT09IEdhbWVtb2RlLkNyZWF0aXZlKSB8fFxuICAgICAgICAgICAgIXNpZ25hbFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFVwZGF0ZUJsb2NrUGFja2V0IGZvciB0aGUgYmxvY2sgdXBkYXRlXG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgVXBkYXRlQmxvY2tQYWNrZXQoKTtcbiAgICAgICAgICAgIHBhY2tldC5wb3NpdGlvbiA9IEJsb2NrUG9zaXRpb24udG9WZWN0b3IzZihibG9jay5wb3NpdGlvbik7XG4gICAgICAgICAgICBwYWNrZXQubGF5ZXIgPSBVcGRhdGVCbG9ja0xheWVyVHlwZS5Ob3JtYWw7XG4gICAgICAgICAgICBwYWNrZXQuZmxhZ3MgPSBVcGRhdGVCbG9ja0ZsYWdzVHlwZS5OZXR3b3JrO1xuICAgICAgICAgICAgcGFja2V0Lm5ldHdvcmtCbG9ja0lkID0gYmxvY2sucGVybXV0YXRpb24ubmV0d29yaztcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgICAgIHBsYXllci5zZW5kKHBhY2tldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJyZWFrIHRoZSBibG9ja1xuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGJsb2NrLmRlc3Ryb3kocGxheWVyKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIGJsb2NrIHdhcyBub3QgZGVzdHJveWVkLCB1cGRhdGUgdGhlIGJsb2NrXG4gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFVwZGF0ZUJsb2NrUGFja2V0IGZvciB0aGUgYmxvY2sgdXBkYXRlXG4gICAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IG5ldyBVcGRhdGVCbG9ja1BhY2tldCgpO1xuICAgICAgICAgICAgICBwYWNrZXQucG9zaXRpb24gPSBCbG9ja1Bvc2l0aW9uLnRvVmVjdG9yM2YoYmxvY2sucG9zaXRpb24pO1xuICAgICAgICAgICAgICBwYWNrZXQubGF5ZXIgPSBVcGRhdGVCbG9ja0xheWVyVHlwZS5Ob3JtYWw7XG4gICAgICAgICAgICAgIHBhY2tldC5mbGFncyA9IFVwZGF0ZUJsb2NrRmxhZ3NUeXBlLk5ldHdvcms7XG4gICAgICAgICAgICAgIHBhY2tldC5uZXR3b3JrQmxvY2tJZCA9IGJsb2NrLnBlcm11dGF0aW9uLm5ldHdvcms7XG5cbiAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICAgICAgICAgICAgcGxheWVyLnNlbmQocGFja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBhIG1pbmUgYmxvY2sgcmVxdWVzdCB3YXMgcHJvdmlkZWRcbiAgICAgICAgICAvLyBJZiBub3QsIHNraXAgdGhlIGJsb2NrIGJyZWFrXG4gICAgICAgICAgaWYgKCFyZXF1ZXN0IHx8ICFwbGF5ZXIuaXRlbVRhcmdldCkgY29udGludWU7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGl0ZW0gc3RhY2sgZnJvbSB0aGUgcGxheWVyXG4gICAgICAgICAgY29uc3Qgc3RhY2sgPSBwbGF5ZXIuaXRlbVRhcmdldDtcblxuICAgICAgICAgIC8vIFNldCB0aGUgdXNlIG1ldGhvZCBmb3IgdGhlIHRyYWl0LCBwcmVkaWN0ZWQgZHVyYWJpbGl0eSwgYW5kIHRhcmdldCBibG9ja1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IEl0ZW1Vc2VNZXRob2QuVXNlO1xuICAgICAgICAgIGNvbnN0IHByZWRpY3RlZER1cmFiaWxpdHkgPSByZXF1ZXN0LnByZWRpY3RlZER1cmFiaWxpdHk7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0QmxvY2sgPSBibG9jaztcblxuICAgICAgICAgIC8vIENhbGwgdGhlIGl0ZW0gb25Vc2UgdHJhaXQgbWV0aG9kc1xuICAgICAgICAgIHN0YWNrLnVzZShwbGF5ZXIsIHsgbWV0aG9kLCBwcmVkaWN0ZWREdXJhYmlsaXR5LCB0YXJnZXRCbG9jayB9KTtcblxuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBQbGF5ZXJVc2VJdGVtU2lnbmFsXG4gICAgICAgICAgbmV3IFBsYXllclVzZUl0ZW1TaWduYWwocGxheWVyLCBzdGFjaywgbWV0aG9kKS5lbWl0KCk7XG5cbiAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQbGF5ZXJBdXRoSW5wdXRIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHtcbiAgUmVxdWVzdENodW5rUmFkaXVzUGFja2V0LFxuICBQYWNrZXQsXG4gIENodW5rUmFkaXVzVXBkYXRlUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuaW1wb3J0IHsgUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCB9IGZyb20gXCIuLi9lbnRpdHlcIjtcblxuY2xhc3MgUmVxdWVzdENodW5rUmFkaXVzSGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuUmVxdWVzdENodW5rUmFkaXVzO1xuXG4gIHB1YmxpYyBoYW5kbGUoXG4gICAgcGFja2V0OiBSZXF1ZXN0Q2h1bmtSYWRpdXNQYWNrZXQsXG4gICAgY29ubmVjdGlvbjogQ29ubmVjdGlvblxuICApOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5wbGF5ZXJzLmdldChjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIG1heCB2aWV3IGRpc3RhbmNlXG4gICAgY29uc3QgbWF4Vmlld0Rpc3RhbmNlID0gcGxheWVyLmRpbWVuc2lvbi52aWV3RGlzdGFuY2U7XG5cbiAgICAvLyBHZXQgdGhlIHJlcXVlc3RlZCB2aWV3IGRpc3RhbmNlXG4gICAgY29uc3Qgdmlld0Rpc3RhbmNlID0gcGFja2V0LnJhZGl1cztcblxuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgY2h1bmsgcmVuZGVyaW5nIHRyYWl0XG4gICAgY29uc3QgdHJhaXQgPSBwbGF5ZXIuZ2V0VHJhaXQoUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldyB2aWV3IGRpc3RhbmNlXG4gICAgY29uc3QgZGlzdGFuY2UgPVxuICAgICAgdmlld0Rpc3RhbmNlID4gbWF4Vmlld0Rpc3RhbmNlID8gbWF4Vmlld0Rpc3RhbmNlIDogdmlld0Rpc3RhbmNlO1xuXG4gICAgLy8gU2V0IHRoZSB2aWV3IGRpc3RhbmNlLCB2ZXJpZnlpbmcgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgcGxheWVyJ3MgbWF4IHZpZXcgZGlzdGFuY2VcbiAgICB0cmFpdC52aWV3RGlzdGFuY2UgPVxuICAgICAgZGlzdGFuY2UgPiBwbGF5ZXIuZGV2aWNlLm1heFZpZXdEaXN0YW5jZVxuICAgICAgICA/IHBsYXllci5kZXZpY2UubWF4Vmlld0Rpc3RhbmNlXG4gICAgICAgIDogZGlzdGFuY2U7XG5cbiAgICAvLyBTZW5kIHRoZSBjaHVuayByYWRpdXMgdXBkYXRlZCBwYWNrZXRcbiAgICBjb25zdCB1cGRhdGUgPSBuZXcgQ2h1bmtSYWRpdXNVcGRhdGVQYWNrZXQoKTtcbiAgICB1cGRhdGUucmFkaXVzID0gdHJhaXQudmlld0Rpc3RhbmNlO1xuXG4gICAgLy8gU2VuZCB0aGUgdXBkYXRlIHRvIHRoZSBwbGF5ZXJcbiAgICBwbGF5ZXIuc2VuZEltbWVkaWF0ZSh1cGRhdGUpO1xuICB9XG59XG5cbmV4cG9ydCB7IFJlcXVlc3RDaHVua1JhZGl1c0hhbmRsZXIgfTtcbiIsICJpbXBvcnQge1xuICBEaXNjb25uZWN0UmVhc29uLFxuICBOZXR3b3JrU2V0dGluZ3NQYWNrZXQsXG4gIFBhY2tldCxcbiAgUFJPVE9DT0xfVkVSU0lPTixcbiAgdHlwZSBSZXF1ZXN0TmV0d29ya1NldHRpbmdzUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5cbmltcG9ydCB0eXBlIHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuY2xhc3MgUmVxdWVzdE5ldHdvcmtTZXR0aW5nc0hhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LlJlcXVlc3ROZXR3b3JrU2V0dGluZ3M7XG5cbiAgcHVibGljIGhhbmRsZShcbiAgICBwYWNrZXQ6IFJlcXVlc3ROZXR3b3JrU2V0dGluZ3NQYWNrZXQsXG4gICAgY29ubmVjdGlvbjogQ29ubmVjdGlvblxuICApOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpcyB0aGUgc2VydmVycyBwcm90b2NvbCBpcyBncmVhdGVyIHRoYW4gdGhlIGNsaWVudHMgcHJvdG9jb2wuXG4gICAgLy8gVGhpcyB3b3VsZCBtZWFuIHRoZSBjbGllbnQgbmVlZHMgdG8gYmUgdXBkYXRlZC5cbiAgICAvLyBBbHNvIGNoZWNrIGlmIHRoZSBzZXJ2ZXJzIHByb3RvY29sIGlzIGxlc3MgdGhhbiB0aGUgY2xpZW50cyBwcm90b2NvbC5cbiAgICAvLyBUaGlzIHdvdWxkIG1lYW4gdGhlIHNlcnZlciBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgIGlmIChQUk9UT0NPTF9WRVJTSU9OID4gcGFja2V0LnByb3RvY29sKSB7XG4gICAgICAvLyBTZW5kIHRoZSBjbGllbnQgdGhlIHNlcnZlcnMgcHJvdG9jb2wgdmVyc2lvbi5cbiAgICAgIHJldHVybiB0aGlzLm5ldHdvcmsuZGlzY29ubmVjdENvbm5lY3Rpb24oXG4gICAgICAgIGNvbm5lY3Rpb24sXG4gICAgICAgIFwiT3V0ZGF0ZWQgY2xpZW50ISBQbGVhc2UgdXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBNaW5lY3JhZnQgQmVkcm9jay5cIixcbiAgICAgICAgRGlzY29ubmVjdFJlYXNvbi5PdXRkYXRlZENsaWVudFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFBST1RPQ09MX1ZFUlNJT04gPCBwYWNrZXQucHJvdG9jb2wpIHtcbiAgICAgIC8vIFNlbmQgdGhlIGNsaWVudCB0aGUgc2VydmVycyBwcm90b2NvbCB2ZXJzaW9uLlxuICAgICAgcmV0dXJuIHRoaXMubmV0d29yay5kaXNjb25uZWN0Q29ubmVjdGlvbihcbiAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgXCJPdXRkYXRlZCBzZXJ2ZXIhIFBsZWFzZSB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHVwZGF0ZWQuXCIsXG4gICAgICAgIERpc2Nvbm5lY3RSZWFzb24uT3V0ZGF0ZWRTZXJ2ZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gT25jZSB3ZSBoYXZlIGRldGVybWluZWQgdGhhdCB0aGUgY2xpZW50IGlzIHVzaW5nIHRoZSBjb3JyZWN0IHByb3RvY29sIHZlcnNpb24sXG4gICAgLy8gV2UgY2FuIHNlbmQgdGhlIGNsaWVudCB0aGUgbmV0d29yayBzZXR0aW5ncy5cbiAgICAvLyBXaWxsIHdpbGwgYXNzaWduIHRoZSB2YWx1ZXMgZnJvbSB0aGUgbmV0d29yayBpbnN0YW5jZSB0byB0aGUgc2V0dGluZ3MgcGFja2V0LlxuICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IE5ldHdvcmtTZXR0aW5nc1BhY2tldCgpO1xuICAgIHNldHRpbmdzLmNvbXByZXNzaW9uVGhyZXNob2xkID1cbiAgICAgIHRoaXMuc2VyZW5pdHkucHJvcGVydGllcy5jb21wcmVzc2lvblRocmVzaG9sZDtcbiAgICBzZXR0aW5ncy5jb21wcmVzc2lvbk1ldGhvZCA9IHRoaXMuc2VyZW5pdHkucHJvcGVydGllcy5jb21wcmVzc2lvbk1ldGhvZDtcbiAgICBzZXR0aW5ncy5jbGllbnRUaHJvdHRsZSA9IGZhbHNlO1xuICAgIHNldHRpbmdzLmNsaWVudFRocmVzaG9sZCA9IDA7XG4gICAgc2V0dGluZ3MuY2xpZW50U2NhbGFyID0gMDtcblxuICAgIC8vIFNlbmQgdGhlIHNldHRpbmdzIHBhY2tldCB0byB0aGUgY2xpZW50LlxuICAgIHRoaXMubmV0d29yay5zZW5kTm9ybWFsKGNvbm5lY3Rpb24sIHNldHRpbmdzKTtcblxuICAgIC8vIFdlIGNhbiBub3cgZW5hYmxlIGNvbXByZXNzaW9uIGZvciB0aGUgc2Vzc2lvbi5cbiAgICAvLyBGb3IgdGhpcyBwb2ludCBvbiwgc29tZSBwYWNrZXRzIHdpbGwgYmUgY29tcHJlc3NlZC5cbiAgICB0aGlzLm5ldHdvcmsuc2V0Q29tcHJlc3Npb24oY29ubmVjdGlvbiwgdHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUmVxdWVzdE5ldHdvcmtTZXR0aW5nc0hhbmRsZXIgfTtcbiIsICJpbXBvcnQge1xuICBBdmFpbGFibGVBY3RvcklkZW50aWZpZXJzUGFja2V0LFxuICBEaWZmaWN1bHR5LFxuICBNSU5FQ1JBRlRfVkVSU0lPTixcbiAgUGFja2V0LFxuICBQbGF5U3RhdHVzLFxuICBQbGF5U3RhdHVzUGFja2V0LFxuICBSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZVBhY2tldCxcbiAgUmVzb3VyY2VQYWNrUmVzcG9uc2UsXG4gIFJlc291cmNlUGFja1N0YWNrUGFja2V0LFxuICBTdGFydEdhbWVQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuaW1wb3J0IHsgQ29tcG91bmRUYWcsIFRhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tIFwiLi4vaXRlbVwiO1xuaW1wb3J0IHsgQ3VzdG9tQmxvY2tUeXBlIH0gZnJvbSBcIi4uL2Jsb2NrXCI7XG5pbXBvcnQgeyBFbnRpdHlUeXBlIH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuXG5jbGFzcyBSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZUhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LlJlc291cmNlUGFja0NsaWVudFJlc3BvbnNlO1xuXG4gIHB1YmxpYyBoYW5kbGUoXG4gICAgcGFja2V0OiBSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZVBhY2tldCxcbiAgICBjb25uZWN0aW9uOiBDb25uZWN0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LmdldFBsYXllckJ5Q29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gR2V0IHRoZSBwbGF5ZXJzIGN1cnJlbnQgd29ybGRcbiAgICBjb25zdCB3b3JsZCA9IHBsYXllci5kaW1lbnNpb24ud29ybGQ7XG5cbiAgICBzd2l0Y2ggKHBhY2tldC5yZXNwb25zZSkge1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBEZWJ1ZyB0aGUgdW5oYW5kbGVkIFJlc291cmNlUGFja0NsaWVudFJlc3BvbnNlXG4gICAgICAgIHRoaXMuc2VyZW5pdHkubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBVbmhhbmRsZWQgUmVzb3VyY2VQYWNrQ2xpZW50UmVzcG9uc2U6ICR7UmVzb3VyY2VQYWNrUmVzcG9uc2VbcGFja2V0LnJlc3BvbnNlXX1gXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFJlc291cmNlUGFja1Jlc3BvbnNlLkhhdmVBbGxQYWNrczoge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUmVzb3VyY2VQYWNrU3RhY2tQYWNrZXRcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgUmVzb3VyY2VQYWNrU3RhY2tQYWNrZXQoKTtcbiAgICAgICAgc3RhY2subXVzdEFjY2VwdCA9IGZhbHNlOyAvLyB0aGlzLnNlcmVuaXR5LnJlc291cmNlUGFja3MubXVzdEFjY2VwdFJlc291cmNlUGFja3M7XG4gICAgICAgIHN0YWNrLmJlaGF2aW9yUGFja3MgPSBbXTtcbiAgICAgICAgc3RhY2suZ2FtZVZlcnNpb24gPSBNSU5FQ1JBRlRfVkVSU0lPTjtcbiAgICAgICAgc3RhY2suZXhwZXJpbWVudHMgPSBbXTtcbiAgICAgICAgc3RhY2suZXhwZXJpbWVudHNQcmV2aW91c2x5VG9nZ2xlZCA9IGZhbHNlO1xuICAgICAgICBzdGFjay5oYXNFZGl0b3JQYWNrcyA9IGZhbHNlO1xuXG4gICAgICAgIHN0YWNrLnRleHR1cmVQYWNrcyA9IFtdO1xuICAgICAgICAvLyBmb3IgKGNvbnN0IHBhY2sgb2YgdGhpcy5zZXJlbml0eS5yZXNvdXJjZVBhY2tzLmdldFBhY2tzKCkpIHtcbiAgICAgICAgLy8gICBjb25zdCBwYWNrSW5mbyA9IG5ldyBSZXNvdXJjZUlkVmVyc2lvbnMoXG4gICAgICAgIC8vICAgICBwYWNrLm5hbWUsXG4gICAgICAgIC8vICAgICBwYWNrLnV1aWQsXG4gICAgICAgIC8vICAgICBwYWNrLnZlcnNpb25cbiAgICAgICAgLy8gICApO1xuXG4gICAgICAgIC8vICAgc3RhY2sudGV4dHVyZVBhY2tzLnB1c2gocGFja0luZm8pO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gU2VuZCB0aGUgUmVzb3VyY2VQYWNrU3RhY2tQYWNrZXQgdG8gdGhlIHBsYXllclxuICAgICAgICByZXR1cm4gcGxheWVyLnNlbmQoc3RhY2spO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFJlc291cmNlUGFja1Jlc3BvbnNlLkNvbXBsZXRlZDoge1xuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgU3RhcnRHYW1lUGFja2V0KCk7XG4gICAgICAgIHBhY2tldC5lbnRpdHlJZCA9IHBsYXllci51bmlxdWVJZDtcbiAgICAgICAgcGFja2V0LnJ1bnRpbWVFbnRpdHlJZCA9IHBsYXllci5ydW50aW1lSWQ7XG4gICAgICAgIHBhY2tldC5wbGF5ZXJHYW1lbW9kZSA9IHBsYXllci5nYW1lbW9kZTtcbiAgICAgICAgcGFja2V0LnBsYXllclBvc2l0aW9uID0gcGxheWVyLnBvc2l0aW9uO1xuICAgICAgICBwYWNrZXQucGl0Y2ggPSBwbGF5ZXIucm90YXRpb24ucGl0Y2g7XG4gICAgICAgIHBhY2tldC55YXcgPSBwbGF5ZXIucm90YXRpb24ueWF3O1xuICAgICAgICBwYWNrZXQuc2VlZCA9IEJpZ0ludChwbGF5ZXIuZGltZW5zaW9uLmdlbmVyYXRvci5wcm9wZXJ0aWVzLnNlZWQpO1xuICAgICAgICBwYWNrZXQuYmlvbWVUeXBlID0gMDtcbiAgICAgICAgcGFja2V0LmJpb21lTmFtZSA9IFwicGxhaW5zXCI7XG4gICAgICAgIHBhY2tldC5kaW1lbnNpb24gPSBwbGF5ZXIuZGltZW5zaW9uLnR5cGU7XG4gICAgICAgIHBhY2tldC5nZW5lcmF0b3IgPSAxO1xuICAgICAgICBwYWNrZXQud29ybGRHYW1lbW9kZSA9IDA7XG4gICAgICAgIHBhY2tldC5oYXJkY29yZSA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuZGlmZmljdWx0eSA9IERpZmZpY3VsdHkuRWFzeTtcbiAgICAgICAgcGFja2V0LnNwYXduUG9zaXRpb24gPSBwbGF5ZXIuZGltZW5zaW9uLnNwYXduUG9zaXRpb247XG4gICAgICAgIHBhY2tldC5hY2hpZXZlbWVudHNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHBhY2tldC5lZGl0b3JXb3JsZFR5cGUgPSAwO1xuICAgICAgICBwYWNrZXQuY3JlYXRlZEluRWRpb3IgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmV4cG9ydGVkRnJvbUVkaW9yID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5kYXlDeWNsZVN0b3BUaW1lID0gcGxheWVyLmRpbWVuc2lvbi53b3JsZC5kYXlUaW1lO1xuICAgICAgICBwYWNrZXQuZWR1T2ZmZXIgPSAwO1xuICAgICAgICBwYWNrZXQuZWR1RmVhdHVyZXMgPSB0cnVlO1xuICAgICAgICBwYWNrZXQuZWR1UHJvZHVjdFV1aWQgPSBcIlwiO1xuICAgICAgICBwYWNrZXQucmFpbkxldmVsID0gMDtcbiAgICAgICAgcGFja2V0LmxpZ2h0bmluZ0xldmVsID0gMDtcbiAgICAgICAgcGFja2V0LmNvbmZpcm1lZFBsYXRmb3JtTG9ja2VkQ29udGVudCA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQubXVsdGlwbGF5ZXJHYW1lID0gdHJ1ZTtcbiAgICAgICAgcGFja2V0LmJyb2FkY2FzdFRvTGFuID0gdHJ1ZTtcbiAgICAgICAgcGFja2V0LnhibEJyb2FkY2FzdE1vZGUgPSA2O1xuICAgICAgICBwYWNrZXQucGxhdGZvcm1Ccm9hZGNhc3RNb2RlID0gNjtcbiAgICAgICAgcGFja2V0LmNvbW1hbmRzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHBhY2tldC50ZXh0dXJlUGFja3NSZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuZ2FtZXJ1bGVzID0gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiY29tbWFuZGJsb2Nrb3V0cHV0XCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJkb2RheWxpZ2h0Y3ljbGVcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImRvZW50aXR5ZHJvcHNcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImRvZmlyZXRpY2tcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInJlY2lwZXN1bmxvY2tcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImRvbGltaXRlZGNyYWZ0aW5nXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZG9tb2Jsb290XCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJkb21vYnNwYXduaW5nXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJkb3RpbGVkcm9wc1wiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiZG93ZWF0aGVyY3ljbGVcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImRyb3duaW5nZGFtYWdlXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJmYWxsZGFtYWdlXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJmaXJlZGFtYWdlXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJrZWVwaW52ZW50b3J5XCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibW9iZ3JpZWZpbmdcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInB2cFwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwic2hvd2Nvb3JkaW5hdGVzXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJuYXR1cmFscmVnZW5lcmF0aW9uXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJ0bnRleHBsb2Rlc1wiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwic2VuZGNvbW1hbmRmZWVkYmFja1wiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwibWF4Y29tbWFuZGNoYWlubGVuZ3RoXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDIsXG4gICAgICAgICAgICB2YWx1ZTogNjVfNTM1XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImRvaW5zb21uaWFcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImNvbW1hbmRibG9ja3NlbmFibGVkXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJyYW5kb210aWNrc3BlZWRcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMixcbiAgICAgICAgICAgIHZhbHVlOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImRvaW1tZWRpYXRlcmVzcGF3blwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAxLFxuICAgICAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInNob3dkZWF0aG1lc3NhZ2VzXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJmdW5jdGlvbmNvbW1hbmRsaW1pdFwiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAyLFxuICAgICAgICAgICAgdmFsdWU6IDEwXzAwMFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJzcGF3bnJhZGl1c1wiLFxuICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiAyLFxuICAgICAgICAgICAgdmFsdWU6IDEwXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInNob3d0YWdzXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJmcmVlemVkYW1hZ2VcIixcbiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogMSxcbiAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInJlc3Bhd25ibG9ja3NleHBsb2RlXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJzaG93Ym9yZGVyZWZmZWN0XCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJwbGF5ZXJzc2xlZXBpbmdwZXJjZW50YWdlXCIsXG4gICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IDIsXG4gICAgICAgICAgICB2YWx1ZTogMTAwXG4gICAgICAgICAgfVxuICAgICAgICBdO1xuICAgICAgICBwYWNrZXQuZXhwZXJpbWVudHMgPSBbXTtcbiAgICAgICAgcGFja2V0LmV4cGVyaW1lbnRzUHJldmlvdXNseVRvZ2dsZWQgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmJvbnVzQ2hlc3QgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0Lm1hcEVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LnBlcm1pc3Npb25MZXZlbCA9IHBsYXllci5wZXJtaXNzaW9uO1xuICAgICAgICBwYWNrZXQuc2VydmVyQ2h1bmtUaWNrUmFuZ2UgPSBwbGF5ZXIuZGltZW5zaW9uLnNpbXVsYXRpb25EaXN0YW5jZSA+PiA0O1xuICAgICAgICBwYWNrZXQuaGFzTG9ja2VkQmVoYXZpb3JQYWNrID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5oYXNMb2NrZWRSZXNvdXJjZVBhY2sgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmlzRnJvbUxvY2tlZFdvcmxkVGVtcGxhdGUgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LnVzZU1zYUdhbWVydGFnc09ubHkgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmlzRnJvbVdvcmxkVGVtcGxhdGUgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmlzV29ybGRUZW1wbGF0ZU9wdGlvbkxvY2tlZCA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQub25seVNwYXduVjFWaWxsYWdlcnMgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LnBlcnNvbmFEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuY3VzdG9tU2tpbnNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuZW1vdGVDaGF0TXV0ZWQgPSBmYWxzZTtcbiAgICAgICAgcGFja2V0LmdhbWVWZXJzaW9uID0gTUlORUNSQUZUX1ZFUlNJT047XG4gICAgICAgIHBhY2tldC5saW1pdGVkV29ybGRXaWR0aCA9IDE2O1xuICAgICAgICBwYWNrZXQubGltaXRlZFdvcmxkTGVuZ3RoID0gMTY7XG4gICAgICAgIHBhY2tldC5pc05ld05ldGhlciA9IGZhbHNlO1xuICAgICAgICBwYWNrZXQuZWR1UmVzb3VyY2VVcmlCdXR0b25OYW1lID0gXCJcIjtcbiAgICAgICAgcGFja2V0LmVkdVJlc291cmNlVXJpTGluayA9IFwiXCI7XG4gICAgICAgIHBhY2tldC5leHBlcmltZW50YWxHYW1lcGxheU92ZXJyaWRlID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5jaGF0UmVzdHJpY3Rpb25MZXZlbCA9IDA7XG4gICAgICAgIHBhY2tldC5kaXNhYmxlUGxheWVySW50ZXJhY3Rpb25zID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5zZXJ2ZXJJZGVudGZpZXIgPSBcIlNlcmVuaXR5SlNcIjtcbiAgICAgICAgcGFja2V0LndvcmxkSWRlbnRpZmllciA9IHBsYXllci5kaW1lbnNpb24ud29ybGQuaWRlbnRpZmllcjtcbiAgICAgICAgcGFja2V0LnNjZW5hcmlvSWRlbnRpZmllciA9IFwiU2VyZW5pdHlKU1wiO1xuICAgICAgICBwYWNrZXQubGV2ZWxJZCA9IFwiU2VyZW5pdHlKU1wiO1xuICAgICAgICBwYWNrZXQud29ybGROYW1lID0gcGxheWVyLmRpbWVuc2lvbi53b3JsZC5pZGVudGlmaWVyO1xuICAgICAgICBwYWNrZXQucHJlbWl1bVdvcmxkVGVtcGxhdGVJZCA9IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG4gICAgICAgIHBhY2tldC5pc1RyaWFsID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5tb3ZlbWVudEF1dGhvcml0eSA9IDE7XG4gICAgICAgIHBhY2tldC5yZXdpbmRIaXN0b3J5U2l6ZSA9IDA7XG4gICAgICAgIHBhY2tldC5zZXJ2ZXJBdXRob3JpdGF0aXZlQmxvY2tCcmVha2luZyA9IHRydWU7XG4gICAgICAgIHBhY2tldC5jdXJyZW50VGljayA9IHBsYXllci5kaW1lbnNpb24ud29ybGQuY3VycmVudFRpY2s7XG4gICAgICAgIHBhY2tldC5lbmNoYW50bWVudFNlZWQgPSAwO1xuXG4gICAgICAgIC8vIE1hcCB0aGUgY3VzdG9tIGJsb2NrcyB0byB0aGUgcGFja2V0XG4gICAgICAgIHBhY2tldC5ibG9ja1Byb3BlcnRpZXMgPSB3b3JsZC5ibG9ja1BhbGV0dGVcbiAgICAgICAgICAuZ2V0QWxsQ3VzdG9tVHlwZXMoKVxuICAgICAgICAgIC5tYXAoKGJsb2NrKSA9PiBDdXN0b21CbG9ja1R5cGUudG9CbG9ja1Byb3BlcnR5KGJsb2NrKSk7XG5cbiAgICAgICAgLy8gTWFwIHRoZSBjdXN0b20gaXRlbXMgdG8gdGhlIHBhY2tldFxuICAgICAgICBwYWNrZXQuaXRlbXMgPSB3b3JsZC5pdGVtUGFsZXR0ZVxuICAgICAgICAgIC5nZXRBbGxUeXBlcygpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4gSXRlbVR5cGUudG9JdGVtRGF0YShpdGVtKSk7XG5cbiAgICAgICAgcGFja2V0Lm11bHRpcGxheWVyQ29ycmVsYXRpb25JZCA9IFwiPHJha25ldD5hNTU1LTdlY2UtMmYxYy04ZjY5XCI7XG4gICAgICAgIHBhY2tldC5zZXJ2ZXJBdXRob3JpdGF0aXZlSW52ZW50b3J5ID0gdHJ1ZTtcbiAgICAgICAgcGFja2V0LmVuZ2luZSA9IFwiKlwiO1xuICAgICAgICBwYWNrZXQucHJvcGVydHlEYXRhMSA9IDB4MGE7XG4gICAgICAgIHBhY2tldC5wcm9wZXJ0eURhdGEyID0gMHgwMDtcbiAgICAgICAgcGFja2V0LnByb3BlcnR5RGF0YTMgPSAweDAwO1xuICAgICAgICBwYWNrZXQuYmxvY2tQYWxldHRlQ2hlY2tzdW0gPSAwbjtcbiAgICAgICAgcGFja2V0LndvcmxkVGVtcGxhdGVJZCA9IFwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIjtcbiAgICAgICAgcGFja2V0LmNsaWVudFNpZGVHZW5lcmF0aW9uID0gZmFsc2U7XG4gICAgICAgIHBhY2tldC5ibG9ja05ldHdvcmtJZHNBcmVIYXNoZXMgPSB0cnVlO1xuICAgICAgICBwYWNrZXQuc2VydmVyQ29udHJvbGxlZFNvdW5kcyA9IHRydWU7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBhdmFpbGFibGUgYWN0b3IgaWRlbnRpZmllcnNcbiAgICAgICAgY29uc3QgYWN0b3JzID0gbmV3IEF2YWlsYWJsZUFjdG9ySWRlbnRpZmllcnNQYWNrZXQoKTtcbiAgICAgICAgYWN0b3JzLmRhdGEgPSBuZXcgQ29tcG91bmRUYWcoKTtcblxuICAgICAgICAvLyBNYXAgdGhlIGVudGl0aWVzIHRvIHRoZSBwYWNrZXRcbiAgICAgICAgY29uc3QgZW50aXRpZXMgPSB3b3JsZC5lbnRpdHlQYWxldHRlXG4gICAgICAgICAgLmdldEFsbFR5cGVzKClcbiAgICAgICAgICAubWFwKChlbnRpdHkpID0+IEVudGl0eVR5cGUudG9OYnQoZW50aXR5KSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGxpc3QgdGFnIGZvciB0aGUgZW50aXRpZXNcbiAgICAgICAgYWN0b3JzLmRhdGEuY3JlYXRlTGlzdFRhZyhcImlkbGlzdFwiLCBUYWcuQ29tcG91bmQsIGVudGl0aWVzKTtcblxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGxheVN0YXR1c1BhY2tldCgpO1xuICAgICAgICBzdGF0dXMuc3RhdHVzID0gUGxheVN0YXR1cy5QbGF5ZXJTcGF3bjtcblxuICAgICAgICBwbGF5ZXIuc2VuZEltbWVkaWF0ZShwYWNrZXQsIHN0YXR1cywgYWN0b3JzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUmVzb3VyY2VQYWNrQ2xpZW50UmVzcG9uc2VIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHtcbiAgUGFja2V0LFxuICBTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWRQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5cbmNsYXNzIFNldExvY2FsUGxheWVyQXNJbml0aWFsaXplZEhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LlNldExvY2FsUGxheWVyQXNJbml0aWFsaXplZDtcblxuICBwdWJsaWMgaGFuZGxlKFxuICAgIF9wYWNrZXQ6IFNldExvY2FsUGxheWVyQXNJbml0aWFsaXplZFBhY2tldCxcbiAgICBjb25uZWN0aW9uOiBDb25uZWN0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGJ5IHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIFNwYXduIHRoZSBwbGF5ZXJcbiAgICBwbGF5ZXIuc3Bhd24oKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWRIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHsgUGFja2V0LCBUZXh0UGFja2V0IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBQbGF5ZXJDaGF0U2lnbmFsIH0gZnJvbSBcIi4uL2V2ZW50c1wiO1xuXG5jbGFzcyBUZXh0SGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuVGV4dDtcblxuICBwdWJsaWMgaGFuZGxlKHBhY2tldDogVGV4dFBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGJ5IHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5wbGF5ZXJzLmdldChjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllckNoYXRTaWduYWxcbiAgICBjb25zdCBzaWduYWwgPSBuZXcgUGxheWVyQ2hhdFNpZ25hbChwbGF5ZXIsIHBhY2tldC5tZXNzYWdlKTtcblxuICAgIC8vIElmIHRoZSBzaWduYWwgd2FzIGNhbmNlbGVkLCByZXR1cm5cbiAgICBpZiAoIXNpZ25hbC5lbWl0KCkpIHJldHVybjtcblxuICAgIC8vIFNldCB0aGUgbWVzc2FnZSBvZiB0aGUgcGFja2V0IHRvIHRoZSBzaWduYWwgbWVzc2FnZVxuICAgIHBhY2tldC5tZXNzYWdlID0gc2lnbmFsLm1lc3NhZ2U7XG5cbiAgICAvLyBDYWxsIHRoZSBibG9jayBvblN0YXJ0QnJlYWsgdHJhaXQgbWV0aG9kc1xuICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgcGxheWVyLnRyYWl0cy52YWx1ZXMoKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXJ0IGJyZWFrIHdhcyBzdWNjZXNzZnVsXG4gICAgICBjb25zdCBzdWNjZXNzID0gdHJhaXQub25DaGF0Py4ocGFja2V0Lm1lc3NhZ2UpO1xuXG4gICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCwgY29udGludWVcbiAgICAgIC8vIEFzIHRoZSB0cmFpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG1ldGhvZFxuICAgICAgaWYgKHN1Y2Nlc3MgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgZmFsc2UsIGNhbmNlbCB0aGUgYnJlYWtcbiAgICAgIGNhbmNlbGVkID0gIXN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLy8gQnJvYWRjYXN0IHRoZSBwYWNrZXQgaWYgaXQgd2FzIG5vdCBjYW5jZWxlZFxuICAgIGlmICghY2FuY2VsZWQpIHtcbiAgICAgIC8vIEJyb2FkY2FzdCB0aGUgcGFja2V0IHRvIHRoZSB3b3JsZFxuICAgICAgcGxheWVyLmRpbWVuc2lvbi53b3JsZC5icm9hZGNhc3QocGFja2V0KTtcblxuICAgICAgLy8gTG9nIHRoZSBjaGF0IHRvIHRoZSBjb25zb2xlXG4gICAgICBwbGF5ZXIuZGltZW5zaW9uLndvcmxkLmxvZ2dlci5pbmZvKFxuICAgICAgICBgwqc4W8KnOSR7cGxheWVyLnVzZXJuYW1lfcKnOF0gQ2hhdDrCp3IgJHtwYWNrZXQubWVzc2FnZX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBUZXh0SGFuZGxlciB9O1xuIiwgImltcG9ydCB7IENvbW1hbmRSZXF1ZXN0UGFja2V0LCBQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IENvbW1hbmRFeGVjdXRpb25TdGF0ZSB9IGZyb20gXCIuLi9jb21tYW5kc1wiO1xuXG5jbGFzcyBDb21tYW5kUmVxdWVzdEhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LkNvbW1hbmRSZXF1ZXN0O1xuXG4gIHB1YmxpYyBoYW5kbGUocGFja2V0OiBDb21tYW5kUmVxdWVzdFBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGJ5IHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIEdldCB0aGUgd29ybGQgZnJvbSB0aGUgcGxheWVyXG4gICAgY29uc3Qgd29ybGQgPSBwbGF5ZXIuZGltZW5zaW9uLndvcmxkO1xuXG4gICAgLy8gRmlsdGVyIHRoZSBjb21tYW5kXG4gICAgY29uc3QgbmFtZSA9IHBhY2tldC5jb21tYW5kLnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICA/IHBhY2tldC5jb21tYW5kLnNsaWNlKDEpXG4gICAgICA6IHBhY2tldC5jb21tYW5kO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IENvbW1hbmRFeGVjdXRpb25TdGF0ZSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0YXRlID0gbmV3IENvbW1hbmRFeGVjdXRpb25TdGF0ZShcbiAgICAgIHdvcmxkLmNvbW1hbmRzLmdldEFsbCgpLFxuICAgICAgbmFtZSxcbiAgICAgIHBsYXllclxuICAgICk7XG5cbiAgICAvLyBDYWxsIHRoZSBlbnRpdHkgb25Db21tYW5kIHRyYWl0IG1ldGhvZHNcbiAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHBsYXllci50cmFpdHMudmFsdWVzKCkpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjb21tYW5kIHdhcyBzdWNjZXNzZnVsXG4gICAgICBjb25zdCBzdWNjZXNzID0gdHJhaXQub25Db21tYW5kPy4oc3RhdGUpO1xuXG4gICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCwgY29udGludWVcbiAgICAgIC8vIEFzIHRoZSB0cmFpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG1ldGhvZFxuICAgICAgaWYgKHN1Y2Nlc3MgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgZmFsc2UsIGNhbmNlbCB0aGUgY29tbWFuZFxuICAgICAgY2FuY2VsZWQgPSAhc3VjY2VzcztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgY29tbWFuZCB3YXMgY2FuY2VsZWQsIHJldHVyblxuICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gdG8gZXhlY3V0ZSB0aGUgY29tbWFuZFxuICAgIGlmICgoc3RhdGUuY29tbWFuZD8ucmVnaXN0cnkucGVybWlzc2lvbkxldmVsID8/IDQpICsgMSA+IHBsYXllci5wZXJtaXNzaW9uKVxuICAgICAgcmV0dXJuIHBsYXllci5zZW5kTWVzc2FnZShcbiAgICAgICAgYMKnY1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUgdGhpcyBjb21tYW5kLmBcbiAgICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0YXRlLmV4ZWN1dGUoKTtcblxuICAgICAgLy8gTG9nIHRoZSBjb21tYW5kIHRvIHRoZSBjb25zb2xlXG4gICAgICB3b3JsZC5sb2dnZXIuaW5mbyhcbiAgICAgICAgYMKnOFvCpzkke3BsYXllci51c2VybmFtZX3CpzhdIENvbW1hbmQ6wqdyICR7cGFja2V0LmNvbW1hbmR9YFxuICAgICAgKTtcblxuICAgICAgLy8gU2VuZCB0aGUgcmVzdWx0IG1lc3NhZ2UgdG8gdGhlIHBsYXllciwgaWYgYW55LlxuICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlKSBwbGF5ZXIuc2VuZE1lc3NhZ2UoYMKnNyR7cmVzdWx0Lm1lc3NhZ2V9wqdyYCk7XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICAgIHBsYXllci5zZW5kTWVzc2FnZShgwqdjVHlwZSBFcnJvcjogJHsocmVhc29uIGFzIEVycm9yKS5tZXNzYWdlfcKncmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGxheWVyLnNlbmRNZXNzYWdlKGDCp2NTeW50YXggRXJyb3I6ICR7KHJlYXNvbiBhcyBFcnJvcikubWVzc2FnZX3Cp3JgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgQ29tbWFuZFJlcXVlc3RIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHsgSW50ZXJhY3RBY3Rpb24sIEludGVyYWN0UGFja2V0LCBQYWNrZXQgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tIFwiQHNlcmVuaXR5anMvcmFrbmV0XCI7XG5cbmltcG9ydCB7IE5ldHdvcmtIYW5kbGVyIH0gZnJvbSBcIi4uL25ldHdvcmtcIjtcbmltcG9ydCB7IEVudGl0eUludmVudG9yeVRyYWl0IH0gZnJvbSBcIi4uL2VudGl0eVwiO1xuXG5jbGFzcyBJbnRlcmFjdEhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LkludGVyYWN0O1xuXG4gIHB1YmxpYyBoYW5kbGUocGFja2V0OiBJbnRlcmFjdFBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGZyb20gdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LmdldFBsYXllckJ5Q29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIncyBkaW1lbnNpb25cbiAgICBjb25zdCBkaW1lbnNpb24gPSBwbGF5ZXIuZGltZW5zaW9uO1xuXG4gICAgLy8gU3dpdGNoIG9uIHRoZSBhY3Rpb24gdHlwZVxuICAgIHN3aXRjaCAocGFja2V0LmFjdGlvbikge1xuICAgICAgLy8gTG9nIHVuaW1wbGVtZW50ZWQgYWN0aW9uc1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gZGltZW5zaW9uLndvcmxkLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgSW50ZXJhY3RIYW5kbGVyOiBVbmltcGxlbWVudGVkIGFjdGlvbiAke1tJbnRlcmFjdEFjdGlvbltwYWNrZXQuYWN0aW9uXV19YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGZpcmVzIHdoZW4gYSBwbGF5ZXIgbG9va3MgYXQgYW4gZW50aXR5XG4gICAgICAvLyBJZiB0aGUgcnVudGltZSBpZCBpcyAwLCB0aGUgcGxheWVyIGlzIG5vIGxvbmdlciBsb29raW5nIGF0IHRoZSBlbnRpdHlcbiAgICAgIGNhc2UgSW50ZXJhY3RBY3Rpb24uSW50ZXJhY3RVcGRhdGU6IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJ1bnRpbWUgaWQgaXMgMFxuICAgICAgICBpZiAocGFja2V0LmFjdG9yUnVudGltZUlkID09PSAwbilcbiAgICAgICAgICByZXR1cm4gdm9pZCAocGxheWVyLmVudGl0eVRhcmdldCA9IG51bGwpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0IGVudGl0eSBmcm9tIHRoZSBkaW1lbnNpb25cbiAgICAgICAgY29uc3QgZW50aXR5ID0gZGltZW5zaW9uLmdldEVudGl0eShwYWNrZXQuYWN0b3JSdW50aW1lSWQsIHRydWUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRpdHkgZXhpc3RzXG4gICAgICAgIGlmICghZW50aXR5KSByZXR1cm47XG5cbiAgICAgICAgLy8gU2V0IHRoZSBwbGF5ZXIncyB0YXJnZXQgZW50aXR5XG4gICAgICAgIHJldHVybiB2b2lkIChwbGF5ZXIuZW50aXR5VGFyZ2V0ID0gZW50aXR5KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGFjdGlvbiBvY2N1cnMgd2hlbiB0aGUgcGxheWVyIGlzIG9wZW5pbmcgdGhlaXIgaW52ZW50b3J5XG4gICAgICBjYXNlIEludGVyYWN0QWN0aW9uLk9wZW5JbnZlbnRvcnk6IHtcbiAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXQgZW50aXR5IGZyb20gdGhlIGRpbWVuc2lvblxuICAgICAgICBjb25zdCBlbnRpdHkgPSBkaW1lbnNpb24uZ2V0RW50aXR5KHBhY2tldC5hY3RvclJ1bnRpbWVJZCwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVudGl0eSBoYXMgYSBpbnZlbnRvcnkgdHJhaXRcbiAgICAgICAgaWYgKCFlbnRpdHkgfHwgIWVudGl0eS5oYXNUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCkpXG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiRW50aXR5IGRvZXMgbm90IGhhdmUgYW4gaW52ZW50b3J5IHRyYWl0XCIpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgaW52ZW50b3J5IHRyYWl0IGZyb20gdGhlIGVudGl0eVxuICAgICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gZW50aXR5LmdldFRyYWl0KEVudGl0eUludmVudG9yeVRyYWl0KTtcblxuICAgICAgICAvLyBTaG93IHRoZSBjb250YWluZXIgdG8gdGhlIHBsYXllclxuICAgICAgICByZXR1cm4gY29udGFpbmVyLnNob3cocGxheWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgSW50ZXJhY3RIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHtcbiAgRGF0YVBhY2tldCxcbiAgUGFja2V0LFxuICBQbGF5U3RhdHVzLFxuICBQbGF5U3RhdHVzUGFja2V0XG59IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuaW1wb3J0IHsgRW50aXR5SGVhbHRoVHJhaXQgfSBmcm9tIFwiLi4vZW50aXR5XCI7XG5cbmNsYXNzIFJlc3Bhd25IYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5SZXNwYXduO1xuXG4gIHB1YmxpYyBoYW5kbGUoX3BhY2tldDogRGF0YVBhY2tldCwgY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgcGxheWVyIGJ5IHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5wbGF5ZXJzLmdldChjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXlTdGF0dXNQYWNrZXRcbiAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGxheVN0YXR1c1BhY2tldCgpO1xuICAgIHN0YXR1cy5zdGF0dXMgPSBQbGF5U3RhdHVzLlBsYXllclNwYXduO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXJcbiAgICBwbGF5ZXIuc2VuZEltbWVkaWF0ZShzdGF0dXMpO1xuXG4gICAgLy8gR2V0IHRoZSBwbGF5ZXJzIGhlYWx0aCB0cmFpdFxuICAgIGNvbnN0IGhlYWx0aCA9IHBsYXllci5nZXRUcmFpdChFbnRpdHlIZWFsdGhUcmFpdCk7XG5cbiAgICAvLyBTZXQgdGhlIHBsYXllcnMgaGVhbHRoIHRvIHRoZSBtYXggdmFsdWVcbiAgICBoZWFsdGguY3VycmVudFZhbHVlID0gaGVhbHRoLmRlZmF1bHRWYWx1ZTtcblxuICAgIHBsYXllci5zcGF3bigpO1xuICB9XG59XG5cbmV4cG9ydCB7IFJlc3Bhd25IYW5kbGVyIH07XG4iLCAiaW1wb3J0IHtcbiAgTW9kYWxGb3JtQ2FuY2VsZWRSZWFzb24sXG4gIE1vZGFsRm9ybVJlc3BvbnNlUGFja2V0LFxuICBQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBGb3JtIH0gZnJvbSBcIi4uL2Zvcm1zXCI7XG5cbmNsYXNzIE1vZGFsRm9ybVJlc3BvbnNlSGFuZGxlciBleHRlbmRzIE5ldHdvcmtIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBwYWNrZXQgPSBQYWNrZXQuTW9kYWxGb3JtUmVzcG9uc2U7XG5cbiAgcHVibGljIGhhbmRsZShwYWNrZXQ6IE1vZGFsRm9ybVJlc3BvbnNlUGFja2V0LCBjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgY29ubmVjdGlvbi5cbiAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLnNlcmVuaXR5LmdldFBsYXllckJ5Q29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuXG4gICAgLy8gR2V0IHRoZSBwZW5kaW5nIGZvcm0uXG4gICAgY29uc3QgcGVuZGluZyA9IEZvcm0ucGVuZGluZy5nZXQocGFja2V0LmlkKTtcblxuICAgIC8vIElmIHRoZSBmb3JtIGlzIG5vdCBmb3VuZCwgdGhyb3cgYW4gZXJyb3IuXG4gICAgaWYgKCFwZW5kaW5nKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIGZvcm0gd2l0aCBpZCAke3BhY2tldC5pZH0sIGJyb2FkY2FzdGVkIHRvICR7cGxheWVyLnVzZXJuYW1lfWBcbiAgICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIGluIHRoZSBwZW5kaW5nIGZvcm0uXG4gICAgY29uc3QgcGFydGljaXBhbnQgPSBwZW5kaW5nLmdldChwbGF5ZXIudW5pcXVlSWQpO1xuXG4gICAgLy8gSWYgdGhlIHBsYXllciBpcyBub3QgZm91bmQsIHRocm93IGFuIGVycm9yLlxuICAgIGlmICghcGFydGljaXBhbnQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggcGFydGljaXBhbnQgd2l0aCBpZCAke3BsYXllci51bmlxdWVJZH0sIGJyb2FkY2FzdGVkIHRvICR7cGxheWVyLnVzZXJuYW1lfWBcbiAgICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZm9ybSB3YXMgY2FuY2VsbGVkLlxuICAgIGlmIChwYWNrZXQuY2FuY2VsZWQpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZm9ybSB3aXRoIGFuIGVycm9yLlxuICAgICAgcGFydGljaXBhbnQucmVzdWx0KFxuICAgICAgICBudWxsLFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZvcm0gd2FzIGNhbmNlbGVkIGJ5IHRoZSBwbGF5ZXIuIFJlYXNvbjogJHtNb2RhbEZvcm1DYW5jZWxlZFJlYXNvbltwYWNrZXQucmVhc29uIGFzIE1vZGFsRm9ybUNhbmNlbGVkUmVhc29uXX1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBhcnNlIHRoZSBmb3JtIHJlc3BvbnNlLlxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHBhY2tldC5kYXRhIGFzIHN0cmluZyk7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgZm9ybSB3aXRoIHRoZSByZXNwb25zZS5cbiAgICAgIHBhcnRpY2lwYW50LnJlc3VsdChyZXNwb25zZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSBwYXJ0aWNpcGFudCBmcm9tIHRoZSBwZW5kaW5nIGZvcm0uXG4gICAgcGVuZGluZy5kZWxldGUocGxheWVyLnVuaXF1ZUlkKTtcblxuICAgIC8vIElmIHRoZSBwZW5kaW5nIGZvcm0gaXMgZW1wdHksIGRlbGV0ZSBpdC5cbiAgICBpZiAocGVuZGluZy5zaXplID09PSAwKSBGb3JtLnBlbmRpbmcuZGVsZXRlKHBhY2tldC5pZCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTW9kYWxGb3JtUmVzcG9uc2VIYW5kbGVyIH07XG4iLCAiaW1wb3J0IHtcbiAgQ2xpZW50Ym91bmRDbG9zZUZvcm1QYWNrZXQsXG4gIE1vZGFsRm9ybVJlcXVlc3RQYWNrZXQsXG4gIE1vZGFsRm9ybVR5cGUsXG4gIFNlcnZlclNldHRpbmdzUmVzcG9uc2VQYWNrZXRcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5cbmltcG9ydCB7IFBsYXllciB9IGZyb20gXCIuLi9lbnRpdHlcIjtcblxudHlwZSBGb3JtUmVzdWx0PFQ+ID0gKHJlc3BvbnNlOiBUIHwgbnVsbCwgZXJyb3I6IEVycm9yIHwgbnVsbCkgPT4gdm9pZDtcblxuaW50ZXJmYWNlIEZvcm1QYXJ0aWNpcGFudDxUPiB7XG4gIHBsYXllcjogUGxheWVyO1xuICByZXN1bHQ6IEZvcm1SZXN1bHQ8VD47XG59XG5cbmNsYXNzIEZvcm08VD4ge1xuICAvKipcbiAgICogVGhlIHBlbmRpbmcgZm9ybXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHN1Ym1pdHRlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGVuZGluZyA9IG5ldyBNYXA8XG4gICAgbnVtYmVyLFxuICAgIE1hcDxiaWdpbnQsIEZvcm1QYXJ0aWNpcGFudDxuZXZlcj4+XG4gID4oKTtcblxuICAvKipcbiAgICogVGhlIG5leHQgZm9ybSBpZCB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIG5ldyBmb3JtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmb3JtSWQgPSAwO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBpZCBvZiB0aGUgZm9ybS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBmb3JtSWQgPSArK0Zvcm0uZm9ybUlkO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBmb3JtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGUhOiBNb2RhbEZvcm1UeXBlO1xuXG4gIC8qKlxuICAgKiBTaG93cyB0aGUgZm9ybSB0byBhIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRvIHNob3cgdGhlIGZvcm0gdG8uXG4gICAqIEByZXR1cm5zIFRoZSBmb3JtIHJlc3BvbnNlOyB0aGUgdmFsdWUgb2YgdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgc2hvdyhwbGF5ZXI6IFBsYXllciwgcmVzdWx0OiBGb3JtUmVzdWx0PFQ+KTogdGhpcyB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZvcm0gZXhpc3RzIGluIHRoZSBwZW5kaW5nIGZvcm1zLlxuICAgIC8vIElmIGl0IGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYSBuZXcgbWFwLlxuICAgIGlmICghRm9ybS5wZW5kaW5nLmhhcyh0aGlzLmZvcm1JZCkpXG4gICAgICBGb3JtLnBlbmRpbmcuc2V0KHRoaXMuZm9ybUlkLCBuZXcgTWFwKCkpO1xuXG4gICAgLy8gR2V0IHRoZSBwZW5kaW5nIGZvcm1zIG1hcC5cbiAgICBjb25zdCBwZW5kaW5nID0gRm9ybS5wZW5kaW5nLmdldCh0aGlzLmZvcm1JZCk7XG5cbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgcGVuZGluZyBtYXAgZXhpc3RzLlxuICAgIGlmICghcGVuZGluZykgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBHZXQgdGhlIGZvcm0gcGF5bG9hZCBmcm9tIHRoZSBjbGFzcy5cbiAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgTW9kYWxGb3JtUmVxdWVzdFBhY2tldC5cbiAgICBjb25zdCBwYWNrZXQgPSBuZXcgTW9kYWxGb3JtUmVxdWVzdFBhY2tldCgpO1xuXG4gICAgLy8gQXNzaWduIHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSBwYWNrZXQuXG4gICAgcGFja2V0LmlkID0gdGhpcy5mb3JtSWQ7XG4gICAgcGFja2V0LnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXIuXG4gICAgcGxheWVyLnNlbmQocGFja2V0KTtcblxuICAgIC8vIEFkZCB0aGUgcGxheWVyIHRvIHRoZSBwZW5kaW5nIGZvcm1zIG1hcC5cbiAgICBwZW5kaW5nLnNldChwbGF5ZXIudW5pcXVlSWQsIHsgcGxheWVyLCByZXN1bHQgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIGZvcm0uXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBmb3JtIGZvciBhIHBsYXllci5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRvIGNsb3NlIHRoZSBmb3JtIGZvci5cbiAgICovXG4gIHB1YmxpYyBjbG9zZShwbGF5ZXI6IFBsYXllcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBDbGllbnRib3VuZENsb3NlRm9ybVBhY2tldFxuICAgIGNvbnN0IHBhY2tldCA9IG5ldyBDbGllbnRib3VuZENsb3NlRm9ybVBhY2tldCgpO1xuXG4gICAgLy8gU2VuZCB0aGUgcGFja2V0IHRvIHRoZSBwbGF5ZXIuXG4gICAgcGxheWVyLnNlbmQocGFja2V0KTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZvcm0gaGFzIGEgcGVuZGluZyByZXNwb25zZVxuICAgIGlmICghRm9ybS5wZW5kaW5nLmhhcyh0aGlzLmZvcm1JZCkpIHJldHVybjtcblxuICAgIC8vIEdldCB0aGUgcGVuZGluZyByZXNwb25zZXNcbiAgICBjb25zdCBwZW5kaW5nID0gRm9ybS5wZW5kaW5nLmdldCh0aGlzLmZvcm1JZCk7XG5cbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgcGVuZGluZyByZXNwb25zZXMgZXhpc3RcbiAgICBpZiAoIXBlbmRpbmcpIHJldHVybjtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBTZXJ2ZXJTZXR0aW5nc1Jlc3BvbnNlUGFja2V0XG4gICAgY29uc3QgcGFja2V0ID0gbmV3IFNlcnZlclNldHRpbmdzUmVzcG9uc2VQYWNrZXQoKTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcHJvcGVydGllcyB0byB0aGUgcGFja2V0XG4gICAgcGFja2V0LmZvcm1JZCA9IHRoaXMuZm9ybUlkO1xuICAgIHBhY2tldC5wYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG5cbiAgICAvLyBTZW5kIHRoZSBwYWNrZXQgdG8gdGhlIHBsYXllcnNcbiAgICBmb3IgKGNvbnN0IHsgcGxheWVyIH0gb2YgcGVuZGluZy52YWx1ZXMoKSkgcGxheWVyLnNlbmQocGFja2V0KTtcbiAgfVxufVxuXG5leHBvcnQgeyBGb3JtIH07XG4iLCAiaW1wb3J0IHsgTW9kYWxGb3JtVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBGb3JtIH0gZnJvbSBcIi4vZm9ybVwiO1xuXG5jbGFzcyBNZXNzYWdlRm9ybSBleHRlbmRzIEZvcm08Ym9vbGVhbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9IE1vZGFsRm9ybVR5cGUuTWVzc2FnZTtcblxuICAvKipcbiAgICogVGhlIHRpdGxlIG9mIHRoZSBmb3JtLlxuICAgKi9cbiAgcHVibGljIHRpdGxlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyBjb250ZW50ITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBvZiB0aGUgZmlyc3QgYnV0dG9uLlxuICAgKi9cbiAgcHVibGljIGJ1dHRvbjEhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG9mIHRoZSBzZWNvbmQgYnV0dG9uLlxuICAgKi9cbiAgcHVibGljIGJ1dHRvbjIhOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB7IE1lc3NhZ2VGb3JtIH07XG4iLCAiaW1wb3J0IHsgTW9kYWxGb3JtVHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBGb3JtIH0gZnJvbSBcIi4vZm9ybVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1hZ2UgdGhhdCBjYW4gYmUgc2hvd24gb24gYW4gYWN0aW9uIGZvcm0gYnV0dG9uLlxuICovXG5pbnRlcmZhY2UgQWN0aW9uRm9ybUltYWdlIHtcbiAgZGF0YTogc3RyaW5nO1xuICB0eXBlOiBcInBhdGhcIiB8IFwidXJsXCI7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGJ1dHRvbiB0aGF0IGNhbiBiZSBzaG93biBvbiBhbiBhY3Rpb24gZm9ybS5cbiAqL1xuaW50ZXJmYWNlIEFjdGlvbkZvcm1CdXR0b24ge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGltYWdlPzogQWN0aW9uRm9ybUltYWdlO1xufVxuXG4vKipcbiAqIFRoZXNlIGZvcm1zIGFsc28gY29udGFpbiBhIHRpdGxlIGFuZCBhIGNvbnRleHQgYXJlYSwgYnV0IGRldmVsb3BlcnMgY2FuIGFkZCBhcyBtYW55IGJ1dHRvbnMgYXMgdGhleSBzbyBkZXNpcmUuIFRoZXNlIGJ1dHRvbnMgY2FuIGFsc28gaGF2ZSB0ZXh0dXJlcyB0aGF0IGluY2x1ZGUgZWl0aGVyIGEgcmVzb3VyY2UgcGF0aCwgb3IgYSB1cmwgcGF0aC5cbiAqXG4gKiAqKkV4YW1wbGUgVXNhZ2UqKlxuXHRgYGB0c1xuXHRpbXBvcnQgeyBBY3Rpb25Gb3JtIH0gZnJvbSBcIkBzZXJlbml0eWpzL3NlcnZlci11aVwiXG5cdFxuXHQvLyBDcmVhdGUgYSBuZXcgQWN0aW9uRm9ybSBpbnN0YW5jZSBhbmQgc2V0IHRoZSB0aXRsZSwgY29udGVudCwgYW5kIGFkZCBidXR0b25zXG5cdGNvbnN0IGZvcm0gPSBuZXcgQWN0aW9uRm9ybSgpXG5cdGZvcm0udGl0bGUgPSBcIkFjdGlvbkZvcm0gRXhhbXBsZVwiXG5cdGZvcm0uY29udGVudCA9IFwiVGhpcyBpcyBhIGV4YW1wbGUgb2YgYSBhY3Rpb24gZm9ybS4gVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1lc3NhZ2UgZm9ybS5cIlxuXHRcblx0Ly8gQnV0dG9uIHdpdGggbm8gYWRkaXRpb25hbCBkYXRhXG5cdGZvcm0uYnV0dG9uKFwiQnV0dG9uIDFcIilcblx0XG5cdC8vIEJ1dHRvbiB3aXRoIGEgdGV4dHVyZSBwYXRoXG5cdGZvcm0uYnV0dG9uKFwiQnV0dG9uIDJcIiwge1xuXHQgIHR5cGU6IFwicGF0aFwiLFxuXHQgIGRhdGE6IFwidGV4dHVyZXMvaXRlbXMvYXBwbGVcIlxuXHR9KVxuXHRcblx0Ly8gQnV0dG9tIHdpdGggYSB1cmwgcGF0aFxuXHRmb3JtLmJ1dHRvbihcIkJ1dHRvbiAzXCIsIHtcblx0ICB0eXBlOiBcInVybFwiLFxuXHQgIGRhdGE6IFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1NlcmVuaXR5SlMvc2VyZW5pdHkvZGV2ZWxvcC9wdWJsaWMvc2VyZW5pdHlqcy1sb2dvLnBuZ1wiXG5cdH0pXG5cdFxuXHQvLyBTaG93IHRoZSBmb3JtIHRvIHRoZSBwbGF5ZXJcblx0Zm9ybS5zaG93KHBsYXllcilcblx0ICAudGhlbigocmVzcG9uc2UpID0+IHt9KVxuXHQgIC5jYXRjaCgocmVqZWN0ZWQpID0+IHt9KVxuXHRgYGBcbiAqL1xuY2xhc3MgQWN0aW9uRm9ybSBleHRlbmRzIEZvcm08bnVtYmVyPiB7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlID0gTW9kYWxGb3JtVHlwZS5BY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyB0aXRsZSE6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgY29udGVudCE6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJ1dHRvbnMgb2YgdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYnV0dG9uczogQXJyYXk8QWN0aW9uRm9ybUJ1dHRvbj4gPSBbXTtcblxuICAvKipcbiAgICogQWRkcyBhIGJ1dHRvbiB0byB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyBidXR0b24odGV4dDogc3RyaW5nLCBpbWFnZT86IEFjdGlvbkZvcm1JbWFnZSk6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIGJ1dHRvbiB0byB0aGUgYnV0dG9ucyBhcnJheVxuICAgIHRoaXMuYnV0dG9ucy5wdXNoKHsgdGV4dCwgaW1hZ2UgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZVxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IEFjdGlvbkZvcm0sIEFjdGlvbkZvcm1CdXR0b24sIEFjdGlvbkZvcm1JbWFnZSB9O1xuIiwgImltcG9ydCB7IE1vZGFsRm9ybVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgRm9ybSB9IGZyb20gXCIuL2Zvcm1cIjtcblxuLyoqXG4gKiBUaGVzZSBmb3JtcyBhcmUgdGhlIG11c3QgYWR2YW5jZWQgdHlwZSBvZiBmb3JtLiBUaGVzZSBhbGxvdyBkZXZlbG9wZXJzIHRvIGFkZCBlbGVtZW50cyB0byByZXF1ZXN0IGlucHV0IGZyb20gdGhlIHBsYXllciwgcmF0aGVyIHRoYW4gdXNpbmcgYnV0dG9ucy4gVGhlIGVsZW1lbnRzIHVzZWQgaW4gTW9kYWxGb3JtcyBhcmU6IGRyb3Bkb3duLCBpbnB1dCwgbGFiZWwsIHNsaWRlciwgc3RlcFNsaWRlciwgYW5kIHRvZ2dsZS5cbiAqXG4gKiAqKkV4YW1wbGUgVXNhZ2UqKlxuXHRgYGB0c1xuXHRpbXBvcnQgeyBNb2RhbEZvcm0gfSBmcm9tIFwiQHNlcmVuaXR5anMvc2VydmVyLXVpXCJcblx0XG5cdC8vIENyZWF0ZSBhIG5ldyBNb2RhbEZvcm0gaW5zdGFuY2UgYW5kIHNldCB0aGUgdGl0bGUgYW5kIGFkZCBlbGVtZW50c1xuXHRjb25zdCBmb3JtID0gbmV3IE1vZGFsRm9ybSgpXG5cdGZvcm0udGl0bGUgPSBcIk1vZGFsRm9ybSBFeGFtcGxlXCJcblx0XG5cdC8vIEEgZHJvcGRvd24gYWxsb3dzIHRoZSBwbGF5ZXIgdG8gc2VsZWN0IGZyb20gYSBsaXN0IG9mIG9wdGlvbnNcblx0Zm9ybS5kcm9wZG93bihcIkRyb3Bkb3duIEVsZW1lbnRcIiwgW1wiT3B0aW9uIDFcIiwgXCJPcHRpb24gMlwiLCBcIk9wdGlvbiAzXCJdLCAxKVxuXHRcblx0Ly8gQW4gaW5wdXQgYWxsb3dzIHRoZSBwbGF5ZXIgdG8gZW50ZXIgdGV4dFxuXHRmb3JtLmlucHV0KFwiSW5wdXQgRWxlbWVudFwiLCBcIklucHV0IFBsYWNlaG9sZGVyXCIsIFwiSW5wdXQgVGV4dFwiKVxuXHRcblx0Ly8gQSBzbGlkZXIgYWxsb3dzIHRoZSBwbGF5ZXIgdG8gc2VsZWN0IGEgdmFsdWUgd2l0aGluIGEgcmFuZ2Vcblx0Zm9ybS5zbGlkZXIoXCJTbGlkZXIgRWxlbWVudFwiLCAwLCAxMDAsIDEwKVxuXHRcblx0Ly8gQSBzdGVwIHNsaWRlciBhbGxvd3MgdGhlIHBsYXllciB0byBzZWxlY3QgYSB2YWx1ZSBmcm9tIGEgbGlzdCBvZiBvcHRpb25zXG5cdGZvcm0uc3RlcFNsaWRlcihcIlN0ZXAgU2xpZGVyIEVsZW1lbnRcIiwgW1wiU3RlcCAxXCIsIFwiU3RlcCAyXCIsIFwiU3RlcCAzXCJdLCAxKVxuXHRcblx0Ly8gQSB0b2dnbGUgYWxsb3dzIHRoZSBwbGF5ZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgYW4gb3B0aW9uXG5cdGZvcm0udG9nZ2xlKFwiVG9nZ2xlIEVsZW1lbnRcIiwgdHJ1ZSlcblx0XG5cdC8vIEEgbGFiZWwgZGlzcGxheXMgdGV4dCB0byB0aGUgcGxheWVyXG5cdGZvcm0ubGFiZWwoXCJMYWJlbCBFbGVtZW50XCIsIFwiTGFiZWwgVGV4dFwiKVxuXHRcblx0Ly8gU2hvdyB0aGUgZm9ybSB0byB0aGUgcGxheWVyXG5cdGZvcm0uc2hvdyhwbGF5ZXIpXG5cdCAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7fSlcblx0ICAuY2F0Y2goKHJlamVjdGVkKSA9PiB7fSlcblx0YGBgXG4gKi9cbmNsYXNzIE1vZGFsRm9ybTxUID0gdW5rbm93bj4gZXh0ZW5kcyBGb3JtPEFycmF5PFQ+PiB7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlID0gTW9kYWxGb3JtVHlwZS5Nb2RhbDtcblxuICAvKipcbiAgICogVGhlIHRpdGxlIG9mIHRoZSBmb3JtLlxuICAgKi9cbiAgcHVibGljIHRpdGxlITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250ZW50OiBBcnJheTx1bmtub3duPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgZHJvcGRvd24gbWVudSB0byB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgdGhlIGRyb3Bkb3duIG1lbnVcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIGRyb3Bkb3duIG1lbnVcbiAgICogQHBhcmFtIGRlZmF1bHRJbmRleCBUaGUgZGVmYXVsdCBpbmRleCBvZiB0aGUgZHJvcGRvd24gbWVudVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGRyb3Bkb3duKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBBcnJheTxzdHJpbmc+LFxuICAgIGRlZmF1bHRJbmRleCA9IDBcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5jb250ZW50LnB1c2goe1xuICAgICAgdHlwZTogXCJkcm9wZG93blwiLFxuICAgICAgdGV4dCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBkZWZhdWx0OiBkZWZhdWx0SW5kZXhcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB0ZXh0IGlucHV0IHRvIHRoZSBmb3JtLlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiB0aGUgaW5wdXRcbiAgICogQHBhcmFtIHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciBvZiB0aGUgaW5wdXRcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBpbnB1dCh0ZXh0OiBzdHJpbmcsIHBsYWNlaG9sZGVyID0gXCJcIiwgZGVmYXVsdFRleHQgPSBTdHJpbmcoKSk6IHRoaXMge1xuICAgIHRoaXMuY29udGVudC5wdXNoKHtcbiAgICAgIHR5cGU6IFwiaW5wdXRcIixcbiAgICAgIHRleHQsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIGRlZmF1bHQ6IGRlZmF1bHRUZXh0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbGFiZWwgdG8gdGhlIGZvcm0uXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGxhYmVsKHRleHQ6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMuY29udGVudC5wdXNoKHsgdHlwZTogXCJsYWJlbFwiLCB0ZXh0IH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHNsaWRlciB0byB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgdGhlIHNsaWRlclxuICAgKiBAcGFyYW0gbWluIFRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBzbGlkZXJcbiAgICogQHBhcmFtIG1heCBUaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc2xpZGVyXG4gICAqIEBwYXJhbSBzdGVwIFRoZSBzdGVwIG9mIHRoZSBzbGlkZXJcbiAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc2xpZGVyXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgc2xpZGVyKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBtaW46IG51bWJlcixcbiAgICBtYXg6IG51bWJlcixcbiAgICBzdGVwID0gMSxcbiAgICBkZWZhdWx0VmFsdWUgPSBtaW5cbiAgKTogdGhpcyB7XG4gICAgdGhpcy5jb250ZW50LnB1c2goe1xuICAgICAgdHlwZTogXCJzbGlkZXJcIixcbiAgICAgIHRleHQsXG4gICAgICBtaW4sXG4gICAgICBtYXgsXG4gICAgICBzdGVwLFxuICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RlcCBzbGlkZXIgdG8gdGhlIGZvcm0uXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBzdGVwIHNsaWRlclxuICAgKiBAcGFyYW0gc3RlcHMgVGhlIHN0ZXBzIG9mIHRoZSBzdGVwIHNsaWRlclxuICAgKiBAcGFyYW0gZGVmYXVsdEluZGV4IFRoZSBkZWZhdWx0IGluZGV4IG9mIHRoZSBzdGVwIHNsaWRlclxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHN0ZXBTbGlkZXIoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHN0ZXBzOiBBcnJheTxzdHJpbmc+LFxuICAgIGRlZmF1bHRJbmRleCA9IDBcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5jb250ZW50LnB1c2goe1xuICAgICAgdHlwZTogXCJzdGVwX3NsaWRlclwiLFxuICAgICAgdGV4dCxcbiAgICAgIHN0ZXBzLFxuICAgICAgZGVmYXVsdDogZGVmYXVsdEluZGV4XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdG9nZ2xlIHN3aXRjaCB0byB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgdGhlIHRvZ2dsZVxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB0b2dnbGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyB0b2dnbGUodGV4dDogc3RyaW5nLCBkZWZhdWx0VmFsdWUgPSBmYWxzZSk6IHRoaXMge1xuICAgIHRoaXMuY29udGVudC5wdXNoKHsgdHlwZTogXCJ0b2dnbGVcIiwgdGV4dCwgZGVmYXVsdDogZGVmYXVsdFZhbHVlIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgTW9kYWxGb3JtIH07XG4iLCAiaW1wb3J0IHtcbiAgUmVxdWVzdFBlcm1pc3Npb25zUGFja2V0LFxuICBQYWNrZXQsXG4gIFBlcm1pc3Npb25GbGFnLFxuICBBYmlsaXR5SW5kZXhcbn0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5cbmNsYXNzIFJlcXVlc3RQZXJtaXNzaW9uc0hhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LlJlcXVlc3RQZXJtaXNzaW9ucztcblxuICBwdWJsaWMgaGFuZGxlKFxuICAgIHBhY2tldDogUmVxdWVzdFBlcm1pc3Npb25zUGFja2V0LFxuICAgIGNvbm5lY3Rpb246IENvbm5lY3Rpb25cbiAgKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IHBsYXllciA9IHRoaXMuc2VyZW5pdHkuZ2V0UGxheWVyQnlDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIGlmICghcGxheWVyKSByZXR1cm4gY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG5cbiAgICAvLyBHZXQgdGhlIHRhcmdldCBwbGF5ZXIgZnJvbSB0aGUgYWN0b3IgdW5pcXVlIElEXG4gICAgY29uc3QgdGFyZ2V0ID0gcGxheWVyLmRpbWVuc2lvbi5nZXRFbnRpdHkocGFja2V0LmFjdG9yVW5pcXVlSWQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBwbGF5ZXIgZXhpc3RzLCBhbmQgaXMgYSBwbGF5ZXJcbiAgICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmlzUGxheWVyKCkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFyZ2V0IHBsYXllclwiKTtcblxuICAgIC8vIEdldCB0aGUgcGVybWlzc2lvbiBmbGFnc1xuICAgIGNvbnN0IGNhbkJ1aWxkID0gcGFja2V0LmdldEZsYWcoUGVybWlzc2lvbkZsYWcuQnVpbGQpO1xuICAgIGNvbnN0IGNhbk1pbmUgPSBwYWNrZXQuZ2V0RmxhZyhQZXJtaXNzaW9uRmxhZy5NaW5lKTtcbiAgICBjb25zdCBjYW5Vc2VEblMgPSBwYWNrZXQuZ2V0RmxhZyhQZXJtaXNzaW9uRmxhZy5Eb29yc0FuZFN3aXRjaGVzKTtcbiAgICBjb25zdCBjYW5PcGVuQ29udGFpbmVycyA9IHBhY2tldC5nZXRGbGFnKFBlcm1pc3Npb25GbGFnLk9wZW5Db250YWluZXJzKTtcbiAgICBjb25zdCBjYW5BdHRhY2tQbGF5ZXJzID0gcGFja2V0LmdldEZsYWcoUGVybWlzc2lvbkZsYWcuQXR0YWNrUGxheWVycyk7XG4gICAgY29uc3QgY2FuQXR0YWNrTW9icyA9IHBhY2tldC5nZXRGbGFnKFBlcm1pc3Npb25GbGFnLkF0dGFja01vYnMpO1xuICAgIGNvbnN0IGNhblVzZU9DID0gcGFja2V0LmdldEZsYWcoUGVybWlzc2lvbkZsYWcuT3BlcmF0b3JDb21tYW5kcyk7XG4gICAgY29uc3QgY2FuVGVsZXBvcnQgPSBwYWNrZXQuZ2V0RmxhZyhQZXJtaXNzaW9uRmxhZy5UZWxlcG9ydCk7XG5cbiAgICAvLyBTZXQgdGhlIHBlcm1pc3Npb24gZmxhZ3MgZm9yIHRoZSB0YXJnZXQgcGxheWVyXG4gICAgdGFyZ2V0LmFiaWxpdGllcy5zdXBlclNldChBYmlsaXR5SW5kZXguQnVpbGQsIGNhbkJ1aWxkKTtcbiAgICB0YXJnZXQuYWJpbGl0aWVzLnN1cGVyU2V0KEFiaWxpdHlJbmRleC5NaW5lLCBjYW5NaW5lKTtcbiAgICB0YXJnZXQuYWJpbGl0aWVzLnN1cGVyU2V0KEFiaWxpdHlJbmRleC5Eb29yc0FuZFN3aXRjaGVzLCBjYW5Vc2VEblMpO1xuICAgIHRhcmdldC5hYmlsaXRpZXMuc3VwZXJTZXQoQWJpbGl0eUluZGV4Lk9wZW5Db250YWluZXJzLCBjYW5PcGVuQ29udGFpbmVycyk7XG4gICAgdGFyZ2V0LmFiaWxpdGllcy5zdXBlclNldChBYmlsaXR5SW5kZXguQXR0YWNrUGxheWVycywgY2FuQXR0YWNrUGxheWVycyk7XG4gICAgdGFyZ2V0LmFiaWxpdGllcy5zdXBlclNldChBYmlsaXR5SW5kZXguQXR0YWNrTW9icywgY2FuQXR0YWNrTW9icyk7XG4gICAgdGFyZ2V0LmFiaWxpdGllcy5zdXBlclNldChBYmlsaXR5SW5kZXguT3BlcmF0b3JDb21tYW5kcywgY2FuVXNlT0MpO1xuICAgIHRhcmdldC5hYmlsaXRpZXMuc3VwZXJTZXQoQWJpbGl0eUluZGV4LlRlbGVwb3J0LCBjYW5UZWxlcG9ydCk7XG5cbiAgICAvLyBTZW5kIHRoZSBhYmlsaXRpZXMgdG8gdGhlIHRhcmdldCBwbGF5ZXJcbiAgICB0YXJnZXQuYWJpbGl0aWVzLnVwZGF0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCB7IFJlcXVlc3RQZXJtaXNzaW9uc0hhbmRsZXIgfTtcbiIsICJpbXBvcnQgeyBCbG9ja1BpY2tSZXF1ZXN0UGFja2V0LCBHYW1lbW9kZSwgUGFja2V0IH0gZnJvbSBcIkBzZXJlbml0eWpzL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIkBzZXJlbml0eWpzL3Jha25ldFwiO1xuXG5pbXBvcnQgeyBOZXR3b3JrSGFuZGxlciB9IGZyb20gXCIuLi9uZXR3b3JrXCI7XG5pbXBvcnQgeyBFbnRpdHlJbnZlbnRvcnlUcmFpdCB9IGZyb20gXCIuLi9lbnRpdHlcIjtcblxuY2xhc3MgQmxvY2tQaWNrUmVxdWVzdEhhbmRsZXIgZXh0ZW5kcyBOZXR3b3JrSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgcGFja2V0ID0gUGFja2V0LkJsb2NrUGlja1JlcXVlc3Q7XG5cbiAgcHVibGljIGhhbmRsZShwYWNrZXQ6IEJsb2NrUGlja1JlcXVlc3RQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIEdldCB0aGUgcG9zaXRpb24gZnJvbSB0aGUgcGFja2V0XG4gICAgY29uc3QgeyB4LCB5LCB6LCBhZGREYXRhIH0gPSBwYWNrZXQ7XG5cbiAgICAvLyBHZXQgdGhlIHBsYXllcidzIGRpbWVuc2lvblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHBsYXllci5kaW1lbnNpb247XG5cbiAgICAvLyBHZXQgdGhlIGJsb2NrIGF0IHRoZSBwb3NpdGlvbiBwcm92aWRlZCBieSB0aGUgcGFja2V0XG4gICAgY29uc3QgYmxvY2sgPSBkaW1lbnNpb24uZ2V0QmxvY2soeyB4LCB5LCB6IH0pO1xuXG4gICAgLy8gQ2FsbCB0aGUgb25QaWNrIHRyYWl0IG1ldGhvZHMgb2YgdGhlIGJsb2NrXG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiBibG9jay50cmFpdHMudmFsdWVzKCkpIHRyYWl0Lm9uUGljaz8uKHBsYXllciwgYWRkRGF0YSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGxheWVyIGlzIGluIGNyZWF0aXZlIG1vZGVcbiAgICBpZiAocGxheWVyLmdhbWVtb2RlICE9PSBHYW1lbW9kZS5DcmVhdGl2ZSkgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGl0ZW0gc3RhY2sgZnJvbSB0aGUgYmxvY2tcbiAgICBjb25zdCBpdGVtU3RhY2sgPSBibG9jay5nZXRJdGVtU3RhY2soe1xuICAgICAgYW1vdW50OiAxLFxuICAgICAgYXV4aWxsYXJ5OiBhZGREYXRhID8gYmxvY2sucGVybXV0YXRpb24uaW5kZXggOiAwXG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiBibG9jayBkYXRhIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgaXRlbSBzdGFja1xuICAgIGlmIChhZGREYXRhKSB7XG4gICAgICAvLyBHZXQgdGhlIGRhdGEgZW50cnkgb2YgdGhlIGJsb2NrXG4gICAgICBjb25zdCBlbnRyeSA9IGJsb2NrLmdldERhdGFFbnRyeSgpO1xuXG4gICAgICAvLyBBZGQgdGhlIGVudHJ5IHRvIHRoZSBpdGVtIHN0YWNrIGNvbXBvbmVudHNcbiAgICAgIGl0ZW1TdGFjay5jb21wb25lbnRzLnNldChcImJsb2NrX2RhdGFcIiwgZW50cnkpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgcGxheWVyJ3MgaW52ZW50b3J5IGNvbnRhaW5lclxuICAgIGNvbnN0IHsgY29udGFpbmVyLCBzZWxlY3RlZFNsb3QgfSA9IHBsYXllci5nZXRUcmFpdChFbnRpdHlJbnZlbnRvcnlUcmFpdCk7XG5cbiAgICAvLyBBZGQgdGhlIGl0ZW0gc3RhY2sgdG8gdGhlIHBsYXllcidzIGludmVudG9yeVxuICAgIGNvbnRhaW5lci5zZXRJdGVtKHNlbGVjdGVkU2xvdCwgaXRlbVN0YWNrKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCbG9ja1BpY2tSZXF1ZXN0SGFuZGxlciB9O1xuIiwgImltcG9ydCB7IEFjdG9yRmxhZywgRW1vdGVQYWNrZXQsIFBhY2tldCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gXCJAc2VyZW5pdHlqcy9yYWtuZXRcIjtcblxuaW1wb3J0IHsgTmV0d29ya0hhbmRsZXIgfSBmcm9tIFwiLi4vbmV0d29ya1wiO1xuaW1wb3J0IHsgUGxheWVyU3RhcnRFbW90aW5nU2lnbmFsLCBQbGF5ZXJTdG9wRW1vdGluZ1NpZ25hbCB9IGZyb20gXCIuLi9ldmVudHNcIjtcblxuY2xhc3MgRW1vdGVIYW5kbGVyIGV4dGVuZHMgTmV0d29ya0hhbmRsZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHBhY2tldCA9IFBhY2tldC5FbW90ZTtcblxuICBwdWJsaWMgaGFuZGxlKHBhY2tldDogRW1vdGVQYWNrZXQsIGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHBsYXllciBmcm9tIHRoZSBjb25uZWN0aW9uXG4gICAgY29uc3QgcGxheWVyID0gdGhpcy5zZXJlbml0eS5nZXRQbGF5ZXJCeUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9uIHRoZSBwbGF5ZXJcbiAgICBjb25zdCBkaW1lbnNpb24gPSBwbGF5ZXIuZGltZW5zaW9uO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IFBsYXllclN0YXJ0RW1vdGluZ1NpZ25hbFxuICAgIGNvbnN0IHNpZ25hbCA9IG5ldyBQbGF5ZXJTdGFydEVtb3RpbmdTaWduYWwoXG4gICAgICBwbGF5ZXIsXG4gICAgICBwYWNrZXQuZW1vdGVJZCxcbiAgICAgIHBhY2tldC50aWNrTGVuZ3RoXG4gICAgKS5lbWl0KCk7XG5cbiAgICAvLyBSZXR1cm4gaWYgdGhlIHNpZ25hbCB3YXMgY2FuY2VsbGVkXG4gICAgaWYgKCFzaWduYWwpIHJldHVybjtcblxuICAgIC8vIFNldCB0aGUgcGxheWVyJ3MgZW1vdGUgZmxhZ1xuICAgIHBsYXllci5mbGFncy5zZXQoQWN0b3JGbGFnLkVtb3RpbmcsIHRydWUpO1xuXG4gICAgLy8gU2NoZWR1bGUgdGhlIGVtb3RlIHRvIHN0b3AgYWZ0ZXIgdGhlIHRpY2sgbGVuZ3RoXG4gICAgZGltZW5zaW9uLnNjaGVkdWxlKHBhY2tldC50aWNrTGVuZ3RoKS5vbigoKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgUGxheWVyU3RvcEVtb3RpbmdTaWduYWxcbiAgICAgIG5ldyBQbGF5ZXJTdG9wRW1vdGluZ1NpZ25hbChwbGF5ZXIsIHBhY2tldC5lbW90ZUlkKS5lbWl0KCk7XG5cbiAgICAgIC8vIENsZWFyIHRoZSBwbGF5ZXIncyBlbW90ZSBmbGFnXG4gICAgICBwbGF5ZXIuZmxhZ3Muc2V0KEFjdG9yRmxhZy5FbW90aW5nLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIGVtb3RlIHRvIGFsbCBwbGF5ZXJzIGluIHRoZSBkaW1lbnNpb25cbiAgICBkaW1lbnNpb24uYnJvYWRjYXN0RXhjZXB0KHBsYXllciwgcGFja2V0KTtcbiAgfVxufVxuXG5leHBvcnQgeyBFbW90ZUhhbmRsZXIgfTtcbiIsICJpbXBvcnQgeyBBbmltYXRlSGFuZGxlciB9IGZyb20gXCIuL2FuaW1hdGVcIjtcbmltcG9ydCB7IENvbnRhaW5lckNsb3NlSGFuZGxlciB9IGZyb20gXCIuL2NvbnRhaW5lci1jbG9zZVwiO1xuaW1wb3J0IHsgRGlzY29ubmVjdEhhbmRsZXIgfSBmcm9tIFwiLi9kaXNjb25uZWN0XCI7XG5pbXBvcnQgeyBJbnZlbnRvcnlUcmFuc2FjdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi9pbnZlbnRvcnktdHJhbnNhY3Rpb25cIjtcbmltcG9ydCB7IEl0ZW1TdGFja1JlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4vaXRlbS1zdGFjay1yZXF1ZXN0XCI7XG5pbXBvcnQgeyBMb2dpbkhhbmRsZXIgfSBmcm9tIFwiLi9sb2dpblwiO1xuaW1wb3J0IHsgTW9iRXF1aXBtZW50SGFuZGxlciB9IGZyb20gXCIuL21vYi1lcXVpcG1lbnRcIjtcbmltcG9ydCB7IFBsYXllckFjdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi9wbGF5ZXItYWN0aW9uXCI7XG5pbXBvcnQgeyBQbGF5ZXJBdXRoSW5wdXRIYW5kbGVyIH0gZnJvbSBcIi4vcGxheWVyLWF1dGgtaW5wdXRcIjtcbmltcG9ydCB7IFJlcXVlc3RDaHVua1JhZGl1c0hhbmRsZXIgfSBmcm9tIFwiLi9yZXF1ZXN0LWNodW5rLXJhZGl1c1wiO1xuaW1wb3J0IHsgUmVxdWVzdE5ldHdvcmtTZXR0aW5nc0hhbmRsZXIgfSBmcm9tIFwiLi9yZXF1ZXN0LW5ldHdvcmstc2V0dGluZ3NcIjtcbmltcG9ydCB7IFJlc291cmNlUGFja0NsaWVudFJlc3BvbnNlSGFuZGxlciB9IGZyb20gXCIuL3Jlc291cmNlLXBhY2stcmVzcG9uc2VcIjtcbmltcG9ydCB7IFNldExvY2FsUGxheWVyQXNJbml0aWFsaXplZEhhbmRsZXIgfSBmcm9tIFwiLi9zZXQtbG9jYWwtcGxheWVyLWFzLWluaXRpYWxpemVkXCI7XG5pbXBvcnQgeyBUZXh0SGFuZGxlciB9IGZyb20gXCIuL3RleHRcIjtcbmltcG9ydCB7IENvbW1hbmRSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCIuL2NvbW1hbmQtcmVxdWVzdFwiO1xuaW1wb3J0IHsgSW50ZXJhY3RIYW5kbGVyIH0gZnJvbSBcIi4vaW50ZXJhY3RcIjtcbmltcG9ydCB7IFJlc3Bhd25IYW5kbGVyIH0gZnJvbSBcIi4vcmVzcGF3blwiO1xuaW1wb3J0IHsgTW9kYWxGb3JtUmVzcG9uc2VIYW5kbGVyIH0gZnJvbSBcIi4vbW9kYWwtZm9ybS1yZXNwb25zZVwiO1xuaW1wb3J0IHsgUmVxdWVzdFBlcm1pc3Npb25zSGFuZGxlciB9IGZyb20gXCIuL3JlcXVlc3QtcGVybWlzc2lvbnNcIjtcbmltcG9ydCB7IEJsb2NrUGlja1JlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4vYmxvY2stcGljay1yZXF1ZXN0XCI7XG5pbXBvcnQgeyBFbW90ZUhhbmRsZXIgfSBmcm9tIFwiLi9lbW90ZVwiO1xuXG5jb25zdCBIYW5kbGVycyA9IFtcbiAgUmVxdWVzdE5ldHdvcmtTZXR0aW5nc0hhbmRsZXIsXG4gIExvZ2luSGFuZGxlcixcbiAgUmVzb3VyY2VQYWNrQ2xpZW50UmVzcG9uc2VIYW5kbGVyLFxuICBQbGF5ZXJBdXRoSW5wdXRIYW5kbGVyLFxuICBTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWRIYW5kbGVyLFxuICBEaXNjb25uZWN0SGFuZGxlcixcbiAgQ29udGFpbmVyQ2xvc2VIYW5kbGVyLFxuICBNb2JFcXVpcG1lbnRIYW5kbGVyLFxuICBJdGVtU3RhY2tSZXF1ZXN0SGFuZGxlcixcbiAgUmVxdWVzdENodW5rUmFkaXVzSGFuZGxlcixcbiAgQW5pbWF0ZUhhbmRsZXIsXG4gIEludmVudG9yeVRyYW5zYWN0aW9uSGFuZGxlcixcbiAgUGxheWVyQWN0aW9uSGFuZGxlcixcbiAgVGV4dEhhbmRsZXIsXG4gIENvbW1hbmRSZXF1ZXN0SGFuZGxlcixcbiAgSW50ZXJhY3RIYW5kbGVyLFxuICBSZXNwYXduSGFuZGxlcixcbiAgTW9kYWxGb3JtUmVzcG9uc2VIYW5kbGVyLFxuICBSZXF1ZXN0UGVybWlzc2lvbnNIYW5kbGVyLFxuICBCbG9ja1BpY2tSZXF1ZXN0SGFuZGxlcixcbiAgRW1vdGVIYW5kbGVyXG5dO1xuXG5leHBvcnQgeyBIYW5kbGVycyB9O1xuIiwgImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgU2VyZW5pdHkgfSBmcm9tIFwiLi4vc2VyZW5pdHlcIjtcblxuaW50ZXJmYWNlIFBlcm1pc3Npb25FbnRyeSB7XG4gIHV1aWQ6IHN0cmluZztcbiAgbGV2ZWw6IFBlcm1pc3Npb25MZXZlbDtcbn1cblxuaW50ZXJmYWNlIFBlcm1pc3Npb25Qcm9wZXJ0aWVzIHtcbiAgcGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgcGVybWlzc2lvbnM6IEFycmF5PFBlcm1pc3Npb25FbnRyeT47XG59XG5cbmNvbnN0IERlZmF1bHRQZXJtaXNzaW9uUHJvcGVydGllczogUGVybWlzc2lvblByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IG51bGwsXG4gIHBlcm1pc3Npb25zOiBbXVxufTtcblxuY2xhc3MgUGVybWlzc2lvbnMgZXh0ZW5kcyBNYXA8c3RyaW5nLCBQZXJtaXNzaW9uTGV2ZWw+IHtcbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlcmVuaXR5OiBTZXJlbml0eTtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBlcm1pc3Npb25zIGZpbGU7IGlmIGl0IGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBlcm1pc3Npb25zIG1hcC5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgcGVybWlzc2lvbnMgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcGVybWlzc2lvbnM6IFBhcnRpYWw8UGVybWlzc2lvblByb3BlcnRpZXM+XG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zZXJlbml0eSA9IHNlcmVuaXR5O1xuXG4gICAgLy8gU3ByZWFkIHRoZSBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcHJvcHMgPSB7IC4uLkRlZmF1bHRQZXJtaXNzaW9uUHJvcGVydGllcywgLi4ucGVybWlzc2lvbnMgfTtcblxuICAgIC8vIEFzc2lnbiB0aGUgcGVybWlzc2lvbnNcbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgcHJvcHMucGVybWlzc2lvbnMpIHtcbiAgICAgIHRoaXMuc2V0KHBlcm1pc3Npb24udXVpZCwgcGVybWlzc2lvbi5sZXZlbCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBwYXRoIGlmIGl0IGV4aXN0c1xuICAgIGlmIChwcm9wcy5wYXRoKSB0aGlzLnBhdGggPSBwcm9wcy5wYXRoO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFBlcm1pc3Npb25MZXZlbCB7XG4gICAgLy8gQ2FsbCB0aGUgb3JpZ2luYWwgZ2V0IG1ldGhvZFxuICAgIHJldHVybiBzdXBlci5nZXQoa2V5KSA/PyBQZXJtaXNzaW9uTGV2ZWwuTWVtYmVyO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFBlcm1pc3Npb25MZXZlbCk6IHRoaXMge1xuICAgIC8vIENhbGwgdGhlIG9yaWdpbmFsIHNldCBtZXRob2RcbiAgICBzdXBlci5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICAvLyBTYXZlIHRoZSBwZXJtaXNzaW9ucyB0byB0aGUgZmlsZVxuICAgIGlmICh0aGlzLnBhdGgpIHtcbiAgICAgIC8vIE1hcCB0aGUgcGVybWlzc2lvbnNcbiAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMoKSkubWFwKChbdXVpZCwgbGV2ZWxdKSA9PiAoe1xuICAgICAgICB1dWlkLFxuICAgICAgICBsZXZlbFxuICAgICAgfSkpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgcGVybWlzc2lvbnMgdG8gdGhlIGZpbGVcbiAgICAgIHdyaXRlRmlsZVN5bmModGhpcy5wYXRoLCBKU09OLnN0cmluZ2lmeShwZXJtaXNzaW9ucywgbnVsbCwgMikpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgbWFwXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBlcm1pc3Npb25zIG1hcCBmcm9tIGEgcGF0aC5cbiAgICogQHBhcmFtIHNlcmVuaXR5IFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgcGVybWlzc2lvbnMgZmlsZS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVBhdGgoc2VyZW5pdHk6IFNlcmVuaXR5LCBwYXRoOiBzdHJpbmcpOiBQZXJtaXNzaW9ucyB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhdGggZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCkpKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgcGVybWlzc2lvbnMuanNvbiBmaWxlXG4gICAgICB3cml0ZUZpbGVTeW5jKHJlc29sdmUocGF0aCksIEpTT04uc3RyaW5naWZ5KFtdKSk7XG4gICAgfVxuXG4gICAgLy8gUmVhZCB0aGUgcGVybWlzc2lvbnMgZmlsZVxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gSlNPTi5wYXJzZShcbiAgICAgIHJlYWRGaWxlU3luYyhyZXNvbHZlKHBhdGgpLCBcInV0Zi04XCIpXG4gICAgKSBhcyBBcnJheTxQZXJtaXNzaW9uRW50cnk+O1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHBlcm1pc3Npb25zIG1hcFxuICAgIGNvbnN0IG1hcCA9IG5ldyBQZXJtaXNzaW9ucyhzZXJlbml0eSwgeyBwYXRoLCBwZXJtaXNzaW9ucyB9KTtcblxuICAgIC8vIFJldHVybiB0aGUgbWFwXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxufVxuXG5leHBvcnQgeyBQZXJtaXNzaW9ucywgUGVybWlzc2lvbkVudHJ5IH07XG4iLCAiaW1wb3J0IHsgSXRlbVN0YWNrIH0gZnJvbSBcIi4uL2l0ZW1cIjtcbmltcG9ydCB7IExvb3RFbnRyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5jbGFzcyBMb290UG9vbCB7XG4gIHByaXZhdGUgZW50cmllczogQXJyYXk8TG9vdEVudHJ5PiA9IFtdO1xuICBwdWJsaWMgcm9sbHM6IG51bWJlciA9IDE7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGVudHJpZXM6IEFycmF5PExvb3RFbnRyeT4sIHJvbGxzOiBudW1iZXIpIHtcbiAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xuICAgIHRoaXMucm9sbHMgPSByb2xscztcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xscyB0aGUgcG9vbCB0byBnZXQgdGhlIGxvb3QgaXRlbXMuXG4gICAqIEByZXR1cm5zIFRoZSBsb290IGl0ZW1zIGZyb20gdGhlIHBvb2wgcm9sbC5cbiAgICovXG4gIHB1YmxpYyByb2xsKCk6IEFycmF5PEl0ZW1TdGFjaz4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEFycmF5PEl0ZW1TdGFjaz4gPSBbXTtcbiAgICBjb25zdCB0b3RhbFdlaWdodCA9IHRoaXMuZW50cmllc1xuICAgICAgLm1hcCgoeyB3ZWlnaHQgfSkgPT4gd2VpZ2h0KVxuICAgICAgLnJlZHVjZSgoYSwgYykgPT4gYyArIGEpO1xuXG4gICAgZm9yIChsZXQgXyA9IDA7IF8gPCB0aGlzLnJvbGxzOyBfKyspIHtcbiAgICAgIGNvbnN0IHJhbmRvbVdlaWdodCA9IE1hdGgucmFuZG9tKCkgKiB0b3RhbFdlaWdodDtcbiAgICAgIGxldCBhY2N1bXVsYXRpdmUgPSAwO1xuXG4gICAgICBmb3IgKGNvbnN0IHsgd2VpZ2h0LCBpdGVtU3RhY2ssIGZ1bmN0aW9uOiBjYWxsYmFjayB9IG9mIHRoaXMuZW50cmllcykge1xuICAgICAgICBhY2N1bXVsYXRpdmUgKz0gd2VpZ2h0O1xuICAgICAgICBpZiAocmFuZG9tV2VpZ2h0IDwgYWNjdW11bGF0aXZlKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKGNhbGxiYWNrPy4oaXRlbVN0YWNrKSA/PyBpdGVtU3RhY2spO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgbG9vdCBlbnRyeSB0byB0aGUgbG9vdCBwb29sLlxuICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5IHRoYXQgd2lsbCBiZSBhZGRlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRFbnRyeShlbnRyeTogTG9vdEVudHJ5KTogdGhpcyB7XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZW50cnkgZnJvbSB0aGUgbG9vdCBwb29sLlxuICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5IHRoYXQgd2lsbCBiZSByZW1vdmVkLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVudHJ5KGVudHJ5OiBMb290RW50cnkpOiB0aGlzIHtcbiAgICB0aGlzLmVudHJpZXMuc3BsaWNlKHRoaXMuZW50cmllcy5pbmRleE9mKGVudHJ5KSwgMSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgTG9vdFBvb2wgfTtcbiIsICJpbXBvcnQgeyBJdGVtU3RhY2sgfSBmcm9tIFwiLi4vaXRlbVwiO1xuXG5pbXBvcnQgeyBMb290UG9vbCB9IGZyb20gXCIuL3Bvb2xcIjtcblxuY2xhc3MgTG9vdFRhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwb29sczogU2V0PExvb3RQb29sPiA9IG5ldyBTZXQoKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocG9vbHM6IEFycmF5PExvb3RQb29sPiB8IFNldDxMb290UG9vbD4pIHtcbiAgICB0aGlzLnBvb2xzID0gbmV3IFNldChwb29scyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHBvb2wgdG8gdGhlIGxvb3QgdGFibGUuXG4gICAqIEBwYXJhbSBwb29sIFRoZSBsb290IHBvb2wgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0YWJsZS5cbiAgICovXG4gIHB1YmxpYyBhZGRQb29sKHBvb2w6IExvb3RQb29sKTogdGhpcyB7XG4gICAgdGhpcy5wb29scy5hZGQocG9vbCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHBvb2wgZnJvbSB0aGUgbG9vdCB0YWJsZVxuICAgKiBAcGFyYW0gcG9vbCBUaGUgcG9vbCB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0YWJsZS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVQb29sKHBvb2w6IExvb3RQb29sKTogdGhpcyB7XG4gICAgdGhpcy5wb29scy5kZWxldGUocG9vbCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSByYW5kb20gbG9vdCBmcm9tIHRoZSBsb290IHBvb2xzLlxuICAgKiBAcmV0dXJucyBUaGUgbG9vdCByZXN1bHRhbnQgb2YgdGhlIHJvbGwgb2YgZXZlcnkgcG9vbC5cbiAgICovXG4gIHB1YmxpYyBnZXRMb290KCk6IEFycmF5PEl0ZW1TdGFjaz4ge1xuICAgIGNvbnN0IGxvb3Q6IEFycmF5PEl0ZW1TdGFjaz4gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcG9vbCBvZiB0aGlzLnBvb2xzKSB7XG4gICAgICBsb290LnB1c2goLi4ucG9vbC5yb2xsKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9vdDtcbiAgfVxufVxuXG5leHBvcnQgeyBMb290VGFibGUgfTtcbiJdLAogICJtYXBwaW5ncyI6ICJpSkFBQSxPQUNFQSxxQkFBQUEsR0FDQUMscUJBQUFBLEdBQ0FDLG9CQUFBQSxPQUNLLHVCQUNQLE9BQVNDLFVBQUFBLEdBQVFDLGdCQUFBQSxPQUFvQixxQkFDckMsT0FBcUJDLGNBQUFBLE9BQWtCLHFCQUN2QyxPQUFPQyxPQUFhLHNCQ1BwQixPQUFTQyxrQkFBQUEsR0FBZ0JDLGtCQUFBQSxPQUFzQixZQUUvQyxPQUFTQyxXQUFBQSxPQUFlLHNCQUN4QixPQUVFQyxTQUFBQSxHQUNBQyxZQUFBQSxHQUNBQyxlQUFBQSxHQUNBQyxVQUFBQSxPQUNLLHFCQUNQLE9BQVNDLFVBQUFBLEdBQVFDLGdCQUFBQSxPQUFvQixxQkFDckMsT0FDRUMscUJBQUFBLEdBRUFDLHFCQUFBQSxHQUNBQyxvQkFBQUEsR0FDQUMsb0JBQUFBLEdBQ0FDLFVBQUFBLEdBQ0FDLGVBQUFBLEdBQ0FDLFVBQUFBLEdBQ0FDLFdBQUFBLE9BQ0ssdUJDckJQLElBQUtDLEdBQUFBLFNBQUFBLEVBQUFBLHNEQUFBQSxHQUFBQSxJQUFBQSxDQUFBQSxDQUFBQSxFQ0FFLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLG9scURBQUFBLE9DQUwsSUFBS0MsRUFBQUEsU0FBQUEsRUFBQUEsaWxJQUFBQSxPQ0FMLElBQUtDLEVBQUFBLFNBQUFBLEVBQUFBLHExM0RBQUFBLE9DQVosSUFBS0MsR0FBQUEsU0FBQUEsRUFBQUEsOEdBQUFBLEdBQUFBLElBQUFBLENBQUFBLENBQUFBLEVDQUwsSUFBS0MsR0FBQUEsU0FBQUEsRUFBQUEscTBGQUFBQSxHQUFBQSxJQUFBQSxDQUFBQSxDQUFBQSxFQ0FMLElBQUtDLEdBQUFBLFNBQUFBLEVBQUFBLG1LQUFBQSxHQUFB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LElBQ1QsQ0FNT0ksU0FBNEIsQ0FDakMsSUFBTUMsRUFBeUIsQ0FBQSxFQUUvQixRQUFXTCxLQUFRLEtBQUtILE1BQ3RCUSxFQUFLQyxLQUFJLEdBQUlOLEVBQUtPLEtBQUksQ0FBQSxFQUV4QixPQUFPRixDQUNULENBQ0YiLAogICJuYW1lcyI6IFsiQ29tcHJlc3Npb25NZXRob2QiLCAiTUlORUNSQUZUX1ZFUlNJT04iLCAiUFJPVE9DT0xfVkVSU0lPTiIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlJBS05FVF9UUFMiLCAiRW1pdHRlciIsICJkZWZsYXRlUmF3U3luYyIsICJpbmZsYXRlUmF3U3luYyIsICJFbWl0dGVyIiwgIkZyYW1lIiwgIlByaW9yaXR5IiwgIlJlbGlhYmlsaXR5IiwgIlNlcnZlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkNvbXByZXNzaW9uTWV0aG9kIiwgIkRpc2Nvbm5lY3RNZXNzYWdlIiwgIkRpc2Nvbm5lY3RQYWNrZXQiLCAiRGlzY29ubmVjdFJlYXNvbiIsICJGcmFtZXIiLCAiZ2V0UGFja2V0SWQiLCAiUGFja2V0IiwgIlBhY2tldHMiLCAiTmV0d29ya0JvdW5kIiwgIkJsb2NrSWRlbnRpZmllciIsICJFbnRpdHlJZGVudGlmaWVyIiwgIkl0ZW1JZGVudGlmaWVyIiwgIkl0ZW1DYXRlZ29yeSIsICJJdGVtR3JvdXAiLCAiSXRlbVRvb2xUaWVyIiwgIkl0ZW1Ub29sVHlwZSIsICJCbG9ja1Rvb2xUeXBlIiwgIkl0ZW1Vc2VNZXRob2QiLCAiSXRlbVVzZU9uRW50aXR5SW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlIiwgIkVudGl0eUludGVyYWN0TWV0aG9kIiwgIkludGVyYWN0IiwgIkF0dGFjayIsICJDYXJkaW5hbERpcmVjdGlvbiIsICJXb3JsZEV2ZW50IiwgIlNlcnZlckV2ZW50IiwgIkRlZmF1bHRQcm9wZXJ0aWVzIiwgImNvbXByZXNzaW9uIiwgImVuY3J5cHRpb24iLCAiTmV0d29yayIsICJFbWl0dGVyIiwgInNlcmVuaXR5IiwgInJha25ldCIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkJsdWUiLCAiY29ubmVjdGlvbnMiLCAiTWFwIiwgImhhbmRsZXJzIiwgIlNldCIsICJTZXJ2ZXIiLCAiYWRkcmVzcyIsICJwb3J0IiwgIm9uIiwgIm9uRW5jYXBzdWxhdGVkIiwgImJpbmQiLCAib25Db25uZWN0IiwgIm9uRGlzY29ubmVjdCIsICJoYW5kbGVyIiwgInJlZ2lzdGVySGFuZGxlciIsICJhZGQiLCAidW5yZWdpc3RlckhhbmRsZXIiLCAiZGVsZXRlIiwgImNvbm5lY3Rpb24iLCAiaGFzIiwgImRpc2Nvbm5lY3QiLCAib2JqZWN0IiwgInNldCIsICJkZWJ1ZyIsICJyaW5mbyIsICJwYWNrZXQiLCAiRGlzY29ubmVjdFBhY2tldCIsICJyZWFzb24iLCAiRGlzY29ubmVjdFJlYXNvbiIsICJEaXNjb25uZWN0ZWQiLCAiaGlkZURpc2Nvbm5lY3RTY3JlZW4iLCAicGF5bG9hZCIsICJCdWZmZXIiLCAiZnJvbSIsICJDb21wcmVzc2lvbk1ldGhvZCIsICJOb25lIiwgIkZyYW1lciIsICJmcmFtZSIsICJzZXJpYWxpemUiLCAicGxheWVycyIsICJkYXRhIiwgImdldCIsICJFcnJvciIsICJidWZmZXIiLCAiZGVjcnlwdGVkIiwgInN1YmFycmF5IiwgImFsZ29yaXRobSIsICJyZWFkVWludDgiLCAiTm90UHJlc2VudCIsICJpbmZsYXRlZCIsICJabGliIiwgImluZmxhdGVabGliIiwgIlNuYXBweSIsICJpbmZsYXRlU25hcHB5IiwgImZyYW1lcyIsICJ1bmZyYW1lIiwgImxlbmd0aCIsICJwYWNrZXRzUGVyRnJhbWUiLCAid2FybiIsICJwYWNrZXRJZCIsICJnZXRQYWNrZXRJZCIsICJwYWNrZXRUeXBlIiwgIlBhY2tldHMiLCAiZGVzZXJpYWxpemUiLCAiZXZlbnQiLCAiYm91bmQiLCAiTmV0d29ya0JvdW5kIiwgIm5ldHdvcmsiLCAiZW1pdCIsICJhbGwiLCAiQXJyYXkiLCAiZmlsdGVyIiwgIlBhY2tldCIsICJoYW5kbGUiLCAiZXJyb3IiLCAiaW5mbGF0ZVJhd1N5bmMiLCAiX2J1ZmZlciIsICJzZW5kIiwgInByaW9yaXR5IiwgIlByaW9yaXR5IiwgIk5vcm1hbCIsICJwYWNrZXRzIiwgIkNsaWVudCIsICJnZXRJZCIsICJwdXNoIiwgImZyYW1lZCIsICJkZWZsYXRlZCIsICJieXRlTGVuZ3RoIiwgImNvbXByZXNzaW9uVGhyZXNob2xkIiwgImNvbmNhdCIsICJjb21wcmVzc2lvbk1ldGhvZCIsICJkZWZsYXRlWmxpYiIsICJlbmNyeXB0ZWQiLCAiRnJhbWUiLCAicmVsaWFiaWxpdHkiLCAiUmVsaWFiaWxpdHkiLCAiUmVsaWFibGUiLCAib3JkZXJDaGFubmVsIiwgInNlbmRGcmFtZSIsICJzZW5kTm9ybWFsIiwgInNlbmRJbW1lZGlhdGUiLCAiSW1tZWRpYXRlIiwgImRlZmxhdGVSYXdTeW5jIiwgInNldENvbXByZXNzaW9uIiwgImVuYWJsZWQiLCAic2V0RW5jcnlwdGlvbiIsICJkaXNjb25uZWN0Q29ubmVjdGlvbiIsICJtZXNzYWdlIiwgIkRpc2Nvbm5lY3RNZXNzYWdlIiwgIlN0cmluZyIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAic2VyZW5pdHkiLCAibmV0d29yayIsICJoYW5kbGUiLCAiX3BhY2tldCIsICJfY29ubmVjdGlvbiIsICJFcnJvciIsICJQYWNrZXQiLCAiQW5pbWF0ZUhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJBbmltYXRlIiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJwbGF5ZXJzIiwgImdldCIsICJkaXNjb25uZWN0IiwgImRpbWVuc2lvbiIsICJicm9hZGNhc3RFeGNlcHQiLCAiUGFja2V0IiwgIkNvbnRhaW5lckNsb3NlSGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIkNvbnRhaW5lckNsb3NlIiwgImhhbmRsZSIsICJfIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgIm9wZW5lZENvbnRhaW5lciIsICJjbG9zZSIsICJQYWNrZXQiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJjb25zdHJ1Y3RvciIsICJ3b3JsZCIsICJlbWl0IiwgInNlcnZlciIsICJzZXJlbml0eSIsICJXb3JsZEluaXRpYWxpemVTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIldvcmxkSW5pdGlhbGl6ZSIsICJXb3JsZFRpY2tTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIldvcmxkVGljayIsICJjdXJyZW50VGljayIsICJkZWx0YVRpY2siLCAid29ybGQiLCAiQ2h1bmtSZWFkeVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiQ2h1bmtSZWFkeSIsICJjaHVuayIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiRW50aXR5U3Bhd25lZFNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRW50aXR5U3Bhd25lZCIsICJlbnRpdHkiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgIkVudGl0eURlc3Bhd25lZFNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRW50aXR5RGVzcGF3bmVkIiwgImVudGl0eSIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiRW50aXR5RmxhZ1VwZGF0ZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRW50aXR5RmxhZ1VwZGF0ZSIsICJlbnRpdHkiLCAiZmxhZyIsICJ2YWx1ZSIsICJnZXRXb3JsZCIsICJFbnRpdHlNZXRhZGF0YVVwZGF0ZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRW50aXR5TWV0YWRhdGFVcGRhdGUiLCAiZW50aXR5IiwgImtleSIsICJkYXRhSXRlbSIsICJnZXRXb3JsZCIsICJFbnRpdHlBdHRyaWJ1dGVVcGRhdGVTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIkVudGl0eUF0dHJpYnV0ZVVwZGF0ZSIsICJlbnRpdHkiLCAiYXR0cmlidXRlIiwgInZhbHVlIiwgImdldFdvcmxkIiwgIlBsYXllckpvaW5TaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIlBsYXllckpvaW4iLCAicGxheWVyIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJQbGF5ZXJMZWF2ZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyTGVhdmUiLCAicGxheWVyIiwgInJlYXNvbiIsICJtZXNzYWdlIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJQbGF5ZXJDaGF0U2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJDaGF0IiwgInBsYXllciIsICJtZXNzYWdlIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJCbG9ja1VwZGF0ZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiQmxvY2tVcGRhdGUiLCAiYmxvY2siLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgIlBsYXllclBsYWNlQmxvY2tTaWduYWwiLCAiQmxvY2tVcGRhdGVTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIlBsYXllclBsYWNlQmxvY2siLCAiZmFjZSIsICJmYWNlTG9jYXRpb24iLCAicGVybXV0YXRpb25CZWluZ1BsYWNlZCIsICJwbGF5ZXIiLCAiYmxvY2siLCAiUGxheWVyQnJlYWtCbG9ja1NpZ25hbCIsICJCbG9ja1VwZGF0ZVNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyQnJlYWtCbG9jayIsICJwbGF5ZXIiLCAiaXRlbVN0YWNrIiwgImJsb2NrIiwgIlBsYXllckRyb3BJdGVtU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJEcm9wSXRlbSIsICJwbGF5ZXIiLCAiaXRlbVN0YWNrIiwgImFtb3VudCIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiUGxheWVyQWJpbGl0eVVwZGF0ZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyQWJpbGl0eVVwZGF0ZSIsICJwbGF5ZXIiLCAiYWJpbGl0eSIsICJ2YWx1ZSIsICJnZXRXb3JsZCIsICJQbGF5ZXJTdGFydFVzaW5nSXRlbVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyU3RhcnRVc2luZ0l0ZW0iLCAicGxheWVyIiwgIml0ZW1TdGFjayIsICJ1c2VNZXRob2QiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgIlBsYXllclN0b3BVc2luZ0l0ZW1TaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIlBsYXllclN0b3BVc2luZ0l0ZW0iLCAicGxheWVyIiwgIml0ZW1TdGFjayIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiUGxheWVyVXNlSXRlbVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyVXNlSXRlbSIsICJwbGF5ZXIiLCAiaXRlbVN0YWNrIiwgInVzZU1ldGhvZCIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiUGxheWVyU3RhcnRFbW90aW5nU2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJTdGFydEVtb3RpbmciLCAicGxheWVyIiwgImVtb3RlIiwgInRpY2tMZW5ndGgiLCAiZ2V0V29ybGQiLCAiUGxheWVyU3RvcEVtb3RpbmdTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIlBsYXllclN0b3BFbW90aW5nIiwgInBsYXllciIsICJlbW90ZSIsICJnZXRXb3JsZCIsICJFZmZlY3RBZGRTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIkVmZmVjdEFkZCIsICJlbnRpdHkiLCAiZWZmZWN0IiwgImdldFdvcmxkIiwgIkVmZmVjdFJlbW92ZVNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiRWZmZWN0UmVtb3ZlIiwgImVudGl0eSIsICJlZmZlY3QiLCAiZ2V0V29ybGQiLCAiUGxheWVyR2FtZW1vZGVDaGFuZ2VTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIlBsYXllckdhbWVtb2RlQ2hhbmdlIiwgInBsYXllciIsICJmcm9tR2FtZW1vZGUiLCAidG9HYW1lbW9kZSIsICJnZXRXb3JsZCIsICJFbnRpdHlEaW1lbnNpb25DaGFuZ2VTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIkVudGl0eURpbWVuc2lvbkNoYW5nZSIsICJlbnRpdHkiLCAiZnJvbURpbWVuc2lvbiIsICJ0b0RpbWVuc2lvbiIsICJnZXRXb3JsZCIsICJQbGF5ZXJJbnRlcmFjdFdpdGhCbG9ja1NpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVySW50ZXJhY3RXaXRoQmxvY2siLCAic291cmNlIiwgImJsb2NrIiwgImJlZm9yZUl0ZW1TdGFjayIsICJpdGVtU3RhY2siLCAiZ2V0V29ybGQiLCAiUGxheWVySW50ZXJhY3RXaXRoRW50aXR5U2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJQbGF5ZXJJbnRlcmFjdFdpdGhFbnRpdHkiLCAic291cmNlIiwgInRhcmdldCIsICJpdGVtU3RhY2siLCAiYmVmb3JlSXRlbVN0YWNrIiwgImdldFdvcmxkIiwgIlBsYXllck9wZW5lZENvbnRhaW5lclNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiUGxheWVyT3BlbmVkQ29udGFpbmVyIiwgInBsYXllciIsICJjb250YWluZXIiLCAiZ2V0V29ybGQiLCAiRW50aXR5SGl0U2lnbmFsIiwgIkV2ZW50U2lnbmFsIiwgImlkZW50aWZpZXIiLCAiV29ybGRFdmVudCIsICJFbnRpdHlIaXQiLCAiaGl0RW50aXR5IiwgImRhbWFnaW5nRW50aXR5IiwgImdldFdvcmxkIiwgIkVudGl0eUh1cnRTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIkVudGl0eUh1cnQiLCAiaHVydEVudGl0eSIsICJkYW1hZ2luZ0VudGl0eSIsICJkYW1hZ2UiLCAiY2F1c2UiLCAiZ2V0V29ybGQiLCAiRW50aXR5SGVhbHRoQ2hhbmdlZFNpZ25hbCIsICJFdmVudFNpZ25hbCIsICJpZGVudGlmaWVyIiwgIldvcmxkRXZlbnQiLCAiSGVhbHRoQ2hhbmdlZCIsICJlbnRpdHkiLCAiZnJvbUhlYWx0aCIsICJ0b0hlYWx0aCIsICJnZXRXb3JsZCIsICJFbnRpdHlEaWVTaWduYWwiLCAiRXZlbnRTaWduYWwiLCAiaWRlbnRpZmllciIsICJXb3JsZEV2ZW50IiwgIkVudGl0eURpZSIsICJlbnRpdHkiLCAiZGFtYWdpbmdFbnRpdHkiLCAiZGFtYWdlQ2F1c2UiLCAiZ2V0V29ybGQiLCAiRGlzY29ubmVjdEhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJEaXNjb25uZWN0IiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJnZXRQbGF5ZXJCeUNvbm5lY3Rpb24iLCAiZGlzY29ubmVjdCIsICJQbGF5ZXJMZWF2ZVNpZ25hbCIsICJyZWFzb24iLCAibWVzc2FnZSIsICJTdHJpbmciLCAiZW1pdCIsICJkZXNwYXduIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJwcm92aWRlciIsICJ3cml0ZVBsYXllciIsICJnZXREYXRhRW50cnkiLCAibG9nZ2VyIiwgImluZm8iLCAidXNlcm5hbWUiLCAiQmxvY2tQb3NpdGlvbiIsICJDb21wbGV4SW52ZW50b3J5VHJhbnNhY3Rpb24iLCAiR2FtZW1vZGUiLCAiSW52ZW50b3J5U291cmNlVHlwZSIsICJJdGVtVXNlSW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlIiwgIkxldmVsU291bmRFdmVudCIsICJMZXZlbFNvdW5kRXZlbnRQYWNrZXQiLCAiUGFja2V0IiwgIkVOVElUWV9UWVBFUyIsICJDb21wb3VuZFRhZyIsICJFbnRpdHlUeXBlIiwgInR5cGVzIiwgIk1hcCIsICJuZXR3b3JrIiwgImlkZW50aWZpZXIiLCAiY29tcG9uZW50cyIsICJyZWdpc3RlciIsICJjb21wb25lbnQiLCAiaW5jbHVkZXMiLCAiRXJyb3IiLCAicHVzaCIsICJ1bnJlZ2lzdGVyIiwgInNwbGljZSIsICJpbmRleE9mIiwgImdldCIsICJnZXRBbGwiLCAidmFsdWVzIiwgInRvTmJ0IiwgInR5cGUiLCAicm9vdCIsICJDb21wb3VuZFRhZyIsICJjcmVhdGVTdHJpbmdUYWciLCAiY3JlYXRlQnl0ZVRhZyIsICJjcmVhdGVJbnRUYWciLCAidHlwZSIsICJFTlRJVFlfVFlQRVMiLCAiZW50aXR5VHlwZSIsICJFbnRpdHlUeXBlIiwgImlkZW50aWZpZXIiLCAiY29tcG9uZW50cyIsICJ0eXBlcyIsICJzZXQiLCAiQ3VzdG9tRW50aXR5VHlwZSIsICJFbnRpdHlUeXBlIiwgImlkZW50aWZpZXIiLCAiQWN0b3JGbGFnIiwgIkNvbnRhaW5lck5hbWUiLCAiTW92ZUFjdG9yRGVsdGFQYWNrZXQiLCAiTW92ZURlbHRhRmxhZ3MiLCAiUm90YXRpb24iLCAiU2V0QWN0b3JNb3Rpb25QYWNrZXQiLCAiVmVjdG9yM2YiLCAiQmluYXJ5U3RyZWFtIiwgIkNSRUFUSVZFX0NPTlRFTlQiLCAiSVRFTV9UWVBFUyIsICJJVEVNREFUQSIsICJUT09MX1RZUEVTIiwgIkNyZWF0aXZlSXRlbXMiLCAiSXRlbURhdGEiLCAiQkxPQ0tfVFlQRVMiLCAiQkxPQ0tfUEVSTVVUQVRJT05TIiwgIkJMT0NLX0RST1BTIiwgIkJMT0NLX01FVEFEQVRBIiwgIkRlZmF1bHRCbG9ja1R5cGVQcm9wZXJ0aWVzIiwgImxvZ2dhYmxlIiwgImFpciIsICJsaXF1aWQiLCAic29saWQiLCAiaGFyZG5lc3MiLCAiZnJpY3Rpb24iLCAiY29sb3IiLCAiY29tcG9uZW50cyIsICJ0YWdzIiwgImRyb3BzIiwgInBlcm11dGF0aW9ucyIsICJCbG9ja1R5cGUiLCAidHlwZXMiLCAiTWFwIiwgImlkZW50aWZpZXIiLCAiY3VzdG9tIiwgInByb3BlcnRpZXMiLCAicHJvcHMiLCAiZ2V0UGVybXV0YXRpb24iLCAic3RhdGUiLCAicGVybXV0YXRpb24iLCAibWF0Y2hlcyIsICJnZXQiLCAidHlwZSIsICJCbG9ja0lkZW50aWZpZXIiLCAiQWlyIiwgImdldEFsbCIsICJ2YWx1ZXMiLCAiQnl0ZVRhZyIsICJDb21wb3VuZFRhZyIsICJJbnRUYWciLCAiU3RyaW5nVGFnIiwgIkJpbmFyeVN0cmVhbSIsICJCeXRlVGFnIiwgIkNvbXBvdW5kVGFnIiwgIkludFRhZyIsICJTdHJpbmdUYWciLCAiSEFTSF9PRkZTRVQiLCAiaGFzaCIsICJpZGVudGlmaWVyIiwgInN0YXRlIiwgImtleXMiLCAiT2JqZWN0IiwgInZhbHVlcyIsICJyb290IiwgIkNvbXBvdW5kVGFnIiwgImFkZFRhZyIsICJTdHJpbmdUYWciLCAic3RhdGVzIiwgImluZGV4IiwgImtleSIsICJlbnRyaWVzIiwgInZhbHVlIiwgIkludFRhZyIsICJCeXRlVGFnIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAid3JpdGUiLCAiZWxlbWVudCIsICJnZXRCdWZmZXIiLCAiQmxvY2tQZXJtdXRhdGlvbiIsICJwZXJtdXRhdGlvbnMiLCAiTWFwIiwgIm5ldHdvcmsiLCAiaW5kZXgiLCAic3RhdGUiLCAidHlwZSIsICJsZW5ndGgiLCAibWF0Y2hlcyIsICJrZXkiLCAicmVzb2x2ZSIsICJpZGVudGlmaWVyIiwgIkJsb2NrVHlwZSIsICJ0eXBlcyIsICJnZXQiLCAiQmxvY2tJZGVudGlmaWVyIiwgIkFpciIsICJwZXJtdXRhdGlvbiIsICJmaW5kIiwgInZhbHVlIiwgInF1ZXJ5IiwgImNyZWF0ZSIsICJoYXNoIiwgInNldCIsICJwdXNoIiwgInRvTmJ0IiwgIm5idCIsICJDb21wb3VuZFRhZyIsICJuYW1lIiwgIlN0cmluZ1RhZyIsICJzdGF0ZXMiLCAia2V5cyIsICJPYmplY3QiLCAidmFsdWVzIiwgImVudHJpZXMiLCAiYWRkVGFnIiwgIkludFRhZyIsICJCeXRlVGFnIiwgImZyb21OYnQiLCAiZ2V0VGFnIiwgInZhbHVlT2YiLCAiSXRlbURyb3AiLCAidHlwZSIsICJtaW4iLCAibWF4IiwgInByb2JhYmlsaXR5IiwgInJvbGwiLCAiTWF0aCIsICJyYW5kb20iLCAiZmxvb3IiLCAidHlwZSIsICJCTE9DS19UWVBFUyIsICJCbG9ja1R5cGUiLCAidHlwZXMiLCAiaGFzIiwgImlkZW50aWZpZXIiLCAiRXJyb3IiLCAiZHJvcCIsICJCTE9DS19EUk9QUyIsICJmaW5kIiwgIm1ldGFkYXRhIiwgIkJMT0NLX01FVEFEQVRBIiwgIm1ldGEiLCAiaGFyZG5lc3MiLCAiZnJpY3Rpb24iLCAibWFwQ29sb3IiLCAiaW5zdGFuY2UiLCAibG9nZ2FibGUiLCAiYWlyIiwgImxpcXVpZCIsICJzb2xpZCIsICJjb2xvciIsICJjb21wb25lbnRzIiwgInRhZ3MiLCAiZW50cnkiLCAiZHJvcHMiLCAibWluIiwgIm1heCIsICJjaGFuY2UiLCAiaXRlbURyb3AiLCAiSXRlbURyb3AiLCAicHVzaCIsICJzZXQiLCAicGVybXV0YXRpb24iLCAiQkxPQ0tfUEVSTVVUQVRJT05TIiwgImdldCIsICJCbG9ja1Blcm11dGF0aW9uIiwgImhhc2giLCAic3RhdGUiLCAicGVybXV0YXRpb25zIiwgIkNvbXBvdW5kVGFnIiwgIkJsb2NrUHJvcGVydHkiLCAiQ3VzdG9tQmxvY2tUeXBlIiwgIkJsb2NrVHlwZSIsICJuZXR3b3JrSWQiLCAiY3VzdG9tIiwgImlkZW50aWZpZXIiLCAicHJvcGVydGllcyIsICJ0b05idCIsICJ0eXBlIiwgInJvb3QiLCAiQ29tcG91bmRUYWciLCAidmFuaWxsYUJsb2NrRGF0YSIsICJjcmVhdGVDb21wb3VuZFRhZyIsICJjcmVhdGVJbnRUYWciLCAiY3JlYXRlU3RyaW5nVGFnIiwgIkl0ZW1DYXRlZ29yeSIsICJOYXR1cmUiLCAidG9CbG9ja1Byb3BlcnR5IiwgIkJsb2NrUHJvcGVydHkiLCAidHJhaXRzX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiQmxvY2tDYXJkaW5hbERpcmVjdGlvblRyYWl0IiwgIkJsb2NrRGlyZWN0aW9uVHJhaXQiLCAiQmxvY2tJbnZlbnRvcnlUcmFpdCIsICJCbG9ja09wZW5CaXRUcmFpdCIsICJCbG9ja1RyYWl0IiwgIkJsb2NrVXBwZXJCaXRUcmFpdCIsICJCbG9ja1Vwc2lkZURvd25CaXRUcmFpdCIsICJCbG9ja1dlaXJkb0RpcmVjdGlvblRyYWl0IiwgIlZlcnRpY2FsSGFsZlRyYWl0IiwgIlRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiY29uc3RydWN0b3IiLCAiY2xvbmUiLCAiX2FyZ3VtZW50cyIsICJFcnJvciIsICJCbG9ja1RyYWl0IiwgIlRyYWl0IiwgInR5cGVzIiwgImJsb2NrIiwgImFkZFRyYWl0IiwgIkFiaWxpdHlJbmRleCIsICJCbG9ja0V2ZW50UGFja2V0IiwgIkJsb2NrRXZlbnRUeXBlIiwgIkJsb2NrUG9zaXRpb24iLCAiQ29udGFpbmVySWQiLCAiQ29udGFpbmVyVHlwZSIsICJMZXZlbFNvdW5kRXZlbnQiLCAiTGV2ZWxTb3VuZEV2ZW50UGFja2V0IiwgIlZlY3RvcjNmIiwgIkJsb2NrSW52ZW50b3J5VHJhaXQiLCAiQmxvY2tUcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgIkJsb2NrSWRlbnRpZmllciIsICJDaGVzdCIsICJvcGVuZWQiLCAiY29udGFpbmVyIiwgImNvbnRhaW5lclR5cGUiLCAiY29udGFpbmVySWQiLCAiaW52ZW50b3J5U2l6ZSIsICJibG9jayIsICJnZXRUeXBlIiwgIkNvbnRhaW5lclR5cGUiLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lcklkIiwgIk5vbmUiLCAiQmxvY2tDb250YWluZXIiLCAiY29tcG9uZW50cyIsICJoYXMiLCAiaW52ZW50b3J5IiwgImdldCIsICJzbG90IiwgImVudHJ5IiwgIml0ZW1zIiwgInN0YWNrIiwgIkl0ZW1TdGFjayIsICJhbW91bnQiLCAiYXV4aWxsYXJ5IiwgIndvcmxkIiwgImRpbWVuc2lvbiIsICJzZXRJdGVtIiwgIm9uSW50ZXJhY3QiLCAicGxheWVyIiwgImlzU25lYWtpbmciLCAiYWJpbGl0aWVzIiwgIkFiaWxpdHlJbmRleCIsICJPcGVuQ29udGFpbmVycyIsICJzaG93IiwgIm9uQnJlYWsiLCAiaXRlbSIsICJzdG9yYWdlIiwgIngiLCAieSIsICJ6IiwgInBvc2l0aW9uIiwgInNwYXduSXRlbSIsICJWZWN0b3IzZiIsICJzZXRNb3Rpb24iLCAib25Db250YWluZXJVcGRhdGUiLCAic2l6ZSIsICJpIiwgImdldEl0ZW0iLCAiZ2V0RGF0YUVudHJ5IiwgInB1c2giLCAic2V0IiwgIm9uVGljayIsICJvY2N1cGFudHMiLCAiZXZlbnQiLCAiQmxvY2tFdmVudFBhY2tldCIsICJ0eXBlIiwgIkJsb2NrRXZlbnRUeXBlIiwgIkNoYW5nZVN0YXRlIiwgImRhdGEiLCAic291bmQiLCAiTGV2ZWxTb3VuZEV2ZW50UGFja2V0IiwgIkJsb2NrUG9zaXRpb24iLCAidG9WZWN0b3IzZiIsICJwZXJtdXRhdGlvbiIsICJuZXR3b3JrIiwgImFjdG9ySWRlbnRpZmllciIsICJTdHJpbmciLCAiaXNCYWJ5TW9iIiwgImlzR2xvYmFsIiwgIlRyYXBwZWRDaGVzdCIsICJMZXZlbFNvdW5kRXZlbnQiLCAiQ2hlc3RPcGVuIiwgImJyb2FkY2FzdCIsICJwYWNrZXQiLCAiQ2hlc3RDbG9zZWQiLCAiQmxvY2tXZWlyZG9EaXJlY3Rpb25UcmFpdCIsICJCbG9ja1RyYWl0IiwgImlkZW50aWZpZXIiLCAib25QbGFjZSIsICJwbGF5ZXIiLCAiZGlyZWN0aW9uIiwgImdldENhcmRpbmFsRGlyZWN0aW9uIiwgInNldERpcmVjdGlvbiIsICJ0eXBlIiwgImJsb2NrIiwgImdldFR5cGUiLCAibmV3U3RhdGUiLCAicGVybXV0YXRpb24iLCAic3RhdGUiLCAid2VpcmRvX2RpcmVjdGlvbiIsICJnZXRQZXJtdXRhdGlvbiIsICJzZXRQZXJtdXRhdGlvbiIsICJCbG9ja1Vwc2lkZURvd25CaXRUcmFpdCIsICJCbG9ja1RyYWl0IiwgImlkZW50aWZpZXIiLCAib25QbGFjZSIsICJfIiwgImNsaWNrUG9zaXRpb24iLCAieSIsICJzZXRVcHNpZGVEb3duIiwgInVwc2lkZURvd24iLCAidHlwZSIsICJibG9jayIsICJnZXRUeXBlIiwgIm5ld1N0YXRlIiwgInBlcm11dGF0aW9uIiwgInN0YXRlIiwgInVwc2lkZV9kb3duX2JpdCIsICJnZXRQZXJtdXRhdGlvbiIsICJzZXRQZXJtdXRhdGlvbiIsICJBYmlsaXR5SW5kZXgiLCAiQmxvY2tQb3NpdGlvbiIsICJMZXZlbFNvdW5kRXZlbnQiLCAiTGV2ZWxTb3VuZEV2ZW50UGFja2V0IiwgIkJsb2NrT3BlbkJpdFRyYWl0IiwgIkJsb2NrVHJhaXQiLCAiaWRlbnRpZmllciIsICJvbkludGVyYWN0IiwgInBsYXllciIsICJhYmlsaXRpZXMiLCAiZ2V0IiwgIkFiaWxpdHlJbmRleCIsICJEb29yc0FuZFN3aXRjaGVzIiwgIm9wZW5CaXQiLCAiYmxvY2siLCAicGVybXV0YXRpb24iLCAic3RhdGUiLCAib3Blbl9iaXQiLCAic2V0Qml0IiwgImlzU25lYWtpbmciLCAib3BlbiIsICJzaWxlbnQiLCAidHlwZSIsICJnZXRUeXBlIiwgInVwcGVyQmxvY2tCaXQiLCAiYWJvdmUiLCAiYmVsb3ciLCAiYWJvdmVOZXdTdGF0ZSIsICJhYm92ZVBlcm11dGF0aW9uIiwgImdldFBlcm11dGF0aW9uIiwgInNldFBlcm11dGF0aW9uIiwgImJlbG93TmV3U3RhdGUiLCAiYmVsb3dQZXJtdXRhdGlvbiIsICJuZXdTdGF0ZSIsICJwYWNrZXQiLCAiTGV2ZWxTb3VuZEV2ZW50UGFja2V0IiwgImRhdGEiLCAibmV0d29yayIsICJldmVudCIsICJMZXZlbFNvdW5kRXZlbnQiLCAiRG9vck9wZW4iLCAiRG9vckNsb3NlIiwgInBvc2l0aW9uIiwgIkJsb2NrUG9zaXRpb24iLCAidG9WZWN0b3IzZiIsICJhY3RvcklkZW50aWZpZXIiLCAiU3RyaW5nIiwgImlzQmFieU1vYiIsICJpc0dsb2JhbCIsICJpbmNsdWRlcyIsICJUcmFwZG9vck9wZW4iLCAiVHJhcGRvb3JDbG9zZSIsICJGZW5jZUdhdGVPcGVuIiwgIkZlbmNlR2F0ZUNsb3NlIiwgImRpbWVuc2lvbiIsICJicm9hZGNhc3QiLCAiQmxvY2tVcHBlckJpdFRyYWl0IiwgIkJsb2NrVHJhaXQiLCAiaWRlbnRpZmllciIsICJvblBsYWNlIiwgImFib3ZlIiwgImJsb2NrIiwgIm5ld1N0YXRlIiwgInBlcm11dGF0aW9uIiwgInN0YXRlIiwgInVwcGVyX2Jsb2NrX2JpdCIsICJnZXRUeXBlIiwgImdldFBlcm11dGF0aW9uIiwgInNldFBlcm11dGF0aW9uIiwgIlZlcnRpY2FsSGFsZlRyYWl0IiwgIkJsb2NrVHJhaXQiLCAiaWRlbnRpZmllciIsICJvblBsYWNlIiwgIl9wbGF5ZXIiLCAiY2xpY2tQb3NpdGlvbiIsICJ5IiwgInNldFZlcnRpY2FsSGFsZiIsICJvbkludGVyYWN0IiwgInBsYXllciIsICJpdGVtU3RhY2siLCAiZ2V0SGVsZEl0ZW0iLCAidHlwZSIsICJibG9jayIsICJnZXRUeXBlIiwgInRvcEJpdCIsICJuZXdTdGF0ZSIsICJwZXJtdXRhdGlvbiIsICJzdGF0ZSIsICJnZXRQZXJtdXRhdGlvbiIsICJzZXRQZXJtdXRhdGlvbiIsICJCbG9ja0NhcmRpbmFsRGlyZWN0aW9uVHJhaXQiLCAiQmxvY2tUcmFpdCIsICJpZGVudGlmaWVyIiwgIm9uUGxhY2UiLCAicGxheWVyIiwgImdldENhcmRpbmFsRGlyZWN0aW9uIiwgImRpcmVjdGlvbiIsICJDYXJkaW5hbERpcmVjdGlvbiIsICJOb3J0aCIsICJzZXREaXJlY3Rpb24iLCAiU291dGgiLCAiRWFzdCIsICJXZXN0IiwgInR5cGUiLCAiYmxvY2siLCAiZ2V0VHlwZSIsICJuZXdTdGF0ZSIsICJwZXJtdXRhdGlvbiIsICJzdGF0ZSIsICJ0b0xvd2VyQ2FzZSIsICJnZXRQZXJtdXRhdGlvbiIsICJzZXRQZXJtdXRhdGlvbiIsICJCbG9ja0RpcmVjdGlvblRyYWl0IiwgIkJsb2NrVHJhaXQiLCAiaWRlbnRpZmllciIsICJvblBsYWNlIiwgInBsYXllciIsICJnZXRDYXJkaW5hbERpcmVjdGlvbiIsICJkaXJlY3Rpb24iLCAiQ2FyZGluYWxEaXJlY3Rpb24iLCAiTm9ydGgiLCAic2V0RGlyZWN0aW9uIiwgIlNvdXRoIiwgIkVhc3QiLCAiV2VzdCIsICJ0eXBlIiwgImJsb2NrIiwgImdldFR5cGUiLCAibmV3U3RhdGUiLCAicGVybXV0YXRpb24iLCAic3RhdGUiLCAiZ2V0UGVybXV0YXRpb24iLCAic2V0UGVybXV0YXRpb24iLCAiQmxvY2tQYWxldHRlIiwgInR5cGVzIiwgIkJsb2NrVHlwZSIsICJwZXJtdXRhdGlvbnMiLCAiQmxvY2tQZXJtdXRhdGlvbiIsICJ0cmFpdHMiLCAiTWFwIiwgInJlZ2lzdHJ5IiwgInRyYWl0IiwgIkJsb2NrVHJhaXRzIiwgInJlZ2lzdGVyVHJhaXQiLCAiZ2V0QWxsVHlwZXMiLCAidmFsdWVzIiwgImdldEFsbEN1c3RvbVR5cGVzIiwgImZpbHRlciIsICJ0eXBlIiwgIkN1c3RvbUJsb2NrVHlwZSIsICJnZXRBbGxQZXJtdXRhdGlvbnMiLCAicmVzb2x2ZVR5cGUiLCAiaWRlbnRpZmllciIsICJnZXQiLCAicmVzb2x2ZVBlcm11dGF0aW9uIiwgInN0YXRlIiwgIkJsb2NrSWRlbnRpZmllciIsICJBaXIiLCAicGVybXV0YXRpb24iLCAiZmluZCIsICJrZXkiLCAidmFsdWUiLCAicXVlcnkiLCAicmVnaXN0ZXJUeXBlIiwgImhhcyIsICJzZXQiLCAiQmxvY2tFbnVtIiwgIm9wdGlvbnMiLCAicHVzaCIsICJyZWdpc3RlclBlcm11dGF0aW9uIiwgIm5ldHdvcmsiLCAiZ2V0UmVnaXN0cnkiLCAicmVtb3ZlVHJhaXQiLCAiZGVsZXRlIiwgImdldEFsbFRyYWl0cyIsICJnZXRUcmFpdCIsICJCbG9ja0ZhY2UiLCAiQmxvY2tQb3NpdGlvbiIsICJHYW1lbW9kZSIsICJMZXZlbEV2ZW50IiwgIkxldmVsRXZlbnRQYWNrZXQiLCAiVXBkYXRlQmxvY2tGbGFnc1R5cGUiLCAiVXBkYXRlQmxvY2tMYXllclR5cGUiLCAiVXBkYXRlQmxvY2tQYWNrZXQiLCAiVmVjdG9yM2YiLCAiQ29tcG91bmRUYWciLCAiQmxvY2tBY3RvckRhdGFQYWNrZXQiLCAiTmJ0TWFwIiwgIk1hcCIsICJibG9jayIsICJhZGQiLCAidmFsdWUiLCAic2V0IiwgIm5hbWUiLCAidXBkYXRlIiwgImtleSIsICJkZWxldGUiLCAicmVzdWx0IiwgImNsZWFyIiwgInBhY2tldCIsICJCbG9ja0FjdG9yRGF0YVBhY2tldCIsICJwb3NpdGlvbiIsICJuYnQiLCAiQ29tcG91bmRUYWciLCAic2V0VGFnIiwgImRpbWVuc2lvbiIsICJicm9hZGNhc3QiLCAiQmxvY2siLCAic2VyZW5pdHkiLCAiZGltZW5zaW9uIiwgInBvc2l0aW9uIiwgImNvbXBvbmVudHMiLCAiTWFwIiwgInRyYWl0cyIsICJuYnQiLCAiTmJ0TWFwIiwgInBlcm11dGF0aW9uIiwgInByb3BlcnRpZXMiLCAid29ybGQiLCAiZW50cnkiLCAibG9hZERhdGFFbnRyeSIsICJpc0FpciIsICJ0eXBlIiwgImFpciIsICJpc0xpcXVpZCIsICJsaXF1aWQiLCAiaXNTb2xpZCIsICJzb2xpZCIsICJnZXRDaHVuayIsICJjeCIsICJ4IiwgImN6IiwgInoiLCAiZ2V0UGVybXV0YXRpb24iLCAic2V0UGVybXV0YXRpb24iLCAiY2xlYXIiLCAiYmxvY2tzIiwgImRlbGV0ZSIsICJCbG9ja1Bvc2l0aW9uIiwgImhhc2giLCAiZ2V0V29ybGQiLCAiYmxvY2tQYWxldHRlIiwgImdldFJlZ2lzdHJ5IiwgImlkZW50aWZpZXIiLCAidHJhaXQiLCAiZ2V0VHJhaXQiLCAicHVzaCIsICJrZXkiLCAiT2JqZWN0IiwgImtleXMiLCAic3RhdGUiLCAiZ2V0QWxsVHJhaXRzIiwgImFkZFRyYWl0IiwgInBhY2tldCIsICJVcGRhdGVCbG9ja1BhY2tldCIsICJuZXR3b3JrQmxvY2tJZCIsICJuZXR3b3JrIiwgImZsYWdzIiwgIlVwZGF0ZUJsb2NrRmxhZ3NUeXBlIiwgIk5ldHdvcmsiLCAibGF5ZXIiLCAiVXBkYXRlQmxvY2tMYXllclR5cGUiLCAiTm9ybWFsIiwgImJyb2FkY2FzdCIsICJzaXplIiwgInNldCIsICJzZXRUeXBlIiwgImdldFR5cGUiLCAiaGFzQ29tcG9uZW50IiwgImhhcyIsICJnZXRDb21wb25lbnQiLCAiZ2V0IiwgInJlbW92ZUNvbXBvbmVudCIsICJhZGRDb21wb25lbnQiLCAiY29tcG9uZW50IiwgInNldENvbXBvbmVudCIsICJoYXNUcmFpdCIsICJyZW1vdmVUcmFpdCIsICJvblJlbW92ZSIsICJsb2dnZXIiLCAid2FybiIsICJKU09OIiwgInN0cmluZ2lmeSIsICJCbG9ja1RyYWl0IiwgIm9uQWRkIiwgImluc3RhbmNlIiwgInJlYXNvbiIsICJlcnJvciIsICJnZXRUb29sVHlwZSIsICJCbG9ja1Rvb2xUeXBlIiwgIk5vbmUiLCAiaXNUb29sQ29tcGF0aWJsZSIsICJfaXRlbVN0YWNrIiwgImhhcmRuZXNzIiwgImdldEJyZWFrVGltZSIsICJpdGVtU3RhY2siLCAiTWF0aCIsICJjZWlsIiwgImdldEl0ZW1TdGFjayIsICJpdGVtUGFsZXR0ZSIsICJyZXNvbHZlVHlwZSIsICJJdGVtU3RhY2siLCAiYWJvdmUiLCAic3RlcHMiLCAiZ2V0QmxvY2siLCAieSIsICJiZWxvdyIsICJub3J0aCIsICJzb3V0aCIsICJlYXN0IiwgIndlc3QiLCAiZmFjZSIsICJCbG9ja0ZhY2UiLCAiVG9wIiwgIkJvdHRvbSIsICJOb3J0aCIsICJTb3V0aCIsICJFYXN0IiwgIldlc3QiLCAiaW50ZXJhY3QiLCAicGxheWVyIiwgIlBsYXllckludGVyYWN0V2l0aEJsb2NrU2lnbmFsIiwgImdldEhlbGRJdGVtIiwgImVtaXQiLCAidmFsdWVzIiwgIm9uSW50ZXJhY3QiLCAiZGVzdHJveSIsICJjYW5jZWxlZCIsICJzdWNjZXNzIiwgIm9uQnJlYWsiLCAidW5kZWZpbmVkIiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlIiwgIlN1cnZpdmFsIiwgImRyb3AiLCAiZHJvcHMiLCAiQmxvY2tJZGVudGlmaWVyIiwgIkFpciIsICJhbW91bnQiLCAicm9sbCIsICJpdGVtRW50aXR5IiwgInNwYXduSXRlbSIsICJWZWN0b3IzZiIsICJ2ZWxvY2l0eSIsICJyYW5kb20iLCAiYWRkTW90aW9uIiwgIkxldmVsRXZlbnRQYWNrZXQiLCAiZXZlbnQiLCAiTGV2ZWxFdmVudCIsICJQYXJ0aWNsZXNEZXN0cm95QmxvY2siLCAidG9WZWN0b3IzZiIsICJkYXRhIiwgIkJsb2NrUGVybXV0YXRpb24iLCAicmVzb2x2ZSIsICJnZXREYXRhRW50cnkiLCAiZW50cmllcyIsICJvdmVyd3JpdGUiLCAidmFsdWUiLCAidHJhaXRUeXBlIiwgIkNvbnRhaW5lck9wZW5QYWNrZXQiLCAiQ29udGFpbmVyVHlwZSIsICJDb250YWluZXJDbG9zZVBhY2tldCIsICJDb250YWluZXJUeXBlIiwgIkZ1bGxDb250YWluZXJOYW1lIiwgIkludmVudG9yeUNvbnRlbnRQYWNrZXQiLCAiSW52ZW50b3J5U2xvdFBhY2tldCIsICJOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciIsICJDb250YWluZXIiLCAidHlwZSIsICJpZGVudGlmaWVyIiwgInNpemUiLCAic3RvcmFnZSIsICJvY2N1cGFudHMiLCAiU2V0IiwgImVtcHR5U2xvdHNDb3VudCIsICJBcnJheSIsICJmcm9tIiwgImxlbmd0aCIsICJjYWxjdWxhdGVFbXB0eVNsb3RDb3VudCIsICJmaWx0ZXIiLCAiaXRlbSIsICJnZXRJdGVtIiwgInNsb3QiLCAic2V0SXRlbSIsICJhbW91bnQiLCAiY2xlYXJTbG90IiwgImNvbnRhaW5lciIsICJ1cGRhdGUiLCAiYWRkSXRlbSIsICJmaW5kSW5kZXgiLCAibWF4QW1vdW50IiwgImVxdWFscyIsICJtYXhlZCIsICJzdGFja2FibGUiLCAiZXhpc3RpbmdJdGVtIiwgIk1hdGgiLCAibWluIiwgImluY3JlbWVudCIsICJkZWNyZW1lbnQiLCAiZW1wdHlTbG90IiwgImluZGV4T2YiLCAibmV3SXRlbSIsICJJdGVtU3RhY2siLCAicmVtb3ZlSXRlbSIsICJyZW1vdmVkIiwgInRha2VJdGVtIiwgImtleSIsICJ2YWx1ZSIsICJjb21wb25lbnRzIiwgInNldCIsICJ0cmFpdCIsICJ0cmFpdHMiLCAidmFsdWVzIiwgImNsb25lIiwgInRhZyIsICJuYnQiLCAiYWRkIiwgInN3YXBJdGVtcyIsICJvdGhlclNsb3QiLCAib3RoZXJDb250YWluZXIiLCAidGFyZ2V0Q29udGFpbmVyIiwgIm90aGVySXRlbSIsICJwYWNrZXQiLCAiSW52ZW50b3J5U2xvdFBhY2tldCIsICJjb250YWluZXJJZCIsICJOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciIsICJmdWxsQ29udGFpbmVyTmFtZSIsICJGdWxsQ29udGFpbmVyTmFtZSIsICJzdG9yYWdlSXRlbSIsICJwbGF5ZXIiLCAic2VuZCIsICJjbGVhciIsICJpIiwgIkludmVudG9yeUNvbnRlbnRQYWNrZXQiLCAiaXRlbXMiLCAibWFwIiwgInRvTmV0d29ya1N0YWNrIiwgInNob3ciLCAib3BlbmVkQ29udGFpbmVyIiwgImNsb3NlIiwgIm9uQ29udGFpbmVyT3BlbiIsICJoYXMiLCAiRXJyb3IiLCAiQ29udGFpbmVyQ2xvc2VQYWNrZXQiLCAiQ29udGFpbmVyVHlwZSIsICJOb25lIiwgInNlcnZlckluaXRpYXRlZCIsICJkZWxldGUiLCAib25Db250YWluZXJDbG9zZSIsICJCbG9ja0NvbnRhaW5lciIsICJDb250YWluZXIiLCAiYmxvY2siLCAidHlwZSIsICJpZGVudGlmaWVyIiwgInNpemUiLCAic2V0SXRlbSIsICJzbG90IiwgIml0ZW1TdGFjayIsICJ3b3JsZCIsICJnZXRXb3JsZCIsICJpbml0aWFsaXplIiwgInVwZGF0ZSIsICJwbGF5ZXIiLCAidHJhaXQiLCAidHJhaXRzIiwgInZhbHVlcyIsICJvbkNvbnRhaW5lclVwZGF0ZSIsICJyZWFzb24iLCAieCIsICJ5IiwgInoiLCAicG9zaXRpb24iLCAibG9nZ2VyIiwgImVycm9yIiwgImdldFR5cGUiLCAiZGltZW5zaW9uIiwgImRlbGV0ZSIsICJzaG93IiwgIlBsYXllck9wZW5lZENvbnRhaW5lclNpZ25hbCIsICJlbWl0IiwgInBhY2tldCIsICJDb250YWluZXJPcGVuUGFja2V0IiwgInVuaXF1ZUlkIiwgIkNvbnRhaW5lclR5cGUiLCAic2VuZCIsICJCbG9ja1RyYWl0cyIsICJBcnJheSIsICJrZXkiLCAiVHJhaXRzIiwgInRyYWl0IiwgInB1c2giLCAiRGVmYXVsdEl0ZW1UeXBlUHJvcGVydGllcyIsICJzdGFja2FibGUiLCAibWF4QW1vdW50IiwgInRvb2wiLCAiSXRlbVRvb2xUeXBlIiwgIk5vbmUiLCAidGllciIsICJJdGVtVG9vbFRpZXIiLCAidGFncyIsICJibG9jayIsICJJdGVtVHlwZSIsICJ0eXBlcyIsICJNYXAiLCAiaWRlbnRpZmllciIsICJuZXR3b3JrIiwgInByb3BlcnRpZXMiLCAicHJvcHMiLCAiaXNUb29sIiwgImdldCIsICJnZXRCeU5ldHdvcmsiLCAidmFsdWVzIiwgImZpbmQiLCAiaXRlbSIsICJnZXRBbGwiLCAicmVzb2x2ZSIsICJ0eXBlIiwgInRvSXRlbURhdGEiLCAibmFtZSIsICJuZXR3b3JrSWQiLCAiY29tcG9uZW50QmFzZWQiLCAidG9OZXR3b3JrSW5zdGFuY2UiLCAic3RhY2tTaXplIiwgIm1ldGFkYXRhIiwgIm5ldHdvcmtCbG9ja0lkIiwgImdldFBlcm11dGF0aW9uIiwgImV4dHJhcyIsICJjYW5EZXN0cm95IiwgImNhblBsYWNlT24iLCAibmJ0IiwgIkNvbXBvdW5kVGFnIiwgIkNyZWF0aXZlSXRlbSIsICJpdGVtcyIsICJNYXAiLCAidHlwZSIsICJtZXRhZGF0YSIsICJuYnQiLCAiQ29tcG91bmRUYWciLCAicmVnaXN0ZXIiLCAiaW5kZXgiLCAic2l6ZSIsICJzZXQiLCAiZGF0YVN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAiSVRFTURBVEEiLCAiZGF0YSIsICJJdGVtRGF0YSIsICJyZWFkIiwgIml0ZW0iLCAibWV0YSIsICJJVEVNX1RZUEVTIiwgImZpbmQiLCAidHlwZSIsICJpZGVudGlmaWVyIiwgIm5hbWUiLCAidG9vbCIsICJUT09MX1RZUEVTIiwgInR5cGVzIiwgImluY2x1ZGVzIiwgImluZGV4IiwgImluZGV4T2YiLCAibGV2ZWwiLCAidW5kZWZpbmVkIiwgIkl0ZW1Ub29sVGllciIsICJOb25lIiwgImJsb2NrVHlwZSIsICJCbG9ja1R5cGUiLCAiZ2V0IiwgIkl0ZW1UeXBlIiwgIm5ldHdvcmtJZCIsICJzdGFja2FibGUiLCAibWF4QW1vdW50IiwgIm5ldHdvcmsiLCAidGllciIsICJ0YWdzIiwgImJsb2NrIiwgInNldCIsICJjcmVhdGl2ZVN0cmVhbSIsICJDUkVBVElWRV9DT05URU5UIiwgImNyZWF0aXZlIiwgIkNyZWF0aXZlSXRlbXMiLCAiZW50cmllcyIsICJ2YWx1ZXMiLCAibWV0YWRhdGEiLCAibmJ0IiwgImV4dHJhcyIsICJDcmVhdGl2ZUl0ZW0iLCAiaXRlbXMiLCAiQ3VzdG9tSXRlbVR5cGUiLCAiSXRlbVR5cGUiLCAibmV0d29ya0lkIiwgImN1c3RvbSIsICJpZGVudGlmaWVyIiwgInByb3BlcnRpZXMiLCAiQ3JlYXRpdmVJdGVtIiwgInJlZ2lzdGVyIiwgIkVudW0iLCAiZW51bXMiLCAiTWFwIiwgImlkZW50aWZpZXIiLCAidHlwZSIsICJzeW1ib2wiLCAiZGVmYXVsdCIsICJvcHRpb25hbCIsICJyZXN1bHQiLCAiX2FyZ3VtZW50cyIsICJ2YWxpZGF0ZSIsICJfZXJyb3IiLCAiRXJyb3IiLCAiZXh0cmFjdCIsICJfcG9pbnRlciIsICJWYWxpZEVudW0iLCAiRW51bSIsICJ0eXBlIiwgIlN0cmluZ0VudW0iLCAiVmFsaWRFbnVtIiwgImlkZW50aWZpZXIiLCAic3ltYm9sIiwgInR5cGUiLCAib3B0aW9ucyIsICJzdHJpY3QiLCAicmVzdWx0IiwgInZhbGlkYXRlIiwgIl9lcnJvciIsICJUeXBlRXJyb3IiLCAiZXh0cmFjdCIsICJwb2ludGVyIiwgInBlZWsiLCAibmV4dCIsICJJbnRlZ2VyRW51bSIsICJWYWxpZEVudW0iLCAiaWRlbnRpZmllciIsICJzeW1ib2wiLCAidHlwZSIsICJyZXN1bHQiLCAidmFsaWRhdGUiLCAiX2Vycm9yIiwgIlR5cGVFcnJvciIsICJleHRyYWN0IiwgInBvaW50ZXIiLCAicGVlayIsICJuZXh0IiwgIlRhcmdldEVudW0iLCAiVmFsaWRFbnVtIiwgImlkZW50aWZpZXIiLCAic3ltYm9sIiwgInR5cGUiLCAicmVzdWx0IiwgInZhbGlkYXRlIiwgImVycm9yIiwgIkVycm9yIiwgImV4dHJhY3QiLCAicG9pbnRlciIsICJ0YXJnZXQiLCAibmV4dCIsICJvcmlnaW4iLCAic3RhdGUiLCAiRW50aXR5IiwgImRpbWVuc2lvbiIsICJzdGFydHNXaXRoIiwgImdldFBsYXllcnMiLCAic29tZSIsICJ4IiwgInVzZXJuYW1lIiwgInNsaWNlIiwgInF1ZXJ5IiwgImxlbmd0aCIsICJlbmRzV2l0aCIsICJxdWVyaWVzIiwgInNwbGl0IiwgImZsYXRNYXAiLCAiZGF0YSIsICJrZXkiLCAidmFsdWUiLCAicGxheWVycyIsICJmaWx0ZXIiLCAicGxheWVyIiwgIm5hbWUiLCAibmVnYXRlIiwgInRhZyIsICJoYXNUYWciLCAiVHlwZUVycm9yIiwgImVudGl0aWVzIiwgImdldEVudGl0aWVzIiwgImVudGl0eSIsICJoYXNUcmFpdCIsICJFbnRpdHlOYW1lVGFnVHJhaXQiLCAidHJhaXQiLCAiZ2V0VHJhaXQiLCAiZ2V0TmFtZVRhZyIsICJwYXJzZWQiLCAiaW5jbHVkZXMiLCAiUGxheWVyIiwgIk1hdGgiLCAiZmxvb3IiLCAicmFuZG9tIiwgIlZlY3RvcjNmIiwgIlBvc2l0aW9uRW51bSIsICJWYWxpZEVudW0iLCAibmFtZSIsICJzeW1ib2wiLCAidHlwZSIsICJyZXN1bHQiLCAidmFsaWRhdGUiLCAiZXJyb3IiLCAiRXJyb3IiLCAiZXh0cmFjdCIsICJwb2ludGVyIiwgIngiLCAibmV4dCIsICJOdW1iZXIiLCAiaXNOYU4iLCAic3RhcnRzV2l0aCIsICJ5IiwgInoiLCAieHN0ZXBzIiwgInNsaWNlIiwgInlzdGVwcyIsICJ6c3RlcHMiLCAic3RhdGUiLCAib3JpZ2luIiwgIkVudGl0eSIsICJlbnRpdHkiLCAiZXgiLCAiZXkiLCAiZXoiLCAicG9zaXRpb24iLCAibngiLCAibnkiLCAibnoiLCAiVmVjdG9yM2YiLCAiU29mdEVudW0iLCAiRW51bSIsICJ0eXBlIiwgIkN1c3RvbUVudW0iLCAiU29mdEVudW0iLCAiaWRlbnRpZmllciIsICJzeW1ib2wiLCAidHlwZSIsICJvcHRpb25zIiwgInN0cmljdCIsICJyZXN1bHQiLCAidmFsaWRhdGUiLCAiZXJyb3IiLCAiVHlwZUVycm9yIiwgImpvaW4iLCAiaW5jbHVkZXMiLCAiZXh0cmFjdCIsICJwb2ludGVyIiwgInBlZWsiLCAibmV4dCIsICJCb29sZWFuRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJzdHJpY3QiLCAicmVzdWx0IiwgInRvU3RyaW5nIiwgInZhbGlkYXRlIiwgImVycm9yIiwgIlR5cGVFcnJvciIsICJqb2luIiwgImV4dHJhY3QiLCAicG9pbnRlciIsICJwZWVrIiwgIm5leHQiLCAiR2FtZW1vZGVFbnVtIiwgIkN1c3RvbUVudW0iLCAiaWRlbnRpZmllciIsICJvcHRpb25zIiwgIkFiaWxpdHlJbmRleCIsICJpZGVudGlmaWVycyIsICJPYmplY3QiLCAidmFsdWVzIiwgIkFiaWxpdHlJbmRleCIsICJmaWx0ZXIiLCAiaWQiLCAiQWJpbGl0eUVudW0iLCAiQ3VzdG9tRW51bSIsICJuYW1lIiwgIm9wdGlvbnMiLCAiaWRlbnRpZmllcnMiLCAiQmxvY2tUeXBlIiwgImdldEFsbCIsICJtYXAiLCAiYmxvY2siLCAiaWRlbnRpZmllciIsICJzdGFydHNXaXRoIiwgInNsaWNlIiwgIkJsb2NrRW51bSIsICJDdXN0b21FbnVtIiwgIm9wdGlvbnMiLCAiaWRlbnRpZmllcnMiLCAiRW50aXR5VHlwZSIsICJnZXRBbGwiLCAibWFwIiwgImVudGl0eSIsICJpZGVudGlmaWVyIiwgInN0YXJ0c1dpdGgiLCAic2xpY2UiLCAiRW50aXR5RW51bSIsICJDdXN0b21FbnVtIiwgIm9wdGlvbnMiLCAiaWRlbnRpZmllcnMiLCAiSXRlbVR5cGUiLCAiZ2V0QWxsIiwgIm1hcCIsICJpdGVtIiwgImlkZW50aWZpZXIiLCAic3RhcnRzV2l0aCIsICJzbGljZSIsICJJdGVtRW51bSIsICJDdXN0b21FbnVtIiwgIm9wdGlvbnMiLCAiVGFnRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJXb3JsZEVudW0iLCAiQ3VzdG9tRW51bSIsICJpZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAiQ29tbWFuZCIsICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgInJlZ2lzdHJ5IiwgImNhbGxiYWNrIiwgIkF2YWlsYWJsZUNvbW1hbmRzUGFja2V0IiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFJlZ2lzdHJ5IiwgIm92ZXJsb2FkcyIsICJNYXAiLCAiZGVidWciLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiTm9ybWFsIiwgIm92ZXJsb2FkIiwgIm9wdGlvbnMiLCAiY2FsbGJhY2siLCAic2V0IiwgIkNvbW1hbmRzIiwgImNvbW1hbmRzIiwgIk1hcCIsICJnZXRBbGwiLCAidmFsdWVzIiwgImdldCIsICJuYW1lIiwgInN0YXJ0c1dpdGgiLCAic2xpY2UiLCAic3BsaXQiLCAicmVnaXN0ZXIiLCAiZGVzY3JpcHRpb24iLCAicmVnaXN0cnkiLCAiY2FsbGJhY2siLCAicmVnSW5zdGFuY2UiLCAiQ29tbWFuZFJlZ2lzdHJ5IiwgImV4ZWNDYWxsYmFjayIsICJjb21tYW5kIiwgIkNvbW1hbmQiLCAic2V0IiwgInVucmVnaXN0ZXIiLCAiZGVsZXRlIiwgInNlcmlhbGl6ZSIsICJwYWNrZXQiLCAiQXZhaWxhYmxlQ29tbWFuZHNQYWNrZXQiLCAiZHluYW1pY0VudW1zIiwgIm1hcCIsICJwZXJtaXNzaW9uTGV2ZWwiLCAic3ViY29tbWFuZHMiLCAiZmxhZ3MiLCAiZGVidWciLCAiYWxpYXMiLCAib3ZlcmxvYWRzIiwgImtleXMiLCAib3ZlcmxvYWQiLCAiY2hhaW5pbmciLCAicGFyYW1ldGVycyIsICJPYmplY3QiLCAiZW50cmllcyIsICJ2YWx1ZSIsICJlbm0iLCAiQXJyYXkiLCAiaXNBcnJheSIsICJzeW1ib2wiLCAidHlwZSIsICJTb2Z0RW51bSIsICJvcHRpb25zIiwgImxlbmd0aCIsICJwdXNoIiwgIm9wdGlvbmFsIiwgImNoYWluZWRTdWJjb21tYW5kVmFsdWVzIiwgImVudW1Db25zdHJhaW50cyIsICJlbnVtVmFsdWVzIiwgImVudW1zIiwgInBvc3RGaXhlcyIsICJDb21tYW5kQXJndW1lbnRQb2ludGVyIiwgImFyZ3VtZW50cyIsICJzdGF0ZSIsICJvZmZzZXQiLCAiYXJndW1lbnRzXyIsICJwZWVrIiwgIm5leHQiLCAiQ29tbWFuZEV4ZWN1dGlvblN0YXRlIiwgInNwbGl0IiwgImNvbW1hbmQiLCAib3JpZ2luIiwgImNvbW1hbmRzIiwgInNvdXJjZSIsICJwYXJzZSIsICJuYW1lIiwgInNoaWZ0IiwgImZpbmQiLCAiZXhlY3V0ZSIsICJUeXBlRXJyb3IiLCAiZ2xvYmFsQ29udGV4dCIsICJvdmVybG9hZCIsICJjYWxsYmFjayIsICJyZWdpc3RyeSIsICJvdmVybG9hZHMiLCAiY29udGV4dCIsICJrZXkiLCAidmFsdWUiLCAiQXJyYXkiLCAiaXNBcnJheSIsICJ0eXBlIiwgIm9wdGlvbmFsIiwgImxlbmd0aCIsICJ2YWx1ZV8iLCAiZXh0cmFjdCIsICJkZWZhdWx0IiwgIk9iamVjdCIsICJhc3NpZ24iLCAia2V5cyIsICJfIiwgImVudHJpZXMiLCAiRW51bSIsICJyZXN1bHQiLCAidmFsaWRhdGUiLCAicmVnZXgiLCAibWF0Y2giLCAiZXhlYyIsICJwdXNoIiwgIkdhbWVtb2RlIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlRW51bSIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJjb250ZXh0IiwgInRhcmdldHMiLCAidmFsaWRhdGUiLCAicmVzdWx0IiwgIm9yaWdpbiIsICJQbGF5ZXIiLCAibGVuZ3RoIiwgIkVycm9yIiwgImxvZ3MiLCAiR2FtZW1vZGUiLCAiU3Vydml2YWwiLCAiQ3JlYXRpdmUiLCAiQWR2ZW50dXJlIiwgIlNwZWN0YXRvciIsICJUeXBlRXJyb3IiLCAicHVzaCIsICJ1c2VybmFtZSIsICJtZXNzYWdlIiwgImpvaW4iLCAiZ2FtZW1vZGVfZGVmYXVsdCIsICJBYmlsaXR5SW5kZXgiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAidGFyZ2V0IiwgIlRhcmdldEVudW0iLCAiYWJpbGl0eSIsICJBYmlsaXR5RW51bSIsICJlbmFibGVkIiwgIkJvb2xlYW5FbnVtIiwgImNvbnRleHQiLCAidGFyZ2V0cyIsICJyZXN1bHQiLCAiaW5kZXgiLCAiQWJpbGl0eUluZGV4IiwgIm1lc3NhZ2UiLCAiZW50aXR5IiwgImlzUGxheWVyIiwgInB1c2giLCAidW5pcXVlSWQiLCAiYWJpbGl0aWVzIiwgInNldCIsICJqb2luIiwgImFiaWxpdHlfZGVmYXVsdCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJpdGVtIiwgIkl0ZW1FbnVtIiwgIm1ldGFkYXRhIiwgIkludGVnZXJFbnVtIiwgImFtb3VudCIsICJjb250ZXh0IiwgInRhcmdldHMiLCAicmVzdWx0IiwgIml0ZW1SZXN1bHQiLCAiaXRlbUlkZW50aWZpZXIiLCAiaW5jbHVkZXMiLCAidW5kZWZpbmVkIiwgIml0ZW1NZXRhZGF0YSIsICJpdGVtQW1vdW50IiwgIml0ZW1Db3VudCIsICJsZW5ndGgiLCAibWVzc2FnZSIsICJoYXNUcmFpdCIsICJFbnRpdHlJbnZlbnRvcnlUcmFpdCIsICJjb250YWluZXIiLCAiZ2V0VHJhaXQiLCAiY2xlYXIiLCAic2xvdCIsICJpdGVtU3RhY2siLCAiT2JqZWN0IiwgImVudHJpZXMiLCAic3RvcmFnZSIsICJ0eXBlIiwgImlkZW50aWZpZXIiLCAiYXV4aWxsYXJ5IiwgInN0YWNrQW1vdW50IiwgInJlbWFpbmluZyIsICJjbGVhclNsb3QiLCAiTnVtYmVyIiwgInBhcnNlSW50IiwgInNldEFtb3VudCIsICJNYXRoIiwgIm1heCIsICJtaW4iLCAiY2xlYXJfZGVmYXVsdCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJmcm9tIiwgIlBvc2l0aW9uRW51bSIsICJ0byIsICJibG9jayIsICJCbG9ja0VudW0iLCAiY29udGV4dCIsICJyZXN1bHQiLCAiaWRlbnRpZmllciIsICJpbmNsdWRlcyIsICJmbG9vciIsICJkaW1lbnNpb24iLCAib3JpZ2luIiwgIkVudGl0eSIsICJ0eXBlIiwgImJsb2NrUGFsZXR0ZSIsICJyZXNvbHZlVHlwZSIsICJmaWxsIiwgImdldFBlcm11dGF0aW9uIiwgImZpbGxfZGVmYXVsdCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJpdGVtIiwgIkl0ZW1FbnVtIiwgImFtb3VudCIsICJJbnRlZ2VyRW51bSIsICJtZXRhZGF0YSIsICJjb250ZXh0IiwgInRhcmdldHMiLCAicmVzdWx0IiwgIml0ZW1SZXN1bHQiLCAiaXRlbUlkZW50aWZpZXIiLCAiaW5jbHVkZXMiLCAiYXV4aWxsYXJ5IiwgImlzUGxheWVyIiwgIml0ZW1TdGFjayIsICJJdGVtU3RhY2siLCAiZ2V0V29ybGQiLCAiY29udGFpbmVyIiwgImdldFRyYWl0IiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgImFkZEl0ZW0iLCAibWVzc2FnZSIsICJsZW5ndGgiLCAiZ2l2ZV9kZWZhdWx0IiwgIkRpc2Nvbm5lY3RSZWFzb24iLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAidGFyZ2V0IiwgIlRhcmdldEVudW0iLCAicmVhc29uIiwgIlN0cmluZ0VudW0iLCAiY29udGV4dCIsICJ0YXJnZXRzIiwgInJlc3VsdCIsICJsZW5ndGgiLCAiRXJyb3IiLCAiUGxheWVyIiwgImRpc2Nvbm5lY3QiLCAiRGlzY29ubmVjdFJlYXNvbiIsICJLaWNrZWQiLCAia2lja19kZWZhdWx0IiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgInBvc2l0aW9uIiwgIlBvc2l0aW9uRW51bSIsICJibG9jayIsICJCbG9ja0VudW0iLCAiY29udGV4dCIsICJyZXN1bHQiLCAiaWRlbnRpZmllciIsICJpbmNsdWRlcyIsICJmbG9vciIsICJvcmlnaW4iLCAiRW50aXR5IiwgImRpbWVuc2lvbiIsICJnZXRCbG9jayIsICJ0eXBlIiwgImJsb2NrUGFsZXR0ZSIsICJyZXNvbHZlVHlwZSIsICJzZXRUeXBlIiwgIm1lc3NhZ2UiLCAieCIsICJ5IiwgInoiLCAic2V0YmxvY2tfZGVmYXVsdCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJvcGVyYXRpb24iLCAiVGFnRW51bSIsICJ0YWciLCAiU3RyaW5nRW51bSIsICJjb250ZXh0IiwgInRhcmdldHMiLCAicmVzdWx0IiwgIm1lc3NhZ2UiLCAiZW50aXR5IiwgImFkZFRhZyIsICJwdXNoIiwgInVuaXF1ZUlkIiwgInJlbW92ZVRhZyIsICJ0YWdzIiwgImdldFRhZ3MiLCAibGVuZ3RoIiwgImpvaW4iLCAidGFnX2RlZmF1bHQiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkRpbWVuc2lvblR5cGUiLCAiU2V0VGltZVBhY2tldCIsICJUZXh0UGFja2V0IiwgIlRleHRQYWNrZXRUeXBlIiwgIkVtaXR0ZXIiLCAiZWZmZWN0c19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkJsaW5kbmVzc0VmZmVjdCIsICJEYXJrbmVzc0VmZmVjdCIsICJFZmZlY3QiLCAiRmF0YWxQb2lzb25FZmZlY3QiLCAiSW5zdGFudERhbWFnZUVmZmVjdCIsICJJbnN0YW50SGVhbHRoRWZmZWN0IiwgIkludmlzaWJpbGl0eUVmZmVjdCIsICJOYXVzZWFzRWZmZWN0IiwgIk5pZ2h0VmlzaW9uRWZmZWN0IiwgIlBvaXNvbkVmZmVjdCIsICJSZWdlbmVyYXRpb25FZmZlY3QiLCAiU2xvd25lc3NFZmZlY3QiLCAiU3BlZWRFZmZlY3QiLCAiV2F0ZXJCcmVhdGhpbmdFZmZlY3QiLCAiV2l0aGVyRWZmZWN0IiwgIkNvbG9yIiwgIkVmZmVjdCIsICJ0eXBlIiwgImluc3RhbnQiLCAiY29sb3IiLCAiQ29sb3IiLCAiZHVyYXRpb24iLCAiYW1wbGlmaWVyIiwgInNob3dQYXJ0aWNsZXMiLCAiT2JqZWN0IiwgImdldFByb3RvdHlwZU9mIiwgInRvU3RyaW5nIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgImVmZmVjdFR5cGUiLCAiaXNFeHBpcmVkIiwgIkNvbG9yIiwgIkVmZmVjdFR5cGUiLCAiUmVnZW5lcmF0aW9uRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiUmVnZW5lcmF0aW9uIiwgImNvbG9yIiwgIkNvbG9yIiwgIm9uVGljayIsICJlbnRpdHkiLCAiZW50aXR5SGVhbHRoIiwgImdldFRyYWl0IiwgIkVudGl0eUhlYWx0aFRyYWl0IiwgInRpY2tzUGVyU2Vjb25kIiwgIk1hdGgiLCAibWF4IiwgImFtcGxpZmllciIsICJOdW1iZXIiLCAiZ2V0V29ybGQiLCAiY3VycmVudFRpY2siLCAic2V0IiwgImN1cnJlbnRWYWx1ZSIsICJFZmZlY3RUeXBlIiwgIkNvbG9yIiwgIkdhbWVtb2RlIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiUG9pc29uRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiUG9pc29uIiwgImluc3RhbnQiLCAiY29sb3IiLCAiQ29sb3IiLCAib25UaWNrIiwgImVudGl0eSIsICJ0aWNrc1BlclNlY29uZCIsICJNYXRoIiwgImZsb29yIiwgIm1heCIsICJwb3ciLCAiYW1wbGlmaWVyIiwgIm1pbiIsICJOdW1iZXIiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgImN1cnJlbnRUaWNrIiwgImlzUGxheWVyIiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlIiwgIkNyZWF0aXZlIiwgImVudGl0eUhlYWx0aCIsICJnZXRUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJjdXJyZW50VmFsdWUiLCAiYXBwbHlEYW1hZ2UiLCAidW5kZWZpbmVkIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiTWFnaWMiLCAiQ29sb3IiLCAiRWZmZWN0VHlwZSIsICJOaWdodFZpc2lvbkVmZmVjdCIsICJFZmZlY3QiLCAidHlwZSIsICJFZmZlY3RUeXBlIiwgIk5pZ2h0VmlzaW9uIiwgImNvbG9yIiwgIkNvbG9yIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiRWZmZWN0VHlwZSIsICJHYW1lbW9kZSIsICJJbnN0YW50RGFtYWdlRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiSW5zdGFudERhbWFnZSIsICJpbnN0YW50IiwgIm9uQWRkIiwgImVudGl0eSIsICJpc1BsYXllciIsICJnYW1lbW9kZSIsICJHYW1lbW9kZSIsICJDcmVhdGl2ZSIsICJoZWFsdGhUcmFpdCIsICJnZXRUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJhcHBseURhbWFnZSIsICJhbXBsaWZpZXIiLCAidW5kZWZpbmVkIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiTWFnaWMiLCAiRWZmZWN0VHlwZSIsICJJbnN0YW50SGVhbHRoRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiSW5zdGFudEhlYWx0aCIsICJpbnN0YW50IiwgIm9uQWRkIiwgImVudGl0eSIsICJoZWFsdGhUcmFpdCIsICJnZXRUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJjdXJyZW50SGVhbHRoIiwgImN1cnJlbnRWYWx1ZSIsICJlZmZlY3RpdmVNYXgiLCAic2V0IiwgIk1hdGgiLCAibWluIiwgImFtcGxpZmllciIsICJDb2xvciIsICJFZmZlY3RUeXBlIiwgIkJsaW5kbmVzc0VmZmVjdCIsICJFZmZlY3QiLCAidHlwZSIsICJFZmZlY3RUeXBlIiwgIkJsaW5kbmVzcyIsICJjb2xvciIsICJDb2xvciIsICJDb2xvciIsICJFZmZlY3RUeXBlIiwgIkRhcmtuZXNzRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiRGFya25lc3MiLCAiY29sb3IiLCAiQ29sb3IiLCAiQ29sb3IiLCAiRWZmZWN0VHlwZSIsICJOYXVzZWFzRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiTmF1c2VhIiwgImNvbG9yIiwgIkNvbG9yIiwgIkNvbG9yIiwgIkVmZmVjdFR5cGUiLCAiU3BlZWRFZmZlY3QiLCAiRWZmZWN0IiwgInR5cGUiLCAiRWZmZWN0VHlwZSIsICJTcGVlZCIsICJjb2xvciIsICJDb2xvciIsICJvbkFkZCIsICJlbnRpdHkiLCAibW92ZW1lbnRUcmFpdCIsICJnZXRUcmFpdCIsICJFbnRpdHlNb3ZlbWVudFRyYWl0IiwgInNldCIsICJjdXJyZW50VmFsdWUiLCAiYW1wbGlmaWVyIiwgIm9uUmVtb3ZlIiwgImRlZmF1bHRWYWx1ZSIsICJBY3RvckRhbWFnZUNhdXNlIiwgIkNvbG9yIiwgIkVmZmVjdFR5cGUiLCAiR2FtZW1vZGUiLCAiV2l0aGVyRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiV2l0aGVyIiwgImNvbG9yIiwgIkNvbG9yIiwgIm9uVGljayIsICJlbnRpdHkiLCAidGlja3NQZXJTZWNvbmQiLCAiTWF0aCIsICJtYXgiLCAicG93IiwgImFtcGxpZmllciIsICJOdW1iZXIiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgImN1cnJlbnRUaWNrIiwgImlzUGxheWVyIiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlIiwgIkNyZWF0aXZlIiwgImdldFRyYWl0IiwgIkVudGl0eUhlYWx0aFRyYWl0IiwgImFwcGx5RGFtYWdlIiwgInVuZGVmaW5lZCIsICJBY3RvckRhbWFnZUNhdXNlIiwgIk1hZ2ljIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiQ29sb3IiLCAiRWZmZWN0VHlwZSIsICJHYW1lbW9kZSIsICJGYXRhbFBvaXNvbkVmZmVjdCIsICJFZmZlY3QiLCAidHlwZSIsICJFZmZlY3RUeXBlIiwgIkZhdGFsUG9pc29uIiwgImNvbG9yIiwgIkNvbG9yIiwgIm9uVGljayIsICJlbnRpdHkiLCAidGlja3NQZXJTZWNvbmQiLCAiTWF0aCIsICJmbG9vciIsICJtYXgiLCAicG93IiwgImFtcGxpZmllciIsICJtaW4iLCAiTnVtYmVyIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJjdXJyZW50VGljayIsICJpc1BsYXllciIsICJnYW1lbW9kZSIsICJHYW1lbW9kZSIsICJDcmVhdGl2ZSIsICJnZXRUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJhcHBseURhbWFnZSIsICJ1bmRlZmluZWQiLCAiQWN0b3JEYW1hZ2VDYXVzZSIsICJNYWdpYyIsICJDb2xvciIsICJFZmZlY3RUeXBlIiwgIlNsb3duZXNzRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiU2xvd25lc3MiLCAiY29sb3IiLCAiQ29sb3IiLCAib25BZGQiLCAiZW50aXR5IiwgIm1vdmVtZW50VHJhaXQiLCAiZ2V0VHJhaXQiLCAiRW50aXR5TW92ZW1lbnRUcmFpdCIsICJzZXQiLCAiY3VycmVudFZhbHVlIiwgImFtcGxpZmllciIsICJvblJlbW92ZSIsICJkZWZhdWx0VmFsdWUiLCAiQ29sb3IiLCAiRWZmZWN0VHlwZSIsICJJbnZpc2liaWxpdHlFZmZlY3QiLCAiRWZmZWN0IiwgInR5cGUiLCAiRWZmZWN0VHlwZSIsICJJbnZpc2liaWxpdHkiLCAiY29sb3IiLCAiQ29sb3IiLCAib25BZGQiLCAiZW50aXR5IiwgImdldFRyYWl0IiwgIkVudGl0eUludmlzaWJpbGl0eVRyYWl0IiwgInNldEludmlzaWJpbGl0eSIsICJvblJlbW92ZSIsICJDb2xvciIsICJFZmZlY3RUeXBlIiwgIldhdGVyQnJlYXRoaW5nRWZmZWN0IiwgIkVmZmVjdCIsICJ0eXBlIiwgIkVmZmVjdFR5cGUiLCAiV2F0ZXJCcmVhdGhpbmciLCAiY29sb3IiLCAiQ29sb3IiLCAiRWZmZWN0UGFsbGV0ZSIsICJlZmZlY3RzIiwgIk1hcCIsICJlZmZlY3QiLCAiRW50aXR5RWZmZWN0cyIsICJyZWdpc3RlckVmZmVjdCIsICJzZXQiLCAidHlwZSIsICJnZXRFZmZlY3QiLCAiZ2V0IiwgImdldEFsbEVmZmVjdHMiLCAidmFsdWVzIiwgInJlbW92ZUVmZmVjdCIsICJkZWxldGUiLCAiRW50aXR5RWZmZWN0cyIsICJrZXkiLCAiRWZmZWN0cyIsICJlZmZlY3QiLCAicHVzaCIsICJCbG9ja1Bvc2l0aW9uIiwgIkRpbWVuc2lvblR5cGUiLCAiVGV4dFBhY2tldCIsICJUZXh0UGFja2V0VHlwZSIsICJWZWN0b3IzZiIsICJUaWNrU2NoZWR1bGUiLCAic2NoZWR1bGVkVGljayIsICJjb21wbGV0ZVRpY2siLCAiY2FsbGJhY2tzIiwgIlNldCIsICJ3b3JsZE9yRGltZW5zaW9uIiwgIkJpZ0ludCIsICJjdXJyZW50VGljayIsICJEaW1lbnNpb24iLCAid29ybGQiLCAiZXhlY3V0ZSIsICJjYWxsYmFjayIsICJvbiIsICJhZGQiLCAiY2FuY2VsIiwgImNsZWFyIiwgIkRlZmF1bHREaW1lbnNpb25Qcm9wZXJ0aWVzIiwgImlkZW50aWZpZXIiLCAidHlwZSIsICJEaW1lbnNpb25UeXBlIiwgIk92ZXJ3b3JsZCIsICJnZW5lcmF0b3IiLCAidmlld0Rpc3RhbmNlIiwgInNpbXVsYXRpb25EaXN0YW5jZSIsICJzcGF3blBvc2l0aW9uIiwgIkRpbWVuc2lvbiIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgIndvcmxkIiwgImVudGl0aWVzIiwgIk1hcCIsICJibG9ja3MiLCAidmFsdWUiLCAicG9zaXRpb24iLCAiVmVjdG9yM2YiLCAiZnJvbUFycmF5IiwgInkiLCAiYmxvY2siLCAiZ2V0VG9wbW9zdEJsb2NrIiwgIngiLCAieiIsICJnZXRHZW5lcmF0b3IiLCAiRXJyb3IiLCAic2VlZCIsICJpbmRleE9mIiwgImRpbWVuc2lvbnMiLCAidmFsdWVzIiwgIm9uVGljayIsICJkZWx0YVRpY2siLCAiZ2V0UGxheWVycyIsICJsZW5ndGgiLCAicGxheWVyUG9zaXRpb25zIiwgIm1hcCIsICJwbGF5ZXIiLCAiZW50aXR5IiwgInNvbWUiLCAiZGlzdGFuY2UiLCAidHJhaXQiLCAidHJhaXRzIiwgInJlYXNvbiIsICJsb2dnZXIiLCAiZXJyb3IiLCAidW5pcXVlSWQiLCAiZGVsZXRlIiwgImhhc1RyYWl0IiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgImNvbnRhaW5lciIsICJnZXRUcmFpdCIsICJpdGVtIiwgInN0b3JhZ2UiLCAiZ2V0V29ybGQiLCAiZ2V0Q2h1bmsiLCAiY3giLCAiY3oiLCAicHJvdmlkZXIiLCAicmVhZENodW5rIiwgInNldENodW5rIiwgImNodW5rIiwgIlBsYXllckNodW5rUmVuZGVyaW5nVHJhaXQiLCAiY2h1bmtzIiwgImhhcyIsICJoYXNoIiwgInNlbmQiLCAid3JpdGVDaHVuayIsICJnZXRCbG9jayIsICJibG9ja1Bvc2l0aW9uIiwgIkJsb2NrUG9zaXRpb24iLCAiZnJvbSIsICJnZXQiLCAicGVybXV0YXRpb24iLCAiZ2V0UGVybXV0YXRpb24iLCAiQmxvY2siLCAiYmxvY2tQYWxldHRlIiwgImdldFJlZ2lzdHJ5IiwgImNvbXBvbmVudHMiLCAicHVzaCIsICJrZXkiLCAiT2JqZWN0IiwgImtleXMiLCAic3RhdGUiLCAiZ2V0QWxsVHJhaXRzIiwgImFkZFRyYWl0IiwgInNpemUiLCAic2V0IiwgInRvcExldmVsIiwgImdldFRvcG1vc3RMZXZlbCIsICJzZW5kTWVzc2FnZSIsICJtZXNzYWdlIiwgInBhY2tldCIsICJUZXh0UGFja2V0IiwgIlRleHRQYWNrZXRUeXBlIiwgIlJhdyIsICJuZWVkc1RyYW5zbGF0aW9uIiwgInNvdXJjZSIsICJwYXJhbWV0ZXJzIiwgInh1aWQiLCAicGxhdGZvcm1DaGF0SWQiLCAiZmlsdGVyZWQiLCAiYnJvYWRjYXN0IiwgImZpbHRlciIsICJpc1BsYXllciIsICJnZXRFbnRpdHkiLCAiaWQiLCAicnVudGltZUlkIiwgImZpbmQiLCAiZ2V0RW50aXRpZXMiLCAiZmlsbCIsICJ0byIsICJtaW5YIiwgIk1hdGgiLCAibWluIiwgIm1pblkiLCAibWluWiIsICJtYXhYIiwgIm1heCIsICJtYXhZIiwgIm1heFoiLCAidXBkYXRlZENodW5rcyIsICJTZXQiLCAic2V0UGVybXV0YXRpb24iLCAiYWRkIiwgImRpcnR5IiwgInNwYXduRW50aXR5IiwgIkVudGl0eSIsICJFbnRpdHlHcmF2aXR5VHJhaXQiLCAiRW50aXR5UGh5c2ljc1RyYWl0IiwgIkVudGl0eU1vdmVtZW50VHJhaXQiLCAic3Bhd24iLCAic3Bhd25JdGVtIiwgIml0ZW1TdGFjayIsICJFbnRpdHlJZGVudGlmaWVyIiwgIkl0ZW0iLCAiRW50aXR5SXRlbVN0YWNrVHJhaXQiLCAiZXhlY3V0ZUNvbW1hbmQiLCAiY29tbWFuZCIsICJzdGFydHNXaXRoIiwgInNsaWNlIiwgIkNvbW1hbmRFeGVjdXRpb25TdGF0ZSIsICJjb21tYW5kcyIsICJnZXRBbGwiLCAiZXhlY3V0ZSIsICJzY2hlZHVsZSIsICJ0aWNrcyIsICJUaWNrU2NoZWR1bGUiLCAic2NoZWR1bGVzIiwgInBhY2tldHMiLCAiYnJvYWRjYXN0SW1tZWRpYXRlIiwgInNlbmRJbW1lZGlhdGUiLCAiYnJvYWRjYXN0RXhjZXB0IiwgIlJlbW92ZU9iamVjdGl2ZVBhY2tldCIsICJTY29yZWJvYXJkQWN0aW9uVHlwZSIsICJTZXREaXNwbGF5T2JqZWN0aXZlUGFja2V0IiwgIlNldFNjb3JlUGFja2V0IiwgIlNjb3JlYm9hcmRBY3Rpb25UeXBlIiwgIlNldFNjb3JlUGFja2V0IiwgIlNjb3JlYm9hcmRJZGVudGl0eVR5cGUiLCAiU2NvcmVib2FyZElkZW50aXR5IiwgIklERU5USUZJRVIiLCAiaWRlbnRpZmllciIsICJ0eXBlIiwgImRpc3BsYXlOYW1lIiwgImVudGl0eSIsICJ2YWx1ZSIsICJFbnRpdHkiLCAiaXNQbGF5ZXIiLCAiU2NvcmVib2FyZElkZW50aXR5VHlwZSIsICJQbGF5ZXIiLCAidXNlcm5hbWUiLCAicnVudGltZUlkIiwgIkZha2VQbGF5ZXIiLCAiU2NvcmVib2FyZE9iamVjdGl2ZSIsICJ3b3JsZCIsICJzY29yZWJvYXJkIiwgInBhcnRpY2lwYW50cyIsICJNYXAiLCAib2JqZWN0aXZlTmFtZSIsICJkaXNwbGF5TmFtZSIsICJoYXNQYXJ0aWNpcGFudCIsICJwYXJ0aWNpcGFudCIsICJpZGVudGl0eSIsICJTY29yZWJvYXJkSWRlbnRpdHkiLCAiRW50aXR5IiwgImVudGl0eSIsICJnZXRQYXJ0aWNpcGFudCIsICJnZXRQYXJ0aWNpcGFudHMiLCAia2V5cyIsICJhZGRQYXJ0aWNpcGFudCIsICJpbml0aWFsU2NvcmUiLCAiRXJyb3IiLCAic2NvcmVib2FyZElkZW50aXR5IiwgInNldCIsICJyZW1vdmVQYXJ0aWNpcGFudCIsICJkZWxldGUiLCAicGFja2V0IiwgIlNldFNjb3JlUGFja2V0IiwgInR5cGUiLCAiU2NvcmVib2FyZEFjdGlvblR5cGUiLCAiUmVtb3ZlIiwgImVudHJpZXMiLCAic2NvcmVib2FyZElkIiwgImlkZW50aWZpZXIiLCAic2NvcmUiLCAiaWRlbnRpdHlUeXBlIiwgImFjdG9yVW5pcXVlSWQiLCAiY3VzdG9tTmFtZSIsICJicm9hZGNhc3QiLCAic2V0U2NvcmUiLCAiQ2hhbmdlIiwgInVuaXF1ZUlkIiwgImFkZFNjb3JlIiwgIm5ld1Njb3JlIiwgImdldCIsICJnZXRTY29yZSIsICJjbGVhclNjb3JlcyIsICJtYXAiLCAiY2xlYXIiLCAiU2NvcmVib2FyZCIsICJ3b3JsZCIsICJvYmplY3RpdmVzIiwgIlNldCIsICJzbG90cyIsICJNYXAiLCAiZ2V0T2JqZWN0aXZlIiwgIm5hbWUiLCAib2JqZWN0aXZlIiwgIm9iamVjdGl2ZU5hbWUiLCAiYWRkT2JqZWN0aXZlIiwgImRpc3BsYXkiLCAiRXJyb3IiLCAiU2NvcmVib2FyZE9iamVjdGl2ZSIsICJhZGQiLCAicmVtb3ZlT2JqZWN0aXZlIiwgImRPYmplY3RpdmUiLCAiZGVsZXRlIiwgImdldE9iamVjdGl2ZUF0RGlzcGxheVNsb3QiLCAic2xvdCIsICJnZXQiLCAic2V0T2JqZWN0aXZlQXREaXNwbGF5U2xvdCIsICJvcHRpb25zIiwgInNvcnRPcmRlciIsICJwbGF5ZXIiLCAiU2V0RGlzcGxheU9iamVjdGl2ZVBhY2tldCIsICJkaXNwbGF5U2xvdCIsICJkaXNwbGF5TmFtZSIsICJjcml0ZXJpYU5hbWUiLCAic2NvcmVzIiwgIlNldFNjb3JlUGFja2V0IiwgInR5cGUiLCAiU2NvcmVib2FyZEFjdGlvblR5cGUiLCAiQ2hhbmdlIiwgImVudHJpZXMiLCAicGFydGljaXBhbnRzIiwgIm1hcCIsICJpZGVudGl0eSIsICJzY29yZSIsICJzY29yZWJvYXJkSWQiLCAiaWRlbnRpZmllciIsICJpZGVudGl0eVR5cGUiLCAiYWN0b3JVbmlxdWVJZCIsICJlbnRpdHkiLCAidW5pcXVlSWQiLCAiY3VzdG9tTmFtZSIsICJzZW5kIiwgImJyb2FkY2FzdCIsICJzZXQiLCAiY2xlYXJPYmplY3RpdmVBdERpc3BsYXlTbG90IiwgInBhY2tldCIsICJSZW1vdmVPYmplY3RpdmVQYWNrZXQiLCAiRGVmYXVsdFdvcmxkUHJvcGVydGllcyIsICJpZGVudGlmaWVyIiwgInNlZWQiLCAiTWF0aCIsICJmbG9vciIsICJyYW5kb20iLCAic2F2ZUludGVydmFsIiwgImRpbWVuc2lvbnMiLCAidHlwZSIsICJEaW1lbnNpb25UeXBlIiwgIk92ZXJ3b3JsZCIsICJnZW5lcmF0b3IiLCAidmlld0Rpc3RhbmNlIiwgInNpbXVsYXRpb25EaXN0YW5jZSIsICJzcGF3blBvc2l0aW9uIiwgIldvcmxkIiwgIkVtaXR0ZXIiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJwcm92aWRlciIsICJNYXAiLCAibG9nZ2VyIiwgImVudGl0eVBhbGV0dGUiLCAiRW50aXR5UGFsZXR0ZSIsICJlZmZlY3RQYWxldHRlIiwgIkVmZmVjdFBhbGxldGUiLCAiYmxvY2tQYWxldHRlIiwgIkJsb2NrUGFsZXR0ZSIsICJpdGVtUGFsZXR0ZSIsICJJdGVtUGFsZXR0ZSIsICJjb21tYW5kcyIsICJDb21tYW5kcyIsICJzY2hlZHVsZXMiLCAiU2V0IiwgInNjb3JlYm9hcmQiLCAiU2NvcmVib2FyZCIsICJjdXJyZW50VGljayIsICJkYXlUaW1lIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiR3JlZW5CcmlnaHQiLCAiY29tbWFuZCIsICJBZG1pbkNvbW1hbmRzIiwgIkNvbW1vbkNvbW1hbmRzIiwgImVudHJ5IiwgImNyZWF0ZURpbWVuc2lvbiIsICJvblRpY2siLCAiZGVsdGFUaWNrIiwgImdldFBsYXllcnMiLCAibGVuZ3RoIiwgIldvcmxkVGlja1NpZ25hbCIsICJCaWdJbnQiLCAiZW1pdCIsICJkaW1lbnNpb24iLCAidmFsdWVzIiwgInJlYXNvbiIsICJlcnJvciIsICJwYWNrZXQiLCAiU2V0VGltZVBhY2tldCIsICJ0aW1lIiwgImJyb2FkY2FzdCIsICJzaXplIiwgInNjaGVkdWxlIiwgImNvbXBsZXRlVGljayIsICJleGVjdXRlIiwgImRlbGV0ZSIsICJvblNhdmUiLCAiZGltZW5zaW9uUHJvcGVydGllcyIsICJEZWZhdWx0RGltZW5zaW9uUHJvcGVydGllcyIsICJoYXMiLCAiRGltZW5zaW9uIiwgInNldCIsICJkZWJ1ZyIsICJzZW5kTWVzc2FnZSIsICJtZXNzYWdlIiwgIlRleHRQYWNrZXQiLCAiVGV4dFBhY2tldFR5cGUiLCAiUmF3IiwgIm5lZWRzVHJhbnNsYXRpb24iLCAic291cmNlIiwgInBhcmFtZXRlcnMiLCAieHVpZCIsICJwbGF0Zm9ybUNoYXRJZCIsICJmaWx0ZXJlZCIsICJnZXREaW1lbnNpb24iLCAidW5kZWZpbmVkIiwgIm5leHQiLCAidmFsdWUiLCAiZ2V0IiwgImdldERpbWVuc2lvbnMiLCAiZmxhdE1hcCIsICJnZXRFbnRpdGllcyIsICJ0aWNrcyIsICJUaWNrU2NoZWR1bGUiLCAiYWRkIiwgInBhY2tldHMiLCAicGxheWVyIiwgInNlbmQiLCAiYnJvYWRjYXN0SW1tZWRpYXRlIiwgInNlbmRJbW1lZGlhdGUiLCAiYnJvYWRjYXN0RXhjZXB0IiwgIm90aGVyIiwgIkVuZGlhbm5lc3MiLCAiQ29tcG91bmRUYWciLCAiQmxvY2tTdG9yYWdlIiwgIk1BWF9YIiwgIk1BWF9ZIiwgIk1BWF9aIiwgIk1BWF9TSVpFIiwgInBhbGV0dGUiLCAiYmxvY2tzIiwgImFpciIsICJwZXJtdXRhdGlvbiIsICJCbG9ja1Blcm11dGF0aW9uIiwgInJlc29sdmUiLCAiQmxvY2tJZGVudGlmaWVyIiwgIkFpciIsICJuZXR3b3JrIiwgIkFycmF5IiwgImZyb20iLCAibGVuZ3RoIiwgImlzRW1wdHkiLCAiZ2V0U3RhdGUiLCAiYngiLCAiYnkiLCAiYnoiLCAiaW5kZXgiLCAiZ2V0SW5kZXgiLCAicGFsZXR0ZUluZGV4IiwgInNldFN0YXRlIiwgInN0YXRlIiwgImluZGV4T2YiLCAicHVzaCIsICJzZXJpYWxpemUiLCAic3RvcmFnZSIsICJzdHJlYW0iLCAibmJ0IiwgImJpdHNQZXJCbG9jayIsICJNYXRoIiwgImNlaWwiLCAibG9nMiIsICJ3cml0ZUJ5dGUiLCAiYmxvY2tzUGVyV29yZCIsICJmbG9vciIsICJ3b3JkQ291bnQiLCAidyIsICJ3b3JkIiwgImJsb2NrIiwgIm9mZnNldCIsICJ3cml0ZUludDMyIiwgIkVuZGlhbm5lc3MiLCAiTGl0dGxlIiwgIndyaXRlWmlnWmFnIiwgInBlcm11dGF0aW9ucyIsICJnZXQiLCAiRXJyb3IiLCAiZGF0YSIsICJ0b05idCIsICJDb21wb3VuZFRhZyIsICJ3cml0ZSIsICJkZXNlcmlhbGl6ZSIsICJwYWxldHRlQW5kRmxhZyIsICJyZWFkQnl0ZSIsICJfaXNSdW50aW1lIiwgIndvcmRzIiwgInJlYWRJbnQzMiIsICJwYWxldHRlU2l6ZSIsICJyZWFkWmlnWmFnIiwgInJlYWQiLCAiZnJvbU5idCIsICJ2YWx1ZU9mIiwgInBvc2l0aW9uIiwgIngiLCAieSIsICJ6IiwgIkJpbmFyeVN0cmVhbSIsICJTdWJDaHVuayIsICJ2ZXJzaW9uIiwgImxheWVycyIsICJpbmRleCIsICJpc0VtcHR5IiwgInN0b3JhZ2UiLCAiZ2V0TGF5ZXIiLCAiaW5kZXhfIiwgIkJsb2NrU3RvcmFnZSIsICJnZXRTdGF0ZSIsICJieCIsICJieSIsICJieiIsICJsYXllciIsICJzZXRTdGF0ZSIsICJzdGF0ZSIsICJzZXJpYWxpemUiLCAic3ViY2h1bmsiLCAic3RyZWFtIiwgIm5idCIsICJ3cml0ZVVpbnQ4IiwgImxlbmd0aCIsICJFcnJvciIsICJ3cml0ZUludDgiLCAiZGVzZXJpYWxpemUiLCAicmVhZFVpbnQ4IiwgImNvdW50IiwgInJlYWRJbnQ4IiwgInB1c2giLCAiZnJvbSIsICJidWZmZXIiLCAiQmluYXJ5U3RyZWFtIiwgIkNodW5rQ29vcmRzIiwgIkRpbWVuc2lvblR5cGUiLCAiQmluYXJ5U3RyZWFtIiwgIkNodW5rIiwgIk1BWF9TVUJfQ0hVTktTIiwgInR5cGUiLCAieCIsICJ6IiwgImhhc2giLCAic3ViY2h1bmtzIiwgImNhY2hlIiwgImRpcnR5IiwgInJlYWR5IiwgIkNodW5rQ29vcmRzIiwgIkFycmF5IiwgImZyb20iLCAibGVuZ3RoIiwgImdldFBlcm11dGF0aW9uIiwgInBvc2l0aW9uIiwgInkiLCAieWYiLCAiRGltZW5zaW9uVHlwZSIsICJPdmVyd29ybGQiLCAic3RhdGUiLCAiZ2V0U3ViQ2h1bmsiLCAiZ2V0U3RhdGUiLCAiQmxvY2tQZXJtdXRhdGlvbiIsICJwZXJtdXRhdGlvbnMiLCAiZ2V0IiwgInNldFBlcm11dGF0aW9uIiwgInBlcm11dGF0aW9uIiwgInN1YmNodW5rIiwgIm5ldHdvcmsiLCAic2V0U3RhdGUiLCAiZ2V0VG9wbW9zdExldmVsIiwgImlkZW50aWZpZXIiLCAiQmxvY2tJZGVudGlmaWVyIiwgIkFpciIsICJzb2xpZCIsICJnZXRCb3R0b21tb3N0TGV2ZWwiLCAiaW5kZXgiLCAibmRleCIsICJTdWJDaHVuayIsICJnZXRTdWJDaHVua1NlbmRDb3VudCIsICJjb3VudCIsICJpc0VtcHR5IiwgInNlcmlhbGl6ZSIsICJjaHVuayIsICJuYnQiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJ3cml0ZUJ5dGUiLCAid3JpdGVWYXJJbnQiLCAiZ2V0QnVmZmVyIiwgImRlc2VyaWFsaXplIiwgImJ1ZmZlciIsICJoZWFkZXIiLCAiYmluYXJ5IiwgIm9mZnNldCIsICJyZWFkQnl0ZSIsICJyZWFkVmFySW50IiwgIkRlZmF1bHRXb3JsZFByb3ZpZGVyUHJvcGVydGllcyIsICJwYXRoIiwgIldvcmxkUHJvdmlkZXIiLCAiaWRlbnRpZmllciIsICJjb25zdHJ1Y3RvciIsICJ3b3JsZCIsICJfcGFyYW1ldGVycyIsICJvblN0YXJ0dXAiLCAib25TaHV0ZG93biIsICJvblNhdmUiLCAicmVhZENodW5rIiwgIl9jeCIsICJfY3oiLCAiX2RpbWVuc2lvbiIsICJFcnJvciIsICJ3cml0ZUNodW5rIiwgIl9jaHVuayIsICJyZWFkQXZhaWxhYmxlRW50aXRpZXMiLCAid3JpdGVBdmFpbGFibGVFbnRpdGllcyIsICJfZW50aXRpZXMiLCAicmVhZEVudGl0eSIsICJfdW5pcXVlSWQiLCAid3JpdGVFbnRpdHkiLCAiX2VudGl0eSIsICJyZWFkUGxheWVyIiwgIl91dWlkIiwgIndyaXRlUGxheWVyIiwgIl9wbGF5ZXIiLCAicmVhZEF2YWlsYWJsZUJsb2NrcyIsICJ3cml0ZUF2YWlsYWJsZUJsb2NrcyIsICJfYmxvY2tzIiwgInJlYWRCbG9jayIsICJfaGFzaCIsICJ3cml0ZUJsb2NrIiwgIl9ibG9jayIsICJyZWFkUHJvcGVydHkiLCAiX2tleSIsICJ3cml0ZVByb3BlcnR5IiwgIl92YWx1ZSIsICJpbml0aWFsaXplIiwgIl9zZXJlbml0eSIsICJfcHJvcGVydGllcyIsICJjcmVhdGUiLCAiX3dvcmxkUHJvcGVydGllcyIsICJDaHVua0Nvb3JkcyIsICJJbnRlcm5hbFByb3ZpZGVyIiwgIldvcmxkUHJvdmlkZXIiLCAiaWRlbnRpZmllciIsICJjaHVua3MiLCAiTWFwIiwgImVudGl0aWVzIiwgInBsYXllcnMiLCAicHJvcGVydGllcyIsICJyZWFkQ2h1bmsiLCAiY3giLCAiY3oiLCAiZGltZW5zaW9uIiwgImhhcyIsICJzZXQiLCAiZ2V0IiwgIkNodW5rQ29vcmRzIiwgImhhc2giLCAieCIsICJ6IiwgImdlbmVyYXRvciIsICJhcHBseSIsICJ3cml0ZUNodW5rIiwgImNodW5rIiwgImdldEF2YWlsYWJsZUVudGl0aWVzIiwgIm1hcCIsICJ1bmlxdWVJZCIsICJyZWFkRW50aXR5IiwgIkVycm9yIiwgIndyaXRlRW50aXR5IiwgImVudGl0eSIsICJyZWFkUGxheWVyIiwgInV1aWQiLCAid3JpdGVQbGF5ZXIiLCAicGxheWVyIiwgInJlYWRQcm9wZXJ0eSIsICJrZXkiLCAicHJvcGVydHkiLCAidmFsdWUiLCAiZXF1YWxzIiwgInRvU3RyaW5nIiwgIndyaXRlUHJvcGVydHkiLCAiaW5pdGlhbGl6ZSIsICJjcmVhdGUiLCAic2VyZW5pdHkiLCAiX3Byb3BlcnRpZXMiLCAid29ybGRQcm9wZXJ0aWVzIiwgInByb3ZpZGVyIiwgIndvcmxkIiwgIldvcmxkIiwgImV4aXN0c1N5bmMiLCAibWtkaXJTeW5jIiwgInJlYWRkaXJTeW5jIiwgInJlYWRGaWxlU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJlc29sdmUiLCAiQmluYXJ5U3RyZWFtIiwgIkVuZGlhbm5lc3MiLCAiTGV2ZWxkYiIsICJCbG9ja1Bvc2l0aW9uIiwgIkNodW5rQ29vcmRzIiwgIkxldmVsREJQcm92aWRlciIsICJXb3JsZFByb3ZpZGVyIiwgImlkZW50aWZpZXIiLCAicGF0aCIsICJkYiIsICJjaHVua3MiLCAiTWFwIiwgIkxldmVsZGIiLCAib3BlbiIsICJyZXNvbHZlIiwgIm9uU2h1dGRvd24iLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgImRpbWVuc2lvbnMiLCAidmFsdWVzIiwgImdlbmVyYXRvciIsICJ3b3JrZXIiLCAidGVybWluYXRlIiwgIm9uU2F2ZSIsICJjbG9zZSIsICJvblN0YXJ0dXAiLCAiZW50aXRpZXMiLCAicmVhZEF2YWlsYWJsZUVudGl0aWVzIiwgImJsb2NrcyIsICJyZWFkQXZhaWxhYmxlQmxvY2tzIiwgImxlbmd0aCIsICJ1bmlxdWVJZCIsICJlbnRyeSIsICJyZWFkRW50aXR5IiwgIkVudGl0eSIsICJzcGF3biIsICJoYXNoIiwgInJlYWRCbG9jayIsICJwZXJtdXRhdGlvbiIsICJibG9ja1BhbGV0dGUiLCAiZ2V0QWxsUGVybXV0YXRpb25zIiwgImZpbmQiLCAibmV0d29yayIsICJibG9jayIsICJCbG9jayIsICJCbG9ja1Bvc2l0aW9uIiwgInBvc2l0aW9uIiwgInNldCIsICJtYXAiLCAicHJvcGVydGllcyIsICJ3cml0ZUZpbGVTeW5jIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgImNodW5rIiwgImRpcnR5IiwgIndyaXRlQ2h1bmsiLCAidW5pcXVlSWRzIiwgImVudGl0eSIsICJpc1BsYXllciIsICJ3cml0ZVBsYXllciIsICJnZXREYXRhRW50cnkiLCAid3JpdGVFbnRpdHkiLCAicHVzaCIsICJ3cml0ZUF2YWlsYWJsZUVudGl0aWVzIiwgImhhc2hlcyIsICJ3cml0ZUJsb2NrIiwgIndyaXRlQXZhaWxhYmxlQmxvY2tzIiwgImxvZ2dlciIsICJpbmZvIiwgInNpemUiLCAicmVhZENodW5rIiwgImN4IiwgImN6IiwgImhhcyIsICJnZXQiLCAiQ2h1bmtDb29yZHMiLCAieCIsICJ6IiwgImhhc0NodW5rIiwgInN1YmNodW5rcyIsICJBcnJheSIsICJjeSIsICJyZWFkU3ViQ2h1bmsiLCAiQ2h1bmsiLCAidHlwZSIsICJhcHBseSIsICJyZWFkeSIsICJDaHVua1JlYWR5U2lnbmFsIiwgImVtaXQiLCAiaXNFbXB0eSIsICJ3cml0ZUNodW5rVmVyc2lvbiIsICJzdWJjaHVuayIsICJnZXRTdWJDaHVuayIsICJ3cml0ZVN1YkNodW5rIiwgInZlcnNpb24iLCAia2V5IiwgImJ1aWxkQ2h1bmtWZXJzaW9uS2V5IiwgImluZGV4T2YiLCAicHV0IiwgIkJ1ZmZlciIsICJmcm9tIiwgImJ1aWxkU3ViQ2h1bmtLZXkiLCAiU3ViQ2h1bmsiLCAiaW5kZXgiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJzZXJpYWxpemUiLCAiZ2V0QnVmZmVyIiwgImJ1aWxkQWN0b3JMaXN0S2V5IiwgInJlYWRJbnQ2NCIsICJFbmRpYW5uZXNzIiwgIkxpdHRsZSIsICJjdXJzb3JBdEVuZCIsICJ3cml0ZUludDY0IiwgImluY2x1ZGVzIiwgIkVycm9yIiwgImJ1aWxkQWN0b3JEYXRhS2V5IiwgImJ1ZmZlciIsICJwYXJzZSIsICJ0b1N0cmluZyIsICJfIiwgInZhbHVlIiwgImVuZHNXaXRoIiwgIkJpZ0ludCIsICJzbGljZSIsICJJbmZpbml0eSIsICJOdW1iZXIiLCAiTmFOIiwgImRhdGEiLCAiaXNOYU4iLCAicmVhZFBsYXllciIsICJ1dWlkIiwgInBsYXllciIsICJidWlsZEJsb2NrRGF0YUxpc3RLZXkiLCAicmVhZFppZ1pvbmciLCAid3JpdGVaaWdab25nIiwgInVuaGFzaCIsICJidWlsZEJsb2NrRGF0YUtleSIsICJyZWFkUHJvcGVydHkiLCAid3JpdGVQcm9wZXJ0eSIsICJpbml0aWFsaXplIiwgInNlcmVuaXR5IiwgImV4aXN0c1N5bmMiLCAibWtkaXJTeW5jIiwgImRpcmVjdG9yaWVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0RpcmVjdG9yeSIsICJyZWdpc3RlcldvcmxkIiwgImNyZWF0ZSIsICJkaXJlY3RvcnkiLCAid29ybGRQYXRoIiwgIm5hbWUiLCAicmVhZEZpbGVTeW5jIiwgIldvcmxkIiwgInByb3ZpZGVyIiwgIldvcmxkSW5pdGlhbGl6ZVNpZ25hbCIsICJzeCIsICJzcGF3blBvc2l0aW9uIiwgInN6IiwgInZpZXdEaXN0YW5jZSIsICJhbW91bnQiLCAiY2FjaGUiLCAic3VjY2VzcyIsICJ3b3JsZFByb3BlcnRpZXMiLCAid3JpdGVJbnQzMiIsICJ3cml0ZUJ5dGUiLCAid3JpdGVCdWZmZXIiLCAid3JpdGVaaWdaYWciLCAieSIsICJEZWZhdWx0VGVycmFpbkdlbmVyYXRvclByb3BlcnRpZXMiLCAic2VlZCIsICJNYXRoIiwgImZsb29yIiwgInJhbmRvbSIsICJUZXJyYWluR2VuZXJhdG9yIiwgImlkZW50aWZpZXIiLCAiX3dvcmtlciIsICJjb25zdHJ1Y3RvciIsICJkaW1lbnNpb24iLCAid29ybGQiLCAicHJvcGVydGllcyIsICJxdWV1ZSIsICJNYXAiLCAid29ya2VyIiwgImluaXRpYWxpemUiLCAib24iLCAiY2h1bmsiLCAicHJvY2VzcyIsICJhcHBseSIsICJfY3giLCAiX2N6IiwgIkVycm9yIiwgImhhbmRvZmYiLCAic2V0IiwgImhhc2giLCAieCIsICJjeCIsICJ6IiwgImN6IiwgInR5cGUiLCAicG9zdE1lc3NhZ2UiLCAicXVldWVkIiwgImdldCIsICJzdWIiLCAic3ViY2h1bmtzIiwgInN1YmNodW5rIiwgImdldFN1YkNodW5rIiwgImluZGV4T2YiLCAibGF5IiwgImxheWVycyIsICJsYXllciIsICJnZXRMYXllciIsICJpbmRleCIsICJibG9jayIsICJibG9ja3MiLCAiZW50cmllcyIsICJwYWxldHRlIiwgInJlYWR5IiwgIkNodW5rUmVhZHlTaWduYWwiLCAiZW1pdCIsICJkZWxldGUiLCAiaXNNYWluVGhyZWFkIiwgIlRlcnJhaW5Xb3JrZXIiLCAicGF0aCIsICJfX2ZpbGVuYW1lIiwgInByb3BlcnRpZXMiLCAiZ2VuZXJhdG9yIiwgImlzTWFpblRocmVhZCIsICJFcnJvciIsICJhcHBseSIsICJfY3giLCAiX2N6IiwgIl90eXBlIiwgImlkZW50aWZpZXIiLCAiaW5pdGlhbGl6ZSIsICJfcHJvcGVydGllcyIsICJuYW1lIiwgImlzTWFpblRocmVhZCIsICJwYXJlbnRQb3J0IiwgIndvcmtlckRhdGEiLCAiV29ya2VyIiwgIldvcmtlclRocmVhZCIsICJXb3JrZXIiLCAiZ2VuZXJhdG9yIiwgIndvcmtlciIsICJfd29ya2VyIiwgImluaXRpYWxpemUiLCAicHJvcGVydGllcyIsICJpc01haW5UaHJlYWQiLCAiRXJyb3IiLCAiV29ya2VyVGhyZWFkIiwgInBhdGgiLCAid29ya2VyRGF0YSIsICJpbnN0YW5jZSIsICJwYXJlbnRQb3J0IiwgIm9uIiwgImRhdGEiLCAiY2h1bmsiLCAiYXBwbHkiLCAiY3giLCAiY3oiLCAidHlwZSIsICJwb3N0TWVzc2FnZSIsICJpZGVudGlmaWVyIiwgIlZvaWRHZW5lcmF0b3IiLCAiVGVycmFpbkdlbmVyYXRvciIsICJpZGVudGlmaWVyIiwgImFwcGx5IiwgImN4IiwgImN6IiwgImNodW5rIiwgIkNodW5rIiwgImRpbWVuc2lvbiIsICJ0eXBlIiwgInNldFBlcm11dGF0aW9uIiwgIngiLCAieSIsICJ6IiwgIkJsb2NrUGVybXV0YXRpb24iLCAicmVzb2x2ZSIsICJCbG9ja0lkZW50aWZpZXIiLCAiQmVkcm9jayIsICJTdXBlcmZsYXRHZW5lcmF0b3IiLCAiVGVycmFpbkdlbmVyYXRvciIsICJpZGVudGlmaWVyIiwgImFwcGx5IiwgImN4IiwgImN6IiwgImNodW5rIiwgIkNodW5rIiwgImRpbWVuc2lvbiIsICJ0eXBlIiwgInJlYWR5IiwgImhhbmRvZmYiLCAiU3VwZXJmbGF0V29ya2VyIiwgIlRlcnJhaW5Xb3JrZXIiLCAicGF0aCIsICJfX2ZpbGVuYW1lIiwgImJlZHJvY2siLCAiQmxvY2tQZXJtdXRhdGlvbiIsICJyZXNvbHZlIiwgIkJsb2NrSWRlbnRpZmllciIsICJCZWRyb2NrIiwgImRpcnQiLCAiRGlydCIsICJncmFzcyIsICJHcmFzc0Jsb2NrIiwgImFwcGx5IiwgImN4IiwgImN6IiwgInR5cGUiLCAiY2h1bmsiLCAiQ2h1bmsiLCAieCIsICJ6IiwgInkiLCAicG9zaXRpb24iLCAic2V0UGVybXV0YXRpb24iLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgInBvc2l0aW9uIiwgIlBvc2l0aW9uRW51bSIsICJjb250ZXh0IiwgIm9yaWdpbiIsICJEaW1lbnNpb24iLCAibWVzc2FnZSIsICJyZXN1bHQiLCAidGVsZXBvcnQiLCAidGFyZ2V0IiwgIlRhcmdldEVudW0iLCAiZGVzdGluYXRpb24iLCAidGFyZ2V0cyIsICJsZW5ndGgiLCAiRXJyb3IiLCAidHBfZGVmYXVsdCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJhZGRyZXNzIiwgIlN0cmluZ0VudW0iLCAicG9ydCIsICJJbnRlZ2VyRW51bSIsICJjb250ZXh0IiwgInRhcmdldHMiLCAicmVzdWx0IiwgImxlbmd0aCIsICJFcnJvciIsICJtZXNzYWdlIiwgImlzUGxheWVyIiwgInB1c2giLCAidW5pcXVlSWQiLCAidHJhbnNmZXIiLCAidXNlcm5hbWUiLCAiam9pbiIsICJ0cmFuc2Zlcl9kZWZhdWx0IiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiVmVjdG9yM2YiLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgImVudGl0eSIsICJFbnRpdHlFbnVtIiwgImNvbnRleHQiLCAib3JpZ2luIiwgIkVudGl0eSIsICJFcnJvciIsICJpZGVudGlmaWVyIiwgInJlc3VsdCIsICJpbmNsdWRlcyIsICJ4IiwgInkiLCAieiIsICJwb3NpdGlvbiIsICJmbG9vciIsICJkaW1lbnNpb24iLCAic3Bhd25FbnRpdHkiLCAiVmVjdG9yM2YiLCAibWVzc2FnZSIsICJQb3NpdGlvbkVudW0iLCAic3VtbW9uX2RlZmF1bHQiLCAiQWN0b3JEYW1hZ2VDYXVzZSIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIkdhbWVtb2RlIiwgIklHTk9SRURfR0FNRU1PREVTIiwgIlNldCIsICJHYW1lbW9kZSIsICJDcmVhdGl2ZSIsICJDcmVhdGl2ZVNwZWN0YXRvciIsICJTcGVjdGF0b3IiLCAicmVnaXN0ZXIiLCAiX19uYW1lIiwgIndvcmxkIiwgImNvbW1hbmRzIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgIk9wZXJhdG9yIiwgIm92ZXJsb2FkIiwgInRhcmdldCIsICJUYXJnZXRFbnVtIiwgImNvbnRleHQiLCAidmFsaWRhdGUiLCAidGFyZ2V0cyIsICJyZXN1bHQiLCAibGVuZ3RoIiwgIkVycm9yIiwgIm1lc3NhZ2UiLCAiUGxheWVyIiwgImhhcyIsICJnYW1lbW9kZSIsICJwdXNoIiwgInVzZXJuYW1lIiwgImtpbGwiLCAidW5kZWZpbmVkIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiTm9uZSIsICJpc1BsYXllciIsICJ1bmlxdWVJZCIsICJqb2luIiwgImtpbGxfZGVmYXVsdCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJzZXJlbml0eSIsICJzdG9wIiwgInN0b3BfZGVmYXVsdCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJXb3JsZEVudW0iLCAiZGltZW5zaW9uIiwgIlN0cmluZ0VudW0iLCAiY29udGV4dCIsICJzZXJlbml0eSIsICJvcmlnaW4iLCAiZ2V0V29ybGQiLCAidGFyZ2V0cyIsICJyZXN1bHQiLCAibGVuZ3RoIiwgIkVycm9yIiwgImdldERpbWVuc2lvbiIsICJtZXNzYWdlIiwgInRlbGVwb3J0IiwgInBvc2l0aW9uIiwgInB1c2giLCAiaXNQbGF5ZXIiLCAidXNlcm5hbWUiLCAidW5pcXVlSWQiLCAicHJvcGVydGllcyIsICJpZGVudGlmaWVyIiwgImpvaW4iLCAid29ybGRfZGVmYXVsdCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJ0YXJnZXQiLCAiVGFyZ2V0RW51bSIsICJjb250ZXh0IiwgInRhcmdldHMiLCAicmVzdWx0IiwgImxlbmd0aCIsICJFcnJvciIsICJtZXNzYWdlIiwgImlzUGxheWVyIiwgInB1c2giLCAidW5pcXVlSWQiLCAiaXNPcCIsICJ1c2VybmFtZSIsICJvcCIsICJqb2luIiwgIm9wX2RlZmF1bHQiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAidGFyZ2V0IiwgIlRhcmdldEVudW0iLCAiY29udGV4dCIsICJ0YXJnZXRzIiwgInJlc3VsdCIsICJsZW5ndGgiLCAiRXJyb3IiLCAibWVzc2FnZSIsICJpc1BsYXllciIsICJwdXNoIiwgInVuaXF1ZUlkIiwgImlzT3AiLCAidXNlcm5hbWUiLCAiZGVvcCIsICJqb2luIiwgImRlb3BfZGVmYXVsdCIsICJDb21tYW5kUGVybWlzc2lvbkxldmVsIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJwcm92aWRlciIsICJvblNhdmUiLCAibWVzc2FnZSIsICJzYXZlX2RlZmF1bHQiLCAiQWRtaW5Db21tYW5kcyIsICJHYW1lbW9kZSIsICJBYmlsaXR5IiwgIkNsZWFyIiwgIkZpbGwiLCAiR2l2ZSIsICJLaWNrIiwgIlNldGJsb2NrIiwgIlRhZyIsICJUcCIsICJUcmFuc2ZlciIsICJTdW1tb24iLCAiS2lsbCIsICJTVE9QIiwgIldPUkxEIiwgIk9QIiwgIkRFT1AiLCAiU0FWRSIsICJNSU5FQ1JBRlRfVkVSU0lPTiIsICJQUk9UT0NPTF9WRVJTSU9OIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJjb21tYW5kcyIsICJtZXNzYWdlIiwgIk1JTkVDUkFGVF9WRVJTSU9OIiwgIlBST1RPQ09MX1ZFUlNJT04iLCAiYWJvdXRfZGVmYXVsdCIsICJDb21tb25Db21tYW5kcyIsICJBYm91dCIsICJjcmVhdGVJbnRlcmZhY2UiLCAic3RkaW4iLCAic3Rkb3V0IiwgIkNvbnNvbGVJbnRlcmZhY2UiLCAic2VyZW5pdHkiLCAiaW50ZXJmYWNlIiwgImNyZWF0ZUludGVyZmFjZSIsICJpbnB1dCIsICJzdGRpbiIsICJvdXRwdXQiLCAic3Rkb3V0IiwgInRlcm1pbmFsIiwgInNldFJhd01vZGUiLCAicmVzdW1lIiwgIm9uIiwgIm9uTGluZSIsICJiaW5kIiwgInNldFByb21wdCIsICJsaW5lIiwgImZvcm1hdCIsICJzdGFydHNXaXRoIiwgInNsaWNlIiwgImNvbW1hbmQiLCAiZmxhZ3MiLCAicGFyc2VGbGFncyIsICJkaW1lbnNpb25GbGFnIiwgImZpbmQiLCAia2V5IiwgIndvcmxkRmxhZyIsICJ3b3JsZCIsICJ3b3JsZHMiLCAiZ2V0IiwgImxvZ2dlciIsICJlcnJvciIsICJkaW1lbnNpb24iLCAiZ2V0RGltZW5zaW9uIiwgImV4ZWN1dGUiLCAiZXhlY3V0ZUNvbW1hbmQiLCAibWVzc2FnZSIsICJpbmZvIiwgInJlYXNvbiIsICJzdWNjZXNzIiwgImdldFdvcmxkIiwgInNwbGl0IiwgIm1hcCIsICJmbGFnIiwgInZhbHVlIiwgImVuZHNXaXRoIiwgImluZGV4IiwgImluZGV4T2YiLCAidHJpbSIsICJJdGVtUGFsZXR0ZSIsICJ0eXBlcyIsICJJdGVtVHlwZSIsICJjcmVhdGl2ZUNvbnRlbnQiLCAiQ3JlYXRpdmVJdGVtIiwgIml0ZW1zIiwgInRyYWl0cyIsICJNYXAiLCAicmVnaXN0cnkiLCAidHJhaXQiLCAiSXRlbVRyYWl0cyIsICJyZWdpc3RlclRyYWl0IiwgImdldEFsbFR5cGVzIiwgInZhbHVlcyIsICJnZXRUeXBlIiwgImlkZW50aWZpZXIiLCAiZ2V0IiwgInJlc29sdmVUeXBlIiwgInR5cGUiLCAiZmluZCIsICJpdGVtIiwgImJsb2NrIiwgInJlZ2lzdGVyVHlwZSIsICJoYXMiLCAic2V0IiwgIkl0ZW1FbnVtIiwgIm9wdGlvbnMiLCAicHVzaCIsICJnZXRSZWdpc3RyeSIsICJnZXRDcmVhdGl2ZUNvbnRlbnQiLCAiZ2V0Q3JlYXRpdmVDb250ZW50QnlJbmRleCIsICJpbmRleCIsICJyZWdpc3RlckNyZWF0aXZlQ29udGVudCIsICJhdXhpbGxhcnkiLCAic2l6ZSIsICJ1bnJlZ2lzdGVyQ3JlYXRpdmVDb250ZW50IiwgImRlbGV0ZSIsICJjbGVhckNyZWF0aXZlQ29udGVudCIsICJjbGVhciIsICJnZXRBbGxUcmFpdHMiLCAiZ2V0VHJhaXQiLCAidHJhaXRzX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiSXRlbUJ1bmRsZVRyYWl0IiwgIkl0ZW1FbmNoYW50YWJsZVRyYWl0IiwgIkl0ZW1FcXVpcHBhYmxlVHJhaXQiLCAiSXRlbVRyYWl0IiwgIkl0ZW1UcmFpdCIsICJUcmFpdCIsICJ0eXBlcyIsICJpdGVtIiwgImFkZFRyYWl0IiwgImVxdWFscyIsICJvdGhlciIsICJpZGVudGlmaWVyIiwgImNsb25lIiwgImNvbXBvbmVudCIsICJjb25zdHJ1Y3RvciIsICJrZXkiLCAidmFsdWUiLCAiT2JqZWN0IiwgImVudHJpZXMiLCAiSW50VGFnIiwgIkNvbnRhaW5lcklkIiwgIkNvbnRhaW5lck5hbWUiLCAiQ29udGFpbmVyVHlwZSIsICJGdWxsQ29udGFpbmVyTmFtZSIsICJJbnZlbnRvcnlDb250ZW50UGFja2V0IiwgIk5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yIiwgIkNvbXBvdW5kVGFnIiwgIkJpbmFyeVN0cmVhbSIsICJJdGVtU3RhY2tOYnRNYXAiLCAiTWFwIiwgIml0ZW1TdGFjayIsICJnZXQiLCAia2V5IiwgImFkZCIsICJ2YWx1ZSIsICJyZXN1bHQiLCAic2V0IiwgIm5hbWUiLCAidXBkYXRlIiwgImRlbGV0ZSIsICJjbGVhciIsICJ0b0NvbXBvdW5kIiwgInJvb3QiLCAiQ29tcG91bmRUYWciLCAiXyIsICJhZGRUYWciLCAiZnJvbUNvbXBvdW5kIiwgInRhZyIsICJnZXRUYWdzIiwgInNlcmlhbGl6ZSIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgIndyaXRlIiwgImdldEJ1ZmZlciIsICJkZXNlcmlhbGl6ZSIsICJidWZmZXIiLCAicmVhZCIsICJjb250YWluZXIiLCAic2xvdCIsICJzdG9yYWdlIiwgImluZGV4T2YiLCAiYW1vdW50IiwgImNsZWFyU2xvdCIsICJzZXRJdGVtIiwgIkRlZmF1bHRJdGVtU3RhY2tQcm9wZXJ0aWVzIiwgImFtb3VudCIsICJhdXhpbGxhcnkiLCAiSXRlbVN0YWNrIiwgInR5cGUiLCAiY29tcG9uZW50cyIsICJNYXAiLCAidHJhaXRzIiwgIm5idCIsICJJdGVtU3RhY2tOYnRNYXAiLCAic3RhY2thYmxlIiwgIm1heEFtb3VudCIsICJ3b3JsZCIsICJjb250YWluZXIiLCAiaWRlbnRpZmllciIsICJwcm9wZXJ0aWVzIiwgIkl0ZW1UeXBlIiwgImdldCIsICJwcm9wcyIsICJlbnRyeSIsICJsb2FkRGF0YUVudHJ5IiwgImluaXRpYWxpemUiLCAiaXRlbVBhbGV0dGUiLCAiZ2V0UmVnaXN0cnkiLCAidHJhaXQiLCAiaGFzVHJhaXQiLCAiYWRkVHJhaXQiLCAidXBkYXRlIiwgInNsb3QiLCAic3RvcmFnZSIsICJpbmRleE9mIiwgImNsZWFyU2xvdCIsICJzZXRJdGVtIiwgInNldEFtb3VudCIsICJkZWNyZW1lbnQiLCAiaW5jcmVtZW50IiwgInVzZSIsICJwbGF5ZXIiLCAib3B0aW9ucyIsICJjYW5jZWxlZCIsICJ2YWx1ZXMiLCAic3VjY2VzcyIsICJvblVzZSIsICJ1bmRlZmluZWQiLCAicmVhc29uIiwgImdldFdvcmxkIiwgInNlcmVuaXR5IiwgImxvZ2dlciIsICJlcnJvciIsICJkaW1lbnNpb24iLCAiZGVsZXRlIiwgImhhcyIsICJnZXRUcmFpdCIsICJyZW1vdmVUcmFpdCIsICJvblJlbW92ZSIsICJ3YXJuIiwgIkl0ZW1UcmFpdCIsICJzZXQiLCAib25BZGQiLCAiaW5zdGFuY2UiLCAiZXF1YWxzIiwgIm90aGVyIiwgInNpemUiLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAiZW50cmllcyIsICJvdGhlckNvbXBvbmVudHMiLCAib3RoZXJUcmFpdCIsICJrZXkiLCAidmFsdWUiLCAib3RoZXJWYWx1ZSIsICJzbmJ0IiwgInZhbHVlT2YiLCAib3RoZXJTbmJ0IiwgImdldERhdGFFbnRyeSIsICJrZXlzIiwgInNlcmlhbGl6ZSIsICJ0b1N0cmluZyIsICJvdmVyd3JpdGUiLCAiRXJyb3IiLCAiY2xlYXIiLCAidHJhaXRUeXBlIiwgImRlc2VyaWFsaXplIiwgIkJ1ZmZlciIsICJmcm9tIiwgInRvTmV0d29ya0luc3RhbmNlIiwgIml0ZW0iLCAicGVybXV0YXRpb24iLCAiYmxvY2siLCAicGVybXV0YXRpb25zIiwgIm5ldHdvcmsiLCAic3RhY2tTaXplIiwgIm1ldGFkYXRhIiwgIm5ldHdvcmtCbG9ja0lkIiwgImV4dHJhcyIsICJ0b0NvbXBvdW5kIiwgImNhbkRlc3Ryb3kiLCAiY2FuUGxhY2VPbiIsICJ0b05ldHdvcmtTdGFjayIsICJzdGFja05ldElkIiwgImZyb21OZXR3b3JrSW5zdGFuY2UiLCAiZGVzY3JpcHRvciIsICJnZXRCeU5ldHdvcmsiLCAiSXRlbUJ1bmRsZVRyYWl0IiwgIkl0ZW1UcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgIkl0ZW1JZGVudGlmaWVyIiwgIkJ1bmRsZSIsICJCbHVlQnVuZGxlIiwgIkJsYWNrQnVuZGxlIiwgIkJyb3duQnVuZGxlIiwgIkN5YW5CdW5kbGUiLCAiR3JheUJ1bmRsZSIsICJHcmVlbkJ1bmRsZSIsICJMaWdodEJsdWVCdW5kbGUiLCAiTGlnaHRHcmF5QnVuZGxlIiwgIkxpbWVCdW5kbGUiLCAiTWFnZW50YUJ1bmRsZSIsICJPcmFuZ2VCdW5kbGUiLCAiUGlua0J1bmRsZSIsICJQdXJwbGVCdW5kbGUiLCAiUmVkQnVuZGxlIiwgIldoaXRlQnVuZGxlIiwgIlllbGxvd0J1bmRsZSIsICJjb250YWluZXIiLCAiaXRlbSIsICJjb21wb25lbnRzIiwgImhhcyIsICJpZCIsICJnZXQiLCAidGFnIiwgIkludFRhZyIsICJuYnQiLCAic2V0IiwgIk1hdGgiLCAiYWJzIiwgIkRhdGUiLCAibm93IiwgImZsb29yIiwgInJhbmRvbSIsICJDb250YWluZXIiLCAiQ29udGFpbmVyVHlwZSIsICJOb25lIiwgIkNvbnRhaW5lcklkIiwgIlJlZ2lzdHJ5IiwgImR5bmFtaWNJZCIsICJvbkNvbnRhaW5lck9wZW4iLCAicGxheWVyIiwgIm9jY3VwYW50cyIsICJhZGQiLCAib25Db250YWluZXJDbG9zZSIsICJkZWxldGUiLCAib25UaWNrIiwgImN1cnJlbnRUaWNrIiwgIndvcmxkIiwgInNpemUiLCAicGFja2V0IiwgIkludmVudG9yeUNvbnRlbnRQYWNrZXQiLCAiY29udGFpbmVySWQiLCAic3RvcmFnZUl0ZW0iLCAiSXRlbVN0YWNrIiwgInRvTmV0d29ya1N0YWNrIiwgImZ1bGxDb250YWluZXJOYW1lIiwgIkZ1bGxDb250YWluZXJOYW1lIiwgIkNvbnRhaW5lck5hbWUiLCAiRHluYW1pYyIsICJpdGVtcyIsICJBcnJheSIsICJmcm9tIiwgInN0b3JhZ2UiLCAiaSIsICJzdGFjayIsICJwdXNoIiwgIk5ldHdvcmtJdGVtU3RhY2tEZXNjcmlwdG9yIiwgIm9jY3VwYW50IiwgInNlbmQiLCAiRXF1aXBtZW50U2xvdCIsICJMZXZlbFNvdW5kRXZlbnQiLCAiTGV2ZWxTb3VuZEV2ZW50UGFja2V0IiwgIkl0ZW1FcXVpcHBhYmxlVHJhaXQiLCAiSXRlbVRyYWl0IiwgImlkZW50aWZpZXIiLCAic2xvdCIsICJFcXVpcG1lbnRTbG90IiwgIkNoZXN0IiwgInR5cGVzIiwgIkl0ZW1JZGVudGlmaWVyIiwgIkRpYW1vbmRDaGVzdHBsYXRlIiwgIm9uVXNlIiwgInBsYXllciIsICJvcHRpb25zIiwgIm1ldGhvZCIsICJJdGVtVXNlTWV0aG9kIiwgIkNsaWNrIiwgInVuZGVmaW5lZCIsICJwbGF5ZXJFcXVpcG1lbnQiLCAiZ2V0VHJhaXQiLCAiRW50aXR5RXF1aXBtZW50VHJhaXQiLCAicGxheWVySW52ZW50b3J5IiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgInNvdW5kUGFja2V0IiwgIkxldmVsU291bmRFdmVudFBhY2tldCIsICJldmVudCIsICJMZXZlbFNvdW5kRXZlbnQiLCAiRXF1aXBHZW5lcmljIiwgInBvc2l0aW9uIiwgImFjdG9ySWRlbnRpZmllciIsICJ0eXBlIiwgImRhdGEiLCAiaXNCYWJ5TW9iIiwgImlzR2xvYmFsIiwgInNlbmQiLCAiY29udGFpbmVyIiwgInN3YXBJdGVtcyIsICJzZWxlY3RlZFNsb3QiLCAiQ29tcG91bmRUYWciLCAiTGlzdFRhZyIsICJUYWciLCAiSXRlbUVuY2hhbnRhYmxlVHJhaXQiLCAiSXRlbVRyYWl0IiwgImlkZW50aWZpZXIiLCAiZ2V0RW5jaGFudG1lbnRzIiwgImVuY2giLCAiaXRlbSIsICJuYnQiLCAiZ2V0IiwgImVuY2hhbnRtZW50cyIsICJNYXAiLCAidmFsdWUiLCAic2V0IiwgImlkIiwgImx2bCIsICJnZXRFbmNoYW50bWVudCIsICJoYXNFbmNoYW50bWVudCIsICJhZGRFbmNoYW50bWVudCIsICJsZXZlbCIsICJDb21wb3VuZFRhZyIsICJjcmVhdGVTaG9ydFRhZyIsICJwdXNoIiwgImdldE5idCIsICJvbkFkZCIsICJoYXMiLCAiTGlzdFRhZyIsICJUYWciLCAiQ29tcG91bmQiLCAiYWRkIiwgIm9uUmVtb3ZlIiwgImRlbGV0ZSIsICJJdGVtVHJhaXRzIiwgIkFycmF5IiwgImtleSIsICJUcmFpdHMiLCAidHJhaXQiLCAicHVzaCIsICJ0cmFpdHNfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJFbnRpdHlBaXJTdXBwbHlUcmFpdCIsICJFbnRpdHlBdHRyaWJ1dGVUcmFpdCIsICJFbnRpdHlDb2xsaXNpb24iLCAiRW50aXR5RWZmZWN0c1RyYWl0IiwgIkVudGl0eUVxdWlwbWVudFRyYWl0IiwgIkVudGl0eUdyYXZpdHlUcmFpdCIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJFbnRpdHlJbnZlbnRvcnlUcmFpdCIsICJFbnRpdHlJbnZpc2liaWxpdHlUcmFpdCIsICJFbnRpdHlJdGVtU3RhY2tUcmFpdCIsICJFbnRpdHlNb3ZlbWVudFRyYWl0IiwgIkVudGl0eU5hbWVUYWdUcmFpdCIsICJFbnRpdHlQaHlzaWNzVHJhaXQiLCAiRW50aXR5VHJhaXQiLCAiUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCIsICJQbGF5ZXJDdXJzb3JUcmFpdCIsICJQbGF5ZXJFbnRpdHlSZW5kZXJpbmdUcmFpdCIsICJQbGF5ZXJFeGhhdXN0aW9uVHJhaXQiLCAiUGxheWVySHVuZ2VyVHJhaXQiLCAiUGxheWVyTGlzdFRyYWl0IiwgIlBsYXllclNhdHVyYXRpb25UcmFpdCIsICJQbGF5ZXJUcmFpdCIsICJFbnRpdHlUcmFpdCIsICJUcmFpdCIsICJ0eXBlcyIsICJlbnRpdHkiLCAiYWRkVHJhaXQiLCAiY2xvbmUiLCAidHJhaXQiLCAiY29uc3RydWN0b3IiLCAiaWRlbnRpZmllciIsICJrZXkiLCAidmFsdWUiLCAiT2JqZWN0IiwgImVudHJpZXMiLCAiQXR0cmlidXRlIiwgIkVudGl0eUF0dHJpYnV0ZVRyYWl0IiwgIkVudGl0eVRyYWl0IiwgImF0dHJpYnV0ZSIsICJlZmZlY3RpdmVNaW4iLCAiZWZmZWN0aXZlTWF4IiwgImRlZmF1bHRWYWx1ZSIsICJjdXJyZW50VmFsdWUiLCAiZ2V0IiwgImN1cnJlbnQiLCAidmFsdWUiLCAic2V0IiwgImVudGl0eSIsICJhdHRyaWJ1dGVzIiwgImluY3JlYXNlIiwgImFtb3VudCIsICJkZWNyZWFzZSIsICJwcm9wZXJ0aWVzIiwgIkF0dHJpYnV0ZSIsICJJbmZpbml0eSIsICJjb21wb25lbnRzIiwgImlkZW50aWZpZXIiLCAib25TcGF3biIsICJoYXMiLCAiZW5hYmxlZCIsICJBdHRyaWJ1dGVOYW1lIiwgIk1vdmVBY3RvckRlbHRhUGFja2V0IiwgIk1vdmVEZWx0YUZsYWdzIiwgIkVudGl0eU1vdmVtZW50VHJhaXQiLCAiRW50aXR5QXR0cmlidXRlVHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJhdHRyaWJ1dGUiLCAiQXR0cmlidXRlTmFtZSIsICJNb3ZlbWVudCIsICJlZmZlY3RpdmVNaW4iLCAiZWZmZWN0aXZlTWF4IiwgImRlZmF1bHRWYWx1ZSIsICJvblRpY2siLCAiZW50aXR5IiwgImlzTW92aW5nIiwgInBhY2tldCIsICJNb3ZlQWN0b3JEZWx0YVBhY2tldCIsICJydW50aW1lSWQiLCAiZmxhZ3MiLCAiTW92ZURlbHRhRmxhZ3MiLCAiQWxsIiwgIngiLCAicG9zaXRpb24iLCAieSIsICJ6IiwgInlhdyIsICJyb3RhdGlvbiIsICJoZWFkWWF3IiwgInBpdGNoIiwgImlzUGxheWVyIiwgImlzSXRlbSIsICJvbkdyb3VuZCIsICJPbkdyb3VuZCIsICJkaW1lbnNpb24iLCAiYnJvYWRjYXN0RXhjZXB0IiwgImJyb2FkY2FzdCIsICJBYmlsaXR5SW5kZXgiLCAiQWN0b3JEYW1hZ2VDYXVzZSIsICJBY3RvckV2ZW50SWRzIiwgIkFjdG9yRXZlbnRQYWNrZXQiLCAiQXR0cmlidXRlTmFtZSIsICJHYW1lbW9kZSIsICJWZWN0b3IzZiIsICJFbnRpdHlIZWFsdGhUcmFpdCIsICJFbnRpdHlBdHRyaWJ1dGVUcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiUGxheWVyIiwgImF0dHJpYnV0ZSIsICJBdHRyaWJ1dGVOYW1lIiwgIkhlYWx0aCIsICJlZmZlY3RpdmVNaW4iLCAiZWZmZWN0aXZlTWF4IiwgImRlZmF1bHRWYWx1ZSIsICJhcHBseURhbWFnZSIsICJhbW91bnQiLCAiZGFtYWdlciIsICJjYXVzZSIsICJFbnRpdHlIdXJ0U2lnbmFsIiwgImVudGl0eSIsICJlbWl0IiwgImN1cnJlbnRWYWx1ZSIsICJwYWNrZXQiLCAiQWN0b3JFdmVudFBhY2tldCIsICJhY3RvclJ1bnRpbWVJZCIsICJydW50aW1lSWQiLCAiZXZlbnRJZCIsICJBY3RvckV2ZW50SWRzIiwgIkhVUlRfQU5JTUFUSU9OIiwgImV2ZW50RGF0YSIsICJBY3RvckRhbWFnZUNhdXNlIiwgIk5vbmUiLCAiZGltZW5zaW9uIiwgImJyb2FkY2FzdCIsICJraWxsIiwgInNldCIsICJ2YWx1ZSIsICJFbnRpdHlIZWFsdGhDaGFuZ2VkU2lnbmFsIiwgIm9uSW50ZXJhY3QiLCAicGxheWVyIiwgIm1ldGhvZCIsICJFbnRpdHlJbnRlcmFjdE1ldGhvZCIsICJBdHRhY2siLCAiYWJpbGl0aWVzIiwgImdldCIsICJBYmlsaXR5SW5kZXgiLCAiQXR0YWNrUGxheWVycyIsICJpc1BsYXllciIsICJBdHRhY2tNb2JzIiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlIiwgIkNyZWF0aXZlIiwgImhlYWRZYXciLCAicGl0Y2giLCAicm90YXRpb24iLCAiaGVhZFlhd1JhZCIsICJNYXRoIiwgIlBJIiwgInBpdGNoUmFkIiwgIngiLCAic2luIiwgImNvcyIsICJ5IiwgInoiLCAic2V0TW90aW9uIiwgIlZlY3RvcjNmIiwgIkVudGl0eUF0dGFjayIsICJQbGF5ZXJUcmFpdCIsICJFbnRpdHlUcmFpdCIsICJwbGF5ZXIiLCAiZW50aXR5IiwgIkNodW5rQ29vcmRzIiwgIkxldmVsQ2h1bmtQYWNrZXQiLCAiTmV0d29ya0NodW5rUHVibGlzaGVyVXBkYXRlUGFja2V0IiwgIlBsYXllckNodW5rUmVuZGVyaW5nVHJhaXQiLCAiUGxheWVyVHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJjaHVua3MiLCAiU2V0IiwgInZpZXdEaXN0YW5jZSIsICJwbGF5ZXIiLCAiZGltZW5zaW9uIiwgInNlbmQiLCAiYW1vdW50IiwgImxlbmd0aCIsICJiYXRjaGVzIiwgIk1hdGgiLCAiY2VpbCIsICJpbmRleCIsICJzdGFydCIsICJlbmQiLCAibWluIiwgImxldmVsQ2h1bmtzIiwgInNsaWNlIiwgIm1hcCIsICJjaHVuayIsICJhZGQiLCAiaGFzaCIsICJwYWNrZXQiLCAiTGV2ZWxDaHVua1BhY2tldCIsICJ4IiwgInoiLCAidHlwZSIsICJzdWJDaHVua0NvdW50IiwgImdldFN1YkNodW5rU2VuZENvdW50IiwgImNhY2hlRW5hYmxlZCIsICJkYXRhIiwgIkNodW5rIiwgInNlcmlhbGl6ZSIsICJzZW50IiwgImhhcyIsICJkaXN0YW5jZSIsICJjeCIsICJjeiIsICJDaHVua0Nvb3JkcyIsICJ1bmhhc2giLCAicHgiLCAicG9zaXRpb24iLCAicHoiLCAiaHlwb3QiLCAibmV4dCIsICJkIiwgImhhc2hlcyIsICJkeCIsICJkeiIsICJwdXNoIiwgImNsZWFyIiwgImNvb3JkcyIsICJlbXB0eSIsICJjb29yZCIsICJkZWxldGUiLCAib25UaWNrIiwgImlzQWxpdmUiLCAiZmlsdGVyIiwgImdldENodW5rIiwgInJlYWR5IiwgInVwZGF0ZSIsICJOZXR3b3JrQ2h1bmtQdWJsaXNoZXJVcGRhdGVQYWNrZXQiLCAicmFkaXVzIiwgImNvb3JkaW5hdGUiLCAiZmxvb3IiLCAic2F2ZWRDaHVua3MiLCAib25EZXNwYXduIiwgIkFiaWxpdHlMYXllclR5cGUiLCAiQWJpbGl0eVNldCIsICJBZGRFbnRpdHlQYWNrZXQiLCAiQWRkSXRlbUFjdG9yUGFja2V0IiwgIkFkZFBsYXllclBhY2tldCIsICJOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciIsICJQcm9wZXJ0eVN5bmNEYXRhIiwgIlJlbW92ZUVudGl0eVBhY2tldCIsICJDb250YWluZXJJZCIsICJDb250YWluZXJUeXBlIiwgIk1vYkVxdWlwbWVudFBhY2tldCIsICJOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciIsICJDb250YWluZXJPcGVuUGFja2V0IiwgIkVudGl0eUNvbnRhaW5lciIsICJDb250YWluZXIiLCAiZW50aXR5IiwgInR5cGUiLCAiaWRlbnRpZmllciIsICJzaXplIiwgInNldEl0ZW0iLCAic2xvdCIsICJpdGVtU3RhY2siLCAid29ybGQiLCAiZ2V0V29ybGQiLCAiaW5pdGlhbGl6ZSIsICJpc1BsYXllciIsICJ1cGRhdGUiLCAiY2xlYXJTbG90IiwgInBsYXllciIsICJ0cmFpdCIsICJ0cmFpdHMiLCAidmFsdWVzIiwgIm9uQ29udGFpbmVyVXBkYXRlIiwgInJlYXNvbiIsICJsb2dnZXIiLCAiZXJyb3IiLCAidW5pcXVlSWQiLCAiZGltZW5zaW9uIiwgImRlbGV0ZSIsICJzaG93IiwgIlBsYXllck9wZW5lZENvbnRhaW5lclNpZ25hbCIsICJlbWl0IiwgInBhY2tldCIsICJDb250YWluZXJPcGVuUGFja2V0IiwgInBvc2l0aW9uIiwgInNlbmQiLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiRW50aXR5VHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJjb250YWluZXIiLCAiY29udGFpbmVyVHlwZSIsICJDb250YWluZXJUeXBlIiwgIkludmVudG9yeSIsICJjb250YWluZXJJZCIsICJDb250YWluZXJJZCIsICJpbnZlbnRvcnlTaXplIiwgInNlbGVjdGVkU2xvdCIsICJlbnRpdHkiLCAiRW50aXR5Q29udGFpbmVyIiwgImdldEhlbGRJdGVtIiwgImdldEl0ZW0iLCAic2V0SGVsZEl0ZW0iLCAic2xvdCIsICJpc1BsYXllciIsICJwYWNrZXQiLCAiTW9iRXF1aXBtZW50UGFja2V0IiwgImhlbGRJdGVtIiwgIml0ZW1EZXNjcmlwdG9yIiwgIkl0ZW1TdGFjayIsICJ0b05ldHdvcmtTdGFjayIsICJOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciIsICJydW50aW1lRW50aXR5SWQiLCAicnVudGltZUlkIiwgIml0ZW0iLCAic2VuZCIsICJvblNwYXduIiwgImNvbXBvbmVudHMiLCAiaGFzIiwgImludmVudG9yeSIsICJnZXQiLCAiaXRlbXMiLCAiZW50cnkiLCAic3RhY2siLCAiYW1vdW50IiwgImF1eGlsbGFyeSIsICJ3b3JsZCIsICJnZXRXb3JsZCIsICJzZXRJdGVtIiwgInVwZGF0ZSIsICJvbkRlc3Bhd24iLCAic2l6ZSIsICJpIiwgImdldERhdGFFbnRyeSIsICJwdXNoIiwgInNldCIsICJBY3RvckV2ZW50SWRzIiwgIkFjdG9yRXZlbnRQYWNrZXQiLCAiTGV2ZWxTb3VuZEV2ZW50IiwgIkxldmVsU291bmRFdmVudFBhY2tldCIsICJUYWtlSXRlbUFjdG9yUGFja2V0IiwgIkVudGl0eUl0ZW1TdGFja1RyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAiYmlydGhUaWNrIiwgIml0ZW1TdGFjayIsICJsaWZlU3BhbiIsICJwaWNrdXBUaWNrIiwgInRhcmdldCIsICJtZXJnaW5nIiwgImVudGl0eSIsICJ0eXBlIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiSXRlbSIsICJFcnJvciIsICJlbnRyeSIsICJjb21wb25lbnRzIiwgImdldCIsICJJdGVtU3RhY2siLCAiSXRlbUlkZW50aWZpZXIiLCAiQWlyIiwgImRpbWVuc2lvbiIsICJ3b3JsZCIsICJjdXJyZW50VGljayIsICJnZXRMaWZlU3BhbiIsICJzZXRMaWZlU3BhbiIsICJ2YWx1ZSIsICJwaWNrdXAiLCAicGxheWVyIiwgInRlbGVwb3J0IiwgInBvc2l0aW9uIiwgImluY3JlbWVudCIsICJhbW91bnQiLCAicGFja2V0IiwgIkFjdG9yRXZlbnRQYWNrZXQiLCAiZXZlbnRJZCIsICJBY3RvckV2ZW50SWRzIiwgIklURU1fRU5USVRZX01FUkdFIiwgImV2ZW50RGF0YSIsICJhY3RvclJ1bnRpbWVJZCIsICJydW50aW1lSWQiLCAiYnJvYWRjYXN0IiwgImRlY3JlbWVudCIsICJvblRpY2siLCAic2V0IiwgImdldERhdGFFbnRyeSIsICJjdXJyZW50IiwgIm9uR3JvdW5kIiwgImVudGl0aWVzIiwgImdldEVudGl0aWVzIiwgImZpbHRlciIsICJ4IiwgImlzSXRlbSIsICJpbmRleCIsICJlbnRyaWVzIiwgImxlbmd0aCIsICJkaXN0YW5jZSIsICJzdWJ0cmFjdCIsICJNYXRoIiwgImFicyIsICJ5IiwgInoiLCAiY29tcG9uZW50IiwgImdldFRyYWl0IiwgImV4aXN0aW5nSXRlbSIsICJtYXhBbW91bnQiLCAiZXF1YWxzIiwgImRlc3Bhd24iLCAidGFrZSIsICJUYWtlSXRlbUFjdG9yUGFja2V0IiwgIml0ZW1SdW50aW1lSWQiLCAidGFyZ2V0UnVudGltZUlkIiwgInNvdW5kIiwgIkxldmVsU291bmRFdmVudFBhY2tldCIsICJldmVudCIsICJMZXZlbFNvdW5kRXZlbnQiLCAiUG9wIiwgImFjdG9ySWRlbnRpZmllciIsICJkYXRhIiwgImlzQmFieU1vYiIsICJpc0dsb2JhbCIsICJzZW5kIiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgImNvbnRhaW5lciIsICJhZGRJdGVtIiwgInBsYXllcnMiLCAiZ2V0UGxheWVycyIsICJpdGVtIiwgImlzQWxpdmUiLCAiQmlnSW50IiwgIlBsYXllckVudGl0eVJlbmRlcmluZ1RyYWl0IiwgIlBsYXllclRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAiZW50aXRpZXMiLCAiU2V0IiwgIm9uVGljayIsICJwbGF5ZXIiLCAiaXNBbGl2ZSIsICJjb21wb25lbnQiLCAiZ2V0VHJhaXQiLCAiUGxheWVyQ2h1bmtSZW5kZXJpbmdUcmFpdCIsICJ2aWV3RGlzdGFuY2UiLCAiZGltZW5zaW9uIiwgInVuaXF1ZSIsICJlbnRpdHkiLCAiaGFzIiwgImRpc3RhbmNlIiwgInBvc2l0aW9uIiwgImFkZCIsICJpc1BsYXllciIsICJwYWNrZXQiLCAiQWRkUGxheWVyUGFja2V0IiwgImhlbGRJdGVtIiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgImdldEhlbGRJdGVtIiwgInV1aWQiLCAidXNlcm5hbWUiLCAicnVudGltZUlkIiwgInBsYXRmb3JtQ2hhdElkIiwgIlN0cmluZyIsICJ2ZWxvY2l0eSIsICJwaXRjaCIsICJyb3RhdGlvbiIsICJ5YXciLCAiaGVhZFlhdyIsICJOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciIsICJJdGVtU3RhY2siLCAidG9OZXR3b3JrU3RhY2siLCAiZ2FtZW1vZGUiLCAiZGF0YSIsICJtZXRhZGF0YSIsICJ2YWx1ZXMiLCAicHJvcGVydGllcyIsICJQcm9wZXJ0eVN5bmNEYXRhIiwgInVuaXF1ZUVudGl0eUlkIiwgInVuaXF1ZUlkIiwgInByZW1pc3Npb25MZXZlbCIsICJwZXJtaXNzaW9uIiwgImNvbW1hbmRQZXJtaXNzaW9uIiwgImFiaWxpdGllcyIsICJ0eXBlIiwgIkFiaWxpdHlMYXllclR5cGUiLCAiQmFzZSIsICJlbnRyaWVzIiwgIm1hcCIsICJhYmlsaXR5IiwgInZhbHVlIiwgIkFiaWxpdHlTZXQiLCAid2Fsa1NwZWVkIiwgImZseVNwZWVkIiwgImxpbmtzIiwgImRldmljZUlkIiwgImRldmljZU9TIiwgInNlbmQiLCAiaXNJdGVtIiwgIml0ZW1Db21wb25lbnQiLCAiRW50aXR5SXRlbVN0YWNrVHJhaXQiLCAiQWRkSXRlbUFjdG9yUGFja2V0IiwgIml0ZW0iLCAiaXRlbVN0YWNrIiwgImZyb21GaXNoaW5nIiwgIkFkZEVudGl0eVBhY2tldCIsICJib2R5WWF3IiwgImF0dHJpYnV0ZXMiLCAiZ2V0IiwgIlJlbW92ZUVudGl0eVBhY2tldCIsICJkZWxldGUiLCAib25EZXNwYXduIiwgImNsZWFyIiwgImEiLCAiYiIsICJNYXRoIiwgInNxcnQiLCAicG93IiwgIngiLCAieSIsICJ6IiwgIlBsYXllckxpc3RBY3Rpb24iLCAiUGxheWVyTGlzdFBhY2tldCIsICJQbGF5ZXJMaXN0UmVjb3JkIiwgIlBsYXllckxpc3RUcmFpdCIsICJQbGF5ZXJUcmFpdCIsICJpZGVudGlmaWVyIiwgInR5cGVzIiwgIkVudGl0eUlkZW50aWZpZXIiLCAiUGxheWVyIiwgInBsYXllcnMiLCAiU2V0IiwgImNsZWFyIiwgInJlbW92ZSIsICJQbGF5ZXJMaXN0UGFja2V0IiwgImFjdGlvbiIsICJQbGF5ZXJMaXN0QWN0aW9uIiwgIlJlbW92ZSIsICJyZWNvcmRzIiwgIm1hcCIsICJ1dWlkIiwgIlBsYXllckxpc3RSZWNvcmQiLCAicGxheWVyIiwgInNlbmQiLCAib25UaWNrIiwgImlzQWxpdmUiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgImN1cnJlbnRUaWNrIiwgImdldFBsYXllcnMiLCAiYWRkaW5nIiwgImZpbHRlciIsICJoYXMiLCAiYWRkIiwgIkFkZCIsICJ1bmlxdWVJZCIsICJ4dWlkIiwgInVzZXJuYW1lIiwgInNraW4iLCAicGxhdGZvcm1CdWlsZCIsICJwbGF0Zm9ybUNoYXRJZGVudGlmaWVyIiwgImlzSG9zdCIsICJpc1Zpc2l0b3IiLCAiaXNUZWFjaGVyIiwgInJlbW92aW5nIiwgInNvbWUiLCAieCIsICJsZW5ndGgiLCAibWV0YWRhdGEiLCAidXBkYXRlIiwgImFiaWxpdGllcyIsICJkZWxldGUiLCAib25EZXNwYXduIiwgIkNvbnRhaW5lcklkIiwgIkNvbnRhaW5lclR5cGUiLCAiUGxheWVyQ3Vyc29yVHJhaXQiLCAiUGxheWVyVHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJjb250YWluZXIiLCAiY29udGFpbmVyVHlwZSIsICJDb250YWluZXJUeXBlIiwgIkludmVudG9yeSIsICJjb250YWluZXJJZCIsICJDb250YWluZXJJZCIsICJVaSIsICJpbnZlbnRvcnlTaXplIiwgInNlbGVjdGVkU2xvdCIsICJwbGF5ZXIiLCAiRW50aXR5Q29udGFpbmVyIiwgIkF0dHJpYnV0ZU5hbWUiLCAiUGxheWVyU2F0dXJhdGlvblRyYWl0IiwgIkVudGl0eUF0dHJpYnV0ZVRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAiYXR0cmlidXRlIiwgIkF0dHJpYnV0ZU5hbWUiLCAiUGxheWVyU2F0dXJhdGlvbiIsICJlZmZlY3RpdmVNYXgiLCAiZGVmYXVsdFZhbHVlIiwgImVmZmVjdGl2ZU1pbiIsICJBY3RvckRhbWFnZUNhdXNlIiwgIkF0dHJpYnV0ZU5hbWUiLCAiR2FtZW1vZGUiLCAiQXR0cmlidXRlTmFtZSIsICJQbGF5ZXJFeGhhdXN0aW9uVHJhaXQiLCAiRW50aXR5QXR0cmlidXRlVHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJhdHRyaWJ1dGUiLCAiQXR0cmlidXRlTmFtZSIsICJQbGF5ZXJFeGhhdXN0aW9uIiwgImVmZmVjdGl2ZU1heCIsICJkZWZhdWx0VmFsdWUiLCAiZWZmZWN0aXZlTWluIiwgIlBsYXllckh1bmdlclRyYWl0IiwgIkVudGl0eUF0dHJpYnV0ZVRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAic3RhcnZlYWJsZUdhbWVtb2RlcyIsICJHYW1lbW9kZSIsICJBZHZlbnR1cmUiLCAiU3Vydml2YWwiLCAiZWZmZWN0aXZlTWF4IiwgImVmZmVjdGl2ZU1pbiIsICJkZWZhdWx0VmFsdWUiLCAiYXR0cmlidXRlIiwgIkF0dHJpYnV0ZU5hbWUiLCAiUGxheWVySHVuZ2VyIiwgImV4aGF1c3Rpb25UcmFpdCIsICJzYXR1cmF0aW9uVHJhaXQiLCAidGltZXIiLCAiZW50aXR5IiwgImlzUGxheWVyIiwgInJlbW92ZVRyYWl0IiwgIm9uVGljayIsICJpc0FsaXZlIiwgImluY2x1ZGVzIiwgImdhbWVtb2RlIiwgInBsYXllckhlYWx0aFRyYWl0IiwgImdldFRyYWl0IiwgIkVudGl0eUhlYWx0aFRyYWl0IiwgImN1cnJlbnRWYWx1ZSIsICJzZXQiLCAiZXhoYXVzdCIsICJhcHBseURhbWFnZSIsICJ1bmRlZmluZWQiLCAiQWN0b3JEYW1hZ2VDYXVzZSIsICJTdGFydmUiLCAib25TcGF3biIsICJQbGF5ZXJFeGhhdXN0aW9uVHJhaXQiLCAiUGxheWVyU2F0dXJhdGlvblRyYWl0IiwgImFtb3VudCIsICJpbmNyZWFzZSIsICJkZWNyZWFzZSIsICJNYXRoIiwgIm1heCIsICJpc0h1bmdyeSIsICJBY3RvckZsYWciLCAiRW50aXR5R3Jhdml0eVRyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAib25TcGF3biIsICJlbnRpdHkiLCAiZmxhZ3MiLCAiaGFzIiwgIkFjdG9yRmxhZyIsICJIYXNHcmF2aXR5IiwgInNldCIsICJBY3RvckRhdGFJZCIsICJBY3RvckRhdGFUeXBlIiwgIkFjdG9yRmxhZyIsICJEYXRhSXRlbSIsICJHYW1lbW9kZSIsICJFbnRpdHlDb2xsaXNpb24iLCAiRW50aXR5VHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJoZWlnaHQiLCAid2lkdGgiLCAib25TcGF3biIsICJlbnRpdHkiLCAiZmxhZ3MiLCAiaGFzIiwgIkFjdG9yRmxhZyIsICJIYXNDb2xsaXNpb24iLCAic2V0IiwgIm1ldGFkYXRhIiwgIkFjdG9yRGF0YUlkIiwgIlJlc2VydmVkMDU0IiwgInNldEhlaWdodCIsICJSZXNlcnZlZDA1MyIsICJzZXRXaWR0aCIsICJvbkdhbWVtb2RlQ2hhbmdlIiwgImlzUGxheWVyIiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlIiwgIlNwZWN0YXRvciIsICJkYXRhIiwgIkRhdGFJdGVtIiwgIkFjdG9yRGF0YVR5cGUiLCAiRmxvYXQiLCAiQWN0b3JEYW1hZ2VDYXVzZSIsICJBY3RvckRhdGFJZCIsICJBY3RvckRhdGFUeXBlIiwgIkFjdG9yRmxhZyIsICJEYXRhSXRlbSIsICJFZmZlY3RUeXBlIiwgIkVudGl0eUFpclN1cHBseVRyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAib25UaWNrIiwgImVudGl0eSIsICJpc0FsaXZlIiwgImZsYWdzIiwgImdldCIsICJBY3RvckZsYWciLCAiQnJlYXRoaW5nIiwgImN1cnJlbnRBaXJUaWNrcyIsICJnZXRBaXJTdXBwbHlUaWNrcyIsICJjYW5CcmVhdGhlIiwgInNldEFpclN1cHBseVRpY2tzIiwgImhhc1RyYWl0IiwgIkVudGl0eUhlYWx0aFRyYWl0IiwgImdldFRyYWl0IiwgImFwcGx5RGFtYWdlIiwgInVuZGVmaW5lZCIsICJpc1N3aW1taW5nIiwgIkFjdG9yRGFtYWdlQ2F1c2UiLCAiRHJvd25pbmciLCAiU3VmZm9jYXRpb24iLCAiYmxvY2tBdEhlYWQiLCAiZGltZW5zaW9uIiwgImdldEJsb2NrIiwgInBvc2l0aW9uIiwgImZsb29yIiwgImlzTGlxdWlkIiwgImlzU29saWQiLCAiaGFzRWZmZWN0IiwgIkVmZmVjdFR5cGUiLCAiV2F0ZXJCcmVhdGhpbmciLCAib25TcGF3biIsICJoYXMiLCAic2V0IiwgIm1ldGFkYXRhIiwgIkFjdG9yRGF0YUlkIiwgIkFpclN1cHBseSIsICJhaXJTdXBwbHlEYXRhIiwgInZhbHVlIiwgInRpY2tzIiwgIkRhdGFJdGVtIiwgIkFjdG9yRGF0YVR5cGUiLCAiU2hvcnQiLCAiQWN0b3JEYXRhSWQiLCAiQWN0b3JEYXRhVHlwZSIsICJBY3RvckZsYWciLCAiRGF0YUl0ZW0iLCAiRW50aXR5TmFtZVRhZ1RyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAidHlwZXMiLCAiRW50aXR5SWRlbnRpZmllciIsICJQbGF5ZXIiLCAib25TcGF3biIsICJlbnRpdHkiLCAibWV0YWRhdGEiLCAiaGFzIiwgIkFjdG9yRGF0YUlkIiwgIk5hbWUiLCAibmFtZXRhZyIsICJpc1BsYXllciIsICJ1c2VybmFtZSIsICJTdHJpbmciLCAic2V0TmFtZVRhZyIsICJOYW1ldGFnQWx3YXlzU2hvdyIsICJzZXRWaXNpYmlsaXR5IiwgIm5hbWUiLCAiZGF0YSIsICJEYXRhSXRlbSIsICJBY3RvckRhdGFUeXBlIiwgInNldCIsICJnZXROYW1lVGFnIiwgImdldCIsICJ2YWx1ZSIsICJnZXRWaXNpYmlsaXR5IiwgInZpc2libGUiLCAiQnl0ZSIsICJmbGFncyIsICJBY3RvckZsYWciLCAiQWx3YXlzU2hvd05hbWUiLCAiRW50aXR5UGh5c2ljc1RyYWl0IiwgIkVudGl0eVRyYWl0IiwgImlkZW50aWZpZXIiLCAiZ3Jhdml0eSIsICJvblRpY2siLCAiZW50aXR5IiwgImlzQWxpdmUiLCAiaGFzR3Jhdml0eSIsICJoYXNUcmFpdCIsICJFbnRpdHlHcmF2aXR5VHJhaXQiLCAiZGltZW5zaW9uIiwgInZlbG9jaXR5IiwgInBvc2l0aW9uIiwgImhpdGJveFdpZHRoIiwgImhpdGJveEhlaWdodCIsICJpc1plcm8iLCAiaXNNb3ZpbmciLCAieSIsICJuZWdhdGUiLCAiYngiLCAiTWF0aCIsICJmbG9vciIsICJ4IiwgImJ5IiwgImJ6IiwgInoiLCAiZ2V0QmxvY2siLCAiaXNTb2xpZCIsICJhYnMiLCAiYmVsb3ciLCAiZ2V0VHlwZSIsICJmcmljdGlvbiIsICJyb3VuZCIsICJvbkdyb3VuZCIsICJMZXZlbEV2ZW50IiwgIkxldmVsRXZlbnRQYWNrZXQiLCAiTW9iRWZmZWN0RXZlbnRzIiwgIk1vYkVmZmVjdFBhY2tldCIsICJWZWN0b3IzZiIsICJFbnRpdHlFZmZlY3RzVHJhaXQiLCAiRW50aXR5VHJhaXQiLCAidHlwZSIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJpZGVudGlmaWVyIiwgImVmZmVjdHMiLCAiTWFwIiwgIm9uVGljayIsICJlZmZlY3QiLCAiZW50aXR5IiwgImlzRXhwaXJlZCIsICJkdXJhdGlvbiIsICJyZW1vdmUiLCAicGFydGljbGVJbnRlcnZhbCIsICJzaXplIiwgImdldFdvcmxkIiwgImN1cnJlbnRUaWNrIiwgImdldFBhcnRpY2xlRWZmZWN0IiwgInBhY2tldCIsICJMZXZlbEV2ZW50UGFja2V0IiwgImV2ZW50IiwgIkxldmVsRXZlbnQiLCAiUGFydGljbGVMZWdhY3lFdmVudCIsICJkYXRhIiwgImNvbG9yIiwgInRvSW50IiwgInBvc2l0aW9uIiwgInN1YnRyYWN0IiwgIlZlY3RvcjNmIiwgImRpbWVuc2lvbiIsICJicm9hZGNhc3QiLCAiZWZmZWN0VHlwZSIsICJoYXMiLCAiRWZmZWN0UmVtb3ZlU2lnbmFsIiwgImVtaXQiLCAiZ2V0IiwgIm9uUmVtb3ZlIiwgImRlbGV0ZSIsICJpc1BsYXllciIsICJNb2JFZmZlY3RQYWNrZXQiLCAicnVudGltZUlkIiwgImV2ZW50SWQiLCAiTW9iRWZmZWN0RXZlbnRzIiwgIkVmZmVjdFJlbW92ZSIsICJlZmZlY3RJZCIsICJwYXJ0aWNsZXMiLCAiYW1wbGlmaWVyIiwgImlucHV0VGljayIsICJzZW5kIiwgImFkZCIsICJvcHRpb25zIiwgInNob3dQYXJ0aWNsZXMiLCAiZWZmZWN0QnVpbGRlciIsICJlZmZlY3RQYWxldHRlIiwgImdldEVmZmVjdCIsICJNYXRoIiwgIm1heCIsICJFZmZlY3RBZGRTaWduYWwiLCAib25BZGQiLCAic2V0IiwgIkVmZmVjdEFkZCIsICJ2YWx1ZXMiLCAiZmlsdGVyIiwgImZsb29yIiwgInJhbmRvbSIsICJsZW5ndGgiLCAib25TcGF3biIsICJlbnRpdHlFZmZlY3RzIiwgImNvbXBvbmVudHMiLCAiZWZmZWN0RW50cnkiLCAib25EZXNwYXduIiwgIm1hcCIsICJ0b1N0cmluZyIsICJBY3RvckZsYWciLCAiRW50aXR5SW52aXNpYmlsaXR5VHJhaXQiLCAiRW50aXR5VHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJvblNwYXduIiwgImVudGl0eSIsICJmbGFncyIsICJoYXMiLCAiQWN0b3JGbGFnIiwgIkludmlzaWJsZSIsICJzZXQiLCAic2V0SW52aXNpYmlsaXR5IiwgInZhbHVlIiwgIkNvbnRhaW5lcklkIiwgIkNvbnRhaW5lclR5cGUiLCAiRW50aXR5RXF1aXBtZW50VHJhaXQiLCAiRW50aXR5VHJhaXQiLCAiaWRlbnRpZmllciIsICJ0eXBlcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgIlBsYXllciIsICJjb250YWluZXIiLCAiZW50aXR5IiwgIkVudGl0eUNvbnRhaW5lciIsICJDb250YWluZXJUeXBlIiwgIkFybW9yIiwgIkNvbnRhaW5lcklkIiwgInNldEVxdWlwbWVudCIsICJzbG90IiwgIml0ZW1TdGFjayIsICJzZXRJdGVtIiwgImdldEVxdWlwbWVudCIsICJnZXRJdGVtIiwgIm9uU3Bhd24iLCAiY29tcG9uZW50cyIsICJoYXMiLCAiZXF1aXBtZW50IiwgImdldCIsICJlbnRyeSIsICJJdGVtU3RhY2siLCAiYW1vdW50IiwgImF1eGlsbGFyeSIsICJ3b3JsZCIsICJnZXRXb3JsZCIsICJOdW1iZXIiLCAicGFyc2VJbnQiLCAib25EZXNwYXduIiwgInN0b3JhZ2UiLCAiaW5kZXhPZiIsICJnZXREYXRhRW50cnkiLCAic2V0IiwgImNvbnNvbGUiLCAiZGlyIiwgImRlcHRoIiwgIkluZmluaXR5IiwgImNvbG9ycyIsICJQcm9wZXJ0eVN5bmNEYXRhIiwgIlNldEFjdG9yRGF0YVBhY2tldCIsICJNZXRhZGF0YU1hcCIsICJNYXAiLCAiZW50aXR5IiwgInNldCIsICJrZXkiLCAidmFsdWUiLCAic2lnbmFsIiwgIkVudGl0eU1ldGFkYXRhVXBkYXRlU2lnbmFsIiwgImVtaXQiLCAicmVzdWx0IiwgImRhdGFJdGVtIiwgInVwZGF0ZSIsICJkZWxldGUiLCAiY2xlYXIiLCAicGFja2V0IiwgIlNldEFjdG9yRGF0YVBhY2tldCIsICJydW50aW1lRW50aXR5SWQiLCAicnVudGltZUlkIiwgImlucHV0VGljayIsICJpc1BsYXllciIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiY3VycmVudFRpY2siLCAiZGF0YSIsICJtZXRhZGF0YSIsICJ2YWx1ZXMiLCAicHJvcGVydGllcyIsICJQcm9wZXJ0eVN5bmNEYXRhIiwgImZsYWciLCAiZW5hYmxlZCIsICJmbGFncyIsICJzZXRGbGFnIiwgImJyb2FkY2FzdCIsICJQcm9wZXJ0eVN5bmNEYXRhIiwgIlNldEFjdG9yRGF0YVBhY2tldCIsICJBY3RvckZsYWdNYXAiLCAiTWFwIiwgImVudGl0eSIsICJzZXQiLCAia2V5IiwgInZhbHVlIiwgInNpZ25hbCIsICJFbnRpdHlGbGFnVXBkYXRlU2lnbmFsIiwgImVtaXQiLCAicmVzdWx0IiwgInVwZGF0ZSIsICJkZWxldGUiLCAiY2xlYXIiLCAicGFja2V0IiwgIlNldEFjdG9yRGF0YVBhY2tldCIsICJydW50aW1lRW50aXR5SWQiLCAicnVudGltZUlkIiwgImlucHV0VGljayIsICJpc1BsYXllciIsICJkaW1lbnNpb24iLCAid29ybGQiLCAiY3VycmVudFRpY2siLCAiZGF0YSIsICJtZXRhZGF0YSIsICJ2YWx1ZXMiLCAicHJvcGVydGllcyIsICJQcm9wZXJ0eVN5bmNEYXRhIiwgImZsYWciLCAiZW5hYmxlZCIsICJmbGFncyIsICJzZXRGbGFnIiwgImJyb2FkY2FzdCIsICJVcGRhdGVBdHRyaWJ1dGVzUGFja2V0IiwgIkF0dHJpYnV0ZU1hcCIsICJNYXAiLCAiZW50aXR5IiwgInNldCIsICJrZXkiLCAidmFsdWUiLCAic2lnbmFsIiwgIkVudGl0eUF0dHJpYnV0ZVVwZGF0ZVNpZ25hbCIsICJlbWl0IiwgInJlc3VsdCIsICJ1cGRhdGUiLCAiZGVsZXRlIiwgImNsZWFyIiwgInBhY2tldCIsICJVcGRhdGVBdHRyaWJ1dGVzUGFja2V0IiwgInJ1bnRpbWVBY3RvcklkIiwgInJ1bnRpbWVJZCIsICJpbnB1dFRpY2siLCAiaXNQbGF5ZXIiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgImN1cnJlbnRUaWNrIiwgImF0dHJpYnV0ZXMiLCAidmFsdWVzIiwgImJyb2FkY2FzdCIsICJBYmlsaXR5TGF5ZXJUeXBlIiwgIkFiaWxpdHlTZXQiLCAiU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQiLCAiVXBkYXRlQWJpbGl0aWVzUGFja2V0IiwgIkFiaWxpdHlNYXAiLCAiTWFwIiwgInBsYXllciIsICJzZXQiLCAia2V5IiwgInZhbHVlIiwgInNpZ25hbCIsICJQbGF5ZXJBYmlsaXR5VXBkYXRlU2lnbmFsIiwgImVtaXQiLCAicmVzdWx0IiwgInVwZGF0ZSIsICJkZWxldGUiLCAiY2xlYXIiLCAic3VwZXJTZXQiLCAicGFja2V0IiwgIlVwZGF0ZUFiaWxpdGllc1BhY2tldCIsICJwZXJtaXNzaW9uTGV2ZWwiLCAicGVybWlzc2lvbiIsICJjb21tYW5kUGVybWlzc2lvbkxldmVsIiwgImVudGl0eVVuaXF1ZUlkIiwgInVuaXF1ZUlkIiwgImFiaWxpdGllcyIsICJ0eXBlIiwgIkFiaWxpdHlMYXllclR5cGUiLCAiQmFzZSIsICJlbnRyaWVzIiwgIm1hcCIsICJhYmlsaXR5IiwgIkFiaWxpdHlTZXQiLCAid2Fsa1NwZWVkIiwgImZseVNwZWVkIiwgImRpbWVuc2lvbiIsICJicm9hZGNhc3QiLCAiaXNBbGl2ZSIsICJnYW1lbW9kZSIsICJTZXRQbGF5ZXJHYW1lVHlwZVBhY2tldCIsICJzZW5kIiwgIkVudGl0eSIsICJydW50aW1lSWQiLCAic2VyZW5pdHkiLCAidHlwZSIsICJ1bmlxdWVJZCIsICJwb3NpdGlvbiIsICJWZWN0b3IzZiIsICJ2ZWxvY2l0eSIsICJyb3RhdGlvbiIsICJSb3RhdGlvbiIsICJ0cmFpdHMiLCAiTWFwIiwgImNvbXBvbmVudHMiLCAibWV0YWRhdGEiLCAiTWV0YWRhdGFNYXAiLCAiZmxhZ3MiLCAiQWN0b3JGbGFnTWFwIiwgImF0dHJpYnV0ZXMiLCAiQXR0cmlidXRlTWFwIiwgInRhZ3MiLCAiU2V0IiwgInNjb3JlYm9hcmRJZGVudGl0eSIsICJkaW1lbnNpb24iLCAiaXNBbGl2ZSIsICJpc01vdmluZyIsICJvbkdyb3VuZCIsICJwcm9wZXJ0aWVzIiwgIndvcmxkIiwgIkVudGl0eVR5cGUiLCAiZW50aXR5UGFsZXR0ZSIsICJnZXRUeXBlIiwgImNyZWF0ZVVuaXF1ZUlkIiwgIm5ldHdvcmsiLCAic2V0IiwgInNwYXduUG9zaXRpb24iLCAiU2NvcmVib2FyZElkZW50aXR5IiwgImlzUGxheWVyIiwgImVudHJ5IiwgImxvYWREYXRhRW50cnkiLCAiaW5pdGlhbGl6ZSIsICJnZXRSZWdpc3RyeUZvciIsICJpZGVudGlmaWVyIiwgImNvbXBvbmVudCIsICJpbmNsdWRlcyIsICJzcGxpdCIsICJ0cmFpdCIsICJnZXRUcmFpdCIsICJwdXNoIiwgImhhc1RyYWl0IiwgImFkZFRyYWl0IiwgIkVudGl0eUlkZW50aWZpZXIiLCAiUGxheWVyIiwgImlzSXRlbSIsICJJdGVtIiwgImlzU25lYWtpbmciLCAiZ2V0IiwgIkFjdG9yRmxhZyIsICJTbmVha2luZyIsICJpc1NwcmludGluZyIsICJTcHJpbnRpbmciLCAiaXNTd2ltbWluZyIsICJTd2ltbWluZyIsICJhZGRFZmZlY3QiLCAiZWZmZWN0VHlwZSIsICJkdXJhdGlvbiIsICJvcHRpb25zIiwgIkVudGl0eUVmZmVjdHNUcmFpdCIsICJhZGQiLCAicmVtb3ZlRWZmZWN0IiwgImVmZmVjdFRyYWl0IiwgImhhcyIsICJyZW1vdmUiLCAiaGFzRWZmZWN0IiwgImdldFZpZXdEaXJlY3Rpb24iLCAicGl0Y2hSYWRpYW5zIiwgInBpdGNoIiwgIk1hdGgiLCAiUEkiLCAieWF3UmFkaWFucyIsICJoZWFkWWF3IiwgInNpbiIsICJjb3MiLCAicmVtb3ZlVHJhaXQiLCAib25SZW1vdmUiLCAiZGVsZXRlIiwgImdldFdvcmxkIiwgImxvZ2dlciIsICJ3YXJuIiwgIkVudGl0eVRyYWl0IiwgIm9uQWRkIiwgImluc3RhbmNlIiwgInJlYXNvbiIsICJlcnJvciIsICJnZXRDaHVuayIsICJjeCIsICJ4IiwgImN6IiwgInoiLCAiZ2V0SGVsZEl0ZW0iLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiZ2V0Q2FyZGluYWxEaXJlY3Rpb24iLCAiZmxvb3IiLCAieWF3IiwgIkNhcmRpbmFsRGlyZWN0aW9uIiwgIlNvdXRoIiwgIldlc3QiLCAiTm9ydGgiLCAiRWFzdCIsICJzcGF3biIsICJFbnRpdHlTcGF3bmVkU2lnbmFsIiwgImVtaXQiLCAiZW50aXRpZXMiLCAidmFsdWVzIiwgIm9uU3Bhd24iLCAidXBkYXRlIiwgImRlc3Bhd24iLCAiRW50aXR5RGVzcGF3bmVkU2lnbmFsIiwgIm9uRGVzcGF3biIsICJraWxsIiwgImRhbWFnaW5nRW50aXR5IiwgImRhbWFnZUNhdXNlIiwgIkVudGl0eURpZVNpZ25hbCIsICJjb250YWluZXIiLCAiaW52ZW50b3J5U2l6ZSIsICJzbG90IiwgIml0ZW0iLCAiZ2V0SXRlbSIsICJzcGF3bkl0ZW0iLCAiY2xlYXJTbG90IiwgIkVudGl0eUhlYWx0aFRyYWl0IiwgImhlYWx0aCIsICJjdXJyZW50VmFsdWUiLCAiZWZmZWN0aXZlTWluIiwgInNjaGVkdWxlIiwgIm9uIiwgImludGVyYWN0IiwgInBsYXllciIsICJtZXRob2QiLCAiRW50aXR5SW50ZXJhY3RNZXRob2QiLCAiSW50ZXJhY3QiLCAiUGxheWVySW50ZXJhY3RXaXRoRW50aXR5U2lnbmFsIiwgIkVudGl0eUhpdFNpZ25hbCIsICJvbkludGVyYWN0IiwgImdldENvbnRhaW5lciIsICJuYW1lIiwgImR5bmFtaWNJZCIsICJzdG9yYWdlIiwgIkl0ZW1CdW5kbGVUcmFpdCIsICJidW5kbGUiLCAiQ29udGFpbmVyTmFtZSIsICJBcm1vciIsICJFbnRpdHlFcXVpcG1lbnRUcmFpdCIsICJFcnJvciIsICJIb3RiYXIiLCAiSW52ZW50b3J5IiwgIkhvdGJhckFuZEludmVudG9yeSIsICJzZXRNb3Rpb24iLCAidmVjdG9yIiwgInkiLCAicGFja2V0IiwgIlNldEFjdG9yTW90aW9uUGFja2V0IiwgIm1vdGlvbiIsICJpbnB1dFRpY2siLCAiY3VycmVudFRpY2siLCAiYnJvYWRjYXN0IiwgImFkZE1vdGlvbiIsICJjbGVhck1vdGlvbiIsICJhcHBseUltcHVsc2UiLCAidGVsZXBvcnQiLCAiRW50aXR5RGltZW5zaW9uQ2hhbmdlU2lnbmFsIiwgIk1vdmVBY3RvckRlbHRhUGFja2V0IiwgIk1vdmVEZWx0YUZsYWdzIiwgIkFsbCIsICJPbkdyb3VuZCIsICJnZXRTZWxlY3RlZFNsb3QiLCAic2VsZWN0ZWRTbG90IiwgImRyb3BJdGVtIiwgImFtb3VudCIsICJ0YWtlSXRlbSIsICJoZWFkWWF3UmFkIiwgInBpdGNoUmFkIiwgImVudGl0eSIsICJoYXNUYWciLCAidGFnIiwgImdldFRhZ3MiLCAiYWRkVGFnIiwgInJlbW92ZVRhZyIsICJleGVjdXRlQ29tbWFuZCIsICJjb21tYW5kIiwgInN0YXJ0c1dpdGgiLCAic2xpY2UiLCAiQ29tbWFuZEV4ZWN1dGlvblN0YXRlIiwgImNvbW1hbmRzIiwgImdldEFsbCIsICJleGVjdXRlIiwgImdldERhdGFFbnRyeSIsICJlbnRyaWVzIiwgImtleXMiLCAib3ZlcndyaXRlIiwgImNsZWFyIiwgImtleSIsICJ2YWx1ZSIsICJ0cmFpdFR5cGUiLCAidW5pcXVlIiwgIkJpZ0ludCIsICJhYnMiLCAiRGF0ZSIsICJub3ciLCAiQWJpbGl0eUluZGV4IiwgIkNoYW5nZURpbWVuc2lvblBhY2tldCIsICJDb250YWluZXJOYW1lIiwgIkNyZWF0aXZlQ29udGVudFBhY2tldCIsICJEZWZhdWx0QWJpbGl0eVZhbHVlcyIsICJEaXNjb25uZWN0TWVzc2FnZSIsICJEaXNjb25uZWN0UGFja2V0IiwgIkRpc2Nvbm5lY3RSZWFzb24iLCAiR2FtZW1vZGUiLCAiTW92ZU1vZGUiLCAiTW92ZVBsYXllclBhY2tldCIsICJQZXJtaXNzaW9uTGV2ZWwiLCAiU2VyaWFsaXplZFNraW4iLCAiU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQiLCAiVGVsZXBvcnRDYXVzZSIsICJUZXh0UGFja2V0IiwgIlRleHRQYWNrZXRUeXBlIiwgIlRyYW5zZmVyUGFja2V0IiwgIkRldmljZU9TIiwgIklucHV0TW9kZSIsICJJbnRlcmFjdGlvbk1vZGUiLCAiTWVtb3J5VGllciIsICJQbGF5TW9kZSIsICJEZXZpY2UiLCAiaWRlbnRpZmllciIsICJtb2RlbCIsICJvcyIsICJtYXhWaWV3RGlzdGFuY2UiLCAibWVtb3J5VGllciIsICJpbnB1dE1vZGUiLCAiSW5wdXRNb2RlIiwgIlVua25vd24iLCAiaW50ZXJhY3Rpb25Nb2RlIiwgIkludGVyYWN0aW9uTW9kZSIsICJDbGFzc2ljIiwgInBsYXlNb2RlIiwgIlBsYXlNb2RlIiwgIk5vcm1hbCIsICJlbXB0eSIsICJEZXZpY2VPUyIsICJVbmRlZmluZWQiLCAiTWVtb3J5VGllciIsICJVbmRldGVybWluZWQiLCAiRGVmYXVsdFBsYXllclByb3BlcnRpZXMiLCAidXNlcm5hbWUiLCAieHVpZCIsICJ1dWlkIiwgInVuaXF1ZUlkIiwgImRldmljZSIsICJEZXZpY2UiLCAiZW1wdHkiLCAic2tpbiIsICJTZXJpYWxpemVkU2tpbiIsICJQbGF5ZXIiLCAiRW50aXR5IiwgImNvbm5lY3Rpb24iLCAidHJhaXRzIiwgIk1hcCIsICJhYmlsaXRpZXMiLCAiQWJpbGl0eU1hcCIsICJpbnB1dFRpY2siLCAicGVybWlzc2lvbiIsICJvcGVuZWRDb250YWluZXIiLCAiYmxvY2tUYXJnZXQiLCAiaXRlbVRhcmdldCIsICJlbnRpdHlUYXJnZXQiLCAiZ2FtZW1vZGUiLCAiY29tcG9uZW50cyIsICJoYXMiLCAic2V0IiwgIkdhbWVtb2RlIiwgIlN1cnZpdmFsIiwgImdldCIsICJ2YWx1ZSIsICJQbGF5ZXJHYW1lbW9kZUNoYW5nZVNpZ25hbCIsICJlbWl0IiwgInRyYWl0IiwgInZhbHVlcyIsICJvbkdhbWVtb2RlQ2hhbmdlIiwgIkFkdmVudHVyZSIsICJBYmlsaXR5SW5kZXgiLCAiTWF5Rmx5IiwgIkNyZWF0aXZlIiwgIlNwZWN0YXRvciIsICJwYWNrZXQiLCAiU2V0UGxheWVyR2FtZVR5cGVQYWNrZXQiLCAic2VuZCIsICJkaW1lbnNpb24iLCAicHJvcGVydGllcyIsICJFbnRpdHlJZGVudGlmaWVyIiwgInByb3BzIiwgInNlcmVuaXR5IiwgInBlcm1pc3Npb25zIiwgImVudHJ5IiwgImxvYWREYXRhRW50cnkiLCAid29ybGQiLCAiaW5pdGlhbGl6ZSIsICJlbnRpdHlQYWxldHRlIiwgImdldFJlZ2lzdHJ5Rm9yIiwgInR5cGUiLCAiaWRlbnRpZmllciIsICJoYXNUcmFpdCIsICJhZGRUcmFpdCIsICJhYmlsaXR5IiwgIk9iamVjdCIsICJlbnRyaWVzIiwgIkRlZmF1bHRBYmlsaXR5VmFsdWVzIiwgInBhY2tldHMiLCAibmV0d29yayIsICJzZW5kTm9ybWFsIiwgInNlbmRJbW1lZGlhdGUiLCAiaXNPcCIsICJQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3AiLCAiT3BlcmF0b3JDb21tYW5kcyIsICJUZWxlcG9ydCIsICJkZW9wIiwgIk1lbWJlciIsICJkaXNjb25uZWN0IiwgInJlYXNvbiIsICJjb2RlIiwgImhpZGVEaXNjb25uZWN0U2NyZWVuIiwgIkRpc2Nvbm5lY3RQYWNrZXQiLCAibWVzc2FnZSIsICJEaXNjb25uZWN0TWVzc2FnZSIsICJEaXNjb25uZWN0UmVhc29uIiwgIktpY2tlZCIsICJkZXNwYXduIiwgInNlbmRNZXNzYWdlIiwgIlRleHRQYWNrZXQiLCAiVGV4dFBhY2tldFR5cGUiLCAiUmF3IiwgIm5lZWRzVHJhbnNsYXRpb24iLCAic291cmNlIiwgInBhcmFtZXRlcnMiLCAicGxhdGZvcm1DaGF0SWQiLCAiZmlsdGVyZWQiLCAiZ2V0Q29udGFpbmVyIiwgIm5hbWUiLCAiZHluYW1pY0lkIiwgImNvbnRhaW5lciIsICJDb250YWluZXJOYW1lIiwgIkR5bmFtaWMiLCAiUGxheWVyQ3Vyc29yVHJhaXQiLCAiRXJyb3IiLCAiZ2V0VHJhaXQiLCAiaXRlbSIsICJzdG9yYWdlIiwgIkl0ZW1CdW5kbGVUcmFpdCIsICJidW5kbGUiLCAiQ3Vyc29yIiwgInNwYXduIiwgInVwZGF0ZSIsICJjb250ZW50IiwgIkNyZWF0aXZlQ29udGVudFBhY2tldCIsICJpdGVtcyIsICJnZXRXb3JsZCIsICJpdGVtUGFsZXR0ZSIsICJnZXRDcmVhdGl2ZUNvbnRlbnQiLCAibWFwIiwgIm1ldGFkYXRhIiwgInN0YWNrU2l6ZSIsICJuZXR3b3JrQmxvY2tJZCIsICJibG9jayIsICJwZXJtdXRhdGlvbnMiLCAiZXh0cmFzIiwgImNhbkRlc3Ryb3kiLCAiY2FuUGxhY2VPbiIsICJuYnQiLCAiY29tbWFuZHMiLCAic2VyaWFsaXplIiwgImZpbHRlciIsICJ4IiwgInBlcm1pc3Npb25MZXZlbCIsICJ0cmFuc2ZlciIsICJhZGRyZXNzIiwgInBvcnQiLCAicmVsb2FkIiwgIlRyYW5zZmVyUGFja2V0IiwgInJlbG9hZFdvcmxkIiwgInRlbGVwb3J0IiwgInBvc2l0aW9uIiwgInkiLCAieiIsICJFbnRpdHlEaW1lbnNpb25DaGFuZ2VTaWduYWwiLCAicHJvdmlkZXIiLCAid3JpdGVQbGF5ZXIiLCAiZ2V0RGF0YUVudHJ5IiwgImRhdGEiLCAicmVhZFBsYXllciIsICJjbGVhciIsICJmbGFncyIsICJDaGFuZ2VEaW1lbnNpb25QYWNrZXQiLCAicmVzcGF3biIsICJoYXNMb2FkaW5nU2NyZWVuIiwgIk1vdmVQbGF5ZXJQYWNrZXQiLCAicnVudGltZUlkIiwgInBpdGNoIiwgInJvdGF0aW9uIiwgInlhdyIsICJoZWFkWWF3IiwgIm1vZGUiLCAiTW92ZU1vZGUiLCAib25Hcm91bmQiLCAicmlkZGVuUnVudGltZUlkIiwgImNhdXNlIiwgIlRlbGVwb3J0Q2F1c2UiLCAia2V5cyIsICJhdHRyaWJ1dGVzIiwgInNjb3JlYm9hcmRJZGVudGl0eSIsICJvdmVyd3JpdGUiLCAia2V5IiwgInRyYWl0VHlwZSIsICJsb2dnZXIiLCAiZXJyb3IiLCAiZmxhZyIsICJhdHRyaWJ1dGUiLCAiRW50aXR5UGFsZXR0ZSIsICJ0eXBlcyIsICJFbnRpdHlUeXBlIiwgInRyYWl0cyIsICJNYXAiLCAicmVnaXN0cnkiLCAidHJhaXQiLCAiRW50aXR5VHJhaXRzIiwgInJlZ2lzdGVyVHJhaXQiLCAiZ2V0QWxsVHlwZXMiLCAidmFsdWVzIiwgImdldEFsbEN1c3RvbVR5cGVzIiwgImZpbHRlciIsICJ0eXBlIiwgIkN1c3RvbUVudGl0eVR5cGUiLCAiZ2V0VHlwZSIsICJpZGVudGlmaWVyIiwgImdldCIsICJnZXRUeXBlQnlVbmlxdWUiLCAidW5pcXVlIiwgIm5ldHdvcmsiLCAiTnVtYmVyIiwgInJlZ2lzdGVyVHlwZSIsICJoYXMiLCAic2V0IiwgIkVudGl0eUVudW0iLCAib3B0aW9ucyIsICJwdXNoIiwgImdldFJlZ2lzdHJ5Rm9yIiwgInJlbW92ZVRyYWl0IiwgImMiLCAiZGVsZXRlIiwgImdldEFsbFRyYWl0cyIsICJnZXRUcmFpdCIsICJFbnRpdHlUcmFpdHMiLCAiQXJyYXkiLCAia2V5IiwgIlRyYWl0cyIsICJ0cmFpdCIsICJwdXNoIiwgIkludmVudG9yeVRyYW5zYWN0aW9uSGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIkludmVudG9yeVRyYW5zYWN0aW9uIiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJnZXRQbGF5ZXJCeUNvbm5lY3Rpb24iLCAiZGlzY29ubmVjdCIsICJ0cmFuc2FjdGlvbiIsICJ0eXBlIiwgIkNvbXBsZXhJbnZlbnRvcnlUcmFuc2FjdGlvbiIsICJOb3JtYWxUcmFuc2FjdGlvbiIsICJoYW5kbGVOb3JtYWxUcmFuc2FjdGlvbiIsICJhY3Rpb25zIiwgIkl0ZW1Vc2VUcmFuc2FjdGlvbiIsICJpdGVtVXNlIiwgIkVycm9yIiwgImhhbmRsZUl0ZW1Vc2VUcmFuc2FjdGlvbiIsICJJdGVtVXNlT25FbnRpdHlUcmFuc2FjdGlvbiIsICJpdGVtVXNlT25FbnRpdHkiLCAiaGFuZGxlSXRlbVVzZU9uRW50aXR5VHJhbnNhY3Rpb24iLCAiSXRlbVJlbGVhc2VUcmFuc2FjdGlvbiIsICJjb25zb2xlIiwgImxvZyIsICJhY3Rpb24iLCAic291cmNlIiwgImxvZ2dlciIsICJkZWJ1ZyIsICJJbnZlbnRvcnlTb3VyY2VUeXBlIiwgIkNvbnRhaW5lckludmVudG9yeSIsICJXb3JsZEludGVyYWN0aW9uIiwgImFtb3VudCIsICJuZXdJdGVtIiwgInN0YWNrU2l6ZSIsICJpbnZlbnRvcnkiLCAiZ2V0VHJhaXQiLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiaXRlbVN0YWNrIiwgImNvbnRhaW5lciIsICJnZXRJdGVtIiwgInNsb3QiLCAiUGxheWVyRHJvcEl0ZW1TaWduYWwiLCAiZW1pdCIsICJ1cGRhdGUiLCAiZHJvcEl0ZW0iLCAic2VsZWN0ZWRTbG90IiwgImRpbWVuc2lvbiIsICJJdGVtVXNlSW52ZW50b3J5VHJhbnNhY3Rpb25UeXBlIiwgIlBsYWNlIiwgImludGVyYWN0aW5nIiwgImdldEJsb2NrIiwgImJsb2NrUG9zaXRpb24iLCAiaW5pdGlhbFRyYW5zYWN0aW9uIiwgImludGVyYWN0IiwgImlzQWlyIiwgIm9wZW5lZENvbnRhaW5lciIsICJpdGVtVGFyZ2V0IiwgInN0YWNrIiwgIm5ldHdvcmsiLCAiaXRlbSIsICJibG9ja1R5cGUiLCAiYmxvY2siLCAiaWRlbnRpZmllciIsICJCbG9ja0lkZW50aWZpZXIiLCAiQWlyIiwgInJlc3VsdCIsICJmYWNlIiwgIm9sZFBlcm11dGF0aW9uIiwgImdldFBlcm11dGF0aW9uIiwgInBlcm11dGF0aW9uIiwgInBlcm11dGF0aW9ucyIsICJhdXhpbGxhcnkiLCAic2lnbmFsIiwgIlBsYXllclBsYWNlQmxvY2tTaWduYWwiLCAiY2xpY2tQb3NpdGlvbiIsICJjb21wb25lbnRzIiwgImhhcyIsICJlbnRyeSIsICJnZXQiLCAibG9hZERhdGFFbnRyeSIsICJnZXRXb3JsZCIsICJzZXRQZXJtdXRhdGlvbiIsICJwbGFjZUNhbmNlbGVkIiwgInRyYWl0IiwgInRyYWl0cyIsICJ2YWx1ZXMiLCAic3VjY2VzcyIsICJvblBsYWNlIiwgInVuZGVmaW5lZCIsICJtZXRob2QiLCAiSXRlbVVzZU1ldGhvZCIsICJ0YXJnZXRCbG9jayIsICJ1c2VTdWNjZXNzIiwgInVzZSIsICJQbGF5ZXJVc2VJdGVtU2lnbmFsIiwgInNvdW5kIiwgIkxldmVsU291bmRFdmVudFBhY2tldCIsICJldmVudCIsICJMZXZlbFNvdW5kRXZlbnQiLCAicG9zaXRpb24iLCAiQmxvY2tQb3NpdGlvbiIsICJ0b1ZlY3RvcjNmIiwgImRhdGEiLCAiYWN0b3JJZGVudGlmaWVyIiwgIlN0cmluZyIsICJpc0JhYnlNb2IiLCAiaXNHbG9iYWwiLCAiYnJvYWRjYXN0IiwgImdhbWVtb2RlIiwgIkdhbWVtb2RlIiwgIlN1cnZpdmFsIiwgImRlY3JlbWVudCIsICJpbmNyZW1lbnQiLCAiVXNlIiwgImdldEhlbGRJdGVtIiwgIkNsaWNrIiwgIkRlc3Ryb3kiLCAiZW50aXR5IiwgImdldEVudGl0eSIsICJhY3RvclJ1bnRpbWVJZCIsICJ0YXJnZXRFbnRpdHkiLCAiQ29udGFpbmVyTmFtZSIsICJQYWNrZXQiLCAiSXRlbVN0YWNrUmVxdWVzdEhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJJdGVtU3RhY2tSZXF1ZXN0IiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJwbGF5ZXJzIiwgImdldCIsICJkaXNjb25uZWN0IiwgInJlcXVlc3QiLCAicmVxdWVzdHMiLCAiYWN0aW9uIiwgImFjdGlvbnMiLCAidGFrZU9yUGxhY2UiLCAic291cmNlQ29udGFpbmVyIiwgInNvdXJjZSIsICJjb250YWluZXIiLCAiZGVzdGluYXRpb25Db250YWluZXIiLCAiZGVzdGluYXRpb24iLCAic291cmNlU2xvdCIsICJzbG90IiwgImRlc3RpbmF0aW9uU2xvdCIsICJhbW91bnQiLCAiaWRlbnRpZmllciIsICJDb250YWluZXJOYW1lIiwgIkNyZWF0aXZlT3V0cHV0IiwgImdldENvbnRhaW5lciIsICJkeW5hbWljSWRlbnRpZmllciIsICJFcnJvciIsICJzb3VyY2VJdGVtIiwgImdldEl0ZW0iLCAiZGVzdGluYXRpb25JdGVtIiwgIml0ZW0iLCAidGFrZUl0ZW0iLCAiaW5jcmVtZW50IiwgInNldEl0ZW0iLCAiY3Vyc29yIiwgImdldFRyYWl0IiwgIlBsYXllckN1cnNvclRyYWl0IiwgImNsZWFyU2xvdCIsICJkcm9wIiwgImRyb3BJdGVtIiwgInN3YXAiLCAic3dhcEl0ZW1zIiwgImRlc3Ryb3lPckNvbnN1bWUiLCAiQ3Vyc29yIiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgImNyYWZ0UmVjaXBlIiwgIml0ZW1JbnN0YW5jZUFjdGlvbiIsICJyZXN1bHRzRGVwcmVjYXRlZCIsICJkZXNjcmlwdG9ycyIsICJyZXN1bHRhbnRzIiwgImRlc3RpbmF0aW9uQWN0aW9uIiwgImF0IiwgImRlc2NyaXB0b3IiLCAiaXRlbVN0YWNrIiwgIkl0ZW1TdGFjayIsICJmcm9tTmV0d29ya0luc3RhbmNlIiwgInNldEFtb3VudCIsICJhZGRJdGVtIiwgImNyYWZ0Q3JlYXRpdmUiLCAiY3JhZnQiLCAid29ybGQiLCAiZGltZW5zaW9uIiwgImNyZWF0aXZlSXRlbSIsICJpdGVtUGFsZXR0ZSIsICJnZXRDcmVhdGl2ZUNvbnRlbnRCeUluZGV4IiwgImNyZWF0aXZlSW5kZXgiLCAidHlwZSIsICJEaXNjb25uZWN0UmVhc29uIiwgIlBhY2tldCIsICJQbGF5U3RhdHVzIiwgIlBsYXlTdGF0dXNQYWNrZXQiLCAiUmVzb3VyY2VQYWNrc0luZm9QYWNrZXQiLCAiU2VyaWFsaXplZFNraW4iLCAiY3JlYXRlRGVjb2RlciIsICJMb2dpbkhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJMb2dpbiIsICJkZWNvZGVyIiwgImNyZWF0ZURlY29kZXIiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAidG9rZW5zIiwgImRlY29kZSIsICJ4dWlkIiwgImlkZW50aXR5RGF0YSIsICJYVUlEIiwgInV1aWQiLCAiaWRlbnRpdHkiLCAidXNlcm5hbWUiLCAiZGlzcGxheU5hbWUiLCAibGVuZ3RoIiwgIm5ldHdvcmsiLCAiZGlzY29ubmVjdENvbm5lY3Rpb24iLCAiRGlzY29ubmVjdFJlYXNvbiIsICJJbnZhbGlkVGVuYW50IiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5WHVpZCIsICJkaXNjb25uZWN0IiwgIkxvZ2dlZEluT3RoZXJMb2NhdGlvbiIsICJ3b3JsZCIsICJnZXRXb3JsZCIsICJXb3JsZENvcnJ1cHRpb24iLCAiZGltZW5zaW9uIiwgImdldERpbWVuc2lvbiIsICJkZXZpY2UiLCAiRGV2aWNlIiwgImNsaWVudERhdGEiLCAiRGV2aWNlSWQiLCAiRGV2aWNlTW9kZWwiLCAiRGV2aWNlT1MiLCAiTWF4Vmlld0Rpc3RhbmNlIiwgIk1lbW9yeVRpZXIiLCAiZGF0YSIsICJwcm92aWRlciIsICJyZWFkUGxheWVyIiwgInNraW4iLCAiU2VyaWFsaXplZFNraW4iLCAiZnJvbSIsICJwcm9wZXJ0aWVzIiwgInVuaXF1ZUlkIiwgImVudHJ5IiwgInBsYXllciIsICJQbGF5ZXIiLCAicGxheWVycyIsICJzZXQiLCAiUGxheWVySm9pblNpZ25hbCIsICJlbWl0IiwgIktpY2tlZCIsICJsb2dpbiIsICJQbGF5U3RhdHVzUGFja2V0IiwgInN0YXR1cyIsICJQbGF5U3RhdHVzIiwgIkxvZ2luU3VjY2VzcyIsICJwYWNrcyIsICJSZXNvdXJjZVBhY2tzSW5mb1BhY2tldCIsICJtdXN0QWNjZXB0IiwgImhhc0FkZG9ucyIsICJoYXNTY3JpcHRzIiwgImxvZ2dlciIsICJpbmZvIiwgInNlbmQiLCAiY2xpZW50IiwgImRlY29kZWRDaGFpbnMiLCAiSlNPTiIsICJwYXJzZSIsICJjaGFpbiIsICJtYXAiLCAiZmluZCIsICJleHRyYURhdGEiLCAidW5kZWZpbmVkIiwgInB1YmxpY0tleSIsICJpZGVudGl0eVB1YmxpY0tleSIsICJNb2JFcXVpcG1lbnRQYWNrZXQiLCAiTmV0d29ya0l0ZW1TdGFja0Rlc2NyaXB0b3IiLCAiUGFja2V0IiwgIk1vYkVxdWlwbWVudEhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJNb2JFcXVpcG1lbnQiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgImludmVudG9yeSIsICJnZXRUcmFpdCIsICJFbnRpdHlJbnZlbnRvcnlUcmFpdCIsICJzZWxlY3RlZFNsb3QiLCAiaXRlbSIsICJnZXRIZWxkSXRlbSIsICJ1cGRhdGUiLCAiTW9iRXF1aXBtZW50UGFja2V0IiwgInJ1bnRpbWVFbnRpdHlJZCIsICJydW50aW1lSWQiLCAic2xvdCIsICJjb250YWluZXJJZCIsICJjb250YWluZXIiLCAiaWRlbnRpZmllciIsICJOZXR3b3JrSXRlbVN0YWNrRGVzY3JpcHRvciIsICJJdGVtU3RhY2siLCAidG9OZXR3b3JrU3RhY2siLCAiZGltZW5zaW9uIiwgImJyb2FkY2FzdEV4Y2VwdCIsICJQYWNrZXQiLCAiUGxheWVyQWN0aW9uVHlwZSIsICJQbGF5ZXJBY3Rpb25IYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiUGxheWVyQWN0aW9uIiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJnZXRQbGF5ZXJCeUNvbm5lY3Rpb24iLCAiZGlzY29ubmVjdCIsICJhY3Rpb24iLCAibG9nZ2VyIiwgImRlYnVnIiwgIlBsYXllckFjdGlvblR5cGUiLCAiU3RhcnRJdGVtVXNlT24iLCAiaXRlbVRhcmdldCIsICJnZXRIZWxkSXRlbSIsICJTdG9wSXRlbVVzZU9uIiwgIkNyZWF0aXZlRGVzdHJveUJsb2NrIiwgIkFiaWxpdHlJbmRleCIsICJBY3RvckZsYWciLCAiQmxvY2tQb3NpdGlvbiIsICJHYW1lbW9kZSIsICJJbnB1dERhdGEiLCAiSXRlbVN0YWNrUmVxdWVzdEFjdGlvblR5cGUiLCAiTGV2ZWxFdmVudCIsICJMZXZlbEV2ZW50UGFja2V0IiwgIlBhY2tldCIsICJQbGF5ZXJBY3Rpb25UeXBlIiwgIlVwZGF0ZUJsb2NrRmxhZ3NUeXBlIiwgIlVwZGF0ZUJsb2NrTGF5ZXJUeXBlIiwgIlVwZGF0ZUJsb2NrUGFja2V0IiwgIlBsYXllckF1dGhJbnB1dEhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJQbGF5ZXJBdXRoSW5wdXQiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgInBvc2l0aW9uIiwgIngiLCAieSIsICJ6IiwgInJvdGF0aW9uIiwgInBpdGNoIiwgInlhdyIsICJoZWFkWWF3IiwgImRldmljZSIsICJpbnB1dE1vZGUiLCAiaW50ZXJhY3Rpb25Nb2RlIiwgInBsYXlNb2RlIiwgImZsb29yIiwgInBlcm11dGF0aW9uIiwgImRpbWVuc2lvbiIsICJnZXRQZXJtdXRhdGlvbiIsICJvbkdyb3VuZCIsICJ0eXBlIiwgInNvbGlkIiwgImlucHV0VGljayIsICJpc01vdmluZyIsICJibG9ja0FjdGlvbnMiLCAiaXRlbVN0YWNrUmVxdWVzdCIsICJhY3Rpb24iLCAiYWN0aW9ucyIsICJmaW5kIiwgIkl0ZW1TdGFja1JlcXVlc3RBY3Rpb25UeXBlIiwgIlNjcmVlbkhVRE1pbmVCbG9jayIsICJtaW5lQmxvY2siLCAiaGFuZGxlQmxvY2tBY3Rpb25zIiwgImhhbmRsZUFjdG9yQWN0aW9ucyIsICJpbnB1dERhdGEiLCAiZ2V0RmxhZ3MiLCAiSW5wdXREYXRhIiwgIlN0YXJ0U25lYWtpbmciLCAiU3RvcFNuZWFraW5nIiwgInNuZWFraW5nIiwgImZsYWdzIiwgImdldCIsICJBY3RvckZsYWciLCAiU25lYWtpbmciLCAic2V0IiwgIlN0YXJ0U3ByaW50aW5nIiwgIlN0b3BTcHJpbnRpbmciLCAic3ByaW50aW5nIiwgIlNwcmludGluZyIsICJTdGFydFN3aW1taW5nIiwgIlN0b3BTd2ltbWluZyIsICJzd2ltbWluZyIsICJTd2ltbWluZyIsICJTdGFydENyYXdsaW5nIiwgIlN0b3BDcmF3bGluZyIsICJjcmF3bGluZyIsICJDcmF3bGluZyIsICJTdGFydEdsaWRpbmciLCAiU3RvcEdsaWRpbmciLCAiZ2xpZGluZyIsICJHbGlkaW5nIiwgIlN0YXJ0Rmx5aW5nIiwgIlN0b3BGbHlpbmciLCAiZmx5aW5nIiwgImFiaWxpdGllcyIsICJBYmlsaXR5SW5kZXgiLCAiRmx5aW5nIiwgIm1heUZseSIsICJNYXlGbHkiLCAicmVxdWVzdCIsICJsb2dnZXIiLCAiZGVidWciLCAiUGxheWVyQWN0aW9uVHlwZSIsICJDb250aW51ZURlc3Ryb3lCbG9jayIsICJTdGFydERlc3Ryb3lCbG9jayIsICJnYW1lbW9kZSIsICJHYW1lbW9kZSIsICJDcmVhdGl2ZSIsICJibG9ja1RhcmdldCIsICJ0cmFpdCIsICJnZXRCbG9jayIsICJ0cmFpdHMiLCAidmFsdWVzIiwgIm9uU3RvcEJyZWFrIiwgIkxldmVsRXZlbnRQYWNrZXQiLCAiZXZlbnQiLCAiTGV2ZWxFdmVudCIsICJTdG9wQmxvY2tDcmFja2luZyIsICJCbG9ja1Bvc2l0aW9uIiwgInRvVmVjdG9yM2YiLCAiZGF0YSIsICJicm9hZGNhc3QiLCAiYmxvY2siLCAiaXNBaXIiLCAiVXBkYXRlQmxvY2tQYWNrZXQiLCAibGF5ZXIiLCAiVXBkYXRlQmxvY2tMYXllclR5cGUiLCAiTm9ybWFsIiwgIlVwZGF0ZUJsb2NrRmxhZ3NUeXBlIiwgIk5ldHdvcmsiLCAibmV0d29ya0Jsb2NrSWQiLCAibmV0d29yayIsICJzZW5kIiwgImNhbmNlbGVkIiwgInN1Y2Nlc3MiLCAib25TdGFydEJyZWFrIiwgInVuZGVmaW5lZCIsICJoZWxkSXRlbSIsICJnZXRIZWxkSXRlbSIsICJicmVha1RpbWUiLCAiZ2V0QnJlYWtUaW1lIiwgIlN0YXJ0QmxvY2tDcmFja2luZyIsICJtZXRob2QiLCAiSXRlbVVzZU1ldGhvZCIsICJCcmVhayIsICJQbGF5ZXJTdGFydFVzaW5nSXRlbVNpZ25hbCIsICJlbWl0IiwgIm9uU3RhcnRVc2UiLCAiaXRlbVRhcmdldCIsICJBYm9ydERlc3Ryb3lCbG9jayIsICJQbGF5ZXJTdG9wVXNpbmdJdGVtU2lnbmFsIiwgIm9uU3RvcFVzZSIsICJQcmVkaWN0RGVzdHJveUJsb2NrIiwgInNpZ25hbCIsICJQbGF5ZXJCcmVha0Jsb2NrU2lnbmFsIiwgImRlc3Ryb3kiLCAic3RhY2siLCAiVXNlIiwgInByZWRpY3RlZER1cmFiaWxpdHkiLCAidGFyZ2V0QmxvY2siLCAidXNlIiwgIlBsYXllclVzZUl0ZW1TaWduYWwiLCAiUGFja2V0IiwgIkNodW5rUmFkaXVzVXBkYXRlUGFja2V0IiwgIlJlcXVlc3RDaHVua1JhZGl1c0hhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJSZXF1ZXN0Q2h1bmtSYWRpdXMiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgInBsYXllcnMiLCAiZ2V0IiwgImRpc2Nvbm5lY3QiLCAibWF4Vmlld0Rpc3RhbmNlIiwgImRpbWVuc2lvbiIsICJ2aWV3RGlzdGFuY2UiLCAicmFkaXVzIiwgInRyYWl0IiwgImdldFRyYWl0IiwgIlBsYXllckNodW5rUmVuZGVyaW5nVHJhaXQiLCAiZGlzdGFuY2UiLCAiZGV2aWNlIiwgInVwZGF0ZSIsICJDaHVua1JhZGl1c1VwZGF0ZVBhY2tldCIsICJzZW5kSW1tZWRpYXRlIiwgIkRpc2Nvbm5lY3RSZWFzb24iLCAiTmV0d29ya1NldHRpbmdzUGFja2V0IiwgIlBhY2tldCIsICJQUk9UT0NPTF9WRVJTSU9OIiwgIlJlcXVlc3ROZXR3b3JrU2V0dGluZ3NIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiUmVxdWVzdE5ldHdvcmtTZXR0aW5ncyIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJQUk9UT0NPTF9WRVJTSU9OIiwgInByb3RvY29sIiwgIm5ldHdvcmsiLCAiZGlzY29ubmVjdENvbm5lY3Rpb24iLCAiRGlzY29ubmVjdFJlYXNvbiIsICJPdXRkYXRlZENsaWVudCIsICJPdXRkYXRlZFNlcnZlciIsICJzZXR0aW5ncyIsICJOZXR3b3JrU2V0dGluZ3NQYWNrZXQiLCAiY29tcHJlc3Npb25UaHJlc2hvbGQiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJjb21wcmVzc2lvbk1ldGhvZCIsICJjbGllbnRUaHJvdHRsZSIsICJjbGllbnRUaHJlc2hvbGQiLCAiY2xpZW50U2NhbGFyIiwgInNlbmROb3JtYWwiLCAic2V0Q29tcHJlc3Npb24iLCAiQXZhaWxhYmxlQWN0b3JJZGVudGlmaWVyc1BhY2tldCIsICJEaWZmaWN1bHR5IiwgIk1JTkVDUkFGVF9WRVJTSU9OIiwgIlBhY2tldCIsICJQbGF5U3RhdHVzIiwgIlBsYXlTdGF0dXNQYWNrZXQiLCAiUmVzb3VyY2VQYWNrUmVzcG9uc2UiLCAiUmVzb3VyY2VQYWNrU3RhY2tQYWNrZXQiLCAiU3RhcnRHYW1lUGFja2V0IiwgIkNvbXBvdW5kVGFnIiwgIlRhZyIsICJSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZUhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZSIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAid29ybGQiLCAiZGltZW5zaW9uIiwgInJlc3BvbnNlIiwgImxvZ2dlciIsICJkZWJ1ZyIsICJSZXNvdXJjZVBhY2tSZXNwb25zZSIsICJIYXZlQWxsUGFja3MiLCAic3RhY2siLCAiUmVzb3VyY2VQYWNrU3RhY2tQYWNrZXQiLCAibXVzdEFjY2VwdCIsICJiZWhhdmlvclBhY2tzIiwgImdhbWVWZXJzaW9uIiwgIk1JTkVDUkFGVF9WRVJTSU9OIiwgImV4cGVyaW1lbnRzIiwgImV4cGVyaW1lbnRzUHJldmlvdXNseVRvZ2dsZWQiLCAiaGFzRWRpdG9yUGFja3MiLCAidGV4dHVyZVBhY2tzIiwgInNlbmQiLCAiQ29tcGxldGVkIiwgIlN0YXJ0R2FtZVBhY2tldCIsICJlbnRpdHlJZCIsICJ1bmlxdWVJZCIsICJydW50aW1lRW50aXR5SWQiLCAicnVudGltZUlkIiwgInBsYXllckdhbWVtb2RlIiwgImdhbWVtb2RlIiwgInBsYXllclBvc2l0aW9uIiwgInBvc2l0aW9uIiwgInBpdGNoIiwgInJvdGF0aW9uIiwgInlhdyIsICJzZWVkIiwgIkJpZ0ludCIsICJnZW5lcmF0b3IiLCAicHJvcGVydGllcyIsICJiaW9tZVR5cGUiLCAiYmlvbWVOYW1lIiwgInR5cGUiLCAid29ybGRHYW1lbW9kZSIsICJoYXJkY29yZSIsICJkaWZmaWN1bHR5IiwgIkRpZmZpY3VsdHkiLCAiRWFzeSIsICJzcGF3blBvc2l0aW9uIiwgImFjaGlldmVtZW50c0Rpc2FibGVkIiwgImVkaXRvcldvcmxkVHlwZSIsICJjcmVhdGVkSW5FZGlvciIsICJleHBvcnRlZEZyb21FZGlvciIsICJkYXlDeWNsZVN0b3BUaW1lIiwgImRheVRpbWUiLCAiZWR1T2ZmZXIiLCAiZWR1RmVhdHVyZXMiLCAiZWR1UHJvZHVjdFV1aWQiLCAicmFpbkxldmVsIiwgImxpZ2h0bmluZ0xldmVsIiwgImNvbmZpcm1lZFBsYXRmb3JtTG9ja2VkQ29udGVudCIsICJtdWx0aXBsYXllckdhbWUiLCAiYnJvYWRjYXN0VG9MYW4iLCAieGJsQnJvYWRjYXN0TW9kZSIsICJwbGF0Zm9ybUJyb2FkY2FzdE1vZGUiLCAiY29tbWFuZHNFbmFibGVkIiwgInRleHR1cmVQYWNrc1JlcXVpcmVkIiwgImdhbWVydWxlcyIsICJuYW1lIiwgImVkaXRhYmxlIiwgInZhbHVlIiwgImJvbnVzQ2hlc3QiLCAibWFwRW5hYmxlZCIsICJwZXJtaXNzaW9uTGV2ZWwiLCAicGVybWlzc2lvbiIsICJzZXJ2ZXJDaHVua1RpY2tSYW5nZSIsICJzaW11bGF0aW9uRGlzdGFuY2UiLCAiaGFzTG9ja2VkQmVoYXZpb3JQYWNrIiwgImhhc0xvY2tlZFJlc291cmNlUGFjayIsICJpc0Zyb21Mb2NrZWRXb3JsZFRlbXBsYXRlIiwgInVzZU1zYUdhbWVydGFnc09ubHkiLCAiaXNGcm9tV29ybGRUZW1wbGF0ZSIsICJpc1dvcmxkVGVtcGxhdGVPcHRpb25Mb2NrZWQiLCAib25seVNwYXduVjFWaWxsYWdlcnMiLCAicGVyc29uYURpc2FibGVkIiwgImN1c3RvbVNraW5zRGlzYWJsZWQiLCAiZW1vdGVDaGF0TXV0ZWQiLCAibGltaXRlZFdvcmxkV2lkdGgiLCAibGltaXRlZFdvcmxkTGVuZ3RoIiwgImlzTmV3TmV0aGVyIiwgImVkdVJlc291cmNlVXJpQnV0dG9uTmFtZSIsICJlZHVSZXNvdXJjZVVyaUxpbmsiLCAiZXhwZXJpbWVudGFsR2FtZXBsYXlPdmVycmlkZSIsICJjaGF0UmVzdHJpY3Rpb25MZXZlbCIsICJkaXNhYmxlUGxheWVySW50ZXJhY3Rpb25zIiwgInNlcnZlcklkZW50ZmllciIsICJ3b3JsZElkZW50aWZpZXIiLCAiaWRlbnRpZmllciIsICJzY2VuYXJpb0lkZW50aWZpZXIiLCAibGV2ZWxJZCIsICJ3b3JsZE5hbWUiLCAicHJlbWl1bVdvcmxkVGVtcGxhdGVJZCIsICJpc1RyaWFsIiwgIm1vdmVtZW50QXV0aG9yaXR5IiwgInJld2luZEhpc3RvcnlTaXplIiwgInNlcnZlckF1dGhvcml0YXRpdmVCbG9ja0JyZWFraW5nIiwgImN1cnJlbnRUaWNrIiwgImVuY2hhbnRtZW50U2VlZCIsICJibG9ja1Byb3BlcnRpZXMiLCAiYmxvY2tQYWxldHRlIiwgImdldEFsbEN1c3RvbVR5cGVzIiwgIm1hcCIsICJibG9jayIsICJDdXN0b21CbG9ja1R5cGUiLCAidG9CbG9ja1Byb3BlcnR5IiwgIml0ZW1zIiwgIml0ZW1QYWxldHRlIiwgImdldEFsbFR5cGVzIiwgIml0ZW0iLCAiSXRlbVR5cGUiLCAidG9JdGVtRGF0YSIsICJtdWx0aXBsYXllckNvcnJlbGF0aW9uSWQiLCAic2VydmVyQXV0aG9yaXRhdGl2ZUludmVudG9yeSIsICJlbmdpbmUiLCAicHJvcGVydHlEYXRhMSIsICJwcm9wZXJ0eURhdGEyIiwgInByb3BlcnR5RGF0YTMiLCAiYmxvY2tQYWxldHRlQ2hlY2tzdW0iLCAid29ybGRUZW1wbGF0ZUlkIiwgImNsaWVudFNpZGVHZW5lcmF0aW9uIiwgImJsb2NrTmV0d29ya0lkc0FyZUhhc2hlcyIsICJzZXJ2ZXJDb250cm9sbGVkU291bmRzIiwgImFjdG9ycyIsICJBdmFpbGFibGVBY3RvcklkZW50aWZpZXJzUGFja2V0IiwgImRhdGEiLCAiQ29tcG91bmRUYWciLCAiZW50aXRpZXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdHkiLCAiRW50aXR5VHlwZSIsICJ0b05idCIsICJjcmVhdGVMaXN0VGFnIiwgIlRhZyIsICJDb21wb3VuZCIsICJzdGF0dXMiLCAiUGxheVN0YXR1c1BhY2tldCIsICJQbGF5U3RhdHVzIiwgIlBsYXllclNwYXduIiwgInNlbmRJbW1lZGlhdGUiLCAiUGFja2V0IiwgIlNldExvY2FsUGxheWVyQXNJbml0aWFsaXplZEhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWQiLCAiaGFuZGxlIiwgIl9wYWNrZXQiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAic3Bhd24iLCAiUGFja2V0IiwgIlRleHRIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiVGV4dCIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAicGxheWVycyIsICJnZXQiLCAiZGlzY29ubmVjdCIsICJzaWduYWwiLCAiUGxheWVyQ2hhdFNpZ25hbCIsICJtZXNzYWdlIiwgImVtaXQiLCAiY2FuY2VsZWQiLCAidHJhaXQiLCAidHJhaXRzIiwgInZhbHVlcyIsICJzdWNjZXNzIiwgIm9uQ2hhdCIsICJ1bmRlZmluZWQiLCAiZGltZW5zaW9uIiwgIndvcmxkIiwgImJyb2FkY2FzdCIsICJsb2dnZXIiLCAiaW5mbyIsICJ1c2VybmFtZSIsICJQYWNrZXQiLCAiQ29tbWFuZFJlcXVlc3RIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiQ29tbWFuZFJlcXVlc3QiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgIndvcmxkIiwgImRpbWVuc2lvbiIsICJuYW1lIiwgImNvbW1hbmQiLCAic3RhcnRzV2l0aCIsICJzbGljZSIsICJzdGF0ZSIsICJDb21tYW5kRXhlY3V0aW9uU3RhdGUiLCAiY29tbWFuZHMiLCAiZ2V0QWxsIiwgImNhbmNlbGVkIiwgInRyYWl0IiwgInRyYWl0cyIsICJ2YWx1ZXMiLCAic3VjY2VzcyIsICJvbkNvbW1hbmQiLCAidW5kZWZpbmVkIiwgInJlZ2lzdHJ5IiwgInBlcm1pc3Npb25MZXZlbCIsICJwZXJtaXNzaW9uIiwgInNlbmRNZXNzYWdlIiwgInJlc3VsdCIsICJleGVjdXRlIiwgImxvZ2dlciIsICJpbmZvIiwgInVzZXJuYW1lIiwgIm1lc3NhZ2UiLCAicmVhc29uIiwgIlR5cGVFcnJvciIsICJJbnRlcmFjdEFjdGlvbiIsICJQYWNrZXQiLCAiSW50ZXJhY3RIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiSW50ZXJhY3QiLCAiaGFuZGxlIiwgImNvbm5lY3Rpb24iLCAicGxheWVyIiwgInNlcmVuaXR5IiwgImdldFBsYXllckJ5Q29ubmVjdGlvbiIsICJkaXNjb25uZWN0IiwgImRpbWVuc2lvbiIsICJhY3Rpb24iLCAid29ybGQiLCAibG9nZ2VyIiwgImRlYnVnIiwgIkludGVyYWN0QWN0aW9uIiwgIkludGVyYWN0VXBkYXRlIiwgImFjdG9yUnVudGltZUlkIiwgImVudGl0eVRhcmdldCIsICJlbnRpdHkiLCAiZ2V0RW50aXR5IiwgIk9wZW5JbnZlbnRvcnkiLCAiaGFzVHJhaXQiLCAiRW50aXR5SW52ZW50b3J5VHJhaXQiLCAiY29uc29sZSIsICJsb2ciLCAiY29udGFpbmVyIiwgImdldFRyYWl0IiwgInNob3ciLCAiUGFja2V0IiwgIlBsYXlTdGF0dXMiLCAiUGxheVN0YXR1c1BhY2tldCIsICJSZXNwYXduSGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIlJlc3Bhd24iLCAiaGFuZGxlIiwgIl9wYWNrZXQiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAicGxheWVycyIsICJnZXQiLCAiZGlzY29ubmVjdCIsICJzdGF0dXMiLCAiUGxheVN0YXR1c1BhY2tldCIsICJQbGF5U3RhdHVzIiwgIlBsYXllclNwYXduIiwgInNlbmRJbW1lZGlhdGUiLCAiaGVhbHRoIiwgImdldFRyYWl0IiwgIkVudGl0eUhlYWx0aFRyYWl0IiwgImN1cnJlbnRWYWx1ZSIsICJkZWZhdWx0VmFsdWUiLCAic3Bhd24iLCAiTW9kYWxGb3JtQ2FuY2VsZWRSZWFzb24iLCAiUGFja2V0IiwgIkNsaWVudGJvdW5kQ2xvc2VGb3JtUGFja2V0IiwgIk1vZGFsRm9ybVJlcXVlc3RQYWNrZXQiLCAiU2VydmVyU2V0dGluZ3NSZXNwb25zZVBhY2tldCIsICJGb3JtIiwgInBlbmRpbmciLCAiTWFwIiwgImZvcm1JZCIsICJ0eXBlIiwgInNob3ciLCAicGxheWVyIiwgInJlc3VsdCIsICJoYXMiLCAic2V0IiwgImdldCIsICJwYXlsb2FkIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgInBhY2tldCIsICJNb2RhbEZvcm1SZXF1ZXN0UGFja2V0IiwgImlkIiwgInNlbmQiLCAidW5pcXVlSWQiLCAiY2xvc2UiLCAiQ2xpZW50Ym91bmRDbG9zZUZvcm1QYWNrZXQiLCAidXBkYXRlIiwgIlNlcnZlclNldHRpbmdzUmVzcG9uc2VQYWNrZXQiLCAidmFsdWVzIiwgIk1vZGFsRm9ybVR5cGUiLCAiTWVzc2FnZUZvcm0iLCAiRm9ybSIsICJ0eXBlIiwgIk1vZGFsRm9ybVR5cGUiLCAiTWVzc2FnZSIsICJ0aXRsZSIsICJjb250ZW50IiwgImJ1dHRvbjEiLCAiYnV0dG9uMiIsICJNb2RhbEZvcm1UeXBlIiwgIkFjdGlvbkZvcm0iLCAiRm9ybSIsICJ0eXBlIiwgIk1vZGFsRm9ybVR5cGUiLCAiQWN0aW9uIiwgInRpdGxlIiwgImNvbnRlbnQiLCAiYnV0dG9ucyIsICJidXR0b24iLCAidGV4dCIsICJpbWFnZSIsICJwdXNoIiwgIk1vZGFsRm9ybVR5cGUiLCAiTW9kYWxGb3JtIiwgIkZvcm0iLCAidHlwZSIsICJNb2RhbEZvcm1UeXBlIiwgIk1vZGFsIiwgInRpdGxlIiwgImNvbnRlbnQiLCAiZHJvcGRvd24iLCAidGV4dCIsICJvcHRpb25zIiwgImRlZmF1bHRJbmRleCIsICJwdXNoIiwgImRlZmF1bHQiLCAiaW5wdXQiLCAicGxhY2Vob2xkZXIiLCAiZGVmYXVsdFRleHQiLCAiU3RyaW5nIiwgImxhYmVsIiwgInNsaWRlciIsICJtaW4iLCAibWF4IiwgInN0ZXAiLCAiZGVmYXVsdFZhbHVlIiwgInN0ZXBTbGlkZXIiLCAic3RlcHMiLCAidG9nZ2xlIiwgIk1vZGFsRm9ybVJlc3BvbnNlSGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIk1vZGFsRm9ybVJlc3BvbnNlIiwgImhhbmRsZSIsICJjb25uZWN0aW9uIiwgInBsYXllciIsICJzZXJlbml0eSIsICJnZXRQbGF5ZXJCeUNvbm5lY3Rpb24iLCAiZGlzY29ubmVjdCIsICJwZW5kaW5nIiwgIkZvcm0iLCAiZ2V0IiwgImlkIiwgIkVycm9yIiwgInVzZXJuYW1lIiwgInBhcnRpY2lwYW50IiwgInVuaXF1ZUlkIiwgImNhbmNlbGVkIiwgInJlc3VsdCIsICJNb2RhbEZvcm1DYW5jZWxlZFJlYXNvbiIsICJyZWFzb24iLCAicmVzcG9uc2UiLCAiSlNPTiIsICJwYXJzZSIsICJkYXRhIiwgImRlbGV0ZSIsICJzaXplIiwgIlBhY2tldCIsICJQZXJtaXNzaW9uRmxhZyIsICJBYmlsaXR5SW5kZXgiLCAiUmVxdWVzdFBlcm1pc3Npb25zSGFuZGxlciIsICJOZXR3b3JrSGFuZGxlciIsICJwYWNrZXQiLCAiUGFja2V0IiwgIlJlcXVlc3RQZXJtaXNzaW9ucyIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAidGFyZ2V0IiwgImRpbWVuc2lvbiIsICJnZXRFbnRpdHkiLCAiYWN0b3JVbmlxdWVJZCIsICJpc1BsYXllciIsICJFcnJvciIsICJjYW5CdWlsZCIsICJnZXRGbGFnIiwgIlBlcm1pc3Npb25GbGFnIiwgIkJ1aWxkIiwgImNhbk1pbmUiLCAiTWluZSIsICJjYW5Vc2VEblMiLCAiRG9vcnNBbmRTd2l0Y2hlcyIsICJjYW5PcGVuQ29udGFpbmVycyIsICJPcGVuQ29udGFpbmVycyIsICJjYW5BdHRhY2tQbGF5ZXJzIiwgIkF0dGFja1BsYXllcnMiLCAiY2FuQXR0YWNrTW9icyIsICJBdHRhY2tNb2JzIiwgImNhblVzZU9DIiwgIk9wZXJhdG9yQ29tbWFuZHMiLCAiY2FuVGVsZXBvcnQiLCAiVGVsZXBvcnQiLCAiYWJpbGl0aWVzIiwgInN1cGVyU2V0IiwgIkFiaWxpdHlJbmRleCIsICJ1cGRhdGUiLCAiR2FtZW1vZGUiLCAiUGFja2V0IiwgIkJsb2NrUGlja1JlcXVlc3RIYW5kbGVyIiwgIk5ldHdvcmtIYW5kbGVyIiwgInBhY2tldCIsICJQYWNrZXQiLCAiQmxvY2tQaWNrUmVxdWVzdCIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAieCIsICJ5IiwgInoiLCAiYWRkRGF0YSIsICJibG9jayIsICJkaW1lbnNpb24iLCAiZ2V0QmxvY2siLCAidHJhaXQiLCAidHJhaXRzIiwgInZhbHVlcyIsICJvblBpY2siLCAiZ2FtZW1vZGUiLCAiR2FtZW1vZGUiLCAiQ3JlYXRpdmUiLCAiaXRlbVN0YWNrIiwgImdldEl0ZW1TdGFjayIsICJhbW91bnQiLCAiYXV4aWxsYXJ5IiwgInBlcm11dGF0aW9uIiwgImluZGV4IiwgImVudHJ5IiwgImdldERhdGFFbnRyeSIsICJjb21wb25lbnRzIiwgInNldCIsICJjb250YWluZXIiLCAic2VsZWN0ZWRTbG90IiwgImdldFRyYWl0IiwgIkVudGl0eUludmVudG9yeVRyYWl0IiwgInNldEl0ZW0iLCAiQWN0b3JGbGFnIiwgIlBhY2tldCIsICJFbW90ZUhhbmRsZXIiLCAiTmV0d29ya0hhbmRsZXIiLCAicGFja2V0IiwgIlBhY2tldCIsICJFbW90ZSIsICJoYW5kbGUiLCAiY29ubmVjdGlvbiIsICJwbGF5ZXIiLCAic2VyZW5pdHkiLCAiZ2V0UGxheWVyQnlDb25uZWN0aW9uIiwgImRpc2Nvbm5lY3QiLCAiZGltZW5zaW9uIiwgIlBsYXllclN0YXJ0RW1vdGluZ1NpZ25hbCIsICJlbW90ZUlkIiwgInRpY2tMZW5ndGgiLCAiZW1pdCIsICJmbGFncyIsICJzZXQiLCAiQWN0b3JGbGFnIiwgIkVtb3RpbmciLCAic2NoZWR1bGUiLCAib24iLCAiUGxheWVyU3RvcEVtb3RpbmdTaWduYWwiLCAiYnJvYWRjYXN0RXhjZXB0IiwgIkhhbmRsZXJzIiwgIlJlcXVlc3ROZXR3b3JrU2V0dGluZ3NIYW5kbGVyIiwgIkxvZ2luSGFuZGxlciIsICJSZXNvdXJjZVBhY2tDbGllbnRSZXNwb25zZUhhbmRsZXIiLCAiUGxheWVyQXV0aElucHV0SGFuZGxlciIsICJTZXRMb2NhbFBsYXllckFzSW5pdGlhbGl6ZWRIYW5kbGVyIiwgIkRpc2Nvbm5lY3RIYW5kbGVyIiwgIkNvbnRhaW5lckNsb3NlSGFuZGxlciIsICJNb2JFcXVpcG1lbnRIYW5kbGVyIiwgIkl0ZW1TdGFja1JlcXVlc3RIYW5kbGVyIiwgIlJlcXVlc3RDaHVua1JhZGl1c0hhbmRsZXIiLCAiQW5pbWF0ZUhhbmRsZXIiLCAiSW52ZW50b3J5VHJhbnNhY3Rpb25IYW5kbGVyIiwgIlBsYXllckFjdGlvbkhhbmRsZXIiLCAiVGV4dEhhbmRsZXIiLCAiQ29tbWFuZFJlcXVlc3RIYW5kbGVyIiwgIkludGVyYWN0SGFuZGxlciIsICJSZXNwYXduSGFuZGxlciIsICJNb2RhbEZvcm1SZXNwb25zZUhhbmRsZXIiLCAiUmVxdWVzdFBlcm1pc3Npb25zSGFuZGxlciIsICJCbG9ja1BpY2tSZXF1ZXN0SGFuZGxlciIsICJFbW90ZUhhbmRsZXIiLCAiZXhpc3RzU3luYyIsICJyZWFkRmlsZVN5bmMiLCAid3JpdGVGaWxlU3luYyIsICJyZXNvbHZlIiwgIlBlcm1pc3Npb25MZXZlbCIsICJEZWZhdWx0UGVybWlzc2lvblByb3BlcnRpZXMiLCAicGF0aCIsICJwZXJtaXNzaW9ucyIsICJQZXJtaXNzaW9ucyIsICJNYXAiLCAic2VyZW5pdHkiLCAicHJvcHMiLCAicGVybWlzc2lvbiIsICJzZXQiLCAidXVpZCIsICJsZXZlbCIsICJnZXQiLCAia2V5IiwgIlBlcm1pc3Npb25MZXZlbCIsICJNZW1iZXIiLCAidmFsdWUiLCAiQXJyYXkiLCAiZnJvbSIsICJlbnRyaWVzIiwgIm1hcCIsICJ3cml0ZUZpbGVTeW5jIiwgIkpTT04iLCAic3RyaW5naWZ5IiwgImZyb21QYXRoIiwgImV4aXN0c1N5bmMiLCAicmVzb2x2ZSIsICJwYXJzZSIsICJyZWFkRmlsZVN5bmMiLCAiRGVmYXVsdFNlcnZlclByb3BlcnRpZXMiLCAicG9ydCIsICJhZGRyZXNzIiwgIm1vdGQiLCAiY29tcHJlc3Npb25NZXRob2QiLCAiQ29tcHJlc3Npb25NZXRob2QiLCAiWmxpYiIsICJjb21wcmVzc2lvblRocmVzaG9sZCIsICJwYWNrZXRzUGVyRnJhbWUiLCAicGVybWlzc2lvbnMiLCAiZGVmYXVsdEdlbmVyYXRvciIsICJWb2lkR2VuZXJhdG9yIiwgImRlYnVnTG9nZ2luZyIsICJTZXJlbml0eSIsICJFbWl0dGVyIiwgInByb3BlcnRpZXMiLCAibmV0d29yayIsICJ3b3JsZHMiLCAiTWFwIiwgInByb3ZpZGVycyIsICJnZW5lcmF0b3JzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hZ2VudGEiLCAicGxheWVycyIsICJjb25zb2xlIiwgIkNvbnNvbGVJbnRlcmZhY2UiLCAiYWxpdmUiLCAidGlja3MiLCAidHBzIiwgIkRFQlVHIiwgIk5ldHdvcmsiLCAiSGFuZGxlcnMiLCAicmFrbmV0IiwgIm1lc3NhZ2UiLCAicmVnaXN0ZXJHZW5lcmF0b3IiLCAiU3VwZXJmbGF0R2VuZXJhdG9yIiwgIlBlcm1pc3Npb25zIiwgImZyb21QYXRoIiwgInN0YXJ0IiwgImxhc3RUaWNrIiwgInByb2Nlc3MiLCAiaHJ0aW1lIiwgIlRQUyIsICJ0aWNrIiwgIl9fbmFtZSIsICJzZWNvbmRzIiwgIm5hbm9zZWNvbmRzIiwgImRlbHRhIiwgIlJBS05FVF9UUFMiLCAiY29ubmVjdGlvbiIsICJjb25uZWN0aW9ucyIsICJ2YWx1ZXMiLCAiZGVsdGFUaWNrIiwgInB1c2giLCAiRGF0ZSIsICJub3ciLCAidGhyZXNob2xkIiwgImZpbHRlciIsICJsZW5ndGgiLCAid29ybGQiLCAib25UaWNrIiwgIk1hdGgiLCAiZmxvb3IiLCAic2V0SW1tZWRpYXRlIiwgImVtaXQiLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAiaW5mbyIsICJNSU5FQ1JBRlRfVkVSU0lPTiIsICJQUk9UT0NPTF9WRVJTSU9OIiwgInN0b3AiLCAiaW50ZXJmYWNlIiwgImNsb3NlIiwgIlN0b3AiLCAicGxheWVyIiwgImdldFdvcmxkIiwgInByb3ZpZGVyIiwgIndyaXRlUGxheWVyIiwgImdldERhdGFFbnRyeSIsICJkaW1lbnNpb24iLCAiZGlzY29ubmVjdCIsICJvblNodXRkb3duIiwgIm5leHRUaWNrIiwgInNldE1vdGQiLCAicmVnaXN0ZXJQcm92aWRlciIsICJoYXMiLCAiZXJyb3IiLCAiaWRlbnRpZmllciIsICJpbml0aWFsaXplIiwgIkRlZmF1bHRXb3JsZFByb3ZpZGVyUHJvcGVydGllcyIsICJzZXQiLCAiZGVidWciLCAicmVhc29uIiwgImdlbmVyYXRvciIsICJnZXRHZW5lcmF0b3IiLCAiZ2V0IiwgImNyZWF0ZVdvcmxkIiwgInByb3ZpZGVyUHJvcGVydGllcyIsICJjcmVhdGUiLCAicmVnaXN0ZXJXb3JsZCIsICJuZXh0IiwgInZhbHVlIiwgImdldFdvcmxkcyIsICJvblN0YXJ0dXAiLCAiV29ybGRFbnVtIiwgIm9wdGlvbnMiLCAiZ2V0RGltZW5zaW9uIiwgImRpbWVuc2lvbnMiLCAiZ2V0RGltZW5zaW9ucyIsICJnZXRQbGF5ZXJCeUNvbm5lY3Rpb24iLCAiZ2V0UGxheWVyQnlYdWlkIiwgInh1aWQiLCAiZmluZCIsICJnZXRQbGF5ZXJCeVVzZXJuYW1lIiwgInVzZXJuYW1lIiwgImdldFBsYXllckJ5VXVpZCIsICJ1dWlkIiwgImdldFBsYXllcnMiLCAiTG9vdFBvb2wiLCAiZW50cmllcyIsICJyb2xscyIsICJyb2xsIiwgInJlc3VsdHMiLCAidG90YWxXZWlnaHQiLCAibWFwIiwgIndlaWdodCIsICJyZWR1Y2UiLCAiYSIsICJjIiwgIl8iLCAicmFuZG9tV2VpZ2h0IiwgIk1hdGgiLCAicmFuZG9tIiwgImFjY3VtdWxhdGl2ZSIsICJpdGVtU3RhY2siLCAiZnVuY3Rpb24iLCAiY2FsbGJhY2siLCAicHVzaCIsICJhZGRFbnRyeSIsICJlbnRyeSIsICJyZW1vdmVFbnRyeSIsICJzcGxpY2UiLCAiaW5kZXhPZiIsICJMb290VGFibGUiLCAicG9vbHMiLCAiU2V0IiwgImFkZFBvb2wiLCAicG9vbCIsICJhZGQiLCAicmVtb3ZlUG9vbCIsICJkZWxldGUiLCAiZ2V0TG9vdCIsICJsb290IiwgInB1c2giLCAicm9sbCJdCn0K
|