{"version":3,"sources":["node_modules/browser-pack/_prelude.js","src/js/app.js","src/js/components/expertmode.js","src/js/components/guidedmode.js","src/js/components/menues/cameraM.js","src/js/components/menues/fieldM.js","src/js/components/menues/lensM.js","src/js/components/menues/targetM.js","src/js/components/menues/vaM.js","src/js/components/settingsmode.js","src/js/components/snippets/accordion.js","src/js/components/snippets/question.js","src/js/components/snippets/slider.js","src/js/components/visuals/distanceSliders.js","src/js/components/visuals/visual_nonpano_side.js","src/js/components/visuals/visual_nonpano_top.js","src/js/components/visuals/visual_pano_360_side_ceil.js","src/js/components/visuals/visual_pano_360_side_wall.js","src/js/components/visuals/visual_pano_360_top_ceil.js","src/js/components/visuals/visual_pano_360_top_wall.js","src/js/polyfills.js"],"names":[],"mappings":"AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3jCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACj6BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"app.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i to Feet\r\n\t\t\tif (app.current.unit == 'feet') {\r\n\t\t\t\treturn +app.math.toFeet(value);\r\n\t\t\t}\r\n\t\t\treturn +value;\r\n\t\t}\r\n\r\n\t\tapp.iFfF = function (value) { //if Feet -> from Feet\r\n\t\t\tif (app.current.unit == 'feet') {\r\n\t\t\t\treturn +app.math.fromFeet(value);\r\n\t\t\t}\r\n\t\t\treturn +value;\r\n\t\t}\r\n\r\n\t\tapp.getRawData = function () {\r\n\t\t\tif (app.current.family === 'Others') {\r\n\t\t\t\tvar raw = {\r\n\t\t\t\t\tctype: 'Others'\r\n\t\t\t\t};\r\n\t\t\t\tvar res, r1, r2, c;\r\n\t\t\t\tres = app.cameraAdvancedList[app.current.family].resolutions[app.current.model];\r\n\t\t\t\tc = Number.parseFloat(app.cameraAdvancedList[app.current.family].sensor[app.current.resolution].diagonal);\r\n\t\t\t\tr1 = Number.parseFloat(res.horRes);\r\n\t\t\t\tr2 = Number.parseFloat(res.verRes);\r\n\t\t\t\traw.sensorWidth = Math.sqrt((r1 * r1) / ((r2 * r2) + (r1 * r1)) * c * c);\r\n\t\t\t\traw.sensorHeight = raw.sensorWidth / r1 * r2;\r\n\t\t\t\traw.HorizontalResolution = r1;\r\n\t\t\t\traw.VerticalResolution = r2;\r\n\t\t\t\traw.Illuminator = 'FALSE';\r\n\t\t\t\traw.VideoAnalytics = 'FALSE';\r\n\t\t\t\traw.MinFC = 0.01;\r\n\t\t\t\treturn raw;\r\n\t\t\t}\r\n\t\t\treturn app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution][app.current.lens];\r\n\t\t}\r\n\r\n\t\tvar $dom, $tabs, $tabsContent, firstTab, expertTab, guidedTab, settingsTab;\r\n\r\n\t\tapp.eventStack = [];\r\n\t\tapp.on = function on(eventName, callback) {\r\n\t\t\tvar listener =\r\n\t\t\t{\r\n\t\t\t\teventName: eventName,\r\n\t\t\t\tcallback: callback,\r\n\t\t\t\toff: function off() {\r\n\t\t\t\t\tapp.eventStack.splice(app.eventStack.indexOf(listener), 1);\r\n\t\t\t\t},\r\n\t\t\t\ton: function on() {\r\n\t\t\t\t\tif (app.eventStack.indexOf(listener) < 0) {\r\n\t\t\t\t\t\tapp.eventStack.push(listener);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tapp.eventStack.push(listener);\r\n\t\t\treturn listener;\r\n\t\t}\r\n\r\n\t\tapp.emit = function emit(eventName, data, callback) {\r\n\t\t\tapp.eventStack.forEach(function (v) {\r\n\t\t\t\tif (v.eventName == eventName && typeof v.callback == 'function') {\r\n\t\t\t\t\tv.callback(data, callback);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tapp.addTab = function addTab(name, title) {\r\n\t\t\t$tabs.append(`
  • ${title}
  • `);\r\n\t\t\t$tabsContent.append(`
    `);\r\n\t\t\tfirstTab = false;\r\n\t\t}\r\n\r\n\t\tapp.cameraSelected = function cameraSelected() {\r\n\t\t\t$('#settingsmode-label').parent().removeClass('inactive');\r\n\t\t\t$('#settingsmode-label').click();\r\n\t\t\t$(window).scrollTop($('.tabs-content').offset().top);\r\n\t\t}\r\n\r\n\t\tfunction loadExternalDependencies() {\r\n\t\t\tapp.camerasRaw = null;\r\n\t\t\tapp.cameraAdvancedList = {};\r\n\t\t\t$.get(\"../resources/panoramic-cameras.json\").success(function (data) {\r\n\t\t\t\tapp.camerasRaw = data;\r\n\r\n\t\t\t\tapp.camerasRaw.forEach(function (v) {\r\n\t\t\t\t\tif (v.ctype === 'other') { otherCameras(v); return; }\r\n\t\t\t\t\tlet video_analytics = {\r\n\t\t\t\t\t\ttype: v.VA_eva_iva,\r\n\t\t\t\t\t\thRes: v.VA_horizontalResolution,\r\n\t\t\t\t\t\tvRes: v.VA_verticalResolution,\r\n\t\t\t\t\t\tmin_size: v.VA_min_obj_size\r\n\t\t\t\t\t};\r\n\t\t\t\t\tdelete v.VA_eva_iva;\r\n\t\t\t\t\tdelete v.VA_horizontalResolution;\r\n\t\t\t\t\tdelete v.VA_verticalResolution;\r\n\t\t\t\t\tdelete v.VA_min_obj_size;\r\n\t\t\t\t\tapp.cameraAdvancedList[v.cname] = app.cameraAdvancedList[v.cname] || {};\r\n\t\t\t\t\tapp.cameraAdvancedList[v.cname][v.cmodel] = app.cameraAdvancedList[v.cname][v.cmodel] || {};\r\n\t\t\t\t\tapp.cameraAdvancedList[v.cname][v.cmodel][v.HorizontalResolution + 'x' + v.VerticalResolution] = app.cameraAdvancedList[v.cname][v.cmodel][v.HorizontalResolution + 'x' + v.VerticalResolution] || {};\r\n\t\t\t\t\tif (app.cameraAdvancedList[v.cname][v.cmodel][v.HorizontalResolution + 'x' + v.VerticalResolution][v.lens]) {\r\n\t\t\t\t\t\tif (video_analytics) { app.cameraAdvancedList[v.cname][v.cmodel][v.HorizontalResolution + 'x' + v.VerticalResolution][v.lens].VA.push(video_analytics); }\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tapp.cameraAdvancedList[v.cname][v.cmodel][v.HorizontalResolution + 'x' + v.VerticalResolution][v.lens] = v;\r\n\t\t\t\t\t\tv.VA = [];\r\n\t\t\t\t\t\tif (video_analytics) { v.VA.push(video_analytics); }\r\n\t\t\t\t\t\tif (typeof v.MinFC === 'string') { v.MinFC = parseFloat(v.MinFC.replace(',', '.')); }\r\n\t\t\t\t\t\tif (typeof v.MaxFC === 'string') { v.MaxFC = parseFloat(v.MaxFC.replace(',', '.')); }\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\r\n\t\t\t\tapp.current.family = Object.keys(app.cameraAdvancedList)[0];\r\n\t\t\t\tapp.current.model = Object.keys(app.cameraAdvancedList[app.current.family])[0];\r\n\t\t\t\tapp.current.resolution = Object.keys(app.cameraAdvancedList[app.current.family][app.current.model])[0];\r\n\t\t\t\tapp.current.lens = Object.keys(app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution])[0];\r\n\t\t\t\tapp.current.va = app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution][app.current.lens].VA[0];\r\n\r\n\t\t\t\tvar hasOthersAlready = false;\r\n\t\t\t\tfunction otherCameras(v) {\r\n\t\t\t\t\tif (hasOthersAlready) { console.warn('Data contains 2 Other Cameras!'); return; }\r\n\t\t\t\t\tapp.cameraAdvancedList['Others'] = v;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsetUp();\r\n\t\t\t}).error(function () { alert(app.ll('unavailableWarning')); });\r\n\t\t}\r\n\r\n\t\tfunction setUp() {\r\n\t\t\tapp.current.tool = APP_NAME;\r\n\t\t\tapp.current.view = \"dori\";\r\n\r\n\t\t\t$dom = $('
    ');\r\n\t\t\t$('main').append($dom);\r\n\r\n\t\t\tfirstTab = true;\r\n\t\t\tvar $tabsContainer = $('
    ').appendTo($dom);\r\n\t\t\t$tabs = $('
      ').appendTo($tabsContainer);\r\n\t\t\t$tabsContent = $('
      ').appendTo($dom);\r\n\r\n\t\t\tapp.addTab('expertmode', app.ll('modeExpert'));\r\n\t\t\tapp.addTab('guidedmode', \"Video Product Selector\");\r\n\t\t\tapp.addTab('settingsmode', app.ll('modeSettings'));\r\n\r\n\t\t\tnew Foundation.Tabs($tabs);\r\n\r\n\t\t\texpertTab = require('./components/expertmode.js')(app);\r\n\t\t\tguidedTab = require('./components/guidedmode.js')(app);\r\n\t\t\tsettingsTab = require('./components/settingsmode.js')(app);\r\n\r\n\t\t\t$('#settingsmode-label').parent().addClass('inactive');\r\n\r\n\t\t\tvar tabsMoveEvent;\r\n\t\t\tvar possibleTarget;\r\n\t\t\tvar lastPositionX;\r\n\t\t\tvar touchStartTime;\r\n\t\t\tvar elementTransform = 0;\r\n\t\t\tconst TIME_FOR_LINK_CLICK = 300;\r\n\t\t\t$dom.on('mousedown touchstart', '.tabsContainer', function InputDown(e) {\r\n\t\t\t\tif (e.target.nodeName == 'A') { possibleTarget = e.target; }\r\n\t\t\t\ttouchStartTime = new Date().getTime();\r\n\t\t\t\ttabsMoveEvent = $(window).on('mousemove touchmove', function InputMove(e) {\r\n\t\t\t\t\tif (new Date().getTime() < TIME_FOR_LINK_CLICK) { return; }\r\n\t\t\t\t\tif (e.type === 'touchmove') {\r\n\t\t\t\t\t\tif (!lastPositionX) {\r\n\t\t\t\t\t\t\tlastPositionX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tmoveTab(-lastPositionX + e.originalEvent.touches[0].clientX);\r\n\t\t\t\t\t\tlastPositionX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.type === 'mousemove') {\r\n\t\t\t\t\t\tif (!lastPositionX) {\r\n\t\t\t\t\t\t\tlastPositionX = e.clientX;\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tmoveTab(-lastPositionX + e.clientX);\r\n\t\t\t\t\t\tlastPositionX = e.clientX;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\r\n\t\t\t$dom.on('mouseup touchend', function InputEnd() {\r\n\t\t\t\tlastPositionX = null;\r\n\t\t\t\tif (tabsMoveEvent) { tabsMoveEvent.off(); }\r\n\t\t\t\tif (!touchStartTime) { return; }\r\n\r\n\t\t\t\tif (new Date().getTime() - touchStartTime < TIME_FOR_LINK_CLICK) {\r\n\t\t\t\t\t$(possibleTarget).click();\r\n\t\t\t\t\ttouchStartTime = null;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tlastPositionX = null;\r\n\t\t\t\treturn;\r\n\t\t\t});\r\n\r\n\t\t\t$(window).on('resize', function () { moveTab(0); });\r\n\r\n\t\t\tfunction calcMaxLeftShift() {\r\n\t\t\t\tvar tabContWidth = $tabsContainer.width();\r\n\t\t\t\tvar tabsWidth = 30;\r\n\t\t\t\t$tabs.children().each(function () {\r\n\t\t\t\t\ttabsWidth += $(this).width() + 30;\r\n\t\t\t\t});\r\n\t\t\t\tvar leftShift = tabsWidth - tabContWidth;\r\n\t\t\t\treturn leftShift < 0 ? 0 : leftShift;\r\n\t\t\t}\r\n\r\n\t\t\tfunction moveTab(deltaX) {\r\n\t\t\t\telementTransform += deltaX;\r\n\t\t\t\tif (elementTransform > 0) { elementTransform = 0; }\r\n\t\t\t\tvar maxShift = calcMaxLeftShift();\r\n\t\t\t\tif (elementTransform < -maxShift) { elementTransform = -maxShift; }\r\n\t\t\t\t$tabs.css('transform', 'translate(' + elementTransform + 'px, 0)');\r\n\t\t\t}\r\n\r\n\t\t\t$('.functionUnit').on(\"click\", function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\t$(\".functionUnitCont\").toggleClass('active');\r\n\t\t\t});\r\n\r\n\t\t\t// switch (lang) {\r\n\t\t\t// \tcase \"en\": $('.functionLanguage').text(\"English\"); break;\r\n\t\t\t// \tcase \"de\": $('.functionLanguage').text(\"Deutsch\"); break;\r\n\t\t\t// \tcase \"es\": $('.functionLanguage').text(\"Español\"); break;\r\n\t\t\t// \tcase \"fr\": $('.functionLanguage').text(\"Français\"); break;\r\n\t\t\t// \tcase \"it\": $('.functionLanguage').text(\"Italiano\"); break;\r\n\t\t\t// \tcase \"pt-br\": $('.functionLanguage').text(\"Português\"); break;\r\n\t\t\t// }\r\n\r\n\t\t\t$('.functionLanguage').on(\"click\", function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\t$(\".functionLanguageCont\").toggleClass('active');\r\n\t\t\t});\r\n\r\n\t\t\t$(window).on(\"click\", function (e) {\r\n\t\t\t\tif ($(e.target).hasClass(\"functionUnitCont\") || $(e.target).hasClass(\"functionUnit\")) { return; }\r\n\t\t\t\t$(\".functionUnitCont\").removeClass('active');\r\n\t\t\t});\r\n\r\n\t\t\t$(window).on(\"click\", function (e) {\r\n\t\t\t\tif ($(e.target).hasClass(\"functionLanguageCont\") || $(e.target).hasClass(\"functionLanguage\")) { return; }\r\n\t\t\t\t$(\".functionLanguageCont\").removeClass('active');\r\n\t\t\t});\r\n\r\n\t\t\t$('.functionUnitCont > a').on('click', function () {\r\n\t\t\t\tif ($(this).hasClass(\"active\")) { return; }\r\n\t\t\t\t$('.functionUnitCont > a').removeClass('active');\r\n\t\t\t\tif ($(this).hasClass(\"functionUnitMeter\")) {\r\n\t\t\t\t\tapp.current.unit = 'meter';\r\n\t\t\t\t\t$(\".functionUnit\").text(Foundation.MediaQuery.atLeast('medium') ? app.ll('unitsMeter') : app.ll('unitsMeterMobile'));\r\n\t\t\t\t\t$('.functionUnitCont > a.functionUnitMeter').addClass('active');\r\n\t\t\t\t\tapp.emit('unitChange', { 'old': 'feet', 'new': 'meter' });\r\n\t\t\t\t}\r\n\t\t\t\tif ($(this).hasClass(\"functionUnitFeet\")) {\r\n\t\t\t\t\tapp.current.unit = 'feet';\r\n\t\t\t\t\t$(\".functionUnit\").text(Foundation.MediaQuery.atLeast('medium') ? app.ll('unitsFeet') : app.ll('unitsFeetMobile'));\r\n\t\t\t\t\t$('.functionUnitCont > a.functionUnitFeet').addClass('active');\r\n\t\t\t\t\tapp.emit('unitChange', { 'old': 'meter', 'new': 'feet' });\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Mobile\r\n\r\n\t\t\t$(window).on(\"click\", function (e) {\r\n\t\t\t\tif ($(e.target).hasClass(\"functionUnitContMobile\") || $(e.target).hasClass(\"functionUnitMobile\")) { return; }\r\n\t\t\t\t$(\".functionUnitContMobile\").removeClass('active');\r\n\t\t\t});\r\n\r\n\t\t\t$('.functionUnitContMobile > li a').on('click', function () {\r\n\t\t\t\tif ($(this).hasClass(\"active\")) { return; }\r\n\t\t\t\t$('.functionUnitContMobile > li a').removeClass('active');\r\n\t\t\t\tif ($(this).hasClass(\"functionUnitMeterMobile\")) {\r\n\t\t\t\t\tapp.current.unit = 'meter';\r\n\t\t\t\t\t$(\".functionUnitMobile\").text(Foundation.MediaQuery.atLeast('medium') ? app.ll('unitsMeterMobile') : app.ll('unitsMeterMobile'));\r\n\t\t\t\t\t$('.functionUnitContMobile > li a.functionUnitMeterMobile').addClass('active');\r\n\t\t\t\t\tapp.emit('unitChange', { 'old': 'feet', 'new': 'meter' });\r\n\t\t\t\t}\r\n\t\t\t\tif ($(this).hasClass(\"functionUnitFeetMobile\")) {\r\n\t\t\t\t\tapp.current.unit = 'feet';\r\n\t\t\t\t\t$(\".functionUnitMobile\").text(Foundation.MediaQuery.atLeast('medium') ? app.ll('unitsFeetMobile') : app.ll('unitsFeetMobile'));\r\n\t\t\t\t\t$('.functionUnitContMobile > li a.functionUnitFeetMobile').addClass('active');\r\n\t\t\t\t\tapp.emit('unitChange', { 'old': 'meter', 'new': 'feet' });\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t$(window).on('changed.zf.mediaquery', setUnitText);\r\n\t\t\tfunction setUnitText() {\r\n\t\t\t\tif (Foundation.MediaQuery.is('small')) {\r\n\t\t\t\t\t$(\".functionUnit\").html('' + (app.current.unit == \"meter\" ? app.ll('unitsMeterMobile') : app.ll('unitsFeetMobile')));\r\n\t\t\t\t}\r\n\t\t\t\tif (Foundation.MediaQuery.atLeast('medium')) {\r\n\t\t\t\t\t$(\".functionUnit\").html('' + (app.current.unit == \"meter\" ? app.ll('unitsMeterMobile') : app.ll('unitsFeetMobile')));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tsetUnitText();\r\n\r\n\t\t\t$('body').on('click', '.functionLoad', function () {\r\n\t\t\t\t$('#fileInput').remove();\r\n\t\t\t\t$('body').append('');\r\n\t\t\t\t$('#fileInput').on('change', function (e) {\r\n\t\t\t\t\tvar accept = {\r\n\t\t\t\t\t\ttext: [\"text/plain\", \"text/json\"]\r\n\t\t\t\t\t};\r\n\t\t\t\t\tvar file = e.target.files[0];\r\n\t\t\t\t\tif (accept.text.indexOf(file.type) < -1) { alert(ERROR_WRONG_FORMAT); }\r\n\r\n\t\t\t\t\tvar reader = new FileReader();\r\n\t\t\t\t\treader.onload = function () {\r\n\t\t\t\t\t\tvar text = reader.result;\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tvar result = JSON.parse(text);\r\n\t\t\t\t\t\t\tif (result.tool !== APP_NAME) { throw new Error(); }\r\n\t\t\t\t\t\t\tapp.current = result;\r\n\t\t\t\t\t\t\tfor (var x in app.current) {\r\n\t\t\t\t\t\t\t\tif (app.current.unit === 'feet') {\r\n\t\t\t\t\t\t\t\t\tif (['tOWidth', 'tOHeight', 'cameraHeight'].indexOf(x) >= 0) {\r\n\t\t\t\t\t\t\t\t\t\tapp.current[x] = app.math.fromFeet(app.current[x]);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tapp.emit('cameraChange');\r\n\t\t\t\t\t\t\talert(FILE_LOAD_SUCCESS);\r\n\t\t\t\t\t\t} catch (error) {\r\n\t\t\t\t\t\t\tconsole.log(error);\r\n\t\t\t\t\t\t\talert(ERROR_WRONG_FORMAT);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t\treader.readAsText(file);\r\n\t\t\t\t});\r\n\t\t\t\t$('#fileInput').click();\r\n\t\t\t});\r\n\r\n\t\t\twindow.appSave = function () {\r\n\t\t\t\tvar element = document.createElement('a');\r\n\r\n\t\t\t\tvar deepCopy = JSON.parse(JSON.stringify(app.current));\r\n\r\n\t\t\t\tfor (var x in deepCopy) {\r\n\t\t\t\t\tif (app.current.unit === 'feet') {\r\n\t\t\t\t\t\tif (['tOWidth', 'tOHeight', 'cameraHeight'].indexOf(x) >= 0) {\r\n\t\t\t\t\t\t\tdeepCopy[x] = app.math.toFeet(deepCopy[x]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (typeof deepCopy[x].toFixed === 'function') {\r\n\t\t\t\t\t\tdeepCopy[x] = deepCopy[x].toFixed(2);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (navigator.msSaveBlob) {\r\n\t\t\t\t\tnavigator.msSaveBlob(new Blob([JSON.stringify(deepCopy, null, \"\\t\")]), 'BoschLensCalculator_Config.txt');\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\telement.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(deepCopy, null, \"\\t\")));\r\n\t\t\t\telement.setAttribute('download', \"BoschLensCalculator_Config.txt\");\r\n\r\n\t\t\t\telement.style.display = 'none';\r\n\t\t\t\tdocument.body.appendChild(element);\r\n\r\n\t\t\t\telement.click();\r\n\t\t\t\tdocument.body.removeChild(element);\r\n\t\t\t}\r\n\r\n\t\t\t$('#guidedmode-label').on('click', function (e) {\r\n\t\t\t\twindow.open('https://www.videoselector.boschsecurity.com/index.php?p=ipcameras', '_blank');\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\r\n\t\t\t$('#expertmode-label').on('click', function (e) { $('.settings-sticky-wrap').css('display', 'none'); });\r\n\t\t\t$('#guidedmode-label').on('click', function (e) { $('.settings-sticky-wrap').css('display', 'none'); });\r\n\t\t\t$('#settingsmode-label').on('click', function (e) { $('.settings-sticky-wrap').css('display', 'block'); });\r\n\r\n\r\n\t\t\t$('.settings-sticky-title.va-mode').on('click', () => {\r\n\t\t\t\t$('.settings-sticky-title.va-mode').addClass('active');\r\n\t\t\t\t$('.settings-sticky-title.dori').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-title.ir').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-content.va-mode').addClass('active');\r\n\t\t\t\t$('.settings-sticky-content.dori').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-content.ir').removeClass('active');\r\n\t\t\t});\r\n\r\n\t\t\t$('.settings-sticky-title.dori').on('click', () => {\r\n\t\t\t\t$('.settings-sticky-title.va-mode').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-title.dori').addClass('active');\r\n\t\t\t\t$('.settings-sticky-title.ir').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-content.va-mode').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-content.dori').addClass('active');\r\n\t\t\t\t$('.settings-sticky-content.ir').removeClass('active');\r\n\t\t\t});\r\n\r\n\t\t\t$('.settings-sticky-title.ir').on('click', () => {\r\n\t\t\t\t$('.settings-sticky-title.va-mode').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-title.dori').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-title.ir').addClass('active');\r\n\t\t\t\t$('.settings-sticky-content.va-mode').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-content.dori').removeClass('active');\r\n\t\t\t\t$('.settings-sticky-content.ir').addClass('active');\r\n\t\t\t});\r\n\r\n\t\t\tapp.on('cameraChange', () => {\r\n\t\t\t\t$('.settings-sticky-title.va-mode').trigger('click');\r\n\t\t\t});\r\n\r\n\t\t\tstart();\r\n\t\t}\r\n\r\n\t\tfunction start() {\r\n\t\t\t// expertTab.show();\r\n\r\n\t\t}\r\n\t\tloadExternalDependencies();\r\n\t}\r\n})(jQuery);\r\n\r\n(function ($) {\r\n\tif (window.location.search != \"?test1\") { return; }\r\n\tsetTimeout(() => {\r\n\t\t// $('.cameraFamily')\r\n\t\t$('.proceedButton').click();\r\n\t\tsetTimeout(() => {\r\n\t\t\t$('.calculateButton').click();\r\n\t\t\t$('.buttonFOVVideoAnalytics').click();\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t$(\".visualOutputRow\").get(0).scrollIntoView();\r\n\t\t\t}, 300);\r\n\t\t}, 300);\r\n\t}, 300);\r\n})(jQuery);\r\n\r\n(function ($) {\r\n\tif (window.location.search != \"?test2\") { return; }\r\n\tsetTimeout(() => {\r\n\t\t$('.cameraFamily').val(\"FLEXIDOME IP panoramic 7000 IC 360\");\r\n\t\t$('.cameraFamily')[0].dispatchEvent(new Event('change'));\r\n\t\tsetTimeout(() => {\r\n\t\t\t$('.proceedButton').click();\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t$('.calculateButton').click();\r\n\t\t\t\t$('.buttonFOVVideoAnalytics').click();\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t$(\".visualOutputRow\").get(0).scrollIntoView();\r\n\t\t\t\t}, 300);\r\n\t\t\t}, 300);\r\n\t\t}, 300);\r\n\t}, 300);\r\n})(jQuery);\r\n\r\n(function ($) {\r\n\tif (window.location.search != \"?test3\") { return; }\r\n\tsetTimeout(() => {\r\n\t\t$('.cameraFamily').val(\"FLEXIDOME IP panoramic 7000 IC 360\");\r\n\t\t$('.cameraFamily')[0].dispatchEvent(new Event('change'));\r\n\t\tsetTimeout(() => {\r\n\t\t\t$('.proceedButton').click();\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t$('.menuFieldMountPos').val(\"Wall\");\r\n\t\t\t\t$('.menuFieldMountPos')[0].dispatchEvent(new Event('change'));\r\n\t\t\t\t$('.calculateButton').click();\r\n\t\t\t\t$('.buttonFOVVideoAnalytics').click();\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t$(\"#view-side-panel\").get(0).scrollIntoView();\r\n\t\t\t\t}, 300);\r\n\t\t\t}, 300);\r\n\t\t}, 300);\r\n\t}, 300);\r\n})(jQuery);\r\n\r\nwindow.select2custommatcher = function modelMatcher(params, data) {\r\n\tif ($.trim(params.term) === '') {\r\n\t\treturn data;\r\n\t}\r\n\r\n\tvar original = data.text.toUpperCase();\r\n\tvar term = params.term.toUpperCase();\r\n\tif (original.indexOf(term) > -1) {\r\n\t\treturn data;\r\n\t}\r\n\r\n\tlet terms = term.split(\" \");\r\n\tlet matches = 0;\r\n\r\n\tterms.forEach(splitTerm => {\r\n\t\tif (original.indexOf(splitTerm) > -1) {\r\n\t\t\tmatches++;\r\n\t\t}\r\n\t});\r\n\tif(matches == terms.length){ return data; }\r\n\r\n\treturn null;\r\n}","module.exports = function (app) {\r\n\tvar that = {};\r\n\tvar $dom = $('#expertmode');\r\n\t$dom.html(template);\r\n\r\n\t$(\".cameraFamily\").select2({\r\n\t\tselectOnClose: true,\r\n\t\tmatcher: window.select2custommatcher\r\n\t});\r\n\t$(\".cameraModel\").select2({\r\n\t\tselectOnClose: true,\r\n\t\tmatcher: window.select2custommatcher\r\n\t});\r\n\t$(\".cameraResolution\").select2({\r\n\t\tselectOnClose: true,\r\n\t\tmatcher: window.select2custommatcher\r\n\t});\r\n\r\n\r\n\t$dom.find('.guidedModeButton').on('click', function () {\r\n\t\t$('#guidedmode-label').click();\r\n\t\t$(window).scrollTop($('.tabs-content').offset().top);\r\n\t});\r\n\r\n\tvar $family = $dom.find('select.cameraFamily');\r\n\tvar $ctype = $dom.find('select.cameraTypeFilter');\r\n\tvar $filter = $dom.find('select.cameraFilter');\r\n\tvar $model = $dom.find('select.cameraModel');\r\n\tvar $resolution = $dom.find('select.cameraResolution');\r\n\r\n\tfunction renderDropdown() {\r\n\t\t$family.html('');\r\n\t\tfor (var key in app.cameraAdvancedList) {\r\n\t\t\tlet render = true;\r\n\t\t\tlet family = app.cameraAdvancedList[key];\r\n\t\t\tlet model = Object.values(family)[0];\r\n\t\t\tlet res = Object.values(model)[0];\r\n\t\t\tlet lens = Object.values(res)[0];\r\n\t\t\tif (app.current.filter) {\r\n\t\t\t\tif (!lens.VA || !lens.VA.find(v => v.type == app.current.filter)) { render = false; }\r\n\t\t\t}\r\n\t\t\tif (app.current.ctype) {\r\n\t\t\t\tif (!lens.filter_ctype || !(lens.filter_ctype == app.current.ctype)) { render = false; }\r\n\t\t\t}\r\n\t\t\tif(render){ $family.append(``); }\r\n\t\t}\r\n\t\t$family.val(app.current.family);\r\n\t\tif ($family.val() === null) {\r\n\t\t\tlet first_family = $family.find('option').val();\r\n\t\t\t$family.val(first_family);\r\n\t\t\tapp.current.family = first_family;\r\n\t\t}\r\n\r\n\t\tif (app.current.family === 'Others') {\r\n\t\t\t$dom.find('.camSwitchModel').text(app.ll('expertModeOthersResolution'));\r\n\t\t\t$dom.find('.camSwitchResolution').text(app.ll('expertModeOthersSensorSize'));\r\n\r\n\t\t\t$model.html('');\r\n\t\t\tapp.cameraAdvancedList[app.current.family].resolutions.forEach(function (v, i) {\r\n\t\t\t\tif (!app.current.model) { app.current.model = i; }\r\n\t\t\t\t$model.append(``);\r\n\t\t\t});\r\n\t\t\t$model.val(app.current.model);\r\n\r\n\t\t\t$resolution.html('');\r\n\t\t\tapp.cameraAdvancedList[app.current.family].sensor.forEach(function (v, i) {\r\n\t\t\t\tif (!app.current.resolution) { app.current.resolution = i; }\r\n\t\t\t\t$resolution.append(``);\r\n\t\t\t});\r\n\t\t\t$resolution.val(app.current.resolution);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t$dom.find('.camSwitchModel').text(app.ll('expertModeModel'));\r\n\t\t$dom.find('.camSwitchResolution').text(app.ll('expertModeResolution'));\r\n\r\n\t\tlet vatypes = [];\r\n\t\t$filter.html('')\r\n\t\tapp.camerasRaw.forEach(camera => {\r\n\t\t\t(camera.VA || []).forEach(va => {\r\n\t\t\t\tif (vatypes.includes(va.type)) { return; }\r\n\t\t\t\tvatypes.push(va.type);\r\n\t\t\t})\r\n\t\t});\r\n\t\t$filter.append(``);\r\n\t\tvatypes.forEach(type => {\r\n\t\t\tlet label = type;\r\n\t\t\tif (type == \"EVA\") { label = 'Essential Video Analytics'; }\r\n\t\t\tif (type == \"IVA\") { label = 'Intelligent Video Analytics'; }\r\n\t\t\t$filter.append(``);\r\n\t\t});\r\n\t\t$filter.val(app.current.filter);\r\n\r\n\t\tlet ctypes = [];\r\n\t\t$ctype.html('')\r\n\t\tapp.camerasRaw.forEach(camera => {\r\n\t\t\tif (!camera.filter_ctype || ctypes.includes(camera.filter_ctype)) { return; }\r\n\t\t\tctypes.push(camera.filter_ctype);\r\n\t\t});\r\n\t\t$ctype.append(``);\r\n\t\tctypes = ctypes.sort((a, b)=>{ return a > b; });\r\n\t\tctypes.forEach(type => {\r\n\t\t\tlet label = type;\r\n\t\t\t$ctype.append(``);\r\n\t\t});\r\n\t\t$ctype.val(app.current.ctype);\r\n\r\n\t\t$model.html('');\r\n\t\tfor (var key in app.cameraAdvancedList[app.current.family]) {\r\n\t\t\tif (!app.current.model) { app.current.model = key; }\r\n\t\t\t$model.append(``);\r\n\t\t}\r\n\t\t$model.val(app.current.model);\r\n\r\n\t\t$resolution.html('');\r\n\t\tfor (var key in app.cameraAdvancedList[app.current.family][app.current.model]) {\r\n\t\t\tif (!app.current.resolution) { app.current.resolution = key; }\r\n\t\t\tvar isRotated = app.cameraAdvancedList[app.current.family][app.current.model][key][Object.keys(app.cameraAdvancedList[app.current.family][app.current.model][key])[0]].Rotated;\r\n\t\t\t$resolution.append(``);\r\n\t\t}\r\n\t\t$resolution.val(app.current.resolution);\r\n\t}\r\n\trenderDropdown();\r\n\r\n\r\n\t$dom.find('select.cameraFamily').on('change', function (e) {\r\n\t\tapp.current.family = $(this).val()\r\n\t\tapp.current.model = null;\r\n\t\tapp.current.resolution = null;\r\n\t\tapp.emit('cameraChange');\r\n\t});\r\n\r\n\t$dom.find('select.cameraFilter').on('change', function (e) {\r\n\t\tapp.current.family = $dom.find('select.cameraFamily').val();\r\n\t\tapp.current.filter = $(this).val();\r\n\t\tapp.current.model = null;\r\n\t\tapp.current.resolution = null;\r\n\t\tapp.emit('cameraChange');\r\n\t});\r\n\r\n\t$dom.find('select.cameraTypeFilter').on('change', function (e) {\r\n\t\tapp.current.family = $dom.find('select.cameraFamily').val();\r\n\t\tapp.current.ctype = $(this).val();\r\n\t\tapp.current.model = null;\r\n\t\tapp.current.resolution = null;\r\n\t\tapp.emit('cameraChange');\r\n\t});\r\n\r\n\t$dom.find('select.cameraModel').on('change', function (e) {\r\n\t\tapp.current.model = $(this).val()\r\n\t\tapp.current.resolution = null;\r\n\t\tapp.emit('cameraChange');\r\n\t});\r\n\r\n\t$dom.find('select.cameraResolution').on('change', function (e) {\r\n\t\tapp.current.resolution = $(this).val();\r\n\t\tapp.emit('cameraChange');\r\n\t});\r\n\r\n\r\n\t$dom.find('.proceedButton').on('click', function (e) {\r\n\t\te.preventDefault();\r\n\t\tif (!app.current.family || !app.current.model || !app.current.resolution) { return; }\r\n\t\tapp.cameraSelected();\r\n\t\tlet search = app.current.filter;\r\n\t\tif (search == \"EVA\") { search = \"Essential Video Analytics\"; }\r\n\t\tif (search == \"IVA\") { search = \"Intelligent Video Analytics\"; }\r\n\t\tlet option = $('#settingsmode .va-option-box .vaOption option:contains(' + search + ')').val();\r\n\t\tif (!search || search == \"\") { option = $('#settingsmode .va-option-box .vaOption option').val(); }\r\n\t\t$('#settingsmode .va-option-box .vaOption').val(option).trigger('change');\r\n\t});\r\n\r\n\tapp.on('cameraChange', renderDropdown);\r\n\r\n\r\n\treturn that;\r\n}\r\n\r\nvar template = `\r\n\t
      \r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t

      ${app.ll('expertModeSelectCamera')}

      \r\n\t\t\t\t${app.ll('expertModeLoad')}\r\n\t\t\t
      \r\n\t\t
      \r\n\t
      \r\n\t
      \r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t

      Type of Camera

      \r\n\t\t\t\t\r\n\t\t\t
      \r\n\t\t
      \r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t

      Type of Video Analytics

      \r\n\t\t\t\t\r\n\t\t\t\t(Pre-installed or available via license)\r\n\t\t\t
      \r\n\t\t
      \r\n\t
      \r\n\t
      \r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t

      ${app.ll('expertModeFamily')}

      \r\n\t\t\t\t\r\n\t\t\t
      \r\n\t\t
      \r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t

      ${app.ll('expertModeModel')}

      \r\n\t\t\t\t\r\n\t\t\t
      \r\n\t\t
      \r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t

      ${app.ll('expertModeResolution')}

      \r\n\t\t\t\t\r\n\t\t\t
      \r\n\t\t
      \r\n\t
      \r\n\t
      \r\n\t\t\r\n\t
      \r\n\t
      \r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t

      ${app.ll('expertModeGuidanceLabelBig')}

      \r\n\t\t\t\t

      ${app.ll('expertModeGuidanceLabelSmall')}

      \r\n\t\t\t\tVideo Product Selector\r\n\t\t\t
      \r\n\t\t
      \r\n\t
      \r\n`;","const DORI_D = 25, DORI_O = 63, DORI_R = 125, DORI_I = 250;\r\nconst DRI_D = 3, DRI_R = 12, DRI_I = 24;\r\nconst HUMAN_HEIGHT = 1.7, HUMAN_WIDTH = 0.5;\r\nconst MINIMUM_VA_OBJECT_PIXEL_SIZE = 20;\r\n\r\nconst Question = require('./snippets/question.js');\r\nconst Slider = require('./snippets/slider.js');\r\nvar $selections;\r\nvar answers = {};\r\nvar $dom;\r\nvar activeSlider;\r\n\r\nfunction radToDeg(number) {\r\n\treturn number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n\treturn number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function (app) {\r\n\tvar that = {};\r\n\tvar app = app;\r\n\t$dom = $('#guidedmode');\r\n\r\n\t$dom.html(template);\r\n\r\n\t$selections = $('
      ');\r\n\t$dom.append($selections);\r\n\tquestion_1();\r\n\r\n\tapp.on('unitChange', function (data) {\r\n\t\tif (activeSlider) {\r\n\t\t\tactiveSlider.reset();\r\n\t\t}\r\n\t});\r\n\r\n\treturn that;\r\n}\r\n\r\nfunction question_1() {\r\n\tvar q1 = new Question($selections, app.ll('guidedModeQuestion01'), app.ll('guidedModeQuestion01Info'),\r\n\t\t[{ value: 'yes', label: app.ll('guidedModeQuestion01Label01') }, { value: 'no', label: app.ll('guidedModeQuestion01Label02') }],\r\n\t\tfunction (value) {\r\n\t\t\tif (q1.next) { q1.next.remove(); }\r\n\t\t\tanswers.q1 = value;\r\n\t\t\tanswers.q2 = undefined;\r\n\t\t\tanswers.q3 = undefined;\r\n\t\t\tanswers.q4 = undefined;\r\n\t\t\tanswers.q5 = undefined;\r\n\t\t\tanswers.q6 = undefined;\r\n\t\t\tanswers.q7 = undefined;\r\n\t\t\tq1.next = question_2();\r\n\t\t\t$('html, body').animate({\r\n\t\t\t\tscrollTop: q1.next.$item.offset().top\r\n\t\t\t}, 200, function () { });\r\n\t\t}\r\n\t);\r\n\treturn q1;\r\n}\r\n\r\nfunction question_2() {\r\n\tvar q2 = new Question($selections, app.ll('guidedModeQuestion02'), app.ll('guidedModeQuestion02Info'),\r\n\t\t[{ value: 'yes', label: app.ll('guidedModeQuestion02Label01') }, { value: 'no', label: app.ll('guidedModeQuestion02Label02') }],\r\n\t\tfunction (value) {\r\n\t\t\tif (q2.next) { q2.next.remove(); }\r\n\t\t\tanswers.q2 = value;\r\n\t\t\tanswers.q3 = undefined;\r\n\t\t\tanswers.q4 = undefined;\r\n\t\t\tanswers.q5 = undefined;\r\n\t\t\tanswers.q6 = undefined;\r\n\t\t\tanswers.q7 = undefined;\r\n\t\t\tif (answers.q1 === 'yes' && answers.q2 === 'yes') {\r\n\t\t\t\tq2.next = sliderVideoAnalytics();\r\n\t\t\t}\r\n\t\t\tif (answers.q1 === 'yes' && answers.q2 === 'no') { q2.next = question_3(); }\r\n\t\t\tif (answers.q1 === 'no' && answers.q2 === 'no') {\r\n\t\t\t\tq2.next = sliderDORI();\r\n\t\t\t}\r\n\t\t\tif (answers.q1 === 'no' && answers.q2 === 'yes') {\r\n\t\t\t\tq2.next = sliderDRI();\r\n\t\t\t}\r\n\t\t\t$('html, body').animate({\r\n\t\t\t\tscrollTop: q2.next.$item.offset().top\r\n\t\t\t}, 200, function () { });\r\n\t\t}\r\n\t);\r\n\treturn q2;\r\n}\r\n\r\nfunction question_3() {\r\n\tvar q3 = new Question($selections, app.ll('guidedModeQuestion03'), app.ll('guidedModeQuestion03Info'),\r\n\t\t[{ value: 'person', label: app.ll('guidedModeQuestion03Label01') }, { value: 'bike', label: app.ll('guidedModeQuestion03Label02') }, { value: 'car', label: app.ll('guidedModeQuestion03Label03') }, { value: 'truck', label: app.ll('guidedModeQuestion03Label04') }],\r\n\t\tfunction (value) {\r\n\t\t\tif (q3.next) { q3.next.remove(); }\r\n\t\t\tanswers.q3 = value;\r\n\t\t\tanswers.q4 = undefined;\r\n\t\t\tanswers.q5 = undefined;\r\n\t\t\tanswers.q6 = undefined;\r\n\t\t\tanswers.q7 = undefined;\r\n\t\t\tq3.next = question_4();\r\n\t\t\t$('html, body').animate({\r\n\t\t\t\tscrollTop: q3.next.$item.offset().top\r\n\t\t\t}, 200, function () { });\r\n\t\t}\r\n\t);\r\n\treturn q3;\r\n}\r\n\r\nfunction question_4() {\r\n\tvar q4 = new Question($selections, app.ll('guidedModeQuestion04'), app.ll('guidedModeQuestion04Info'),\r\n\t\t[{ value: 'indoor', label: app.ll('guidedModeQuestion04Label01') }, { value: 'outdoor', label: app.ll('guidedModeQuestion04Label02') }],\r\n\t\tfunction (value) {\r\n\t\t\tif (q4.next) { q4.next.remove(); }\r\n\t\t\tanswers.q4 = value;\r\n\t\t\tanswers.q5 = undefined;\r\n\t\t\tanswers.q6 = undefined;\r\n\t\t\tanswers.q7 = undefined;\r\n\t\t\tq4.next = question_5();\r\n\t\t\t$('html, body').animate({\r\n\t\t\t\tscrollTop: q4.next.$item.offset().top\r\n\t\t\t}, 200, function () { });\r\n\t\t}\r\n\t);\r\n\treturn q4;\r\n}\r\n\r\nfunction question_5() {\r\n\tvar q5 = new Question($selections, app.ll('guidedModeQuestion05'), app.ll('guidedModeQuestion05Info'),\r\n\t\t[{ value: 'quiet', label: app.ll('guidedModeQuestion05Label01') }, { value: 'busy', label: app.ll('guidedModeQuestion05Label02') }],\r\n\t\tfunction (value) {\r\n\t\t\tif (q5.next) { q5.next.remove(); }\r\n\t\t\tanswers.q5 = value;\r\n\t\t\tanswers.q6 = undefined;\r\n\t\t\tanswers.q7 = undefined;\r\n\t\t\tif (answers.q4 === 'indoor') {\r\n\t\t\t\tq5.next = sliderVideoAnalytics();\r\n\t\t\t}\r\n\t\t\tif (answers.q4 === 'outdoor') { q5.next = question_6(); }\r\n\t\t\t$('html, body').animate({\r\n\t\t\t\tscrollTop: q5.next.$item.offset().top\r\n\t\t\t}, 200, function () { });\r\n\t\t}\r\n\t);\r\n\treturn q5;\r\n}\r\n\r\nfunction question_6() {\r\n\tvar q6 = new Question($selections, app.ll('guidedModeQuestion06'), app.ll('guidedModeQuestion06Info'),\r\n\t\t[{ value: 'yes', label: app.ll('guidedModeQuestion06Label01') }, { value: 'no', label: app.ll('guidedModeQuestion06Label02') }],\r\n\t\tfunction (value) {\r\n\t\t\tif (q6.next) { q6.next.remove(); }\r\n\t\t\tanswers.q6 = value;\r\n\t\t\tanswers.q7 = undefined;\r\n\t\t\tq6.next = question_7();\r\n\t\t\t$('html, body').animate({\r\n\t\t\t\tscrollTop: q6.next.$item.offset().top\r\n\t\t\t}, 200, function () { });\r\n\t\t}\r\n\t);\r\n\treturn q6;\r\n}\r\n\r\nfunction question_7() {\r\n\tvar q7 = new Question($selections, app.ll('guidedModeQuestion07'), app.ll('guidedModeQuestion07Info'),\r\n\t\t[{ value: 'yes', label: app.ll('guidedModeQuestion07Label01') }, { value: 'no', label: app.ll('guidedModeQuestion07Label02') }],\r\n\t\tfunction (value) {\r\n\t\t\tif (q7.next) { q7.next.remove(); }\r\n\t\t\tanswers.q7 = value;\r\n\t\t\tq7.next = sliderVideoAnalytics();\r\n\t\t\t$('html, body').animate({\r\n\t\t\t\tscrollTop: q7.next.$item.offset().top\r\n\t\t\t}, 200, function () { });\r\n\t\t}\r\n\t);\r\n\treturn q7;\r\n}\r\n\r\nfunction sliderVideoAnalytics() {\r\n\tvar va = 25;\r\n\tvar $item;\r\n\r\n\tfunction create() {\r\n\t\t$item = $('
      ').appendTo($selections);\r\n\t\tvar $warningVisible = null;\r\n\t\t$item.append('

      ' + app.ll('guidedModeSliderVideoAnalyticsLabel') + '

      ');\r\n\t\tvar vaSlider = new Slider($item, 0, app.iFtF(1000).toFixed(2), app.iFtF(va).toFixed(2), 10, function (v) {\r\n\t\t\tv = app.iFfF(v);\r\n\t\t\tif (v >= 100 && !$warningVisible) {\r\n\t\t\t\t$warningVisible = $(`\r\n\t\t\t\t
      \r\n\t\t\t\t\t

      ${app.ll('guidedModeSliderVideoAnalyticsWarning')}

      \r\n\t\t\t\t
      \r\n\t\t\t`).insertAfter($item.find('.guidedSlider'));\r\n\t\t\t}\r\n\t\t\tif (v < 100 && $warningVisible) {\r\n\t\t\t\t$warningVisible.remove();\r\n\t\t\t\t$warningVisible = null;\r\n\t\t\t}\r\n\t\t\tva = v;\r\n\t\t});\r\n\t\t$item.append(templateResults);\r\n\t\t$item.find('.showResultsButton').removeClass('noshow');\r\n\t\t$item.find('.showResultsButton').on('mouseup', function (e) {\r\n\t\t\te.preventDefault();\r\n\t\t\trenderResultsBox('vi_an', va);\r\n\t\t\t$item.find('.showResults').show();\r\n\t\t\t$('html, body').animate({\r\n\t\t\t\tscrollTop: $item.find('.showResults').offset().top\r\n\t\t\t}, 200, function () { });\r\n\t\t});\r\n\t}\r\n\tcreate();\r\n\r\n\tactiveSlider = { $item: $item, remove: function remove() { $item.remove(); }, reset: function reset() { $item.remove(); create(); } };\r\n\treturn activeSlider;\r\n}\r\n\r\nfunction sliderDORI() {\r\n\tvar d = 100, o = 100, r = 100, i = 100;\r\n\tvar $item;\r\n\tfunction create() {\r\n\t\t$item = $('
      ').appendTo($selections);\r\n\t\tvar info = `\r\n\t\t\t\r\n\t\t\t
      \r\n\t\t\t\t${app.ll('guidedModeSliderDORIInfo')}\r\n\t\t\t\t\t\r\n\t\t\t
      \r\n\t\t`;\r\n\t\t$item.append('

      ' + app.ll('guidedModeSliderDORILabel') + '

      ' + info + '

      ' + app.ll('guidedModeInfoPerson') + ' (' + app.iFtF(.5).toFixed(2) + app.unitSymbol() + ' x ' + app.iFtF(1.7).toFixed(2) + app.unitSymbol() + ')

      ');\r\n\t\tnew Foundation.Reveal($('#doriModalInfo'));\r\n\t\t$item.append('' + app.ll('guidedModeSliderDORILabelDistance') + ' (' + app.unitSymbol() + ')');\r\n\t\tvar distanceSlider = new Slider($item, 0, app.iFtF(2000).toFixed(2), app.iFtF(d).toFixed(2), 10, function (v) {\r\n\t\t\td = app.iFfF(v);\r\n\t\t});\r\n\t\t$item.append('' + app.ll('guidedModeSliderDORILabelOrientation') + ' (' + app.unitSymbol() + ')');\r\n\t\tvar orientationSlider = new Slider($item, 0, app.iFtF(768).toFixed(2), app.iFtF(o).toFixed(2), 10, function (v) {\r\n\t\t\to = app.iFfF(v);\r\n\t\t});\r\n\t\t$item.append('' + app.ll('guidedModeSliderDORILabelRecognition') + ' (' + app.unitSymbol() + ')');\r\n\t\tvar recognitionSlider = new Slider($item, 0, app.iFtF(387).toFixed(2), app.iFtF(r).toFixed(2), 10, function (v) {\r\n\t\t\tr = app.iFfF(v);\r\n\t\t});\r\n\t\t$item.append('' + app.ll('guidedModeSliderDORILabelIdentification') + ' (' + app.unitSymbol() + ')');\r\n\t\tvar identificationSlider = new Slider($item, 0, app.iFtF(193).toFixed(2), app.iFtF(i).toFixed(2), 10, function (v) {\r\n\t\t\ti = app.iFfF(v);\r\n\t\t});\r\n\t\t$item.append(templateResults);\r\n\t\t$item.find('.showResultsButton').removeClass('noshow');\r\n\t\t$item.find('.showResultsButton').on('mouseup', function (e) { e.preventDefault(); renderResultsBox('dori', d, o, r, i); $item.find('.showResults').show(); });\r\n\t}\r\n\tcreate();\r\n\r\n\tactiveSlider = { $item: $item, remove: function remove() { $item.remove(); }, reset: function reset() { $item.remove(); create(); } };\r\n\treturn activeSlider;\r\n}\r\n\r\nfunction sliderDRI() {\r\n\tvar d = 100, r = 100, i = 100;\r\n\tvar $item;\r\n\tfunction create() {\r\n\t\t$item = $('
      ').appendTo($selections);\r\n\t\tvar info = `\r\n\t\t\t\r\n\t\t\t
      \r\n\t\t\t\t${app.ll('guidedModeSliderDRIInfo')}\r\n\t\t\t\t\t\r\n\t\t\t
      \r\n\t\t`;\r\n\t\t$item.append('

      ' + app.ll('guidedModeSliderDRILabel') + '

      ' + info + '

      ' + app.ll('guidedModeInfoPerson') + ' (' + app.iFtF(.5).toFixed(2) + app.unitSymbol() + ' x ' + app.iFtF(1.7).toFixed(2) + app.unitSymbol() + ')

      ');\r\n\t\tnew Foundation.Reveal($('#driModalInfo'));\r\n\t\t$item.append('' + app.ll('guidedModeSliderDRILabelDistance') + ' (' + app.unitSymbol() + ')');\r\n\t\tvar distanceSlider = new Slider($item, 0, app.iFtF(5850).toFixed(2), app.iFtF(d).toFixed(2), 10, function (v) {\r\n\t\t\td = app.iFfF(v);\r\n\t\t});\r\n\t\t$item.append('' + app.ll('guidedModeSliderDRILabelRecognition') + ' (' + app.unitSymbol() + ')');\r\n\t\tvar recognitionSlider = new Slider($item, 0, app.iFtF(1460).toFixed(2), app.iFtF(r).toFixed(2), 10, function (v) {\r\n\t\t\tr = app.iFfF(v);\r\n\t\t});\r\n\t\t$item.append('' + app.ll('guidedModeSliderDRILabelIdentification') + ' (' + app.unitSymbol() + ')');\r\n\t\tvar identificationSlider = new Slider($item, 0, app.iFtF(730).toFixed(2), app.iFtF(i).toFixed(2), 10, function (v) {\r\n\t\t\ti = app.iFfF(v);\r\n\t\t});\r\n\t\t$item.append(templateResults);\r\n\t\t$item.find('.showResultsButton').removeClass('noshow');\r\n\t\t// $item.on('click', function () { $item.find('.showResultsButton').removeClass('noshow'); });\r\n\t\t$item.find('.showResultsButton').on('mouseup', function (e) { e.preventDefault(); renderResultsBox('dri', d, r, i); $item.find('.showResults').show(); });\r\n\t}\r\n\tcreate();\r\n\r\n\tactiveSlider = { $item: $item, remove: function remove() { $item.remove(); }, reset: function reset() { $item.remove(); create(); } };\r\n\treturn activeSlider;\r\n}\r\n\r\nfunction renderResultsBox(type, arg1, arg2, arg3, arg4) {\r\n\tvar myresults = [];\r\n\tif (type === 'dori') {\r\n\t\tapp.camerasRaw.forEach(function (v) {\r\n\t\t\tif (app.blacklistedForGuided.indexOf(v.cname) >= 0) { return; }\r\n\t\t\tif (answers.q2 === 'yes' && v.Thermal === false) { return; }\r\n\t\t\tif (answers.q2 === 'no' && (v.Thermal === true)) { return; }\r\n\t\t\tif (v.ctype === 'nonpano') {\r\n\t\t\t\tvar d_dori_d = Number.parseFloat(v.HorizontalResolution) / (2 * arg1 * Math.tan(degToRad(Number.parseFloat(v.HFOVmax) / 2)));\r\n\t\t\t\tvar d_dori_o = Number.parseFloat(v.HorizontalResolution) / (2 * arg2 * Math.tan(degToRad(Number.parseFloat(v.HFOVmax) / 2)));\r\n\t\t\t\tvar d_dori_r = Number.parseFloat(v.HorizontalResolution) / (2 * arg3 * Math.tan(degToRad(Number.parseFloat(v.HFOVmax) / 2)));\r\n\t\t\t\tvar d_dori_i = Number.parseFloat(v.HorizontalResolution) / (2 * arg4 * Math.tan(degToRad(Number.parseFloat(v.HFOVmax) / 2)));\r\n\r\n\t\t\t\tif (d_dori_d <= DORI_D) { return; }\r\n\t\t\t\tif (d_dori_o <= DORI_O) { return; }\r\n\t\t\t\tif (d_dori_r <= DORI_R) { return; }\r\n\t\t\t\tif (d_dori_i <= DORI_I) { return; }\r\n\r\n\t\t\t\tmyresults.push(v);\r\n\t\t\t}\r\n\r\n\t\t\t// if (v.ctype === 'pano') {\r\n\r\n\t\t\t// }\r\n\t\t});\r\n\t}\r\n\r\n\tif (type === 'dri') {\r\n\t\tapp.camerasRaw.forEach(function (v) {\r\n\t\t\tif (app.blacklistedForGuided.indexOf(v.cname) >= 0) { return; }\r\n\t\t\tif (answers.q2 === 'yes' && v.Thermal === false) { return; }\r\n\t\t\tif (answers.q2 === 'no' && (v.Thermal === true)) { return; }\r\n\t\t\tif (v.ctype === 'nonpano') {\r\n\t\t\t\tvar d_dri_d = Number.parseFloat(v.HorizontalResolution) / (2 * arg1 * Math.tan(degToRad(Number.parseFloat(v.HFOVmax) / 2)));\r\n\t\t\t\tvar d_dri_r = Number.parseFloat(v.HorizontalResolution) / (2 * arg2 * Math.tan(degToRad(Number.parseFloat(v.HFOVmax) / 2)));\r\n\t\t\t\tvar d_dri_i = Number.parseFloat(v.HorizontalResolution) / (2 * arg3 * Math.tan(degToRad(Number.parseFloat(v.HFOVmax) / 2)));\r\n\r\n\t\t\t\tif (d_dri_d < DRI_D) { return; }\r\n\t\t\t\tif (d_dri_r < DRI_R) { return; }\r\n\t\t\t\tif (d_dri_i < DRI_I) { return; }\r\n\r\n\t\t\t\tmyresults.push(v);\r\n\t\t\t}\r\n\r\n\t\t\t// if (v.ctype === 'pano') {\r\n\r\n\t\t\t// }\r\n\t\t});\r\n\t}\r\n\r\n\tif (type === 'vi_an') {\r\n\t\tvar VA_eva_iva = 'IVA';\r\n\t\tif (answers.q4 === 'indoor' && answers.q5 === 'quiet' && arg1 <= 60) {\r\n\t\t\tVA_eva_iva = 'EVA';\r\n\t\t}\r\n\t\tif (answers.q4 === 'outdoor' && answers.q5 === 'quiet' && answers.q6 === 'no' && answers.q7 === 'no' && arg1 <= 60) {\r\n\t\t\tVA_eva_iva = 'EVA';\r\n\t\t}\r\n\r\n\t\tvar tOHeight = 1.6;\r\n\t\tvar tOWidth = .5;\r\n\r\n\t\tif (answers.q2 === 'no') {\r\n\t\t\tswitch (answers.q3) {\r\n\t\t\t\tcase 'bike': tOHeight = 1.6; tOWidth = 1.8; break;\r\n\t\t\t\tcase 'car': tOHeight = 1.6; tOWidth = 2.5; break;\r\n\t\t\t\tcase 'truck': tOHeight = 3; tOWidth = 10; break;\r\n\t\t\t\tdefault: tOHeight = 1.6; tOWidth = .5;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tapp.camerasRaw.forEach(function (v) {\r\n\t\t\tif (app.blacklistedForGuided.indexOf(v.cname) >= 0) { return; }\r\n\t\t\tif (v.VideoAnalytics === \"FALSE\") { return; }\r\n\t\t\tif (VA_eva_iva !== v.VA_eva_iva) { return; }\r\n\t\t\tif (answers.q2 === 'yes' && v.Thermal === false) { return; }\r\n\t\t\tif (answers.q2 === 'no' && (v.Thermal === true)) { return; }\r\n\t\t\tif (v.ctype === 'nonpano') {\r\n\r\n\t\t\t\tvar obj_x = tOWidth;\r\n\t\t\t\tvar obj_y = tOHeight;\r\n\r\n\t\t\t\tvar img_x = Number.parseFloat(v.HorizontalResolution);\r\n\t\t\t\tvar img_y = Number.parseFloat(v.VerticalResolution);\r\n\r\n\t\t\t\tvar va_x = Number.parseFloat(v.VA_horizontalResolution);\r\n\t\t\t\tvar va_y = Number.parseFloat(v.VA_verticalResolution);\r\n\r\n\t\t\t\tvar fov_hor = Number.parseFloat(v.HFOVmax);\r\n\t\t\t\tvar fov_ver = Number.parseFloat(v.VFOVmax);\r\n\r\n\t\t\t\tvar VA_object_pixel_base_x, VA_object_pixel_base_y, VA_min_object_pixel_x, VA_min_object_pixel_y;\r\n\r\n\t\t\t\tif (obj_x < obj_y) {\r\n\t\t\t\t\tVA_object_pixel_base_x = 1;\r\n\t\t\t\t\tVA_object_pixel_base_y = obj_y / obj_x;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tVA_object_pixel_base_y = 1;\r\n\t\t\t\t\tVA_object_pixel_base_x = obj_x / obj_y;\r\n\t\t\t\t}\r\n\t\t\t\tVA_min_object_pixel_x = VA_object_pixel_base_x;\r\n\t\t\t\tVA_min_object_pixel_y = VA_object_pixel_base_y;\r\n\r\n\t\t\t\twhile (VA_min_object_pixel_x * VA_min_object_pixel_y < MINIMUM_VA_OBJECT_PIXEL_SIZE) {\r\n\t\t\t\t\tVA_min_object_pixel_x += VA_object_pixel_base_x;\r\n\t\t\t\t\tVA_min_object_pixel_y += VA_object_pixel_base_y;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tVA_min_object_pixel_x = Math.ceil(VA_min_object_pixel_x);\r\n\t\t\t\tVA_min_object_pixel_y = Math.ceil(VA_min_object_pixel_y);\r\n\r\n\t\t\t\tvar IPPM_x = VA_min_object_pixel_x / obj_x * img_x / va_x;\r\n\t\t\t\tvar IPPM_y = VA_min_object_pixel_y / obj_y * img_y / va_y;\r\n\r\n\t\t\t\tvar dminh = tOWidth / (2 * 0.3 * Math.tan(degToRad(fov_hor / 2)));\r\n\t\t\t\tvar dminv = tOHeight / (2 * 0.3 * Math.tan(degToRad(fov_ver / 2)));\r\n\r\n\t\t\t\tvar dmaxh = obj_x / (2 * (VA_min_object_pixel_x / va_x) * Math.tan(degToRad(fov_hor * .5)));\r\n\t\t\t\tvar dmaxv = obj_y / (2 * (VA_min_object_pixel_y / va_y) * Math.tan(degToRad(fov_ver * .5)));\r\n\r\n\t\t\t\tvar va_dmax = Math.min(dmaxv, dmaxh);\r\n\r\n\t\t\t\tif (va_dmax >= arg1) {\r\n\t\t\t\t\tmyresults.push(v);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//Für Pano Kameras fehlen so lustige Angaben, wie zB. Wallmount oder Ceiling\r\n\r\n\t\t\t// if (v.ctype === 'pano') {\r\n\t\t\t// \tvar obj_x = tOWidth;\r\n\t\t\t// \tvar obj_y = tOHeight;\r\n\r\n\t\t\t// \tvar img_x = Number.parseFloat(v.HorizontalResolution);\r\n\t\t\t// \tvar img_y = Number.parseFloat(v.VerticalResolution);\r\n\r\n\t\t\t// \tvar va_x = Number.parseFloat(v.VA_horizontalResolution);\r\n\t\t\t// \tvar va_y = Number.parseFloat(v.VA_verticalResolution);\r\n\r\n\t\t\t// \tvar VA_object_pixel_base_x, VA_object_pixel_base_y, VA_min_object_pixel_x, VA_min_object_pixel_y;\r\n\r\n\t\t\t// \tif (obj_x < obj_y) {\r\n\t\t\t// \t\tVA_object_pixel_base_x = 1;\r\n\t\t\t// \t\tVA_object_pixel_base_y = obj_y / obj_x;\r\n\t\t\t// \t} else {\r\n\t\t\t// \t\tVA_object_pixel_base_y = 1;\r\n\t\t\t// \t\tVA_object_pixel_base_x = obj_x / obj_y;\r\n\t\t\t// \t}\r\n\t\t\t// \tVA_min_object_pixel_x = VA_object_pixel_base_x;\r\n\t\t\t// \tVA_min_object_pixel_y = VA_object_pixel_base_y;\r\n\r\n\t\t\t// \twhile (VA_min_object_pixel_x * VA_min_object_pixel_y < MINIMUM_VA_OBJECT_PIXEL_SIZE) {\r\n\t\t\t// \t\tVA_min_object_pixel_x += VA_object_pixel_base_x;\r\n\t\t\t// \t\tVA_min_object_pixel_y += VA_object_pixel_base_y;\r\n\t\t\t// \t}\r\n\r\n\t\t\t// \tVA_min_object_pixel_x = Math.ceil(VA_min_object_pixel_x);\r\n\t\t\t// \tVA_min_object_pixel_y = Math.ceil(VA_min_object_pixel_y);\r\n\r\n\t\t\t// \tvar IPPM_x = VA_min_object_pixel_x / obj_x * img_x / va_x;\r\n\t\t\t// \tvar IPPM_y = VA_min_object_pixel_y / obj_y * img_y / va_y;\r\n\r\n\t\t\t// \tresult.tOHeight = tOHeight;\r\n\t\t\t// \tresult.IPPM_y = IPPM_y;\r\n\t\t\t// \tresult.img_y = Number.parseFloat(raw.VerticalResolution);\r\n\r\n\t\t\t// }\r\n\t\t});\r\n\t}\r\n\r\n\tvar $results = $('.resultsBox');\r\n\t$results.html('');\r\n\t$results.append(`
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t

      ${app.ll('expertModeFamily')}

      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t

      ${app.ll('expertModeModel')}

      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t

      ${app.ll('expertModeResolution')}

      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      `);\r\n\r\n\tmyresults.forEach(function (v) {\r\n\t\t$results.append(`\r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      ${v.cname}

      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      ${v.cmodel}

      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      ${v.HorizontalResolution} x ${v.VerticalResolution} (${v.AspectRatio})

      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t`);\r\n\t});\r\n\r\n\t$results.on('click', '.cameraSelected', function () {\r\n\r\n\t\tapp.current.family = $(this).attr('attr-cname');\r\n\t\tapp.current.model = $(this).attr('attr-cmodel');\r\n\t\tapp.current.resolution = $(this).attr('attr-res');\r\n\t\tapp.current.lens = Object.keys(app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution])[0];\r\n\r\n\t\tif (!app.current.family || !app.current.model || !app.current.resolution) { return; }\r\n\t\tapp.emit('cameraChange');\r\n\t\tapp.cameraSelected();\r\n\t});\r\n\r\n\t$results.on('click', '.infoButton', function () {\r\n\t\t$dom.find(\".overlay-container\").removeClass(\"show\");\r\n\t\t$(this).siblings(\".overlay-container\").addClass(\"show\");\r\n\t});\r\n\r\n\t$results.on('click', '.icon-close-after', function () {\r\n\t\t$(this).parent().parent().removeClass(\"show\");\r\n\t});\r\n}\r\n\r\nvar template = `\r\n\t
      \r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t

      ${app.ll('guidedModeTitle')}

      \r\n\t\t\t\t

      ${app.ll('guidedModeSubTitle')}

      \r\n\t\t\t
      \r\n\t\t
      \r\n\t
      \r\n\t\r\n`;\r\nvar templateResults = `\r\n\t
      \r\n\t\t\r\n\t
      \r\n\t
      \r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      ${app.ll('guidedModeSelectLabel')}
      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t
      \r\n\t
      \r\n`;","module.exports = function cameraMenu(titleChange) {\r\n\tfunction renderTitle() {\r\n\t\tif (app.current.family === 'Others') {\r\n\t\t\treturn `

      ${app.ll(\"settingsModeSelectorsCamera\")}  

      ${app.ll(\"settingsModeVisualCameraOther\")}`;\r\n\t\t}\r\n\r\n\t\treturn `

      ${app.ll(\"settingsModeSelectorsCamera\")}  

      \r\n ${app.current.family}  |  \r\n\t\t\t\t${app.current.model}  |  \r\n\t\t\t\t${app.current.resolution}${app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution][Object.keys(app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution])[0]].Rotated ? \" (90° image rotation)\" : \"\"}`;\r\n\t}\r\n\r\n\tvar $dom = $(`\r\n
      \r\n
      \r\n
      \r\n

      ${app.ll(\"expertModeFamily\")}

      \r\n \r\n
      \r\n
      \r\n
      \r\n
      \r\n

      ${app.ll(\"expertModeModel\")}

      \r\n \r\n
      \r\n
      \r\n
      \r\n
      \r\n

      ${app.ll(\"expertModeResolution\")}

      \r\n \r\n
      \r\n
      \r\n\t
      \r\n `);\r\n\r\n\tvar $family = $dom.find('select.cameraFamily');\r\n\tvar $model = $dom.find('select.cameraModel');\r\n\tvar $resolution = $dom.find('select.cameraResolution');\r\n\r\n\twindow.test = $family;\r\n\r\n\t$family.select2({\r\n\t\tselectOnClose: true,\r\n\t\tmatcher: window.select2custommatcher\r\n\t});\r\n\r\n\t$model.select2({\r\n\t\tselectOnClose: true,\r\n\t\tmatcher: window.select2custommatcher\r\n\t});\r\n\t$resolution.select2({\r\n\t\tselectOnClose: true,\r\n\t\tmatcher: window.select2custommatcher\r\n\t});\r\n\r\n\tfor (var key in app.cameraAdvancedList) {\r\n\t\t$family.append(``);\r\n\t}\r\n\tfunction renderDropdown() {\r\n\t\t$family.val(app.current.family);\r\n\r\n\t\tif (app.current.family === 'Others') {\r\n\t\t\t$dom.find('.camSwitchModel').text(app.ll('expertModeOthersResolution')); \r\n\t\t\t$dom.find('.camSwitchResolution').text(app.ll('expertModeOthersSensorSize'));\r\n\r\n\t\t\t$model.html('');\r\n\t\t\tapp.cameraAdvancedList[app.current.family].resolutions.forEach(function (v, i) {\r\n\t\t\t\tif (!app.current.model) { app.current.model = i; }\r\n\t\t\t\t$model.append(``);\r\n\t\t\t});\r\n\t\t\t$model.val(app.current.model);\r\n\r\n\t\t\t$resolution.html('');\r\n\t\t\tapp.cameraAdvancedList[app.current.family].sensor.forEach(function (v, i) {\r\n\t\t\t\tif (!app.current.resolution) { app.current.resolution = i; }\r\n\t\t\t\t$resolution.append(``);\r\n\t\t\t});\r\n\t\t\t$resolution.val(app.current.resolution);\r\n\t\t\ttitleChange(renderTitle());\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t$dom.find('.camSwitchModel').text(app.ll('expertModeModel'));\r\n\t\t$dom.find('.camSwitchResolution').text(app.ll('expertModeResolution'));\r\n\r\n\t\t$model.html('');\r\n\t\tfor (var key in app.cameraAdvancedList[app.current.family]) {\r\n\t\t\tif (!app.current.model) { app.current.model = key; }\r\n\t\t\t$model.append(``);\r\n\t\t}\r\n\t\t$model.val(app.current.model);\r\n\r\n\t\t$resolution.html('');\r\n\t\tfor (var key in app.cameraAdvancedList[app.current.family][app.current.model]) {\r\n\t\t\tif (!app.current.resolution) { app.current.resolution = key; }\r\n\t\t\tvar isRotated = app.cameraAdvancedList[app.current.family][app.current.model][key][Object.keys(app.cameraAdvancedList[app.current.family][app.current.model][key])[0]].Rotated;\r\n\t\t\t$resolution.append(``);\r\n\t\t}\r\n\t\t$resolution.val(app.current.resolution);\r\n\t\ttitleChange(renderTitle());\r\n\r\n\t\t$family.val(app.current.family).trigger('change.select2');\r\n\t\t$model.val(app.current.model).trigger('change.select2');\r\n\t\t$resolution.val(app.current.resolution).trigger('change.select2');\r\n\t}\r\n\trenderDropdown();\r\n\t\r\n\r\n\t$dom.find('select.cameraFamily').on('change', function (e) {\r\n\t\tapp.current.filter = undefined;\r\n\t\tapp.current.ctype = undefined;\r\n\t\tapp.current.family = $(this).val()\r\n\t\tapp.current.model = null;\r\n\t\tapp.current.resolution = null;\r\n\t\tapp.emit('cameraChange');\r\n\t\ttitleChange(renderTitle());\r\n\t});\r\n\r\n\t$dom.find('select.cameraModel').on('change', function (e) {\r\n\t\tapp.current.model = $(this).val()\r\n\t\tapp.current.resolution = null;\r\n\t\tapp.emit('cameraChange');\r\n\t\ttitleChange(renderTitle());\r\n\t});\r\n\r\n\t$dom.find('select.cameraResolution').on('change', function (e) {\r\n\t\tapp.current.resolution = $(this).val();\r\n\t\tapp.emit('cameraChange');\r\n\t\ttitleChange(renderTitle());\r\n\t});\r\n\tapp.on('cameraChange', renderDropdown);\r\n\ttitleChange(renderTitle());\r\n\r\n\treturn $dom\r\n}","const Slider = require('./../snippets/slider.js');\r\n\r\nconst HUMAN_HEIGHT = 1.7,\r\n HUMAN_WIDTH = 0.5;\r\n\r\nfunction radToDeg(number) {\r\n return number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n return number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function fieldMenu(titleChange) {\r\n app.current.cameraHeight = 4;\r\n app.current.camTilt = 30;\r\n\r\n function renderTitle() {\r\n return `

      ${app.ll('settingsModeSelectorsFOV')}  

      \r\n ${app.ll('settingsModeSelectorsFOVCamHeight')}: ${app.iFtF(app.current.cameraHeight).toFixed(2)} ${app.unitSymbol()} | tilt: ${app.current.camTilt.toFixed(2)}°`\r\n }\r\n titleChange(renderTitle());\r\n var types = {\r\n nonpano: `\r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      ${app.ll('settingsModeSelectorsFOVCamHeight')} (${app.unitSymbol()})

      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t

      ${app.ll('settingsModeFieldSetOneOf')}

      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t

      ${app.ll('settingsModeSelectorsFOVMinResolution')} (pp${app.unitSymbol()})

      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t${app.ll('settingsModeSelectorsFOVMinResolutionInfo')}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t

      ${app.ll('settingsModeSelectorsFOVMaxObjectDistance')} (${app.unitSymbol()})

      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t${app.ll('settingsModeSelectorsFOVMaxObjectDistanceInfo')}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t

      ${app.ll('settingsModeSelectorsFOVHorizontalWidth')} (${app.unitSymbol()})

      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t${app.ll('settingsModeSelectorsFOVHorizontalWidthInfo')}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t

      ${app.ll('settingsModeSelectorsFOVCamAngle')} (°)

      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t${app.ll('settingsModeSelectorsFOVCamAngleInfo')}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
      \r\n
      \r\n
      \r\n

      ${app.ll('settingsModeOverHorizonWarning')}

      \r\n
      \r\n
      \r\n \r\n\t\t`,\r\n pano: `\r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      Mounting Position

      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      ${app.ll('settingsModeSelectorsFOVCamHeight')} (${app.unitSymbol()})

      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n
      \r\n\t\t`\r\n }\r\n var $dom;\r\n var wasInit = false;\r\n var slider;\r\n\r\n app.on('unitChange', function (data) {\r\n slider.$item.remove();\r\n\r\n if (app.getRawData().ctype === 'pano') {\r\n $dom.find('.cameraHeight p').text(`${app.ll('settingsModeSelectorsFOVCamHeight')} (${app.unitSymbol()})`);\r\n $dom.find('.distanceLabel').text(`${app.ll('settingsModeSelectorsFOVMaxObjectDistance')} (${app.unitSymbol()})`);\r\n $dom.find('.resolutionLabel').text(`${app.ll('settingsModeSelectorsFOVMinResolution')} (pp${app.unitSymbol()})`);\r\n\r\n } else {\r\n $dom.find('.cameraHeight p').text(`${app.ll('settingsModeSelectorsFOVCamHeight')} (${app.unitSymbol()})`);\r\n $dom.find('.distanceLabel').text(`${app.ll('settingsModeSelectorsFOVMaxObjectDistance')} (${app.unitSymbol()})`);\r\n $dom.find('.resolutionLabel').text(`${app.ll('settingsModeSelectorsFOVMinResolution')} (pp${app.unitSymbol()})`);\r\n $dom.find('.chordLabel').text(`${app.ll('settingsModeSelectorsFOVHorizontalWidth')} (${app.unitSymbol()})`);\r\n }\r\n\r\n createSlider();\r\n titleChange(renderTitle());\r\n });\r\n var updateThoseValuesFunction;\r\n\r\n function createSlider() {\r\n slider = new Slider($dom.find('.cameraHeight'), app.iFtF(2), app.iFtF(25), app.iFtF(app.current.cameraHeight), 10, function (v) {\r\n app.current.cameraHeight = app.iFfF(v);\r\n if (updateThoseValuesFunction) { updateThoseValuesFunction(); }\r\n titleChange(renderTitle());\r\n });\r\n }\r\n\r\n app.on('cameraChange', function () {\r\n if (updateThoseValuesFunction) {\r\n $dom.find('.fieldMenuResolution').val(app.iFtF(25));\r\n updateThoseValuesFunction('resolution', 25);\r\n }\r\n });\r\n app.on('lensChange', function () {\r\n if (updateThoseValuesFunction) {\r\n $dom.find('.fieldMenuResolution').val(app.iFtF(25))\r\n updateThoseValuesFunction('resolution', 25);\r\n }\r\n });\r\n\r\n function create() {\r\n if ($dom) {\r\n $dom.html('');\r\n wasInit = true;\r\n }\r\n delete (app.current.mountposition);\r\n if (app.getRawData().ctype === 'pano') {\r\n if (wasInit) {\r\n // $dom.replacehtmlWith($(types.pano).children());\r\n $dom.html($(types.pano).children());\r\n } else {\r\n $dom = $(types.pano);\r\n }\r\n createSlider();\r\n\r\n $dom.find('.menuFieldMountPos').on('change', function () {\r\n app.current.mountposition = $(this).val();\r\n });\r\n app.current.mountposition = \"Ceiling\";\r\n\r\n function commentedOut() {\r\n // $dom.find('.fieldMenuDistance').on('change', function () {\r\n\r\n // \t//further Calculations here!\r\n // });\r\n // $dom.find('.fieldMenuDistance').css({ 'pointer-events': 'none', 'background-color': 'grey' });\r\n // $dom.find('.fieldMenuResolution').on('change', function () {\r\n\r\n // \t//further Calculations here!\r\n // });\r\n // $dom.find('.fieldMenuResolution').css({ 'pointer-events': 'none', 'background-color': 'grey' });\r\n\r\n // setValues('angle', app.current.camTilt);\r\n // function setValues(origin, value) {\r\n // \tvalue = Number.parseFloat(value);\r\n // \tvar raw = app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution][app.current.lens];\r\n // \tvar fov_ver = Number.parseFloat(app.current.fov_ver || raw.VFOVmin);\r\n // \tvar fov_hor = Number.parseFloat(app.current.fov_hor || raw.HFOVmin);\r\n // \tvar res_hor = Number.parseFloat(raw.HorizontalResolution);\r\n\r\n // \tvar distance, resolution;\r\n // \tconsole.log('did', origin, value);\r\n\r\n // \tswitch (origin) {\r\n\r\n // \t\tcase 'distance':\r\n // \t\t\tdistance = value;\r\n // \t\t\tangle = (radToDeg(Math.atan(value / app.current.cameraHeight)) - 90 - (fov_ver / 2)) * -1;\r\n\r\n // \t\t\tchord = 2 * distance * Math.tan(degToRad(fov_hor / 2));\r\n // \t\t\tresolution = res_hor / (2 * distance * Math.tan(degToRad(fov_hor / 2)));\r\n // \t\t\tbreak;\r\n // \t\tcase 'resolution':\r\n // \t\t\tresolution = value;\r\n // \t\t\tdistance = res_hor / (value * 2 * Math.tan(degToRad(fov_hor / 2)));\r\n // \t\t\tangle = (radToDeg(Math.atan(distance / app.current.cameraHeight)) - 90 - (fov_ver / 2)) * -1;\r\n\r\n // \t\t\tchord = 2 * distance * Math.tan(degToRad(fov_hor / 2));\r\n // \t\t\tbreak;\r\n // \t}\r\n\r\n // \tconsole.log('have', angle, distance, resolution, chord);\r\n\r\n // \tif (origin !== 'distance') { $dom.find('.fieldMenuDistance').val(distance.toFixed(2)); }\r\n // \tif (origin !== 'resolution') { $dom.find('.fieldMenuResolution').val(resolution.toFixed(2)); }\r\n // }\r\n }\r\n return $dom;\r\n }\r\n\r\n if (wasInit) {\r\n $dom.html($(types.nonpano).children());\r\n } else {\r\n $dom = $(types.nonpano);\r\n }\r\n createSlider();\r\n $dom.find('.fieldMenuAngle').on('change', function (v) {\r\n setValues('angle', $(this).val());\r\n });\r\n $dom.find('.fieldMenuDistance').on('change', function (v) {\r\n setValues('distance', app.iFfF($(this).val()));\r\n });\r\n $dom.find('.fieldMenuResolution').on('change', function (v) {\r\n setValues('resolution', app.iFfF($(this).val()));\r\n });\r\n $dom.find('.fieldMenuChord').on('change', function (v) {\r\n setValues('chord', app.iFfF($(this).val()));\r\n });\r\n\r\n $dom.find('.fieldMenuAngle').val(app.current.camTilt);\r\n setValues('resolution', app.getRawData().Thermal ? 3 : 25);\r\n\r\n function setValues(origin, value) {\r\n value = Number.parseFloat(value);\r\n var raw = app.getRawData();\r\n var fov_ver = Number.parseFloat(app.current.fov_ver || raw.VFOVmin);\r\n var fov_hor = Number.parseFloat(app.current.fov_hor || raw.HFOVmin);\r\n var res_hor = Number.parseFloat(raw.HorizontalResolution);\r\n\r\n var angle, distance, resolution, chord;\r\n\r\n switch (origin) {\r\n case 'angle':\r\n angle = value;\r\n\r\n var dmax = app.current.cameraHeight * Math.tan(degToRad(90 - angle + (fov_ver * .5)));\r\n distance = (app.current.cameraHeight - HUMAN_HEIGHT) * Math.tan(degToRad(90 - angle + fov_ver / 2));\r\n chord = 2 * dmax * Math.tan(degToRad(fov_hor / 2));\r\n resolution = res_hor / (2 * dmax * Math.tan(degToRad(fov_hor / 2)));\r\n break;\r\n case 'distance':\r\n distance = value;\r\n // angle = (radToDeg(Math.atan(value / app.current.cameraHeight)) - 90 - (fov_ver / 2)) * -1;\r\n //calculated now for person distance\r\n angle = 90 + (fov_ver / 2) - radToDeg(Math.atan(distance / (app.current.cameraHeight - HUMAN_HEIGHT)));\r\n\r\n chord = 2 * distance * Math.tan(degToRad(fov_hor / 2));\r\n resolution = res_hor / (2 * distance * Math.tan(degToRad(fov_hor / 2)));\r\n break;\r\n case 'chord':\r\n chord = value;\r\n var dmax = value / (2 * Math.tan(degToRad(fov_hor / 2)));\r\n angle = (radToDeg(Math.atan(dmax / app.current.cameraHeight)) - 90 - (fov_ver / 2)) * -1;\r\n distance = (app.current.cameraHeight - HUMAN_HEIGHT) * Math.tan(degToRad(90 - angle + fov_ver / 2));\r\n\r\n resolution = res_hor / (2 * dmax * Math.tan(degToRad(fov_hor / 2)));\r\n break;\r\n case 'resolution':\r\n resolution = value;\r\n var dmax = res_hor / (value * 2 * Math.tan(degToRad(fov_hor / 2)));\r\n angle = (radToDeg(Math.atan(dmax / app.current.cameraHeight)) - 90 - (fov_ver / 2)) * -1;\r\n distance = (app.current.cameraHeight - HUMAN_HEIGHT) * Math.tan(degToRad(90 - angle + fov_ver / 2));\r\n \r\n\r\n chord = 2 * dmax * Math.tan(degToRad(fov_hor / 2));\r\n break;\r\n default:\r\n angle = app.current.camTilt;\r\n var dmax = app.current.cameraHeight * Math.tan(degToRad(90 - angle + (fov_ver * .5)));\r\n distance = (app.current.cameraHeight - HUMAN_HEIGHT) * Math.tan(degToRad(90 - angle + fov_ver / 2));\r\n chord = 2 * dmax * Math.tan(degToRad(fov_hor / 2));\r\n resolution = res_hor / (2 * dmax * Math.tan(degToRad(fov_hor / 2)));\r\n break;\r\n }\r\n\r\n if (angle > 90) {\r\n $dom.find('.fieldMenuAngle').val(90);\r\n setValues('angle', 90);\r\n return;\r\n }\r\n\r\n if (angle < 0) {\r\n $dom.find('.fieldMenuAngle').val(0);\r\n setValues('angle', 0);\r\n return;\r\n }\r\n\r\n app.current.camTilt = angle;\r\n\r\n $dom.find('.fieldMWarning').css('display', 'none');\r\n if (origin !== 'angle') { $dom.find('.fieldMenuAngle').val(angle.toFixed(2)); }\r\n if (origin !== 'distance') { distance > 0 ? $dom.find('.fieldMenuDistance').val(app.iFtF(distance).toFixed(2)) : $dom.find('.fieldMenuDistance').val(app.ll('infinity')); }\r\n if (origin !== 'resolution') { resolution > 0 ? $dom.find('.fieldMenuResolution').val(app.iFtF(resolution).toFixed(2)) : $dom.find('.fieldMenuResolution').val(0); }\r\n if (origin !== 'chord') { chord > 0 ? $dom.find('.fieldMenuChord').val(app.iFtF(chord).toFixed(2)) : $dom.find('.fieldMenuChord').val(app.ll('infinity')); }\r\n if (distance < 0 || resolution < 0 || chord < 0) {\r\n $dom.find('.fieldMWarning').css('display', 'block');\r\n }\r\n titleChange(renderTitle());\r\n }\r\n updateThoseValuesFunction = setValues;\r\n new Foundation.Reveal($dom.find('#fieldMOption1'));\r\n new Foundation.Reveal($dom.find('#fieldMOption2'));\r\n new Foundation.Reveal($dom.find('#fieldMOption3'));\r\n new Foundation.Reveal($dom.find('#fieldMOption4'));\r\n return $dom;\r\n }\r\n app.on('cameraChange', create);\r\n return create();\r\n}","const Slider = require('./../snippets/slider.js');\r\n\r\nfunction radToDeg(number) {\r\n\treturn number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n\treturn number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function lensMenu(titleChange) {\r\n\tfunction renderTitle() {\r\n\t\treturn `

      ${app.ll('settingsModeSelectorsLens')}  

      \r\n ${app.current.lens}  |  \r\n\t\t\t\t${app.ll('settingsModeSelectorsLensFocalLength')} ${app.current.focalLength}mm`\r\n\t}\r\n\tvar $dom = $(`\r\n
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n

      ${app.ll('settingsModeSelectorsLensModel')}

      \r\n \r\n

      \r\n
      \r\n\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t

      ${app.ll('settingsModeSelectorsLensFocalLength')}

      \r\n

      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t\r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t
      \r\n `);\r\n\r\n\tvar slider;\r\n\tresetSlider();\r\n\r\n\tfor (var key in app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution]) {\r\n\t\tif (!app.current.lens) { app.current.lens = key; }\r\n\t\t$dom.find('.cameraLens').append(``);\r\n\t}\r\n\ttitleChange(renderTitle());\r\n\r\n\tapp.on('cameraChange', function () {\r\n\t\t$dom.find('.cameraLens').html('');\r\n\t\tapp.current.lens = null;\r\n\r\n\t\tif (app.current.family === 'Others') {\r\n\t\t\t$dom.find('label.select').css('display', 'none');\r\n\t\t\t$dom.find('.soloOption').css('display', 'block');\r\n\t\t\t$dom.find('.soloOption').text('Other');\r\n\t\t\tapp.current.lens = 'Other';\r\n\t\t} else {\r\n\t\t\tvar length = 0;\r\n\t\t\tfor (var key in app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution]) {\r\n\t\t\t\tif (!app.current.lens) { app.current.lens = key; }\r\n\t\t\t\t$dom.find('.cameraLens').append(``);\r\n\t\t\t\tlength++;\r\n\t\t\t}\r\n\t\t\tif (length > 1) {\r\n\t\t\t\t$dom.find('label.select').css('display', 'block');\r\n\t\t\t\t$dom.find('.soloOption').css('display', 'none');\r\n\t\t\t\t$dom.find('.soloOption').text('');\r\n\t\t\t} else {\r\n\t\t\t\t$dom.find('label.select').css('display', 'none');\r\n\t\t\t\t$dom.find('.soloOption').css('display', 'block');\r\n\t\t\t\t$dom.find('.soloOption').text(app.current.lens);\r\n\t\t\t}\r\n\t\t}\r\n\t\tresetSlider();\r\n\t\ttitleChange(renderTitle());\r\n\t});\r\n\r\n\t$dom.find('.cameraLens').on('change', function () {\r\n\t\tapp.current.lens = $(this).val();\r\n\t\tresetSlider();\r\n\t});\r\n\r\n\tfunction resetSlider() {\r\n\t\tapp.current.fov_hor = undefined;\r\n\t\tapp.current.fov_ver = undefined;\r\n\r\n\t\tvar minLength, maxLength;\r\n\r\n\t\tif (app.current.lens === 'Other') {\r\n\t\t\tminLength = 0.01;\r\n\t\t\tmaxLength = 150;\r\n\t\t} else {\r\n\t\t\tvar v = app.current;\r\n\t\t\tvar origObject = app.cameraAdvancedList[v.family][v.model][v.resolution][v.lens];\r\n\t\t\tminLength = origObject.MinFC;\r\n\t\t\tmaxLength = origObject.MaxFC;\r\n\t\t}\r\n\r\n\t\tif (minLength === maxLength) {\r\n\t\t\tif (slider) { slider.$item.css('display', 'none'); }\r\n\t\t\t$dom.find('.sliderFocalLengthFixed').css('display', 'block');\r\n\t\t\t$dom.find('.sliderFocalLengthFixed').text(maxLength);\r\n\r\n\t\t\tapp.current.focalLength = maxLength;\r\n\t\t\ttitleChange(renderTitle());\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!slider) {\r\n\t\t\t$dom.find('.sliderFocalLengthFixed').css('display', 'none');\r\n\t\t\tslider = new Slider($dom.find('.sliderFocalLength'), minLength, maxLength, maxLength, 10, function (v) {\r\n\t\t\t\tv = Number.parseFloat(v);\r\n\t\t\t\tapp.current.focalLength = v;\r\n\t\t\t\tvar raw = app.getRawData();\r\n\t\t\t\tif (raw.ctype === 'pano' || raw.ctype === 'nonpano') {\r\n\t\t\t\t\t// var sensorWidthH = Math.tan(degToRad(Number.parseFloat(raw.HFOVmin) / 2)) * Number.parseFloat(raw.MinFC);\r\n\t\t\t\t\t// var sensorWidthV = Math.tan(degToRad(Number.parseFloat(raw.VFOVmin) / 2)) * Number.parseFloat(raw.MinFC);\r\n\t\t\t\t\t// app.current.fov_hor = 2 * radToDeg(Math.atan(sensorWidthH / v));\r\n\t\t\t\t\t// app.current.fov_ver = 2 * radToDeg(Math.atan(sensorWidthV / v));\r\n\t\t\t\t\t//linearInterpolation\r\n\t\t\t\t\tvar point = (v - raw.MinFC) / (raw.MaxFC - raw.MinFC);\r\n\t\t\t\t\tapp.current.fov_hor = point * raw.HFOVmax + (1 - point) * raw.HFOVmin;\r\n\t\t\t\t\tapp.current.fov_ver = point * raw.VFOVmax + (1 - point) * raw.VFOVmin;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tapp.current.fov_hor = radToDeg(2 * Math.atan(raw.sensorWidth / 2 / v));\r\n\t\t\t\t\tapp.current.fov_ver = radToDeg(2 * Math.atan(raw.sensorHeight / 2 / v));\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttitleChange(renderTitle());\r\n\t\t\t\tapp.emit('lensChange');\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tslider.$item.css('display', 'block');\r\n\t\t\t$dom.find('.sliderFocalLengthFixed').css('display', 'none');\r\n\t\t\tslider.reset(minLength, maxLength, minLength, 10);\r\n\t\t}\r\n\t}\r\n\r\n\treturn $dom;\r\n}","const Slider = require('./../snippets/slider.js');\r\n\r\nmodule.exports = function targetMenu(titleChange) {\r\n\tvar sliderWidth, sliderHeight;\r\n\tapp.current.tOWidth = 0.5;\r\n\tapp.current.tOHeight = 1.7;\r\n\tif (app.current.va.type == \"IVA Pro Traffic\") {\r\n\t\tapp.current.tOWidth = 1.5;\r\n\t\tapp.current.tOHeight = 1.5;\r\n\t}\r\n\tfunction renderTitle() {\r\n\t\treturn `

      ${app.ll('settingsModeSelectorsTargetObject')}  

      \r\n ${app.iFtF(app.current.tOWidth).toFixed(2)} x ${app.iFtF(app.current.tOHeight).toFixed(2)} ${app.unitSymbol()} ${app.ll('settingsModeSelectorsTargetObjectInfo')}`\r\n\t}\r\n\ttitleChange(renderTitle());\r\n\tvar textWidth = app.ll('settingsModeSelectorsWidth');\r\n\tvar textHeigth = app.ll('settingsModeSelectorsHeight');\r\n\tif (app.current.va.type == \"IVA Pro Traffic\") {\r\n\t\ttextWidth = app.ll('settingsModeSelectorsWidthCar');\r\n\t\ttextHeigth = app.ll('settingsModeSelectorsHeightCar');\r\n\t}\r\n\r\n\tfunction setText(){\r\n\t\t$('.settingsTargetButtonBuildingsUpright span').text(`Upright person (${app.iFtF(.5).toFixed(2)} x ${app.iFtF(1.7).toFixed(2)}${app.unitSymbol()})`);\r\n\t\t$('.settingsTargetButtonBuildingsFrontal span').text(`Frontal vehicle (${app.iFtF(1.5).toFixed(2)} x ${app.iFtF(1.5).toFixed(2)}${app.unitSymbol()})`);\r\n\t\t$('.settingsTargetButtonPerimeterUpright span').text(`Upright person (${app.iFtF(.5).toFixed(2)} x ${app.iFtF(1.7).toFixed(2)}${app.unitSymbol()})`);\r\n\t\t$('.settingsTargetButtonPerimeterCrawling span').text(`Crawling person (${app.iFtF(.5).toFixed(2)} x ${app.iFtF(.5).toFixed(2)}${app.unitSymbol()})`);\r\n\t\t$('.settingsTargetButtonPerimeterFrontal span').text(`Frontal vehicle (${app.iFtF(1.5).toFixed(2)} x ${app.iFtF(1.5).toFixed(2)}${app.unitSymbol()})`);\r\n\t\t$('.settingsTargetButtonTrafficFrontal span').text(`Frontal vehicle (${app.iFtF(1.5).toFixed(2)} x ${app.iFtF(1.5).toFixed(2)}${app.unitSymbol()})`);\r\n\t\t$('.settingsTargetButtonTrafficUpright span').text(`Upright person (${app.iFtF(.5).toFixed(2)} x ${app.iFtF(1.7).toFixed(2)}${app.unitSymbol()})`);\r\n\t}\r\n\r\n\tvar $dom = $(`\r\n\t\t\r\n
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t

      ${textWidth} (${app.unitSymbol()})

      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t

      x

      \r\n\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t

      ${textHeigth} (${app.unitSymbol()})

      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t\r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t
      \r\n `);\r\n\r\n\tsetText();\r\n\r\n\t$dom.find('.settingsTargetButton a.settingsTargetButtonBuildingsUpright').on('click', () => {\r\n\t\t$dom.find('.settingsTargetButton a').addClass('hollow');\r\n\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonBuildingsUpright').removeClass('hollow');\r\n\t\tapp.current.tOWidth = app.iFfF(0.5); app.current.tOHeight = app.iFfF(1.7); createSliders();\r\n\t});\r\n\t$dom.find('.settingsTargetButton a.settingsTargetButtonBuildingsFrontal').on('click', () => {\r\n\t\t$dom.find('.settingsTargetButton a').addClass('hollow');\r\n\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonBuildingsFrontal').removeClass('hollow');\r\n\t\tapp.current.tOWidth = app.iFfF(1.5); app.current.tOHeight = app.iFfF(1.5); createSliders();\r\n\t});\r\n\t$dom.find('.settingsTargetButton a.settingsTargetButtonPerimeterUpright').on('click', () => {\r\n\t\t$dom.find('.settingsTargetButton a').addClass('hollow');\r\n\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonPerimeterUpright').removeClass('hollow');\r\n\t\tapp.current.tOWidth = app.iFfF(0.5); app.current.tOHeight = app.iFfF(1.7); createSliders();\r\n\t});\r\n\t$dom.find('.settingsTargetButton a.settingsTargetButtonPerimeterCrawling').on('click', () => {\r\n\t\t$dom.find('.settingsTargetButton a').addClass('hollow');\r\n\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonPerimeterCrawling').removeClass('hollow');\r\n\t\tapp.current.tOWidth = app.iFfF(0.5); app.current.tOHeight = app.iFfF(0.5); createSliders();\r\n\t});\r\n\t$dom.find('.settingsTargetButton a.settingsTargetButtonPerimeterFrontal').on('click', () => {\r\n\t\t$dom.find('.settingsTargetButton a').addClass('hollow');\r\n\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonPerimeterFrontal').removeClass('hollow');\r\n\t\tapp.current.tOWidth = app.iFfF(1.5); app.current.tOHeight = app.iFfF(1.5); createSliders();\r\n\t});\r\n\t$dom.find('.settingsTargetButton a.settingsTargetButtonTrafficFrontal').on('click', () => {\r\n\t\t$dom.find('.settingsTargetButton a').addClass('hollow');\r\n\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonTrafficFrontal').removeClass('hollow');\r\n\t\tapp.current.tOWidth = app.iFfF(1.5); app.current.tOHeight = app.iFfF(1.5); createSliders();\r\n\t});\r\n\t$dom.find('.settingsTargetButton a.settingsTargetButtonTrafficUpright').on('click', () => {\r\n\t\t$dom.find('.settingsTargetButton a').addClass('hollow');\r\n\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonTrafficUpright').removeClass('hollow');\r\n\t\tapp.current.tOWidth = app.iFfF(0.5); app.current.tOHeight = app.iFfF(1.7); createSliders();\r\n\t});\r\n\r\n\tfunction createSliders() {\r\n\t\tif (sliderWidth) { sliderWidth.$item.remove(); }\r\n\t\tif (sliderHeight) { sliderHeight.$item.remove(); }\r\n\t\tsliderWidth = new Slider($dom.find('.sliderTargetWidth'), app.iFtF(0.1), app.iFtF(30), app.iFtF(app.current.tOWidth), 10, function (v) {\r\n\t\t\tapp.current.tOWidth = app.iFfF(v);\r\n\t\t\ttitleChange(renderTitle());\r\n\t\t});\r\n\t\tsliderWidth.$item.on('click', ()=>{ $dom.find('.settingsTargetButton a').addClass('hollow'); })\r\n\t\tsliderHeight = new Slider($dom.find('.sliderTargetHeight'), app.iFtF(0.1), app.iFtF(5), app.iFtF(app.current.tOHeight), 10, function (v) {\r\n\t\t\tapp.current.tOHeight = app.iFfF(v);\r\n\t\t\ttitleChange(renderTitle());\r\n\t\t});\r\n\t\tsliderHeight.$item.on('click', ()=>{ $dom.find('.settingsTargetButton a').addClass('hollow'); })\r\n\t}\r\n\tcreateSliders();\r\n\tapp.on('unitChange', function (data) {\r\n\t\tsetText();\r\n\t\tif (app.current.va.type == \"IVA Pro Traffic\") {\r\n\t\t\t$dom.find('.sliderTargetWidth p').text(` ${app.ll('settingsModeSelectorsWidthCar')} (${app.unitSymbol()})`);\r\n\t\t\t$dom.find('.sliderTargetHeight p').text(` ${app.ll('settingsModeSelectorsHeightCar')} (${app.unitSymbol()})`);\r\n\t\t} else {\r\n\t\t\t$dom.find('.sliderTargetWidth p').text(` ${app.ll('settingsModeSelectorsWidth')} (${app.unitSymbol()})`);\r\n\t\t\t$dom.find('.sliderTargetHeight p').text(` ${app.ll('settingsModeSelectorsHeight')} (${app.unitSymbol()})`);\r\n\t\t}\r\n\t\tcreateSliders();\r\n\t});\r\n\r\n\tapp.on('vaChange', function () {\r\n\t\t$dom.find('.settingsTargetButton a').css('display', 'none');\r\n\t\t$dom.find('.settingsTargetButton a').addClass('hollow');\r\n\t\tif (app.current.va.type == \"IVA Pro Perimeter\") {\r\n\t\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonPerimeterUpright').css('display', 'inline-block').removeClass('hollow');\r\n\t\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonPerimeterCrawling').css('display', 'inline-block');\r\n\t\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonPerimeterFrontal').css('display', 'inline-block');\r\n\t\t}\r\n\t\tif (app.current.va.type == \"IVA Pro Buildings\") {\r\n\t\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonBuildingsUpright').css('display', 'inline-block').removeClass('hollow');\r\n\t\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonBuildingsFrontal').css('display', 'inline-block');\r\n\t\t}\r\n\t\tif (app.current.va.type == \"IVA Pro Traffic\") {\r\n\t\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonTrafficFrontal').css('display', 'inline-block').removeClass('hollow');\r\n\t\t\t$dom.find('.settingsTargetButton a.settingsTargetButtonTrafficUpright').css('display', 'inline-block');\r\n\t\t}\r\n\r\n\t\tif (app.current.va.type == \"IVA Pro Traffic\") {\r\n\t\t\tapp.current.tOWidth = 1.5;\r\n\t\t\tapp.current.tOHeight = 1.5;\r\n\t\t\t$dom.find('.sliderTargetWidth p').text(` ${app.ll('settingsModeSelectorsWidthCar')} (${app.unitSymbol()})`);\r\n\t\t\t$dom.find('.sliderTargetHeight p').text(` ${app.ll('settingsModeSelectorsHeightCar')} (${app.unitSymbol()})`);\r\n\t\t} else {\r\n\t\t\tapp.current.tOWidth = 0.5;\r\n\t\t\tapp.current.tOHeight = 1.7;\r\n\t\t\t$dom.find('.sliderTargetWidth p').text(` ${app.ll('settingsModeSelectorsWidth')} (${app.unitSymbol()})`);\r\n\t\t\t$dom.find('.sliderTargetHeight p').text(` ${app.ll('settingsModeSelectorsHeight')} (${app.unitSymbol()})`);\r\n\t\t}\r\n\t\tcreateSliders();\r\n\t});\r\n\r\n\treturn $dom;\r\n}\r\n","const Slider = require('./../snippets/slider.js');\r\n\r\nfunction radToDeg(number) {\r\n return number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n return number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function lensMenu(titleChange) {\r\n let previousOption = null;\r\n\r\n function proTrafficFn(){\r\n if(app.current.va.type == \"IVA Pro Traffic\" && app.current.view === 'vi_an'){\r\n // $('#view-side-panel-label').click();\r\n // $('#view-top-panel-label').css(\"display\", \"none\");\r\n }else{\r\n // $('#view-top-panel-label').css(\"display\", \"block\");\r\n }\r\n }\r\n function renderTitle() {\r\n return `

      ${app.ll('settingsModeSelectorsVideoAnalytics')}  

      \r\n ${app.label_va(app.current.va.type)}`\r\n }\r\n var $dom = $(`\r\n
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n

      ${app.ll('settingsModeSelectorsVideoAnalyticsType')}

      \r\n \r\n

      \r\n
      \r\n\t\t\t
      \r\n\t
      \r\n `);\r\n\r\n let i = 0;\r\n\r\n \r\n for (var key of app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution][app.current.lens].VA) {\r\n if (!app.current.va) { app.current.va = key; }\r\n $dom.find('.vaOption').append(``);\r\n }\r\n let elem;\r\n if (elem = app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution][app.current.lens].VA.find(v => v.type == \"IVA Pro Buildings\")) {\r\n app.current.va = elem;\r\n previousOption = elem.type;\r\n $dom.find('.vaOption').val(0);\r\n }\r\n titleChange(renderTitle());\r\n\r\n app.on('cameraChange', function () {\r\n $dom.find('.vaOption').html('');\r\n app.current.va = null;\r\n\r\n let i = 0\r\n \r\n for (var key of app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution][app.current.lens].VA) {\r\n if (!app.current.va) { app.current.va = key; }\r\n $dom.find('.vaOption').append(``);\r\n }\r\n let elem;\r\n if (elem = app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution][app.current.lens].VA.find(v => v.type == \"IVA Pro Buildings\")) {\r\n app.current.va = elem;\r\n $dom.find('.vaOption').val(1);\r\n }\r\n\r\n if (app.current.va.type == false) {\r\n $dom.find('.va-option-box').parent().parent().parent().parent().css('display', 'none');\r\n } else {\r\n $dom.find('.va-option-box').parent().parent().parent().parent().css('display', 'block');\r\n }\r\n\r\n $('.buttonFOVVideoAnalytics').text(app.label_va(app.current.va.type));\r\n proTrafficFn();\r\n if(previousOption !== app.current.va.type){ previousOption = app.current.va.type; app.emit('vaChange'); }\r\n titleChange(renderTitle());\r\n });\r\n\r\n $dom.find('.vaOption').on('change', function () {\r\n let index = $(this).val();\r\n app.current.va = app.cameraAdvancedList[app.current.family][app.current.model][app.current.resolution][app.current.lens].VA[index];\r\n $('.buttonFOVVideoAnalytics').text(app.label_va(app.current.va.type));\r\n previousOption = app.current.va.type;\r\n proTrafficFn();\r\n\t\tapp.emit('vaChange');\r\n titleChange(renderTitle());\r\n });\r\n return $dom;\r\n}","const Slider = require('./snippets/slider.js');\r\nconst Accordion = require('./snippets/accordion');\r\nvar $selections;\r\nvar answers = {};\r\n\r\nconst VisualNonpanoSide = require('./visuals/visual_nonpano_side.js');\r\nconst VisualNonpanoTop = require('./visuals/visual_nonpano_top.js');\r\nconst VisualPano360SideCeil = require('./visuals/visual_pano_360_side_ceil.js');\r\nconst VisualPano360TopCeil = require('./visuals/visual_pano_360_top_ceil.js');\r\nconst VisualPano360SideWall = require('./visuals/visual_pano_360_side_wall.js');\r\nconst VisualPano360TopWall = require('./visuals/visual_pano_360_top_wall.js');\r\n\r\nconst visualsSlider = require('./visuals/distanceSliders.js')();\r\n\r\nconst DEFAULT_WIDTH = 620;\r\nconst CUSTOM_AA = 1;\r\nconst BLUR_QUALITY = 10;\r\n\r\nconst DEFAULT_HEIGHT = DEFAULT_WIDTH / 16 * 9;\r\nconst CUSTOM_AA_INVERSE = 1 / CUSTOM_AA;\r\n\r\nconst DORI_D = 25,\r\n DORI_O = 63,\r\n DORI_R = 125,\r\n DORI_I = 250;\r\nconst DRI_D = 3,\r\n DRI_R = 12,\r\n DRI_I = 24;\r\nconst HUMAN_HEIGHT = 1.7,\r\n HUMAN_WIDTH = 0.5;\r\nconst MINIMUM_VA_OBJECT_PIXEL_SIZE = 20;\r\n\r\nfunction radToDeg(number) {\r\n return number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n return number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function (app) {\r\n var that = {};\r\n that.$dom = $('#settingsmode');\r\n\r\n new Accordion(that.$dom, [\r\n require('./menues/cameraM.js'),\r\n require('./menues/lensM.js'),\r\n require('./menues/vaM.js'),\r\n require('./menues/targetM.js'),\r\n require('./menues/fieldM.js'),\r\n ])\r\n\r\n that.$dom.append(\r\n `\r\n
      \r\n\t\t\t
      \r\n\t\t\t\t\r\n \r\n
      \r\n
      \r\n
      \r\n

      View the results

      \r\n

      The Bosch Video Analytics and Lens Calculator serves as a support tool only. It cannot substitute professional advice from technical experts. Any use of this tool is subject to this Disclaimer and by using the tool, the user agrees thereto. For further details, our sales team will be happy to assist.

      \r\n
      \r\n
      \r\n
      \r\n\t\t\t
      \r\n
      \r\n
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n \r\n
      \r\n \r\n \r\n \r\n \r\n
      \r\n
      \r\n \r\n
      \r\n ${app.ll('settingsModeVisualDORI_I')}\r\n ${app.ll('settingsModeVisualDORI_R')}\r\n ${app.ll('settingsModeVisualDORI_O')}\r\n ${app.ll('settingsModeVisualDORI_D')}\r\n ${app.ll('settingsModeVisualDORI_OutOfRange')}\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualDORI_I')}\r\n ${app.ll('settingsModeVisualDORI_R')}\r\n ${app.ll('settingsModeVisualDORI_D')}\r\n ${app.ll('settingsModeVisualDORI_OutOfRange')}\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualIR_V')}\r\n ${app.ll('settingsModeVisualDORI_OutOfRange')}\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualVIAN_VAD')}\r\n ${app.ll('settingsModeVisualVIAN_OutOfRange')}\r\n
      \r\n
      \r\n
      \r\n
      \r\n
      \r\n\t\t\t\t\t
      \r\n
      \r\n
      \r\n\t\t\t\t\t
      \r\n
      \r\n
      \r\n
      \r\n
      \r\n

      ${app.ll('settingsModeVisualCalcValAtPos')}

      \r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualDistance')}\r\n 99 m\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualResolution')}\r\n 99 ppm\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualHeight')}\r\n 99 m\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualHorizontalAngle')}\r\n 0 °\r\n
      \r\n
      \r\n
      \r\n
      \r\n

      ${app.ll('settingsModeVisualCalcValAtPos')}

      \r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualDistance')}\r\n 99 m\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualResolution')}\r\n 99 ppm\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualHeight')}\r\n 99 m\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualHorizontalAngle')}\r\n 0 °\r\n
      \r\n
      \r\n
      \r\n
      \r\n

      ${app.ll('settingsModeVisualCalcValAtPos')}

      \r\n ${app.ll('settingsModeVisualInformation')}\r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualDistance')}\r\n 99 m\r\n ${app.ll('settingsModeVisualInformationVAMinDetReal')}\r\n 99 m*\r\n ${app.ll('settingsModeVisualInformationVAHeadlineDet')}\r\n \r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualHeight')}\r\n 99 m\r\n ${app.ll('settingsModeVisualInformationVAMaxDetReal')}\r\n 99 m*\r\n ${app.ll('settingsModeVisualInformationVAMinDet')}\r\n 99 m*\r\n \r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualHorizontalAngle')}\r\n 0 °\r\n \r\n \r\n ${app.ll('settingsModeVisualInformationVAMaxDet')}\r\n 99 m*\r\n
      \r\n
      \r\n

      ${app.ll('settingsModeVisualOutVANotice')}

      \r\n
      \r\n
      \r\n

      ${app.ll('settingsModeVisualCalcValAtPos')}

      \r\n \r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualDistance')}\r\n 99 m\r\n ${app.ll('settingsModeVisualInformationVAMinDetReal')}\r\n 99 m*\r\n
      \r\n
      \r\n \r\n \r\n ${app.ll('settingsModeVisualInformationVAMaxDetRealTypical')}\r\n 99 m*\r\n
      \r\n
      \r\n
      \r\n
      \r\n

      ${app.ll('settingsModeVisualCalcValAtPos')}

      \r\n \r\n ${app.ll('settingsModeVisualAboutDORIDRI')}\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t
      ${app.ll('settingsModeVisualDORIInfo')}
      \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualDORI_D')}\r\n \r\n \r\n \r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualDORI_O')}\r\n \r\n \r\n \r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualDORI_R')}\r\n \r\n \r\n \r\n
      \r\n
      \r\n ${app.ll('settingsModeVisualDORI_I')}\r\n \r\n \r\n \r\n
      \r\n
      \r\n
      \r\n
      \r\n
      \r\n\t\t\t
      \r\n
      \r\n \r\n
      \r\n\t\t\t
      \r\n\t\t\t\t
      ${app.ll('settingsModeWhatNext')}
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t

      ${app.ll('settingsModeWhereToBuyTitle')}

      \r\n\t\t\t\t\t\t

      ${app.ll('settingsModeWhereToBuyText')}

      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t

      ${app.ll('settingsModeMoreProductInfoTitle')}

      \r\n\t\t\t\t\t\t

      ${app.ll('settingsModeMoreProductInfoText')}

      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t

      ${app.ll('settingsModeGetInTouchTitle')}

      \r\n\t\t\t\t\t\t

      ${app.ll('settingsModeGetInTouchText')}

      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t
      \r\n `\r\n );\r\n\r\n new Foundation.Tabs($('#view-tabs'));\r\n $('#view-tabs').on('change.zf.tabs', function (e) {\r\n app.view = $('#view-tabs').find('.is-active a').attr('href') === '#view-side-panel' ? 'side' : 'top';\r\n if (!app.settings.activeCanvas) { return; }\r\n renderVisual();\r\n });\r\n app.view = 'side';\r\n\r\n that.$dom.on('click', '.visualButtons button', function (e) {\r\n var raw = app.getRawData();\r\n if ($(e.target).hasClass('active')) { return; }\r\n //camera, dori, vi_an\r\n that.$dom.find('.visualButtons button').removeClass(\"active\");\r\n $(e.target).addClass('active');\r\n $('.view-content').css('display', '');\r\n $('.visualSecondRow').css('visibility', '');\r\n if ($(e.target).hasClass('buttonFOVDori')) {\r\n $('.view-content').css('display', 'none');\r\n $('.visualSecondRow').css('visibility', 'hidden');\r\n app.current.view = 'thatdamtable';\r\n }\r\n if ($(e.target).hasClass('buttonFOVCamera')) {\r\n app.current.view = 'camera';\r\n // $('#view-top-panel-label').css(\"display\", \"block\");\r\n }\r\n if ($(e.target).hasClass('buttonFOVVideoAnalytics')) {\r\n app.current.view = 'vi_an';\r\n if (app.current.va.type == \"IVA Pro Traffic\") {\r\n // $('#view-side-panel-label').click();\r\n // $('#view-top-panel-label').css(\"display\", \"none\");\r\n } else {\r\n // $('#view-top-panel-label').css(\"display\", \"block\");\r\n }\r\n }\r\n if ($(e.target).hasClass('buttonFOVLenscalc')) {\r\n app.current.view = 'dori';\r\n // $('#view-top-panel-label').css(\"display\", \"block\");\r\n }\r\n changeLegend(raw);\r\n if (!app.settings.activeCanvas) { return; }\r\n if ($(e.target).hasClass('buttonFOVDori')) { return; }\r\n renderVisual();\r\n });\r\n\r\n function changeLegend() {\r\n that.$dom.find('.legendCont').addClass('hidden');\r\n that.$dom.find('.visualOutputCont').addClass('hidden');\r\n if (app.current.view === 'camera') {\r\n that.$dom.find('.legendCont.camera').removeClass('hidden');\r\n that.$dom.find('.visualOutputCont.camera').removeClass('hidden');\r\n }\r\n if (app.current.view === 'dori') {\r\n if (raw.Thermal === 'TRUE' || raw.Thermal === true) {\r\n that.$dom.find('.legendCont.dri').removeClass('hidden');\r\n that.$dom.find('.visualOutputCont.dri').removeClass('hidden');\r\n return;\r\n }\r\n that.$dom.find('.legendCont.dori').removeClass('hidden');\r\n that.$dom.find('.visualOutputCont.lenscalc').removeClass('hidden');\r\n }\r\n if (app.current.view === 'vi_an') {\r\n that.$dom.find('.legendCont.vi_an').removeClass('hidden');\r\n that.$dom.find('.visualOutputCont.vi_an').removeClass('hidden');\r\n }\r\n if (app.current.view === 'thatdamtable') {\r\n that.$dom.find('.legendCont.dori').removeClass('hidden');\r\n that.$dom.find('.visualOutputCont.dori').removeClass('hidden');\r\n }\r\n }\r\n\r\n app.on('cameraChange', function () {\r\n var raw = app.getRawData();\r\n if (raw.Thermal === 'TRUE' || raw.Thermal === true) {\r\n $('#doriInfo .content').html(app.ll('settingsModeVisualDRIInfo'));\r\n $('.buttonFOVDori').text('DRI');\r\n setViusalOutputToDri('', '', '');\r\n } else {\r\n $('#doriInfo .content').html(app.ll('settingsModeVisualDORIInfo'));\r\n $('.buttonFOVDori').text('DORI');\r\n setViusalOutputToDori('', '', '', '');\r\n }\r\n\r\n that.$dom.find('.visualButtons button').removeClass(\"hidden\");\r\n if (raw.Illuminator !== 'TRUE') { that.$dom.find('.visualButtons .buttonFOVCamera').addClass(\"hidden\"); }\r\n if (raw.VideoAnalytics !== 'TRUE') { that.$dom.find('.visualButtons .buttonFOVVideoAnalytics').addClass(\"hidden\"); }\r\n\r\n if (app.current.va.type == \"IVA Pro Traffic\") {\r\n // $('#view-side-panel-label').click();\r\n // $('#view-top-panel-label').css(\"display\", \"none\");\r\n } else {\r\n // $('#view-top-panel-label').css(\"display\", \"block\");\r\n }\r\n\r\n if ((app.current.view === 'vi_an' && raw.VideoAnalytics !== 'TRUE') || (app.current.view === 'camera' && raw.Illuminator !== 'TRUE')) {\r\n that.$dom.find('.visualButtons button').removeClass(\"active\");\r\n that.$dom.find('.visualButtons .buttonFOVDori').addClass(\"active\");\r\n app.current.view = 'dori';\r\n changeLegend();\r\n if (!app.settings.activeCanvas) { return; }\r\n renderVisual();\r\n }\r\n });\r\n\r\n var raw = app.getRawData();\r\n that.$dom.find('.visualButtons button').removeClass(\"hidden\");\r\n if (raw.Illuminator !== 'TRUE') { that.$dom.find('.visualButtons .buttonFOVCamera').addClass(\"hidden\"); }\r\n if (raw.VideoAnalytics !== 'TRUE') { that.$dom.find('.visualButtons .buttonFOVVideoAnalytics').addClass(\"hidden\"); }\r\n\r\n that.$dom.on('click', 'a.saveButton', function () {\r\n window.appSave();\r\n });\r\n\r\n\r\n var pixiReady = false;\r\n that.$dom.on('click', 'a.calculateButton', renderVisual);\r\n\r\n let delay = setTimeout(() => { renderVisual(); }, 200);\r\n $('.settings-sticky-load-indicator').addClass('active');\r\n that.$dom.on('change', 'input', () => {\r\n if (delay) { clearTimeout(delay); }\r\n $('.settings-sticky-load-indicator').addClass('active');\r\n delay = setTimeout(() => { renderVisual(); }, 200);\r\n });\r\n\r\n that.$dom.on('changed.zf.slider', () => {\r\n if (delay) { clearTimeout(delay); }\r\n $('.settings-sticky-load-indicator').addClass('active');\r\n delay = setTimeout(() => { renderVisual(); }, 200);\r\n })\r\n\r\n\r\n // function createVisualizeInfo() {\r\n // if ($('.visualizeInfo').length) { return; }\r\n // $('' + app.ll('settingsModeVisualPleaseWait') + '').css({\r\n // 'position': 'fixed',\r\n // 'top': '50%',\r\n // 'left': '50%',\r\n // 'transform': 'translate(-50%, -50%)',\r\n // 'background-color': '#db5c68',\r\n // 'padding': '5px',\r\n // 'z-index': '10002',\r\n // }).appendTo('body');\r\n // $('body').css('pointer-events', 'none');\r\n // }\r\n\r\n function renderVisual(event, popout, type) {\r\n if (!pixiReady) { return; }\r\n $('.hideTillCalc').removeClass('hideTillCalc');\r\n var firstRun = false;\r\n if (!app.settings.firstVisualisation) {\r\n firstRun = true\r\n }\r\n app.settings.firstVisualisation = true;\r\n app.settings.activeCanvas = true;\r\n var current = app.current;\r\n var raw = app.getRawData();\r\n\r\n // createVisualizeInfo();\r\n\r\n setTimeout(function () {\r\n if (raw.ctype === 'nonpano' || raw.ctype === 'Others') {\r\n if (app.current.view == \"vi_an\") {\r\n that.$dom.find('.visualOutputCont.vi_an.non-pano').css('display', 'block');\r\n that.$dom.find('.visualOutputCont.vi_an.pano').css('display', 'none');\r\n } else {\r\n that.$dom.find('.visualOutputCont.vi_an.non-pano').css('display', 'none');\r\n that.$dom.find('.visualOutputCont.vi_an.pano').css('display', 'none');\r\n }\r\n\r\n var result = {\r\n view: app.current.view,\r\n raw: raw,\r\n firstRun: firstRun,\r\n };\r\n\r\n var tOHeight = Number.parseFloat(current.tOHeight);\r\n var tOWidth = Number.parseFloat(current.tOWidth);\r\n result.tOWidth = tOWidth;\r\n var elevation = Number.parseFloat(current.cameraHeight);\r\n var tilt = Number.parseFloat(current.camTilt);\r\n var res_hor = Number.parseFloat(raw.HorizontalResolution);\r\n var res_ver = Number.parseFloat(raw.VerticalResolution);\r\n var fov_hor = Number.parseFloat(current.fov_hor || raw.HFOVmin);\r\n var fov_ver = Number.parseFloat(current.fov_ver || raw.VFOVmin);\r\n\r\n result.res_hor = res_hor;\r\n result.res_ver = res_ver;\r\n result.fov_hor = fov_hor;\r\n result.fov_ver = fov_ver;\r\n\r\n result.tilt = tilt;\r\n result.elevation = elevation;\r\n\r\n result.dmin = elevation * Math.tan(degToRad(90 - tilt - fov_ver / 2));\r\n if (result.dmin < 0) { result.dmin = 0; }\r\n result.dmax = elevation * Math.tan(degToRad(90 - tilt + fov_ver / 2));\r\n result.overHorizon = (90 - tilt + fov_ver / 2) >= 90;\r\n result.dmaxp = (elevation - HUMAN_HEIGHT) * Math.tan(degToRad(90 - tilt + fov_ver / 2));\r\n\r\n if (raw.Illuminator === 'TRUE') {\r\n result.illuminator = true;\r\n result.illu_range = Number.parseFloat(raw.IlluminatorRange);\r\n result.illu_range_ground = Math.min(Math.sqrt((result.illu_range * result.illu_range) - (elevation * elevation)), result.dmax);\r\n result.illu_fullDistance = result.dmax;\r\n if (result.overHorizon) {\r\n result.illu_range_ground = Math.sqrt((result.illu_range * result.illu_range) - (elevation * elevation));\r\n result.illu_fullDistance = result.illu_range_ground;\r\n }\r\n\r\n // that.$dom.find('.visualOutputCont.camera .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(result.illu_range) + ' ' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(2)').text(app.iFtF(result.illu_range).toFixed(2) + ' ' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.camera .visualOutRow:nth-child(4) span:nth-child(1)').text((app.view !== 'side' ? app.ll('settingsModeVisualHorizontalAngle') : app.ll('settingsModeVisualVerticalAngle')));\r\n that.$dom.find('.visualOutputCont.camera .visualOutRow:nth-child(4) span:nth-child(2)').text((app.view !== 'side' ? fov_hor : fov_ver).toFixed(0) + '°');\r\n\r\n $('.settings-sticky-title.ir').css('visibility', 'visible');\r\n $('.settings-sticky-content.ir').css('visibility', 'visible');\r\n $($('.settings-sticky-content.ir .settings-sticky-row').children()[1]).text(app.iFtF(result.illu_range).toFixed(2) + ' ' + app.unitSymbol());\r\n } else {\r\n $('.settings-sticky-title.ir').css('visibility', 'hidden');\r\n $('.settings-sticky-content.ir').css('visibility', 'hidden');\r\n }\r\n\r\n if (raw.VideoAnalytics === 'TRUE' || raw.VideoAnalytics === 'OPT') {\r\n // console.log(app.current.va);\r\n var va_res_hor = Number.parseFloat(app.current.va.hRes);\r\n var va_res_ver = Number.parseFloat(app.current.va.vRes);\r\n var va_type = app.current.va.type;\r\n var va_min_size = app.current.va.min_size;\r\n console.log(\"!?\", va_min_size)\r\n\r\n var obj_x = tOWidth;\r\n var obj_y = tOHeight;\r\n\r\n result.va_dmaxObject = (elevation - tOHeight) * Math.tan(degToRad(90 - tilt + fov_ver / 2));\r\n\r\n var img_x = res_hor;\r\n var img_y = res_ver;\r\n\r\n var va_x = va_res_hor;\r\n var va_y = va_res_ver;\r\n\r\n var VA_object_pixel_base_x, VA_object_pixel_base_y, VA_min_object_pixel_x, VA_min_object_pixel_y;\r\n\r\n const VA_MIN_SIZE_EVA_IVA_PRO_PERIMETER = 20; // 20 pixel area surface. is in the table for no reason\r\n const VA_MIN_SIZE_BUILDING_TRAFFIC_AREA = 256; // 256 pixel area surface is required, now same algo as Perimeter\r\n const VA_MIN_SIZE_PRO_APPEARANCE = 2784; // 256 pixel area surface is required, now same algo as Perimeter\r\n const VA_MIN_SIZE_PRO_PPE = 2784; // 256 pixel area surface is required, now same algo as Perimeter\r\n \r\n // let va_min_size_type = 20;\r\n // if (va_type == \"EVA\" || va_type == \"IVA\" || va_type == \"IVA Pro Perimeter\" ) {\r\n // va_min_size_type = VA_MIN_SIZE_EVA_IVA_PRO_PERIMETER;\r\n // }\r\n // if ( va_type == \"IVA Pro Appearance\" ) {\r\n // va_min_size_type = VA_MIN_SIZE_PRO_APPEARANCE;\r\n // }\r\n // if (va_type == \"IVA Pro PPE\" ) {\r\n // va_min_size_type = VA_MIN_SIZE_PRO_PPE;\r\n // }\r\n\r\n // if (va_type == \"IVA Pro Buildings\" || va_type == \"IVA Pro Traffic\") {\r\n // va_min_size_type = VA_MIN_SIZE_BUILDING_TRAFFIC_AREA;\r\n // }\r\n\r\n if (obj_x < obj_y) {\r\n VA_object_pixel_base_x = 1;\r\n VA_object_pixel_base_y = obj_y / obj_x;\r\n } else {\r\n VA_object_pixel_base_y = 1;\r\n VA_object_pixel_base_x = obj_x / obj_y;\r\n }\r\n VA_min_object_pixel_x = VA_object_pixel_base_x;\r\n VA_min_object_pixel_y = VA_object_pixel_base_y;\r\n\r\n while (VA_min_object_pixel_x * VA_min_object_pixel_y < va_min_size) {\r\n VA_min_object_pixel_x += VA_object_pixel_base_x;\r\n VA_min_object_pixel_y += VA_object_pixel_base_y;\r\n }\r\n\r\n VA_min_object_pixel_x = Math.ceil(VA_min_object_pixel_x);\r\n VA_min_object_pixel_y = Math.ceil(VA_min_object_pixel_y);\r\n\r\n var IPPM_x = VA_min_object_pixel_x / obj_x * img_x / va_x;\r\n var IPPM_y = VA_min_object_pixel_y / obj_y * img_y / va_y;\r\n\r\n var dminh = tOWidth / (2 * 0.3 * Math.tan(degToRad(fov_hor / 2)));\r\n var dminv = tOHeight / (2 * 0.3 * Math.tan(degToRad(fov_ver / 2)));\r\n\r\n var dmaxv = obj_y / (2 * (VA_min_object_pixel_y / va_res_ver) * Math.tan(degToRad(fov_ver * .5)));\r\n var dmaxh = obj_x / (2 * (VA_min_object_pixel_x / va_res_hor) * Math.tan(degToRad(fov_hor * .5)));\r\n\r\n result.va_dmin = Math.max(dminv, dminh);\r\n if (result.va_dmin < elevation) {\r\n result.va_dmin_ground = result.dmin;\r\n } else {\r\n result.va_dmin_ground = Math.max(Math.sqrt((result.va_dmin * result.va_dmin) - (elevation * elevation)), result.dmin);\r\n }\r\n result.va_dmax = Math.min(dmaxv, dmaxh);\r\n result.va_dmax_ground = Math.min(Math.sqrt((result.va_dmax * result.va_dmax) - (elevation * elevation)), result.va_dmaxObject);\r\n result.va_fullDistance = result.dmax;\r\n if (result.overHorizon) {\r\n result.va_dmax_ground = Math.sqrt((result.va_dmax * result.va_dmax) - (elevation * elevation));\r\n result.va_fullDistance = result.va_dmax_ground;\r\n }\r\n }\r\n\r\n result.center = {\r\n x: 54,\r\n y: 169\r\n }\r\n\r\n if (raw.Thermal === 'TRUE' || raw.Thermal === true) {\r\n result.thermal = true;\r\n result.p_ground_max = -1000;\r\n result.d_dri_i = res_hor / (2 * DRI_I * Math.tan(degToRad(fov_hor * 0.5)));\r\n if (result.d_dri_i > elevation) {\r\n result.d_dri_i_ground = Math.sqrt((result.d_dri_i * result.d_dri_i) - (elevation * elevation));\r\n result.p_ground_max = Math.max(result.p_ground_max, result.d_dri_i_ground);\r\n }\r\n result.d_dri_r = res_hor / (2 * DRI_R * Math.tan(degToRad(fov_hor * 0.5)));\r\n if (result.d_dri_r > elevation) {\r\n result.d_dri_r_ground = Math.sqrt((result.d_dri_r * result.d_dri_r) - (elevation * elevation));\r\n result.p_ground_max = Math.max(result.p_ground_max, result.d_dri_r_ground);\r\n }\r\n result.d_dri_d = res_hor / (2 * DRI_D * Math.tan(degToRad(fov_hor * 0.5)));\r\n if (result.d_dri_d > elevation) {\r\n result.d_dri_d_ground = Math.sqrt((result.d_dri_d * result.d_dri_d) - (elevation * elevation));\r\n result.p_ground_max = Math.max(result.p_ground_max, result.d_dri_d_ground);\r\n }\r\n if (result.dmaxp > 0 && result.dmaxp < 10000) {\r\n result.p_ground_max = Math.min(result.p_ground_max, result.dmaxp);\r\n }\r\n result.dori_ground_max = result.p_ground_max;\r\n if (!result.overHorizon) {\r\n result.dori_ground_max = Math.max(result.dmax, result.p_ground_max);\r\n }\r\n } else {\r\n result.thermal = false;\r\n result.p_ground_max = -1000;\r\n result.d_dori_i = res_hor / (2 * DORI_I * Math.tan(degToRad(fov_hor * 0.5)));\r\n if (result.d_dori_i > elevation) {\r\n result.d_dori_i_ground = Math.sqrt((result.d_dori_i * result.d_dori_i) - (elevation * elevation));\r\n result.p_ground_max = Math.max(result.p_ground_max, result.d_dori_i_ground);\r\n }\r\n result.d_dori_r = res_hor / (2 * DORI_R * Math.tan(degToRad(fov_hor * 0.5)));\r\n if (result.d_dori_r > elevation) {\r\n result.d_dori_r_ground = Math.sqrt((result.d_dori_r * result.d_dori_r) - (elevation * elevation));\r\n result.p_ground_max = Math.max(result.p_ground_max, result.d_dori_r_ground);\r\n }\r\n result.d_dori_o = res_hor / (2 * DORI_O * Math.tan(degToRad(fov_hor * 0.5)));\r\n if (result.d_dori_o > elevation) {\r\n result.d_dori_o_ground = Math.sqrt((result.d_dori_o * result.d_dori_o) - (elevation * elevation));\r\n result.p_ground_max = Math.max(result.p_ground_max, result.d_dori_o_ground);\r\n }\r\n result.d_dori_d = res_hor / (2 * DORI_D * Math.tan(degToRad(fov_hor * 0.5)));\r\n if (result.d_dori_d > elevation) {\r\n result.d_dori_d_ground = Math.sqrt((result.d_dori_d * result.d_dori_d) - (elevation * elevation));\r\n result.p_ground_max = Math.max(result.p_ground_max, result.d_dori_d_ground);\r\n }\r\n if (result.dmaxp > 0 && result.dmaxp < 10000) {\r\n result.p_ground_max = Math.min(result.p_ground_max, result.dmaxp);\r\n }\r\n result.dori_ground_max = result.p_ground_max;\r\n if (!result.overHorizon) {\r\n result.dori_ground_max = Math.max(result.dmax, result.p_ground_max);\r\n }\r\n }\r\n\r\n result.maskPoint1 = {\r\n x: 620,\r\n y: result.center.y - Math.tan(degToRad(fov_hor * 0.5)) * 566\r\n }\r\n\r\n result.maskPoint2 = {\r\n x: 620,\r\n y: result.center.y + Math.tan(degToRad(fov_hor * 0.5)) * 566\r\n }\r\n\r\n if (raw.Thermal === 'TRUE' || raw.Thermal === true) {\r\n result.chordMax = 2 * (result.dmax > result.d_dri_d ? result.dmax : result.d_dri_d) * Math.sin(degToRad(fov_hor / 2));\r\n result.chordDmax = 2 * result.dmax * Math.sin(degToRad(result.fov_hor / 2));\r\n result.chordDorid = 2 * result.d_dri_d * Math.sin(degToRad(result.fov_hor / 2));\r\n\r\n result.middle = ((result.dmaxp < result.d_dri_d ? result.dmaxp : result.d_dri_d) + result.dmin) / 2;\r\n if (result.dmax < 0) { result.middle = (result.d_dri_d + result.dmin) / 2; }\r\n result.chordMiddle = result.middle * Math.sin(degToRad(fov_hor / 2));\r\n } else {\r\n result.chordMax = 2 * (result.dmax > result.d_dori_d ? result.dmax : result.d_dori_d) * Math.sin(degToRad(fov_hor / 2));\r\n result.chordDmax = 2 * result.dmax * Math.sin(degToRad(result.fov_hor / 2));\r\n result.chordDorid = 2 * result.d_dori_d * Math.sin(degToRad(result.fov_hor / 2));\r\n\r\n result.middle = ((result.dmaxp < result.d_dori_d ? result.dmaxp : result.d_dori_d) + result.dmin) / 2;\r\n if (result.dmax < 0) { result.middle = (result.d_dori_d + result.dmin) / 2; }\r\n result.chordMiddle = result.middle * Math.sin(degToRad(fov_hor / 2));\r\n }\r\n\r\n app.view == 'side' ? VisualNonpanoSide(that.$dom.find('.fovSideContainer'), result) : false;\r\n app.view == 'top' ? VisualNonpanoTop(that.$dom.find('.fovTopContainer'), result) : false;\r\n\r\n if (raw.VideoAnalytics === 'TRUE' || raw.VideoAnalytics === 'OPT') {\r\n var vamin = result.dmin;\r\n var vamax = result.dmaxp;\r\n if (vamax > 10000) { vamax = result.d_dori_d; }\r\n if (vamin < 0) { vamin = 0; }\r\n\r\n that.$dom.find('.visualOutputCont.vi_an .visualOutRow:nth-child(1) span.lessTable:nth-child(4)').text(app.iFtF(result.va_dmin_ground).toFixed(2) + ' ' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.vi_an .visualOutRow:nth-child(2) span.lessTable:nth-child(4)').text(app.iFtF(result.va_dmax_ground).toFixed(2) + ' ' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.vi_an .visualOutRow:nth-child(2) span.moreTable:nth-child(6)').text(app.iFtF(result.va_dmin).toFixed(2) + ' ' + app.unitSymbol() + '*');\r\n that.$dom.find('.visualOutputCont.vi_an .visualOutRow:nth-child(3) span.moreTable:nth-child(6)').text(app.iFtF(result.va_dmax).toFixed(2) + ' ' + app.unitSymbol() + '*');\r\n that.$dom.find('.visualOutputCont.vi_an .visualOutRow:nth-child(3) span:nth-child(2)').text((app.view !== 'side' ? fov_hor : fov_ver).toFixed(0) + '°');\r\n that.$dom.find('.visualOutputCont.vi_an .visualOutRow:nth-child(3) span:nth-child(1)').text((app.view !== 'side' ? app.ll('settingsModeVisualHorizontalAngle') : app.ll('settingsModeVisualVerticalAngle')));\r\n\r\n $('.settings-sticky-title.va-mode').css('visibility', 'visible');\r\n $('.settings-sticky-content.va-mode').css('visibility', 'visible');\r\n $('.settings-sticky-content.va-mode .settings-sticky-row:nth-child(1)').children().first().next().text(app.iFtF(result.va_dmax).toFixed(2) + ' ' + app.unitSymbol());\r\n $('.settings-sticky-content.va-mode .settings-sticky-row:nth-child(2)').children().first().next().text(app.iFtF(result.va_dmin).toFixed(2) + ' ' + app.unitSymbol());\r\n } else {\r\n $('.settings-sticky-title.va-mode').css('visibility', 'hidden');\r\n $('.settings-sticky-content.va-mode').css('visibility', 'hidden');\r\n }\r\n $('.settings-sticky-title.va-mode').text(va_type);\r\n that.$dom.find('.visualOutputCont.lenscalc .visualOutRow:nth-child(4) span:nth-child(2)').text((app.view !== 'side' ? fov_hor : fov_ver).toFixed(0) + '°');\r\n that.$dom.find('.visualOutputCont.lenscalc .visualOutRow:nth-child(4) span:nth-child(1)').text((app.view !== 'side' ? app.ll('settingsModeVisualHorizontalAngle') : app.ll('settingsModeVisualVerticalAngle')));\r\n\r\n if (raw.Thermal === 'TRUE' || raw.Thermal === true) {\r\n setViusalOutputToDri(app.iFtF(result.d_dri_d).toFixed(2) + ' ' + app.unitSymbol(), app.iFtF(result.d_dri_r).toFixed(2) + ' ' + app.unitSymbol(), app.iFtF(result.d_dri_i).toFixed(2) + ' ' + app.unitSymbol());\r\n } else {\r\n setViusalOutputToDori(app.iFtF(result.d_dori_d).toFixed(2) + ' ' + app.unitSymbol(), app.iFtF(result.d_dori_o).toFixed(2) + ' ' + app.unitSymbol(), app.iFtF(result.d_dori_r).toFixed(2) + ' ' + app.unitSymbol(), app.iFtF(result.d_dori_i).toFixed(2) + ' ' + app.unitSymbol());\r\n }\r\n\r\n $('.settings-sticky-content.dori .settings-sticky-row').eq(0).children().first().next().text(app.iFtF(result.d_dori_d).toFixed(2) + ' ' + app.unitSymbol());\r\n $('.settings-sticky-content.dori .settings-sticky-row').eq(1).children().first().next().text(app.iFtF(result.d_dori_o).toFixed(2) + ' ' + app.unitSymbol());\r\n $('.settings-sticky-content.dori .settings-sticky-row').eq(2).children().first().next().text(app.iFtF(result.d_dori_r).toFixed(2) + ' ' + app.unitSymbol());\r\n $('.settings-sticky-content.dori .settings-sticky-row').eq(3).children().first().next().text(app.iFtF(result.d_dori_i).toFixed(2) + ' ' + app.unitSymbol());\r\n\r\n // $('.visualizeInfo').remove();\r\n // $('body').css('pointer-events', 'auto');\r\n $('.settings-sticky-load-indicator').removeClass('active');\r\n app.lastResult = result;\r\n\r\n // console.log(result);\r\n return;\r\n }\r\n if (raw.ctype === 'pano') {\r\n // $('.visualOutputCont.vi_an .visualOutRow:nth-child(3) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n $('.visualOutputCont.lenscalc .visualOutRow:nth-child(4) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n $('.visualOutputCont.camera .visualOutRow:nth-child(4) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n if (app.current.view == \"vi_an\") {\r\n that.$dom.find('.visualOutputCont.vi_an.non-pano').css('display', 'none');\r\n that.$dom.find('.visualOutputCont.vi_an.pano').css('display', 'block');\r\n } else {\r\n that.$dom.find('.visualOutputCont.vi_an.non-pano').css('display', 'none');\r\n that.$dom.find('.visualOutputCont.vi_an.pano').css('display', 'none');\r\n }\r\n\r\n var obj = obj || {};\r\n\r\n var result = {\r\n view: app.current.view,\r\n raw: raw,\r\n firstRun: firstRun,\r\n };\r\n var tOHeight = Number.parseFloat(current.tOHeight);\r\n var tOWidth = Number.parseFloat(current.tOWidth);\r\n\r\n result.elevation = Number.parseFloat(current.cameraHeight);\r\n result.a1 = Number.parseFloat(raw.A1);\r\n result.a3 = Number.parseFloat(raw.A3);\r\n result.a5 = Number.parseFloat(raw.A5);\r\n result.pixel_size = Number.parseFloat(raw.PixelSize);\r\n result.fov = 360;\r\n\r\n if (raw.Illuminator === 'TRUE') {\r\n result.illuminator = true;\r\n result.illu_range = Number.parseFloat(raw.IlluminatorRange);\r\n result.illu_range_ground = result.illu_range;\r\n\r\n $('.settings-sticky-title.ir').css('visibility', 'visible');\r\n $('.settings-sticky-content.ir').css('visibility', 'visible');\r\n $($('.settings-sticky-content.ir .settings-sticky-row').children()[1]).text(app.iFtF(result.illu_range).toFixed(2) + ' ' + app.unitSymbol());\r\n } else {\r\n $('.settings-sticky-title.ir').css('visibility', 'hidden');\r\n $('.settings-sticky-content.ir').css('visibility', 'hidden');\r\n }\r\n\r\n if (raw.VideoAnalytics === 'OPT' || raw.VideoAnalytics === 'TRUE') {\r\n var obj_x = tOWidth;\r\n var obj_y = tOHeight;\r\n\r\n var img_x = Number.parseFloat(raw.HorizontalResolution);\r\n var img_y = Number.parseFloat(raw.VerticalResolution);\r\n\r\n var va_x = Number.parseFloat(app.current.va.hRes);\r\n var va_y = Number.parseFloat(app.current.va.vRes);\r\n\r\n var VA_object_pixel_base_x, VA_object_pixel_base_y, VA_min_object_pixel_x, VA_min_object_pixel_y;\r\n\r\n if (obj_x < obj_y) {\r\n VA_object_pixel_base_x = 1;\r\n VA_object_pixel_base_y = obj_y / obj_x;\r\n } else {\r\n VA_object_pixel_base_y = 1;\r\n VA_object_pixel_base_x = obj_x / obj_y;\r\n }\r\n VA_min_object_pixel_x = VA_object_pixel_base_x;\r\n VA_min_object_pixel_y = VA_object_pixel_base_y;\r\n\r\n while (VA_min_object_pixel_x * VA_min_object_pixel_y < app.current.va.min_size) {\r\n VA_min_object_pixel_x += VA_object_pixel_base_x;\r\n VA_min_object_pixel_y += VA_object_pixel_base_y;\r\n }\r\n\r\n VA_min_object_pixel_x = Math.ceil(VA_min_object_pixel_x);\r\n VA_min_object_pixel_y = Math.ceil(VA_min_object_pixel_y);\r\n\r\n var IPPM_x = VA_min_object_pixel_x / obj_x * img_x / va_x;\r\n var IPPM_y = VA_min_object_pixel_y / obj_y * img_y / va_y;\r\n\r\n result.tOHeight = tOHeight;\r\n result.IPPM_y = IPPM_y;\r\n result.img_y = Number.parseFloat(raw.VerticalResolution);\r\n }\r\n\r\n result.d_dori_d = null;\r\n result.d_dori_o = null;\r\n result.d_dori_r = null;\r\n result.d_dori_i = null;\r\n\r\n var lastValue = 0;\r\n var distance = 0;\r\n while (true) {\r\n distance += 0.01;\r\n if (app.current.mountposition === 'Wall') {\r\n var alpha_head = radToDeg(Math.atan((result.elevation - HUMAN_HEIGHT) / distance));\r\n var alpha_foot = radToDeg(Math.atan(result.elevation / distance));\r\n\r\n var pixel_head = result.a1 * alpha_head + result.a3 * Math.pow(alpha_head, 3) + result.a5 * Math.pow(alpha_head, 5);\r\n var pixel_foot = result.a1 * alpha_foot + result.a3 * Math.pow(alpha_foot, 3) + result.a5 * Math.pow(alpha_foot, 5);\r\n\r\n var target_pixel = (pixel_foot - pixel_head) / result.pixel_size * 1000;\r\n var density = target_pixel / HUMAN_HEIGHT;\r\n } else if (app.current.mountposition === 'Ceiling') {\r\n //based on height\r\n\r\n var alpha_head = radToDeg(Math.atan(distance / (result.elevation - HUMAN_HEIGHT)));\r\n var alpha_foot = radToDeg(Math.atan(distance / result.elevation));\r\n\r\n var pixel_head = result.a1 * alpha_head + result.a3 * Math.pow(alpha_head, 3) + result.a5 * Math.pow(alpha_head, 5);\r\n var pixel_foot = result.a1 * alpha_foot + result.a3 * Math.pow(alpha_foot, 3) + result.a5 * Math.pow(alpha_foot, 5);\r\n\r\n var target_pixel = (pixel_head - pixel_foot) / result.pixel_size * 1000;\r\n var density = target_pixel / HUMAN_HEIGHT;\r\n\r\n //based on width\r\n\r\n var a_left = radToDeg(Math.atan((distance + (HUMAN_WIDTH / 2)) / (result.elevation - HUMAN_HEIGHT)));\r\n var a_right = radToDeg(Math.atan((distance - (HUMAN_WIDTH / 2)) / (result.elevation - HUMAN_HEIGHT)));\r\n\r\n var pixel_left = result.a1 * a_left + result.a3 * Math.pow(a_left, 3) + result.a5 * Math.pow(a_left, 5);\r\n var pixel_right = result.a1 * a_right + result.a3 * Math.pow(a_right, 3) + result.a5 * Math.pow(a_right, 5);\r\n\r\n var target_pixel_alt = (pixel_left - pixel_right) / result.pixel_size * 1000;\r\n var density_alt = target_pixel_alt / HUMAN_WIDTH;\r\n\r\n if (density_alt > density) { density = density_alt; }\r\n }\r\n\r\n if (distance > 1000) {\r\n break;\r\n }\r\n\r\n if (density < DORI_D && lastValue > density) {\r\n break;\r\n }\r\n\r\n lastValue = density;\r\n\r\n if (density * result.tOHeight <= result.img_y * .3 && !result.va_dmin) {\r\n //Ist kleiner als 30% dies Bildschirm Screens\r\n result.va_dmin = distance;\r\n }\r\n\r\n if (density > result.IPPM_y) {\r\n result.va_dmax = distance;\r\n }\r\n\r\n if (density >= DORI_D) {\r\n result.d_dori_d = distance;\r\n }\r\n\r\n if (density >= DORI_O) {\r\n result.d_dori_o = distance;\r\n }\r\n\r\n if (density >= DORI_R) {\r\n result.d_dori_r = distance;\r\n }\r\n\r\n if (density >= DORI_I) {\r\n result.d_dori_i = distance;\r\n }\r\n }\r\n\r\n if (app.current.mountposition === 'Wall') {\r\n app.view == 'side' ? VisualPano360SideWall(that.$dom.find('.fovSideContainer'), result) : false;\r\n app.view == 'top' ? VisualPano360TopWall(that.$dom.find('.fovTopContainer'), result) : false;\r\n } else if (app.current.mountposition === 'Ceiling') {\r\n app.view == 'side' ? VisualPano360SideCeil(that.$dom.find('.fovSideContainer'), result) : false;\r\n app.view == 'top' ? VisualPano360TopCeil(that.$dom.find('.fovTopContainer'), result) : false;\r\n }\r\n\r\n if (raw.VideoAnalytics === 'TRUE' || raw.VideoAnalytics === 'OPT') {\r\n var vamin = result.va_dmin;\r\n var vamax = result.va_dmax;\r\n if (vamax > 10000) { vamax = result.d_dori_d; }\r\n if (vamin < 0) { vamin = 0; }\r\n\r\n\r\n that.$dom.find('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2)').css('display', 'table-row');\r\n that.$dom.find('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(1) span:nth-child(4)').text(app.ll('settingsModeVisualNotAvailable'));\r\n that.$dom.find('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(1)').text(\"\");\r\n that.$dom.find('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(2)').text(\"\");\r\n that.$dom.find('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(4)').text(app.iFtF(vamax).toFixed(2) + ' ' + app.unitSymbol());\r\n\r\n $('.settings-sticky-title.va-mode').css('visibility', 'visible');\r\n $('.settings-sticky-content.va-mode').css('visibility', 'visible');\r\n $('.settings-sticky-content.va-mode .settings-sticky-row:nth-child(1)').children().first().next().text(app.iFtF(result.va_dmax).toFixed(2) + ' ' + app.unitSymbol());\r\n $('.settings-sticky-content.va-mode .settings-sticky-row:nth-child(2)').children().first().next().text(app.iFtF(result.va_dmin).toFixed(2) + ' ' + app.unitSymbol());\r\n } else {\r\n $('.settings-sticky-title.va-mode').css('visibility', 'hidden');\r\n $('.settings-sticky-content.va-mode').css('visibility', 'hidden');\r\n }\r\n\r\n that.$dom.find('.visualOutputCont.dori').removeClass('dri');\r\n that.$dom.find('.visualOutputCont.dori .visualOutTitle').text(app.ll('settingsModeVisualOutCalcDORI'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutInfo').text(app.ll('settingsModeVisualOutMoreDORI'));\r\n that.$dom.find('.visualSecondRow .visualButtons .buttonFOVDori').text(app.ll('settingsModeVisualDORI'));\r\n\r\n if (app.current.view === 'dori') {\r\n that.$dom.find('.visualSecondRow .legendCont.dri').addClass('hidden');\r\n that.$dom.find('.visualSecondRow .legendCont.dori').removeClass('hidden');\r\n }\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_D'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_O'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_R'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(4) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_I'));\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(result.d_dori_d).toFixed(2) + ' ' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(3)').text(app.ll('settingsModeVisualResolution') + ' ' + app.iFfF(DORI_D) + ' pp' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(5)').text(app.iFtF(2 * result.d_dori_d * Math.sin(degToRad(result.fov_hor / 2))).toFixed(2) + '' + app.unitSymbol());\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFtF(result.d_dori_o).toFixed(2) + ' ' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(3)').text(app.ll('settingsModeVisualResolution') + ' ' + app.iFfF(DORI_O) + ' pp' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(5)').text(app.iFtF(2 * result.d_dori_o * Math.sin(degToRad(result.fov_hor / 2))).toFixed(2) + '' + app.unitSymbol());\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(2)').text(app.iFtF(result.d_dori_r).toFixed(2) + ' ' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(3)').text(app.ll('settingsModeVisualResolution') + ' ' + app.iFfF(DORI_R) + ' pp' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(5)').text(app.iFtF(2 * result.d_dori_r * Math.sin(degToRad(result.fov_hor / 2))).toFixed(2) + '' + app.unitSymbol());\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(4) span:nth-child(2)').text(app.iFtF(result.d_dori_i).toFixed(2) + ' ' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(4) span:nth-child(3)').text(app.ll('settingsModeVisualResolution') + ' ' + app.iFfF(DORI_I) + ' pp' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(4) span:nth-child(5)').text(app.iFtF(2 * result.d_dori_i * Math.sin(degToRad(result.fov_hor / 2))).toFixed(2) + '' + app.unitSymbol());\r\n\r\n $('.settings-sticky-content.dori .settings-sticky-row').eq(0).children().first().next().text(app.iFtF(result.d_dori_d).toFixed(2) + ' ' + app.unitSymbol());\r\n $('.settings-sticky-content.dori .settings-sticky-row').eq(1).children().first().next().text(app.iFtF(result.d_dori_o).toFixed(2) + ' ' + app.unitSymbol());\r\n $('.settings-sticky-content.dori .settings-sticky-row').eq(2).children().first().next().text(app.iFtF(result.d_dori_r).toFixed(2) + ' ' + app.unitSymbol());\r\n $('.settings-sticky-content.dori .settings-sticky-row').eq(3).children().first().next().text(app.iFtF(result.d_dori_i).toFixed(2) + ' ' + app.unitSymbol());\r\n\r\n if (app.current.view === 'dori') {\r\n\r\n } else {\r\n\r\n }\r\n\r\n // $('.visualizeInfo').remove();\r\n // $('body').css('pointer-events', 'auto');\r\n $('.settings-sticky-load-indicator').removeClass('active');\r\n app.lastResult = result;\r\n return;\r\n }\r\n });\r\n }\r\n\r\n app.on('unitChange', function () {\r\n if (!app.settings.activeCanvas) { return; }\r\n // createVisualizeInfo();\r\n renderVisual();\r\n });\r\n\r\n var lastType;\r\n const loader = PIXI.loader;\r\n loader.add('kamera', '../img/icons/camera.png');\r\n loader.add('pano', '../img/icons/camera_pano.png');\r\n loader.add('anfasserX', '../img/icons/anfasser_entfernung_xachse.png');\r\n loader.add('anfasserY', '../img/icons/anfasser_entfernung_yachse.png');\r\n loader.add('man', '../img/icons/mensch.png');\r\n loader.add('car', '../img/icons/car.png');\r\n loader.add('man_crawling', '../img/icons/man_crawling.png');\r\n loader.add('man_upright', '../img/icons/man_upright.png');\r\n\r\n loader.load(function (loader, loadedResources) {\r\n pixiReady = true;\r\n });\r\n\r\n var waitAfterResize;\r\n\r\n function setViusalOutputToDri(d, r, i) {\r\n that.$dom.find('.visualOutputCont.dori').addClass('dri');\r\n that.$dom.find('.visualOutputCont.dori .visualOutTitle').text(app.ll('settingsModeVisualOutCalcDRI'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutInfo').text(app.ll('settingsModeVisualOutMoreDRI'));\r\n that.$dom.find('.visualSecondRow .visualButtons .buttonFOVDori').text(app.ll('settingsModeVisualDRI'));\r\n\r\n if (app.current.view === 'dori') {\r\n that.$dom.find('.visualSecondRow .legendCont.dori').addClass('hidden');\r\n that.$dom.find('.visualSecondRow .legendCont.dri').removeClass('hidden');\r\n }\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_D'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_R'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_I'));\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(2)').text(d);\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(2)').text(r);\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(2)').text(i);\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(3)').text(app.iFfF(DRI_D).toFixed(0) + ' pp' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(3)').text(app.iFfF(DRI_R).toFixed(0) + ' pp' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(3)').text(app.iFfF(DRI_I).toFixed(0) + ' pp' + app.unitSymbol());\r\n }\r\n\r\n function setViusalOutputToDori(d, o, r, i) {\r\n that.$dom.find('.visualOutputCont.dori').removeClass('dri');\r\n that.$dom.find('.visualOutputCont.dori .visualOutTitle').text(app.ll('settingsModeVisualOutCalcDORI'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutInfo').text(app.ll('settingsModeVisualOutMoreDORI'));\r\n that.$dom.find('.visualSecondRow .visualButtons .buttonFOVDori').text(app.ll('settingsModeVisualDORI'));\r\n\r\n if (app.current.view === 'dori') {\r\n that.$dom.find('.visualSecondRow .legendCont.dri').addClass('hidden');\r\n that.$dom.find('.visualSecondRow .legendCont.dori').removeClass('hidden');\r\n }\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_D'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_O'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_R'));\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(4) span:nth-child(1)').text(app.ll('settingsModeVisualDORI_I'));\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(2)').text(d);\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(2)').text(o);\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(2)').text(r);\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(4) span:nth-child(2)').text(i);\r\n\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(1) span:nth-child(3)').text(app.iFfF(DORI_D).toFixed(0) + ' pp' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(2) span:nth-child(3)').text(app.iFfF(DORI_O).toFixed(0) + ' pp' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(3) span:nth-child(3)').text(app.iFfF(DORI_R).toFixed(0) + ' pp' + app.unitSymbol());\r\n that.$dom.find('.visualOutputCont.dori .visualOutRow:nth-child(4) span:nth-child(3)').text(app.iFfF(DORI_I).toFixed(0) + ' pp' + app.unitSymbol());\r\n }\r\n\r\n function onWindowResize() {\r\n var height = app.view == 'side' ? that.$dom.find('.fovSideContainer').width() * .4829 : that.$dom.find('.fovTopContainer').width() * .4829;\r\n that.$dom.find('.fovSideContainer').css('height', height);\r\n that.$dom.find('.fovSideContainer').children().remove();\r\n that.$dom.find('.fovTopContainer').css('height', height);\r\n that.$dom.find('.fovTopContainer').children().remove();\r\n\r\n const CONTENT_REPOSITIONING = 76;\r\n const MAX_GRID_SIZE = 1200;\r\n\r\n var width = Math.min('side' ? that.$dom.find('.fovSideContainer').width() : that.$dom.find('.fovTopContainer').width(), MAX_GRID_SIZE);\r\n that.$dom.find('.visualWrap .tabs-content').css('margin-bottom', (-CONTENT_REPOSITIONING * width / MAX_GRID_SIZE) + 'px');\r\n that.$dom.find('.fovSideContainer, .fovTopContainer').css('transform', 'translate(0, ' + (-CONTENT_REPOSITIONING * width / MAX_GRID_SIZE) + 'px)');\r\n\r\n if (!app.settings.activeCanvas) { return; }\r\n if (waitAfterResize) { clearTimeout(waitAfterResize); }\r\n // createVisualizeInfo();\r\n waitAfterResize = setTimeout(function () {\r\n renderVisual();\r\n }, 1000);\r\n }\r\n $(window).on('resize', onWindowResize);\r\n $('#settingsmode-label').on('click', function () {\r\n setTimeout(onWindowResize);\r\n });\r\n\r\n new Foundation.Reveal(that.$dom.find('#doridriWrapInfo'));\r\n new Foundation.Reveal(that.$dom.find('#doriInfo'));\r\n\r\n that.$dom.on('click', '.visualOutInfo', function (e) {\r\n that.$dom.find('span.moreTable').toggleClass('show');\r\n that.$dom.find('span.lessTable').toggleClass('hide');\r\n that.$dom.find('.visualOutputCont.vi_an p.visualOutNotice').toggleClass('show');\r\n });\r\n return that;\r\n}","module.exports = function Accordion($parent, content) {\r\n var that = this;\r\n that.$item = $('
        ').appendTo($parent);\r\n var firstItem = true;\r\n\r\n content.forEach(function (v) {\r\n var $item = $(`\r\n
      • \r\n \r\n
        \r\n \r\n
        \r\n
      • \r\n `).appendTo(that.$item);\r\n $item.find('.accordion-content').append(v(titleChange));\r\n function titleChange(data) {\r\n $item.find('a.accordion-title').html(data);\r\n }\r\n });\r\n\r\n new Foundation.Accordion(that.$item, {\r\n 'allowAllClosed': false,\r\n 'slideSpeed': 500,\r\n 'multiOpen': true\r\n });\r\n\r\n return that;\r\n}\r\n\r\n","var currentID = 0;\r\nconst QUESTION_ID_PREFIX = 'question_';\r\nconst QUESTION_NAME_PREFIX = 'question_';\r\n\r\nmodule.exports = function Question($parent, question, reveal, inputs, onValueChange) {\r\n\tif (typeof onValueChange !== 'function') { throw new Error('Not a Function'); }\r\n\tif (!Array.isArray(inputs)) { throw new Error('Not an Array'); }\r\n\tvar that = this;\r\n\tvar myId = currentID++;\r\n\r\n\tvar inputHTML = '';\r\n\tinputs.forEach(function (v) {\r\n\t\tinputHTML += `\r\n\t\t\t\r\n\t\t\t\r\n\t\t`;\r\n\t});\r\n\r\n\tthat.$item = $(`\r\n\t\t
        \r\n\t\t\t\t
        \r\n\t\t\t\t
        ${question}
        \r\n\t\t\t\t\r\n\t\t\t\t\t
        \r\n\t\t\t\t\t${reveal}\r\n\t\t\t\t\t\r\n\t\t\t\t

        \r\n\t\t\t\t${inputHTML}\r\n\t\t\t
        \r\n\t\t
        \r\n\t`);\r\n\r\n\tthat.$item.on('click', 'input[type=radio]', function (e) {\r\n\t\tthat.$item.find('h5').addClass('done');\r\n\t\tonValueChange($(e.target).attr('value'));\r\n\t});\r\n\r\n\t$parent.append(that.$item);\r\n\tnew Foundation.Reveal(that.$item.find('#questionInfo' + currentID));\r\n\r\n\tthat.next = null;\r\n\r\n\tthat.remove = function remove() {\r\n\t\tif (that.next) { that.next.remove(); }\r\n\t\tthat.$item.remove();\r\n\t\tconsole.log(\"tried to remove\");\r\n\t}\r\n}","var currentID = 0;\r\nconst SLIDER_ID_PREFIX = 'slider_';\r\nconst SLIDER_NAME_PREFIX = 'slider_';\r\n\r\nmodule.exports = function Slider($parent, minValue, maxValue, initialValue, logarithmValue, onValueChange) {\r\n var that = this;\r\n var myId = currentID++;\r\n that.$item = $(`\r\n
        \r\n \r\n
        \r\n \r\n
        \r\n \r\n
        \r\n
        \r\n \r\n \r\n
        \r\n
        \r\n
        \r\n `);\r\n that.$item.appendTo($parent);\r\n\r\n var slider;\r\n setTimeout(function () {\r\n slider = new Foundation.Slider(that.$item.find('.slider'), {\r\n 'decimal': 2,\r\n 'step': 0.01,\r\n 'start': minValue,\r\n 'end': maxValue,\r\n 'initialStart': initialValue,\r\n 'positionValueFunction': logarithmValue ? 'pow' : 'linear',\r\n 'nonLinearBase': logarithmValue ? logarithmValue : 1,\r\n });\r\n });\r\n\r\n that.$item.on('changed.zf.slider', function (e) {\r\n onValueChange($(this).find('.slider-handle').attr('aria-valuenow'));\r\n });\r\n\r\n that.unset\r\n\r\n that.reset = function reset(minValue, maxValue, initialValue, logarithmValue) {\r\n that.$item.find('.slider').foundation('destroy');\r\n slider = new Foundation.Slider(that.$item.find('.slider'), {\r\n 'decimal': 2,\r\n 'step': 0.01,\r\n 'start': minValue,\r\n 'end': maxValue,\r\n 'initialStart': initialValue,\r\n 'positionValueFunction': logarithmValue ? 'pow' : 'linear',\r\n 'nonLinearBase': logarithmValue ? logarithmValue : 1,\r\n });\r\n }\r\n}","const HUMAN_HEIGHT = 1.7, HUMAN_WIDTH = 0.5;\r\n\r\nfunction radToDeg(number) {\r\n\treturn number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n\treturn number * Math.PI / 180;\r\n}\r\n\r\nfunction panoDensityAt(elevation, a1, a3, a5, pixel_size, distance) {\r\n\tif (app.current.mountposition === 'Wall') {\r\n\t\tvar alpha_head = radToDeg(Math.atan((elevation - HUMAN_HEIGHT) / distance));\r\n\t\tvar alpha_foot = radToDeg(Math.atan(elevation / distance));\r\n\r\n\t\tvar pixel_head = a1 * alpha_head + a3 * Math.pow(alpha_head, 3) + a5 * Math.pow(alpha_head, 5);\r\n\t\tvar pixel_foot = a1 * alpha_foot + a3 * Math.pow(alpha_foot, 3) + a5 * Math.pow(alpha_foot, 5);\r\n\r\n\t\tvar target_pixel = (pixel_foot - pixel_head) / pixel_size * 1000;\r\n\t\tvar density = target_pixel / HUMAN_HEIGHT;\r\n\t\treturn density\r\n\t} else if (app.current.mountposition === 'Ceiling') {\r\n\t\t//based on height\r\n\r\n\t\tvar alpha_head = radToDeg(Math.atan(distance / (elevation - HUMAN_HEIGHT)));\r\n\t\tvar alpha_foot = radToDeg(Math.atan(distance / elevation));\r\n\r\n\t\tvar pixel_head = a1 * alpha_head + a3 * Math.pow(alpha_head, 3) + a5 * Math.pow(alpha_head, 5);\r\n\t\tvar pixel_foot = a1 * alpha_foot + a3 * Math.pow(alpha_foot, 3) + a5 * Math.pow(alpha_foot, 5);\r\n\r\n\t\tvar target_pixel = (pixel_head - pixel_foot) / pixel_size * 1000;\r\n\t\tvar density = target_pixel / HUMAN_HEIGHT;\r\n\r\n\t\t//based on width\r\n\r\n\t\tvar a_left = radToDeg(Math.atan((distance + (HUMAN_WIDTH / 2)) / (elevation - HUMAN_HEIGHT)));\r\n\t\tvar a_right = radToDeg(Math.atan((distance - (HUMAN_WIDTH / 2)) / (elevation - HUMAN_HEIGHT)));\r\n\r\n\t\tvar pixel_left = a1 * a_left + a3 * Math.pow(a_left, 3) + a5 * Math.pow(a_left, 5);\r\n\t\tvar pixel_right = a1 * a_right + a3 * Math.pow(a_right, 3) + a5 * Math.pow(a_right, 5);\r\n\r\n\t\tvar target_pixel_alt = (pixel_left - pixel_right) / pixel_size * 1000;\r\n\t\tvar density_alt = target_pixel_alt / HUMAN_WIDTH;\r\n\r\n\t\tif (density_alt > density) { density = density_alt; }\r\n\t\treturn density;\r\n\t}\r\n}\r\n\r\n\r\nmodule.exports = function () {\r\n\tapp.on('ppmChangeSide', function (value) {\r\n\t\tvar $sliderToolTip;\r\n\t\tsetTimeout(function () {\r\n\t\t\t$sliderToolTip = $('#sliderTooltip');\r\n\t\t}, 25);\r\n\t\tfunction s(v) {\r\n\t\t\treturn contWidth / 620 * v;\r\n\t\t}\r\n\t\tvar contWidth = value.container.width();\r\n\t\tif (value.type === 'nonpano') {\r\n\t\t\tvar minimum = value.min ? s(value.min * value.ppm) : 0;\r\n\t\t\tvar maximum = s(value.max * value.ppm);\r\n\t\t\tfor (var x in value.spots) {\r\n\t\t\t\tvalue.spots[x] = s(value.spots[x] * value.ppm);\r\n\t\t\t}\r\n\t\t\tvalue.spots.sort((a, b) => {\r\n\t\t\t\tif (a > b) { return 1; }\r\n\t\t\t\tif (a < b) { return -1; }\r\n\t\t\t\treturn 0;\r\n\t\t\t});\r\n\t\t\tvar posX = s(value.max * value.ppm);\r\n\t\t\tif (value.startvalue) { posX = s(value.startvalue * value.ppm); }\r\n\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\tif (posX > maximum) { posX = maximum; }\r\n\r\n\t\t\tvar fovSideSlider = $('
        ');\r\n\t\t\tfovSideSlider.addClass('fovSideSlider fovSideSliderLine');\r\n\t\t\tfovSideSlider.css({\r\n\t\t\t\t'width': '30px',\r\n\t\t\t\t'height': '30px',\r\n\t\t\t\t'position': 'absolute',\r\n\t\t\t\t'background-image': 'url(../img/icons/anfasser_entfernung_xachse.png)',\r\n\t\t\t\t'background-size': 'contain',\r\n\t\t\t\t'transform': 'translate(-15px, -15px)',\r\n\t\t\t\t'top': s(278) + 'px',\r\n\t\t\t\t'left': (s(54) + posX) + 'px',\r\n\t\t\t});\r\n\r\n\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\tvar heightAtX = value.elevation - (distance * Math.tan(degToRad(value.tilt - value.fov_ver / 2)));\r\n\t\t\tvar fov_width = 2 * Math.sqrt((distance * distance) + (value.elevation * value.elevation)) * Math.tan(degToRad(value.fov_hor / 2));\r\n\t\t\tvar resolution = value.res_hor / fov_width;\r\n\r\n\t\t\tfunction setText(distance, heightAtX, fov_width, resolution) {\r\n\t\t\t\tif (app.current.view === 'dori') {\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(4)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(resolution).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(2)').text(app.iFtF(heightAtX).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualHeight'));\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'vi_an') {\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(2)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(3)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFtF(heightAtX).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(2) span:nth-child(1)').text(app.ll('settingsModeVisualHeight'));\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'camera') {\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(4)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(resolution).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(2)').text(app.iFtF(heightAtX).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualHeight'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\tvalue.container.append(fovSideSlider);\r\n\r\n\r\n\t\t\tsetText(distance, heightAtX, fov_width, resolution);\r\n\r\n\t\t\tfovSideSlider.on('mousedown touchstart', function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tif ($sliderToolTip) { $sliderToolTip.remove(); }\r\n\t\t\t\tvar prevX;\r\n\t\t\t\tif (e.type === 'touchstart') {\r\n\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t}\r\n\t\t\t\tif (e.type === 'mousedown') {\r\n\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t}\r\n\t\t\t\tvar isMagnetic = false;\r\n\t\t\t\tvar addedDelta = 0;\r\n\t\t\t\tvar magneticDistance = s(15);\r\n\t\t\t\t$(document).on('mousemove touchmove', function (e) {\r\n\t\t\t\t\tvar delta;\r\n\t\t\t\t\tif (e.type === 'touchmove') {\r\n\t\t\t\t\t\tdelta = e.originalEvent.touches[0].clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.type === 'mousemove') {\r\n\t\t\t\t\t\tdelta = e.clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// console.log(posX, delta, isMagnetic, addedDelta);\r\n\t\t\t\t\tif (isMagnetic && (addedDelta > -magneticDistance && addedDelta < magneticDistance)) {\r\n\t\t\t\t\t\taddedDelta += delta;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t} else if (isMagnetic) { isMagnetic = false; delta = addedDelta; addedDelta = 0; }\r\n\t\t\t\t\tposX = posX + delta;\r\n\t\t\t\t\tif (delta > 0) {\r\n\t\t\t\t\t\tvar next = posX;\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { next = value.spots[x]; break; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (+next - +magneticDistance < +posX) { posX = next; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (delta < 0) {\r\n\t\t\t\t\t\tvar previous = value.spots[0];\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { break; }\r\n\t\t\t\t\t\t\tprevious = value.spots[x];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (+previous + +magneticDistance > +posX) { posX = previous; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\t\t\tif (posX > maximum) { posX = maximum; }\r\n\t\t\t\t\tfovSideSlider.css('left', (s(54) + posX) + 'px');\r\n\r\n\t\t\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\t\t\tvar heightAtX = value.elevation - (distance * Math.tan(degToRad(value.tilt - value.fov_ver / 2)));\r\n\t\t\t\t\tvar fov_width = 2 * Math.sqrt((distance * distance) + (value.elevation * value.elevation)) * Math.tan(degToRad(value.fov_hor / 2));\r\n\t\t\t\t\tvar resolution = value.res_hor / fov_width;\r\n\r\n\t\t\t\t\tsetText(distance, heightAtX, fov_width, resolution);\r\n\t\t\t\t});\r\n\r\n\t\t\t\t$(document).on('mouseup touchend', function () {\r\n\t\t\t\t\t$(document).off('mousemove touchmove');\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (value.type === 'panoCeil') {\r\n\t\t\tvar minimum = value.min ? s(value.min * value.ppm) : 0;\r\n\t\t\tvar maximum = s(275);\r\n\t\t\tfor (var x in value.spots) {\r\n\t\t\t\tvalue.spots[x] = s(value.spots[x] * value.ppm);\r\n\t\t\t}\r\n\t\t\tvalue.spots.sort((a, b) => {\r\n\t\t\t\tif (a > b) { return 1; }\r\n\t\t\t\tif (a < b) { return -1; }\r\n\t\t\t\treturn 0;\r\n\t\t\t});\r\n\t\t\tvar posX = s(value.max * value.ppm);\r\n\t\t\tif (value.startvalue) { posX = s(value.startvalue * value.ppm); }\r\n\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\tif (posX > maximum) { posX = maximum; }\r\n\r\n\t\t\tvar fovSideSlider = $('
        ');\r\n\t\t\tfovSideSlider.addClass('fovSideSlider fovSideSliderLine');\r\n\t\t\tfovSideSlider.css({\r\n\t\t\t\t'width': '30px',\r\n\t\t\t\t'height': '30px',\r\n\t\t\t\t'position': 'absolute',\r\n\t\t\t\t'background-image': 'url(../img/icons/anfasser_entfernung_xachse.png)',\r\n\t\t\t\t'background-size': 'contain',\r\n\t\t\t\t'transform': 'translate(-15px, -15px)',\r\n\t\t\t\t'top': s(278) + 'px',\r\n\t\t\t\t'left': (s(54 + 281) + posX) + 'px',\r\n\t\t\t});\r\n\r\n\t\t\t// var fovSideText = $('');\r\n\t\t\t// fovSideText.html(`
        ${app.iFtF((posX * 620 / contWidth) / value.ppm).toFixed(2)} ${app.unitSymbol()}`);\r\n\t\t\t// fovSideText.css({\r\n\t\t\t// \t'position': 'absolute',\r\n\t\t\t// \t'top': s(278) + 'px',\r\n\t\t\t// \t'transform': 'translate(5px, -50%)',\r\n\t\t\t// \t'color': '#b5b5b7',\r\n\t\t\t// \t'margin': '0 10px',\r\n\t\t\t// \t'white-space': 'nowrap',\r\n\t\t\t// \t'line-height': '31px'\r\n\t\t\t// });\r\n\t\t\t// if (posX < 300) {\r\n\t\t\t// \tfovSideText.css('left', (s(54 + 281) + posX) + 'px');\r\n\t\t\t// } else {\r\n\t\t\t// \tfovSideText.css('left', (s(54 + 281) + 300) + 'px');\r\n\t\t\t// }\r\n\r\n\t\t\tfunction setText(distance, heightAtX) {\r\n\t\t\t\tif (app.current.view === 'dori') {\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(4)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.ll('settingsModeVisualCalculating'));\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualHeight'));\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'vi_an') {\r\n\t\t\t\t\t$('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2)').css('display', 'table-row');\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(1) span:nth-child(4)').text(app.ll('settingsModeVisualNotAvailable'));\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(1)').text(\"\");\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(2)').text(\"\");\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'camera') {\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(4)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.ll('settingsModeVisualCalculating'));\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualHeight'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\tsetText(distance);\r\n\r\n\t\t\tvar density = panoDensityAt(value.result.elevation, value.result.a1, value.result.a3, value.result.a5, value.result.pixel_size, distance);\r\n\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\r\n\t\t\tvalue.container.append(fovSideSlider);\r\n\t\t\t// value.container.append(fovSideText);\r\n\r\n\r\n\t\t\tfovSideSlider.on('mousedown touchstart', function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tif ($sliderToolTip) { $sliderToolTip.remove(); }\r\n\t\t\t\tvar prevX;\r\n\t\t\t\tif (e.type === 'touchstart') {\r\n\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t}\r\n\t\t\t\tif (e.type === 'mousedown') {\r\n\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t}\r\n\t\t\t\tvar isMagnetic = false;\r\n\t\t\t\tvar addedDelta = 0;\r\n\t\t\t\tvar magneticDistance = s(15);\r\n\t\t\t\t$(document).on('mousemove touchmove', function (e) {\r\n\t\t\t\t\tvar delta;\r\n\t\t\t\t\tif (e.type === 'touchmove') {\r\n\t\t\t\t\t\tdelta = e.originalEvent.touches[0].clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.type === 'mousemove') {\r\n\t\t\t\t\t\tdelta = e.clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (isMagnetic && (addedDelta > -magneticDistance && addedDelta < magneticDistance)) {\r\n\t\t\t\t\t\taddedDelta += delta;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t} else if (isMagnetic) { isMagnetic = false; delta = addedDelta; addedDelta = 0; }\r\n\t\t\t\t\tposX = posX + delta;\r\n\t\t\t\t\tif (delta > 0) {\r\n\t\t\t\t\t\tvar next = posX;\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { next = value.spots[x]; break; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (next - magneticDistance < posX) { posX = next; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (delta < 0) {\r\n\t\t\t\t\t\tvar previous = value.spots[0];\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { break; }\r\n\t\t\t\t\t\t\tprevious = value.spots[x];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (previous + magneticDistance > posX) { posX = previous; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\t\t\tif (posX > maximum) { posX = maximum; }\r\n\t\t\t\t\tfovSideSlider.css('left', (s(54 + 281) + posX) + 'px');\r\n\t\t\t\t\t// fovSideText.html(`
        ${app.iFtF((posX * 620 / contWidth) / value.ppm).toFixed(2)} ${app.unitSymbol()}`);\r\n\t\t\t\t\t// if (posX < 300) {\r\n\t\t\t\t\t// \tfovSideText.css('left', (s(54 + 281) + posX) + 'px');\r\n\t\t\t\t\t// } else {\r\n\t\t\t\t\t// \tfovSideText.css('left', (s(54 + 281) + 300) + 'px');\r\n\t\t\t\t\t// }\r\n\t\t\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\t\t\tsetText(distance);\r\n\r\n\t\t\t\t\tclearTimeout(densityTimer);\r\n\t\t\t\t\tdensityTimer = setTimeout(() => {\r\n\t\t\t\t\t\tvar density = panoDensityAt(value.result.elevation, value.result.a1, value.result.a3, value.result.a5, value.result.pixel_size, distance);\r\n\t\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t}, 300);\r\n\t\t\t\t});\r\n\t\t\t\tvar densityTimer;\r\n\r\n\t\t\t\t$(document).on('mouseup touchend', function () {\r\n\t\t\t\t\t$(document).off('mousemove touchmove');\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (value.type === 'panoWall') {\r\n\t\t\tvar minimum = value.min ? s(value.min * value.ppm) : 0;\r\n\t\t\tvar maximum = s(value.max * value.ppm);\r\n\t\t\tfor (var x in value.spots) {\r\n\t\t\t\tvalue.spots[x] = s(value.spots[x] * value.ppm);\r\n\t\t\t}\r\n\t\t\tvalue.spots.sort((a, b) => {\r\n\t\t\t\tif (a > b) { return 1; }\r\n\t\t\t\tif (a < b) { return -1; }\r\n\t\t\t\treturn 0;\r\n\t\t\t});\r\n\t\t\tvar posX = s(value.max * value.ppm);\r\n\t\t\tif (value.startvalue) { posX = s(value.startvalue * value.ppm); }\r\n\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\tif (posX > maximum) { posX = maximum; }\r\n\r\n\t\t\tvar fovSideSlider = $('
        ');\r\n\t\t\tfovSideSlider.addClass('fovSideSlider fovSideSliderLine');\r\n\t\t\tfovSideSlider.css({\r\n\t\t\t\t'width': '30px',\r\n\t\t\t\t'height': '30px',\r\n\t\t\t\t'position': 'absolute',\r\n\t\t\t\t'background-image': 'url(../img/icons/anfasser_entfernung_xachse.png)',\r\n\t\t\t\t'background-size': 'contain',\r\n\t\t\t\t'transform': 'translate(-15px, -15px)',\r\n\t\t\t\t'top': s(278) + 'px',\r\n\t\t\t\t'left': (s(54) + posX) + 'px',\r\n\t\t\t});\r\n\r\n\t\t\t// var fovSideText = $('');\r\n\t\t\t// fovSideText.html(`
        ${app.iFtF((posX * 620 / contWidth) / value.ppm).toFixed(2)} ${app.unitSymbol()}`);\r\n\t\t\t// fovSideText.css({\r\n\t\t\t// \t'position': 'absolute',\r\n\t\t\t// \t'top': s(278) + 'px',\r\n\t\t\t// \t'transform': 'translate(5px, -50%)',\r\n\t\t\t// \t'color': '#b5b5b7',\r\n\t\t\t// \t'margin': '0 10px',\r\n\t\t\t// \t'white-space': 'nowrap',\r\n\t\t\t// \t'line-height': '31px'\r\n\t\t\t// });\r\n\t\t\t// if (posX < 600) {\r\n\t\t\t// \tfovSideText.css('left', (s(54) + posX) + 'px');\r\n\t\t\t// } else {\r\n\t\t\t// \tfovSideText.css('left', (s(54) + 600) + 'px');\r\n\t\t\t// }\r\n\r\n\t\t\tfunction setText(distance, heightAtX) {\r\n\t\t\t\tif (app.current.view === 'dori') {\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(4)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.ll('settingsModeVisualCalculating'));\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualHeight'));\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'vi_an') {\r\n\t\t\t\t\t$('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2)').css('display', 'table-row');\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(1) span:nth-child(4)').text(app.ll('settingsModeVisualNotAvailable'));\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(1)').text(\"\");\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(2)').text(\"\");\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'camera') {\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(4)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.ll('settingsModeVisualCalculating'));\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualHeight'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\tsetText(distance);\r\n\r\n\t\t\tvar density = panoDensityAt(value.result.elevation, value.result.a1, value.result.a3, value.result.a5, value.result.pixel_size, distance);\r\n\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\r\n\t\t\tvalue.container.append(fovSideSlider);\r\n\t\t\t// value.container.append(fovSideText);\r\n\r\n\r\n\t\t\tfovSideSlider.on('mousedown touchstart', function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tif ($sliderToolTip) { $sliderToolTip.remove(); }\r\n\t\t\t\tvar prevX;\r\n\t\t\t\tif (e.type === 'touchstart') {\r\n\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t}\r\n\t\t\t\tif (e.type === 'mousedown') {\r\n\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t}\r\n\t\t\t\tvar isMagnetic = false;\r\n\t\t\t\tvar addedDelta = 0;\r\n\t\t\t\tvar magneticDistance = s(15);\r\n\t\t\t\t$(document).on('mousemove touchmove', function (e) {\r\n\t\t\t\t\tvar delta;\r\n\t\t\t\t\tif (e.type === 'touchmove') {\r\n\t\t\t\t\t\tdelta = e.originalEvent.touches[0].clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.type === 'mousemove') {\r\n\t\t\t\t\t\tdelta = e.clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (isMagnetic && (addedDelta > -magneticDistance && addedDelta < magneticDistance)) {\r\n\t\t\t\t\t\taddedDelta += delta;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t} else if (isMagnetic) { isMagnetic = false; delta = addedDelta; addedDelta = 0; }\r\n\t\t\t\t\tposX = posX + delta;\r\n\t\t\t\t\tif (delta > 0) {\r\n\t\t\t\t\t\tvar next = posX;\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { next = value.spots[x]; break; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (next - magneticDistance < posX) { posX = next; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (delta < 0) {\r\n\t\t\t\t\t\tvar previous = value.spots[0];\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { break; }\r\n\t\t\t\t\t\t\tprevious = value.spots[x];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (previous + magneticDistance > posX) { posX = previous; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\t\t\tif (posX > maximum) { posX = maximum; }\r\n\t\t\t\t\tfovSideSlider.css('left', (s(54) + posX) + 'px');\r\n\t\t\t\t\t// fovSideText.html(`
        ${app.iFtF((posX * 620 / contWidth) / value.ppm).toFixed(2)} ${app.unitSymbol()}`);\r\n\t\t\t\t\t// if (posX < 600) {\r\n\t\t\t\t\t// \tfovSideText.css('left', (s(54) + posX) + 'px');\r\n\t\t\t\t\t// } else {\r\n\t\t\t\t\t// \tfovSideText.css('left', (s(54) + 600) + 'px');\r\n\t\t\t\t\t// }\r\n\r\n\t\t\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\t\t\tsetText(distance);\r\n\r\n\t\t\t\t\tclearTimeout(densityTimer);\r\n\t\t\t\t\tdensityTimer = setTimeout(() => {\r\n\t\t\t\t\t\tvar density = panoDensityAt(value.result.elevation, value.result.a1, value.result.a3, value.result.a5, value.result.pixel_size, distance);\r\n\t\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t}, 300);\r\n\t\t\t\t});\r\n\t\t\t\tvar densityTimer;\r\n\r\n\t\t\t\t$(document).on('mouseup touchend', function () {\r\n\t\t\t\t\t$(document).off('mousemove touchmove');\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n\r\n\tapp.on('ppmChangeTop', function (value) {\r\n\t\tvar $sliderToolTip = $('#sliderTooltip');\r\n\t\tfunction s(v) {\r\n\t\t\treturn contWidth / 620 * v;\r\n\t\t}\r\n\t\tvar contWidth = value.container.width();\r\n\t\tif (value.type === 'nonpano') {\r\n\t\t\tconsole.log(value)\r\n\t\t\tvar minimum = value.min ? s(value.min * value.ppm) : 0;\r\n\t\t\tvar maximum = s(value.max * value.ppm);\r\n\t\t\tfor (var x in value.spots) {\r\n\t\t\t\tvalue.spots[x] = s(value.spots[x] * value.ppm);\r\n\t\t\t}\r\n\t\t\tvalue.spots.sort((a, b) => {\r\n\t\t\t\tif (a > b) { return 1; }\r\n\t\t\t\tif (a < b) { return -1; }\r\n\t\t\t\treturn 0;\r\n\t\t\t});\r\n\t\t\tvar posX = s((value.startPos || value.max) * value.ppm);\r\n\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\tif (posX > maximum) { posX = maximum; }\r\n\r\n\t\t\tvar fovTopSlider = $('
        ');\r\n\t\t\tfovTopSlider.addClass('fovSideSlider fovSideSliderLine');\r\n\t\t\tfovTopSlider.css({\r\n\t\t\t\t'width': '30px',\r\n\t\t\t\t'height': '30px',\r\n\t\t\t\t'position': 'absolute',\r\n\t\t\t\t'background-image': 'url(../img/icons/anfasser_entfernung_xachse.png)',\r\n\t\t\t\t'background-size': 'contain',\r\n\t\t\t\t'transform': 'translate(-15px, -15px)',\r\n\t\t\t\t'top': s(278) + 'px',\r\n\t\t\t\t'left': (s(54) + posX) + 'px',\r\n\t\t\t});\r\n\r\n\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\tvar heightAtX = value.elevation - (distance * Math.tan(degToRad(value.tilt - value.fov_ver / 2)));\r\n\t\t\tvar fov_width = 2 * Math.sqrt((distance * distance) + (value.elevation * value.elevation)) * Math.tan(degToRad(value.fov_hor / 2));\r\n\t\t\tvar resolution = value.res_hor / fov_width;\r\n\r\n\t\t\tvalue.container.append(fovTopSlider);\r\n\t\t\tfunction setText(distance, heightAtX, fov_width, resolution) {\r\n\t\t\t\tif (app.current.view === 'dori') {\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(4)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(resolution).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(2)').text(app.iFtF(fov_width).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualWidth'));\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'vi_an') {\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(2)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(3)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFtF(fov_width).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.vi_an .visualOutRow:nth-child(2) span:nth-child(1)').text(app.ll('settingsModeVisualWidth'));\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'camera') {\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(4)').css('display', 'table-row');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(resolution).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(2)').text(app.iFtF(fov_width).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualWidth'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tsetText(distance, heightAtX, fov_width, resolution);\r\n\r\n\t\t\tfovTopSlider.on('mousedown touchstart', function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tif ($sliderToolTip) { $sliderToolTip.remove(); }\r\n\t\t\t\tvar prevX;\r\n\t\t\t\tif (e.type === 'touchstart') {\r\n\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t}\r\n\t\t\t\tif (e.type === 'mousedown') {\r\n\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t}\r\n\t\t\t\tvar isMagnetic = false;\r\n\t\t\t\tvar addedDelta = 0;\r\n\t\t\t\tvar magneticDistance = s(15);\r\n\t\t\t\t$(document).on('mousemove touchmove', function (e) {\r\n\t\t\t\t\tvar delta;\r\n\t\t\t\t\tif (e.type === 'touchmove') {\r\n\t\t\t\t\t\tdelta = e.originalEvent.touches[0].clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.type === 'mousemove') {\r\n\t\t\t\t\t\tdelta = e.clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (isMagnetic && (addedDelta > -magneticDistance && addedDelta < magneticDistance)) {\r\n\t\t\t\t\t\taddedDelta += delta;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t} else if (isMagnetic) { isMagnetic = false; delta = addedDelta; addedDelta = 0; }\r\n\t\t\t\t\tposX = posX + delta;\r\n\t\t\t\t\tif (delta > 0) {\r\n\t\t\t\t\t\tvar next = posX;\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { next = value.spots[x]; break; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (next - magneticDistance < posX) { posX = next; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (delta < 0) {\r\n\t\t\t\t\t\tvar previous = value.spots[0];\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { break; }\r\n\t\t\t\t\t\t\tprevious = value.spots[x];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (previous + magneticDistance > posX) { posX = previous; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\t\t\tif (posX > maximum) { posX = maximum; }\r\n\t\t\t\t\tfovTopSlider.css('left', s(54) + posX + 'px');\r\n\r\n\t\t\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\t\t\tvar heightAtX = value.elevation - (distance * Math.tan(degToRad(value.tilt - value.fov_ver / 2)));\r\n\t\t\t\t\tvar fov_width = 2 * Math.sqrt((distance * distance) + (value.elevation * value.elevation)) * Math.tan(degToRad(value.fov_hor / 2));\r\n\t\t\t\t\tvar resolution = value.res_hor / fov_width;\r\n\r\n\t\t\t\t\tsetText(distance, heightAtX, fov_width, resolution);\r\n\r\n\t\t\t\t\t// clearTimeout(densityTimer);\r\n\t\t\t\t\t// densityTimer = setTimeout(() => {\r\n\t\t\t\t\t// \tvar density = panoDensity(value.result.elevation, value.result.raw.a1, value.result.raw.a3, value.result.raw.a5, value.result.raw.pixel_size);\r\n\t\t\t\t\t// \t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFtF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t// \t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFtF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t// }, 3000);\r\n\t\t\t\t});\r\n\t\t\t\t// var densityTimer;\r\n\r\n\t\t\t\t$(document).on('mouseup touchend', function () {\r\n\t\t\t\t\t$(document).off('mousemove touchmove');\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (value.type === 'panoCeil') {\r\n\t\t\tvar minimum = value.min ? s(value.min * value.ppm) : 0;\r\n\t\t\tvar maximum = s(173 * .5);\r\n\t\t\tfor (var x in value.spots) {\r\n\t\t\t\tvalue.spots[x] = s(value.spots[x] * value.ppm);\r\n\t\t\t}\r\n\t\t\tvalue.spots.sort((a, b) => {\r\n\t\t\t\tif (a > b) { return 1; }\r\n\t\t\t\tif (a < b) { return -1; }\r\n\t\t\t\treturn 0;\r\n\t\t\t});\r\n\t\t\tvar posY = s(value.max * value.ppm);\r\n\t\t\tif (posY < minimum) { posY = minimum; }\r\n\t\t\tif (posY > maximum) { posY = maximum; }\r\n\r\n\t\t\tvar fovTopSlider = $('
        ');\r\n\t\t\tfovTopSlider.addClass('fovSideSlider');\r\n\t\t\tfovTopSlider.css({\r\n\t\t\t\t'width': '30px',\r\n\t\t\t\t'height': '30px',\r\n\t\t\t\t'position': 'absolute',\r\n\t\t\t\t'background-image': 'url(../img/icons/anfasser_entfernung_yachse.png)',\r\n\t\t\t\t'background-size': 'contain',\r\n\t\t\t\t'transform': 'translate(-15px, -15px)',\r\n\t\t\t\t'top': (s(84 + 175 * .5) - posY) + 'px',\r\n\t\t\t\t'left': s(48) + 'px',\r\n\t\t\t});\r\n\r\n\t\t\t// var fovTopText = $('');\r\n\t\t\t// fovTopText.text(`${app.iFtF((posY * 620 / contWidth) / value.ppm).toFixed(2)} ${app.unitSymbol()}`);\r\n\t\t\t// fovTopText.css({\r\n\t\t\t// \t'position': 'absolute',\r\n\t\t\t// \t'top': (s(84 + 175 * .5) - posY) + 'px',\r\n\t\t\t// \t'left': s(52) + 'px',\r\n\t\t\t// \t'transform': 'translate(5px, -50%)',\r\n\t\t\t// \t'color': '#b5b5b7',\r\n\t\t\t// \t'margin': '0 10px',\r\n\t\t\t// \t'white-space': 'nowrap',\r\n\t\t\t// \t'line-height': '31px'\r\n\t\t\t// })\r\n\t\t\tvalue.container.append(fovTopSlider);\r\n\t\t\t// value.container.append(fovTopText);\r\n\r\n\t\t\tfunction setText(distance, heightAtX) {\r\n\t\t\t\tif (app.current.view === 'dori') {\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(4)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.ll('settingsModeVisualCalculating'));\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualWidth'));\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'vi_an') {\r\n\t\t\t\t\t$('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2)').css('display', 'table-row');\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(1) span:nth-child(4)').text(app.ll('settingsModeVisualNotAvailable'));\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(1)').text(\"\");\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(2)').text(\"\");\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'camera') {\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(4)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.ll('settingsModeVisualCalculating'));\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualWidth'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar distance = (posY * 620 / contWidth) / value.ppm;\r\n\t\t\tsetText(distance);\r\n\r\n\t\t\tvar density = panoDensityAt(value.result.elevation, value.result.a1, value.result.a3, value.result.a5, value.result.pixel_size, distance);\r\n\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\r\n\t\t\tfovTopSlider.on('mousedown touchstart', function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tif ($sliderToolTip) { $sliderToolTip.remove(); }\r\n\t\t\t\tvar prevY;\r\n\t\t\t\tif (e.type === 'touchstart') {\r\n\t\t\t\t\tprevY = e.originalEvent.touches[0].clientY;\r\n\t\t\t\t}\r\n\t\t\t\tif (e.type === 'mousedown') {\r\n\t\t\t\t\tprevY = e.clientY;\r\n\t\t\t\t}\r\n\t\t\t\tvar isMagnetic = false;\r\n\t\t\t\tvar addedDelta = 0;\r\n\t\t\t\tvar magneticDistance = s(10);\r\n\t\t\t\t$(document).on('mousemove touchmove', function (e) {\r\n\t\t\t\t\tvar delta;\r\n\t\t\t\t\tif (e.type === 'touchmove') {\r\n\t\t\t\t\t\tdelta = e.originalEvent.touches[0].clientY - prevY;\r\n\t\t\t\t\t\tprevY = e.originalEvent.touches[0].clientY;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.type === 'mousemove') {\r\n\t\t\t\t\t\tdelta = e.clientY - prevY;\r\n\t\t\t\t\t\tprevY = e.clientY;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (isMagnetic && (addedDelta > -magneticDistance && addedDelta < magneticDistance)) {\r\n\t\t\t\t\t\taddedDelta += delta;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t} else if (isMagnetic) { isMagnetic = false; delta = addedDelta; addedDelta = 0; }\r\n\t\t\t\t\tposY = posY - delta;\r\n\t\t\t\t\tif (delta < 0) {\r\n\t\t\t\t\t\tvar next = posY;\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posY) { next = value.spots[x]; break; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (+next - +magneticDistance < +posY) { posY = next; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (delta > 0) {\r\n\t\t\t\t\t\tvar previous = value.spots[0];\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posY) { break; }\r\n\t\t\t\t\t\t\tprevious = value.spots[x];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (+previous + +magneticDistance > +posY) { posY = previous; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (posY < minimum) { posY = minimum; }\r\n\t\t\t\t\tif (posY > maximum) { posY = maximum; }\r\n\t\t\t\t\tfovTopSlider.css('top', (s(84 + 175 * .5) - posY) + 'px'); // that .82 is a fix, but why, please enlighten meee\r\n\t\t\t\t\t// fovTopText.text(`${app.iFtF((posY * 620 / contWidth) / value.ppm).toFixed(2)} ${app.unitSymbol()}`);\r\n\t\t\t\t\t// fovTopText.css('top', (s(84 + 175 * .5) - posY) + 'px');\r\n\r\n\t\t\t\t\tvar distance = (posY * 620 / contWidth) / value.ppm;\r\n\t\t\t\t\tsetText(distance);\r\n\r\n\t\t\t\t\tclearTimeout(densityTimer);\r\n\t\t\t\t\tdensityTimer = setTimeout(() => {\r\n\t\t\t\t\t\tvar density = panoDensityAt(value.result.elevation, value.result.a1, value.result.a3, value.result.a5, value.result.pixel_size, distance);\r\n\t\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t}, 300);\r\n\t\t\t\t});\r\n\t\t\t\tvar densityTimer;\r\n\r\n\t\t\t\t$(document).on('mouseup touchend', function () {\r\n\t\t\t\t\t$(document).off('mousemove touchmove');\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (value.type === 'panoWall') {\r\n\t\t\tvar minimum = value.min ? s(value.min * value.ppm) : 0;\r\n\t\t\tvar maximum = s(value.max * value.ppm);\r\n\t\t\tfor (var x in value.spots) {\r\n\t\t\t\tvalue.spots[x] = s(value.spots[x] * value.ppm);\r\n\t\t\t}\r\n\t\t\tvalue.spots.sort((a, b) => {\r\n\t\t\t\tif (a > b) { return 1; }\r\n\t\t\t\tif (a < b) { return -1; }\r\n\t\t\t\treturn 0;\r\n\t\t\t});\r\n\t\t\tvar posX = s(value.max * value.ppm);\r\n\t\t\tif (value.startvalue) { posX = s(value.startvalue * value.ppm); }\r\n\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\tif (posX > maximum) { posX = maximum; }\r\n\r\n\t\t\tvar fovTopSlider = $('
        ');\r\n\t\t\tfovTopSlider.addClass('fovSideSlider fovSideSliderLine');\r\n\t\t\tfovTopSlider.css({\r\n\t\t\t\t'width': '30px',\r\n\t\t\t\t'height': '30px',\r\n\t\t\t\t'position': 'absolute',\r\n\t\t\t\t'background-image': 'url(../img/icons/anfasser_entfernung_xachse.png)',\r\n\t\t\t\t'background-size': 'contain',\r\n\t\t\t\t'transform': 'translate(-15px, -15px)',\r\n\t\t\t\t'top': s(278) + 'px',\r\n\t\t\t\t'left': (s(54 + 281) + posX) + 'px',\r\n\t\t\t});\r\n\r\n\t\t\t// var fovTopText = $('');\r\n\t\t\t// fovTopText.html(`
        ${app.iFtF((posX * 620 / contWidth) / value.ppm).toFixed(2)} ${app.unitSymbol()}`);\r\n\t\t\t// fovTopText.css({\r\n\t\t\t// \t'position': 'absolute',\r\n\t\t\t// \t'top': s(278) + 'px',\r\n\t\t\t// \t'transform': 'translate(5px, -50%)',\r\n\t\t\t// \t'color': '#b5b5b7',\r\n\t\t\t// \t'margin': '0 10px',\r\n\t\t\t// \t'white-space': 'nowrap',\r\n\t\t\t// \t'line-height': '31px'\r\n\t\t\t// });\r\n\t\t\t// if (posX < 300) {\r\n\t\t\t// \tfovTopText.css('left', (s(54 + 281) + posX) + 'px');\r\n\t\t\t// } else {\r\n\t\t\t// \tfovTopText.css('left', (s(54 + 281) + 300) + 'px');\r\n\t\t\t// }\r\n\r\n\t\t\tfunction setText(distance, heightAtX) {\r\n\t\t\t\tif (app.current.view === 'dori') {\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(4)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.ll('settingsModeVisualCalculating'));\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualWidth'));\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'vi_an') {\r\n\t\t\t\t\t$('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2)').css('display', 'table-row');\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(1) span:nth-child(4)').text(app.ll('settingsModeVisualNotAvailable'));\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(1)').text(\"\");\r\n $('.visualOutputCont.vi_an.pano .visualOutRow:nth-child(2) span:nth-child(2)').text(\"\");\r\n\t\t\t\t}\r\n\t\t\t\tif (app.current.view === 'camera') {\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(1) span:nth-child(2)').text(app.iFtF(distance).toFixed(2) + ' ' + app.unitSymbol());\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(4)').css('display', 'none');\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.ll('settingsModeVisualCalculating'));\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(2)').text(app.ll('settingsModeVisualNotAvailable'));\r\n\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(3) span:nth-child(1)').text(app.ll('settingsModeVisualWidth'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\tsetText(distance);\r\n\r\n\t\t\tvar density = panoDensityAt(value.result.elevation, value.result.a1, value.result.a3, value.result.a5, value.result.pixel_size, distance);\r\n\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\r\n\t\t\tvalue.container.append(fovTopSlider);\r\n\t\t\t// value.container.append(fovTopText);\r\n\r\n\t\t\tfovTopSlider.on('mousedown touchstart', function (e) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tif ($sliderToolTip) { $sliderToolTip.remove(); }\r\n\t\t\t\tvar prevX;\r\n\t\t\t\tif (e.type === 'touchstart') {\r\n\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t}\r\n\t\t\t\tif (e.type === 'mousedown') {\r\n\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t}\r\n\t\t\t\tvar isMagnetic = false;\r\n\t\t\t\tvar addedDelta = 0;\r\n\t\t\t\tvar magneticDistance = s(15);\r\n\t\t\t\t$(document).on('mousemove touchmove', function (e) {\r\n\t\t\t\t\tvar delta;\r\n\t\t\t\t\tif (e.type === 'touchmove') {\r\n\t\t\t\t\t\tdelta = e.originalEvent.touches[0].clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.originalEvent.touches[0].clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.type === 'mousemove') {\r\n\t\t\t\t\t\tdelta = e.clientX - prevX;\r\n\t\t\t\t\t\tprevX = e.clientX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (isMagnetic && (addedDelta > -magneticDistance && addedDelta < magneticDistance)) {\r\n\t\t\t\t\t\taddedDelta += delta;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t} else if (isMagnetic) { isMagnetic = false; delta = addedDelta; addedDelta = 0; }\r\n\t\t\t\t\tposX = posX + delta;\r\n\t\t\t\t\tif (delta > 0) {\r\n\t\t\t\t\t\tvar next = posX;\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { next = value.spots[x]; break; }\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (next - magneticDistance < posX) { posX = next; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (delta < 0) {\r\n\t\t\t\t\t\tvar previous = value.spots[0];\r\n\t\t\t\t\t\tfor (var x in value.spots) {\r\n\t\t\t\t\t\t\tif (value.spots[x] >= posX) { break; }\r\n\t\t\t\t\t\t\tprevious = value.spots[x];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (previous + magneticDistance > posX) { posX = previous; isMagnetic = true; }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (posX < minimum) { posX = minimum; }\r\n\t\t\t\t\tif (posX > maximum) { posX = maximum; }\r\n\t\t\t\t\tfovTopSlider.css('left', s(54 + 281) + posX + 'px');\r\n\t\t\t\t\t// fovTopText.html(`
        ${app.iFtF((posX * 620 / contWidth) / value.ppm).toFixed(2)} ${app.unitSymbol()}`);\r\n\t\t\t\t\t// if (posX < 300) {\r\n\t\t\t\t\t// \tfovTopText.css('left', (s(54 + 281) + posX) + 'px');\r\n\t\t\t\t\t// } else {\r\n\t\t\t\t\t// \tfovTopText.css('left', (s(54 + 281) + 300) + 'px');\r\n\t\t\t\t\t// }\r\n\t\t\t\t\tvar distance = (posX * 620 / contWidth) / value.ppm;\r\n\t\t\t\t\tsetText(distance);\r\n\r\n\t\t\t\t\tclearTimeout(densityTimer);\r\n\t\t\t\t\tdensityTimer = setTimeout(() => {\r\n\t\t\t\t\t\tvar density = panoDensityAt(value.result.elevation, value.result.a1, value.result.a3, value.result.a5, value.result.pixel_size, distance);\r\n\t\t\t\t\t\t$('.visualOutputCont.lenscalc .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t\t$('.visualOutputCont.camera .visualOutRow:nth-child(2) span:nth-child(2)').text(app.iFfF(density).toFixed(2) + ' pp' + app.unitSymbol());\r\n\t\t\t\t\t}, 300);\r\n\t\t\t\t});\r\n\t\t\t\tvar densityTimer;\r\n\r\n\t\t\t\t$(document).on('mouseup touchend', function () {\r\n\t\t\t\t\t$(document).off('mousemove touchmove');\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n}","const COLOR_DORI_D = 0x005691;\r\nconst COLOR_DORI_O = 0x1272AA;\r\nconst COLOR_DORI_R = 0x2B8FC3;\r\nconst COLOR_DORI_I = 0x3EAADB;\r\n\r\nconst COLOR_FOV = 0x3EAADB;\r\nconst COLOR_OUTFOV = 0xDB5C68;\r\nconst COLOR_SUPPORT_LINES = 0xB5B5B7;\r\nconst HUMAN_HEIGHT = 1.7,\r\n HUMAN_WIDTH = 0.5;\r\n\r\nfunction radToDeg(number) {\r\n return number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n return number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function vNonpanoTop($element, result) {\r\n // console.log(result);\r\n\r\n $(\".saveprint\").show();\r\n $(\".results\").show();\r\n $element.find('.canvasMessages').remove();\r\n function errorMessage() {\r\n container.html('');\r\n $('The values you have chosen are
        • below or above limits that can be rendered for display
        • not a valid combination.
        ').css({\r\n 'position': 'absolute',\r\n 'top': '50%',\r\n 'left': '50%',\r\n 'display': 'inline-block',\r\n 'transform': 'translate(-50%, -50%)',\r\n }).appendTo(container)\r\n }\r\n\r\n function vaError() {\r\n container.html('');\r\n $('' + app.ll('videoAnalyticsError') + '').css({\r\n 'position': 'absolute',\r\n 'top': '50%',\r\n 'left': '50%',\r\n 'display': 'inline-block',\r\n 'transform': 'translate(-50%, -50%)',\r\n }).appendTo(container)\r\n }\r\n\r\n var container = $element;\r\n container.html('');\r\n container.css('position', 'relative');\r\n container.css('height', container.width() * 0.4829 + 'px');\r\n\r\n var renderer = new PIXI.CanvasRenderer(container.width(), container.width() * 0.4829, { antialias: true, backgroundColor: 0xe6e6e8, roundPixels: true, forceFXAA: true });\r\n window.renderer = renderer;\r\n container.append(renderer.view);\r\n\r\n renderer.autoresize = true;\r\n renderer.resize(container.width(), container.width() * 0.4829);\r\n\r\n var stage = new PIXI.Container();\r\n var scalableCont = new PIXI.Container();\r\n\r\n const loader = PIXI.loader;\r\n render();\r\n\r\n function render() {\r\n function s(v) {\r\n return renderer.width / 620 * v;\r\n }\r\n // CANVAS Graphic Size 566 x 175\r\n // DESIRED SIZE 550 x 175\r\n\r\n if (result.view === 'vi_an' && isNaN(result.va_dmax_ground)) { vaError(); return; }\r\n\r\n if (result.dmin > result.p_ground_max) { errorMessage(); return; }\r\n if (result.elevation <= 2) { errorMessage(); return; }\r\n\r\n var ppmCanvas;\r\n var kameraPPM = 175 / result.elevation;\r\n var d_dori_dPPM;\r\n d_dori_dPPM = 550 / result.dori_ground_max;\r\n var dmaxPPM = 550 / result.dmax;\r\n\r\n var start = result.tilt - (result.fov_ver * 0.5);\r\n var end = result.tilt + (result.fov_ver * 0.5);\r\n var maskSelector = 0;\r\n var displayMaxWidth;\r\n if (start <= 0) {\r\n if (end <= 0) { errorMessage(); return; }\r\n ppmCanvas = d_dori_dPPM;\r\n displayMaxWidth = result.d_dori_d;\r\n maskSelector = 0;\r\n } else if (result.thermal) {\r\n if (result.dmax < result.d_dri_d) {\r\n ppmCanvas = dmaxPPM\r\n displayMaxWidth = result.dmax;\r\n maskSelector = 1;\r\n } else {\r\n ppmCanvas = d_dori_dPPM;\r\n displayMaxWidth = result.d_dori_d;\r\n maskSelector = 2;\r\n }\r\n } else {\r\n if (result.dmax < result.d_dori_d) {\r\n ppmCanvas = dmaxPPM\r\n displayMaxWidth = result.dmax;\r\n maskSelector = 1;\r\n } else {\r\n ppmCanvas = d_dori_dPPM;\r\n displayMaxWidth = result.d_dori_d;\r\n maskSelector = 2;\r\n }\r\n }\r\n if (result.view === 'vi_an' && result.va_dmax) {\r\n ppmCanvas = 550 / result.va_fullDistance;\r\n }\r\n if (result.view === 'camera') {\r\n ppmCanvas = 550 / result.illu_fullDistance;\r\n }\r\n\r\n var kameraCanvasY = 256 - result.elevation * ppmCanvas;\r\n\r\n if (kameraCanvasY <= 82) {\r\n kameraCanvasY = 82;\r\n ppmCanvas = kameraPPM;\r\n }\r\n\r\n if (result.view === 'dori') {\r\n app.emit('ppmChangeSide', { spots: [result.dmin, result.p_ground_max, result.d_dori_i_ground, result.d_dori_r_ground, result.d_dori_o_ground, result.d_dori_d_ground, result.dori_ground_max], type: 'nonpano', res_hor: result.res_hor, ppm: ppmCanvas, elevation: result.elevation, fov_ver: result.fov_ver, tilt: result.tilt, fov_hor: result.fov_hor, min: result.dmin, max: result.dori_ground_max, container: container, startvalue: result.p_ground_max });\r\n } else if (result.view === 'camera') {\r\n app.emit('ppmChangeSide', { spots: [result.dmin, result.p_ground_max, result.illu_range_ground, result.illu_fullDistance], type: 'nonpano', res_hor: result.res_hor, ppm: ppmCanvas, elevation: result.elevation, fov_ver: result.fov_ver, tilt: result.tilt, fov_hor: result.fov_hor, min: result.dmin, max: result.illu_fullDistance, container: container, startvalue: result.p_ground_max });\r\n } else if (result.va_dmax > result.va_dmin) {\r\n app.emit('ppmChangeSide', { spots: [result.va_dmin_ground, result.va_dmax_ground, result.va_fullDistance], type: 'nonpano', res_hor: result.res_hor, ppm: ppmCanvas, elevation: result.elevation, fov_ver: result.fov_ver, tilt: result.tilt, fov_hor: result.fov_hor, min: result.va_dmin_ground, max: result.va_fullDistance, container: container, startvalue: result.p_ground_max });\r\n } else {\r\n app.emit('ppmChangeSide', { spots: [0], type: 'nonpano', res_hor: result.res_hor, ppm: ppmCanvas, elevation: result.elevation, fov_ver: result.fov_ver, tilt: result.tilt, fov_hor: result.fov_hor, max: 0, container: container });\r\n }\r\n\r\n if (result.dmax < 0) {\r\n var dmaxGraphic = new PIXI.Graphics();\r\n dmaxGraphic.beginFill(COLOR_OUTFOV);\r\n dmaxGraphic.drawPolygon(\r\n s(54), s(kameraCanvasY),\r\n s(54 + ((175 - result.elevation * ppmCanvas) * Math.tan(degToRad(90 + +result.tilt - +result.fov_ver * 0.5)))), s(82),\r\n s(566 + 54), s(82),\r\n s(566 + 54), s(256),\r\n s(54), s(256)\r\n );\r\n dmaxGraphic.endFill();\r\n scalableCont.addChild(dmaxGraphic);\r\n } else {\r\n var dmaxGraphic = new PIXI.Graphics();\r\n dmaxGraphic.beginFill(COLOR_OUTFOV);\r\n dmaxGraphic.drawPolygon(\r\n s(54), s(kameraCanvasY),\r\n s(result.dmax * ppmCanvas + 54), s(256),\r\n s(54), s(256)\r\n );\r\n dmaxGraphic.endFill();\r\n scalableCont.addChild(dmaxGraphic);\r\n }\r\n\r\n var circleMask = new PIXI.Graphics();\r\n circleMask.beginFill(0x000000);\r\n if (maskSelector === 0) {\r\n circleMask.drawPolygon(\r\n s(54), s(kameraCanvasY),\r\n s(54 + ((175 - result.elevation * ppmCanvas) * Math.tan(degToRad(90 + +result.tilt - +result.fov_ver * 0.5)))), s(82),\r\n s(566 + 54), s(82),\r\n s(566 + 54), s(256),\r\n s(result.dmin * ppmCanvas + 54), s(256)\r\n );\r\n }\r\n if (maskSelector === 1) {\r\n circleMask.drawPolygon(\r\n s(54), s(kameraCanvasY),\r\n s(result.dmax * ppmCanvas + 54), s(256),\r\n s(result.dmin * ppmCanvas + 54), s(256)\r\n );\r\n }\r\n if (maskSelector === 2) {\r\n circleMask.drawPolygon(\r\n s(54), s(kameraCanvasY),\r\n s(result.dmax * ppmCanvas + 54), s(256),\r\n s(result.dmin * ppmCanvas + 54), s(256)\r\n );\r\n }\r\n circleMask.endFill();\r\n scalableCont.addChild(circleMask);\r\n if (result.view !== 'vi_an') {\r\n createDORI(circleMask);\r\n }\r\n\r\n if (result.view === 'vi_an') {\r\n var circle = new PIXI.Graphics();\r\n circle.beginFill(COLOR_DORI_I);\r\n circle.lineStyle(0);\r\n circle.drawCircle(s(54), s(kameraCanvasY), s(result.va_dmax_ground * ppmCanvas));\r\n circle.endFill();\r\n circle.mask = circleMask;\r\n scalableCont.addChild(circle);\r\n }\r\n\r\n var sideWall = new PIXI.Graphics();\r\n sideWall.beginFill(0x000000);\r\n sideWall.drawRect(s(54), s(kameraCanvasY), s(1), s(256 - kameraCanvasY));\r\n scalableCont.addChild(sideWall);\r\n\r\n var bottomWall = new PIXI.Graphics();\r\n bottomWall.beginFill(0x000000);\r\n bottomWall.drawRect(s(54), s(256), s(566), s(1));\r\n stage.addChild(bottomWall);\r\n\r\n var bottomline1 = new PIXI.Graphics();\r\n bottomline1.beginFill(COLOR_SUPPORT_LINES);\r\n bottomline1.drawRect(s(54), s(264), s(1), s(14));\r\n stage.addChild(bottomline1);\r\n\r\n var bottomline3 = new PIXI.Graphics();\r\n bottomline3.beginFill(COLOR_SUPPORT_LINES);\r\n bottomline3.drawRect(s(54), s(277), s(566), s(1));\r\n stage.addChild(bottomline3);\r\n\r\n if (result.view === 'vi_an') {\r\n if (result.va_dmax <= result.va_dmin) { vaError(); return; }\r\n // if (result.va_dmin >= result.dmaxp) { vaError(); return; }\r\n var vaMask = new PIXI.Graphics();\r\n vaMask.beginFill(0x000000);\r\n\r\n if (maskSelector === 0) {\r\n vaMask.drawPolygon(\r\n s(54), s(kameraCanvasY),\r\n s(54 + ((175 - result.elevation * ppmCanvas) * Math.tan(degToRad(90 + +result.tilt - +result.fov_ver * 0.5)))), s(82),\r\n s(566 + 54), s(82),\r\n s(566 + 54), s(256),\r\n s(result.dmin * ppmCanvas + 54), s(256)\r\n );\r\n }\r\n if (maskSelector === 1) {\r\n vaMask.drawPolygon(\r\n s(54), s(kameraCanvasY),\r\n s(result.dmax * ppmCanvas + 54), s(256),\r\n s(result.dmin * ppmCanvas + 54), s(256)\r\n );\r\n }\r\n if (maskSelector === 2) {\r\n vaMask.drawPolygon(\r\n s(54), s(kameraCanvasY),\r\n s(result.dmax * ppmCanvas + 54), s(256),\r\n s(result.dmin * ppmCanvas + 54), s(256)\r\n );\r\n }\r\n\r\n vaMask.endFill();\r\n scalableCont.addChild(vaMask);\r\n\r\n var circle = new PIXI.Graphics();\r\n circle.beginFill(COLOR_OUTFOV);\r\n circle.alpha = 1;\r\n circle.lineStyle(0);\r\n circle.drawCircle(s(54), s(kameraCanvasY), s(result.va_dmin * ppmCanvas));\r\n circle.endFill();\r\n circle.mask = vaMask;\r\n scalableCont.addChild(circle);\r\n\r\n var va_circle = new PIXI.Graphics();\r\n va_circle.beginFill(0x000000, 0);\r\n va_circle.lineStyle(s((result.va_dmax_ground - result.va_dmin) * ppmCanvas), COLOR_DORI_I, 1);\r\n va_circle.drawCircle(s(54), s(kameraCanvasY), s((result.va_dmin + result.va_dmax_ground) * .5 * ppmCanvas));\r\n va_circle.endFill();\r\n va_circle.mask = vaMask;\r\n scalableCont.addChild(va_circle);\r\n }\r\n\r\n // if (result.dmax > 0 && ((result.thermal && result.dmax < result.d_dri_d) || (!result.thermal && result.dmax < result.d_dori_d)) && result.view === 'dori') {\r\n // var cutOut = new PIXI.Graphics();\r\n // cutOut.beginFill(COLOR_OUTFOV);\r\n // cutOut.drawPolygon(\r\n // s(54 + result.dmaxp * ppmCanvas), s(256 - HUMAN_HEIGHT * ppmCanvas),\r\n // s(54 + result.dmax * ppmCanvas), s(256),\r\n // s(54 + result.dmaxp * ppmCanvas), s(256)\r\n // );\r\n // cutOut.endFill();\r\n // stage.addChild(cutOut);\r\n // }\r\n\r\n if (result.view === 'dori' && result.dori_ground_max > 100) {\r\n scalableCont.setTransform(0, 0, 1, 120 / (result.elevation * ppmCanvas), 0, 0, 0, s(54), s(256));\r\n scalableCont.position = new PIXI.Point(s(54), s(256));\r\n scaledYMessage();\r\n }\r\n if (result.view === 'vi_an' && result.va_fullDistance > 100) {\r\n scalableCont.setTransform(0, 0, 1, 120 / (result.elevation * ppmCanvas), 0, 0, 0, s(54), s(256));\r\n scalableCont.position = new PIXI.Point(s(54), s(256));\r\n scaledYMessage();\r\n }\r\n if (result.view === 'camera' && result.illu_fullDistance > 100) {\r\n scalableCont.setTransform(0, 0, 1, 120 / (result.elevation * ppmCanvas), 0, 0, 0, s(54), s(256));\r\n scalableCont.position = new PIXI.Point(s(54), s(256));\r\n scaledYMessage();\r\n }\r\n stage.addChild(scalableCont);\r\n\r\n if ((result.view === 'dori' && result.dori_ground_max < 100) || (result.view === 'vi_an' && result.va_fullDistance < 100) || (result.view === 'camera' && result.illu_fullDistance < 100)) {\r\n var kamera = new PIXI.Sprite(loader.resources.kamera.texture);\r\n kamera.anchor.set(0.8, 0.5);\r\n kamera.scale = new PIXI.Point(.51, .51);\r\n kamera.x = s(55);\r\n kamera.y = s(kameraCanvasY + .8);\r\n kamera.rotation = degToRad(result.tilt);\r\n scalableCont.addChild(kamera);\r\n } else {\r\n var kamera = new PIXI.Sprite(loader.resources.kamera.texture);\r\n kamera.anchor.set(0.8, 0.5);\r\n kamera.scale = new PIXI.Point(.51, .51 / (120 / (result.elevation * ppmCanvas)));\r\n kamera.x = s(55);\r\n kamera.y = s(kameraCanvasY + (.8 / (120 / (result.elevation * ppmCanvas))));\r\n scalableCont.addChild(kamera);\r\n }\r\n // var humanScale = HUMAN_HEIGHT * ppmCanvas / 136 * 1.01;\r\n var humanScale = HUMAN_HEIGHT * ppmCanvas / 136 * 1.01;\r\n var targetOHeight = app.current.tOHeight * ppmCanvas / 136 * 1.01;\r\n // console.log(app.current.tOHeight, humanScale, targetOHeight);\r\n if (result.dori_ground_max < 100) {\r\n let texture = loader.resources.man.texture;\r\n if (app.current.va.type == \"IVA Pro Traffic\") {\r\n texture = loader.resources.car.texture;\r\n }\r\n if (!$('.settingsTargetButtonPerimeterUpright').hasClass('hollow')) { texture = loader.resources.man_upright.texture; }\r\n if (!$('.settingsTargetButtonPerimeterCrawling').hasClass('hollow')) { texture = loader.resources.man_crawling.texture; }\r\n if (!$('.settingsTargetButtonBuildingsUpright').hasClass('hollow')) { texture = loader.resources.man_upright.texture; }\r\n if (!$('.settingsTargetButtonTrafficUpright').hasClass('hollow')) { texture = loader.resources.man_upright.texture; }\r\n if (!$('.settingsTargetButtonBuildingsFrontal').hasClass('hollow')) { texture = loader.resources.car.texture; }\r\n if (!$('.settingsTargetButtonPerimeterFrontal').hasClass('hollow')) { texture = loader.resources.car.texture; }\r\n if (!$('.settingsTargetButtonTrafficFrontal').hasClass('hollow')) { texture = loader.resources.car.texture; }\r\n if (app.current.va.type == \"IVA Pro Traffic\") {\r\n if (result.view == 'vi_an') {\r\n var car = new PIXI.Sprite(texture);\r\n car.anchor.set(0.05, 0.995);\r\n car.scale = new PIXI.Point(s(targetOHeight), s(targetOHeight));\r\n car.x = s(54 + (result.va_dmin_ground + 0.25) * ppmCanvas);\r\n car.y = s(256);\r\n stage.addChild(car);\r\n } else {\r\n var car = new PIXI.Sprite(texture);\r\n car.anchor.set(0.05, 0.995);\r\n car.scale = new PIXI.Point(s(targetOHeight), s(targetOHeight));\r\n car.x = s(54 + result.dmin * ppmCanvas);\r\n car.y = s(256);\r\n stage.addChild(car);\r\n }\r\n if (result.view === 'vi_an') {\r\n var car2 = new PIXI.Sprite(texture);\r\n car2.anchor.set(.95, 0.9925);\r\n car2.scale = new PIXI.Point(s(targetOHeight), s(targetOHeight));\r\n car2.x = s(54 + (result.va_dmax_ground - 0.25) * ppmCanvas);\r\n car2.y = s(256);\r\n stage.addChild(car2);\r\n } else {\r\n var car2 = new PIXI.Sprite(texture);\r\n car2.anchor.set(.95, 0.9925);\r\n car2.scale = new PIXI.Point(s(targetOHeight), s(targetOHeight));\r\n car2.x = s(54 + result.p_ground_max * ppmCanvas);\r\n car2.y = s(256);\r\n stage.addChild(car2);\r\n }\r\n } else {\r\n if (result.view == 'vi_an') {\r\n var man = new PIXI.Sprite(texture);\r\n man.anchor.set(0.625, 0.995);\r\n man.scale = new PIXI.Point(s(targetOHeight), s(targetOHeight));\r\n man.x = s(54 + (result.va_dmin_ground + 0.25) * ppmCanvas);\r\n man.y = s(256);\r\n stage.addChild(man);\r\n } else {\r\n var man = new PIXI.Sprite(texture);\r\n man.anchor.set(0.625, 0.995);\r\n man.scale = new PIXI.Point(s(targetOHeight), s(targetOHeight));\r\n man.x = s(54 + result.dmin * ppmCanvas);\r\n man.y = s(256);\r\n stage.addChild(man);\r\n }\r\n if (result.view === 'vi_an') {\r\n var man2 = new PIXI.Sprite(texture);\r\n man2.anchor.set(0.625, 0.9925);\r\n man2.scale = new PIXI.Point(s(targetOHeight), s(targetOHeight));\r\n man2.x = s(54 + (result.va_dmax_ground - 0.25) * ppmCanvas);\r\n man2.y = s(256);\r\n stage.addChild(man2);\r\n } else {\r\n var man2 = new PIXI.Sprite(texture);\r\n man2.anchor.set(0.625, 0.9925);\r\n man2.scale = new PIXI.Point(s(targetOHeight), s(targetOHeight));\r\n man2.x = s(54 + result.p_ground_max * ppmCanvas);\r\n man2.y = s(256);\r\n stage.addChild(man2);\r\n }\r\n }\r\n\r\n }\r\n\r\n function scaledYMessage() {\r\n $('' + app.ll('settingsModeVisualScaledWarning') + '').css({\r\n 'position': 'absolute',\r\n 'top': '50%',\r\n 'left': '50%',\r\n 'display': 'inline-block',\r\n 'transform': 'translate(-50%, -50%)',\r\n 'font-size': '1rem',\r\n 'color': '#8a8a8a',\r\n 'text-align': 'center',\r\n 'line-height': '15px',\r\n }).appendTo(container);\r\n }\r\n\r\n\r\n\r\n\r\n finalRenderer();\r\n\r\n function createDORI(mask) {\r\n function makeDORICircle(size, color, alpha = 1) {\r\n var circle = new PIXI.Graphics();\r\n circle.beginFill(color);\r\n circle.alpha = alpha;\r\n circle.lineStyle(0);\r\n circle.drawCircle(s(54), s(kameraCanvasY), s(size));\r\n circle.endFill();\r\n circle.mask = mask;\r\n scalableCont.addChild(circle);\r\n }\r\n\r\n if (result.view === 'camera') {\r\n makeDORICircle(result.illu_range * ppmCanvas, COLOR_DORI_I, 1);\r\n }\r\n\r\n if (result.view === 'dori') {\r\n if (result.thermal) {\r\n makeDORICircle(result.d_dri_d * ppmCanvas, COLOR_DORI_D);\r\n makeDORICircle(result.d_dri_r * ppmCanvas, COLOR_DORI_O);\r\n makeDORICircle(result.d_dri_i * ppmCanvas, COLOR_DORI_R);\r\n } else {\r\n makeDORICircle(result.d_dori_d * ppmCanvas, COLOR_DORI_D);\r\n makeDORICircle(result.d_dori_o * ppmCanvas, COLOR_DORI_O);\r\n makeDORICircle(result.d_dori_r * ppmCanvas, COLOR_DORI_R);\r\n makeDORICircle(result.d_dori_i * ppmCanvas, COLOR_DORI_I);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function finalRenderer() {\r\n try {\r\n renderer.render(stage);\r\n // window.test = function () { renderer.render(stage); }\r\n } catch (error) {\r\n console.log('i actually just broke');\r\n console.log(error);\r\n errorMessage();\r\n }\r\n }\r\n}","const COLOR_DORI_D = 0x005691;\r\nconst COLOR_DORI_O = 0x1272AA;\r\nconst COLOR_DORI_R = 0x2B8FC3;\r\nconst COLOR_DORI_I = 0x3EAADB;\r\n\r\nconst COLOR_FOV = 0x3EAADB;\r\nconst COLOR_OUTFOV = 0xDB5C68;\r\nconst COLOR_SUPPORT_LINES = 0xB5B5B7;\r\n\r\nfunction radToDeg(number) {\r\n return number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n return number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function vNonpanoTop($element, result) {\r\n function errorMessage() {\r\n container.html('');\r\n $('The values you have chosen are
        • below or above limits that can be rendered for display
        • not a valid combination.
        ').css({\r\n 'position': 'absolute',\r\n 'top': '50%',\r\n 'left': '50%',\r\n 'display': 'inline-block',\r\n 'transform': 'translate(-50%, -50%)',\r\n }).appendTo(container)\r\n }\r\n\r\n function vaError() {\r\n container.html('');\r\n $('' + app.ll('videoAnalyticsError') + '').css({\r\n 'position': 'absolute',\r\n 'top': '50%',\r\n 'left': '50%',\r\n 'display': 'inline-block',\r\n 'transform': 'translate(-50%, -50%)',\r\n }).appendTo(container)\r\n }\r\n\r\n var container = $element;\r\n container.html('');\r\n container.css('position', 'relative');\r\n container.css('height', container.width() * 0.4829 + 'px');\r\n\r\n var renderer = new PIXI.CanvasRenderer(container.width(), container.width() * 0.4829, { antialias: true, backgroundColor: 0xe6e6e8, roundPixels: true, forceFXAA: true });\r\n container.append(renderer.view);\r\n\r\n renderer.autoresize = true;\r\n renderer.resize(container.width(), container.width() * 0.4829);\r\n\r\n var stage = new PIXI.Container()\r\n\r\n const loader = PIXI.loader;\r\n render();\r\n\r\n function render() {\r\n function s(v) {\r\n return renderer.width / 620 * v;\r\n }\r\n\r\n if (result.thermal) {\r\n if (result.dmin > result.d_dri_d) { errorMessage(); return; }\r\n } else {\r\n if (result.dmin > result.d_dori_d) { errorMessage(); return; }\r\n }\r\n if (result.elevation <= 2) { errorMessage(); return; }\r\n\r\n var displayMaxWidth = result.dori_ground_max;\r\n if (result.view === 'vi_an') {\r\n displayMaxWidth = result.va_dmax_ground;\r\n }\r\n\r\n if (result.view === 'camera') {\r\n displayMaxWidth = result.illu_range_ground;\r\n }\r\n var maxWidthChord = 2 * displayMaxWidth * Math.sin(degToRad(result.fov_hor / 2));\r\n // if (result.tilt * 2 >= result.fov_ver) { console.log('ho'); displayMaxWidth = result.d_dori_d; }\r\n\r\n var useRightSide = false;\r\n var ppmCanvas = 175 / maxWidthChord;\r\n if (ppmCanvas * displayMaxWidth > 540) {\r\n useRightSide = true;\r\n ppmCanvas = 540 / displayMaxWidth;\r\n }\r\n\r\n if (result.view === 'dori') {\r\n app.emit('ppmChangeTop', { spots: [result.dmin, result.d_dori_d_ground, result.d_dori_o_ground, result.d_dori_r_ground, result.d_dori_i_ground, result.dori_ground_max], type: 'nonpano', res_hor: result.res_hor, ppm: ppmCanvas, elevation: result.elevation, fov_ver: result.fov_ver, tilt: result.tilt, fov_hor: result.fov_hor, startPos: result.p_ground_max, min: result.dmin, max: result.dori_ground_max, container: container });\r\n } else if (result.view === 'camera') {\r\n app.emit('ppmChangeTop', { spots: [result.dmin, result.illu_range_ground, result.illu_fullDistance], type: 'nonpano', res_hor: result.res_hor, ppm: ppmCanvas, elevation: result.elevation, fov_ver: result.fov_ver, tilt: result.tilt, fov_hor: result.fov_hor, min: result.dmin, max: result.illu_range_ground, container: container });\r\n } else if (result.va_dmax > result.va_dmin) {\r\n var vamax = result.dmaxp;\r\n if (vamax > 10000) { vamax = result.d_dori_d; }\r\n app.emit('ppmChangeTop', { spots: [result.va_dmin_ground, result.va_dmax_ground, result.va_fullDistance], type: 'nonpano', res_hor: result.res_hor, ppm: ppmCanvas, elevation: result.elevation, fov_ver: result.fov_ver, tilt: result.tilt, fov_hor: result.fov_hor, min: result.va_dmin_ground, max: result.va_dmax_ground, container: container });\r\n // app.emit('ppmChangeTop', { type: 'nonpano', ppm: ppmCanvas, fov_hor: result.fov_hor, min: result.va_dmin > result.dmin ? result.va_dmin : result.dmin, max: vamax, container: container });\r\n } else {\r\n app.emit('ppmChangeTop', { spots: [0], type: 'nonpano', res_hor: result.res_hor, ppm: ppmCanvas, fov_hor: result.fov_hor, max: 0, container: container });\r\n }\r\n\r\n var xMaxChordWidth = Math.sqrt(((displayMaxWidth * ppmCanvas * displayMaxWidth * ppmCanvas)) - (87 * 87));\r\n\r\n var circleMask = new PIXI.Graphics();\r\n circleMask.beginFill(0x000000);\r\n if (useRightSide) {\r\n circleMask.drawPolygon(s(result.center.x), s(result.center.y), s(result.maskPoint1.x), s(result.maskPoint1.y), s(result.maskPoint2.x), s(result.maskPoint2.y));\r\n } else {\r\n circleMask.drawPolygon(\r\n s(result.center.x), s(result.center.y),\r\n s(xMaxChordWidth + 54), s(0 + 82),\r\n s(result.maskPoint1.x), s(0 + 82),\r\n s(result.maskPoint2.x), s(174 + 82),\r\n s(xMaxChordWidth + 54), s(174 + 82)\r\n );\r\n }\r\n circleMask.endFill();\r\n stage.addChild(circleMask);\r\n if (createDORI(circleMask)) { return };\r\n\r\n var sideWall = new PIXI.Graphics();\r\n sideWall.beginFill(0x000000);\r\n sideWall.drawRect(s(54), s(82), s(1), s(175));\r\n stage.addChild(sideWall);\r\n\r\n var bottomline1 = new PIXI.Graphics();\r\n bottomline1.beginFill(COLOR_SUPPORT_LINES);\r\n bottomline1.drawRect(s(54), s(264), s(1), s(14));\r\n stage.addChild(bottomline1);\r\n\r\n var bottomline3 = new PIXI.Graphics();\r\n bottomline3.beginFill(COLOR_SUPPORT_LINES);\r\n bottomline3.drawRect(s(54), s(277), s(566), s(1));\r\n stage.addChild(bottomline3);\r\n\r\n var kamera = new PIXI.Sprite(loader.resources.kamera.texture);\r\n kamera.anchor.set(1, 0.5);\r\n kamera.scale = new PIXI.Point(.51, .51);\r\n kamera.x = s(56);\r\n kamera.y = s(169);\r\n stage.addChild(kamera);\r\n\r\n var difference;\r\n\r\n if (result.thermal) {\r\n difference = (result.dmax < result.d_dri_d ? result.dmax : result.d_dri_d) - result.dmin;\r\n if (result.dmax < 0) { difference = result.d_dri_d - result.dmin; }\r\n } else {\r\n difference = (result.dmax < result.d_dori_d ? result.dmax : result.d_dori_d) - result.dmin;\r\n if (result.dmax < 0) { difference = result.d_dori_d - result.dmin; }\r\n }\r\n finalRenderer();\r\n\r\n function createDORI(mask) {\r\n function makeDORICircle(size, color, alpha = 1) {\r\n // if (size < 0) { return; }\r\n var circle = new PIXI.Graphics();\r\n circle.beginFill(color);\r\n circle.alpha = alpha;\r\n circle.lineStyle(0);\r\n circle.drawCircle(s(54), s(169), s(size));\r\n circle.endFill();\r\n circle.mask = mask;\r\n stage.addChild(circle);\r\n }\r\n\r\n if (result.view === 'dori' && !result.thermal) {\r\n if (result.dmax < result.d_dori_d && result.dmax > 0) {\r\n // makeDORICircle(result.d_dori_d * ppmCanvas, COLOR_OUTFOV);\r\n if (result.dmax > result.d_dori_o) {\r\n makeDORICircle(result.dori_ground_max * ppmCanvas, COLOR_DORI_D);\r\n makeDORICircle(result.d_dori_o * ppmCanvas, COLOR_DORI_O);\r\n makeDORICircle(result.d_dori_r * ppmCanvas, COLOR_DORI_R);\r\n makeDORICircle(result.d_dori_i * ppmCanvas, COLOR_DORI_I);\r\n if (result.dmin < 0) { return; }\r\n makeDORICircle(result.dmin * ppmCanvas, COLOR_OUTFOV);\r\n return;\r\n }\r\n if (result.dmax > result.d_dori_r) {\r\n makeDORICircle(result.dori_ground_max * ppmCanvas, COLOR_DORI_O);\r\n makeDORICircle(result.d_dori_r * ppmCanvas, COLOR_DORI_R);\r\n makeDORICircle(result.d_dori_i * ppmCanvas, COLOR_DORI_I);\r\n if (result.dmin < 0) { return; }\r\n makeDORICircle(result.dmin * ppmCanvas, COLOR_OUTFOV);\r\n return;\r\n }\r\n if (result.dmax > result.d_dori_i) {\r\n makeDORICircle(result.dori_ground_max * ppmCanvas, COLOR_DORI_R);\r\n makeDORICircle(result.d_dori_i * ppmCanvas, COLOR_DORI_I);\r\n if (result.dmin < 0) { return; }\r\n makeDORICircle(result.dmin * ppmCanvas, COLOR_OUTFOV);\r\n return;\r\n }\r\n if (result.dmax > result.dmin) {\r\n makeDORICircle(result.dori_ground_max * ppmCanvas, COLOR_DORI_I);\r\n if (result.dmin < 0) { return; }\r\n makeDORICircle(result.dmin * ppmCanvas, COLOR_OUTFOV);\r\n return;\r\n }\r\n } else {\r\n // if (result.dmax > 0) { makeDORICircle(result.dmax * ppmCanvas, COLOR_OUTFOV); }\r\n makeDORICircle(result.dori_ground_max * ppmCanvas, COLOR_DORI_D);\r\n makeDORICircle(result.d_dori_o * ppmCanvas, COLOR_DORI_O);\r\n makeDORICircle(result.d_dori_r * ppmCanvas, COLOR_DORI_R);\r\n makeDORICircle(result.d_dori_i * ppmCanvas, COLOR_DORI_I);\r\n if (result.dmin < 0) { return; }\r\n makeDORICircle(result.dmin * ppmCanvas, COLOR_OUTFOV);\r\n }\r\n }\r\n\r\n if (result.view === 'dori' && result.thermal) {\r\n if (result.dmax < result.d_dri_d && result.dmax > 0) {\r\n // makeDORICircle(result.d_dri_d * ppmCanvas, COLOR_OUTFOV);\r\n if (result.dmax > result.d_dri_r) {\r\n makeDORICircle(result.dori_ground_max * ppmCanvas, COLOR_DORI_D);\r\n makeDORICircle(result.d_dri_r * ppmCanvas, COLOR_DORI_O);\r\n makeDORICircle(result.d_dri_i * ppmCanvas, COLOR_DORI_R);\r\n if (result.dmin < 0) { return; }\r\n makeDORICircle(result.dmin * ppmCanvas, COLOR_OUTFOV);\r\n return;\r\n }\r\n if (result.dmax > result.d_dri_i) {\r\n makeDORICircle(result.dori_ground_max * ppmCanvas, COLOR_DORI_O);\r\n makeDORICircle(result.d_dri_i * ppmCanvas, COLOR_DORI_R);\r\n if (result.dmin < 0) { return; }\r\n makeDORICircle(result.dmin * ppmCanvas, COLOR_OUTFOV);\r\n return;\r\n }\r\n if (result.dmax > result.dmin) {\r\n makeDORICircle(result.dori_ground_max * ppmCanvas, COLOR_DORI_I);\r\n if (result.dmin < 0) { return; }\r\n makeDORICircle(result.dmin * ppmCanvas, COLOR_OUTFOV);\r\n return;\r\n }\r\n } else {\r\n // if (result.dmax > 0) { makeDORICircle(result.dmax * ppmCanvas, COLOR_OUTFOV); }\r\n makeDORICircle(result.dori_ground_max * ppmCanvas, COLOR_DORI_D);\r\n makeDORICircle(result.d_dri_r * ppmCanvas, COLOR_DORI_O);\r\n makeDORICircle(result.d_dri_i * ppmCanvas, COLOR_DORI_R);\r\n if (result.dmin < 0) { return; }\r\n makeDORICircle(result.dmin * ppmCanvas, COLOR_OUTFOV);\r\n }\r\n }\r\n\r\n if (result.view === 'camera') {\r\n makeDORICircle(result.illu_range_ground * ppmCanvas, COLOR_DORI_I, 1);\r\n }\r\n\r\n if (result.view === 'vi_an') {\r\n if (result.va_dmax <= result.va_dmin) { vaError(); return true; }\r\n if (result.va_dmin >= result.dmaxp) { vaError(); return true; }\r\n\r\n if (result.va_dmax <= result.va_dmin) { return; }\r\n makeDORICircle(result.dmax * ppmCanvas, COLOR_OUTFOV);\r\n makeDORICircle(result.va_dmax_ground * ppmCanvas, COLOR_DORI_I);\r\n\r\n // var circle = new PIXI.Graphics();\r\n // circle.beginFill(0x000000, 0);\r\n // circle.lineStyle(s((result.va_dmax_ground - result.va_dmin_ground) * ppmCanvas), COLOR_DORI_I, 1);\r\n // circle.drawCircle(s(54), s(169), s((result.va_dmin_ground + result.va_dmax_ground) * .5 * ppmCanvas));\r\n // circle.endFill();\r\n // circle.mask = mask;\r\n // stage.addChild(circle);\r\n\r\n makeDORICircle(result.va_dmin_ground * ppmCanvas, COLOR_OUTFOV);\r\n }\r\n }\r\n\r\n function createDRI(mask) {\r\n\r\n }\r\n }\r\n\r\n function finalRenderer() {\r\n try {\r\n renderer.render(stage);\r\n } catch (error) {\r\n console.log('i actually just broke');\r\n console.log(error);\r\n errorMessage();\r\n }\r\n }\r\n}","const COLOR_BG = 0xE6E6E8;\r\n\r\nconst COLOR_DORI_D = 0x005691;\r\nconst COLOR_DORI_O = 0x1272AA;\r\nconst COLOR_DORI_R = 0x2B8FC3;\r\nconst COLOR_DORI_I = 0x3EAADB;\r\n\r\nconst COLOR_FOV = 0x3EAADB;\r\nconst COLOR_OUTFOV = 0xDB5C68;\r\nconst COLOR_SUPPORT_LINES = 0xB5B5B7;\r\n\r\nconst DORI_D = 25, DORI_O = 63, DORI_R = 125, DORI_I = 250;\r\nconst DRI_D = 3, DRI_R = 12, DRI_I = 24;\r\nconst HUMAN_HEIGHT = 1.7, HUMAN_WIDTH = 0.5;\r\n\r\nfunction radToDeg(number) {\r\n\treturn number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n\treturn number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function vPano360SideWall($element, result) {\r\n\tconsole.log(result);\r\n\tfunction errorMessage() {\r\n\t\tcontainer.html('');\r\n\t\t$('The values you have chosen are
        • below or above limits that can be rendered for display
        • not a valid combination.
        ').css({\r\n\t\t\t'position': 'absolute',\r\n\t\t\t'top': '50%',\r\n\t\t\t'left': '50%',\r\n\t\t\t'display': 'inline-block',\r\n\t\t\t'transform': 'translate(-50%, -50%)',\r\n\t\t}).appendTo(container)\r\n\t}\r\n\r\n\tvar container = $element;\r\n\tcontainer.html('');\r\n\tcontainer.css('position', 'relative');\r\n\tcontainer.css('height', container.width() * 0.4829 + 'px');\r\n\r\n\t// $(window).on('resize', function () {\r\n\t// \tstage.removeChildren();\r\n\t// \trenderer.resize(container.width(), container.width() * 0.4829);\r\n\t// \tcontainer.find('span').remove();\r\n\t// \tcontainer.css('height', container.width() * 0.4829 + 'px');\r\n\t// \trender();\r\n\t// });\r\n\r\n\tvar renderer = new PIXI.CanvasRenderer(container.width(), container.width() * 0.4829, { antialias: true, backgroundColor: 0xe6e6e8, roundPixels: true, forceFXAA: true });\r\n\tcontainer.append(renderer.view);\r\n\r\n\trenderer.autoresize = true;\r\n\trenderer.resize(container.width(), container.width() * 0.4829);\r\n\r\n\tvar stage = new PIXI.Container()\r\n\r\n\tconst loader = PIXI.loader;\r\n\trender();\r\n\r\n\tfunction render() {\r\n\t\tfunction s(value) {\r\n\t\t\treturn renderer.width / 620 * value;\r\n\t\t}\r\n\r\n\t\tvar ppmCanvas = 175 / result.elevation;\r\n\t\tvar ppmDori_d = 275 / result.d_dori_d;\r\n\t\tppmDori_d < ppmCanvas ? ppmCanvas = ppmDori_d : false;\r\n\t\tvar topPoint = s(82 + 174 - (result.elevation * ppmCanvas));\r\n\t\tvar midPoint = s(54 + 566 * 0.5);\r\n\t\tvar humanScale = HUMAN_HEIGHT * ppmCanvas / 136 * 1.01;\r\n\r\n\r\n\t\tvar a1 = result.a1;\r\n\t\tvar a3 = result.a3;\r\n\t\tvar a5 = result.a5;\r\n\t\tvar pixel_size = result.pixel_size;\r\n\r\n\t\tvar elevation;\r\n\t\tvar distance;\r\n\r\n\t\tvar background = new PIXI.Graphics();\r\n\t\tbackground.beginFill(COLOR_OUTFOV);\r\n\t\tbackground.drawRect(s(55), s(82), s(565), s(174));\r\n\t\tstage.addChild(background);\r\n\r\n\t\tfunction superFillDeprecated() {\r\n\t\t\t// var superFill = new PIXI.Graphics();\r\n\t\t\t// for (var x = 0; x < s(565); x++) {\r\n\t\t\t// \tfor (var y = 0; y < s(173.5); y++) {\r\n\t\t\t// \t\televation = y * 620 / renderer.width / ppmCanvas;\r\n\t\t\t// \t\tdistance = x * 620 / renderer.width / ppmCanvas;\r\n\r\n\t\t\t// \t\tdistance -= s(565) * 0.5 * 620 / renderer.width / ppmCanvas;\r\n\t\t\t// \t\tdistance = Math.abs(distance);\r\n\r\n\t\t\t// \t\t//based on height\r\n\r\n\t\t\t// \t\tvar alpha_head = radToDeg(Math.atan(distance / (elevation - HUMAN_HEIGHT)));\r\n\t\t\t// \t\tvar alpha_foot = radToDeg(Math.atan(distance / elevation));\r\n\r\n\t\t\t// \t\tvar pixel_head = a1 * alpha_head + a3 * Math.pow(alpha_head, 3) + a5 * Math.pow(alpha_head, 5);\r\n\t\t\t// \t\tvar pixel_foot = a1 * alpha_foot + a3 * Math.pow(alpha_foot, 3) + a5 * Math.pow(alpha_foot, 5);\r\n\r\n\t\t\t// \t\tvar target_pixel = (pixel_head - pixel_foot) / pixel_size * 1000;\r\n\t\t\t// \t\tvar density = target_pixel / HUMAN_HEIGHT;\r\n\r\n\t\t\t// \t\t//based on width\r\n\r\n\t\t\t// \t\tvar a_left = radToDeg(Math.atan((distance + HUMAN_WIDTH) / (elevation - HUMAN_HEIGHT)));\r\n\t\t\t// \t\tvar a_right = radToDeg(Math.atan(distance / (elevation - HUMAN_HEIGHT)));\r\n\r\n\t\t\t// \t\tvar pixel_left = a1 * a_left + a3 * Math.pow(a_left, 3) + a5 * Math.pow(a_left, 5);\r\n\t\t\t// \t\tvar pixel_right = a1 * a_right + a3 * Math.pow(a_right, 3) + a5 * Math.pow(a_right, 5);\r\n\r\n\t\t\t// \t\tvar target_pixel_alt = (pixel_left - pixel_right) / pixel_size * 1000;\r\n\t\t\t// \t\tvar density_alt = target_pixel_alt / HUMAN_WIDTH;\r\n\r\n\t\t\t// \t\tif (density_alt > density) { density = density_alt; }\r\n\r\n\t\t\t// \t\tif (result.view === 'camera') {\r\n\t\t\t// \t\t\tif (density > DORI_D) {\r\n\t\t\t// \t\t\t\tsuperFill.beginFill(COLOR_DORI_I);\r\n\t\t\t// \t\t\t\tsuperFill.drawRect(s(55) + x, s(82) + y, 1, 1);\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t\tif (result.view === 'dori') {\r\n\t\t\t// \t\t\tif (density > DORI_I) {\r\n\t\t\t// \t\t\t\tsuperFill.beginFill(COLOR_DORI_I);\r\n\t\t\t// \t\t\t\tsuperFill.drawRect(s(55) + x, s(82) + y, 1, 1);\r\n\t\t\t// \t\t\t} else if (density > DORI_R) {\r\n\t\t\t// \t\t\t\tsuperFill.beginFill(COLOR_DORI_R);\r\n\t\t\t// \t\t\t\tsuperFill.drawRect(s(55) + x, s(82) + y, 1, 1);\r\n\t\t\t// \t\t\t} else if (density > DORI_O) {\r\n\t\t\t// \t\t\t\tsuperFill.beginFill(COLOR_DORI_O);\r\n\t\t\t// \t\t\t\tsuperFill.drawRect(s(55) + x, s(82) + y, 1, 1);\r\n\t\t\t// \t\t\t} else if (density > DORI_D) {\r\n\t\t\t// \t\t\t\tsuperFill.beginFill(COLOR_DORI_D);\r\n\t\t\t// \t\t\t\tsuperFill.drawRect(s(55) + x, s(82) + y, 1, 1);\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t\tif (result.view === 'vi_an') {\r\n\t\t\t// \t\t\tif (density > result.IPPM_y && density * result.tOHeight <= result.img_y * .3) {\r\n\t\t\t// \t\t\t\tsuperFill.beginFill(COLOR_DORI_D);\r\n\t\t\t// \t\t\t\tsuperFill.drawRect(s(55) + x, s(82) + y, 1, 1);\r\n\t\t\t// \t\t\t} else if (density > DORI_D) {\r\n\t\t\t// \t\t\t\tsuperFill.beginFill(COLOR_DORI_I);\r\n\t\t\t// \t\t\t\tsuperFill.drawRect(s(55) + x, s(82) + y, 1, 1);\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\r\n\t\t\t// \t}\r\n\t\t\t// }\r\n\t\t\t// superFill.endFill();\r\n\t\t\t// stage.addChild(superFill);\r\n\t\t}\r\n\r\n var spots = [];\r\n if (result.view === 'camera') {\r\n function drawTent(width, color) {\r\n\t\t\t\tvar dmaxGraphic = new PIXI.Graphics();\r\n\t\t\t\tdmaxGraphic.beginFill(color);\r\n\t\t\t\tdmaxGraphic.drawPolygon(\r\n\t\t\t\t\tmidPoint, topPoint,\r\n\t\t\t\t\tmidPoint + s(width * ppmCanvas), s(256 - (HUMAN_HEIGHT * ppmCanvas)),\r\n\t\t\t\t\tmidPoint + s(width * ppmCanvas), s(256),\r\n\t\t\t\t\tmidPoint - s(width * ppmCanvas), s(256),\r\n\t\t\t\t\tmidPoint - s(width * ppmCanvas), s(256 - (HUMAN_HEIGHT * ppmCanvas))\r\n\t\t\t\t);\r\n\t\t\t\tdmaxGraphic.endFill();\r\n\t\t\t\tstage.addChild(dmaxGraphic);\r\n\t\t\t}\r\n\r\n\t\t\tif (result.d_dori_d > result.illu_range_ground) {\r\n drawTent(result.d_dori_d, COLOR_OUTFOV);\r\n drawTent(result.illu_range_ground, COLOR_DORI_I);\r\n spots = [0, result.illu_range_ground, result.d_dori_d];\r\n }else{\r\n drawTent(result.illu_range_ground, COLOR_DORI_I);\r\n spots = [0, result.illu_range_ground];\r\n }\r\n\t\t}\r\n\r\n\t\tif (result.view === 'dori') {\r\n\t\t\tfunction drawTent(width, color) {\r\n\t\t\t\tvar dmaxGraphic = new PIXI.Graphics();\r\n\t\t\t\tdmaxGraphic.beginFill(color);\r\n\t\t\t\tdmaxGraphic.drawPolygon(\r\n\t\t\t\t\tmidPoint, topPoint,\r\n\t\t\t\t\tmidPoint + s(width * ppmCanvas), s(256 - (HUMAN_HEIGHT * ppmCanvas)),\r\n\t\t\t\t\tmidPoint + s(width * ppmCanvas), s(256),\r\n\t\t\t\t\tmidPoint - s(width * ppmCanvas), s(256),\r\n\t\t\t\t\tmidPoint - s(width * ppmCanvas), s(256 - (HUMAN_HEIGHT * ppmCanvas))\r\n\t\t\t\t);\r\n\t\t\t\tdmaxGraphic.endFill();\r\n\t\t\t\tstage.addChild(dmaxGraphic);\r\n\r\n\t\t\t\tvar man = new PIXI.Sprite(loader.resources.man.texture);\r\n\t\t\t\tman.anchor.set(0.625, 0.995);\r\n\t\t\t\tman.scale = new PIXI.Point(s(humanScale), s(humanScale));\r\n\t\t\t\tman.x = midPoint + s(width * ppmCanvas);\r\n\t\t\t\tman.y = s(256);\r\n\t\t\t\tstage.addChild(man);\r\n\r\n\t\t\t\tvar man2 = new PIXI.Sprite(loader.resources.man.texture);\r\n\t\t\t\tman2.anchor.set(0.625, 0.995);\r\n\t\t\t\tman2.scale = new PIXI.Point(s(humanScale), s(humanScale));\r\n\t\t\t\tman2.x = midPoint - s(width * ppmCanvas);\r\n\t\t\t\tman2.y = s(256);\r\n\t\t\t\tstage.addChild(man2);\r\n\t\t\t}\r\n\r\n\t\t\tif (result.d_dori_d) { drawTent(result.d_dori_d, COLOR_DORI_D); }\r\n\t\t\tif (result.d_dori_o) { drawTent(result.d_dori_o, COLOR_DORI_O); }\r\n\t\t\tif (result.d_dori_r) { drawTent(result.d_dori_r, COLOR_DORI_R); }\r\n\t\t\tif (result.d_dori_i) { drawTent(result.d_dori_i, COLOR_DORI_I); }\r\n spots = [0, result.d_dori_i, result.d_dori_r, result.d_dori_o, result.d_dori_d];\r\n\t\t}\r\n\r\n\t\tif (result.view === 'vi_an') {\r\n\t\t\tfunction drawGuys(width) {\r\n\t\t\t\tvar man = new PIXI.Sprite(loader.resources.man.texture);\r\n\t\t\t\tman.anchor.set(0.625, 0.995);\r\n\t\t\t\tman.scale = new PIXI.Point(s(humanScale), s(humanScale));\r\n\t\t\t\tman.x = midPoint + s(width * ppmCanvas);\r\n\t\t\t\tman.y = s(256);\r\n\t\t\t\tstage.addChild(man);\r\n\r\n\t\t\t\tvar man2 = new PIXI.Sprite(loader.resources.man.texture);\r\n\t\t\t\tman2.anchor.set(0.625, 0.995);\r\n\t\t\t\tman2.scale = new PIXI.Point(s(humanScale), s(humanScale));\r\n\t\t\t\tman2.x = midPoint - s(width * ppmCanvas);\r\n\t\t\t\tman2.y = s(256);\r\n\t\t\t\tstage.addChild(man2);\r\n\t\t\t}\r\n\r\n\t\t\tfunction drawTent(width, color) {\r\n\t\t\t\tvar dmaxGraphic = new PIXI.Graphics();\r\n\t\t\t\tdmaxGraphic.beginFill(color);\r\n\t\t\t\tdmaxGraphic.drawPolygon(\r\n\t\t\t\t\tmidPoint, topPoint,\r\n\t\t\t\t\tmidPoint + s(width * ppmCanvas), s(256 - (HUMAN_HEIGHT * ppmCanvas)),\r\n\t\t\t\t\tmidPoint + s(width * ppmCanvas), s(256),\r\n\t\t\t\t\tmidPoint - s(width * ppmCanvas), s(256),\r\n\t\t\t\t\tmidPoint - s(width * ppmCanvas), s(256 - (HUMAN_HEIGHT * ppmCanvas))\r\n\t\t\t\t);\r\n\t\t\t\tdmaxGraphic.endFill();\r\n\t\t\t\tstage.addChild(dmaxGraphic);\r\n\t\t\t}\r\n\r\n\t\t\t// var background_grey = new PIXI.Graphics();\r\n\t\t\t// background_grey.beginFill(COLOR_BG);\r\n\t\t\t// background_grey.drawRect(s(54), s(81), s(566), s(174 - (HUMAN_HEIGHT * ppmCanvas)));\r\n\t\t\t// background_grey.drawRect(s(54), s(81), s(566), s(176));\r\n\t\t\t// stage.addChild(background_grey);\r\n\r\n\t\t\t// if (result.d_dori_d) { drawTent(result.d_dori_d, COLOR_DORI_I); }\r\n\t\t\tdrawTent(result.va_dmax, COLOR_DORI_R);\r\n\t\t\tif (result.d_dori_d) { drawGuys(result.d_dori_d); }\r\n spots = [0, result.va_dmin, result.va_dmax, result.d_dori_d];\r\n\t\t}\r\n\r\n\t\tapp.emit('ppmChangeSide', { spots: spots, result: result, type: 'panoCeil', ppm: ppmCanvas, container: container, max: result.d_dori_d });\r\n\r\n\r\n\t\tvar bottomline1 = new PIXI.Graphics();\r\n\t\tbottomline1.beginFill(COLOR_SUPPORT_LINES);\r\n\t\tbottomline1.drawRect(s(54 + 281), s(264), s(1), s(14));\r\n\t\tstage.addChild(bottomline1);\r\n\r\n\t\tvar bottomline3 = new PIXI.Graphics();\r\n\t\tbottomline3.beginFill(COLOR_SUPPORT_LINES);\r\n\t\tbottomline3.drawRect(s(54 + 281), s(277), s(566), s(1));\r\n\t\tstage.addChild(bottomline3);\r\n\r\n\t\tvar kamera = new PIXI.Sprite(loader.resources.pano.texture);\r\n\t\tkamera.anchor.set(0.5, 0.5);\r\n\t\tkamera.scale = new PIXI.Point(.51, .51);\r\n\t\tkamera.x = midPoint;\r\n\t\tkamera.y = topPoint;\r\n\t\tkamera.rotation = degToRad(90);\r\n\t\tstage.addChild(kamera);\r\n\t\tconsole.log(kamera);\r\n\r\n\t\t// $(`${app.ll('settingsModeSelectorsFOVCamHeight')}: ${app.iFtF(result.elevation).toFixed(2)} ${app.unitSymbol()}
        Horizontal FOV: ${result.fov.toFixed(2)}°
        `).css({\r\n\t\t// \t'position': 'absolute',\r\n\t\t// \t'top': s(27) + 'px',\r\n\t\t// \t'left': s(19) + 'px',\r\n\t\t// \t'color': '#000',\r\n\t\t// \t'padding': '2px',\r\n\t\t// }).appendTo(container);\r\n\r\n\t\t// $(`${app.ll('settingsModeVisualSideView')}`).css({\r\n\t\t// \t'position': 'absolute',\r\n\t\t// \t'top': s(27) + 'px',\r\n\t\t// \t'right': s(60) + 'px',\r\n\t\t// \t'color': '#000',\r\n\t\t// \t'padding': '2px',\r\n\t\t// \t'transform': 'translate(0, -50%)',\r\n\t\t// \t'font-size': '2rem',\r\n\t\t// }).appendTo(container);\r\n\r\n\t\tfinalRenderer();\r\n\t}\r\n\r\n\tfunction finalRenderer() {\r\n\t\ttry {\r\n\t\t\trenderer.render(stage);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.log('i actually just broke');\r\n\t\t\tconsole.log(error);\r\n\t\t\terrorMessage();\r\n\t\t}\r\n\t}\r\n}","const COLOR_BG = 0xE6E6E8;\r\n\r\nconst COLOR_DORI_D = 0x005691;\r\nconst COLOR_DORI_O = 0x1272AA;\r\nconst COLOR_DORI_R = 0x2B8FC3;\r\nconst COLOR_DORI_I = 0x3EAADB;\r\n\r\nconst COLOR_FOV = 0x3EAADB;\r\nconst COLOR_OUTFOV = 0xDB5C68;\r\nconst COLOR_SUPPORT_LINES = 0xB5B5B7;\r\n\r\nconst DORI_D = 25, DORI_O = 63, DORI_R = 125, DORI_I = 250;\r\nconst DRI_D = 3, DRI_R = 12, DRI_I = 24;\r\nconst HUMAN_HEIGHT = 1.7, HUMAN_WIDTH = 0.5;\r\n\r\nfunction radToDeg(number) {\r\n\treturn number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n\treturn number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function vPano360SideWall($element, result) {\r\n\tconsole.log(result);\r\n\tfunction errorMessage() {\r\n\t\tcontainer.html('');\r\n\t\t$('The values you have chosen are
        • below or above limits that can be rendered for display
        • not a valid combination.
        ').css({\r\n\t\t\t'position': 'absolute',\r\n\t\t\t'top': '50%',\r\n\t\t\t'left': '50%',\r\n\t\t\t'display': 'inline-block',\r\n\t\t\t'transform': 'translate(-50%, -50%)',\r\n\t\t}).appendTo(container)\r\n\t}\r\n\r\n\tvar container = $element;\r\n\tcontainer.html('');\r\n\tcontainer.css('position', 'relative');\r\n\tcontainer.css('height', container.width() * 0.4829 + 'px');\r\n\r\n\t// $(window).on('resize', function () {\r\n\t// \tstage.removeChildren();\r\n\t// \trenderer.resize(container.width(), container.width() * 0.4829);\r\n\t// \tcontainer.find('span').remove();\r\n\t// \tcontainer.css('height', container.width() * 0.4829 + 'px');\r\n\t// \trender();\r\n\t// });\r\n\r\n\tvar renderer = new PIXI.CanvasRenderer(container.width(), container.width() * 0.4829, { antialias: true, backgroundColor: 0xe6e6e8, roundPixels: true, forceFXAA: true });\r\n\tcontainer.append(renderer.view);\r\n\r\n\trenderer.autoresize = true;\r\n\trenderer.resize(container.width(), container.width() * 0.4829);\r\n\r\n\tvar stage = new PIXI.Container()\r\n\r\n\tconst loader = PIXI.loader;\r\n\trender();\r\n\r\n\tfunction render() {\r\n\t\tfunction s(value) {\r\n\t\t\treturn renderer.width / 620 * value;\r\n\t\t}\r\n\r\n\t\tif (!result.d_dori_d) { errorMessage(); return; }\r\n\r\n\r\n\t\tvar ppmCanvas = 175 / result.elevation;\r\n\t\tvar ppmDori_d = 550 / result.d_dori_d;\r\n\r\n\t\tppmDori_d < ppmCanvas ? ppmCanvas = ppmDori_d : false;\r\n\t\tvar humanScale = HUMAN_HEIGHT * ppmCanvas / 136 * 1.01;\r\n\r\n\t\tapp.emit('ppmChangeSide', { spots: [0, result.d_dori_i, result.d_dori_r, result.d_dori_o, result.d_dori_d],result: result, type: 'panoWall', ppm: ppmCanvas, container: container, max: result.d_dori_d });\r\n\r\n\t\tvar a1 = result.a1;\r\n\t\tvar a3 = result.a3;\r\n\t\tvar a5 = result.a5;\r\n\t\tvar pixel_size = result.pixel_size;\r\n\r\n\t\tvar elevation;\r\n\t\tvar distance;\r\n\r\n\t\tvar background = new PIXI.Graphics();\r\n\t\tbackground.beginFill(COLOR_OUTFOV);\r\n\t\tbackground.drawRect(s(55), s(82), s(565), s(174));\r\n\t\tstage.addChild(background);\r\n\r\n\t\tif (result.d_dori_d_min) {\r\n\t\t\tvar man = new PIXI.Sprite(loader.resources.man.texture);\r\n\t\t\tman.anchor.set(0.625, 0.995);\r\n\r\n\t\t\tman.scale = new PIXI.Point(s(humanScale), s(humanScale));\r\n\t\t\tman.x = s(54 + result.d_dori_d_min * ppmCanvas);\r\n\t\t\t// man.x = s(10);\r\n\t\t\tman.y = s(256);\r\n\t\t\tstage.addChild(man);\r\n\t\t}\r\n\r\n\t\tfunction drawSomething(width, color) {\r\n\t\t\tvar dmaxGraphic = new PIXI.Graphics();\r\n\t\t\tdmaxGraphic.beginFill(color);\r\n\t\t\tdmaxGraphic.drawPolygon(\r\n\t\t\t\ts(54), s(256 - result.elevation * ppmCanvas),\r\n\t\t\t\ts(54 + (width * ppmCanvas)), s(256 - (HUMAN_HEIGHT * ppmCanvas)),\r\n\t\t\t\ts(54 + (width * ppmCanvas)), s(256),\r\n\t\t\t\ts(54), s(256)\r\n\t\t\t);\r\n\t\t\tdmaxGraphic.endFill();\r\n\t\t\tstage.addChild(dmaxGraphic);\r\n\r\n\t\t\tvar man = new PIXI.Sprite(loader.resources.man.texture);\r\n\t\t\tman.anchor.set(0.625, 0.995);\r\n\t\t\tman.scale = new PIXI.Point(s(humanScale), s(humanScale));\r\n\t\t\tman.x = s(54 + (width * ppmCanvas));\r\n\t\t\tman.y = s(256);\r\n\t\t\tstage.addChild(man);\r\n\t\t}\r\n\r\n\t\tif (result.view === \"dori\") {\r\n\t\t\tif (result.d_dori_d) { drawSomething(result.d_dori_d, COLOR_DORI_D); }\r\n\t\t\tif (result.d_dori_o) { drawSomething(result.d_dori_o, COLOR_DORI_O); }\r\n\t\t\tif (result.d_dori_r) { drawSomething(result.d_dori_r, COLOR_DORI_R); }\r\n\t\t\tif (result.d_dori_i) { drawSomething(result.d_dori_i, COLOR_DORI_I); }\r\n\t\t}\r\n\t\tif (result.view === 'vi_an') {\r\n\t\t\tif (result.va_dmin >= result.va_dmax) { errorMessage(); return; }\r\n\t\t\t// var background_grey = new PIXI.Graphics();\r\n\t\t\t// background_grey.beginFill(COLOR_BG);\r\n\t\t\t// background_grey.drawRect(s(54), s(81), s(566), s(176));\r\n\t\t\t// stage.addChild(background_grey);\r\n\r\n\t\t\tvar circleMask = new PIXI.Graphics();\r\n \tcircleMask.beginFill(0x000000);\r\n\t\t\tcircleMask.drawPolygon(\r\n s(55), s(82),\r\n s(512), s(82),\r\n s(512), s(256),\r\n s(55), s(256),\r\n );\r\n\t\t\tcircleMask.endFill();\r\n\r\n\t\t\tvar dmaxGraphic = new PIXI.Graphics();\r\n\t\t\tdmaxGraphic.beginFill(COLOR_DORI_R);\r\n dmaxGraphic.drawCircle(s(54), s(256 - result.elevation * ppmCanvas), s(result.va_dmax * ppmCanvas));\r\n dmaxGraphic.mask = circleMask;\r\n\t\t\t// dmaxGraphic.drawPolygon(\r\n\t\t\t// \ts(54), s(256 - result.elevation * ppmCanvas),\r\n\t\t\t// \ts(54 + (result.va_dmax * ppmCanvas)), s(256),\r\n\t\t\t// \ts(54 + (result.va_dmin >= result.va_dmax * ppmCanvas)), s(256)\r\n\t\t\t// );\r\n\t\t\tdmaxGraphic.endFill();\r\n\t\t\tstage.addChild(dmaxGraphic);\r\n\t\t}\r\n\t\tif (result.view === 'camera') {\r\n\t\t\tvar dmaxGraphic = new PIXI.Graphics();\r\n\t\t\tdmaxGraphic.beginFill(COLOR_DORI_I);\r\n\t\t\tdmaxGraphic.drawPolygon(\r\n\t\t\t\ts(54), s(256 - result.elevation * ppmCanvas),\r\n\t\t\t\ts(54 + (result.d_dori_d * ppmCanvas)), s(256),\r\n\t\t\t\ts(54), s(256)\r\n\t\t\t);\r\n\t\t\tdmaxGraphic.endFill();\r\n\t\t\tstage.addChild(dmaxGraphic);\r\n\t\t}\r\n\r\n\t\tvar sideWall = new PIXI.Graphics();\r\n\t\tsideWall.beginFill(0x000000);\r\n\t\tsideWall.drawRect(s(54), s(256 - result.elevation * ppmCanvas), s(1), s(result.elevation * ppmCanvas));\r\n\t\tstage.addChild(sideWall);\r\n\r\n\t\tvar bottomWall = new PIXI.Graphics();\r\n\t\tsideWall.beginFill(0x000000);\r\n\t\tsideWall.drawRect(s(54), s(256), s(566), s(1));\r\n\t\tstage.addChild(sideWall);\r\n\r\n\t\tvar bottomline1 = new PIXI.Graphics();\r\n\t\tbottomline1.beginFill(COLOR_SUPPORT_LINES);\r\n\t\tbottomline1.drawRect(s(54), s(264), s(1), s(14));\r\n\t\tstage.addChild(bottomline1);\r\n\r\n\t\tvar bottomline3 = new PIXI.Graphics();\r\n\t\tbottomline3.beginFill(COLOR_SUPPORT_LINES);\r\n\t\tbottomline3.drawRect(s(54), s(277), s(566), s(1));\r\n\t\tstage.addChild(bottomline3);\r\n\r\n\t\tvar kamera = new PIXI.Sprite(loader.resources.pano.texture);\r\n\t\tkamera.anchor.set(0.5, 0.5);\r\n\t\tkamera.scale = new PIXI.Point(.51, .51);\r\n\t\tkamera.x = s(54);\r\n\t\tkamera.y = s(256 - result.elevation * ppmCanvas);\r\n\t\tstage.addChild(kamera);\r\n\r\n\t\t// var bottomline1 = new PIXI.Graphics();\r\n\t\t// bottomline1.beginFill(COLOR_SUPPORT_LINES);\r\n\t\t// bottomline1.drawRect(s(54), s(264), s(1), s(14));\r\n\t\t// stage.addChild(bottomline1);\r\n\r\n\t\t// var bottomline2 = new PIXI.Graphics();\r\n\t\t// bottomline2.beginFill(COLOR_SUPPORT_LINES);\r\n\t\t// bottomline2.drawRect(s(54 + result.d_dori_d_min * ppmCanvas), s(264), s(1), s(14));\r\n\t\t// stage.addChild(bottomline2);\r\n\r\n\t\t// var bottomline3 = new PIXI.Graphics();\r\n\t\t// bottomline3.beginFill(COLOR_SUPPORT_LINES);\r\n\t\t// bottomline3.drawRect(s(54), s(277), s(result.d_dori_d_min * ppmCanvas), s(1));\r\n\t\t// stage.addChild(bottomline3);\r\n\r\n\t\t// var anfasser = new PIXI.Sprite(loader.resources.anfasserX.texture);\r\n\t\t// anfasser.anchor.set(0.5);\r\n\t\t// anfasser.scale = new PIXI.Point(.51, .51);\r\n\t\t// anfasser.x = s(54 + result.d_dori_d_min * ppmCanvas);\r\n\t\t// anfasser.y = s(278);\r\n\t\t// stage.addChild(anfasser);\r\n\r\n\t\t// if (result.d_dori_d_min) {\r\n\t\t// \t$(`${app.iFtF(result.d_dori_d_min).toFixed(2)} ${app.unitSymbol()}`).css({\r\n\t\t// \t\t'position': 'absolute',\r\n\t\t// \t\t'top': s(276.5) + 'px',\r\n\t\t// \t\t'left': s(54 + result.d_dori_d_min * ppmCanvas) + 15 + 'px',\r\n\t\t// \t\t'transform': 'translate(0, -50%)',\r\n\t\t// \t\t'color': '#b5b5b7',\r\n\t\t// \t}).appendTo(container);\r\n\t\t// }\r\n\r\n\r\n\t\t// $(`${app.ll('settingsModeSelectorsFOVCamHeight')}: ${app.iFtF(result.elevation).toFixed(2)} ${app.unitSymbol()}
        Horizontal FOV: ${result.fov.toFixed(2)}°
        `).css({\r\n\t\t// \t'position': 'absolute',\r\n\t\t// \t'top': s(27) + 'px',\r\n\t\t// \t'left': s(19) + 'px',\r\n\t\t// \t'color': '#000',\r\n\t\t// \t'padding': '2px',\r\n\t\t// }).appendTo(container);\r\n\r\n\t\t// $(`${app.ll('settingsModeVisualSideView')}`).css({\r\n\t\t// \t'position': 'absolute',\r\n\t\t// \t'top': s(27) + 'px',\r\n\t\t// \t'right': s(60) + 'px',\r\n\t\t// \t'color': '#000',\r\n\t\t// \t'padding': '2px',\r\n\t\t// \t'transform': 'translate(0, -50%)',\r\n\t\t// \t'font-size': '2rem',\r\n\t\t// }).appendTo(container);\r\n\r\n\t\tfinalRenderer();\r\n\t}\r\n\r\n\tfunction finalRenderer() {\r\n\t\ttry {\r\n\t\t\trenderer.render(stage);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.log('i actually just broke');\r\n\t\t\tconsole.log(error);\r\n\t\t\terrorMessage();\r\n\t\t}\r\n\t}\r\n}","const COLOR_DORI_D = 0x005691;\r\nconst COLOR_DORI_O = 0x1272AA;\r\nconst COLOR_DORI_R = 0x2B8FC3;\r\nconst COLOR_DORI_I = 0x3EAADB;\r\n\r\nconst COLOR_FOV = 0x3EAADB;\r\nconst COLOR_OUTFOV = 0xDB5C68;\r\nconst COLOR_SUPPORT_LINES = 0xB5B5B7;\r\n\r\nconst DORI_D = 25, DORI_O = 63, DORI_R = 125, DORI_I = 250;\r\nconst DRI_D = 3, DRI_R = 12, DRI_I = 24;\r\nconst HUMAN_HEIGHT = 1.7, HUMAN_WIDTH = 0.5;\r\n\r\nfunction radToDeg(number) {\r\n return number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n return number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function vPano360SideWall($element, result) {\r\n console.log(result);\r\n function errorMessage() {\r\n container.html('');\r\n $('The values you have chosen are
        • below or above limits that can be rendered for display
        • not a valid combination.
        ').css({\r\n 'position': 'absolute',\r\n 'top': '50%',\r\n 'left': '50%',\r\n 'display': 'inline-block',\r\n 'transform': 'translate(-50%, -50%)',\r\n }).appendTo(container)\r\n }\r\n\r\n var container = $element;\r\n container.html('');\r\n container.css('position', 'relative');\r\n container.css('height', container.width() * 0.4829 + 'px');\r\n\r\n // $(window).on('resize', function () {\r\n // \tstage.removeChildren();\r\n // \trenderer.resize(container.width(), container.width() * 0.4829);\r\n // \tcontainer.find('span').remove();\r\n // \tcontainer.css('height', container.width() * 0.4829 + 'px');\r\n // \trender();\r\n // });\r\n\r\n var renderer = new PIXI.CanvasRenderer(container.width(), container.width() * 0.4829, { antialias: true, backgroundColor: 0xe6e6e8, roundPixels: true, forceFXAA: true });\r\n container.append(renderer.view);\r\n\r\n renderer.autoresize = true;\r\n renderer.resize(container.width(), container.width() * 0.4829);\r\n\r\n var stage = new PIXI.Container()\r\n\r\n const loader = PIXI.loader;\r\n render();\r\n\r\n function render() {\r\n function s(value) {\r\n return renderer.width / 620 * value;\r\n }\r\n\r\n var ppmCanvas = 173 / result.d_dori_d * .5;\r\n\r\n var a1 = result.a1;\r\n var a3 = result.a3;\r\n var a5 = result.a5;\r\n var pixel_size = result.pixel_size;\r\n\r\n var elevation;\r\n var distance;\r\n\r\n // var sideline1 = new PIXI.Graphics();\r\n // sideline1.beginFill(COLOR_SUPPORT_LINES);\r\n // sideline1.drawRect(s(32), s(84), s(14), s(1));\r\n // stage.addChild(sideline1);\r\n\r\n // var sideline2 = new PIXI.Graphics();\r\n // sideline2.beginFill(COLOR_SUPPORT_LINES);\r\n // sideline2.drawRect(s(32), s(84 + 173 * .5), s(566 * .5), s(1));\r\n // stage.addChild(sideline2);\r\n\r\n // var sideline3 = new PIXI.Graphics();\r\n // sideline3.beginFill(COLOR_SUPPORT_LINES);\r\n // sideline3.drawRect(s(32), s(84), s(1), s(173 * .5));\r\n // stage.addChild(sideline3);\r\n\r\n var bgOut = new PIXI.Graphics();\r\n\t\tbgOut.beginFill(COLOR_OUTFOV);\r\n\t\tbgOut.drawRect(s(54), s(84), s(566), s(173));\r\n\t\tstage.addChild(bgOut);\r\n\r\n var bottomline1 = new PIXI.Graphics();\r\n bottomline1.beginFill(COLOR_SUPPORT_LINES);\r\n bottomline1.drawRect(s(38), s(84), s(20), s(1));\r\n stage.addChild(bottomline1);\r\n\r\n var bottomline2 = new PIXI.Graphics();\r\n bottomline2.beginFill(COLOR_SUPPORT_LINES);\r\n bottomline2.drawRect(s(48), s(84 + 175 * .5), s(281), s(1));\r\n stage.addChild(bottomline2);\r\n\r\n var bottomline3 = new PIXI.Graphics();\r\n bottomline3.beginFill(COLOR_SUPPORT_LINES);\r\n bottomline3.drawRect(s(48), s(84), s(1), s(175 * .5));\r\n stage.addChild(bottomline3);\r\n\r\n function drawCircle(radius, color) {\r\n var circle = new PIXI.Graphics();\r\n circle.beginFill(color);\r\n circle.drawCircle(s(54 + 566 * 0.5), s(84 + 173 * .5), s(radius));\r\n stage.addChild(circle);\r\n }\r\n var spots = [0];\r\n if (result.view === 'camera') {\r\n if (result.d_dori_d > result.illu_range_ground) {\r\n drawCircle(result.d_dori_d * ppmCanvas, COLOR_OUTFOV);\r\n drawCircle(result.illu_range_ground * ppmCanvas, COLOR_DORI_I);\r\n spots = [0, result.illu_range_ground, result.d_dori_d];\r\n }else{\r\n drawCircle(result.illu_range_ground * ppmCanvas, COLOR_DORI_I);\r\n spots = [0, result.illu_range_ground];\r\n }\r\n }\r\n if (result.view === 'dori') {\r\n console.log(result.d_dori_d, ppmCanvas, COLOR_DORI_D, drawCircle);\r\n if (result.d_dori_d) { drawCircle(ppmCanvas * result.d_dori_d, COLOR_DORI_D); }\r\n if (result.d_dori_o) { drawCircle(ppmCanvas * result.d_dori_o, COLOR_DORI_O); }\r\n if (result.d_dori_r) { drawCircle(ppmCanvas * result.d_dori_r, COLOR_DORI_R); }\r\n if (result.d_dori_i) { drawCircle(ppmCanvas * result.d_dori_i, COLOR_DORI_I); }\r\n spots = [0, result.d_dori_i, result.d_dori_r, result.d_dori_o, result.d_dori_d];\r\n }\r\n if (result.view === 'vi_an') {\r\n // drawCircle(ppmCanvas * result.d_dori_d, COLOR_DORI_I);\r\n spots = [result.d_dori_d];\r\n if (result.va_dmin && result.va_dmax) {\r\n drawCircle(ppmCanvas * result.va_dmax, COLOR_DORI_O);\r\n drawCircle(ppmCanvas * result.va_dmin, COLOR_OUTFOV);\r\n spots.unshift(result.va_dmin, result.va_dmax);\r\n }\r\n spots.unshift(0);\r\n }\r\n\r\n app.emit('ppmChangeTop', { spots: spots, result: result, type: 'panoCeil', ppm: ppmCanvas, container: container, max: result.d_dori_d });\r\n\r\n\r\n var kamera = new PIXI.Sprite(loader.resources.pano.texture);\r\n kamera.anchor.set(0.5, 0.5);\r\n kamera.scale = new PIXI.Point(.51, .51);\r\n kamera.x = s(54 + 566 * 0.5);\r\n kamera.y = s(84 + 173 * .5);\r\n kamera.rotation = degToRad(90);\r\n stage.addChild(kamera);\r\n\r\n // var anfasser = new PIXI.Sprite(loader.resources.anfasserY.texture);\r\n // anfasser.anchor.set(0.5);\r\n // anfasser.scale = new PIXI.Point(.51, .51);\r\n // anfasser.x = s(32 + 1);\r\n // anfasser.y = s(84 + 1);\r\n // stage.addChild(anfasser);\r\n\r\n // if (result.d_dori_d_min) {\r\n // \t$(`${app.iFtF(result.d_dori_d_max).toFixed(2)} ${app.unitSymbol()}`).css({\r\n // \t\t'position': 'absolute',\r\n // \t\t'top': s(84) + 'px',\r\n // \t\t'left': s(32) + 18 + 'px',\r\n // \t\t'transform': 'translate(0, -50%)',\r\n // \t\t'color': '#b5b5b7',\r\n // \t}).appendTo(container);\r\n // }\r\n\r\n // $(`${app.ll('settingsModeSelectorsFOVHorizontalFov')}: ${result.fov.toFixed(2)}°`).css({\r\n // \t'position': 'absolute',\r\n // \t'top': s(27) + 'px',\r\n // \t'left': s(19) + 'px',\r\n // \t'color': '#000',\r\n // \t'padding': '2px',\r\n // \t'transform': 'translate(0, -50%)',\r\n // }).appendTo(container);\r\n\r\n // $(`${app.ll('settingsModeVisualTopView')}`).css({\r\n // \t'position': 'absolute',\r\n // \t'top': s(27) + 'px',\r\n // \t'right': s(60) + 'px',\r\n // \t'color': '#000',\r\n // \t'padding': '2px',\r\n // \t'transform': 'translate(0, -50%)',\r\n // \t'font-size': '2rem',\r\n // }).appendTo(container);\r\n\r\n finalRenderer();\r\n }\r\n\r\n function finalRenderer() {\r\n try {\r\n renderer.render(stage);\r\n } catch (error) {\r\n console.log('i actually just broke');\r\n console.log(error);\r\n errorMessage();\r\n }\r\n }\r\n}","const COLOR_DORI_D = 0x005691;\r\nconst COLOR_DORI_O = 0x1272AA;\r\nconst COLOR_DORI_R = 0x2B8FC3;\r\nconst COLOR_DORI_I = 0x3EAADB;\r\n\r\nconst COLOR_FOV = 0x3EAADB;\r\nconst COLOR_OUTFOV = 0xDB5C68;\r\nconst COLOR_SUPPORT_LINES = 0xB5B5B7;\r\n\r\nconst DORI_D = 25, DORI_O = 63, DORI_R = 125, DORI_I = 250;\r\nconst DRI_D = 3, DRI_R = 12, DRI_I = 24;\r\nconst HUMAN_HEIGHT = 1.7, HUMAN_WIDTH = 0.5;\r\n\r\nfunction radToDeg(number) {\r\n\treturn number * 180 / Math.PI;\r\n}\r\n\r\nfunction degToRad(number) {\r\n\treturn number * Math.PI / 180;\r\n}\r\n\r\nmodule.exports = function vPano360SideWall($element, result) {\r\n\tconsole.log(result);\r\n\tfunction errorMessage() {\r\n\t\tcontainer.html('');\r\n\t\t$('The values you have chosen are
        • below or above limits that can be rendered for display
        • not a valid combination.
        ').css({\r\n\t\t\t'position': 'absolute',\r\n\t\t\t'top': '50%',\r\n\t\t\t'left': '50%',\r\n\t\t\t'display': 'inline-block',\r\n\t\t\t'transform': 'translate(-50%, -50%)',\r\n\t\t}).appendTo(container)\r\n\t}\r\n\r\n\tvar container = $element;\r\n\tcontainer.html('');\r\n\tcontainer.css('position', 'relative');\r\n\tcontainer.css('height', container.width() * 0.4829 + 'px');\r\n\r\n\t// $(window).on('resize', function () {\r\n\t// \tstage.removeChildren();\r\n\t// \trenderer.resize(container.width(), container.width() * 0.4829);\r\n\t// \tcontainer.find('span').remove();\r\n\t// \tcontainer.css('height', container.width() * 0.4829 + 'px');\r\n\t// \trender();\r\n\t// });\r\n\r\n\tvar renderer = new PIXI.CanvasRenderer(container.width(), container.width() * 0.4829, { antialias: true, backgroundColor: 0xe6e6e8, roundPixels: true, forceFXAA: true });\r\n\tcontainer.append(renderer.view);\r\n\r\n\trenderer.autoresize = true;\r\n\trenderer.resize(container.width(), container.width() * 0.4829);\r\n\r\n\tvar stage = new PIXI.Container()\r\n\r\n\tconst loader = PIXI.loader;\r\n\trender();\r\n\r\n\tfunction render() {\r\n\t\tfunction s(value) {\r\n\t\t\treturn renderer.width / 620 * value;\r\n\t\t}\r\n\r\n\t\tif (!result.d_dori_d) { errorMessage(); return; }\r\n\t\tvar ppmCanvas = 173 / result.d_dori_d;\r\n\r\n\t\tapp.emit('ppmChangeTop', { spots: [0, result.d_dori_i, result.d_dori_r, result.d_dori_o, result.d_dori_d],result: result, type: 'panoWall', ppm: ppmCanvas, container: container, max: result.d_dori_d });\r\n\r\n\t\tvar a1 = result.a1;\r\n\t\tvar a3 = result.a3;\r\n\t\tvar a5 = result.a5;\r\n\t\tvar pixel_size = result.pixel_size;\r\n\r\n\t\tvar elevation;\r\n\t\tvar distance;\r\n\r\n\t\tvar bgOut = new PIXI.Graphics();\r\n\t\tbgOut.beginFill(COLOR_OUTFOV);\r\n\t\tbgOut.drawRect(s(54), s(84), s(566), s(173));\r\n\t\tstage.addChild(bgOut);\r\n\r\n\t\tvar circleMask = new PIXI.Graphics();\r\n\t\tcircleMask.beginFill(0x000000);\r\n\t\tcircleMask.drawRect(s(54), s(84), s(566), s(173));\r\n\t\tstage.addChild(circleMask);\r\n\r\n\t\tfunction drawCircle(radius, color) {\r\n\t\t\tvar circle = new PIXI.Graphics();\r\n\t\t\tcircle.beginFill(color);\r\n\t\t\tcircle.drawCircle(s(54 + 566 * 0.5), s(257), s(radius));\r\n\t\t\tcircle.mask = circleMask;\r\n\t\t\tstage.addChild(circle);\r\n\t\t}\r\n\r\n\t\t// drawCircle(ppmCanvas * result.d_dori_d_max, COLOR_DORI_D);\r\n\t\t// if (result.d_dori_o_max) { drawCircle(ppmCanvas * result.d_dori_o_max, COLOR_DORI_O); }\r\n\t\t// if (result.d_dori_r_max) { drawCircle(ppmCanvas * result.d_dori_r_max, COLOR_DORI_R); }\r\n\t\t// if (result.d_dori_i_max) { drawCircle(ppmCanvas * result.d_dori_i_max, COLOR_DORI_I); }\r\n\r\n\t\t// if (result.d_dori_i_min) { drawCircle(ppmCanvas * result.d_dori_i_min, COLOR_DORI_R); }\r\n\t\t// if (result.d_dori_r_min) { drawCircle(ppmCanvas * result.d_dori_r_min, COLOR_DORI_O); }\r\n\t\t// if (result.d_dori_o_min) { drawCircle(ppmCanvas * result.d_dori_o_min, COLOR_DORI_D); }\r\n\t\t// if (result.d_dori_d_min) { drawCircle(ppmCanvas * result.d_dori_d_min, COLOR_OUTFOV); }\r\n\r\n\t\tif (result.view === 'camera') {\r\n\t\t\tdrawCircle(ppmCanvas * result.d_dori_d, COLOR_DORI_I);\r\n\t\t}\r\n\t\tif (result.view === 'dori') {\r\n\t\t\tif (result.d_dori_d) { drawCircle(ppmCanvas * result.d_dori_d, COLOR_DORI_D); }\r\n\t\t\tif (result.d_dori_o) { drawCircle(ppmCanvas * result.d_dori_o, COLOR_DORI_O); }\r\n\t\t\tif (result.d_dori_r) { drawCircle(ppmCanvas * result.d_dori_r, COLOR_DORI_R); }\r\n\t\t\tif (result.d_dori_i) { drawCircle(ppmCanvas * result.d_dori_i, COLOR_DORI_I); }\r\n\t\t}\r\n\t\tif (result.view === 'vi_an') {\r\n\t\t\t// drawCircle(ppmCanvas * result.d_dori_d, COLOR_DORI_I);\r\n\t\t\tif (result.va_dmin && result.va_dmax) {\r\n\t\t\t\tdrawCircle(ppmCanvas * result.va_dmax, COLOR_DORI_O);\r\n\t\t\t\tdrawCircle(ppmCanvas * result.va_dmin, COLOR_OUTFOV);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar bottomWall = new PIXI.Graphics();\r\n\t\tbottomWall.beginFill(0x000000);\r\n\t\tbottomWall.drawRect(s(54), s(256), s(566), s(1));\r\n\t\tstage.addChild(bottomWall);\r\n\r\n\t\tvar bottomline1 = new PIXI.Graphics();\r\n\t\tbottomline1.beginFill(COLOR_SUPPORT_LINES);\r\n\t\tbottomline1.drawRect(s(54 + 282), s(264), s(1), s(14));\r\n\t\tstage.addChild(bottomline1);\r\n\r\n\t\tvar bottomline3 = new PIXI.Graphics();\r\n\t\tbottomline3.beginFill(COLOR_SUPPORT_LINES);\r\n\t\tbottomline3.drawRect(s(54 + 282), s(277), s(566), s(1));\r\n\t\tstage.addChild(bottomline3);\r\n\r\n\t\tvar kamera = new PIXI.Sprite(loader.resources.pano.texture);\r\n\t\tkamera.anchor.set(0.5, 0.5);\r\n\t\tkamera.scale = new PIXI.Point(.51, .51);\r\n\t\tkamera.x = s(54 + 566 * 0.5);\r\n\t\tkamera.y = s(256);\r\n\t\tkamera.rotation = degToRad(-90);\r\n\t\tstage.addChild(kamera);\r\n\r\n\t\t// var sideline1 = new PIXI.Graphics();\r\n\t\t// sideline1.beginFill(COLOR_SUPPORT_LINES);\r\n\t\t// sideline1.drawRect(s(32), s(84), s(14), s(1));\r\n\t\t// stage.addChild(sideline1);\r\n\r\n\t\t// var sideline2 = new PIXI.Graphics();\r\n\t\t// sideline2.beginFill(COLOR_SUPPORT_LINES);\r\n\t\t// sideline2.drawRect(s(32), s(256), s(14), s(1));\r\n\t\t// stage.addChild(sideline2);\r\n\r\n\t\t// var sideline3 = new PIXI.Graphics();\r\n\t\t// sideline3.beginFill(COLOR_SUPPORT_LINES);\r\n\t\t// sideline3.drawRect(s(32), s(84), s(1), s(173));\r\n\t\t// stage.addChild(sideline3);\r\n\r\n\t\t// var anfasser = new PIXI.Sprite(loader.resources.anfasserY.texture);\r\n\t\t// anfasser.anchor.set(0.5);\r\n\t\t// anfasser.scale = new PIXI.Point(.51, .51);\r\n\t\t// anfasser.x = s(32 + 1);\r\n\t\t// anfasser.y = s(84 + 1);\r\n\t\t// stage.addChild(anfasser);\r\n\r\n\t\t// if (result.d_dori_d_min) {\r\n\t\t// \t$(`${app.iFtF(result.d_dori_d_max).toFixed(2)} ${app.unitSymbol()}`).css({\r\n\t\t// \t\t'position': 'absolute',\r\n\t\t// \t\t'top': s(84) + 'px',\r\n\t\t// \t\t'left': s(32) + 18 + 'px',\r\n\t\t// \t\t'transform': 'translate(0, -50%)',\r\n\t\t// \t\t'color': '#b5b5b7',\r\n\t\t// \t}).appendTo(container);\r\n\t\t// }\r\n\r\n\t\t// $(`${app.ll('settingsModeSelectorsFOVHorizontalFov')}: ${result.fov.toFixed(2)}°`).css({\r\n\t\t// \t'position': 'absolute',\r\n\t\t// \t'top': s(27) + 'px',\r\n\t\t// \t'left': s(19) + 'px',\r\n\t\t// \t'color': '#000',\r\n\t\t// \t'padding': '2px',\r\n\t\t// \t'transform': 'translate(0, -50%)',\r\n\t\t// }).appendTo(container);\r\n\r\n\t\t// $(`${app.ll('settingsModeVisualTopView')}`).css({\r\n\t\t// \t'position': 'absolute',\r\n\t\t// \t'top': s(27) + 'px',\r\n\t\t// \t'right': s(60) + 'px',\r\n\t\t// \t'color': '#000',\r\n\t\t// \t'padding': '2px',\r\n\t\t// \t'transform': 'translate(0, -50%)',\r\n\t\t// \t'font-size': '2rem',\r\n\t\t// }).appendTo(container);\r\n\r\n\t\tfinalRenderer();\r\n\t}\r\n\r\n\tfunction finalRenderer() {\r\n\t\ttry {\r\n\t\t\trenderer.render(stage);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.log('i actually just broke');\r\n\t\t\tconsole.log(error);\r\n\t\t\terrorMessage();\r\n\t\t}\r\n\t}\r\n}","module.exports = function () {\r\n\tvar ms_ie = false;\r\n\tvar ua = window.navigator.userAgent;\r\n\tvar old_ie = ua.indexOf('MSIE ');\r\n\tvar new_ie = ua.indexOf('Trident/');\r\n\r\n\tif ((old_ie > -1) || (new_ie > -1)) {\r\n\t\tms_ie = true;\r\n\t}\r\n\r\n\tif (ms_ie) {\r\n\t\t//IE specific code goes here\r\n\t\t(function () {\r\n\t\t\tfunction CustomEvent(event, params) {\r\n\t\t\t\tparams = params || { bubbles: false, cancelable: false, detail: undefined };\r\n\t\t\t\tvar evt = document.createEvent('CustomEvent');\r\n\t\t\t\tevt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\r\n\t\t\t\treturn evt;\r\n\t\t\t}\r\n\r\n\t\t\tCustomEvent.prototype = window.Event.prototype;\r\n\r\n\t\t\twindow.CustomEvent = CustomEvent;\r\n\t\t\twindow.Event = CustomEvent;\r\n\t\t})();\r\n\r\n\t\t(function () {\r\n\t\t\tNumber.parseFloat = parseFloat;\r\n\t\t})();\r\n\t}\r\n}\r\n\r\n\r\n\r\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvanMvYXBwLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvZXhwZXJ0bW9kZS5qcyIsInNyYy9qcy9jb21wb25lbnRzL2d1aWRlZG1vZGUuanMiLCJzcmMvanMvY29tcG9uZW50cy9tZW51ZXMvY2FtZXJhTS5qcyIsInNyYy9qcy9jb21wb25lbnRzL21lbnVlcy9maWVsZE0uanMiLCJzcmMvanMvY29tcG9uZW50cy9tZW51ZXMvbGVuc00uanMiLCJzcmMvanMvY29tcG9uZW50cy9tZW51ZXMvdGFyZ2V0TS5qcyIsInNyYy9qcy9jb21wb25lbnRzL21lbnVlcy92YU0uanMiLCJzcmMvanMvY29tcG9uZW50cy9zZXR0aW5nc21vZGUuanMiLCJzcmMvanMvY29tcG9uZW50cy9zbmlwcGV0cy9hY2NvcmRpb24uanMiLCJzcmMvanMvY29tcG9uZW50cy9zbmlwcGV0cy9xdWVzdGlvbi5qcyIsInNyYy9qcy9jb21wb25lbnRzL3NuaXBwZXRzL3NsaWRlci5qcyIsInNyYy9qcy9jb21wb25lbnRzL3Zpc3VhbHMvZGlzdGFuY2VTbGlkZXJzLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvdmlzdWFscy92aXN1YWxfbm9ucGFub19zaWRlLmpzIiwic3JjL2pzL2NvbXBvbmVudHMvdmlzdWFscy92aXN1YWxfbm9ucGFub190b3AuanMiLCJzcmMvanMvY29tcG9uZW50cy92aXN1YWxzL3Zpc3VhbF9wYW5vXzM2MF9zaWRlX2NlaWwuanMiLCJzcmMvanMvY29tcG9uZW50cy92aXN1YWxzL3Zpc3VhbF9wYW5vXzM2MF9zaWRlX3dhbGwuanMiLCJzcmMvanMvY29tcG9uZW50cy92aXN1YWxzL3Zpc3VhbF9wYW5vXzM2MF90b3BfY2VpbC5qcyIsInNyYy9qcy9jb21wb25lbnRzL3Zpc3VhbHMvdmlzdWFsX3Bhbm9fMzYwX3RvcF93YWxsLmpzIiwic3JjL2pzL3BvbHlmaWxscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbmxCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2o2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Y0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJyZXF1aXJlKCcuL3BvbHlmaWxscy5qcycpKCk7XHJcblxyXG4kKGRvY3VtZW50KS5mb3VuZGF0aW9uKCk7XHJcblxyXG4vLyBNZW51XHJcblxyXG4kKFwiLmZ1bmN0aW9ucy1tb2JpbGVcIikub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG5cdGlmICgkKFwiLm1vYmlsZS1uYXZcIikuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7XHJcblx0XHQkKFwiLm1vYmlsZS1uYXZcIikucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdH0gZWxzZSB7XHJcblx0XHQkKFwiLm1vYmlsZS1uYXZcIikuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdH1cclxufSk7XHJcblxyXG4oZnVuY3Rpb24gKCQpIHtcclxuXHRmdW5jdGlvbiBnZXRVUkxQYXJhbWV0ZXIobmFtZSkge1xyXG5cdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCgobmV3IFJlZ0V4cCgnWz98Jl0nICsgbmFtZSArICc9JyArICcoW14mO10rPykoJnwjfDt8JCknKS5leGVjKGxvY2F0aW9uLnNlYXJjaCkgfHwgW251bGwsICcnXSlbMV0ucmVwbGFjZSgvXFwrL2csICclMjAnKSkgfHwgbnVsbDtcclxuXHR9XHJcblx0dmFyIGxsID0ge307XHJcblxyXG5cdC8vIHZhciBsYW5nID0gZ2V0VVJMUGFyYW1ldGVyKCdsYW5nJyk7XHJcblx0Ly8gaWYgKCFsYW5nKSB7IGxhbmcgPSAnZW4nOyB9XHJcblx0Ly8gaWYgKGxhbmcgPT09ICdkZWJ1ZycpIHsgcnVuKCk7IHJldHVybjsgfVxyXG5cdC8vICQuZ2V0KCcuLi9sb2NhbGl6YXRpb25zLycgKyBsYW5nICsgXCIueG1sXCIpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHtcclxuXHQvLyAkKGRvY3VtZW50LmhlYWQpLmZpbmQoJ3htbCNsbCcpLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbiAoaSwgdGl0bGUpIHtcclxuXHQvLyBcdGlmIChsbFt0aXRsZS5ub2RlTmFtZV0pIHsgY29uc29sZS53YXJuKFwibG9jYWxpemF0aW9uIGNvbnRhaW5zIFxcXCJcIiArIHRpdGxlLm5vZGVOYW1lICsgXCJcXFwiIGF0IGxlYXN0IHR3aWNlIVwiKTsgcmV0dXJuIH1cclxuXHQvLyBcdGxsW3RpdGxlLm5vZGVOYW1lXSA9IHRoaXMudGV4dENvbnRlbnQ7XHJcblx0Ly8gfSk7XHJcblx0Ly8gdmFyIG1hdGNoXHJcblxyXG5cdC8vIHdoaWxlICgobWF0Y2ggPSB3aW5kb3cuZG9jdW1lbnQuaGVhZC50ZXh0Q29udGVudC5tYXRjaCgve3t7KC4qKX19fS8pKSkge1xyXG5cdC8vIFx0d2luZG93LmRvY3VtZW50LmhlYWQuaW5uZXJIVE1MID0gd2luZG93LmRvY3VtZW50LmhlYWQuaW5uZXJIVE1MLnJlcGxhY2UobWF0Y2hbMF0sIGxsW21hdGNoWzFdXSk7XHJcblx0Ly8gfVxyXG5cclxuXHQvLyB3aGlsZSAoKG1hdGNoID0gd2luZG93LmRvY3VtZW50LmJvZHkudGV4dENvbnRlbnQubWF0Y2goL3t7eyguKil9fX0vKSkpIHtcclxuXHQvLyBcdHdpbmRvdy5kb2N1bWVudC5ib2R5LmlubmVySFRNTCA9IHdpbmRvdy5kb2N1bWVudC5ib2R5LmlubmVySFRNTC5yZXBsYWNlKG1hdGNoWzBdLCBsbFttYXRjaFsxXV0pO1xyXG5cdC8vIH1cclxuXHJcblx0cnVuKCk7XHJcblx0Ly8gfSkuZmFpbChmdW5jdGlvbiAoKSB7XHJcblx0Ly8gXHRhbGVydCgnTG9jYWxpemF0aW9uIGNvdWxkIG5vdCBiZSBsb2FkZWQnKVxyXG5cdC8vIH0pO1xyXG5cclxuXHJcblx0ZnVuY3Rpb24gcnVuKCkge1xyXG5cdFx0dmFyIGFwcCA9IHtcclxuXHRcdFx0YWN0aXZlVGFiOiAnZXhwZXJ0JyxcclxuXHRcdFx0c2V0dGluZ3NTZWxlY3RhYmxlOiBmYWxzZSxcclxuXHRcdFx0c2V0dGluZ3M6IHtcclxuXHRcdFx0XHR1bml0OiAnbWV0ZXInLFxyXG5cdFx0XHRcdGFjdGl2ZUNhbnZhczogZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdFx0Y3VycmVudDoge1xyXG5cdFx0XHRcdGZhbWlseTogbnVsbCxcclxuXHRcdFx0XHRtb2RlbDogbnVsbCxcclxuXHRcdFx0XHRyZXNvbHV0aW9uOiBudWxsLFxyXG5cdFx0XHRcdGxlbnM6IG51bGwsXHJcblx0XHRcdFx0dW5pdDogJ21ldGVyJyxcclxuXHRcdFx0XHR2aWV3OiBcImNhbWVyYVwiIC8vY2FtZXJhLCBkb3JpLCB2aV9hblxyXG5cdFx0XHR9LFxyXG5cdFx0XHRkYXRhQ2hhbmdlOiBuZXcgRXZlbnQoJ2RhdGFDaGFuZ2UnKSxcclxuXHRcdFx0YmxhY2tsaXN0ZWRGb3JHdWlkZWQ6IFsnQVZJT1RFQyddXHJcblx0XHR9O1xyXG5cdFx0d2luZG93LmFwcCA9IGFwcDtcclxuXHJcblx0XHRhcHAubGwgPSBmdW5jdGlvbiAobmFtZSkge1xyXG5cdFx0XHQvLyBpZiAobGFuZyA9PT0gJ2RlYnVnJykgeyByZXR1cm4gXCJ7e3tcIiArIG5hbWUgKyBcIn19fVwiOyB9XHJcblx0XHRcdC8vIHJldHVybiBsbFtuYW1lXTtcclxuXHRcdFx0cmV0dXJuIHByZWxvYWQubGFuZ3VhZ2VbbmFtZV07XHJcblx0XHR9XHJcblxyXG5cdFx0YXBwLmxhYmVsX3ZhID0gZnVuY3Rpb24gKG5hbWUpIHtcclxuXHRcdFx0c3dpdGNoIChuYW1lKSB7XHJcblx0XHRcdFx0Y2FzZSBcIkVWQVwiOiByZXR1cm4gXCJFc3NlbnRpYWwgVmlkZW8gQW5hbHl0aWNzXCI7XHJcblx0XHRcdFx0Y2FzZSBcIklWQVwiOiByZXR1cm4gXCJJbnRlbGxpZ2VudCBWaWRlbyBBbmFseXRpY3NcIjtcclxuXHRcdFx0XHRjYXNlIFwiSVZBIFBybyBQZXJpbWV0ZXJcIjogcmV0dXJuIFwiSVZBIFBybyBQZXJpbWV0ZXJcIjtcclxuXHRcdFx0XHRjYXNlIFwiSVZBIFBybyBCdWlsZGluZ3NcIjogcmV0dXJuIFwiSVZBIFBybyBCdWlsZGluZ3NcIjtcclxuXHRcdFx0XHRjYXNlIFwiSVZBIFBybyBUcmFmZmljXCI6IHJldHVybiBcIklWQSBQcm8gVHJhZmZpY1wiO1xyXG5cdFx0XHRcdGNhc2UgXCJJVkEgUHJvIFBQRVwiOiByZXR1cm4gXCJJVkEgUHJvIFBQRVwiO1xyXG5cdFx0XHRcdGNhc2UgXCJJVkEgUHJvIEFwcGVhcmFuY2VcIjogcmV0dXJuIFwiSVZBIFBybyBBcHBlYXJhbmNlXCI7XHJcblx0XHRcdFx0Y2FzZSBcIklWQSBQcm8gVmlzdWFsIEd1biBEZXRlY3Rpb25cIjogcmV0dXJuIFwiSVZBIFBybyBWaXN1YWwgR3VuIERldGVjdGlvblwiO1xyXG5cdFx0XHRcdGNhc2UgXCJJVkEgUHJvIExQUlwiOiByZXR1cm4gXCJJVkEgUHJvIExQUlwiO1xyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhuYW1lKTtcclxuXHRcdFx0XHRcdHJldHVybiBcImVycm9yIGxhYmVsIHZhIGZ1bmN0aW9uXCI7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHZhciBBUFBfTkFNRSA9IGFwcC5sbCgnYXBwTmFtZScpO1xyXG5cdFx0dmFyIEVSUk9SX1dST05HX0ZPUk1BVCA9IGFwcC5sbCgnZXJyb3JXcm9uZ0Zvcm1hdCcpO1xyXG5cdFx0dmFyIEZJTEVfTE9BRF9TVUNDRVNTID0gYXBwLmxsKCdmaWxlTG9hZFN1Y2Nlc3MnKTtcclxuXHJcblx0XHRhcHAubWF0aCA9IHt9O1xyXG5cdFx0YXBwLm1hdGgudG9GZWV0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcblx0XHRcdHJldHVybiB2YWx1ZSAvIDAuMzA0ODtcclxuXHRcdH1cclxuXHJcblx0XHRhcHAubWF0aC5mcm9tRmVldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG5cdFx0XHRyZXR1cm4gdmFsdWUgKiAwLjMwNDg7XHJcblx0XHR9XHJcblx0XHRhcHAudW5pdFN5bWJvbCA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aWYgKGFwcC5jdXJyZW50LnVuaXQgPT0gJ21ldGVyJykgeyByZXR1cm4gYXBwLmxsKCd1bml0c01ldGVyU2hvcnQnKTsgfVxyXG5cdFx0XHRpZiAoYXBwLmN1cnJlbnQudW5pdCA9PSAnZmVldCcpIHsgcmV0dXJuIGFwcC5sbCgndW5pdHNGZWV0U2hvcnQnKTsgfVxyXG5cdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblx0XHRhcHAuaUZ0RiA9IGZ1bmN0aW9uICh2YWx1ZSkgeyAvL2lmIEZlZXQgLT4gdG8gRmVldFxyXG5cdFx0XHRpZiAoYXBwLmN1cnJlbnQudW5pdCA9PSAnZmVldCcpIHtcclxuXHRcdFx0XHRyZXR1cm4gK2FwcC5tYXRoLnRvRmVldCh2YWx1ZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuICt2YWx1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRhcHAuaUZmRiA9IGZ1bmN0aW9uICh2YWx1ZSkgeyAvL2lmIEZlZXQgLT4gZnJvbSBGZWV0XHJcblx0XHRcdGlmIChhcHAuY3VycmVudC51bml0ID09ICdmZWV0Jykge1xyXG5cdFx0XHRcdHJldHVybiArYXBwLm1hdGguZnJvbUZlZXQodmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiArdmFsdWU7XHJcblx0XHR9XHJcblxyXG5cdFx0YXBwLmdldFJhd0RhdGEgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGlmIChhcHAuY3VycmVudC5mYW1pbHkgPT09ICdPdGhlcnMnKSB7XHJcblx0XHRcdFx0dmFyIHJhdyA9IHtcclxuXHRcdFx0XHRcdGN0eXBlOiAnT3RoZXJzJ1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0dmFyIHJlcywgcjEsIHIyLCBjO1xyXG5cdFx0XHRcdHJlcyA9IGFwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XS5yZXNvbHV0aW9uc1thcHAuY3VycmVudC5tb2RlbF07XHJcblx0XHRcdFx0YyA9IE51bWJlci5wYXJzZUZsb2F0KGFwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XS5zZW5zb3JbYXBwLmN1cnJlbnQucmVzb2x1dGlvbl0uZGlhZ29uYWwpO1xyXG5cdFx0XHRcdHIxID0gTnVtYmVyLnBhcnNlRmxvYXQocmVzLmhvclJlcyk7XHJcblx0XHRcdFx0cjIgPSBOdW1iZXIucGFyc2VGbG9hdChyZXMudmVyUmVzKTtcclxuXHRcdFx0XHRyYXcuc2Vuc29yV2lkdGggPSBNYXRoLnNxcnQoKHIxICogcjEpIC8gKChyMiAqIHIyKSArIChyMSAqIHIxKSkgKiBjICogYyk7XHJcblx0XHRcdFx0cmF3LnNlbnNvckhlaWdodCA9IHJhdy5zZW5zb3JXaWR0aCAvIHIxICogcjI7XHJcblx0XHRcdFx0cmF3Lkhvcml6b250YWxSZXNvbHV0aW9uID0gcjE7XHJcblx0XHRcdFx0cmF3LlZlcnRpY2FsUmVzb2x1dGlvbiA9IHIyO1xyXG5cdFx0XHRcdHJhdy5JbGx1bWluYXRvciA9ICdGQUxTRSc7XHJcblx0XHRcdFx0cmF3LlZpZGVvQW5hbHl0aWNzID0gJ0ZBTFNFJztcclxuXHRcdFx0XHRyYXcuTWluRkMgPSAwLjAxO1xyXG5cdFx0XHRcdHJldHVybiByYXc7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGFwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XVthcHAuY3VycmVudC5tb2RlbF1bYXBwLmN1cnJlbnQucmVzb2x1dGlvbl1bYXBwLmN1cnJlbnQubGVuc107XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyICRkb20sICR0YWJzLCAkdGFic0NvbnRlbnQsIGZpcnN0VGFiLCBleHBlcnRUYWIsIGd1aWRlZFRhYiwgc2V0dGluZ3NUYWI7XHJcblxyXG5cdFx0YXBwLmV2ZW50U3RhY2sgPSBbXTtcclxuXHRcdGFwcC5vbiA9IGZ1bmN0aW9uIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcclxuXHRcdFx0dmFyIGxpc3RlbmVyID1cclxuXHRcdFx0e1xyXG5cdFx0XHRcdGV2ZW50TmFtZTogZXZlbnROYW1lLFxyXG5cdFx0XHRcdGNhbGxiYWNrOiBjYWxsYmFjayxcclxuXHRcdFx0XHRvZmY6IGZ1bmN0aW9uIG9mZigpIHtcclxuXHRcdFx0XHRcdGFwcC5ldmVudFN0YWNrLnNwbGljZShhcHAuZXZlbnRTdGFjay5pbmRleE9mKGxpc3RlbmVyKSwgMSk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRvbjogZnVuY3Rpb24gb24oKSB7XHJcblx0XHRcdFx0XHRpZiAoYXBwLmV2ZW50U3RhY2suaW5kZXhPZihsaXN0ZW5lcikgPCAwKSB7XHJcblx0XHRcdFx0XHRcdGFwcC5ldmVudFN0YWNrLnB1c2gobGlzdGVuZXIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHRcdFx0YXBwLmV2ZW50U3RhY2sucHVzaChsaXN0ZW5lcik7XHJcblx0XHRcdHJldHVybiBsaXN0ZW5lcjtcclxuXHRcdH1cclxuXHJcblx0XHRhcHAuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoZXZlbnROYW1lLCBkYXRhLCBjYWxsYmFjaykge1xyXG5cdFx0XHRhcHAuZXZlbnRTdGFjay5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XHJcblx0XHRcdFx0aWYgKHYuZXZlbnROYW1lID09IGV2ZW50TmFtZSAmJiB0eXBlb2Ygdi5jYWxsYmFjayA9PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0XHR2LmNhbGxiYWNrKGRhdGEsIGNhbGxiYWNrKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGFwcC5hZGRUYWIgPSBmdW5jdGlvbiBhZGRUYWIobmFtZSwgdGl0bGUpIHtcclxuXHRcdFx0JHRhYnMuYXBwZW5kKGA8bGkgY2xhc3M9XCJ0YWJzLXRpdGxlJHtmaXJzdFRhYiA/IFwiIGlzLWFjdGl2ZVwiIDogXCJcIn1cIj48YSBocmVmPVwiIyR7bmFtZS50b0xvd2VyQ2FzZSgpfVwiPiR7dGl0bGV9PC9hPjwvbGk+YCk7XHJcblx0XHRcdCR0YWJzQ29udGVudC5hcHBlbmQoYDxkaXYgY2xhc3M9XCJ0YWJzLXBhbmVsJHtmaXJzdFRhYiA/IFwiIGlzLWFjdGl2ZVwiIDogXCJcIn1cIiBpZD1cIiR7bmFtZS50b0xvd2VyQ2FzZSgpfVwiPjwvZGl2PmApO1xyXG5cdFx0XHRmaXJzdFRhYiA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGFwcC5jYW1lcmFTZWxlY3RlZCA9IGZ1bmN0aW9uIGNhbWVyYVNlbGVjdGVkKCkge1xyXG5cdFx0XHQkKCcjc2V0dGluZ3Ntb2RlLWxhYmVsJykucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ2luYWN0aXZlJyk7XHJcblx0XHRcdCQoJyNzZXR0aW5nc21vZGUtbGFiZWwnKS5jbGljaygpO1xyXG5cdFx0XHQkKHdpbmRvdykuc2Nyb2xsVG9wKCQoJy50YWJzLWNvbnRlbnQnKS5vZmZzZXQoKS50b3ApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGxvYWRFeHRlcm5hbERlcGVuZGVuY2llcygpIHtcclxuXHRcdFx0YXBwLmNhbWVyYXNSYXcgPSBudWxsO1xyXG5cdFx0XHRhcHAuY2FtZXJhQWR2YW5jZWRMaXN0ID0ge307XHJcblx0XHRcdCQuZ2V0KFwiLi4vcmVzb3VyY2VzL3Bhbm9yYW1pYy1jYW1lcmFzLmpzb25cIikuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSkge1xyXG5cdFx0XHRcdGFwcC5jYW1lcmFzUmF3ID0gZGF0YTtcclxuXHJcblx0XHRcdFx0YXBwLmNhbWVyYXNSYXcuZm9yRWFjaChmdW5jdGlvbiAodikge1xyXG5cdFx0XHRcdFx0aWYgKHYuY3R5cGUgPT09ICdvdGhlcicpIHsgb3RoZXJDYW1lcmFzKHYpOyByZXR1cm47IH1cclxuXHRcdFx0XHRcdGxldCB2aWRlb19hbmFseXRpY3MgPSB7XHJcblx0XHRcdFx0XHRcdHR5cGU6IHYuVkFfZXZhX2l2YSxcclxuXHRcdFx0XHRcdFx0aFJlczogdi5WQV9ob3Jpem9udGFsUmVzb2x1dGlvbixcclxuXHRcdFx0XHRcdFx0dlJlczogdi5WQV92ZXJ0aWNhbFJlc29sdXRpb24sXHJcblx0XHRcdFx0XHRcdG1pbl9zaXplOiB2LlZBX21pbl9vYmpfc2l6ZVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGRlbGV0ZSB2LlZBX2V2YV9pdmE7XHJcblx0XHRcdFx0XHRkZWxldGUgdi5WQV9ob3Jpem9udGFsUmVzb2x1dGlvbjtcclxuXHRcdFx0XHRcdGRlbGV0ZSB2LlZBX3ZlcnRpY2FsUmVzb2x1dGlvbjtcclxuXHRcdFx0XHRcdGRlbGV0ZSB2LlZBX21pbl9vYmpfc2l6ZTtcclxuXHRcdFx0XHRcdGFwcC5jYW1lcmFBZHZhbmNlZExpc3Rbdi5jbmFtZV0gPSBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W3YuY25hbWVdIHx8IHt9O1xyXG5cdFx0XHRcdFx0YXBwLmNhbWVyYUFkdmFuY2VkTGlzdFt2LmNuYW1lXVt2LmNtb2RlbF0gPSBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W3YuY25hbWVdW3YuY21vZGVsXSB8fCB7fTtcclxuXHRcdFx0XHRcdGFwcC5jYW1lcmFBZHZhbmNlZExpc3Rbdi5jbmFtZV1bdi5jbW9kZWxdW3YuSG9yaXpvbnRhbFJlc29sdXRpb24gKyAneCcgKyB2LlZlcnRpY2FsUmVzb2x1dGlvbl0gPSBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W3YuY25hbWVdW3YuY21vZGVsXVt2Lkhvcml6b250YWxSZXNvbHV0aW9uICsgJ3gnICsgdi5WZXJ0aWNhbFJlc29sdXRpb25dIHx8IHt9O1xyXG5cdFx0XHRcdFx0aWYgKGFwcC5jYW1lcmFBZHZhbmNlZExpc3Rbdi5jbmFtZV1bdi5jbW9kZWxdW3YuSG9yaXpvbnRhbFJlc29sdXRpb24gKyAneCcgKyB2LlZlcnRpY2FsUmVzb2x1dGlvbl1bdi5sZW5zXSkge1xyXG5cdFx0XHRcdFx0XHRpZiAodmlkZW9fYW5hbHl0aWNzKSB7IGFwcC5jYW1lcmFBZHZhbmNlZExpc3Rbdi5jbmFtZV1bdi5jbW9kZWxdW3YuSG9yaXpvbnRhbFJlc29sdXRpb24gKyAneCcgKyB2LlZlcnRpY2FsUmVzb2x1dGlvbl1bdi5sZW5zXS5WQS5wdXNoKHZpZGVvX2FuYWx5dGljcyk7IH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGFwcC5jYW1lcmFBZHZhbmNlZExpc3Rbdi5jbmFtZV1bdi5jbW9kZWxdW3YuSG9yaXpvbnRhbFJlc29sdXRpb24gKyAneCcgKyB2LlZlcnRpY2FsUmVzb2x1dGlvbl1bdi5sZW5zXSA9IHY7XHJcblx0XHRcdFx0XHRcdHYuVkEgPSBbXTtcclxuXHRcdFx0XHRcdFx0aWYgKHZpZGVvX2FuYWx5dGljcykgeyB2LlZBLnB1c2godmlkZW9fYW5hbHl0aWNzKTsgfVxyXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHYuTWluRkMgPT09ICdzdHJpbmcnKSB7IHYuTWluRkMgPSBwYXJzZUZsb2F0KHYuTWluRkMucmVwbGFjZSgnLCcsICcuJykpOyB9XHJcblx0XHRcdFx0XHRcdGlmICh0eXBlb2Ygdi5NYXhGQyA9PT0gJ3N0cmluZycpIHsgdi5NYXhGQyA9IHBhcnNlRmxvYXQodi5NYXhGQy5yZXBsYWNlKCcsJywgJy4nKSk7IH1cclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdGFwcC5jdXJyZW50LmZhbWlseSA9IE9iamVjdC5rZXlzKGFwcC5jYW1lcmFBZHZhbmNlZExpc3QpWzBdO1xyXG5cdFx0XHRcdGFwcC5jdXJyZW50Lm1vZGVsID0gT2JqZWN0LmtleXMoYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldKVswXTtcclxuXHRcdFx0XHRhcHAuY3VycmVudC5yZXNvbHV0aW9uID0gT2JqZWN0LmtleXMoYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldW2FwcC5jdXJyZW50Lm1vZGVsXSlbMF07XHJcblx0XHRcdFx0YXBwLmN1cnJlbnQubGVucyA9IE9iamVjdC5rZXlzKGFwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XVthcHAuY3VycmVudC5tb2RlbF1bYXBwLmN1cnJlbnQucmVzb2x1dGlvbl0pWzBdO1xyXG5cdFx0XHRcdGFwcC5jdXJyZW50LnZhID0gYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldW2FwcC5jdXJyZW50Lm1vZGVsXVthcHAuY3VycmVudC5yZXNvbHV0aW9uXVthcHAuY3VycmVudC5sZW5zXS5WQVswXTtcclxuXHJcblx0XHRcdFx0dmFyIGhhc090aGVyc0FscmVhZHkgPSBmYWxzZTtcclxuXHRcdFx0XHRmdW5jdGlvbiBvdGhlckNhbWVyYXModikge1xyXG5cdFx0XHRcdFx0aWYgKGhhc090aGVyc0FscmVhZHkpIHsgY29uc29sZS53YXJuKCdEYXRhIGNvbnRhaW5zIDIgT3RoZXIgQ2FtZXJhcyEnKTsgcmV0dXJuOyB9XHJcblx0XHRcdFx0XHRhcHAuY2FtZXJhQWR2YW5jZWRMaXN0WydPdGhlcnMnXSA9IHY7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRzZXRVcCgpO1xyXG5cdFx0XHR9KS5lcnJvcihmdW5jdGlvbiAoKSB7IGFsZXJ0KGFwcC5sbCgndW5hdmFpbGFibGVXYXJuaW5nJykpOyB9KTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBzZXRVcCgpIHtcclxuXHRcdFx0YXBwLmN1cnJlbnQudG9vbCA9IEFQUF9OQU1FO1xyXG5cdFx0XHRhcHAuY3VycmVudC52aWV3ID0gXCJkb3JpXCI7XHJcblxyXG5cdFx0XHQkZG9tID0gJCgnPGRpdiBjbGFzcz1cInJvdyBtYWluXCIgLz4nKTtcclxuXHRcdFx0JCgnbWFpbicpLmFwcGVuZCgkZG9tKTtcclxuXHJcblx0XHRcdGZpcnN0VGFiID0gdHJ1ZTtcclxuXHRcdFx0dmFyICR0YWJzQ29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cInRhYnNDb250YWluZXIgbW9kZVRhYnNXcmFwXCIvPicpLmFwcGVuZFRvKCRkb20pO1xyXG5cdFx0XHQkdGFicyA9ICQoJzx1bCBjbGFzcz1cIm1vZGVUYWJzIHRhYnNcIiBkYXRhLXRhYnMgaWQ9XCJtb2RlVGFiXCIvPicpLmFwcGVuZFRvKCR0YWJzQ29udGFpbmVyKTtcclxuXHRcdFx0JHRhYnNDb250ZW50ID0gJCgnPGRpdiBjbGFzcz1cInRhYnMtY29udGVudCBzbWFsbC0xMiBtZWRpdW0tMTIgbGFyZ2UtMTIgY29sdW1uc1wiIGRhdGEtdGFicy1jb250ZW50PVwibW9kZVRhYlwiLz4nKS5hcHBlbmRUbygkZG9tKTtcclxuXHJcblx0XHRcdGFwcC5hZGRUYWIoJ2V4cGVydG1vZGUnLCBhcHAubGwoJ21vZGVFeHBlcnQnKSk7XHJcblx0XHRcdGFwcC5hZGRUYWIoJ2d1aWRlZG1vZGUnLCBcIlZpZGVvIFByb2R1Y3QgU2VsZWN0b3JcIik7XHJcblx0XHRcdGFwcC5hZGRUYWIoJ3NldHRpbmdzbW9kZScsIGFwcC5sbCgnbW9kZVNldHRpbmdzJykpO1xyXG5cclxuXHRcdFx0bmV3IEZvdW5kYXRpb24uVGFicygkdGFicyk7XHJcblxyXG5cdFx0XHRleHBlcnRUYWIgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMvZXhwZXJ0bW9kZS5qcycpKGFwcCk7XHJcblx0XHRcdGd1aWRlZFRhYiA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9ndWlkZWRtb2RlLmpzJykoYXBwKTtcclxuXHRcdFx0c2V0dGluZ3NUYWIgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMvc2V0dGluZ3Ntb2RlLmpzJykoYXBwKTtcclxuXHJcblx0XHRcdCQoJyNzZXR0aW5nc21vZGUtbGFiZWwnKS5wYXJlbnQoKS5hZGRDbGFzcygnaW5hY3RpdmUnKTtcclxuXHJcblx0XHRcdHZhciB0YWJzTW92ZUV2ZW50O1xyXG5cdFx0XHR2YXIgcG9zc2libGVUYXJnZXQ7XHJcblx0XHRcdHZhciBsYXN0UG9zaXRpb25YO1xyXG5cdFx0XHR2YXIgdG91Y2hTdGFydFRpbWU7XHJcblx0XHRcdHZhciBlbGVtZW50VHJhbnNmb3JtID0gMDtcclxuXHRcdFx0Y29uc3QgVElNRV9GT1JfTElOS19DTElDSyA9IDMwMDtcclxuXHRcdFx0JGRvbS5vbignbW91c2Vkb3duIHRvdWNoc3RhcnQnLCAnLnRhYnNDb250YWluZXInLCBmdW5jdGlvbiBJbnB1dERvd24oZSkge1xyXG5cdFx0XHRcdGlmIChlLnRhcmdldC5ub2RlTmFtZSA9PSAnQScpIHsgcG9zc2libGVUYXJnZXQgPSBlLnRhcmdldDsgfVxyXG5cdFx0XHRcdHRvdWNoU3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblx0XHRcdFx0dGFic01vdmVFdmVudCA9ICQod2luZG93KS5vbignbW91c2Vtb3ZlIHRvdWNobW92ZScsIGZ1bmN0aW9uIElucHV0TW92ZShlKSB7XHJcblx0XHRcdFx0XHRpZiAobmV3IERhdGUoKS5nZXRUaW1lKCkgPCBUSU1FX0ZPUl9MSU5LX0NMSUNLKSB7IHJldHVybjsgfVxyXG5cdFx0XHRcdFx0aWYgKGUudHlwZSA9PT0gJ3RvdWNobW92ZScpIHtcclxuXHRcdFx0XHRcdFx0aWYgKCFsYXN0UG9zaXRpb25YKSB7XHJcblx0XHRcdFx0XHRcdFx0bGFzdFBvc2l0aW9uWCA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdG1vdmVUYWIoLWxhc3RQb3NpdGlvblggKyBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRYKTtcclxuXHRcdFx0XHRcdFx0bGFzdFBvc2l0aW9uWCA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChlLnR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XHJcblx0XHRcdFx0XHRcdGlmICghbGFzdFBvc2l0aW9uWCkge1xyXG5cdFx0XHRcdFx0XHRcdGxhc3RQb3NpdGlvblggPSBlLmNsaWVudFg7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdG1vdmVUYWIoLWxhc3RQb3NpdGlvblggKyBlLmNsaWVudFgpO1xyXG5cdFx0XHRcdFx0XHRsYXN0UG9zaXRpb25YID0gZS5jbGllbnRYO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdCRkb20ub24oJ21vdXNldXAgdG91Y2hlbmQnLCBmdW5jdGlvbiBJbnB1dEVuZCgpIHtcclxuXHRcdFx0XHRsYXN0UG9zaXRpb25YID0gbnVsbDtcclxuXHRcdFx0XHRpZiAodGFic01vdmVFdmVudCkgeyB0YWJzTW92ZUV2ZW50Lm9mZigpOyB9XHJcblx0XHRcdFx0aWYgKCF0b3VjaFN0YXJ0VGltZSkgeyByZXR1cm47IH1cclxuXHJcblx0XHRcdFx0aWYgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdG91Y2hTdGFydFRpbWUgPCBUSU1FX0ZPUl9MSU5LX0NMSUNLKSB7XHJcblx0XHRcdFx0XHQkKHBvc3NpYmxlVGFyZ2V0KS5jbGljaygpO1xyXG5cdFx0XHRcdFx0dG91Y2hTdGFydFRpbWUgPSBudWxsO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRsYXN0UG9zaXRpb25YID0gbnVsbDtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0JCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7IG1vdmVUYWIoMCk7IH0pO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gY2FsY01heExlZnRTaGlmdCgpIHtcclxuXHRcdFx0XHR2YXIgdGFiQ29udFdpZHRoID0gJHRhYnNDb250YWluZXIud2lkdGgoKTtcclxuXHRcdFx0XHR2YXIgdGFic1dpZHRoID0gMzA7XHJcblx0XHRcdFx0JHRhYnMuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdHRhYnNXaWR0aCArPSAkKHRoaXMpLndpZHRoKCkgKyAzMDtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHR2YXIgbGVmdFNoaWZ0ID0gdGFic1dpZHRoIC0gdGFiQ29udFdpZHRoO1xyXG5cdFx0XHRcdHJldHVybiBsZWZ0U2hpZnQgPCAwID8gMCA6IGxlZnRTaGlmdDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gbW92ZVRhYihkZWx0YVgpIHtcclxuXHRcdFx0XHRlbGVtZW50VHJhbnNmb3JtICs9IGRlbHRhWDtcclxuXHRcdFx0XHRpZiAoZWxlbWVudFRyYW5zZm9ybSA+IDApIHsgZWxlbWVudFRyYW5zZm9ybSA9IDA7IH1cclxuXHRcdFx0XHR2YXIgbWF4U2hpZnQgPSBjYWxjTWF4TGVmdFNoaWZ0KCk7XHJcblx0XHRcdFx0aWYgKGVsZW1lbnRUcmFuc2Zvcm0gPCAtbWF4U2hpZnQpIHsgZWxlbWVudFRyYW5zZm9ybSA9IC1tYXhTaGlmdDsgfVxyXG5cdFx0XHRcdCR0YWJzLmNzcygndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgZWxlbWVudFRyYW5zZm9ybSArICdweCwgMCknKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0JCgnLmZ1bmN0aW9uVW5pdCcpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0JChcIi5mdW5jdGlvblVuaXRDb250XCIpLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBzd2l0Y2ggKGxhbmcpIHtcclxuXHRcdFx0Ly8gXHRjYXNlIFwiZW5cIjogJCgnLmZ1bmN0aW9uTGFuZ3VhZ2UnKS50ZXh0KFwiRW5nbGlzaFwiKTsgYnJlYWs7XHJcblx0XHRcdC8vIFx0Y2FzZSBcImRlXCI6ICQoJy5mdW5jdGlvbkxhbmd1YWdlJykudGV4dChcIkRldXRzY2hcIik7IGJyZWFrO1xyXG5cdFx0XHQvLyBcdGNhc2UgXCJlc1wiOiAkKCcuZnVuY3Rpb25MYW5ndWFnZScpLnRleHQoXCJFc3Bhw7FvbFwiKTsgYnJlYWs7XHJcblx0XHRcdC8vIFx0Y2FzZSBcImZyXCI6ICQoJy5mdW5jdGlvbkxhbmd1YWdlJykudGV4dChcIkZyYW7Dp2Fpc1wiKTsgYnJlYWs7XHJcblx0XHRcdC8vIFx0Y2FzZSBcIml0XCI6ICQoJy5mdW5jdGlvbkxhbmd1YWdlJykudGV4dChcIkl0YWxpYW5vXCIpOyBicmVhaztcclxuXHRcdFx0Ly8gXHRjYXNlIFwicHQtYnJcIjogJCgnLmZ1bmN0aW9uTGFuZ3VhZ2UnKS50ZXh0KFwiUG9ydHVndcOqc1wiKTsgYnJlYWs7XHJcblx0XHRcdC8vIH1cclxuXHJcblx0XHRcdCQoJy5mdW5jdGlvbkxhbmd1YWdlJykub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHQkKFwiLmZ1bmN0aW9uTGFuZ3VhZ2VDb250XCIpLnRvZ2dsZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQkKHdpbmRvdykub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGlmICgkKGUudGFyZ2V0KS5oYXNDbGFzcyhcImZ1bmN0aW9uVW5pdENvbnRcIikgfHwgJChlLnRhcmdldCkuaGFzQ2xhc3MoXCJmdW5jdGlvblVuaXRcIikpIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0JChcIi5mdW5jdGlvblVuaXRDb250XCIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQkKHdpbmRvdykub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGlmICgkKGUudGFyZ2V0KS5oYXNDbGFzcyhcImZ1bmN0aW9uTGFuZ3VhZ2VDb250XCIpIHx8ICQoZS50YXJnZXQpLmhhc0NsYXNzKFwiZnVuY3Rpb25MYW5ndWFnZVwiKSkgeyByZXR1cm47IH1cclxuXHRcdFx0XHQkKFwiLmZ1bmN0aW9uTGFuZ3VhZ2VDb250XCIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQkKCcuZnVuY3Rpb25Vbml0Q29udCA+IGEnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0aWYgKCQodGhpcykuaGFzQ2xhc3MoXCJhY3RpdmVcIikpIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0JCgnLmZ1bmN0aW9uVW5pdENvbnQgPiBhJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdGlmICgkKHRoaXMpLmhhc0NsYXNzKFwiZnVuY3Rpb25Vbml0TWV0ZXJcIikpIHtcclxuXHRcdFx0XHRcdGFwcC5jdXJyZW50LnVuaXQgPSAnbWV0ZXInO1xyXG5cdFx0XHRcdFx0JChcIi5mdW5jdGlvblVuaXRcIikudGV4dChGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCgnbWVkaXVtJykgPyBhcHAubGwoJ3VuaXRzTWV0ZXInKSA6IGFwcC5sbCgndW5pdHNNZXRlck1vYmlsZScpKTtcclxuXHRcdFx0XHRcdCQoJy5mdW5jdGlvblVuaXRDb250ID4gYS5mdW5jdGlvblVuaXRNZXRlcicpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHRcdGFwcC5lbWl0KCd1bml0Q2hhbmdlJywgeyAnb2xkJzogJ2ZlZXQnLCAnbmV3JzogJ21ldGVyJyB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKCQodGhpcykuaGFzQ2xhc3MoXCJmdW5jdGlvblVuaXRGZWV0XCIpKSB7XHJcblx0XHRcdFx0XHRhcHAuY3VycmVudC51bml0ID0gJ2ZlZXQnO1xyXG5cdFx0XHRcdFx0JChcIi5mdW5jdGlvblVuaXRcIikudGV4dChGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCgnbWVkaXVtJykgPyBhcHAubGwoJ3VuaXRzRmVldCcpIDogYXBwLmxsKCd1bml0c0ZlZXRNb2JpbGUnKSk7XHJcblx0XHRcdFx0XHQkKCcuZnVuY3Rpb25Vbml0Q29udCA+IGEuZnVuY3Rpb25Vbml0RmVldCcpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHRcdGFwcC5lbWl0KCd1bml0Q2hhbmdlJywgeyAnb2xkJzogJ21ldGVyJywgJ25ldyc6ICdmZWV0JyB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gTW9iaWxlXHJcblxyXG5cdFx0XHQkKHdpbmRvdykub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGlmICgkKGUudGFyZ2V0KS5oYXNDbGFzcyhcImZ1bmN0aW9uVW5pdENvbnRNb2JpbGVcIikgfHwgJChlLnRhcmdldCkuaGFzQ2xhc3MoXCJmdW5jdGlvblVuaXRNb2JpbGVcIikpIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0JChcIi5mdW5jdGlvblVuaXRDb250TW9iaWxlXCIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQkKCcuZnVuY3Rpb25Vbml0Q29udE1vYmlsZSA+IGxpIGEnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0aWYgKCQodGhpcykuaGFzQ2xhc3MoXCJhY3RpdmVcIikpIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0JCgnLmZ1bmN0aW9uVW5pdENvbnRNb2JpbGUgPiBsaSBhJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdGlmICgkKHRoaXMpLmhhc0NsYXNzKFwiZnVuY3Rpb25Vbml0TWV0ZXJNb2JpbGVcIikpIHtcclxuXHRcdFx0XHRcdGFwcC5jdXJyZW50LnVuaXQgPSAnbWV0ZXInO1xyXG5cdFx0XHRcdFx0JChcIi5mdW5jdGlvblVuaXRNb2JpbGVcIikudGV4dChGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCgnbWVkaXVtJykgPyBhcHAubGwoJ3VuaXRzTWV0ZXJNb2JpbGUnKSA6IGFwcC5sbCgndW5pdHNNZXRlck1vYmlsZScpKTtcclxuXHRcdFx0XHRcdCQoJy5mdW5jdGlvblVuaXRDb250TW9iaWxlID4gbGkgYS5mdW5jdGlvblVuaXRNZXRlck1vYmlsZScpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHRcdGFwcC5lbWl0KCd1bml0Q2hhbmdlJywgeyAnb2xkJzogJ2ZlZXQnLCAnbmV3JzogJ21ldGVyJyB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKCQodGhpcykuaGFzQ2xhc3MoXCJmdW5jdGlvblVuaXRGZWV0TW9iaWxlXCIpKSB7XHJcblx0XHRcdFx0XHRhcHAuY3VycmVudC51bml0ID0gJ2ZlZXQnO1xyXG5cdFx0XHRcdFx0JChcIi5mdW5jdGlvblVuaXRNb2JpbGVcIikudGV4dChGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCgnbWVkaXVtJykgPyBhcHAubGwoJ3VuaXRzRmVldE1vYmlsZScpIDogYXBwLmxsKCd1bml0c0ZlZXRNb2JpbGUnKSk7XHJcblx0XHRcdFx0XHQkKCcuZnVuY3Rpb25Vbml0Q29udE1vYmlsZSA+IGxpIGEuZnVuY3Rpb25Vbml0RmVldE1vYmlsZScpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHRcdGFwcC5lbWl0KCd1bml0Q2hhbmdlJywgeyAnb2xkJzogJ21ldGVyJywgJ25ldyc6ICdmZWV0JyB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0JCh3aW5kb3cpLm9uKCdjaGFuZ2VkLnpmLm1lZGlhcXVlcnknLCBzZXRVbml0VGV4dCk7XHJcblx0XHRcdGZ1bmN0aW9uIHNldFVuaXRUZXh0KCkge1xyXG5cdFx0XHRcdGlmIChGb3VuZGF0aW9uLk1lZGlhUXVlcnkuaXMoJ3NtYWxsJykpIHtcclxuXHRcdFx0XHRcdCQoXCIuZnVuY3Rpb25Vbml0XCIpLmh0bWwoJzxzcGFuIGNsYXNzPVwiTEMtaWNvbiBpY29uLXJ1bGVyLWJlZm9yZVwiPjwvc3Bhbj4nICsgKGFwcC5jdXJyZW50LnVuaXQgPT0gXCJtZXRlclwiID8gYXBwLmxsKCd1bml0c01ldGVyTW9iaWxlJykgOiBhcHAubGwoJ3VuaXRzRmVldE1vYmlsZScpKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChGb3VuZGF0aW9uLk1lZGlhUXVlcnkuYXRMZWFzdCgnbWVkaXVtJykpIHtcclxuXHRcdFx0XHRcdCQoXCIuZnVuY3Rpb25Vbml0XCIpLmh0bWwoJzxzcGFuIGNsYXNzPVwiTEMtaWNvbiBpY29uLXJ1bGVyLWJlZm9yZVwiPjwvc3Bhbj4nICsgKGFwcC5jdXJyZW50LnVuaXQgPT0gXCJtZXRlclwiID8gYXBwLmxsKCd1bml0c01ldGVyTW9iaWxlJykgOiBhcHAubGwoJ3VuaXRzRmVldE1vYmlsZScpKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHNldFVuaXRUZXh0KCk7XHJcblxyXG5cdFx0XHQkKCdib2R5Jykub24oJ2NsaWNrJywgJy5mdW5jdGlvbkxvYWQnLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0JCgnI2ZpbGVJbnB1dCcpLnJlbW92ZSgpO1xyXG5cdFx0XHRcdCQoJ2JvZHknKS5hcHBlbmQoJzxpbnB1dCBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiBpZD1cImZpbGVJbnB1dFwiIHR5cGU9XCJmaWxlXCIvPicpO1xyXG5cdFx0XHRcdCQoJyNmaWxlSW5wdXQnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdHZhciBhY2NlcHQgPSB7XHJcblx0XHRcdFx0XHRcdHRleHQ6IFtcInRleHQvcGxhaW5cIiwgXCJ0ZXh0L2pzb25cIl1cclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR2YXIgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xyXG5cdFx0XHRcdFx0aWYgKGFjY2VwdC50ZXh0LmluZGV4T2YoZmlsZS50eXBlKSA8IC0xKSB7IGFsZXJ0KEVSUk9SX1dST05HX0ZPUk1BVCk7IH1cclxuXHJcblx0XHRcdFx0XHR2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHRcdFx0XHRcdHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHRcdHZhciB0ZXh0ID0gcmVhZGVyLnJlc3VsdDtcclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh0ZXh0KTtcclxuXHRcdFx0XHRcdFx0XHRpZiAocmVzdWx0LnRvb2wgIT09IEFQUF9OQU1FKSB7IHRocm93IG5ldyBFcnJvcigpOyB9XHJcblx0XHRcdFx0XHRcdFx0YXBwLmN1cnJlbnQgPSByZXN1bHQ7XHJcblx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgeCBpbiBhcHAuY3VycmVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFwcC5jdXJyZW50LnVuaXQgPT09ICdmZWV0Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoWyd0T1dpZHRoJywgJ3RPSGVpZ2h0JywgJ2NhbWVyYUhlaWdodCddLmluZGV4T2YoeCkgPj0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFwcC5jdXJyZW50W3hdID0gYXBwLm1hdGguZnJvbUZlZXQoYXBwLmN1cnJlbnRbeF0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGFwcC5lbWl0KCdjYW1lcmFDaGFuZ2UnKTtcclxuXHRcdFx0XHRcdFx0XHRhbGVydChGSUxFX0xPQURfU1VDQ0VTUyk7XHJcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coZXJyb3IpO1xyXG5cdFx0XHRcdFx0XHRcdGFsZXJ0KEVSUk9SX1dST05HX0ZPUk1BVCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRyZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHQkKCcjZmlsZUlucHV0JykuY2xpY2soKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR3aW5kb3cuYXBwU2F2ZSA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHR2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuXHJcblx0XHRcdFx0dmFyIGRlZXBDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhcHAuY3VycmVudCkpO1xyXG5cclxuXHRcdFx0XHRmb3IgKHZhciB4IGluIGRlZXBDb3B5KSB7XHJcblx0XHRcdFx0XHRpZiAoYXBwLmN1cnJlbnQudW5pdCA9PT0gJ2ZlZXQnKSB7XHJcblx0XHRcdFx0XHRcdGlmIChbJ3RPV2lkdGgnLCAndE9IZWlnaHQnLCAnY2FtZXJhSGVpZ2h0J10uaW5kZXhPZih4KSA+PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0ZGVlcENvcHlbeF0gPSBhcHAubWF0aC50b0ZlZXQoZGVlcENvcHlbeF0pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAodHlwZW9mIGRlZXBDb3B5W3hdLnRvRml4ZWQgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdFx0XHRcdFx0ZGVlcENvcHlbeF0gPSBkZWVwQ29weVt4XS50b0ZpeGVkKDIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XHJcblx0XHRcdFx0XHRuYXZpZ2F0b3IubXNTYXZlQmxvYihuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGVlcENvcHksIG51bGwsIFwiXFx0XCIpXSksICdCb3NjaExlbnNDYWxjdWxhdG9yX0NvbmZpZy50eHQnKTtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnZGF0YTp0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShkZWVwQ29weSwgbnVsbCwgXCJcXHRcIikpKTtcclxuXHRcdFx0XHRlbGVtZW50LnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBcIkJvc2NoTGVuc0NhbGN1bGF0b3JfQ29uZmlnLnR4dFwiKTtcclxuXHJcblx0XHRcdFx0ZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XHJcblxyXG5cdFx0XHRcdGVsZW1lbnQuY2xpY2soKTtcclxuXHRcdFx0XHRkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQkKCcjZ3VpZGVkbW9kZS1sYWJlbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0d2luZG93Lm9wZW4oJ2h0dHBzOi8vd3d3LnZpZGVvc2VsZWN0b3IuYm9zY2hzZWN1cml0eS5jb20vaW5kZXgucGhwP3A9aXBjYW1lcmFzJywgJ19ibGFuaycpO1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0JCgnI2V4cGVydG1vZGUtbGFiZWwnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyAkKCcuc2V0dGluZ3Mtc3RpY2t5LXdyYXAnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOyB9KTtcclxuXHRcdFx0JCgnI2d1aWRlZG1vZGUtbGFiZWwnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkgeyAkKCcuc2V0dGluZ3Mtc3RpY2t5LXdyYXAnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOyB9KTtcclxuXHRcdFx0JCgnI3NldHRpbmdzbW9kZS1sYWJlbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7ICQoJy5zZXR0aW5ncy1zdGlja3ktd3JhcCcpLmNzcygnZGlzcGxheScsICdibG9jaycpOyB9KTtcclxuXHJcblxyXG5cdFx0XHQkKCcuc2V0dGluZ3Mtc3RpY2t5LXRpdGxlLnZhLW1vZGUnKS5vbignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdFx0JCgnLnNldHRpbmdzLXN0aWNreS10aXRsZS52YS1tb2RlJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdCQoJy5zZXR0aW5ncy1zdGlja3ktdGl0bGUuZG9yaScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHQkKCcuc2V0dGluZ3Mtc3RpY2t5LXRpdGxlLmlyJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdCQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC52YS1tb2RlJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdCQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC5kb3JpJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdCQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC5pcicpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQkKCcuc2V0dGluZ3Mtc3RpY2t5LXRpdGxlLmRvcmknKS5vbignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdFx0JCgnLnNldHRpbmdzLXN0aWNreS10aXRsZS52YS1tb2RlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdCQoJy5zZXR0aW5ncy1zdGlja3ktdGl0bGUuZG9yaScpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHQkKCcuc2V0dGluZ3Mtc3RpY2t5LXRpdGxlLmlyJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdCQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC52YS1tb2RlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdCQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC5kb3JpJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG5cdFx0XHRcdCQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC5pcicpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQkKCcuc2V0dGluZ3Mtc3RpY2t5LXRpdGxlLmlyJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHRcdCQoJy5zZXR0aW5ncy1zdGlja3ktdGl0bGUudmEtbW9kZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHQkKCcuc2V0dGluZ3Mtc3RpY2t5LXRpdGxlLmRvcmknKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdFx0JCgnLnNldHRpbmdzLXN0aWNreS10aXRsZS5pcicpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHQkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQudmEtbW9kZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHQkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQuZG9yaScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuXHRcdFx0XHQkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQuaXInKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0YXBwLm9uKCdjYW1lcmFDaGFuZ2UnLCAoKSA9PiB7XHJcblx0XHRcdFx0JCgnLnNldHRpbmdzLXN0aWNreS10aXRsZS52YS1tb2RlJykudHJpZ2dlcignY2xpY2snKTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRzdGFydCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIHN0YXJ0KCkge1xyXG5cdFx0XHQvLyBleHBlcnRUYWIuc2hvdygpO1xyXG5cclxuXHRcdH1cclxuXHRcdGxvYWRFeHRlcm5hbERlcGVuZGVuY2llcygpO1xyXG5cdH1cclxufSkoalF1ZXJ5KTtcclxuXHJcbihmdW5jdGlvbiAoJCkge1xyXG5cdGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoICE9IFwiP3Rlc3QxXCIpIHsgcmV0dXJuOyB9XHJcblx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHQvLyAkKCcuY2FtZXJhRmFtaWx5JylcclxuXHRcdCQoJy5wcm9jZWVkQnV0dG9uJykuY2xpY2soKTtcclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHQkKCcuY2FsY3VsYXRlQnV0dG9uJykuY2xpY2soKTtcclxuXHRcdFx0JCgnLmJ1dHRvbkZPVlZpZGVvQW5hbHl0aWNzJykuY2xpY2soKTtcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0JChcIi52aXN1YWxPdXRwdXRSb3dcIikuZ2V0KDApLnNjcm9sbEludG9WaWV3KCk7XHJcblx0XHRcdH0sIDMwMCk7XHJcblx0XHR9LCAzMDApO1xyXG5cdH0sIDMwMCk7XHJcbn0pKGpRdWVyeSk7XHJcblxyXG4oZnVuY3Rpb24gKCQpIHtcclxuXHRpZiAod2luZG93LmxvY2F0aW9uLnNlYXJjaCAhPSBcIj90ZXN0MlwiKSB7IHJldHVybjsgfVxyXG5cdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0JCgnLmNhbWVyYUZhbWlseScpLnZhbChcIkZMRVhJRE9NRSBJUCBwYW5vcmFtaWMgNzAwMCBJQyAzNjBcIik7XHJcblx0XHQkKCcuY2FtZXJhRmFtaWx5JylbMF0uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScpKTtcclxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHQkKCcucHJvY2VlZEJ1dHRvbicpLmNsaWNrKCk7XHJcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdCQoJy5jYWxjdWxhdGVCdXR0b24nKS5jbGljaygpO1xyXG5cdFx0XHRcdCQoJy5idXR0b25GT1ZWaWRlb0FuYWx5dGljcycpLmNsaWNrKCk7XHJcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0XHQkKFwiLnZpc3VhbE91dHB1dFJvd1wiKS5nZXQoMCkuc2Nyb2xsSW50b1ZpZXcoKTtcclxuXHRcdFx0XHR9LCAzMDApO1xyXG5cdFx0XHR9LCAzMDApO1xyXG5cdFx0fSwgMzAwKTtcclxuXHR9LCAzMDApO1xyXG59KShqUXVlcnkpO1xyXG5cclxuKGZ1bmN0aW9uICgkKSB7XHJcblx0aWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggIT0gXCI/dGVzdDNcIikgeyByZXR1cm47IH1cclxuXHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdCQoJy5jYW1lcmFGYW1pbHknKS52YWwoXCJGTEVYSURPTUUgSVAgcGFub3JhbWljIDcwMDAgSUMgMzYwXCIpO1xyXG5cdFx0JCgnLmNhbWVyYUZhbWlseScpWzBdLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnKSk7XHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0JCgnLnByb2NlZWRCdXR0b24nKS5jbGljaygpO1xyXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHQkKCcubWVudUZpZWxkTW91bnRQb3MnKS52YWwoXCJXYWxsXCIpO1xyXG5cdFx0XHRcdCQoJy5tZW51RmllbGRNb3VudFBvcycpWzBdLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnKSk7XHJcblx0XHRcdFx0JCgnLmNhbGN1bGF0ZUJ1dHRvbicpLmNsaWNrKCk7XHJcblx0XHRcdFx0JCgnLmJ1dHRvbkZPVlZpZGVvQW5hbHl0aWNzJykuY2xpY2soKTtcclxuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRcdCQoXCIjdmlldy1zaWRlLXBhbmVsXCIpLmdldCgwKS5zY3JvbGxJbnRvVmlldygpO1xyXG5cdFx0XHRcdH0sIDMwMCk7XHJcblx0XHRcdH0sIDMwMCk7XHJcblx0XHR9LCAzMDApO1xyXG5cdH0sIDMwMCk7XHJcbn0pKGpRdWVyeSk7XHJcblxyXG53aW5kb3cuc2VsZWN0MmN1c3RvbW1hdGNoZXIgPSBmdW5jdGlvbiBtb2RlbE1hdGNoZXIocGFyYW1zLCBkYXRhKSB7XHJcblx0aWYgKCQudHJpbShwYXJhbXMudGVybSkgPT09ICcnKSB7XHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHR9XHJcblxyXG5cdHZhciBvcmlnaW5hbCA9IGRhdGEudGV4dC50b1VwcGVyQ2FzZSgpO1xyXG5cdHZhciB0ZXJtID0gcGFyYW1zLnRlcm0udG9VcHBlckNhc2UoKTtcclxuXHRpZiAob3JpZ2luYWwuaW5kZXhPZih0ZXJtKSA+IC0xKSB7XHJcblx0XHRyZXR1cm4gZGF0YTtcclxuXHR9XHJcblxyXG5cdGxldCB0ZXJtcyA9IHRlcm0uc3BsaXQoXCIgXCIpO1xyXG5cdGxldCBtYXRjaGVzID0gMDtcclxuXHJcblx0dGVybXMuZm9yRWFjaChzcGxpdFRlcm0gPT4ge1xyXG5cdFx0aWYgKG9yaWdpbmFsLmluZGV4T2Yoc3BsaXRUZXJtKSA+IC0xKSB7XHJcblx0XHRcdG1hdGNoZXMrKztcclxuXHRcdH1cclxuXHR9KTtcclxuXHRpZihtYXRjaGVzID09IHRlcm1zLmxlbmd0aCl7IHJldHVybiBkYXRhOyB9XHJcblxyXG5cdHJldHVybiBudWxsO1xyXG59IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXBwKSB7XHJcblx0dmFyIHRoYXQgPSB7fTtcclxuXHR2YXIgJGRvbSA9ICQoJyNleHBlcnRtb2RlJyk7XHJcblx0JGRvbS5odG1sKHRlbXBsYXRlKTtcclxuXHJcblx0JChcIi5jYW1lcmFGYW1pbHlcIikuc2VsZWN0Mih7XHJcblx0XHRzZWxlY3RPbkNsb3NlOiB0cnVlLFxyXG5cdFx0bWF0Y2hlcjogd2luZG93LnNlbGVjdDJjdXN0b21tYXRjaGVyXHJcblx0fSk7XHJcblx0JChcIi5jYW1lcmFNb2RlbFwiKS5zZWxlY3QyKHtcclxuXHRcdHNlbGVjdE9uQ2xvc2U6IHRydWUsXHJcblx0XHRtYXRjaGVyOiB3aW5kb3cuc2VsZWN0MmN1c3RvbW1hdGNoZXJcclxuXHR9KTtcclxuXHQkKFwiLmNhbWVyYVJlc29sdXRpb25cIikuc2VsZWN0Mih7XHJcblx0XHRzZWxlY3RPbkNsb3NlOiB0cnVlLFxyXG5cdFx0bWF0Y2hlcjogd2luZG93LnNlbGVjdDJjdXN0b21tYXRjaGVyXHJcblx0fSk7XHJcblxyXG5cclxuXHQkZG9tLmZpbmQoJy5ndWlkZWRNb2RlQnV0dG9uJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0JCgnI2d1aWRlZG1vZGUtbGFiZWwnKS5jbGljaygpO1xyXG5cdFx0JCh3aW5kb3cpLnNjcm9sbFRvcCgkKCcudGFicy1jb250ZW50Jykub2Zmc2V0KCkudG9wKTtcclxuXHR9KTtcclxuXHJcblx0dmFyICRmYW1pbHkgPSAkZG9tLmZpbmQoJ3NlbGVjdC5jYW1lcmFGYW1pbHknKTtcclxuXHR2YXIgJGN0eXBlID0gJGRvbS5maW5kKCdzZWxlY3QuY2FtZXJhVHlwZUZpbHRlcicpO1xyXG5cdHZhciAkZmlsdGVyID0gJGRvbS5maW5kKCdzZWxlY3QuY2FtZXJhRmlsdGVyJyk7XHJcblx0dmFyICRtb2RlbCA9ICRkb20uZmluZCgnc2VsZWN0LmNhbWVyYU1vZGVsJyk7XHJcblx0dmFyICRyZXNvbHV0aW9uID0gJGRvbS5maW5kKCdzZWxlY3QuY2FtZXJhUmVzb2x1dGlvbicpO1xyXG5cclxuXHRmdW5jdGlvbiByZW5kZXJEcm9wZG93bigpIHtcclxuXHRcdCRmYW1pbHkuaHRtbCgnJyk7XHJcblx0XHRmb3IgKHZhciBrZXkgaW4gYXBwLmNhbWVyYUFkdmFuY2VkTGlzdCkge1xyXG5cdFx0XHRsZXQgcmVuZGVyID0gdHJ1ZTtcclxuXHRcdFx0bGV0IGZhbWlseSA9IGFwcC5jYW1lcmFBZHZhbmNlZExpc3Rba2V5XTtcclxuXHRcdFx0bGV0IG1vZGVsID0gT2JqZWN0LnZhbHVlcyhmYW1pbHkpWzBdO1xyXG5cdFx0XHRsZXQgcmVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbClbMF07XHJcblx0XHRcdGxldCBsZW5zID0gT2JqZWN0LnZhbHVlcyhyZXMpWzBdO1xyXG5cdFx0XHRpZiAoYXBwLmN1cnJlbnQuZmlsdGVyKSB7XHJcblx0XHRcdFx0aWYgKCFsZW5zLlZBIHx8ICFsZW5zLlZBLmZpbmQodiA9PiB2LnR5cGUgPT0gYXBwLmN1cnJlbnQuZmlsdGVyKSkgeyByZW5kZXIgPSBmYWxzZTsgfVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChhcHAuY3VycmVudC5jdHlwZSkge1xyXG5cdFx0XHRcdGlmICghbGVucy5maWx0ZXJfY3R5cGUgfHwgIShsZW5zLmZpbHRlcl9jdHlwZSA9PSBhcHAuY3VycmVudC5jdHlwZSkpIHsgcmVuZGVyID0gZmFsc2U7IH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZihyZW5kZXIpeyAkZmFtaWx5LmFwcGVuZChgPG9wdGlvbiB2YWx1ZT0nJHtrZXl9Jz4ke2tleX08L29wdGlvbj5gKTsgfVxyXG5cdFx0fVxyXG5cdFx0JGZhbWlseS52YWwoYXBwLmN1cnJlbnQuZmFtaWx5KTtcclxuXHRcdGlmICgkZmFtaWx5LnZhbCgpID09PSBudWxsKSB7XHJcblx0XHRcdGxldCBmaXJzdF9mYW1pbHkgPSAkZmFtaWx5LmZpbmQoJ29wdGlvbicpLnZhbCgpO1xyXG5cdFx0XHQkZmFtaWx5LnZhbChmaXJzdF9mYW1pbHkpO1xyXG5cdFx0XHRhcHAuY3VycmVudC5mYW1pbHkgPSBmaXJzdF9mYW1pbHk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGFwcC5jdXJyZW50LmZhbWlseSA9PT0gJ090aGVycycpIHtcclxuXHRcdFx0JGRvbS5maW5kKCcuY2FtU3dpdGNoTW9kZWwnKS50ZXh0KGFwcC5sbCgnZXhwZXJ0TW9kZU90aGVyc1Jlc29sdXRpb24nKSk7XHJcblx0XHRcdCRkb20uZmluZCgnLmNhbVN3aXRjaFJlc29sdXRpb24nKS50ZXh0KGFwcC5sbCgnZXhwZXJ0TW9kZU90aGVyc1NlbnNvclNpemUnKSk7XHJcblxyXG5cdFx0XHQkbW9kZWwuaHRtbCgnJyk7XHJcblx0XHRcdGFwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XS5yZXNvbHV0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh2LCBpKSB7XHJcblx0XHRcdFx0aWYgKCFhcHAuY3VycmVudC5tb2RlbCkgeyBhcHAuY3VycmVudC5tb2RlbCA9IGk7IH1cclxuXHRcdFx0XHQkbW9kZWwuYXBwZW5kKGA8b3B0aW9uIHZhbHVlPScke2l9Jz4ke3YuaG9yUmVzfSB4ICR7di52ZXJSZXN9ICgke3YucmF0aW99KTwvb3B0aW9uPmApO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0JG1vZGVsLnZhbChhcHAuY3VycmVudC5tb2RlbCk7XHJcblxyXG5cdFx0XHQkcmVzb2x1dGlvbi5odG1sKCcnKTtcclxuXHRcdFx0YXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldLnNlbnNvci5mb3JFYWNoKGZ1bmN0aW9uICh2LCBpKSB7XHJcblx0XHRcdFx0aWYgKCFhcHAuY3VycmVudC5yZXNvbHV0aW9uKSB7IGFwcC5jdXJyZW50LnJlc29sdXRpb24gPSBpOyB9XHJcblx0XHRcdFx0JHJlc29sdXRpb24uYXBwZW5kKGA8b3B0aW9uIHZhbHVlPScke2l9Jz4ke3Yuc2l6ZX08L29wdGlvbj5gKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdCRyZXNvbHV0aW9uLnZhbChhcHAuY3VycmVudC5yZXNvbHV0aW9uKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdCRkb20uZmluZCgnLmNhbVN3aXRjaE1vZGVsJykudGV4dChhcHAubGwoJ2V4cGVydE1vZGVNb2RlbCcpKTtcclxuXHRcdCRkb20uZmluZCgnLmNhbVN3aXRjaFJlc29sdXRpb24nKS50ZXh0KGFwcC5sbCgnZXhwZXJ0TW9kZVJlc29sdXRpb24nKSk7XHJcblxyXG5cdFx0bGV0IHZhdHlwZXMgPSBbXTtcclxuXHRcdCRmaWx0ZXIuaHRtbCgnJylcclxuXHRcdGFwcC5jYW1lcmFzUmF3LmZvckVhY2goY2FtZXJhID0+IHtcclxuXHRcdFx0KGNhbWVyYS5WQSB8fCBbXSkuZm9yRWFjaCh2YSA9PiB7XHJcblx0XHRcdFx0aWYgKHZhdHlwZXMuaW5jbHVkZXModmEudHlwZSkpIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0dmF0eXBlcy5wdXNoKHZhLnR5cGUpO1xyXG5cdFx0XHR9KVxyXG5cdFx0fSk7XHJcblx0XHQkZmlsdGVyLmFwcGVuZChgPG9wdGlvbiB2YWx1ZT0nJz5TaG93IGFsbDwvb3B0aW9uPmApO1xyXG5cdFx0dmF0eXBlcy5mb3JFYWNoKHR5cGUgPT4ge1xyXG5cdFx0XHRsZXQgbGFiZWwgPSB0eXBlO1xyXG5cdFx0XHRpZiAodHlwZSA9PSBcIkVWQVwiKSB7IGxhYmVsID0gJ0Vzc2VudGlhbCBWaWRlbyBBbmFseXRpY3MnOyB9XHJcblx0XHRcdGlmICh0eXBlID09IFwiSVZBXCIpIHsgbGFiZWwgPSAnSW50ZWxsaWdlbnQgVmlkZW8gQW5hbHl0aWNzJzsgfVxyXG5cdFx0XHQkZmlsdGVyLmFwcGVuZChgPG9wdGlvbiB2YWx1ZT0nJHt0eXBlfSc+JHtsYWJlbH08L29wdGlvbj5gKTtcclxuXHRcdH0pO1xyXG5cdFx0JGZpbHRlci52YWwoYXBwLmN1cnJlbnQuZmlsdGVyKTtcclxuXHJcblx0XHRsZXQgY3R5cGVzID0gW107XHJcblx0XHQkY3R5cGUuaHRtbCgnJylcclxuXHRcdGFwcC5jYW1lcmFzUmF3LmZvckVhY2goY2FtZXJhID0+IHtcclxuXHRcdFx0aWYgKCFjYW1lcmEuZmlsdGVyX2N0eXBlIHx8IGN0eXBlcy5pbmNsdWRlcyhjYW1lcmEuZmlsdGVyX2N0eXBlKSkgeyByZXR1cm47IH1cclxuXHRcdFx0Y3R5cGVzLnB1c2goY2FtZXJhLmZpbHRlcl9jdHlwZSk7XHJcblx0XHR9KTtcclxuXHRcdCRjdHlwZS5hcHBlbmQoYDxvcHRpb24gdmFsdWU9Jyc+U2hvdyBhbGw8L29wdGlvbj5gKTtcclxuXHRcdGN0eXBlcyA9IGN0eXBlcy5zb3J0KChhLCBiKT0+eyByZXR1cm4gYSA+IGI7IH0pO1xyXG5cdFx0Y3R5cGVzLmZvckVhY2godHlwZSA9PiB7XHJcblx0XHRcdGxldCBsYWJlbCA9IHR5cGU7XHJcblx0XHRcdCRjdHlwZS5hcHBlbmQoYDxvcHRpb24gdmFsdWU9JyR7dHlwZX0nPiR7bGFiZWx9PC9vcHRpb24+YCk7XHJcblx0XHR9KTtcclxuXHRcdCRjdHlwZS52YWwoYXBwLmN1cnJlbnQuY3R5cGUpO1xyXG5cclxuXHRcdCRtb2RlbC5odG1sKCcnKTtcclxuXHRcdGZvciAodmFyIGtleSBpbiBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W2FwcC5jdXJyZW50LmZhbWlseV0pIHtcclxuXHRcdFx0aWYgKCFhcHAuY3VycmVudC5tb2RlbCkgeyBhcHAuY3VycmVudC5tb2RlbCA9IGtleTsgfVxyXG5cdFx0XHQkbW9kZWwuYXBwZW5kKGA8b3B0aW9uIHZhbHVlPScke2tleX0nPiR7a2V5fTwvb3B0aW9uPmApO1xyXG5cdFx0fVxyXG5cdFx0JG1vZGVsLnZhbChhcHAuY3VycmVudC5tb2RlbCk7XHJcblxyXG5cdFx0JHJlc29sdXRpb24uaHRtbCgnJyk7XHJcblx0XHRmb3IgKHZhciBrZXkgaW4gYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldW2FwcC5jdXJyZW50Lm1vZGVsXSkge1xyXG5cdFx0XHRpZiAoIWFwcC5jdXJyZW50LnJlc29sdXRpb24pIHsgYXBwLmN1cnJlbnQucmVzb2x1dGlvbiA9IGtleTsgfVxyXG5cdFx0XHR2YXIgaXNSb3RhdGVkID0gYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldW2FwcC5jdXJyZW50Lm1vZGVsXVtrZXldW09iamVjdC5rZXlzKGFwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XVthcHAuY3VycmVudC5tb2RlbF1ba2V5XSlbMF1dLlJvdGF0ZWQ7XHJcblx0XHRcdCRyZXNvbHV0aW9uLmFwcGVuZChgPG9wdGlvbiB2YWx1ZT0nJHtrZXl9Jz4ke2tleX0ke2lzUm90YXRlZCA/IFwiICg5MMKwIGltYWdlIHJvdGF0aW9uKVwiIDogXCJcIn08L29wdGlvbj5gKTtcclxuXHRcdH1cclxuXHRcdCRyZXNvbHV0aW9uLnZhbChhcHAuY3VycmVudC5yZXNvbHV0aW9uKTtcclxuXHR9XHJcblx0cmVuZGVyRHJvcGRvd24oKTtcclxuXHJcblxyXG5cdCRkb20uZmluZCgnc2VsZWN0LmNhbWVyYUZhbWlseScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0YXBwLmN1cnJlbnQuZmFtaWx5ID0gJCh0aGlzKS52YWwoKVxyXG5cdFx0YXBwLmN1cnJlbnQubW9kZWwgPSBudWxsO1xyXG5cdFx0YXBwLmN1cnJlbnQucmVzb2x1dGlvbiA9IG51bGw7XHJcblx0XHRhcHAuZW1pdCgnY2FtZXJhQ2hhbmdlJyk7XHJcblx0fSk7XHJcblxyXG5cdCRkb20uZmluZCgnc2VsZWN0LmNhbWVyYUZpbHRlcicpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0YXBwLmN1cnJlbnQuZmFtaWx5ID0gJGRvbS5maW5kKCdzZWxlY3QuY2FtZXJhRmFtaWx5JykudmFsKCk7XHJcblx0XHRhcHAuY3VycmVudC5maWx0ZXIgPSAkKHRoaXMpLnZhbCgpO1xyXG5cdFx0YXBwLmN1cnJlbnQubW9kZWwgPSBudWxsO1xyXG5cdFx0YXBwLmN1cnJlbnQucmVzb2x1dGlvbiA9IG51bGw7XHJcblx0XHRhcHAuZW1pdCgnY2FtZXJhQ2hhbmdlJyk7XHJcblx0fSk7XHJcblxyXG5cdCRkb20uZmluZCgnc2VsZWN0LmNhbWVyYVR5cGVGaWx0ZXInKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdGFwcC5jdXJyZW50LmZhbWlseSA9ICRkb20uZmluZCgnc2VsZWN0LmNhbWVyYUZhbWlseScpLnZhbCgpO1xyXG5cdFx0YXBwLmN1cnJlbnQuY3R5cGUgPSAkKHRoaXMpLnZhbCgpO1xyXG5cdFx0YXBwLmN1cnJlbnQubW9kZWwgPSBudWxsO1xyXG5cdFx0YXBwLmN1cnJlbnQucmVzb2x1dGlvbiA9IG51bGw7XHJcblx0XHRhcHAuZW1pdCgnY2FtZXJhQ2hhbmdlJyk7XHJcblx0fSk7XHJcblxyXG5cdCRkb20uZmluZCgnc2VsZWN0LmNhbWVyYU1vZGVsJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRhcHAuY3VycmVudC5tb2RlbCA9ICQodGhpcykudmFsKClcclxuXHRcdGFwcC5jdXJyZW50LnJlc29sdXRpb24gPSBudWxsO1xyXG5cdFx0YXBwLmVtaXQoJ2NhbWVyYUNoYW5nZScpO1xyXG5cdH0pO1xyXG5cclxuXHQkZG9tLmZpbmQoJ3NlbGVjdC5jYW1lcmFSZXNvbHV0aW9uJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRhcHAuY3VycmVudC5yZXNvbHV0aW9uID0gJCh0aGlzKS52YWwoKTtcclxuXHRcdGFwcC5lbWl0KCdjYW1lcmFDaGFuZ2UnKTtcclxuXHR9KTtcclxuXHJcblxyXG5cdCRkb20uZmluZCgnLnByb2NlZWRCdXR0b24nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0aWYgKCFhcHAuY3VycmVudC5mYW1pbHkgfHwgIWFwcC5jdXJyZW50Lm1vZGVsIHx8ICFhcHAuY3VycmVudC5yZXNvbHV0aW9uKSB7IHJldHVybjsgfVxyXG5cdFx0YXBwLmNhbWVyYVNlbGVjdGVkKCk7XHJcblx0XHRsZXQgc2VhcmNoID0gYXBwLmN1cnJlbnQuZmlsdGVyO1xyXG5cdFx0aWYgKHNlYXJjaCA9PSBcIkVWQVwiKSB7IHNlYXJjaCA9IFwiRXNzZW50aWFsIFZpZGVvIEFuYWx5dGljc1wiOyB9XHJcblx0XHRpZiAoc2VhcmNoID09IFwiSVZBXCIpIHsgc2VhcmNoID0gXCJJbnRlbGxpZ2VudCBWaWRlbyBBbmFseXRpY3NcIjsgfVxyXG5cdFx0bGV0IG9wdGlvbiA9ICQoJyNzZXR0aW5nc21vZGUgLnZhLW9wdGlvbi1ib3ggLnZhT3B0aW9uIG9wdGlvbjpjb250YWlucygnICsgc2VhcmNoICsgJyknKS52YWwoKTtcclxuXHRcdGlmICghc2VhcmNoIHx8IHNlYXJjaCA9PSBcIlwiKSB7IG9wdGlvbiA9ICQoJyNzZXR0aW5nc21vZGUgLnZhLW9wdGlvbi1ib3ggLnZhT3B0aW9uIG9wdGlvbicpLnZhbCgpOyB9XHJcblx0XHQkKCcjc2V0dGluZ3Ntb2RlIC52YS1vcHRpb24tYm94IC52YU9wdGlvbicpLnZhbChvcHRpb24pLnRyaWdnZXIoJ2NoYW5nZScpO1xyXG5cdH0pO1xyXG5cclxuXHRhcHAub24oJ2NhbWVyYUNoYW5nZScsIHJlbmRlckRyb3Bkb3duKTtcclxuXHJcblxyXG5cdHJldHVybiB0aGF0O1xyXG59XHJcblxyXG52YXIgdGVtcGxhdGUgPSBgXHJcblx0PGRpdiBjbGFzcz1cInJvdyB2ZXJ0aWNhbC1wYWRkaW5nLWJpZ1wiPlxyXG5cdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTEyIG1lZGl1bS0xMiBjb2x1bW5zXCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib3ggdGV4dC1jZW50ZXJcIj5cclxuXHRcdFx0XHQ8aDE+JHthcHAubGwoJ2V4cGVydE1vZGVTZWxlY3RDYW1lcmEnKX08L2gxPlxyXG5cdFx0XHRcdDxhIGNsYXNzPVwiZnVuY3Rpb25Mb2FkIExDLWljb24gaWNvbi1hcnJvdy1yaWdodC1hZnRlclwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCI+JHthcHAubGwoJ2V4cGVydE1vZGVMb2FkJyl9PC9hPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdDwvZGl2PlxyXG5cdDxkaXYgY2xhc3M9XCJyb3cgaW5kZW50LWZpeC1kZXNrdG9wXCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwic21hbGwtMTIgbGFyZ2UtNiBtZWRpdW0tNiBjb2x1bW5zXCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib3hcIj5cclxuXHRcdFx0XHQ8cD5UeXBlIG9mIENhbWVyYTwvcD5cclxuXHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJzZWxlY3RcIj5cclxuXHRcdFx0XHRcdDxzZWxlY3QgY2xhc3M9XCJjYW1lcmFUeXBlRmlsdGVyXCI+XHJcblx0XHRcdFx0XHQ8L3NlbGVjdD5cclxuXHRcdFx0XHQ8L2xhYmVsPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTYgbWVkaXVtLTYgY29sdW1uc1wiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94XCI+XHJcblx0XHRcdFx0PHA+VHlwZSBvZiBWaWRlbyBBbmFseXRpY3M8L3A+XHJcblx0XHRcdFx0PGxhYmVsIGNsYXNzPVwic2VsZWN0XCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjA7XCI+XHJcblx0XHRcdFx0XHQ8c2VsZWN0IGNsYXNzPVwiY2FtZXJhRmlsdGVyXCI+XHJcblx0XHRcdFx0XHQ8L3NlbGVjdD5cclxuXHRcdFx0XHQ8L2xhYmVsPlxyXG5cdFx0XHRcdDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MjBweDttYXJnaW4tYm90dG9tOjMwcHg7XCI+KFByZS1pbnN0YWxsZWQgb3IgYXZhaWxhYmxlIHZpYSBsaWNlbnNlKTwvc3Bhbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHQ8ZGl2IGNsYXNzPVwicm93IGluZGVudC1maXgtZGVza3RvcFwiPlxyXG5cdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTQgbWVkaXVtLTQgY29sdW1uc1wiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94XCI+XHJcblx0XHRcdFx0PHA+JHthcHAubGwoJ2V4cGVydE1vZGVGYW1pbHknKX08L3A+XHJcblx0XHRcdFx0PGxhYmVsIGNsYXNzPVwic2VsZWN0XCI+XHJcblx0XHRcdFx0XHQ8c2VsZWN0IGNsYXNzPVwiY2FtZXJhRmFtaWx5XCI+XHJcblx0XHRcdFx0XHQ8L3NlbGVjdD5cclxuXHRcdFx0XHQ8L2xhYmVsPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTQgbWVkaXVtLTQgY29sdW1uc1wiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94XCI+XHJcblx0XHRcdFx0PHAgY2xhc3M9XCJjYW1Td2l0Y2hNb2RlbFwiPiR7YXBwLmxsKCdleHBlcnRNb2RlTW9kZWwnKX08L3A+XHJcblx0XHRcdFx0PGxhYmVsIGNsYXNzPVwic2VsZWN0XCI+XHJcblx0XHRcdFx0XHQ8c2VsZWN0IGNsYXNzPVwiY2FtZXJhTW9kZWxcIj48L3NlbGVjdD5cclxuXHRcdFx0XHQ8L2xhYmVsPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTQgbWVkaXVtLTQgY29sdW1uc1wiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94XCI+XHJcblx0XHRcdFx0PHAgY2xhc3M9XCJjYW1Td2l0Y2hSZXNvbHV0aW9uXCI+JHthcHAubGwoJ2V4cGVydE1vZGVSZXNvbHV0aW9uJyl9PC9wPlxyXG5cdFx0XHRcdDxsYWJlbCBjbGFzcz1cInNlbGVjdFwiPlxyXG5cdFx0XHRcdFx0PHNlbGVjdCBjbGFzcz1cImNhbWVyYVJlc29sdXRpb25cIj48L3NlbGVjdD5cclxuXHRcdFx0XHQ8L2xhYmVsPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdDwvZGl2PlxyXG5cdDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib3ggc21hbGwtMTIgbGFyZ2UtMTIgbWVkaXVtLTEyIGNvbHVtbiB0ZXh0LWNlbnRlclwiPlxyXG5cdFx0XHQ8YSBjbGFzcz1cInByb2NlZWRCdXR0b24gYnV0dG9uXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIj4ke2FwcC5sbCgnZXhwZXJ0TW9kZVByb2NlZWQnKX08L2E+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHQ8ZGl2IGNsYXNzPVwicm93XCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94IGluZGVudC1maXgyLWRlc2t0b3Agc21hbGwtMTIgbGFyZ2UtMTIgbWVkaXVtLTEyIGNvbHVtbiB0ZXh0LWNlbnRlclwiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiYWx0QmFja2dyb3VuZFwiPlxyXG5cdFx0XHRcdDxoMj4ke2FwcC5sbCgnZXhwZXJ0TW9kZUd1aWRhbmNlTGFiZWxCaWcnKX08L2gyPlxyXG5cdFx0XHRcdDxoMyBjbGFzcz1cIlwiPiR7YXBwLmxsKCdleHBlcnRNb2RlR3VpZGFuY2VMYWJlbFNtYWxsJyl9PC9oMz5cclxuXHRcdFx0XHQ8YSBjbGFzcz1cImhvbGxvdyBidXR0b24gZ3VpZGVkTW9kZUJ1dHRvblwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCI+VmlkZW8gUHJvZHVjdCBTZWxlY3RvcjwvYT5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuYDsiLCJjb25zdCBET1JJX0QgPSAyNSwgRE9SSV9PID0gNjMsIERPUklfUiA9IDEyNSwgRE9SSV9JID0gMjUwO1xyXG5jb25zdCBEUklfRCA9IDMsIERSSV9SID0gMTIsIERSSV9JID0gMjQ7XHJcbmNvbnN0IEhVTUFOX0hFSUdIVCA9IDEuNywgSFVNQU5fV0lEVEggPSAwLjU7XHJcbmNvbnN0IE1JTklNVU1fVkFfT0JKRUNUX1BJWEVMX1NJWkUgPSAyMDtcclxuXHJcbmNvbnN0IFF1ZXN0aW9uID0gcmVxdWlyZSgnLi9zbmlwcGV0cy9xdWVzdGlvbi5qcycpO1xyXG5jb25zdCBTbGlkZXIgPSByZXF1aXJlKCcuL3NuaXBwZXRzL3NsaWRlci5qcycpO1xyXG52YXIgJHNlbGVjdGlvbnM7XHJcbnZhciBhbnN3ZXJzID0ge307XHJcbnZhciAkZG9tO1xyXG52YXIgYWN0aXZlU2xpZGVyO1xyXG5cclxuZnVuY3Rpb24gcmFkVG9EZWcobnVtYmVyKSB7XHJcblx0cmV0dXJuIG51bWJlciAqIDE4MCAvIE1hdGguUEk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlZ1RvUmFkKG51bWJlcikge1xyXG5cdHJldHVybiBudW1iZXIgKiBNYXRoLlBJIC8gMTgwO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcHApIHtcclxuXHR2YXIgdGhhdCA9IHt9O1xyXG5cdHZhciBhcHAgPSBhcHA7XHJcblx0JGRvbSA9ICQoJyNndWlkZWRtb2RlJyk7XHJcblxyXG5cdCRkb20uaHRtbCh0ZW1wbGF0ZSk7XHJcblxyXG5cdCRzZWxlY3Rpb25zID0gJCgnPGRpdiBjbGFzcz1cInNlbGVjdGlvbnNcIiAvPicpO1xyXG5cdCRkb20uYXBwZW5kKCRzZWxlY3Rpb25zKTtcclxuXHRxdWVzdGlvbl8xKCk7XHJcblxyXG5cdGFwcC5vbigndW5pdENoYW5nZScsIGZ1bmN0aW9uIChkYXRhKSB7XHJcblx0XHRpZiAoYWN0aXZlU2xpZGVyKSB7XHJcblx0XHRcdGFjdGl2ZVNsaWRlci5yZXNldCgpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cclxuXHRyZXR1cm4gdGhhdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcXVlc3Rpb25fMSgpIHtcclxuXHR2YXIgcTEgPSBuZXcgUXVlc3Rpb24oJHNlbGVjdGlvbnMsIGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDEnKSwgYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wMUluZm8nKSxcclxuXHRcdFt7IHZhbHVlOiAneWVzJywgbGFiZWw6IGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDFMYWJlbDAxJykgfSwgeyB2YWx1ZTogJ25vJywgbGFiZWw6IGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDFMYWJlbDAyJykgfV0sXHJcblx0XHRmdW5jdGlvbiAodmFsdWUpIHtcclxuXHRcdFx0aWYgKHExLm5leHQpIHsgcTEubmV4dC5yZW1vdmUoKTsgfVxyXG5cdFx0XHRhbnN3ZXJzLnExID0gdmFsdWU7XHJcblx0XHRcdGFuc3dlcnMucTIgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGFuc3dlcnMucTMgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGFuc3dlcnMucTQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGFuc3dlcnMucTUgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGFuc3dlcnMucTYgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGFuc3dlcnMucTcgPSB1bmRlZmluZWQ7XHJcblx0XHRcdHExLm5leHQgPSBxdWVzdGlvbl8yKCk7XHJcblx0XHRcdCQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtcclxuXHRcdFx0XHRzY3JvbGxUb3A6IHExLm5leHQuJGl0ZW0ub2Zmc2V0KCkudG9wXHJcblx0XHRcdH0sIDIwMCwgZnVuY3Rpb24gKCkgeyB9KTtcclxuXHRcdH1cclxuXHQpO1xyXG5cdHJldHVybiBxMTtcclxufVxyXG5cclxuZnVuY3Rpb24gcXVlc3Rpb25fMigpIHtcclxuXHR2YXIgcTIgPSBuZXcgUXVlc3Rpb24oJHNlbGVjdGlvbnMsIGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDInKSwgYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wMkluZm8nKSxcclxuXHRcdFt7IHZhbHVlOiAneWVzJywgbGFiZWw6IGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDJMYWJlbDAxJykgfSwgeyB2YWx1ZTogJ25vJywgbGFiZWw6IGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDJMYWJlbDAyJykgfV0sXHJcblx0XHRmdW5jdGlvbiAodmFsdWUpIHtcclxuXHRcdFx0aWYgKHEyLm5leHQpIHsgcTIubmV4dC5yZW1vdmUoKTsgfVxyXG5cdFx0XHRhbnN3ZXJzLnEyID0gdmFsdWU7XHJcblx0XHRcdGFuc3dlcnMucTMgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGFuc3dlcnMucTQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGFuc3dlcnMucTUgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGFuc3dlcnMucTYgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGFuc3dlcnMucTcgPSB1bmRlZmluZWQ7XHJcblx0XHRcdGlmIChhbnN3ZXJzLnExID09PSAneWVzJyAmJiBhbnN3ZXJzLnEyID09PSAneWVzJykge1xyXG5cdFx0XHRcdHEyLm5leHQgPSBzbGlkZXJWaWRlb0FuYWx5dGljcygpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChhbnN3ZXJzLnExID09PSAneWVzJyAmJiBhbnN3ZXJzLnEyID09PSAnbm8nKSB7IHEyLm5leHQgPSBxdWVzdGlvbl8zKCk7IH1cclxuXHRcdFx0aWYgKGFuc3dlcnMucTEgPT09ICdubycgJiYgYW5zd2Vycy5xMiA9PT0gJ25vJykge1xyXG5cdFx0XHRcdHEyLm5leHQgPSBzbGlkZXJET1JJKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGFuc3dlcnMucTEgPT09ICdubycgJiYgYW5zd2Vycy5xMiA9PT0gJ3llcycpIHtcclxuXHRcdFx0XHRxMi5uZXh0ID0gc2xpZGVyRFJJKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe1xyXG5cdFx0XHRcdHNjcm9sbFRvcDogcTIubmV4dC4kaXRlbS5vZmZzZXQoKS50b3BcclxuXHRcdFx0fSwgMjAwLCBmdW5jdGlvbiAoKSB7IH0pO1xyXG5cdFx0fVxyXG5cdCk7XHJcblx0cmV0dXJuIHEyO1xyXG59XHJcblxyXG5mdW5jdGlvbiBxdWVzdGlvbl8zKCkge1xyXG5cdHZhciBxMyA9IG5ldyBRdWVzdGlvbigkc2VsZWN0aW9ucywgYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wMycpLCBhcHAubGwoJ2d1aWRlZE1vZGVRdWVzdGlvbjAzSW5mbycpLFxyXG5cdFx0W3sgdmFsdWU6ICdwZXJzb24nLCBsYWJlbDogYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wM0xhYmVsMDEnKSB9LCB7IHZhbHVlOiAnYmlrZScsIGxhYmVsOiBhcHAubGwoJ2d1aWRlZE1vZGVRdWVzdGlvbjAzTGFiZWwwMicpIH0sIHsgdmFsdWU6ICdjYXInLCBsYWJlbDogYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wM0xhYmVsMDMnKSB9LCB7IHZhbHVlOiAndHJ1Y2snLCBsYWJlbDogYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wM0xhYmVsMDQnKSB9XSxcclxuXHRcdGZ1bmN0aW9uICh2YWx1ZSkge1xyXG5cdFx0XHRpZiAocTMubmV4dCkgeyBxMy5uZXh0LnJlbW92ZSgpOyB9XHJcblx0XHRcdGFuc3dlcnMucTMgPSB2YWx1ZTtcclxuXHRcdFx0YW5zd2Vycy5xNCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0YW5zd2Vycy5xNSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0YW5zd2Vycy5xNiA9IHVuZGVmaW5lZDtcclxuXHRcdFx0YW5zd2Vycy5xNyA9IHVuZGVmaW5lZDtcclxuXHRcdFx0cTMubmV4dCA9IHF1ZXN0aW9uXzQoKTtcclxuXHRcdFx0JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe1xyXG5cdFx0XHRcdHNjcm9sbFRvcDogcTMubmV4dC4kaXRlbS5vZmZzZXQoKS50b3BcclxuXHRcdFx0fSwgMjAwLCBmdW5jdGlvbiAoKSB7IH0pO1xyXG5cdFx0fVxyXG5cdCk7XHJcblx0cmV0dXJuIHEzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBxdWVzdGlvbl80KCkge1xyXG5cdHZhciBxNCA9IG5ldyBRdWVzdGlvbigkc2VsZWN0aW9ucywgYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wNCcpLCBhcHAubGwoJ2d1aWRlZE1vZGVRdWVzdGlvbjA0SW5mbycpLFxyXG5cdFx0W3sgdmFsdWU6ICdpbmRvb3InLCBsYWJlbDogYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wNExhYmVsMDEnKSB9LCB7IHZhbHVlOiAnb3V0ZG9vcicsIGxhYmVsOiBhcHAubGwoJ2d1aWRlZE1vZGVRdWVzdGlvbjA0TGFiZWwwMicpIH1dLFxyXG5cdFx0ZnVuY3Rpb24gKHZhbHVlKSB7XHJcblx0XHRcdGlmIChxNC5uZXh0KSB7IHE0Lm5leHQucmVtb3ZlKCk7IH1cclxuXHRcdFx0YW5zd2Vycy5xNCA9IHZhbHVlO1xyXG5cdFx0XHRhbnN3ZXJzLnE1ID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRhbnN3ZXJzLnE2ID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRhbnN3ZXJzLnE3ID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRxNC5uZXh0ID0gcXVlc3Rpb25fNSgpO1xyXG5cdFx0XHQkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7XHJcblx0XHRcdFx0c2Nyb2xsVG9wOiBxNC5uZXh0LiRpdGVtLm9mZnNldCgpLnRvcFxyXG5cdFx0XHR9LCAyMDAsIGZ1bmN0aW9uICgpIHsgfSk7XHJcblx0XHR9XHJcblx0KTtcclxuXHRyZXR1cm4gcTQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHF1ZXN0aW9uXzUoKSB7XHJcblx0dmFyIHE1ID0gbmV3IFF1ZXN0aW9uKCRzZWxlY3Rpb25zLCBhcHAubGwoJ2d1aWRlZE1vZGVRdWVzdGlvbjA1JyksIGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDVJbmZvJyksXHJcblx0XHRbeyB2YWx1ZTogJ3F1aWV0JywgbGFiZWw6IGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDVMYWJlbDAxJykgfSwgeyB2YWx1ZTogJ2J1c3knLCBsYWJlbDogYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wNUxhYmVsMDInKSB9XSxcclxuXHRcdGZ1bmN0aW9uICh2YWx1ZSkge1xyXG5cdFx0XHRpZiAocTUubmV4dCkgeyBxNS5uZXh0LnJlbW92ZSgpOyB9XHJcblx0XHRcdGFuc3dlcnMucTUgPSB2YWx1ZTtcclxuXHRcdFx0YW5zd2Vycy5xNiA9IHVuZGVmaW5lZDtcclxuXHRcdFx0YW5zd2Vycy5xNyA9IHVuZGVmaW5lZDtcclxuXHRcdFx0aWYgKGFuc3dlcnMucTQgPT09ICdpbmRvb3InKSB7XHJcblx0XHRcdFx0cTUubmV4dCA9IHNsaWRlclZpZGVvQW5hbHl0aWNzKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGFuc3dlcnMucTQgPT09ICdvdXRkb29yJykgeyBxNS5uZXh0ID0gcXVlc3Rpb25fNigpOyB9XHJcblx0XHRcdCQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtcclxuXHRcdFx0XHRzY3JvbGxUb3A6IHE1Lm5leHQuJGl0ZW0ub2Zmc2V0KCkudG9wXHJcblx0XHRcdH0sIDIwMCwgZnVuY3Rpb24gKCkgeyB9KTtcclxuXHRcdH1cclxuXHQpO1xyXG5cdHJldHVybiBxNTtcclxufVxyXG5cclxuZnVuY3Rpb24gcXVlc3Rpb25fNigpIHtcclxuXHR2YXIgcTYgPSBuZXcgUXVlc3Rpb24oJHNlbGVjdGlvbnMsIGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDYnKSwgYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wNkluZm8nKSxcclxuXHRcdFt7IHZhbHVlOiAneWVzJywgbGFiZWw6IGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDZMYWJlbDAxJykgfSwgeyB2YWx1ZTogJ25vJywgbGFiZWw6IGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDZMYWJlbDAyJykgfV0sXHJcblx0XHRmdW5jdGlvbiAodmFsdWUpIHtcclxuXHRcdFx0aWYgKHE2Lm5leHQpIHsgcTYubmV4dC5yZW1vdmUoKTsgfVxyXG5cdFx0XHRhbnN3ZXJzLnE2ID0gdmFsdWU7XHJcblx0XHRcdGFuc3dlcnMucTcgPSB1bmRlZmluZWQ7XHJcblx0XHRcdHE2Lm5leHQgPSBxdWVzdGlvbl83KCk7XHJcblx0XHRcdCQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtcclxuXHRcdFx0XHRzY3JvbGxUb3A6IHE2Lm5leHQuJGl0ZW0ub2Zmc2V0KCkudG9wXHJcblx0XHRcdH0sIDIwMCwgZnVuY3Rpb24gKCkgeyB9KTtcclxuXHRcdH1cclxuXHQpO1xyXG5cdHJldHVybiBxNjtcclxufVxyXG5cclxuZnVuY3Rpb24gcXVlc3Rpb25fNygpIHtcclxuXHR2YXIgcTcgPSBuZXcgUXVlc3Rpb24oJHNlbGVjdGlvbnMsIGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDcnKSwgYXBwLmxsKCdndWlkZWRNb2RlUXVlc3Rpb24wN0luZm8nKSxcclxuXHRcdFt7IHZhbHVlOiAneWVzJywgbGFiZWw6IGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDdMYWJlbDAxJykgfSwgeyB2YWx1ZTogJ25vJywgbGFiZWw6IGFwcC5sbCgnZ3VpZGVkTW9kZVF1ZXN0aW9uMDdMYWJlbDAyJykgfV0sXHJcblx0XHRmdW5jdGlvbiAodmFsdWUpIHtcclxuXHRcdFx0aWYgKHE3Lm5leHQpIHsgcTcubmV4dC5yZW1vdmUoKTsgfVxyXG5cdFx0XHRhbnN3ZXJzLnE3ID0gdmFsdWU7XHJcblx0XHRcdHE3Lm5leHQgPSBzbGlkZXJWaWRlb0FuYWx5dGljcygpO1xyXG5cdFx0XHQkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7XHJcblx0XHRcdFx0c2Nyb2xsVG9wOiBxNy5uZXh0LiRpdGVtLm9mZnNldCgpLnRvcFxyXG5cdFx0XHR9LCAyMDAsIGZ1bmN0aW9uICgpIHsgfSk7XHJcblx0XHR9XHJcblx0KTtcclxuXHRyZXR1cm4gcTc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNsaWRlclZpZGVvQW5hbHl0aWNzKCkge1xyXG5cdHZhciB2YSA9IDI1O1xyXG5cdHZhciAkaXRlbTtcclxuXHJcblx0ZnVuY3Rpb24gY3JlYXRlKCkge1xyXG5cdFx0JGl0ZW0gPSAkKCc8ZGl2IC8+JykuYXBwZW5kVG8oJHNlbGVjdGlvbnMpO1xyXG5cdFx0dmFyICR3YXJuaW5nVmlzaWJsZSA9IG51bGw7XHJcblx0XHQkaXRlbS5hcHBlbmQoJzxwPicgKyBhcHAubGwoJ2d1aWRlZE1vZGVTbGlkZXJWaWRlb0FuYWx5dGljc0xhYmVsJykgKyAnPC9wPicpO1xyXG5cdFx0dmFyIHZhU2xpZGVyID0gbmV3IFNsaWRlcigkaXRlbSwgMCwgYXBwLmlGdEYoMTAwMCkudG9GaXhlZCgyKSwgYXBwLmlGdEYodmEpLnRvRml4ZWQoMiksIDEwLCBmdW5jdGlvbiAodikge1xyXG5cdFx0XHR2ID0gYXBwLmlGZkYodik7XHJcblx0XHRcdGlmICh2ID49IDEwMCAmJiAhJHdhcm5pbmdWaXNpYmxlKSB7XHJcblx0XHRcdFx0JHdhcm5pbmdWaXNpYmxlID0gJChgXHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxyXG5cdFx0XHRcdFx0PHAgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIiBjbGFzcz1cIndhcm5pbmcgTEMtaWNvbiBpY29uLWFsZXJ0LWJlZm9yZSBuby1ob3ZlclwiPiR7YXBwLmxsKCdndWlkZWRNb2RlU2xpZGVyVmlkZW9BbmFseXRpY3NXYXJuaW5nJyl9PC9wPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRgKS5pbnNlcnRBZnRlcigkaXRlbS5maW5kKCcuZ3VpZGVkU2xpZGVyJykpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh2IDwgMTAwICYmICR3YXJuaW5nVmlzaWJsZSkge1xyXG5cdFx0XHRcdCR3YXJuaW5nVmlzaWJsZS5yZW1vdmUoKTtcclxuXHRcdFx0XHQkd2FybmluZ1Zpc2libGUgPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhID0gdjtcclxuXHRcdH0pO1xyXG5cdFx0JGl0ZW0uYXBwZW5kKHRlbXBsYXRlUmVzdWx0cyk7XHJcblx0XHQkaXRlbS5maW5kKCcuc2hvd1Jlc3VsdHNCdXR0b24nKS5yZW1vdmVDbGFzcygnbm9zaG93Jyk7XHJcblx0XHQkaXRlbS5maW5kKCcuc2hvd1Jlc3VsdHNCdXR0b24nKS5vbignbW91c2V1cCcsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0cmVuZGVyUmVzdWx0c0JveCgndmlfYW4nLCB2YSk7XHJcblx0XHRcdCRpdGVtLmZpbmQoJy5zaG93UmVzdWx0cycpLnNob3coKTtcclxuXHRcdFx0JCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe1xyXG5cdFx0XHRcdHNjcm9sbFRvcDogJGl0ZW0uZmluZCgnLnNob3dSZXN1bHRzJykub2Zmc2V0KCkudG9wXHJcblx0XHRcdH0sIDIwMCwgZnVuY3Rpb24gKCkgeyB9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRjcmVhdGUoKTtcclxuXHJcblx0YWN0aXZlU2xpZGVyID0geyAkaXRlbTogJGl0ZW0sIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkgeyAkaXRlbS5yZW1vdmUoKTsgfSwgcmVzZXQ6IGZ1bmN0aW9uIHJlc2V0KCkgeyAkaXRlbS5yZW1vdmUoKTsgY3JlYXRlKCk7IH0gfTtcclxuXHRyZXR1cm4gYWN0aXZlU2xpZGVyO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzbGlkZXJET1JJKCkge1xyXG5cdHZhciBkID0gMTAwLCBvID0gMTAwLCByID0gMTAwLCBpID0gMTAwO1xyXG5cdHZhciAkaXRlbTtcclxuXHRmdW5jdGlvbiBjcmVhdGUoKSB7XHJcblx0XHQkaXRlbSA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygkc2VsZWN0aW9ucyk7XHJcblx0XHR2YXIgaW5mbyA9IGBcclxuXHRcdFx0PGEgY2xhc3M9XCJpbmZvQnV0dG9uXCIgZGF0YS1vcGVuPVwiZG9yaU1vZGFsSW5mb1wiPjwvYT5cclxuXHRcdFx0PGRpdiBjbGFzcz1cInJldmVhbFwiIGlkPVwiZG9yaU1vZGFsSW5mb1wiIGRhdGEtcmV2ZWFsPlxyXG5cdFx0XHRcdCR7YXBwLmxsKCdndWlkZWRNb2RlU2xpZGVyRE9SSUluZm8nKX1cclxuXHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiBkYXRhLWNsb3NlIGFyaWEtbGFiZWw9XCJDbG9zZSBtb2RhbFwiIHR5cGU9XCJidXR0b25cIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuXHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHRgO1xyXG5cdFx0JGl0ZW0uYXBwZW5kKCc8cCBjbGFzcz1cImFsaWduZWRcIj4nICsgYXBwLmxsKCdndWlkZWRNb2RlU2xpZGVyRE9SSUxhYmVsJykgKyAnPC9wPicgKyBpbmZvICsgJzxwIHN0eWxlPVwiY29sb3I6I2M3ODVhZlwiPicgKyBhcHAubGwoJ2d1aWRlZE1vZGVJbmZvUGVyc29uJykgKyAnICgnICsgYXBwLmlGdEYoLjUpLnRvRml4ZWQoMikgKyBhcHAudW5pdFN5bWJvbCgpICsgJyB4ICcgKyBhcHAuaUZ0RigxLjcpLnRvRml4ZWQoMikgKyBhcHAudW5pdFN5bWJvbCgpICsgJyk8L3A+Jyk7XHJcblx0XHRuZXcgRm91bmRhdGlvbi5SZXZlYWwoJCgnI2RvcmlNb2RhbEluZm8nKSk7XHJcblx0XHQkaXRlbS5hcHBlbmQoJzxzcGFuPicgKyBhcHAubGwoJ2d1aWRlZE1vZGVTbGlkZXJET1JJTGFiZWxEaXN0YW5jZScpICsgJyAoJyArIGFwcC51bml0U3ltYm9sKCkgKyAnKTwvc3Bhbj4nKTtcclxuXHRcdHZhciBkaXN0YW5jZVNsaWRlciA9IG5ldyBTbGlkZXIoJGl0ZW0sIDAsIGFwcC5pRnRGKDIwMDApLnRvRml4ZWQoMiksIGFwcC5pRnRGKGQpLnRvRml4ZWQoMiksIDEwLCBmdW5jdGlvbiAodikge1xyXG5cdFx0XHRkID0gYXBwLmlGZkYodik7XHJcblx0XHR9KTtcclxuXHRcdCRpdGVtLmFwcGVuZCgnPHNwYW4+JyArIGFwcC5sbCgnZ3VpZGVkTW9kZVNsaWRlckRPUklMYWJlbE9yaWVudGF0aW9uJykgKyAnICgnICsgYXBwLnVuaXRTeW1ib2woKSArICcpPC9zcGFuPicpO1xyXG5cdFx0dmFyIG9yaWVudGF0aW9uU2xpZGVyID0gbmV3IFNsaWRlcigkaXRlbSwgMCwgYXBwLmlGdEYoNzY4KS50b0ZpeGVkKDIpLCBhcHAuaUZ0RihvKS50b0ZpeGVkKDIpLCAxMCwgZnVuY3Rpb24gKHYpIHtcclxuXHRcdFx0byA9IGFwcC5pRmZGKHYpO1xyXG5cdFx0fSk7XHJcblx0XHQkaXRlbS5hcHBlbmQoJzxzcGFuPicgKyBhcHAubGwoJ2d1aWRlZE1vZGVTbGlkZXJET1JJTGFiZWxSZWNvZ25pdGlvbicpICsgJyAoJyArIGFwcC51bml0U3ltYm9sKCkgKyAnKTwvc3Bhbj4nKTtcclxuXHRcdHZhciByZWNvZ25pdGlvblNsaWRlciA9IG5ldyBTbGlkZXIoJGl0ZW0sIDAsIGFwcC5pRnRGKDM4NykudG9GaXhlZCgyKSwgYXBwLmlGdEYocikudG9GaXhlZCgyKSwgMTAsIGZ1bmN0aW9uICh2KSB7XHJcblx0XHRcdHIgPSBhcHAuaUZmRih2KTtcclxuXHRcdH0pO1xyXG5cdFx0JGl0ZW0uYXBwZW5kKCc8c3Bhbj4nICsgYXBwLmxsKCdndWlkZWRNb2RlU2xpZGVyRE9SSUxhYmVsSWRlbnRpZmljYXRpb24nKSArICcgKCcgKyBhcHAudW5pdFN5bWJvbCgpICsgJyk8L3NwYW4+Jyk7XHJcblx0XHR2YXIgaWRlbnRpZmljYXRpb25TbGlkZXIgPSBuZXcgU2xpZGVyKCRpdGVtLCAwLCBhcHAuaUZ0RigxOTMpLnRvRml4ZWQoMiksIGFwcC5pRnRGKGkpLnRvRml4ZWQoMiksIDEwLCBmdW5jdGlvbiAodikge1xyXG5cdFx0XHRpID0gYXBwLmlGZkYodik7XHJcblx0XHR9KTtcclxuXHRcdCRpdGVtLmFwcGVuZCh0ZW1wbGF0ZVJlc3VsdHMpO1xyXG5cdFx0JGl0ZW0uZmluZCgnLnNob3dSZXN1bHRzQnV0dG9uJykucmVtb3ZlQ2xhc3MoJ25vc2hvdycpO1xyXG5cdFx0JGl0ZW0uZmluZCgnLnNob3dSZXN1bHRzQnV0dG9uJykub24oJ21vdXNldXAnLCBmdW5jdGlvbiAoZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHJlbmRlclJlc3VsdHNCb3goJ2RvcmknLCBkLCBvLCByLCBpKTsgJGl0ZW0uZmluZCgnLnNob3dSZXN1bHRzJykuc2hvdygpOyB9KTtcclxuXHR9XHJcblx0Y3JlYXRlKCk7XHJcblxyXG5cdGFjdGl2ZVNsaWRlciA9IHsgJGl0ZW06ICRpdGVtLCByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHsgJGl0ZW0ucmVtb3ZlKCk7IH0sIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHsgJGl0ZW0ucmVtb3ZlKCk7IGNyZWF0ZSgpOyB9IH07XHJcblx0cmV0dXJuIGFjdGl2ZVNsaWRlcjtcclxufVxyXG5cclxuZnVuY3Rpb24gc2xpZGVyRFJJKCkge1xyXG5cdHZhciBkID0gMTAwLCByID0gMTAwLCBpID0gMTAwO1xyXG5cdHZhciAkaXRlbTtcclxuXHRmdW5jdGlvbiBjcmVhdGUoKSB7XHJcblx0XHQkaXRlbSA9ICQoJzxkaXYgLz4nKS5hcHBlbmRUbygkc2VsZWN0aW9ucyk7XHJcblx0XHR2YXIgaW5mbyA9IGBcclxuXHRcdFx0PGEgY2xhc3M9XCJpbmZvQnV0dG9uXCIgZGF0YS1vcGVuPVwiZHJpTW9kYWxJbmZvXCI+PC9hPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicmV2ZWFsXCIgaWQ9XCJkcmlNb2RhbEluZm9cIiBkYXRhLXJldmVhbD5cclxuXHRcdFx0XHQke2FwcC5sbCgnZ3VpZGVkTW9kZVNsaWRlckRSSUluZm8nKX1cclxuXHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiBkYXRhLWNsb3NlIGFyaWEtbGFiZWw9XCJDbG9zZSBtb2RhbFwiIHR5cGU9XCJidXR0b25cIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuXHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHRgO1xyXG5cdFx0JGl0ZW0uYXBwZW5kKCc8cCBjbGFzcz1cImFsaWduZWRcIj4nICsgYXBwLmxsKCdndWlkZWRNb2RlU2xpZGVyRFJJTGFiZWwnKSArICc8L3A+JyArIGluZm8gKyAnPHAgc3R5bGU9XCJjb2xvcjojYzc4NWFmXCI+JyArIGFwcC5sbCgnZ3VpZGVkTW9kZUluZm9QZXJzb24nKSArICcgKCcgKyBhcHAuaUZ0RiguNSkudG9GaXhlZCgyKSArIGFwcC51bml0U3ltYm9sKCkgKyAnIHggJyArIGFwcC5pRnRGKDEuNykudG9GaXhlZCgyKSArIGFwcC51bml0U3ltYm9sKCkgKyAnKTwvcD4nKTtcclxuXHRcdG5ldyBGb3VuZGF0aW9uLlJldmVhbCgkKCcjZHJpTW9kYWxJbmZvJykpO1xyXG5cdFx0JGl0ZW0uYXBwZW5kKCc8c3Bhbj4nICsgYXBwLmxsKCdndWlkZWRNb2RlU2xpZGVyRFJJTGFiZWxEaXN0YW5jZScpICsgJyAoJyArIGFwcC51bml0U3ltYm9sKCkgKyAnKTwvc3Bhbj4nKTtcclxuXHRcdHZhciBkaXN0YW5jZVNsaWRlciA9IG5ldyBTbGlkZXIoJGl0ZW0sIDAsIGFwcC5pRnRGKDU4NTApLnRvRml4ZWQoMiksIGFwcC5pRnRGKGQpLnRvRml4ZWQoMiksIDEwLCBmdW5jdGlvbiAodikge1xyXG5cdFx0XHRkID0gYXBwLmlGZkYodik7XHJcblx0XHR9KTtcclxuXHRcdCRpdGVtLmFwcGVuZCgnPHNwYW4+JyArIGFwcC5sbCgnZ3VpZGVkTW9kZVNsaWRlckRSSUxhYmVsUmVjb2duaXRpb24nKSArICcgKCcgKyBhcHAudW5pdFN5bWJvbCgpICsgJyk8L3NwYW4+Jyk7XHJcblx0XHR2YXIgcmVjb2duaXRpb25TbGlkZXIgPSBuZXcgU2xpZGVyKCRpdGVtLCAwLCBhcHAuaUZ0RigxNDYwKS50b0ZpeGVkKDIpLCBhcHAuaUZ0RihyKS50b0ZpeGVkKDIpLCAxMCwgZnVuY3Rpb24gKHYpIHtcclxuXHRcdFx0ciA9IGFwcC5pRmZGKHYpO1xyXG5cdFx0fSk7XHJcblx0XHQkaXRlbS5hcHBlbmQoJzxzcGFuPicgKyBhcHAubGwoJ2d1aWRlZE1vZGVTbGlkZXJEUklMYWJlbElkZW50aWZpY2F0aW9uJykgKyAnICgnICsgYXBwLnVuaXRTeW1ib2woKSArICcpPC9zcGFuPicpO1xyXG5cdFx0dmFyIGlkZW50aWZpY2F0aW9uU2xpZGVyID0gbmV3IFNsaWRlcigkaXRlbSwgMCwgYXBwLmlGdEYoNzMwKS50b0ZpeGVkKDIpLCBhcHAuaUZ0RihpKS50b0ZpeGVkKDIpLCAxMCwgZnVuY3Rpb24gKHYpIHtcclxuXHRcdFx0aSA9IGFwcC5pRmZGKHYpO1xyXG5cdFx0fSk7XHJcblx0XHQkaXRlbS5hcHBlbmQodGVtcGxhdGVSZXN1bHRzKTtcclxuXHRcdCRpdGVtLmZpbmQoJy5zaG93UmVzdWx0c0J1dHRvbicpLnJlbW92ZUNsYXNzKCdub3Nob3cnKTtcclxuXHRcdC8vICRpdGVtLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgJGl0ZW0uZmluZCgnLnNob3dSZXN1bHRzQnV0dG9uJykucmVtb3ZlQ2xhc3MoJ25vc2hvdycpOyB9KTtcclxuXHRcdCRpdGVtLmZpbmQoJy5zaG93UmVzdWx0c0J1dHRvbicpLm9uKCdtb3VzZXVwJywgZnVuY3Rpb24gKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyByZW5kZXJSZXN1bHRzQm94KCdkcmknLCBkLCByLCBpKTsgJGl0ZW0uZmluZCgnLnNob3dSZXN1bHRzJykuc2hvdygpOyB9KTtcclxuXHR9XHJcblx0Y3JlYXRlKCk7XHJcblxyXG5cdGFjdGl2ZVNsaWRlciA9IHsgJGl0ZW06ICRpdGVtLCByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHsgJGl0ZW0ucmVtb3ZlKCk7IH0sIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHsgJGl0ZW0ucmVtb3ZlKCk7IGNyZWF0ZSgpOyB9IH07XHJcblx0cmV0dXJuIGFjdGl2ZVNsaWRlcjtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVuZGVyUmVzdWx0c0JveCh0eXBlLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KSB7XHJcblx0dmFyIG15cmVzdWx0cyA9IFtdO1xyXG5cdGlmICh0eXBlID09PSAnZG9yaScpIHtcclxuXHRcdGFwcC5jYW1lcmFzUmF3LmZvckVhY2goZnVuY3Rpb24gKHYpIHtcclxuXHRcdFx0aWYgKGFwcC5ibGFja2xpc3RlZEZvckd1aWRlZC5pbmRleE9mKHYuY25hbWUpID49IDApIHsgcmV0dXJuOyB9XHJcblx0XHRcdGlmIChhbnN3ZXJzLnEyID09PSAneWVzJyAmJiB2LlRoZXJtYWwgPT09IGZhbHNlKSB7IHJldHVybjsgfVxyXG5cdFx0XHRpZiAoYW5zd2Vycy5xMiA9PT0gJ25vJyAmJiAodi5UaGVybWFsID09PSB0cnVlKSkgeyByZXR1cm47IH1cclxuXHRcdFx0aWYgKHYuY3R5cGUgPT09ICdub25wYW5vJykge1xyXG5cdFx0XHRcdHZhciBkX2RvcmlfZCA9IE51bWJlci5wYXJzZUZsb2F0KHYuSG9yaXpvbnRhbFJlc29sdXRpb24pIC8gKDIgKiBhcmcxICogTWF0aC50YW4oZGVnVG9SYWQoTnVtYmVyLnBhcnNlRmxvYXQodi5IRk9WbWF4KSAvIDIpKSk7XHJcblx0XHRcdFx0dmFyIGRfZG9yaV9vID0gTnVtYmVyLnBhcnNlRmxvYXQodi5Ib3Jpem9udGFsUmVzb2x1dGlvbikgLyAoMiAqIGFyZzIgKiBNYXRoLnRhbihkZWdUb1JhZChOdW1iZXIucGFyc2VGbG9hdCh2LkhGT1ZtYXgpIC8gMikpKTtcclxuXHRcdFx0XHR2YXIgZF9kb3JpX3IgPSBOdW1iZXIucGFyc2VGbG9hdCh2Lkhvcml6b250YWxSZXNvbHV0aW9uKSAvICgyICogYXJnMyAqIE1hdGgudGFuKGRlZ1RvUmFkKE51bWJlci5wYXJzZUZsb2F0KHYuSEZPVm1heCkgLyAyKSkpO1xyXG5cdFx0XHRcdHZhciBkX2RvcmlfaSA9IE51bWJlci5wYXJzZUZsb2F0KHYuSG9yaXpvbnRhbFJlc29sdXRpb24pIC8gKDIgKiBhcmc0ICogTWF0aC50YW4oZGVnVG9SYWQoTnVtYmVyLnBhcnNlRmxvYXQodi5IRk9WbWF4KSAvIDIpKSk7XHJcblxyXG5cdFx0XHRcdGlmIChkX2RvcmlfZCA8PSBET1JJX0QpIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0aWYgKGRfZG9yaV9vIDw9IERPUklfTykgeyByZXR1cm47IH1cclxuXHRcdFx0XHRpZiAoZF9kb3JpX3IgPD0gRE9SSV9SKSB7IHJldHVybjsgfVxyXG5cdFx0XHRcdGlmIChkX2RvcmlfaSA8PSBET1JJX0kpIHsgcmV0dXJuOyB9XHJcblxyXG5cdFx0XHRcdG15cmVzdWx0cy5wdXNoKHYpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBpZiAodi5jdHlwZSA9PT0gJ3Bhbm8nKSB7XHJcblxyXG5cdFx0XHQvLyB9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGlmICh0eXBlID09PSAnZHJpJykge1xyXG5cdFx0YXBwLmNhbWVyYXNSYXcuZm9yRWFjaChmdW5jdGlvbiAodikge1xyXG5cdFx0XHRpZiAoYXBwLmJsYWNrbGlzdGVkRm9yR3VpZGVkLmluZGV4T2Yodi5jbmFtZSkgPj0gMCkgeyByZXR1cm47IH1cclxuXHRcdFx0aWYgKGFuc3dlcnMucTIgPT09ICd5ZXMnICYmIHYuVGhlcm1hbCA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9XHJcblx0XHRcdGlmIChhbnN3ZXJzLnEyID09PSAnbm8nICYmICh2LlRoZXJtYWwgPT09IHRydWUpKSB7IHJldHVybjsgfVxyXG5cdFx0XHRpZiAodi5jdHlwZSA9PT0gJ25vbnBhbm8nKSB7XHJcblx0XHRcdFx0dmFyIGRfZHJpX2QgPSBOdW1iZXIucGFyc2VGbG9hdCh2Lkhvcml6b250YWxSZXNvbHV0aW9uKSAvICgyICogYXJnMSAqIE1hdGgudGFuKGRlZ1RvUmFkKE51bWJlci5wYXJzZUZsb2F0KHYuSEZPVm1heCkgLyAyKSkpO1xyXG5cdFx0XHRcdHZhciBkX2RyaV9yID0gTnVtYmVyLnBhcnNlRmxvYXQodi5Ib3Jpem9udGFsUmVzb2x1dGlvbikgLyAoMiAqIGFyZzIgKiBNYXRoLnRhbihkZWdUb1JhZChOdW1iZXIucGFyc2VGbG9hdCh2LkhGT1ZtYXgpIC8gMikpKTtcclxuXHRcdFx0XHR2YXIgZF9kcmlfaSA9IE51bWJlci5wYXJzZUZsb2F0KHYuSG9yaXpvbnRhbFJlc29sdXRpb24pIC8gKDIgKiBhcmczICogTWF0aC50YW4oZGVnVG9SYWQoTnVtYmVyLnBhcnNlRmxvYXQodi5IRk9WbWF4KSAvIDIpKSk7XHJcblxyXG5cdFx0XHRcdGlmIChkX2RyaV9kIDwgRFJJX0QpIHsgcmV0dXJuOyB9XHJcblx0XHRcdFx0aWYgKGRfZHJpX3IgPCBEUklfUikgeyByZXR1cm47IH1cclxuXHRcdFx0XHRpZiAoZF9kcmlfaSA8IERSSV9JKSB7IHJldHVybjsgfVxyXG5cclxuXHRcdFx0XHRteXJlc3VsdHMucHVzaCh2KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaWYgKHYuY3R5cGUgPT09ICdwYW5vJykge1xyXG5cclxuXHRcdFx0Ly8gfVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRpZiAodHlwZSA9PT0gJ3ZpX2FuJykge1xyXG5cdFx0dmFyIFZBX2V2YV9pdmEgPSAnSVZBJztcclxuXHRcdGlmIChhbnN3ZXJzLnE0ID09PSAnaW5kb29yJyAmJiBhbnN3ZXJzLnE1ID09PSAncXVpZXQnICYmIGFyZzEgPD0gNjApIHtcclxuXHRcdFx0VkFfZXZhX2l2YSA9ICdFVkEnO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGFuc3dlcnMucTQgPT09ICdvdXRkb29yJyAmJiBhbnN3ZXJzLnE1ID09PSAncXVpZXQnICYmIGFuc3dlcnMucTYgPT09ICdubycgJiYgYW5zd2Vycy5xNyA9PT0gJ25vJyAmJiBhcmcxIDw9IDYwKSB7XHJcblx0XHRcdFZBX2V2YV9pdmEgPSAnRVZBJztcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgdE9IZWlnaHQgPSAxLjY7XHJcblx0XHR2YXIgdE9XaWR0aCA9IC41O1xyXG5cclxuXHRcdGlmIChhbnN3ZXJzLnEyID09PSAnbm8nKSB7XHJcblx0XHRcdHN3aXRjaCAoYW5zd2Vycy5xMykge1xyXG5cdFx0XHRcdGNhc2UgJ2Jpa2UnOiB0T0hlaWdodCA9IDEuNjsgdE9XaWR0aCA9IDEuODsgYnJlYWs7XHJcblx0XHRcdFx0Y2FzZSAnY2FyJzogdE9IZWlnaHQgPSAxLjY7IHRPV2lkdGggPSAyLjU7IGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgJ3RydWNrJzogdE9IZWlnaHQgPSAzOyB0T1dpZHRoID0gMTA7IGJyZWFrO1xyXG5cdFx0XHRcdGRlZmF1bHQ6IHRPSGVpZ2h0ID0gMS42OyB0T1dpZHRoID0gLjU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRhcHAuY2FtZXJhc1Jhdy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XHJcblx0XHRcdGlmIChhcHAuYmxhY2tsaXN0ZWRGb3JHdWlkZWQuaW5kZXhPZih2LmNuYW1lKSA+PSAwKSB7IHJldHVybjsgfVxyXG5cdFx0XHRpZiAodi5WaWRlb0FuYWx5dGljcyA9PT0gXCJGQUxTRVwiKSB7IHJldHVybjsgfVxyXG5cdFx0XHRpZiAoVkFfZXZhX2l2YSAhPT0gdi5WQV9ldmFfaXZhKSB7IHJldHVybjsgfVxyXG5cdFx0XHRpZiAoYW5zd2Vycy5xMiA9PT0gJ3llcycgJiYgdi5UaGVybWFsID09PSBmYWxzZSkgeyByZXR1cm47IH1cclxuXHRcdFx0aWYgKGFuc3dlcnMucTIgPT09ICdubycgJiYgKHYuVGhlcm1hbCA9PT0gdHJ1ZSkpIHsgcmV0dXJuOyB9XHJcblx0XHRcdGlmICh2LmN0eXBlID09PSAnbm9ucGFubycpIHtcclxuXHJcblx0XHRcdFx0dmFyIG9ial94ID0gdE9XaWR0aDtcclxuXHRcdFx0XHR2YXIgb2JqX3kgPSB0T0hlaWdodDtcclxuXHJcblx0XHRcdFx0dmFyIGltZ194ID0gTnVtYmVyLnBhcnNlRmxvYXQodi5Ib3Jpem9udGFsUmVzb2x1dGlvbik7XHJcblx0XHRcdFx0dmFyIGltZ195ID0gTnVtYmVyLnBhcnNlRmxvYXQodi5WZXJ0aWNhbFJlc29sdXRpb24pO1xyXG5cclxuXHRcdFx0XHR2YXIgdmFfeCA9IE51bWJlci5wYXJzZUZsb2F0KHYuVkFfaG9yaXpvbnRhbFJlc29sdXRpb24pO1xyXG5cdFx0XHRcdHZhciB2YV95ID0gTnVtYmVyLnBhcnNlRmxvYXQodi5WQV92ZXJ0aWNhbFJlc29sdXRpb24pO1xyXG5cclxuXHRcdFx0XHR2YXIgZm92X2hvciA9IE51bWJlci5wYXJzZUZsb2F0KHYuSEZPVm1heCk7XHJcblx0XHRcdFx0dmFyIGZvdl92ZXIgPSBOdW1iZXIucGFyc2VGbG9hdCh2LlZGT1ZtYXgpO1xyXG5cclxuXHRcdFx0XHR2YXIgVkFfb2JqZWN0X3BpeGVsX2Jhc2VfeCwgVkFfb2JqZWN0X3BpeGVsX2Jhc2VfeSwgVkFfbWluX29iamVjdF9waXhlbF94LCBWQV9taW5fb2JqZWN0X3BpeGVsX3k7XHJcblxyXG5cdFx0XHRcdGlmIChvYmpfeCA8IG9ial95KSB7XHJcblx0XHRcdFx0XHRWQV9vYmplY3RfcGl4ZWxfYmFzZV94ID0gMTtcclxuXHRcdFx0XHRcdFZBX29iamVjdF9waXhlbF9iYXNlX3kgPSBvYmpfeSAvIG9ial94O1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRWQV9vYmplY3RfcGl4ZWxfYmFzZV95ID0gMTtcclxuXHRcdFx0XHRcdFZBX29iamVjdF9waXhlbF9iYXNlX3ggPSBvYmpfeCAvIG9ial95O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRWQV9taW5fb2JqZWN0X3BpeGVsX3ggPSBWQV9vYmplY3RfcGl4ZWxfYmFzZV94O1xyXG5cdFx0XHRcdFZBX21pbl9vYmplY3RfcGl4ZWxfeSA9IFZBX29iamVjdF9waXhlbF9iYXNlX3k7XHJcblxyXG5cdFx0XHRcdHdoaWxlIChWQV9taW5fb2JqZWN0X3BpeGVsX3ggKiBWQV9taW5fb2JqZWN0X3BpeGVsX3kgPCBNSU5JTVVNX1ZBX09CSkVDVF9QSVhFTF9TSVpFKSB7XHJcblx0XHRcdFx0XHRWQV9taW5fb2JqZWN0X3BpeGVsX3ggKz0gVkFfb2JqZWN0X3BpeGVsX2Jhc2VfeDtcclxuXHRcdFx0XHRcdFZBX21pbl9vYmplY3RfcGl4ZWxfeSArPSBWQV9vYmplY3RfcGl4ZWxfYmFzZV95O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0VkFfbWluX29iamVjdF9waXhlbF94ID0gTWF0aC5jZWlsKFZBX21pbl9vYmplY3RfcGl4ZWxfeCk7XHJcblx0XHRcdFx0VkFfbWluX29iamVjdF9waXhlbF95ID0gTWF0aC5jZWlsKFZBX21pbl9vYmplY3RfcGl4ZWxfeSk7XHJcblxyXG5cdFx0XHRcdHZhciBJUFBNX3ggPSBWQV9taW5fb2JqZWN0X3BpeGVsX3ggLyBvYmpfeCAqIGltZ194IC8gdmFfeDtcclxuXHRcdFx0XHR2YXIgSVBQTV95ID0gVkFfbWluX29iamVjdF9waXhlbF95IC8gb2JqX3kgKiBpbWdfeSAvIHZhX3k7XHJcblxyXG5cdFx0XHRcdHZhciBkbWluaCA9IHRPV2lkdGggLyAoMiAqIDAuMyAqIE1hdGgudGFuKGRlZ1RvUmFkKGZvdl9ob3IgLyAyKSkpO1xyXG5cdFx0XHRcdHZhciBkbWludiA9IHRPSGVpZ2h0IC8gKDIgKiAwLjMgKiBNYXRoLnRhbihkZWdUb1JhZChmb3ZfdmVyIC8gMikpKTtcclxuXHJcblx0XHRcdFx0dmFyIGRtYXhoID0gb2JqX3ggLyAoMiAqIChWQV9taW5fb2JqZWN0X3BpeGVsX3ggLyB2YV94KSAqIE1hdGgudGFuKGRlZ1RvUmFkKGZvdl9ob3IgKiAuNSkpKTtcclxuXHRcdFx0XHR2YXIgZG1heHYgPSBvYmpfeSAvICgyICogKFZBX21pbl9vYmplY3RfcGl4ZWxfeSAvIHZhX3kpICogTWF0aC50YW4oZGVnVG9SYWQoZm92X3ZlciAqIC41KSkpO1xyXG5cclxuXHRcdFx0XHR2YXIgdmFfZG1heCA9IE1hdGgubWluKGRtYXh2LCBkbWF4aCk7XHJcblxyXG5cdFx0XHRcdGlmICh2YV9kbWF4ID49IGFyZzEpIHtcclxuXHRcdFx0XHRcdG15cmVzdWx0cy5wdXNoKHYpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly9Gw7xyIFBhbm8gS2FtZXJhcyBmZWhsZW4gc28gbHVzdGlnZSBBbmdhYmVuLCB3aWUgekIuIFdhbGxtb3VudCBvZGVyIENlaWxpbmdcclxuXHJcblx0XHRcdC8vIGlmICh2LmN0eXBlID09PSAncGFubycpIHtcclxuXHRcdFx0Ly8gXHR2YXIgb2JqX3ggPSB0T1dpZHRoO1xyXG5cdFx0XHQvLyBcdHZhciBvYmpfeSA9IHRPSGVpZ2h0O1xyXG5cclxuXHRcdFx0Ly8gXHR2YXIgaW1nX3ggPSBOdW1iZXIucGFyc2VGbG9hdCh2Lkhvcml6b250YWxSZXNvbHV0aW9uKTtcclxuXHRcdFx0Ly8gXHR2YXIgaW1nX3kgPSBOdW1iZXIucGFyc2VGbG9hdCh2LlZlcnRpY2FsUmVzb2x1dGlvbik7XHJcblxyXG5cdFx0XHQvLyBcdHZhciB2YV94ID0gTnVtYmVyLnBhcnNlRmxvYXQodi5WQV9ob3Jpem9udGFsUmVzb2x1dGlvbik7XHJcblx0XHRcdC8vIFx0dmFyIHZhX3kgPSBOdW1iZXIucGFyc2VGbG9hdCh2LlZBX3ZlcnRpY2FsUmVzb2x1dGlvbik7XHJcblxyXG5cdFx0XHQvLyBcdHZhciBWQV9vYmplY3RfcGl4ZWxfYmFzZV94LCBWQV9vYmplY3RfcGl4ZWxfYmFzZV95LCBWQV9taW5fb2JqZWN0X3BpeGVsX3gsIFZBX21pbl9vYmplY3RfcGl4ZWxfeTtcclxuXHJcblx0XHRcdC8vIFx0aWYgKG9ial94IDwgb2JqX3kpIHtcclxuXHRcdFx0Ly8gXHRcdFZBX29iamVjdF9waXhlbF9iYXNlX3ggPSAxO1xyXG5cdFx0XHQvLyBcdFx0VkFfb2JqZWN0X3BpeGVsX2Jhc2VfeSA9IG9ial95IC8gb2JqX3g7XHJcblx0XHRcdC8vIFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gXHRcdFZBX29iamVjdF9waXhlbF9iYXNlX3kgPSAxO1xyXG5cdFx0XHQvLyBcdFx0VkFfb2JqZWN0X3BpeGVsX2Jhc2VfeCA9IG9ial94IC8gb2JqX3k7XHJcblx0XHRcdC8vIFx0fVxyXG5cdFx0XHQvLyBcdFZBX21pbl9vYmplY3RfcGl4ZWxfeCA9IFZBX29iamVjdF9waXhlbF9iYXNlX3g7XHJcblx0XHRcdC8vIFx0VkFfbWluX29iamVjdF9waXhlbF95ID0gVkFfb2JqZWN0X3BpeGVsX2Jhc2VfeTtcclxuXHJcblx0XHRcdC8vIFx0d2hpbGUgKFZBX21pbl9vYmplY3RfcGl4ZWxfeCAqIFZBX21pbl9vYmplY3RfcGl4ZWxfeSA8IE1JTklNVU1fVkFfT0JKRUNUX1BJWEVMX1NJWkUpIHtcclxuXHRcdFx0Ly8gXHRcdFZBX21pbl9vYmplY3RfcGl4ZWxfeCArPSBWQV9vYmplY3RfcGl4ZWxfYmFzZV94O1xyXG5cdFx0XHQvLyBcdFx0VkFfbWluX29iamVjdF9waXhlbF95ICs9IFZBX29iamVjdF9waXhlbF9iYXNlX3k7XHJcblx0XHRcdC8vIFx0fVxyXG5cclxuXHRcdFx0Ly8gXHRWQV9taW5fb2JqZWN0X3BpeGVsX3ggPSBNYXRoLmNlaWwoVkFfbWluX29iamVjdF9waXhlbF94KTtcclxuXHRcdFx0Ly8gXHRWQV9taW5fb2JqZWN0X3BpeGVsX3kgPSBNYXRoLmNlaWwoVkFfbWluX29iamVjdF9waXhlbF95KTtcclxuXHJcblx0XHRcdC8vIFx0dmFyIElQUE1feCA9IFZBX21pbl9vYmplY3RfcGl4ZWxfeCAvIG9ial94ICogaW1nX3ggLyB2YV94O1xyXG5cdFx0XHQvLyBcdHZhciBJUFBNX3kgPSBWQV9taW5fb2JqZWN0X3BpeGVsX3kgLyBvYmpfeSAqIGltZ195IC8gdmFfeTtcclxuXHJcblx0XHRcdC8vIFx0cmVzdWx0LnRPSGVpZ2h0ID0gdE9IZWlnaHQ7XHJcblx0XHRcdC8vIFx0cmVzdWx0LklQUE1feSA9IElQUE1feTtcclxuXHRcdFx0Ly8gXHRyZXN1bHQuaW1nX3kgPSBOdW1iZXIucGFyc2VGbG9hdChyYXcuVmVydGljYWxSZXNvbHV0aW9uKTtcclxuXHJcblx0XHRcdC8vIH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0dmFyICRyZXN1bHRzID0gJCgnLnJlc3VsdHNCb3gnKTtcclxuXHQkcmVzdWx0cy5odG1sKCcnKTtcclxuXHQkcmVzdWx0cy5hcHBlbmQoYDxkaXYgY2xhc3M9XCJyb3cgdGV4dC1sZWZ0XCI+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2x1bW5zIHNtYWxsLTEyIGxhcmdlLTQgbWVkaXVtLTRcIj5cclxuXHRcdFx0XHRcdFx0XHQ8aDQgY2xhc3M9XCJzZWxlY3RlZC1jYW1lcmEgYm9sZFwiPiR7YXBwLmxsKCdleHBlcnRNb2RlRmFtaWx5Jyl9PC9oND5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2x1bW5zIHNtYWxsLTEyIGxhcmdlLTMgbWVkaXVtLTNcIj5cclxuXHRcdFx0XHRcdFx0XHQ8aDQgY2xhc3M9XCJzZWxlY3RlZC1jYW1lcmEgYm9sZFwiPiR7YXBwLmxsKCdleHBlcnRNb2RlTW9kZWwnKX08L2g0PlxyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbHVtbnMgc21hbGwtMTIgbGFyZ2UtMyBtZWRpdW0tMyBcIj5cclxuXHRcdFx0XHRcdFx0XHQ8aDQgY2xhc3M9XCJzZWxlY3RlZC1jYW1lcmEgYm9sZFwiPiR7YXBwLmxsKCdleHBlcnRNb2RlUmVzb2x1dGlvbicpfTwvaDQ+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sdW1ucyBzbWFsbC0xMiBsYXJnZS0yIG1lZGl1bS0yXCI+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93IHRleHQtbGVmdFwiPlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2VwZXJhdG9yIHNtYWxsLTEyIGxhcmdlLTEyIG1lZGl1bS0xMiBib2xkIGNvbHVtbnNcIj48IS0tIGVtcHR5IGVsZW1lbnQgLS0+PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5gKTtcclxuXHJcblx0bXlyZXN1bHRzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcclxuXHRcdCRyZXN1bHRzLmFwcGVuZChgXHJcblx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWFpbkNvbHVtbiBjb2x1bW5zIHNtYWxsLTEyIGxhcmdlLTQgbWVkaXVtLTQgdGV4dC1sZWZ0XCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGVjZWxsXCI+XHJcblx0XHRcdFx0XHRcdDxoNCBjbGFzcz1cInNlbGVjdGVkLWNhbWVyYVwiPiR7di5jbmFtZX08L2g0PlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cIm1haW5Db2x1bW4gY29sdW1ucyBzbWFsbC0xMiBsYXJnZS0zIG1lZGl1bS0zIHRleHQtbGVmdFwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlY2VsbFwiPlxyXG5cdFx0XHRcdFx0XHQ8aDQgY2xhc3M9XCJzZWxlY3RlZC1tb2RlbFwiPiR7di5jbW9kZWx9PC9oND5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtYWluQ29sdW1uIGNvbHVtbnMgc21hbGwtMTIgbGFyZ2UtMyBtZWRpdW0tMyB0ZXh0LWxlZnRcIj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZWNlbGxcIj5cclxuXHRcdFx0XHRcdFx0PGg0IGNsYXNzPVwic2VsZWN0ZWQtcmVzb2x1dGlvblwiPiR7di5Ib3Jpem9udGFsUmVzb2x1dGlvbn0geCAke3YuVmVydGljYWxSZXNvbHV0aW9ufSAoJHt2LkFzcGVjdFJhdGlvfSk8L2g0PlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cIm1haW5Db2x1bW4gY29sdW1ucyBzbWFsbC0xMiBsYXJnZS0yIG1lZGl1bS0yIHRleHQtbGVmdFwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlY2VsbCB0ZXh0LWNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHQ8IS0tPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cIkxDLWljb24gaWNvbi1pbmZvLWFmdGVyIHJvdW5kZWQgZmxvYXQtbGVmdCBpbmZvQnV0dG9uXCI+PC9hPlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwib3ZlcmxheS1jb250YWluZXJcIj5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5mby1vdmVybGF5XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIGNsYXNzPVwiTEMtaWNvbiBpY29uLWNsb3NlLWFmdGVyXCI+PC9hPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGgxIGNsYXNzPVwiY2FtZXJhLWluZm8tdGl0bGVcIj48L2gxPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGltZyBjbGFzcz1cImNhbWVyYS1pbmZvLWltYWdlXCIgc3JjPVwiLi4vaW1nL2NhbWVyYS1kdW1teS5qcGdcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiY2FtZXJhLWluZm8tZGVzY3JpcHRpb25cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0U2l0IGFtZXQgY29uc2V0ZXR1ciBzYWRpbW1tcHNjaW5nIGVsaXRyLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9wPlxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbmZvLWFycm93XCI+PC9kaXY+XHJcblx0XHRcdFx0XHRcdDwvZGl2Pi0tPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGVjZWxsXCI+XHJcblx0XHRcdFx0XHRcdDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgYXR0ci1jbmFtZT1cIiR7di5jbmFtZX1cIiBhdHRyLWNtb2RlbD1cIiR7di5jbW9kZWx9XCIgYXR0ci1yZXM9XCIke3YuSG9yaXpvbnRhbFJlc29sdXRpb259eCR7di5WZXJ0aWNhbFJlc29sdXRpb259XCIgY2xhc3M9XCJMQy1pY29uIGljb24tYXJyb3dfcmlnaHQtYWZ0ZXIgYmlnIGZsb2F0LXJpZ2h0IGNhbWVyYVNlbGVjdGVkXCI+PC9hPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93IHRleHQtbGVmdFwiPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzZXBlcmF0b3Igc21hbGwtMTIgbGFyZ2UtMTIgbWVkaXVtLTEyIGNvbHVtbnNcIj48IS0tIGVtcHR5IGVsZW1lbnQgLS0+PC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0YCk7XHJcblx0fSk7XHJcblxyXG5cdCRyZXN1bHRzLm9uKCdjbGljaycsICcuY2FtZXJhU2VsZWN0ZWQnLCBmdW5jdGlvbiAoKSB7XHJcblxyXG5cdFx0YXBwLmN1cnJlbnQuZmFtaWx5ID0gJCh0aGlzKS5hdHRyKCdhdHRyLWNuYW1lJyk7XHJcblx0XHRhcHAuY3VycmVudC5tb2RlbCA9ICQodGhpcykuYXR0cignYXR0ci1jbW9kZWwnKTtcclxuXHRcdGFwcC5jdXJyZW50LnJlc29sdXRpb24gPSAkKHRoaXMpLmF0dHIoJ2F0dHItcmVzJyk7XHJcblx0XHRhcHAuY3VycmVudC5sZW5zID0gT2JqZWN0LmtleXMoYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldW2FwcC5jdXJyZW50Lm1vZGVsXVthcHAuY3VycmVudC5yZXNvbHV0aW9uXSlbMF07XHJcblxyXG5cdFx0aWYgKCFhcHAuY3VycmVudC5mYW1pbHkgfHwgIWFwcC5jdXJyZW50Lm1vZGVsIHx8ICFhcHAuY3VycmVudC5yZXNvbHV0aW9uKSB7IHJldHVybjsgfVxyXG5cdFx0YXBwLmVtaXQoJ2NhbWVyYUNoYW5nZScpO1xyXG5cdFx0YXBwLmNhbWVyYVNlbGVjdGVkKCk7XHJcblx0fSk7XHJcblxyXG5cdCRyZXN1bHRzLm9uKCdjbGljaycsICcuaW5mb0J1dHRvbicsIGZ1bmN0aW9uICgpIHtcclxuXHRcdCRkb20uZmluZChcIi5vdmVybGF5LWNvbnRhaW5lclwiKS5yZW1vdmVDbGFzcyhcInNob3dcIik7XHJcblx0XHQkKHRoaXMpLnNpYmxpbmdzKFwiLm92ZXJsYXktY29udGFpbmVyXCIpLmFkZENsYXNzKFwic2hvd1wiKTtcclxuXHR9KTtcclxuXHJcblx0JHJlc3VsdHMub24oJ2NsaWNrJywgJy5pY29uLWNsb3NlLWFmdGVyJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0JCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmVDbGFzcyhcInNob3dcIik7XHJcblx0fSk7XHJcbn1cclxuXHJcbnZhciB0ZW1wbGF0ZSA9IGBcclxuXHQ8ZGl2IGNsYXNzPVwicm93IHZlcnRpY2FsLXBhZGRpbmctYmlnXCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwic21hbGwtMTIgbGFyZ2UtMTIgbWVkaXVtLTEyIGNvbHVtbnNcIj5cclxuXHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJveCB0ZXh0LWNlbnRlclwiPlxyXG5cdFx0XHRcdDxoMT4ke2FwcC5sbCgnZ3VpZGVkTW9kZVRpdGxlJyl9PC9oMT5cclxuXHRcdFx0XHQ8aDQ+JHthcHAubGwoJ2d1aWRlZE1vZGVTdWJUaXRsZScpfTwvaDQ+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9kaXY+XHJcblx0PC9kaXY+XHJcblx0XHJcbmA7XHJcbnZhciB0ZW1wbGF0ZVJlc3VsdHMgPSBgXHJcblx0PGRpdiBjbGFzcz1cInNob3dSZXN1bHRzQnV0dG9uIG5vc2hvd1wiPlxyXG5cdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJveCBzbWFsbC0xMiBsYXJnZS0xMiBtZWRpdW0tMTIgY29sdW1uIHRleHQtY2VudGVyXCI+XHJcblx0XHRcdDxhIGNsYXNzPVwibGFyZ2UgYnV0dG9uXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGlkPVwiYnV0dG9uLXNob3ctY2FtZXJhbGlzdFwiPiR7YXBwLmxsKCdndWlkZWRNb2RlU2hvd1Jlc3VsdHMnKX08L2E+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHQ8ZGl2IGNsYXNzPVwic2hvd1Jlc3VsdHMgcm93XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxyXG5cdFx0PGRpdiBjbGFzcz1cImNvbHVtbnMgc21hbGwtMTIgbWVkaXVtLTEyIGxhcmdlLTEyIHRleHQtY2VudGVyIGVuZFwiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93IHZlcnRpY2FsLXBhZGRpbmctYmlnXCI+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJveCBzbWFsbC0xMiBsYXJnZS0xMiBtZWRpdW0tMTIgY29sdW1uIHRleHQtY2VudGVyXCI+XHJcblx0XHRcdFx0XHQ8aDU+JHthcHAubGwoJ2d1aWRlZE1vZGVTZWxlY3RMYWJlbCcpfTwvaDU+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cInJlc3VsdHNCb3ggcGFuZWwtYm94IHNtYWxsLTEyIGxhcmdlLTkgbWVkaXVtLTEyIGNvbHVtbiB0ZXh0LWNlbnRlciBzbWFsbC1jZW50ZXJlZCBcIj5cclxuXHRcdFx0XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9kaXY+XHJcblx0PC9kaXY+XHJcbmA7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYW1lcmFNZW51KHRpdGxlQ2hhbmdlKSB7XHJcblx0ZnVuY3Rpb24gcmVuZGVyVGl0bGUoKSB7XHJcblx0XHRpZiAoYXBwLmN1cnJlbnQuZmFtaWx5ID09PSAnT3RoZXJzJykge1xyXG5cdFx0XHRyZXR1cm4gYDxoMiBjbGFzcz0nJz4ke2FwcC5sbChcInNldHRpbmdzTW9kZVNlbGVjdG9yc0NhbWVyYVwiKX0mbmJzcDsmbmJzcDs8L2gyPjxzcGFuPiR7YXBwLmxsKFwic2V0dGluZ3NNb2RlVmlzdWFsQ2FtZXJhT3RoZXJcIil9PC9zcGFuPmA7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGA8aDIgY2xhc3M9Jyc+JHthcHAubGwoXCJzZXR0aW5nc01vZGVTZWxlY3RvcnNDYW1lcmFcIil9Jm5ic3A7Jm5ic3A7PC9oMj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtY2FtZXJhXCI+JHthcHAuY3VycmVudC5mYW1pbHl9Jm5ic3A7Jm5ic3A7fCZuYnNwOyZuYnNwOzwvc3Bhbj5cclxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cInNlbGVjdGVkLW1vZGVsXCI+JHthcHAuY3VycmVudC5tb2RlbH0mbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7PC9zcGFuPlxyXG5cdFx0XHRcdDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtcmVzb2x1dGlvblwiPiR7YXBwLmN1cnJlbnQucmVzb2x1dGlvbn0ke2FwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XVthcHAuY3VycmVudC5tb2RlbF1bYXBwLmN1cnJlbnQucmVzb2x1dGlvbl1bT2JqZWN0LmtleXMoYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldW2FwcC5jdXJyZW50Lm1vZGVsXVthcHAuY3VycmVudC5yZXNvbHV0aW9uXSlbMF1dLlJvdGF0ZWQgPyBcIiAoOTDCsCBpbWFnZSByb3RhdGlvbilcIiA6IFwiXCJ9PC9zcGFuPmA7XHJcblx0fVxyXG5cclxuXHR2YXIgJGRvbSA9ICQoYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTQgbWVkaXVtLTQgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPiR7YXBwLmxsKFwiZXhwZXJ0TW9kZUZhbWlseVwiKX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJjYW1lcmFGYW1pbHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTQgbWVkaXVtLTQgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FtU3dpdGNoTW9kZWxcIj4ke2FwcC5sbChcImV4cGVydE1vZGVNb2RlbFwiKX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJjYW1lcmFNb2RlbFwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbC0xMiBsYXJnZS00IG1lZGl1bS00IGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhbVN3aXRjaFJlc29sdXRpb25cIj4ke2FwcC5sbChcImV4cGVydE1vZGVSZXNvbHV0aW9uXCIpfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZWxlY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImNhbWVyYVJlc29sdXRpb25cIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cdCAgICA8L2Rpdj5cclxuICAgIGApO1xyXG5cclxuXHR2YXIgJGZhbWlseSA9ICRkb20uZmluZCgnc2VsZWN0LmNhbWVyYUZhbWlseScpO1xyXG5cdHZhciAkbW9kZWwgPSAkZG9tLmZpbmQoJ3NlbGVjdC5jYW1lcmFNb2RlbCcpO1xyXG5cdHZhciAkcmVzb2x1dGlvbiA9ICRkb20uZmluZCgnc2VsZWN0LmNhbWVyYVJlc29sdXRpb24nKTtcclxuXHJcblx0d2luZG93LnRlc3QgPSAkZmFtaWx5O1xyXG5cclxuXHQkZmFtaWx5LnNlbGVjdDIoe1xyXG5cdFx0c2VsZWN0T25DbG9zZTogdHJ1ZSxcclxuXHRcdG1hdGNoZXI6IHdpbmRvdy5zZWxlY3QyY3VzdG9tbWF0Y2hlclxyXG5cdH0pO1xyXG5cclxuXHQkbW9kZWwuc2VsZWN0Mih7XHJcblx0XHRzZWxlY3RPbkNsb3NlOiB0cnVlLFxyXG5cdFx0bWF0Y2hlcjogd2luZG93LnNlbGVjdDJjdXN0b21tYXRjaGVyXHJcblx0fSk7XHJcblx0JHJlc29sdXRpb24uc2VsZWN0Mih7XHJcblx0XHRzZWxlY3RPbkNsb3NlOiB0cnVlLFxyXG5cdFx0bWF0Y2hlcjogd2luZG93LnNlbGVjdDJjdXN0b21tYXRjaGVyXHJcblx0fSk7XHJcblxyXG5cdGZvciAodmFyIGtleSBpbiBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0KSB7XHJcblx0XHQkZmFtaWx5LmFwcGVuZChgPG9wdGlvbiB2YWx1ZT0nJHtrZXl9Jz4ke2tleX08L29wdGlvbj5gKTtcclxuXHR9XHJcblx0ZnVuY3Rpb24gcmVuZGVyRHJvcGRvd24oKSB7XHJcblx0XHQkZmFtaWx5LnZhbChhcHAuY3VycmVudC5mYW1pbHkpO1xyXG5cclxuXHRcdGlmIChhcHAuY3VycmVudC5mYW1pbHkgPT09ICdPdGhlcnMnKSB7XHJcblx0XHRcdCRkb20uZmluZCgnLmNhbVN3aXRjaE1vZGVsJykudGV4dChhcHAubGwoJ2V4cGVydE1vZGVPdGhlcnNSZXNvbHV0aW9uJykpOyBcclxuXHRcdFx0JGRvbS5maW5kKCcuY2FtU3dpdGNoUmVzb2x1dGlvbicpLnRleHQoYXBwLmxsKCdleHBlcnRNb2RlT3RoZXJzU2Vuc29yU2l6ZScpKTtcclxuXHJcblx0XHRcdCRtb2RlbC5odG1sKCcnKTtcclxuXHRcdFx0YXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldLnJlc29sdXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHYsIGkpIHtcclxuXHRcdFx0XHRpZiAoIWFwcC5jdXJyZW50Lm1vZGVsKSB7IGFwcC5jdXJyZW50Lm1vZGVsID0gaTsgfVxyXG5cdFx0XHRcdCRtb2RlbC5hcHBlbmQoYDxvcHRpb24gdmFsdWU9JyR7aX0nPiR7di5ob3JSZXN9IHggJHt2LnZlclJlc30gKCR7di5yYXRpb30pPC9vcHRpb24+YCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHQkbW9kZWwudmFsKGFwcC5jdXJyZW50Lm1vZGVsKTtcclxuXHJcblx0XHRcdCRyZXNvbHV0aW9uLmh0bWwoJycpO1xyXG5cdFx0XHRhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W2FwcC5jdXJyZW50LmZhbWlseV0uc2Vuc29yLmZvckVhY2goZnVuY3Rpb24gKHYsIGkpIHtcclxuXHRcdFx0XHRpZiAoIWFwcC5jdXJyZW50LnJlc29sdXRpb24pIHsgYXBwLmN1cnJlbnQucmVzb2x1dGlvbiA9IGk7IH1cclxuXHRcdFx0XHQkcmVzb2x1dGlvbi5hcHBlbmQoYDxvcHRpb24gdmFsdWU9JyR7aX0nPiR7di5zaXplfTwvb3B0aW9uPmApO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0JHJlc29sdXRpb24udmFsKGFwcC5jdXJyZW50LnJlc29sdXRpb24pO1xyXG5cdFx0XHR0aXRsZUNoYW5nZShyZW5kZXJUaXRsZSgpKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0JGRvbS5maW5kKCcuY2FtU3dpdGNoTW9kZWwnKS50ZXh0KGFwcC5sbCgnZXhwZXJ0TW9kZU1vZGVsJykpO1xyXG5cdFx0JGRvbS5maW5kKCcuY2FtU3dpdGNoUmVzb2x1dGlvbicpLnRleHQoYXBwLmxsKCdleHBlcnRNb2RlUmVzb2x1dGlvbicpKTtcclxuXHJcblx0XHQkbW9kZWwuaHRtbCgnJyk7XHJcblx0XHRmb3IgKHZhciBrZXkgaW4gYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldKSB7XHJcblx0XHRcdGlmICghYXBwLmN1cnJlbnQubW9kZWwpIHsgYXBwLmN1cnJlbnQubW9kZWwgPSBrZXk7IH1cclxuXHRcdFx0JG1vZGVsLmFwcGVuZChgPG9wdGlvbiB2YWx1ZT0nJHtrZXl9Jz4ke2tleX08L29wdGlvbj5gKTtcclxuXHRcdH1cclxuXHRcdCRtb2RlbC52YWwoYXBwLmN1cnJlbnQubW9kZWwpO1xyXG5cclxuXHRcdCRyZXNvbHV0aW9uLmh0bWwoJycpO1xyXG5cdFx0Zm9yICh2YXIga2V5IGluIGFwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XVthcHAuY3VycmVudC5tb2RlbF0pIHtcclxuXHRcdFx0aWYgKCFhcHAuY3VycmVudC5yZXNvbHV0aW9uKSB7IGFwcC5jdXJyZW50LnJlc29sdXRpb24gPSBrZXk7IH1cclxuXHRcdFx0dmFyIGlzUm90YXRlZCA9IGFwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XVthcHAuY3VycmVudC5tb2RlbF1ba2V5XVtPYmplY3Qua2V5cyhhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W2FwcC5jdXJyZW50LmZhbWlseV1bYXBwLmN1cnJlbnQubW9kZWxdW2tleV0pWzBdXS5Sb3RhdGVkO1xyXG5cdFx0XHQkcmVzb2x1dGlvbi5hcHBlbmQoYDxvcHRpb24gdmFsdWU9JyR7a2V5fSc+JHtrZXl9JHtpc1JvdGF0ZWQgPyBcIiAoOTDCsCBpbWFnZSByb3RhdGlvbilcIiA6IFwiXCJ9PC9vcHRpb24+YCk7XHJcblx0XHR9XHJcblx0XHQkcmVzb2x1dGlvbi52YWwoYXBwLmN1cnJlbnQucmVzb2x1dGlvbik7XHJcblx0XHR0aXRsZUNoYW5nZShyZW5kZXJUaXRsZSgpKTtcclxuXHJcblx0XHQkZmFtaWx5LnZhbChhcHAuY3VycmVudC5mYW1pbHkpLnRyaWdnZXIoJ2NoYW5nZS5zZWxlY3QyJyk7XHJcblx0XHQkbW9kZWwudmFsKGFwcC5jdXJyZW50Lm1vZGVsKS50cmlnZ2VyKCdjaGFuZ2Uuc2VsZWN0MicpO1xyXG5cdFx0JHJlc29sdXRpb24udmFsKGFwcC5jdXJyZW50LnJlc29sdXRpb24pLnRyaWdnZXIoJ2NoYW5nZS5zZWxlY3QyJyk7XHJcblx0fVxyXG5cdHJlbmRlckRyb3Bkb3duKCk7XHJcblx0XHJcblxyXG5cdCRkb20uZmluZCgnc2VsZWN0LmNhbWVyYUZhbWlseScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0YXBwLmN1cnJlbnQuZmlsdGVyID0gdW5kZWZpbmVkO1xyXG5cdFx0YXBwLmN1cnJlbnQuY3R5cGUgPSB1bmRlZmluZWQ7XHJcblx0XHRhcHAuY3VycmVudC5mYW1pbHkgPSAkKHRoaXMpLnZhbCgpXHJcblx0XHRhcHAuY3VycmVudC5tb2RlbCA9IG51bGw7XHJcblx0XHRhcHAuY3VycmVudC5yZXNvbHV0aW9uID0gbnVsbDtcclxuXHRcdGFwcC5lbWl0KCdjYW1lcmFDaGFuZ2UnKTtcclxuXHRcdHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG5cdH0pO1xyXG5cclxuXHQkZG9tLmZpbmQoJ3NlbGVjdC5jYW1lcmFNb2RlbCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0YXBwLmN1cnJlbnQubW9kZWwgPSAkKHRoaXMpLnZhbCgpXHJcblx0XHRhcHAuY3VycmVudC5yZXNvbHV0aW9uID0gbnVsbDtcclxuXHRcdGFwcC5lbWl0KCdjYW1lcmFDaGFuZ2UnKTtcclxuXHRcdHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG5cdH0pO1xyXG5cclxuXHQkZG9tLmZpbmQoJ3NlbGVjdC5jYW1lcmFSZXNvbHV0aW9uJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRhcHAuY3VycmVudC5yZXNvbHV0aW9uID0gJCh0aGlzKS52YWwoKTtcclxuXHRcdGFwcC5lbWl0KCdjYW1lcmFDaGFuZ2UnKTtcclxuXHRcdHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG5cdH0pO1xyXG5cdGFwcC5vbignY2FtZXJhQ2hhbmdlJywgcmVuZGVyRHJvcGRvd24pO1xyXG5cdHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG5cclxuXHRyZXR1cm4gJGRvbVxyXG59IiwiY29uc3QgU2xpZGVyID0gcmVxdWlyZSgnLi8uLi9zbmlwcGV0cy9zbGlkZXIuanMnKTtcclxuXHJcbmNvbnN0IEhVTUFOX0hFSUdIVCA9IDEuNyxcclxuICAgIEhVTUFOX1dJRFRIID0gMC41O1xyXG5cclxuZnVuY3Rpb24gcmFkVG9EZWcobnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbnVtYmVyICogMTgwIC8gTWF0aC5QSTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVnVG9SYWQobnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbnVtYmVyICogTWF0aC5QSSAvIDE4MDtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWVsZE1lbnUodGl0bGVDaGFuZ2UpIHtcclxuICAgIGFwcC5jdXJyZW50LmNhbWVyYUhlaWdodCA9IDQ7XHJcbiAgICBhcHAuY3VycmVudC5jYW1UaWx0ID0gMzA7XHJcblxyXG4gICAgZnVuY3Rpb24gcmVuZGVyVGl0bGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIGA8aDIgY2xhc3M9J2FxdWEnPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1YnKX0mbmJzcDsmbmJzcDs8L2gyPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3RlZC1jYW1lcmFcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzRk9WQ2FtSGVpZ2h0Jyl9OiAke2FwcC5pRnRGKGFwcC5jdXJyZW50LmNhbWVyYUhlaWdodCkudG9GaXhlZCgyKX0gJHthcHAudW5pdFN5bWJvbCgpfSB8IHRpbHQ6ICR7YXBwLmN1cnJlbnQuY2FtVGlsdC50b0ZpeGVkKDIpfcKwPC9zcGFuPmBcclxuICAgIH1cclxuICAgIHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG4gICAgdmFyIHR5cGVzID0ge1xyXG4gICAgICAgIG5vbnBhbm86IGBcclxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzbWFsbC0xMiBsYXJnZS0xMiBtZWRpdW0tMTIgY29sdW1uc1wiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJveCBjYW1lcmFIZWlnaHRcIj5cclxuXHRcdFx0XHRcdFx0PHA+JHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0ZPVkNhbUhlaWdodCcpfSAoJHthcHAudW5pdFN5bWJvbCgpfSk8L3A+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDxwIGNsYXNzPVwiYXBwbHlPbmVUZXh0XCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZUZpZWxkU2V0T25lT2YnKX08L3A+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzbWFsbC0xMiBsYXJnZS0zIG1lZGl1bS02IGNvbHVtbnMgcmVsYXRpdmVcIj5cclxuXHRcdFx0XHRcdFx0XHQ8cCBjbGFzcz1cInJlc29sdXRpb25MYWJlbCBhbGlnbmVkXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0ZPVk1pblJlc29sdXRpb24nKX0gKHBwJHthcHAudW5pdFN5bWJvbCgpfSk8L3A+XHJcblx0XHRcdFx0XHRcdFx0PGEgY2xhc3M9XCJpbmZvQnV0dG9uXCIgZGF0YS1vcGVuPVwiZmllbGRNT3B0aW9uMVwiPjwvYT5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmV2ZWFsXCIgaWQ9XCJmaWVsZE1PcHRpb24xXCIgZGF0YS1yZXZlYWw+XHJcblx0XHRcdFx0XHRcdFx0XHQke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzRk9WTWluUmVzb2x1dGlvbkluZm8nKX1cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIGRhdGEtY2xvc2UgYXJpYS1sYWJlbD1cIkNsb3NlIG1vZGFsXCIgdHlwZT1cImJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZmllbGRNZW51UmVzb2x1dGlvblwiIGNsYXNzPVwiZmllbGRNZW51UmVzb2x1dGlvblwiLz5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzbWFsbC0xMiBsYXJnZS0zIG1lZGl1bS02IGNvbHVtbnMgcmVsYXRpdmVcIj5cclxuXHRcdFx0XHRcdFx0XHQ8cCBjbGFzcz1cImRpc3RhbmNlTGFiZWwgYWxpZ25lZFwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZNYXhPYmplY3REaXN0YW5jZScpfSAoJHthcHAudW5pdFN5bWJvbCgpfSk8L3A+XHJcblx0XHRcdFx0XHRcdFx0PGEgY2xhc3M9XCJpbmZvQnV0dG9uXCIgZGF0YS1vcGVuPVwiZmllbGRNT3B0aW9uMlwiPjwvYT5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmV2ZWFsXCIgaWQ9XCJmaWVsZE1PcHRpb24yXCIgZGF0YS1yZXZlYWw+XHJcblx0XHRcdFx0XHRcdFx0XHQke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzRk9WTWF4T2JqZWN0RGlzdGFuY2VJbmZvJyl9XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiBkYXRhLWNsb3NlIGFyaWEtbGFiZWw9XCJDbG9zZSBtb2RhbFwiIHR5cGU9XCJidXR0b25cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9idXR0b24+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImZpZWxkTWVudURpc3RhbmNlXCIgY2xhc3M9XCJmaWVsZE1lbnVEaXN0YW5jZVwiLz5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzbWFsbC0xMiBsYXJnZS0zIG1lZGl1bS02IGNvbHVtbnMgcmVsYXRpdmVcIj5cclxuXHRcdFx0XHRcdFx0XHQ8cCBjbGFzcz1cImNob3JkTGFiZWwgYWxpZ25lZFwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZIb3Jpem9udGFsV2lkdGgnKX0gKCR7YXBwLnVuaXRTeW1ib2woKX0pPC9wPlxyXG5cdFx0XHRcdFx0XHRcdDxhIGNsYXNzPVwiaW5mb0J1dHRvblwiIGRhdGEtb3Blbj1cImZpZWxkTU9wdGlvbjNcIj48L2E+XHJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJldmVhbFwiIGlkPVwiZmllbGRNT3B0aW9uM1wiIGRhdGEtcmV2ZWFsPlxyXG5cdFx0XHRcdFx0XHRcdFx0JHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0ZPVkhvcml6b250YWxXaWR0aEluZm8nKX1cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIGRhdGEtY2xvc2UgYXJpYS1sYWJlbD1cIkNsb3NlIG1vZGFsXCIgdHlwZT1cImJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiZmllbGRNZW51Q2hvcmRcIiBjbGFzcz1cImZpZWxkTWVudUNob3JkXCIvPlxyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTMgbWVkaXVtLTYgY29sdW1ucyByZWxhdGl2ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiYW5nbGVMYWJlbCBhbGlnbmVkXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0ZPVkNhbUFuZ2xlJyl9ICjCsCk8L3A+XHJcblx0XHRcdFx0XHRcdFx0PGEgY2xhc3M9XCJpbmZvQnV0dG9uXCIgZGF0YS1vcGVuPVwiZmllbGRNT3B0aW9uNFwiPjwvYT5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmV2ZWFsXCIgaWQ9XCJmaWVsZE1PcHRpb240XCIgZGF0YS1yZXZlYWw+XHJcblx0XHRcdFx0XHRcdFx0XHQke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzRk9WQ2FtQW5nbGVJbmZvJyl9XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiBkYXRhLWNsb3NlIGFyaWEtbGFiZWw9XCJDbG9zZSBtb2RhbFwiIHR5cGU9XCJidXR0b25cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9idXR0b24+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0PGlucHV0IHN0eWxlPVwibWFyZ2luLWJvdHRvbTowO1wiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImZpZWxkTWVudUFuZ2xlXCIgY2xhc3M9XCJmaWVsZE1lbnVBbmdsZVwiLz5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sdW1ucyBzbWFsbC0xMiBtZWRpdW0tMTIgbGFyZ2UtMTIgdGV4dC1jZW50ZXJcIj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib3ggc21hbGwtMTIgbGFyZ2UtMTIgbWVkaXVtLTEyIGNvbHVtbiB0ZXh0LWNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHQ8IS0tPGEgY2xhc3M9XCJzYXZlQnV0dG9uIGxhcmdlIGJ1dHRvblwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCI+U2F2ZTwvYT4tLT5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGwtMTIgbGFyZ2UtMTIgbWVkaXVtLTEyIGNvbHVtbnMgZmllbGRNV2FybmluZ1wiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIiBjbGFzcz1cIndhcm5pbmcgTEMtaWNvbiBpY29uLWFsZXJ0LWJlZm9yZSBuby1ob3ZlclwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVPdmVySG9yaXpvbldhcm5pbmcnKX08L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG5cdFx0YCxcclxuICAgICAgICBwYW5vOiBgXHJcblx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic21hbGwtMTIgbGFyZ2UtNiBtZWRpdW0tNiBjb2x1bW5zXCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94XCI+XHJcblx0XHRcdFx0XHRcdDxwPk1vdW50aW5nIFBvc2l0aW9uPC9wPlxyXG5cdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJzZWxlY3RcIj5cclxuXHRcdFx0XHRcdFx0XHQ8c2VsZWN0IGNsYXNzPVwibWVudUZpZWxkTW91bnRQb3NcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxvcHRpb24gdmFsPVwiQ2VpbGluZ1wiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZDZWlsaW5nJyl9PC9vcHRpb24+XHJcblx0XHRcdFx0XHRcdFx0XHQ8b3B0aW9uIHZhbD1cIldhbGxcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzRk9WV2FsbCcpfTwvb3B0aW9uPlxyXG5cdFx0XHRcdFx0XHRcdDwvc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHQ8L2xhYmVsPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTYgbWVkaXVtLTYgY29sdW1uc1wiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJveCBjYW1lcmFIZWlnaHRcIj5cclxuXHRcdFx0XHRcdFx0PHA+JHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0ZPVkNhbUhlaWdodCcpfSAoJHthcHAudW5pdFN5bWJvbCgpfSk8L3A+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8IS0tPGRpdiBjbGFzcz1cImNvbHVtbnMgc21hbGwtMTIgbWVkaXVtLTEyIGxhcmdlLTEyIHRleHQtY2VudGVyXCI+XHJcblx0XHRcdFx0XHQ8cCBjbGFzcz1cImFwcGx5T25lVGV4dFwiPlNldCBvbmUgb2YgdGhlIGZvbGxvd2luZzwvcD5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImxhcmdlLTMgc2hvdy1mb3ItbGFyZ2UtdXAgY29sdW1uc1wiPlxyXG5cdFx0XHRcdFx0XHRcdCZuYnNwO1xyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTMgbWVkaXVtLTYgY29sdW1uc1wiPlxyXG5cdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiZGlzdGFuY2VMYWJlbFwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZNYXhPYmplY3REaXN0YW5jZScpfSAoJHthcHAudW5pdFN5bWJvbCgpfSk8L3A+XHJcblx0XHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImZpZWxkTWVudURpc3RhbmNlXCIgY2xhc3M9XCJmaWVsZE1lbnVEaXN0YW5jZVwiLz5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzbWFsbC0xMiBsYXJnZS0zIG1lZGl1bS02IGNvbHVtbnNcIj5cclxuXHRcdFx0XHRcdFx0XHQ8cCBjbGFzcz1cInJlc29sdXRpb25MYWJlbFwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZNaW5SZXNvbHV0aW9uJyl9IChwcCR7YXBwLnVuaXRTeW1ib2woKX0pPC9wPlxyXG5cdFx0XHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJmaWVsZE1lbnVSZXNvbHV0aW9uXCIgY2xhc3M9XCJmaWVsZE1lbnVSZXNvbHV0aW9uXCIvPlxyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImxhcmdlLTMgc2hvdy1mb3ItbGFyZ2UtdXAgY29sdW1uc1wiPlxyXG5cdFx0XHRcdFx0XHRcdCZuYnNwO1xyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvZGl2Pi0tPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2x1bW5zIHNtYWxsLTEyIG1lZGl1bS0xMiBsYXJnZS0xMiB0ZXh0LWNlbnRlclwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJveCBzbWFsbC0xMiBsYXJnZS0xMiBtZWRpdW0tMTIgY29sdW1uIHRleHQtY2VudGVyXCI+XHJcblx0XHRcdFx0XHRcdDwhLS08YSBjbGFzcz1cInNhdmVCdXR0b24gbGFyZ2UgYnV0dG9uXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIj5TYXZlPC9hPi0tPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cdFx0YFxyXG4gICAgfVxyXG4gICAgdmFyICRkb207XHJcbiAgICB2YXIgd2FzSW5pdCA9IGZhbHNlO1xyXG4gICAgdmFyIHNsaWRlcjtcclxuXHJcbiAgICBhcHAub24oJ3VuaXRDaGFuZ2UnLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgIHNsaWRlci4kaXRlbS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgaWYgKGFwcC5nZXRSYXdEYXRhKCkuY3R5cGUgPT09ICdwYW5vJykge1xyXG4gICAgICAgICAgICAkZG9tLmZpbmQoJy5jYW1lcmFIZWlnaHQgcCcpLnRleHQoYCR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZDYW1IZWlnaHQnKX0gKCR7YXBwLnVuaXRTeW1ib2woKX0pYCk7XHJcbiAgICAgICAgICAgICRkb20uZmluZCgnLmRpc3RhbmNlTGFiZWwnKS50ZXh0KGAke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzRk9WTWF4T2JqZWN0RGlzdGFuY2UnKX0gKCR7YXBwLnVuaXRTeW1ib2woKX0pYCk7XHJcbiAgICAgICAgICAgICRkb20uZmluZCgnLnJlc29sdXRpb25MYWJlbCcpLnRleHQoYCR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZNaW5SZXNvbHV0aW9uJyl9IChwcCR7YXBwLnVuaXRTeW1ib2woKX0pYCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICRkb20uZmluZCgnLmNhbWVyYUhlaWdodCBwJykudGV4dChgJHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0ZPVkNhbUhlaWdodCcpfSAoJHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuICAgICAgICAgICAgJGRvbS5maW5kKCcuZGlzdGFuY2VMYWJlbCcpLnRleHQoYCR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZNYXhPYmplY3REaXN0YW5jZScpfSAoJHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuICAgICAgICAgICAgJGRvbS5maW5kKCcucmVzb2x1dGlvbkxhYmVsJykudGV4dChgJHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0ZPVk1pblJlc29sdXRpb24nKX0gKHBwJHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuICAgICAgICAgICAgJGRvbS5maW5kKCcuY2hvcmRMYWJlbCcpLnRleHQoYCR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZIb3Jpem9udGFsV2lkdGgnKX0gKCR7YXBwLnVuaXRTeW1ib2woKX0pYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjcmVhdGVTbGlkZXIoKTtcclxuICAgICAgICB0aXRsZUNoYW5nZShyZW5kZXJUaXRsZSgpKTtcclxuICAgIH0pO1xyXG4gICAgdmFyIHVwZGF0ZVRob3NlVmFsdWVzRnVuY3Rpb247XHJcblxyXG4gICAgZnVuY3Rpb24gY3JlYXRlU2xpZGVyKCkge1xyXG4gICAgICAgIHNsaWRlciA9IG5ldyBTbGlkZXIoJGRvbS5maW5kKCcuY2FtZXJhSGVpZ2h0JyksIGFwcC5pRnRGKDIpLCBhcHAuaUZ0RigyNSksIGFwcC5pRnRGKGFwcC5jdXJyZW50LmNhbWVyYUhlaWdodCksIDEwLCBmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICBhcHAuY3VycmVudC5jYW1lcmFIZWlnaHQgPSBhcHAuaUZmRih2KTtcclxuICAgICAgICAgICAgaWYgKHVwZGF0ZVRob3NlVmFsdWVzRnVuY3Rpb24pIHsgdXBkYXRlVGhvc2VWYWx1ZXNGdW5jdGlvbigpOyB9XHJcbiAgICAgICAgICAgIHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcC5vbignY2FtZXJhQ2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh1cGRhdGVUaG9zZVZhbHVlc0Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICRkb20uZmluZCgnLmZpZWxkTWVudVJlc29sdXRpb24nKS52YWwoYXBwLmlGdEYoMjUpKTtcclxuICAgICAgICAgICAgdXBkYXRlVGhvc2VWYWx1ZXNGdW5jdGlvbigncmVzb2x1dGlvbicsIDI1KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIGFwcC5vbignbGVuc0NoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodXBkYXRlVGhvc2VWYWx1ZXNGdW5jdGlvbikge1xyXG4gICAgICAgICAgICAkZG9tLmZpbmQoJy5maWVsZE1lbnVSZXNvbHV0aW9uJykudmFsKGFwcC5pRnRGKDI1KSlcclxuICAgICAgICAgICAgdXBkYXRlVGhvc2VWYWx1ZXNGdW5jdGlvbigncmVzb2x1dGlvbicsIDI1KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBjcmVhdGUoKSB7XHJcbiAgICAgICAgaWYgKCRkb20pIHtcclxuICAgICAgICAgICAgJGRvbS5odG1sKCcnKTtcclxuICAgICAgICAgICAgd2FzSW5pdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZSAoYXBwLmN1cnJlbnQubW91bnRwb3NpdGlvbik7XHJcbiAgICAgICAgaWYgKGFwcC5nZXRSYXdEYXRhKCkuY3R5cGUgPT09ICdwYW5vJykge1xyXG4gICAgICAgICAgICBpZiAod2FzSW5pdCkge1xyXG4gICAgICAgICAgICAgICAgLy8gJGRvbS5yZXBsYWNlaHRtbFdpdGgoJCh0eXBlcy5wYW5vKS5jaGlsZHJlbigpKTtcclxuICAgICAgICAgICAgICAgICRkb20uaHRtbCgkKHR5cGVzLnBhbm8pLmNoaWxkcmVuKCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJGRvbSA9ICQodHlwZXMucGFubyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3JlYXRlU2xpZGVyKCk7XHJcblxyXG4gICAgICAgICAgICAkZG9tLmZpbmQoJy5tZW51RmllbGRNb3VudFBvcycpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBhcHAuY3VycmVudC5tb3VudHBvc2l0aW9uID0gJCh0aGlzKS52YWwoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGFwcC5jdXJyZW50Lm1vdW50cG9zaXRpb24gPSBcIkNlaWxpbmdcIjtcclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbW1lbnRlZE91dCgpIHtcclxuICAgICAgICAgICAgICAgIC8vICRkb20uZmluZCgnLmZpZWxkTWVudURpc3RhbmNlJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBcdC8vZnVydGhlciBDYWxjdWxhdGlvbnMgaGVyZSFcclxuICAgICAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICAgICAgLy8gJGRvbS5maW5kKCcuZmllbGRNZW51RGlzdGFuY2UnKS5jc3MoeyAncG9pbnRlci1ldmVudHMnOiAnbm9uZScsICdiYWNrZ3JvdW5kLWNvbG9yJzogJ2dyZXknIH0pO1xyXG4gICAgICAgICAgICAgICAgLy8gJGRvbS5maW5kKCcuZmllbGRNZW51UmVzb2x1dGlvbicpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gXHQvL2Z1cnRoZXIgQ2FsY3VsYXRpb25zIGhlcmUhXHJcbiAgICAgICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgICAgICAgIC8vICRkb20uZmluZCgnLmZpZWxkTWVudVJlc29sdXRpb24nKS5jc3MoeyAncG9pbnRlci1ldmVudHMnOiAnbm9uZScsICdiYWNrZ3JvdW5kLWNvbG9yJzogJ2dyZXknIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHNldFZhbHVlcygnYW5nbGUnLCBhcHAuY3VycmVudC5jYW1UaWx0KTtcclxuICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHNldFZhbHVlcyhvcmlnaW4sIHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBcdHZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgLy8gXHR2YXIgcmF3ID0gYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldW2FwcC5jdXJyZW50Lm1vZGVsXVthcHAuY3VycmVudC5yZXNvbHV0aW9uXVthcHAuY3VycmVudC5sZW5zXTtcclxuICAgICAgICAgICAgICAgIC8vIFx0dmFyIGZvdl92ZXIgPSBOdW1iZXIucGFyc2VGbG9hdChhcHAuY3VycmVudC5mb3ZfdmVyIHx8IHJhdy5WRk9WbWluKTtcclxuICAgICAgICAgICAgICAgIC8vIFx0dmFyIGZvdl9ob3IgPSBOdW1iZXIucGFyc2VGbG9hdChhcHAuY3VycmVudC5mb3ZfaG9yIHx8IHJhdy5IRk9WbWluKTtcclxuICAgICAgICAgICAgICAgIC8vIFx0dmFyIHJlc19ob3IgPSBOdW1iZXIucGFyc2VGbG9hdChyYXcuSG9yaXpvbnRhbFJlc29sdXRpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFx0dmFyIGRpc3RhbmNlLCByZXNvbHV0aW9uO1xyXG4gICAgICAgICAgICAgICAgLy8gXHRjb25zb2xlLmxvZygnZGlkJywgb3JpZ2luLCB2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gXHRzd2l0Y2ggKG9yaWdpbikge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFx0XHRjYXNlICdkaXN0YW5jZSc6XHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0XHRkaXN0YW5jZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgLy8gXHRcdFx0YW5nbGUgPSAocmFkVG9EZWcoTWF0aC5hdGFuKHZhbHVlIC8gYXBwLmN1cnJlbnQuY2FtZXJhSGVpZ2h0KSkgLSA5MCAtIChmb3ZfdmVyIC8gMikpICogLTE7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gXHRcdFx0Y2hvcmQgPSAyICogZGlzdGFuY2UgKiBNYXRoLnRhbihkZWdUb1JhZChmb3ZfaG9yIC8gMikpO1xyXG4gICAgICAgICAgICAgICAgLy8gXHRcdFx0cmVzb2x1dGlvbiA9IHJlc19ob3IgLyAoMiAqIGRpc3RhbmNlICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAvIDIpKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0XHRicmVhaztcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRjYXNlICdyZXNvbHV0aW9uJzpcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRcdHJlc29sdXRpb24gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRcdGRpc3RhbmNlID0gcmVzX2hvciAvICh2YWx1ZSAqIDIgKiBNYXRoLnRhbihkZWdUb1JhZChmb3ZfaG9yIC8gMikpKTtcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRcdGFuZ2xlID0gKHJhZFRvRGVnKE1hdGguYXRhbihkaXN0YW5jZSAvIGFwcC5jdXJyZW50LmNhbWVyYUhlaWdodCkpIC0gOTAgLSAoZm92X3ZlciAvIDIpKSAqIC0xO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFx0XHRcdGNob3JkID0gMiAqIGRpc3RhbmNlICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAvIDIpKTtcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRcdGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgLy8gXHR9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gXHRjb25zb2xlLmxvZygnaGF2ZScsIGFuZ2xlLCBkaXN0YW5jZSwgcmVzb2x1dGlvbiwgY2hvcmQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFx0aWYgKG9yaWdpbiAhPT0gJ2Rpc3RhbmNlJykgeyAkZG9tLmZpbmQoJy5maWVsZE1lbnVEaXN0YW5jZScpLnZhbChkaXN0YW5jZS50b0ZpeGVkKDIpKTsgfVxyXG4gICAgICAgICAgICAgICAgLy8gXHRpZiAob3JpZ2luICE9PSAncmVzb2x1dGlvbicpIHsgJGRvbS5maW5kKCcuZmllbGRNZW51UmVzb2x1dGlvbicpLnZhbChyZXNvbHV0aW9uLnRvRml4ZWQoMikpOyB9XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICRkb207XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2FzSW5pdCkge1xyXG4gICAgICAgICAgICAkZG9tLmh0bWwoJCh0eXBlcy5ub25wYW5vKS5jaGlsZHJlbigpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkZG9tID0gJCh0eXBlcy5ub25wYW5vKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY3JlYXRlU2xpZGVyKCk7XHJcbiAgICAgICAgJGRvbS5maW5kKCcuZmllbGRNZW51QW5nbGUnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgc2V0VmFsdWVzKCdhbmdsZScsICQodGhpcykudmFsKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICRkb20uZmluZCgnLmZpZWxkTWVudURpc3RhbmNlJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgICAgIHNldFZhbHVlcygnZGlzdGFuY2UnLCBhcHAuaUZmRigkKHRoaXMpLnZhbCgpKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJGRvbS5maW5kKCcuZmllbGRNZW51UmVzb2x1dGlvbicpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAodikge1xyXG4gICAgICAgICAgICBzZXRWYWx1ZXMoJ3Jlc29sdXRpb24nLCBhcHAuaUZmRigkKHRoaXMpLnZhbCgpKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJGRvbS5maW5kKCcuZmllbGRNZW51Q2hvcmQnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICAgICAgc2V0VmFsdWVzKCdjaG9yZCcsIGFwcC5pRmZGKCQodGhpcykudmFsKCkpKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJGRvbS5maW5kKCcuZmllbGRNZW51QW5nbGUnKS52YWwoYXBwLmN1cnJlbnQuY2FtVGlsdCk7XHJcbiAgICAgICAgc2V0VmFsdWVzKCdyZXNvbHV0aW9uJywgYXBwLmdldFJhd0RhdGEoKS5UaGVybWFsID8gMyA6IDI1KTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gc2V0VmFsdWVzKG9yaWdpbiwgdmFsdWUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHZhciByYXcgPSBhcHAuZ2V0UmF3RGF0YSgpO1xyXG4gICAgICAgICAgICB2YXIgZm92X3ZlciA9IE51bWJlci5wYXJzZUZsb2F0KGFwcC5jdXJyZW50LmZvdl92ZXIgfHwgcmF3LlZGT1ZtaW4pO1xyXG4gICAgICAgICAgICB2YXIgZm92X2hvciA9IE51bWJlci5wYXJzZUZsb2F0KGFwcC5jdXJyZW50LmZvdl9ob3IgfHwgcmF3LkhGT1ZtaW4pO1xyXG4gICAgICAgICAgICB2YXIgcmVzX2hvciA9IE51bWJlci5wYXJzZUZsb2F0KHJhdy5Ib3Jpem9udGFsUmVzb2x1dGlvbik7XHJcblxyXG4gICAgICAgICAgICB2YXIgYW5nbGUsIGRpc3RhbmNlLCByZXNvbHV0aW9uLCBjaG9yZDtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAob3JpZ2luKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdhbmdsZSc6XHJcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRtYXggPSBhcHAuY3VycmVudC5jYW1lcmFIZWlnaHQgKiBNYXRoLnRhbihkZWdUb1JhZCg5MCAtIGFuZ2xlICsgKGZvdl92ZXIgKiAuNSkpKTtcclxuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IChhcHAuY3VycmVudC5jYW1lcmFIZWlnaHQgLSBIVU1BTl9IRUlHSFQpICogTWF0aC50YW4oZGVnVG9SYWQoOTAgLSBhbmdsZSArIGZvdl92ZXIgLyAyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hvcmQgPSAyICogZG1heCAqIE1hdGgudGFuKGRlZ1RvUmFkKGZvdl9ob3IgLyAyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IHJlc19ob3IgLyAoMiAqIGRtYXggKiBNYXRoLnRhbihkZWdUb1JhZChmb3ZfaG9yIC8gMikpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc3RhbmNlJzpcclxuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZ2xlID0gKHJhZFRvRGVnKE1hdGguYXRhbih2YWx1ZSAvIGFwcC5jdXJyZW50LmNhbWVyYUhlaWdodCkpIC0gOTAgLSAoZm92X3ZlciAvIDIpKSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY2FsY3VsYXRlZCBub3cgZm9yIHBlcnNvbiBkaXN0YW5jZVxyXG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gOTAgKyAoZm92X3ZlciAvIDIpIC0gcmFkVG9EZWcoTWF0aC5hdGFuKGRpc3RhbmNlIC8gKGFwcC5jdXJyZW50LmNhbWVyYUhlaWdodCAtIEhVTUFOX0hFSUdIVCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hvcmQgPSAyICogZGlzdGFuY2UgKiBNYXRoLnRhbihkZWdUb1JhZChmb3ZfaG9yIC8gMikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSByZXNfaG9yIC8gKDIgKiBkaXN0YW5jZSAqIE1hdGgudGFuKGRlZ1RvUmFkKGZvdl9ob3IgLyAyKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnY2hvcmQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGNob3JkID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRtYXggPSB2YWx1ZSAvICgyICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAvIDIpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAocmFkVG9EZWcoTWF0aC5hdGFuKGRtYXggLyBhcHAuY3VycmVudC5jYW1lcmFIZWlnaHQpKSAtIDkwIC0gKGZvdl92ZXIgLyAyKSkgKiAtMTtcclxuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IChhcHAuY3VycmVudC5jYW1lcmFIZWlnaHQgLSBIVU1BTl9IRUlHSFQpICogTWF0aC50YW4oZGVnVG9SYWQoOTAgLSBhbmdsZSArIGZvdl92ZXIgLyAyKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSByZXNfaG9yIC8gKDIgKiBkbWF4ICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAvIDIpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdyZXNvbHV0aW9uJzpcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRtYXggPSByZXNfaG9yIC8gKHZhbHVlICogMiAqIE1hdGgudGFuKGRlZ1RvUmFkKGZvdl9ob3IgLyAyKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gKHJhZFRvRGVnKE1hdGguYXRhbihkbWF4IC8gYXBwLmN1cnJlbnQuY2FtZXJhSGVpZ2h0KSkgLSA5MCAtIChmb3ZfdmVyIC8gMikpICogLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAoYXBwLmN1cnJlbnQuY2FtZXJhSGVpZ2h0IC0gSFVNQU5fSEVJR0hUKSAqIE1hdGgudGFuKGRlZ1RvUmFkKDkwIC0gYW5nbGUgKyBmb3ZfdmVyIC8gMikpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjaG9yZCA9IDIgKiBkbWF4ICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAvIDIpKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSBhcHAuY3VycmVudC5jYW1UaWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkbWF4ID0gYXBwLmN1cnJlbnQuY2FtZXJhSGVpZ2h0ICogTWF0aC50YW4oZGVnVG9SYWQoOTAgLSBhbmdsZSArIChmb3ZfdmVyICogLjUpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAoYXBwLmN1cnJlbnQuY2FtZXJhSGVpZ2h0IC0gSFVNQU5fSEVJR0hUKSAqIE1hdGgudGFuKGRlZ1RvUmFkKDkwIC0gYW5nbGUgKyBmb3ZfdmVyIC8gMikpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNob3JkID0gMiAqIGRtYXggKiBNYXRoLnRhbihkZWdUb1JhZChmb3ZfaG9yIC8gMikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSByZXNfaG9yIC8gKDIgKiBkbWF4ICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAvIDIpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChhbmdsZSA+IDkwKSB7XHJcbiAgICAgICAgICAgICAgICAkZG9tLmZpbmQoJy5maWVsZE1lbnVBbmdsZScpLnZhbCg5MCk7XHJcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZXMoJ2FuZ2xlJywgOTApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYW5nbGUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAkZG9tLmZpbmQoJy5maWVsZE1lbnVBbmdsZScpLnZhbCgwKTtcclxuICAgICAgICAgICAgICAgIHNldFZhbHVlcygnYW5nbGUnLCAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXBwLmN1cnJlbnQuY2FtVGlsdCA9IGFuZ2xlO1xyXG5cclxuICAgICAgICAgICAgJGRvbS5maW5kKCcuZmllbGRNV2FybmluZycpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW4gIT09ICdhbmdsZScpIHsgJGRvbS5maW5kKCcuZmllbGRNZW51QW5nbGUnKS52YWwoYW5nbGUudG9GaXhlZCgyKSk7IH1cclxuICAgICAgICAgICAgaWYgKG9yaWdpbiAhPT0gJ2Rpc3RhbmNlJykgeyBkaXN0YW5jZSA+IDAgPyAkZG9tLmZpbmQoJy5maWVsZE1lbnVEaXN0YW5jZScpLnZhbChhcHAuaUZ0RihkaXN0YW5jZSkudG9GaXhlZCgyKSkgOiAkZG9tLmZpbmQoJy5maWVsZE1lbnVEaXN0YW5jZScpLnZhbChhcHAubGwoJ2luZmluaXR5JykpOyB9XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW4gIT09ICdyZXNvbHV0aW9uJykgeyByZXNvbHV0aW9uID4gMCA/ICRkb20uZmluZCgnLmZpZWxkTWVudVJlc29sdXRpb24nKS52YWwoYXBwLmlGdEYocmVzb2x1dGlvbikudG9GaXhlZCgyKSkgOiAkZG9tLmZpbmQoJy5maWVsZE1lbnVSZXNvbHV0aW9uJykudmFsKDApOyB9XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW4gIT09ICdjaG9yZCcpIHsgY2hvcmQgPiAwID8gJGRvbS5maW5kKCcuZmllbGRNZW51Q2hvcmQnKS52YWwoYXBwLmlGdEYoY2hvcmQpLnRvRml4ZWQoMikpIDogJGRvbS5maW5kKCcuZmllbGRNZW51Q2hvcmQnKS52YWwoYXBwLmxsKCdpbmZpbml0eScpKTsgfVxyXG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCAwIHx8IHJlc29sdXRpb24gPCAwIHx8IGNob3JkIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgJGRvbS5maW5kKCcuZmllbGRNV2FybmluZycpLmNzcygnZGlzcGxheScsICdibG9jaycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB1cGRhdGVUaG9zZVZhbHVlc0Z1bmN0aW9uID0gc2V0VmFsdWVzO1xyXG4gICAgICAgIG5ldyBGb3VuZGF0aW9uLlJldmVhbCgkZG9tLmZpbmQoJyNmaWVsZE1PcHRpb24xJykpO1xyXG4gICAgICAgIG5ldyBGb3VuZGF0aW9uLlJldmVhbCgkZG9tLmZpbmQoJyNmaWVsZE1PcHRpb24yJykpO1xyXG4gICAgICAgIG5ldyBGb3VuZGF0aW9uLlJldmVhbCgkZG9tLmZpbmQoJyNmaWVsZE1PcHRpb24zJykpO1xyXG4gICAgICAgIG5ldyBGb3VuZGF0aW9uLlJldmVhbCgkZG9tLmZpbmQoJyNmaWVsZE1PcHRpb240JykpO1xyXG4gICAgICAgIHJldHVybiAkZG9tO1xyXG4gICAgfVxyXG4gICAgYXBwLm9uKCdjYW1lcmFDaGFuZ2UnLCBjcmVhdGUpO1xyXG4gICAgcmV0dXJuIGNyZWF0ZSgpO1xyXG59IiwiY29uc3QgU2xpZGVyID0gcmVxdWlyZSgnLi8uLi9zbmlwcGV0cy9zbGlkZXIuanMnKTtcclxuXHJcbmZ1bmN0aW9uIHJhZFRvRGVnKG51bWJlcikge1xyXG5cdHJldHVybiBudW1iZXIgKiAxODAgLyBNYXRoLlBJO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZWdUb1JhZChudW1iZXIpIHtcclxuXHRyZXR1cm4gbnVtYmVyICogTWF0aC5QSSAvIDE4MDtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBsZW5zTWVudSh0aXRsZUNoYW5nZSkge1xyXG5cdGZ1bmN0aW9uIHJlbmRlclRpdGxlKCkge1xyXG5cdFx0cmV0dXJuIGA8aDIgY2xhc3M9J2FxdWEnPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNMZW5zJyl9Jm5ic3A7Jm5ic3A7PC9oMj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtY2FtZXJhXCI+JHthcHAuY3VycmVudC5sZW5zfSZuYnNwOyZuYnNwO3wmbmJzcDsmbmJzcDs8L3NwYW4+XHJcblx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzZWxlY3RlZC1yZXNvbHV0aW9uXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0xlbnNGb2NhbExlbmd0aCcpfSAke2FwcC5jdXJyZW50LmZvY2FsTGVuZ3RofW1tPC9zcGFuPmBcclxuXHR9XHJcblx0dmFyICRkb20gPSAkKGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJzbWFsbC0xMiBsYXJnZS02IG1lZGl1bS02IGNvbHVtbnNcIj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+JHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0xlbnNNb2RlbCcpfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZWxlY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImNhbWVyYUxlbnNcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic29sb09wdGlvblwiPjwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTYgbWVkaXVtLTYgY29sdW1ucyBlbmRcIj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94IHNsaWRlckZvY2FsTGVuZ3RoXCI+XHJcblx0XHRcdFx0XHQ8cD4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzTGVuc0ZvY2FsTGVuZ3RoJyl9PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2xpZGVyRm9jYWxMZW5ndGhGaXhlZFwiIHN0eWxlPVwiZGlzcGxheTpub25lXCI+PC9wPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PGRpdiBjbGFzcz1cImNvbHVtbnMgc21hbGwtMTIgbWVkaXVtLTEyIGxhcmdlLTEyIHRleHQtY2VudGVyXCI+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cInBhbmVsLWJveCBzbWFsbC0xMiBsYXJnZS0xMiBtZWRpdW0tMTIgY29sdW1uIHRleHQtY2VudGVyXCI+XHJcblx0XHRcdFx0XHQ8IS0tPGEgY2xhc3M9XCJzYXZlQnV0dG9uIGxhcmdlIGJ1dHRvblwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCI+U2F2ZTwvYT4tLT5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PC9kaXY+XHJcblx0ICAgIDwvZGl2PlxyXG4gICAgYCk7XHJcblxyXG5cdHZhciBzbGlkZXI7XHJcblx0cmVzZXRTbGlkZXIoKTtcclxuXHJcblx0Zm9yICh2YXIga2V5IGluIGFwcC5jYW1lcmFBZHZhbmNlZExpc3RbYXBwLmN1cnJlbnQuZmFtaWx5XVthcHAuY3VycmVudC5tb2RlbF1bYXBwLmN1cnJlbnQucmVzb2x1dGlvbl0pIHtcclxuXHRcdGlmICghYXBwLmN1cnJlbnQubGVucykgeyBhcHAuY3VycmVudC5sZW5zID0ga2V5OyB9XHJcblx0XHQkZG9tLmZpbmQoJy5jYW1lcmFMZW5zJykuYXBwZW5kKGA8b3B0aW9uIHZhbHVlPScke2tleX0nPiR7a2V5fTwvb3B0aW9uPmApO1xyXG5cdH1cclxuXHR0aXRsZUNoYW5nZShyZW5kZXJUaXRsZSgpKTtcclxuXHJcblx0YXBwLm9uKCdjYW1lcmFDaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcblx0XHQkZG9tLmZpbmQoJy5jYW1lcmFMZW5zJykuaHRtbCgnJyk7XHJcblx0XHRhcHAuY3VycmVudC5sZW5zID0gbnVsbDtcclxuXHJcblx0XHRpZiAoYXBwLmN1cnJlbnQuZmFtaWx5ID09PSAnT3RoZXJzJykge1xyXG5cdFx0XHQkZG9tLmZpbmQoJ2xhYmVsLnNlbGVjdCcpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblx0XHRcdCRkb20uZmluZCgnLnNvbG9PcHRpb24nKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuXHRcdFx0JGRvbS5maW5kKCcuc29sb09wdGlvbicpLnRleHQoJ090aGVyJyk7XHJcblx0XHRcdGFwcC5jdXJyZW50LmxlbnMgPSAnT3RoZXInO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dmFyIGxlbmd0aCA9IDA7XHJcblx0XHRcdGZvciAodmFyIGtleSBpbiBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W2FwcC5jdXJyZW50LmZhbWlseV1bYXBwLmN1cnJlbnQubW9kZWxdW2FwcC5jdXJyZW50LnJlc29sdXRpb25dKSB7XHJcblx0XHRcdFx0aWYgKCFhcHAuY3VycmVudC5sZW5zKSB7IGFwcC5jdXJyZW50LmxlbnMgPSBrZXk7IH1cclxuXHRcdFx0XHQkZG9tLmZpbmQoJy5jYW1lcmFMZW5zJykuYXBwZW5kKGA8b3B0aW9uIHZhbHVlPScke2tleX0nPiR7a2V5fTwvb3B0aW9uPmApO1xyXG5cdFx0XHRcdGxlbmd0aCsrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChsZW5ndGggPiAxKSB7XHJcblx0XHRcdFx0JGRvbS5maW5kKCdsYWJlbC5zZWxlY3QnKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuXHRcdFx0XHQkZG9tLmZpbmQoJy5zb2xvT3B0aW9uJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdFx0XHQkZG9tLmZpbmQoJy5zb2xvT3B0aW9uJykudGV4dCgnJyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0JGRvbS5maW5kKCdsYWJlbC5zZWxlY3QnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cdFx0XHRcdCRkb20uZmluZCgnLnNvbG9PcHRpb24nKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuXHRcdFx0XHQkZG9tLmZpbmQoJy5zb2xvT3B0aW9uJykudGV4dChhcHAuY3VycmVudC5sZW5zKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmVzZXRTbGlkZXIoKTtcclxuXHRcdHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG5cdH0pO1xyXG5cclxuXHQkZG9tLmZpbmQoJy5jYW1lcmFMZW5zJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuXHRcdGFwcC5jdXJyZW50LmxlbnMgPSAkKHRoaXMpLnZhbCgpO1xyXG5cdFx0cmVzZXRTbGlkZXIoKTtcclxuXHR9KTtcclxuXHJcblx0ZnVuY3Rpb24gcmVzZXRTbGlkZXIoKSB7XHJcblx0XHRhcHAuY3VycmVudC5mb3ZfaG9yID0gdW5kZWZpbmVkO1xyXG5cdFx0YXBwLmN1cnJlbnQuZm92X3ZlciA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHR2YXIgbWluTGVuZ3RoLCBtYXhMZW5ndGg7XHJcblxyXG5cdFx0aWYgKGFwcC5jdXJyZW50LmxlbnMgPT09ICdPdGhlcicpIHtcclxuXHRcdFx0bWluTGVuZ3RoID0gMC4wMTtcclxuXHRcdFx0bWF4TGVuZ3RoID0gMTUwO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dmFyIHYgPSBhcHAuY3VycmVudDtcclxuXHRcdFx0dmFyIG9yaWdPYmplY3QgPSBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W3YuZmFtaWx5XVt2Lm1vZGVsXVt2LnJlc29sdXRpb25dW3YubGVuc107XHJcblx0XHRcdG1pbkxlbmd0aCA9IG9yaWdPYmplY3QuTWluRkM7XHJcblx0XHRcdG1heExlbmd0aCA9IG9yaWdPYmplY3QuTWF4RkM7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG1pbkxlbmd0aCA9PT0gbWF4TGVuZ3RoKSB7XHJcblx0XHRcdGlmIChzbGlkZXIpIHsgc2xpZGVyLiRpdGVtLmNzcygnZGlzcGxheScsICdub25lJyk7IH1cclxuXHRcdFx0JGRvbS5maW5kKCcuc2xpZGVyRm9jYWxMZW5ndGhGaXhlZCcpLmNzcygnZGlzcGxheScsICdibG9jaycpO1xyXG5cdFx0XHQkZG9tLmZpbmQoJy5zbGlkZXJGb2NhbExlbmd0aEZpeGVkJykudGV4dChtYXhMZW5ndGgpO1xyXG5cclxuXHRcdFx0YXBwLmN1cnJlbnQuZm9jYWxMZW5ndGggPSBtYXhMZW5ndGg7XHJcblx0XHRcdHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFzbGlkZXIpIHtcclxuXHRcdFx0JGRvbS5maW5kKCcuc2xpZGVyRm9jYWxMZW5ndGhGaXhlZCcpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblx0XHRcdHNsaWRlciA9IG5ldyBTbGlkZXIoJGRvbS5maW5kKCcuc2xpZGVyRm9jYWxMZW5ndGgnKSwgbWluTGVuZ3RoLCBtYXhMZW5ndGgsIG1heExlbmd0aCwgMTAsIGZ1bmN0aW9uICh2KSB7XHJcblx0XHRcdFx0diA9IE51bWJlci5wYXJzZUZsb2F0KHYpO1xyXG5cdFx0XHRcdGFwcC5jdXJyZW50LmZvY2FsTGVuZ3RoID0gdjtcclxuXHRcdFx0XHR2YXIgcmF3ID0gYXBwLmdldFJhd0RhdGEoKTtcclxuXHRcdFx0XHRpZiAocmF3LmN0eXBlID09PSAncGFubycgfHwgcmF3LmN0eXBlID09PSAnbm9ucGFubycpIHtcclxuXHRcdFx0XHRcdC8vIHZhciBzZW5zb3JXaWR0aEggPSBNYXRoLnRhbihkZWdUb1JhZChOdW1iZXIucGFyc2VGbG9hdChyYXcuSEZPVm1pbikgLyAyKSkgKiBOdW1iZXIucGFyc2VGbG9hdChyYXcuTWluRkMpO1xyXG5cdFx0XHRcdFx0Ly8gdmFyIHNlbnNvcldpZHRoViA9IE1hdGgudGFuKGRlZ1RvUmFkKE51bWJlci5wYXJzZUZsb2F0KHJhdy5WRk9WbWluKSAvIDIpKSAqIE51bWJlci5wYXJzZUZsb2F0KHJhdy5NaW5GQyk7XHJcblx0XHRcdFx0XHQvLyBhcHAuY3VycmVudC5mb3ZfaG9yID0gMiAqIHJhZFRvRGVnKE1hdGguYXRhbihzZW5zb3JXaWR0aEggLyB2KSk7XHJcblx0XHRcdFx0XHQvLyBhcHAuY3VycmVudC5mb3ZfdmVyID0gMiAqIHJhZFRvRGVnKE1hdGguYXRhbihzZW5zb3JXaWR0aFYgLyB2KSk7XHJcblx0XHRcdFx0XHQvL2xpbmVhckludGVycG9sYXRpb25cclxuXHRcdFx0XHRcdHZhciBwb2ludCA9ICh2IC0gcmF3Lk1pbkZDKSAvIChyYXcuTWF4RkMgLSByYXcuTWluRkMpO1xyXG5cdFx0XHRcdFx0YXBwLmN1cnJlbnQuZm92X2hvciA9IHBvaW50ICogcmF3LkhGT1ZtYXggKyAoMSAtIHBvaW50KSAqIHJhdy5IRk9WbWluO1xyXG5cdFx0XHRcdFx0YXBwLmN1cnJlbnQuZm92X3ZlciA9IHBvaW50ICogcmF3LlZGT1ZtYXggKyAoMSAtIHBvaW50KSAqIHJhdy5WRk9WbWluO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRhcHAuY3VycmVudC5mb3ZfaG9yID0gcmFkVG9EZWcoMiAqIE1hdGguYXRhbihyYXcuc2Vuc29yV2lkdGggLyAyIC8gdikpO1xyXG5cdFx0XHRcdFx0YXBwLmN1cnJlbnQuZm92X3ZlciA9IHJhZFRvRGVnKDIgKiBNYXRoLmF0YW4ocmF3LnNlbnNvckhlaWdodCAvIDIgLyB2KSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0aXRsZUNoYW5nZShyZW5kZXJUaXRsZSgpKTtcclxuXHRcdFx0XHRhcHAuZW1pdCgnbGVuc0NoYW5nZScpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNsaWRlci4kaXRlbS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcclxuXHRcdFx0JGRvbS5maW5kKCcuc2xpZGVyRm9jYWxMZW5ndGhGaXhlZCcpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblx0XHRcdHNsaWRlci5yZXNldChtaW5MZW5ndGgsIG1heExlbmd0aCwgbWluTGVuZ3RoLCAxMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gJGRvbTtcclxufSIsImNvbnN0IFNsaWRlciA9IHJlcXVpcmUoJy4vLi4vc25pcHBldHMvc2xpZGVyLmpzJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRhcmdldE1lbnUodGl0bGVDaGFuZ2UpIHtcclxuXHR2YXIgc2xpZGVyV2lkdGgsIHNsaWRlckhlaWdodDtcclxuXHRhcHAuY3VycmVudC50T1dpZHRoID0gMC41O1xyXG5cdGFwcC5jdXJyZW50LnRPSGVpZ2h0ID0gMS43O1xyXG5cdGlmIChhcHAuY3VycmVudC52YS50eXBlID09IFwiSVZBIFBybyBUcmFmZmljXCIpIHtcclxuXHRcdGFwcC5jdXJyZW50LnRPV2lkdGggPSAxLjU7XHJcblx0XHRhcHAuY3VycmVudC50T0hlaWdodCA9IDEuNTtcclxuXHR9XHJcblx0ZnVuY3Rpb24gcmVuZGVyVGl0bGUoKSB7XHJcblx0XHRyZXR1cm4gYDxoMiBjbGFzcz0nYXF1YSc+JHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc1RhcmdldE9iamVjdCcpfSZuYnNwOyZuYnNwOzwvaDI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhcmdldFByb3BvcnRpb25zXCI+JHthcHAuaUZ0RihhcHAuY3VycmVudC50T1dpZHRoKS50b0ZpeGVkKDIpfSB4ICR7YXBwLmlGdEYoYXBwLmN1cnJlbnQudE9IZWlnaHQpLnRvRml4ZWQoMil9ICR7YXBwLnVuaXRTeW1ib2woKX0gPHNwYW4gY2xhc3M9XCJleHRyYVwiIHN0eWxlPVwiY29sb3I6IzgwODA4MFwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNUYXJnZXRPYmplY3RJbmZvJyl9PC9zcGFuPjwvc3Bhbj5gXHJcblx0fVxyXG5cdHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG5cdHZhciB0ZXh0V2lkdGggPSBhcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc1dpZHRoJyk7XHJcblx0dmFyIHRleHRIZWlndGggPSBhcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0hlaWdodCcpO1xyXG5cdGlmIChhcHAuY3VycmVudC52YS50eXBlID09IFwiSVZBIFBybyBUcmFmZmljXCIpIHtcclxuXHRcdHRleHRXaWR0aCA9IGFwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzV2lkdGhDYXInKTtcclxuXHRcdHRleHRIZWlndGggPSBhcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0hlaWdodENhcicpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2V0VGV4dCgpe1xyXG5cdFx0JCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uQnVpbGRpbmdzVXByaWdodCBzcGFuJykudGV4dChgVXByaWdodCBwZXJzb24gKCR7YXBwLmlGdEYoLjUpLnRvRml4ZWQoMil9IHggJHthcHAuaUZ0RigxLjcpLnRvRml4ZWQoMil9JHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuXHRcdCQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbkJ1aWxkaW5nc0Zyb250YWwgc3BhbicpLnRleHQoYEZyb250YWwgdmVoaWNsZSAoJHthcHAuaUZ0RigxLjUpLnRvRml4ZWQoMil9IHggJHthcHAuaUZ0RigxLjUpLnRvRml4ZWQoMil9JHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuXHRcdCQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvblBlcmltZXRlclVwcmlnaHQgc3BhbicpLnRleHQoYFVwcmlnaHQgcGVyc29uICgke2FwcC5pRnRGKC41KS50b0ZpeGVkKDIpfSB4ICR7YXBwLmlGdEYoMS43KS50b0ZpeGVkKDIpfSR7YXBwLnVuaXRTeW1ib2woKX0pYCk7XHJcblx0XHQkKCcuc2V0dGluZ3NUYXJnZXRCdXR0b25QZXJpbWV0ZXJDcmF3bGluZyBzcGFuJykudGV4dChgQ3Jhd2xpbmcgcGVyc29uICgke2FwcC5pRnRGKC41KS50b0ZpeGVkKDIpfSB4ICR7YXBwLmlGdEYoLjUpLnRvRml4ZWQoMil9JHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuXHRcdCQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvblBlcmltZXRlckZyb250YWwgc3BhbicpLnRleHQoYEZyb250YWwgdmVoaWNsZSAoJHthcHAuaUZ0RigxLjUpLnRvRml4ZWQoMil9IHggJHthcHAuaUZ0RigxLjUpLnRvRml4ZWQoMil9JHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuXHRcdCQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvblRyYWZmaWNGcm9udGFsIHNwYW4nKS50ZXh0KGBGcm9udGFsIHZlaGljbGUgKCR7YXBwLmlGdEYoMS41KS50b0ZpeGVkKDIpfSB4ICR7YXBwLmlGdEYoMS41KS50b0ZpeGVkKDIpfSR7YXBwLnVuaXRTeW1ib2woKX0pYCk7XHJcblx0XHQkKCcuc2V0dGluZ3NUYXJnZXRCdXR0b25UcmFmZmljVXByaWdodCBzcGFuJykudGV4dChgVXByaWdodCBwZXJzb24gKCR7YXBwLmlGdEYoLjUpLnRvRml4ZWQoMil9IHggJHthcHAuaUZ0RigxLjcpLnRvRml4ZWQoMil9JHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuXHR9XHJcblxyXG5cdHZhciAkZG9tID0gJChgXHJcblx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJjb2x1bW5zIHNldHRpbmdzVGFyZ2V0QnV0dG9uXCI+XHJcblx0XHRcdFx0PGEgY2xhc3M9XCJidXR0b24gc2V0dGluZ3NUYXJnZXRCdXR0b25CdWlsZGluZ3NVcHJpZ2h0XCI+PHNwYW4+VXByaWdodCBwZXJzb24gKCR7YXBwLmlGdEYoLjUpLnRvRml4ZWQoMil9IHggJHthcHAuaUZ0RigxLjcpLnRvRml4ZWQoMil9JHthcHAudW5pdFN5bWJvbCgpfSk8L3NwYW4+PC9hPlxyXG5cdFx0XHRcdDxhIGNsYXNzPVwiYnV0dG9uIGhvbGxvdyBzZXR0aW5nc1RhcmdldEJ1dHRvbkJ1aWxkaW5nc0Zyb250YWxcIj48c3Bhbj5Gcm9udGFsIHZlaGljbGUgKCR7YXBwLmlGdEYoMS41KS50b0ZpeGVkKDIpfSB4ICR7YXBwLmlGdEYoMS41KS50b0ZpeGVkKDIpfSR7YXBwLnVuaXRTeW1ib2woKX0pPC9zcGFuPjwvYT5cclxuXHRcdFx0XHQ8YSBjbGFzcz1cImJ1dHRvbiBzZXR0aW5nc1RhcmdldEJ1dHRvblBlcmltZXRlclVwcmlnaHRcIj48c3Bhbj5VcHJpZ2h0IHBlcnNvbiAoJHthcHAuaUZ0RiguNSkudG9GaXhlZCgyKX0geCAke2FwcC5pRnRGKDEuNykudG9GaXhlZCgyKX0ke2FwcC51bml0U3ltYm9sKCl9KTwvc3Bhbj48L2E+XHJcblx0XHRcdFx0PGEgY2xhc3M9XCJidXR0b24gaG9sbG93IHNldHRpbmdzVGFyZ2V0QnV0dG9uUGVyaW1ldGVyQ3Jhd2xpbmdcIj48c3Bhbj5DcmF3bGluZyBwZXJzb24gKCR7YXBwLmlGdEYoLjUpLnRvRml4ZWQoMil9IHggJHthcHAuaUZ0RiguNSkudG9GaXhlZCgyKX0ke2FwcC51bml0U3ltYm9sKCl9KTwvc3Bhbj48L2E+XHJcblx0XHRcdFx0PGEgY2xhc3M9XCJidXR0b24gaG9sbG93IHNldHRpbmdzVGFyZ2V0QnV0dG9uUGVyaW1ldGVyRnJvbnRhbFwiPjxzcGFuPkZyb250YWwgdmVoaWNsZSAoJHthcHAuaUZ0RigxLjUpLnRvRml4ZWQoMil9IHggJHthcHAuaUZ0RigxLjUpLnRvRml4ZWQoMil9JHthcHAudW5pdFN5bWJvbCgpfSk8L3NwYW4+PC9hPlxyXG5cdFx0XHRcdDxhIGNsYXNzPVwiYnV0dG9uIHNldHRpbmdzVGFyZ2V0QnV0dG9uVHJhZmZpY0Zyb250YWxcIj48c3Bhbj5Gcm9udGFsIHZlaGljbGUgKCR7YXBwLmlGdEYoMS41KS50b0ZpeGVkKDIpfSB4ICR7YXBwLmlGdEYoMS41KS50b0ZpeGVkKDIpfSR7YXBwLnVuaXRTeW1ib2woKX0pPC9zcGFuPjwvYT5cclxuXHRcdFx0XHQ8YSBjbGFzcz1cImJ1dHRvbiBob2xsb3cgc2V0dGluZ3NUYXJnZXRCdXR0b25UcmFmZmljVXByaWdodFwiPjxzcGFuPlVwcmlnaHQgcGVyc29uICgke2FwcC5pRnRGKC41KS50b0ZpeGVkKDIpfSB4ICR7YXBwLmlGdEYoMS43KS50b0ZpeGVkKDIpfSR7YXBwLnVuaXRTeW1ib2woKX0pPC9zcGFuPjwvYT5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJzbWFsbC0xMiBsYXJnZS01IG1lZGl1bS01IGNvbHVtbnNcIj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94IHNsaWRlclRhcmdldFdpZHRoXCI+XHJcblx0XHRcdFx0XHQ8cD4gJHt0ZXh0V2lkdGh9ICgke2FwcC51bml0U3ltYm9sKCl9KTwvcD5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJoaWRlLWZvci1zbWFsbC1vbmx5IGxhcmdlLTIgbWVkaXVtLTIgY29sdW1ucyB0ZXh0LWNlbnRlciB4U2lnblwiPlxyXG5cdFx0XHRcdDxwIGNsYXNzPVwiYm9sZFwiPng8L3A+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwic21hbGwtMTIgbGFyZ2UtNSBtZWRpdW0tNSBjb2x1bW5zIGVuZFwiPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib3ggc2xpZGVyVGFyZ2V0SGVpZ2h0XCI+XHJcblx0XHRcdFx0XHQ8cD4gJHt0ZXh0SGVpZ3RofSAoJHthcHAudW5pdFN5bWJvbCgpfSk8L3A+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY29sdW1ucyBzbWFsbC0xMiBtZWRpdW0tMTIgbGFyZ2UtMTIgdGV4dC1jZW50ZXJcIj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicGFuZWwtYm94IHNtYWxsLTEyIGxhcmdlLTEyIG1lZGl1bS0xMiBjb2x1bW4gdGV4dC1jZW50ZXJcIj5cclxuXHRcdFx0XHRcdDwhLS08YSBjbGFzcz1cInNhdmVCdXR0b24gbGFyZ2UgYnV0dG9uXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIj5TYXZlPC9hPi0tPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG4gICAgYCk7XHJcblxyXG5cdHNldFRleHQoKTtcclxuXHJcblx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvbkJ1aWxkaW5nc1VwcmlnaHQnKS5vbignY2xpY2snLCAoKSA9PiB7XHJcblx0XHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhJykuYWRkQ2xhc3MoJ2hvbGxvdycpO1xyXG5cdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvbkJ1aWxkaW5nc1VwcmlnaHQnKS5yZW1vdmVDbGFzcygnaG9sbG93Jyk7XHJcblx0XHRhcHAuY3VycmVudC50T1dpZHRoID0gYXBwLmlGZkYoMC41KTsgYXBwLmN1cnJlbnQudE9IZWlnaHQgPSBhcHAuaUZmRigxLjcpOyBjcmVhdGVTbGlkZXJzKCk7XHJcblx0fSk7XHJcblx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvbkJ1aWxkaW5nc0Zyb250YWwnKS5vbignY2xpY2snLCAoKSA9PiB7XHJcblx0XHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhJykuYWRkQ2xhc3MoJ2hvbGxvdycpO1xyXG5cdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvbkJ1aWxkaW5nc0Zyb250YWwnKS5yZW1vdmVDbGFzcygnaG9sbG93Jyk7XHJcblx0XHRhcHAuY3VycmVudC50T1dpZHRoID0gYXBwLmlGZkYoMS41KTsgYXBwLmN1cnJlbnQudE9IZWlnaHQgPSBhcHAuaUZmRigxLjUpOyBjcmVhdGVTbGlkZXJzKCk7XHJcblx0fSk7XHJcblx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvblBlcmltZXRlclVwcmlnaHQnKS5vbignY2xpY2snLCAoKSA9PiB7XHJcblx0XHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhJykuYWRkQ2xhc3MoJ2hvbGxvdycpO1xyXG5cdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvblBlcmltZXRlclVwcmlnaHQnKS5yZW1vdmVDbGFzcygnaG9sbG93Jyk7XHJcblx0XHRhcHAuY3VycmVudC50T1dpZHRoID0gYXBwLmlGZkYoMC41KTsgYXBwLmN1cnJlbnQudE9IZWlnaHQgPSBhcHAuaUZmRigxLjcpOyBjcmVhdGVTbGlkZXJzKCk7XHJcblx0fSk7XHJcblx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvblBlcmltZXRlckNyYXdsaW5nJykub24oJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYScpLmFkZENsYXNzKCdob2xsb3cnKTtcclxuXHRcdCRkb20uZmluZCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uIGEuc2V0dGluZ3NUYXJnZXRCdXR0b25QZXJpbWV0ZXJDcmF3bGluZycpLnJlbW92ZUNsYXNzKCdob2xsb3cnKTtcclxuXHRcdGFwcC5jdXJyZW50LnRPV2lkdGggPSBhcHAuaUZmRigwLjUpOyBhcHAuY3VycmVudC50T0hlaWdodCA9IGFwcC5pRmZGKDAuNSk7IGNyZWF0ZVNsaWRlcnMoKTtcclxuXHR9KTtcclxuXHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhLnNldHRpbmdzVGFyZ2V0QnV0dG9uUGVyaW1ldGVyRnJvbnRhbCcpLm9uKCdjbGljaycsICgpID0+IHtcclxuXHRcdCRkb20uZmluZCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uIGEnKS5hZGRDbGFzcygnaG9sbG93Jyk7XHJcblx0XHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhLnNldHRpbmdzVGFyZ2V0QnV0dG9uUGVyaW1ldGVyRnJvbnRhbCcpLnJlbW92ZUNsYXNzKCdob2xsb3cnKTtcclxuXHRcdGFwcC5jdXJyZW50LnRPV2lkdGggPSBhcHAuaUZmRigxLjUpOyBhcHAuY3VycmVudC50T0hlaWdodCA9IGFwcC5pRmZGKDEuNSk7IGNyZWF0ZVNsaWRlcnMoKTtcclxuXHR9KTtcclxuXHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhLnNldHRpbmdzVGFyZ2V0QnV0dG9uVHJhZmZpY0Zyb250YWwnKS5vbignY2xpY2snLCAoKSA9PiB7XHJcblx0XHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhJykuYWRkQ2xhc3MoJ2hvbGxvdycpO1xyXG5cdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvblRyYWZmaWNGcm9udGFsJykucmVtb3ZlQ2xhc3MoJ2hvbGxvdycpO1xyXG5cdFx0YXBwLmN1cnJlbnQudE9XaWR0aCA9IGFwcC5pRmZGKDEuNSk7IGFwcC5jdXJyZW50LnRPSGVpZ2h0ID0gYXBwLmlGZkYoMS41KTsgY3JlYXRlU2xpZGVycygpO1xyXG5cdH0pO1xyXG5cdCRkb20uZmluZCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uIGEuc2V0dGluZ3NUYXJnZXRCdXR0b25UcmFmZmljVXByaWdodCcpLm9uKCdjbGljaycsICgpID0+IHtcclxuXHRcdCRkb20uZmluZCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uIGEnKS5hZGRDbGFzcygnaG9sbG93Jyk7XHJcblx0XHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhLnNldHRpbmdzVGFyZ2V0QnV0dG9uVHJhZmZpY1VwcmlnaHQnKS5yZW1vdmVDbGFzcygnaG9sbG93Jyk7XHJcblx0XHRhcHAuY3VycmVudC50T1dpZHRoID0gYXBwLmlGZkYoMC41KTsgYXBwLmN1cnJlbnQudE9IZWlnaHQgPSBhcHAuaUZmRigxLjcpOyBjcmVhdGVTbGlkZXJzKCk7XHJcblx0fSk7XHJcblxyXG5cdGZ1bmN0aW9uIGNyZWF0ZVNsaWRlcnMoKSB7XHJcblx0XHRpZiAoc2xpZGVyV2lkdGgpIHsgc2xpZGVyV2lkdGguJGl0ZW0ucmVtb3ZlKCk7IH1cclxuXHRcdGlmIChzbGlkZXJIZWlnaHQpIHsgc2xpZGVySGVpZ2h0LiRpdGVtLnJlbW92ZSgpOyB9XHJcblx0XHRzbGlkZXJXaWR0aCA9IG5ldyBTbGlkZXIoJGRvbS5maW5kKCcuc2xpZGVyVGFyZ2V0V2lkdGgnKSwgYXBwLmlGdEYoMC4xKSwgYXBwLmlGdEYoMzApLCBhcHAuaUZ0RihhcHAuY3VycmVudC50T1dpZHRoKSwgMTAsIGZ1bmN0aW9uICh2KSB7XHJcblx0XHRcdGFwcC5jdXJyZW50LnRPV2lkdGggPSBhcHAuaUZmRih2KTtcclxuXHRcdFx0dGl0bGVDaGFuZ2UocmVuZGVyVGl0bGUoKSk7XHJcblx0XHR9KTtcclxuXHRcdHNsaWRlcldpZHRoLiRpdGVtLm9uKCdjbGljaycsICgpPT57ICRkb20uZmluZCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uIGEnKS5hZGRDbGFzcygnaG9sbG93Jyk7IH0pXHJcblx0XHRzbGlkZXJIZWlnaHQgPSBuZXcgU2xpZGVyKCRkb20uZmluZCgnLnNsaWRlclRhcmdldEhlaWdodCcpLCBhcHAuaUZ0RigwLjEpLCBhcHAuaUZ0Rig1KSwgYXBwLmlGdEYoYXBwLmN1cnJlbnQudE9IZWlnaHQpLCAxMCwgZnVuY3Rpb24gKHYpIHtcclxuXHRcdFx0YXBwLmN1cnJlbnQudE9IZWlnaHQgPSBhcHAuaUZmRih2KTtcclxuXHRcdFx0dGl0bGVDaGFuZ2UocmVuZGVyVGl0bGUoKSk7XHJcblx0XHR9KTtcclxuXHRcdHNsaWRlckhlaWdodC4kaXRlbS5vbignY2xpY2snLCAoKT0+eyAkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhJykuYWRkQ2xhc3MoJ2hvbGxvdycpOyB9KVxyXG5cdH1cclxuXHRjcmVhdGVTbGlkZXJzKCk7XHJcblx0YXBwLm9uKCd1bml0Q2hhbmdlJywgZnVuY3Rpb24gKGRhdGEpIHtcclxuXHRcdHNldFRleHQoKTtcclxuXHRcdGlmIChhcHAuY3VycmVudC52YS50eXBlID09IFwiSVZBIFBybyBUcmFmZmljXCIpIHtcclxuXHRcdFx0JGRvbS5maW5kKCcuc2xpZGVyVGFyZ2V0V2lkdGggcCcpLnRleHQoYCAke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzV2lkdGhDYXInKX0gKCR7YXBwLnVuaXRTeW1ib2woKX0pYCk7XHJcblx0XHRcdCRkb20uZmluZCgnLnNsaWRlclRhcmdldEhlaWdodCBwJykudGV4dChgICR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNIZWlnaHRDYXInKX0gKCR7YXBwLnVuaXRTeW1ib2woKX0pYCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQkZG9tLmZpbmQoJy5zbGlkZXJUYXJnZXRXaWR0aCBwJykudGV4dChgICR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNXaWR0aCcpfSAoJHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuXHRcdFx0JGRvbS5maW5kKCcuc2xpZGVyVGFyZ2V0SGVpZ2h0IHAnKS50ZXh0KGAgJHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0hlaWdodCcpfSAoJHthcHAudW5pdFN5bWJvbCgpfSlgKTtcclxuXHRcdH1cclxuXHRcdGNyZWF0ZVNsaWRlcnMoKTtcclxuXHR9KTtcclxuXHJcblx0YXBwLm9uKCd2YUNoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuXHRcdCRkb20uZmluZCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uIGEnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYScpLmFkZENsYXNzKCdob2xsb3cnKTtcclxuXHRcdGlmIChhcHAuY3VycmVudC52YS50eXBlID09IFwiSVZBIFBybyBQZXJpbWV0ZXJcIikge1xyXG5cdFx0XHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhLnNldHRpbmdzVGFyZ2V0QnV0dG9uUGVyaW1ldGVyVXByaWdodCcpLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKS5yZW1vdmVDbGFzcygnaG9sbG93Jyk7XHJcblx0XHRcdCRkb20uZmluZCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uIGEuc2V0dGluZ3NUYXJnZXRCdXR0b25QZXJpbWV0ZXJDcmF3bGluZycpLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTtcclxuXHRcdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvblBlcmltZXRlckZyb250YWwnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XHJcblx0XHR9XHJcblx0XHRpZiAoYXBwLmN1cnJlbnQudmEudHlwZSA9PSBcIklWQSBQcm8gQnVpbGRpbmdzXCIpIHtcclxuXHRcdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvbkJ1aWxkaW5nc1VwcmlnaHQnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJykucmVtb3ZlQ2xhc3MoJ2hvbGxvdycpO1xyXG5cdFx0XHQkZG9tLmZpbmQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbiBhLnNldHRpbmdzVGFyZ2V0QnV0dG9uQnVpbGRpbmdzRnJvbnRhbCcpLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTtcclxuXHRcdH1cclxuXHRcdGlmIChhcHAuY3VycmVudC52YS50eXBlID09IFwiSVZBIFBybyBUcmFmZmljXCIpIHtcclxuXHRcdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvblRyYWZmaWNGcm9udGFsJykuY3NzKCdkaXNwbGF5JywgJ2lubGluZS1ibG9jaycpLnJlbW92ZUNsYXNzKCdob2xsb3cnKTtcclxuXHRcdFx0JGRvbS5maW5kKCcuc2V0dGluZ3NUYXJnZXRCdXR0b24gYS5zZXR0aW5nc1RhcmdldEJ1dHRvblRyYWZmaWNVcHJpZ2h0JykuY3NzKCdkaXNwbGF5JywgJ2lubGluZS1ibG9jaycpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChhcHAuY3VycmVudC52YS50eXBlID09IFwiSVZBIFBybyBUcmFmZmljXCIpIHtcclxuXHRcdFx0YXBwLmN1cnJlbnQudE9XaWR0aCA9IDEuNTtcclxuXHRcdFx0YXBwLmN1cnJlbnQudE9IZWlnaHQgPSAxLjU7XHJcblx0XHRcdCRkb20uZmluZCgnLnNsaWRlclRhcmdldFdpZHRoIHAnKS50ZXh0KGAgJHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc1dpZHRoQ2FyJyl9ICgke2FwcC51bml0U3ltYm9sKCl9KWApO1xyXG5cdFx0XHQkZG9tLmZpbmQoJy5zbGlkZXJUYXJnZXRIZWlnaHQgcCcpLnRleHQoYCAke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzSGVpZ2h0Q2FyJyl9ICgke2FwcC51bml0U3ltYm9sKCl9KWApO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0YXBwLmN1cnJlbnQudE9XaWR0aCA9IDAuNTtcclxuXHRcdFx0YXBwLmN1cnJlbnQudE9IZWlnaHQgPSAxLjc7XHJcblx0XHRcdCRkb20uZmluZCgnLnNsaWRlclRhcmdldFdpZHRoIHAnKS50ZXh0KGAgJHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc1dpZHRoJyl9ICgke2FwcC51bml0U3ltYm9sKCl9KWApO1xyXG5cdFx0XHQkZG9tLmZpbmQoJy5zbGlkZXJUYXJnZXRIZWlnaHQgcCcpLnRleHQoYCAke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzSGVpZ2h0Jyl9ICgke2FwcC51bml0U3ltYm9sKCl9KWApO1xyXG5cdFx0fVxyXG5cdFx0Y3JlYXRlU2xpZGVycygpO1xyXG5cdH0pO1xyXG5cclxuXHRyZXR1cm4gJGRvbTtcclxufVxyXG4iLCJjb25zdCBTbGlkZXIgPSByZXF1aXJlKCcuLy4uL3NuaXBwZXRzL3NsaWRlci5qcycpO1xyXG5cclxuZnVuY3Rpb24gcmFkVG9EZWcobnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbnVtYmVyICogMTgwIC8gTWF0aC5QSTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVnVG9SYWQobnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbnVtYmVyICogTWF0aC5QSSAvIDE4MDtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBsZW5zTWVudSh0aXRsZUNoYW5nZSkge1xyXG4gICAgbGV0IHByZXZpb3VzT3B0aW9uID0gbnVsbDtcclxuXHJcbiAgICBmdW5jdGlvbiBwcm9UcmFmZmljRm4oKXtcclxuICAgICAgICBpZihhcHAuY3VycmVudC52YS50eXBlID09IFwiSVZBIFBybyBUcmFmZmljXCIgJiYgYXBwLmN1cnJlbnQudmlldyA9PT0gJ3ZpX2FuJyl7XHJcbiAgICAgICAgICAgIC8vICQoJyN2aWV3LXNpZGUtcGFuZWwtbGFiZWwnKS5jbGljaygpO1xyXG4gICAgICAgICAgICAvLyAkKCcjdmlldy10b3AtcGFuZWwtbGFiZWwnKS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gJCgnI3ZpZXctdG9wLXBhbmVsLWxhYmVsJykuY3NzKFwiZGlzcGxheVwiLCBcImJsb2NrXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHJlbmRlclRpdGxlKCkge1xyXG4gICAgICAgIHJldHVybiBgPGgyIGNsYXNzPSdhcXVhJz4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzVmlkZW9BbmFseXRpY3MnKX0mbmJzcDsmbmJzcDs8L2gyPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3RlZC12YVwiPiR7YXBwLmxhYmVsX3ZhKGFwcC5jdXJyZW50LnZhLnR5cGUpfTwvc3Bhbj5gXHJcbiAgICB9XHJcbiAgICB2YXIgJGRvbSA9ICQoYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHRcdFx0PGRpdiBjbGFzcz1cInNtYWxsLTEyIGxhcmdlLTYgbWVkaXVtLTYgY29sdW1uc1wiPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJwYW5lbC1ib3ggdmEtb3B0aW9uLWJveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNWaWRlb0FuYWx5dGljc1R5cGUnKX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJ2YU9wdGlvblwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzb2xvT3B0aW9uXCI+PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG5cdCAgICA8L2Rpdj5cclxuICAgIGApO1xyXG5cclxuICAgIGxldCBpID0gMDtcclxuXHJcbiAgICBcclxuICAgIGZvciAodmFyIGtleSBvZiBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W2FwcC5jdXJyZW50LmZhbWlseV1bYXBwLmN1cnJlbnQubW9kZWxdW2FwcC5jdXJyZW50LnJlc29sdXRpb25dW2FwcC5jdXJyZW50LmxlbnNdLlZBKSB7XHJcbiAgICAgICAgaWYgKCFhcHAuY3VycmVudC52YSkgeyBhcHAuY3VycmVudC52YSA9IGtleTsgfVxyXG4gICAgICAgICRkb20uZmluZCgnLnZhT3B0aW9uJykuYXBwZW5kKGA8b3B0aW9uIHZhbHVlPScke2krK30nPiR7YXBwLmxhYmVsX3ZhKGtleS50eXBlKX08L29wdGlvbj5gKTtcclxuICAgIH1cclxuICAgIGxldCBlbGVtO1xyXG4gICAgaWYgKGVsZW0gPSBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W2FwcC5jdXJyZW50LmZhbWlseV1bYXBwLmN1cnJlbnQubW9kZWxdW2FwcC5jdXJyZW50LnJlc29sdXRpb25dW2FwcC5jdXJyZW50LmxlbnNdLlZBLmZpbmQodiA9PiB2LnR5cGUgPT0gXCJJVkEgUHJvIEJ1aWxkaW5nc1wiKSkge1xyXG4gICAgICAgIGFwcC5jdXJyZW50LnZhID0gZWxlbTtcclxuICAgICAgICBwcmV2aW91c09wdGlvbiA9IGVsZW0udHlwZTtcclxuICAgICAgICAkZG9tLmZpbmQoJy52YU9wdGlvbicpLnZhbCgwKTtcclxuICAgIH1cclxuICAgIHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG5cclxuICAgIGFwcC5vbignY2FtZXJhQ2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICRkb20uZmluZCgnLnZhT3B0aW9uJykuaHRtbCgnJyk7XHJcbiAgICAgICAgYXBwLmN1cnJlbnQudmEgPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgaSA9IDBcclxuICAgICAgICBcclxuICAgICAgICBmb3IgKHZhciBrZXkgb2YgYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldW2FwcC5jdXJyZW50Lm1vZGVsXVthcHAuY3VycmVudC5yZXNvbHV0aW9uXVthcHAuY3VycmVudC5sZW5zXS5WQSkge1xyXG4gICAgICAgICAgICBpZiAoIWFwcC5jdXJyZW50LnZhKSB7IGFwcC5jdXJyZW50LnZhID0ga2V5OyB9XHJcbiAgICAgICAgICAgICRkb20uZmluZCgnLnZhT3B0aW9uJykuYXBwZW5kKGA8b3B0aW9uIHZhbHVlPScke2krK30nPiR7YXBwLmxhYmVsX3ZhKGtleS50eXBlKX08L29wdGlvbj5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGVsZW07XHJcbiAgICAgICAgaWYgKGVsZW0gPSBhcHAuY2FtZXJhQWR2YW5jZWRMaXN0W2FwcC5jdXJyZW50LmZhbWlseV1bYXBwLmN1cnJlbnQubW9kZWxdW2FwcC5jdXJyZW50LnJlc29sdXRpb25dW2FwcC5jdXJyZW50LmxlbnNdLlZBLmZpbmQodiA9PiB2LnR5cGUgPT0gXCJJVkEgUHJvIEJ1aWxkaW5nc1wiKSkge1xyXG4gICAgICAgICAgICBhcHAuY3VycmVudC52YSA9IGVsZW07XHJcbiAgICAgICAgICAgICRkb20uZmluZCgnLnZhT3B0aW9uJykudmFsKDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFwcC5jdXJyZW50LnZhLnR5cGUgPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgJGRvbS5maW5kKCcudmEtb3B0aW9uLWJveCcpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJGRvbS5maW5kKCcudmEtb3B0aW9uLWJveCcpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLmNzcygnZGlzcGxheScsICdibG9jaycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJCgnLmJ1dHRvbkZPVlZpZGVvQW5hbHl0aWNzJykudGV4dChhcHAubGFiZWxfdmEoYXBwLmN1cnJlbnQudmEudHlwZSkpO1xyXG4gICAgICAgIHByb1RyYWZmaWNGbigpO1xyXG4gICAgICAgIGlmKHByZXZpb3VzT3B0aW9uICE9PSBhcHAuY3VycmVudC52YS50eXBlKXsgcHJldmlvdXNPcHRpb24gPSBhcHAuY3VycmVudC52YS50eXBlOyBhcHAuZW1pdCgndmFDaGFuZ2UnKTsgIH1cclxuICAgICAgICB0aXRsZUNoYW5nZShyZW5kZXJUaXRsZSgpKTtcclxuICAgIH0pO1xyXG5cclxuICAgICRkb20uZmluZCgnLnZhT3B0aW9uJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSAkKHRoaXMpLnZhbCgpO1xyXG4gICAgICAgIGFwcC5jdXJyZW50LnZhID0gYXBwLmNhbWVyYUFkdmFuY2VkTGlzdFthcHAuY3VycmVudC5mYW1pbHldW2FwcC5jdXJyZW50Lm1vZGVsXVthcHAuY3VycmVudC5yZXNvbHV0aW9uXVthcHAuY3VycmVudC5sZW5zXS5WQVtpbmRleF07XHJcbiAgICAgICAgJCgnLmJ1dHRvbkZPVlZpZGVvQW5hbHl0aWNzJykudGV4dChhcHAubGFiZWxfdmEoYXBwLmN1cnJlbnQudmEudHlwZSkpO1xyXG4gICAgICAgIHByZXZpb3VzT3B0aW9uID0gYXBwLmN1cnJlbnQudmEudHlwZTtcclxuICAgICAgICBwcm9UcmFmZmljRm4oKTtcclxuXHRcdGFwcC5lbWl0KCd2YUNoYW5nZScpO1xyXG4gICAgICAgIHRpdGxlQ2hhbmdlKHJlbmRlclRpdGxlKCkpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gJGRvbTtcclxufSIsImNvbnN0IFNsaWRlciA9IHJlcXVpcmUoJy4vc25pcHBldHMvc2xpZGVyLmpzJyk7XHJcbmNvbnN0IEFjY29yZGlvbiA9IHJlcXVpcmUoJy4vc25pcHBldHMvYWNjb3JkaW9uJyk7XHJcbnZhciAkc2VsZWN0aW9ucztcclxudmFyIGFuc3dlcnMgPSB7fTtcclxuXHJcbmNvbnN0IFZpc3VhbE5vbnBhbm9TaWRlID0gcmVxdWlyZSgnLi92aXN1YWxzL3Zpc3VhbF9ub25wYW5vX3NpZGUuanMnKTtcclxuY29uc3QgVmlzdWFsTm9ucGFub1RvcCA9IHJlcXVpcmUoJy4vdmlzdWFscy92aXN1YWxfbm9ucGFub190b3AuanMnKTtcclxuY29uc3QgVmlzdWFsUGFubzM2MFNpZGVDZWlsID0gcmVxdWlyZSgnLi92aXN1YWxzL3Zpc3VhbF9wYW5vXzM2MF9zaWRlX2NlaWwuanMnKTtcclxuY29uc3QgVmlzdWFsUGFubzM2MFRvcENlaWwgPSByZXF1aXJlKCcuL3Zpc3VhbHMvdmlzdWFsX3Bhbm9fMzYwX3RvcF9jZWlsLmpzJyk7XHJcbmNvbnN0IFZpc3VhbFBhbm8zNjBTaWRlV2FsbCA9IHJlcXVpcmUoJy4vdmlzdWFscy92aXN1YWxfcGFub18zNjBfc2lkZV93YWxsLmpzJyk7XHJcbmNvbnN0IFZpc3VhbFBhbm8zNjBUb3BXYWxsID0gcmVxdWlyZSgnLi92aXN1YWxzL3Zpc3VhbF9wYW5vXzM2MF90b3Bfd2FsbC5qcycpO1xyXG5cclxuY29uc3QgdmlzdWFsc1NsaWRlciA9IHJlcXVpcmUoJy4vdmlzdWFscy9kaXN0YW5jZVNsaWRlcnMuanMnKSgpO1xyXG5cclxuY29uc3QgREVGQVVMVF9XSURUSCA9IDYyMDtcclxuY29uc3QgQ1VTVE9NX0FBID0gMTtcclxuY29uc3QgQkxVUl9RVUFMSVRZID0gMTA7XHJcblxyXG5jb25zdCBERUZBVUxUX0hFSUdIVCA9IERFRkFVTFRfV0lEVEggLyAxNiAqIDk7XHJcbmNvbnN0IENVU1RPTV9BQV9JTlZFUlNFID0gMSAvIENVU1RPTV9BQTtcclxuXHJcbmNvbnN0IERPUklfRCA9IDI1LFxyXG4gICAgRE9SSV9PID0gNjMsXHJcbiAgICBET1JJX1IgPSAxMjUsXHJcbiAgICBET1JJX0kgPSAyNTA7XHJcbmNvbnN0IERSSV9EID0gMyxcclxuICAgIERSSV9SID0gMTIsXHJcbiAgICBEUklfSSA9IDI0O1xyXG5jb25zdCBIVU1BTl9IRUlHSFQgPSAxLjcsXHJcbiAgICBIVU1BTl9XSURUSCA9IDAuNTtcclxuY29uc3QgTUlOSU1VTV9WQV9PQkpFQ1RfUElYRUxfU0laRSA9IDIwO1xyXG5cclxuZnVuY3Rpb24gcmFkVG9EZWcobnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbnVtYmVyICogMTgwIC8gTWF0aC5QSTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVnVG9SYWQobnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbnVtYmVyICogTWF0aC5QSSAvIDE4MDtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXBwKSB7XHJcbiAgICB2YXIgdGhhdCA9IHt9O1xyXG4gICAgdGhhdC4kZG9tID0gJCgnI3NldHRpbmdzbW9kZScpO1xyXG5cclxuICAgIG5ldyBBY2NvcmRpb24odGhhdC4kZG9tLCBbXHJcbiAgICAgICAgcmVxdWlyZSgnLi9tZW51ZXMvY2FtZXJhTS5qcycpLFxyXG4gICAgICAgIHJlcXVpcmUoJy4vbWVudWVzL2xlbnNNLmpzJyksXHJcbiAgICAgICAgcmVxdWlyZSgnLi9tZW51ZXMvdmFNLmpzJyksXHJcbiAgICAgICAgcmVxdWlyZSgnLi9tZW51ZXMvdGFyZ2V0TS5qcycpLFxyXG4gICAgICAgIHJlcXVpcmUoJy4vbWVudWVzL2ZpZWxkTS5qcycpLFxyXG4gICAgXSlcclxuXHJcbiAgICB0aGF0LiRkb20uYXBwZW5kKFxyXG4gICAgICAgIGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGJpZy1oZWFkbGluZVwiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY29sdW1ucyBzbWFsbC0xMiBtZWRpdW0tMTIgbGFyZ2UtMTIgdGV4dC1jZW50ZXJcIj5cclxuXHRcdFx0XHQ8IS0tIDxkaXYgY2xhc3M9XCJwYW5lbC1ib3ggc21hbGwtMTIgbGFyZ2UtMTIgbWVkaXVtLTEyIGNvbHVtbiB0ZXh0LWNlbnRlclwiPlxyXG5cdFx0XHRcdFx0PGEgY2xhc3M9XCJjYWxjdWxhdGVCdXR0b24gbGFyZ2UgYnV0dG9uXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsaXplJyl9PC9hPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8aDEgY2xhc3M9XCJibGFjayByZXN1bHRzXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZUxvb2thdFJlc3VsdHMnKX08L2gxPiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBzbWFsbC0xMiBtZWRpdW0tMTIgbGFyZ2UtMTIgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpc2NsYWltZXIgc21hbGwtMTIgbGFyZ2UtMTIgbWVkaXVtLTEyIGNvbHVtbiB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlZpZXcgdGhlIHJlc3VsdHM8L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIEJvc2NoIFZpZGVvIEFuYWx5dGljcyBhbmQgTGVucyBDYWxjdWxhdG9yIHNlcnZlcyBhcyBhIHN1cHBvcnQgdG9vbCBvbmx5LiBJdCBjYW5ub3Qgc3Vic3RpdHV0ZSBwcm9mZXNzaW9uYWwgYWR2aWNlIGZyb20gdGVjaG5pY2FsIGV4cGVydHMuIEFueSB1c2Ugb2YgdGhpcyB0b29sIGlzIHN1YmplY3QgdG8gdGhpcyA8YSBocmVmPVwiJHthcHAubGwoJ2Rpc2NsYWltZXJVcmwnKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5EaXNjbGFpbWVyPC9hPiBhbmQgYnkgdXNpbmcgdGhlIHRvb2wsIHRoZSB1c2VyIGFncmVlcyB0aGVyZXRvLiBGb3IgZnVydGhlciBkZXRhaWxzLCBvdXIgc2FsZXMgdGVhbSB3aWxsIGJlIGhhcHB5IHRvIGFzc2lzdC48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdmVydGljYWwtcGFkZGluZy1iaWcgaGlkZVRpbGxDYWxjXCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJjb2x1bW5zIHNtYWxsLTEyIG1lZGl1bS0xMiBsYXJnZS0xMiByb3cgY29sbGFwc2VcIj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sdW1ucyBzbWFsbC0xMiBtZWRpdW0tMTIgbGFyZ2UtMTIgdmlzdWFsV3JhcFwiIHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLTxpbWcgc3JjPVwiLi4vaW1nL0ZPVi5qcGdcIiBzdHlsZT1cIndpZHRoOiAxMDAlO3Bvc2l0aW9uOiBhYnNvbHV0ZTtvcGFjaXR5OiAwLjU7cG9pbnRlci1ldmVudHM6IG5vbmU7XCI+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpc3VhbEJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbkZPVkxlbnNjYWxjIGFjdGl2ZVwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxMZW5zQ2FsY3VsYXRpb24nKX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbkZPVlZpZGVvQW5hbHl0aWNzIGhpZGRlblwiPiR7YXBwLmxhYmVsX3ZhKGFwcC5jdXJyZW50LnZhLnR5cGUpfTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uRk9WQ2FtZXJhIGhpZGRlblwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxDYW1lcmEnKX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbkZPVkRvcmlcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRE9SSScpfTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aXN1YWxTZWNvbmRSb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwidGFic1wiIGRhdGEtdGFicyBpZD1cInZpZXctdGFic1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidGFicy10aXRsZSBpcy1hY3RpdmVcIj48YSBocmVmPVwiI3ZpZXctc2lkZS1wYW5lbFwiIGFyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbFNpZGVWaWV3Jyl9PC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ0YWJzLXRpdGxlXCI+PGEgZGF0YS10YWJzLXRhcmdldD1cIiN2aWV3LXRvYi1wYW5lbFwiIGhyZWY9XCIjdmlldy10b3AtcGFuZWxcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsVG9wVmlldycpfTwvYT48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kQ29udCBkb3JpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRE9SSV9JJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklfUicpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX08nKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRE9SSV9EJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklfT3V0T2ZSYW5nZScpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmRDb250IGRyaSBoaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklfSScpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklfUicpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklfRCcpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklfT3V0T2ZSYW5nZScpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZENvbnQgY2FtZXJhIGhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbElSX1YnKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRE9SSV9PdXRPZlJhbmdlJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZENvbnQgdmlfYW4gaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsVklBTl9WQUQnKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsVklBTl9PdXRPZlJhbmdlJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsZWFyXCIgc3R5bGU9XCJjbGVhcjpib3RoXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYnMtY29udGVudCB2aWV3LWNvbnRlbnRcIiBkYXRhLXRhYnMtY29udGVudD1cInZpZXctdGFic1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFicy1wYW5lbCBpcy1hY3RpdmVcIiBpZD1cInZpZXctc2lkZS1wYW5lbFwiPlxyXG5cdFx0XHRcdFx0ICAgICAgICA8ZGl2IGNsYXNzPVwiZm92U2lkZUNvbnRhaW5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYnMtcGFuZWxcIiBpZD1cInZpZXctdG9wLXBhbmVsXCI+XHJcblx0XHRcdFx0XHQgICAgICAgIDxkaXYgY2xhc3M9XCJmb3ZUb3BDb250YWluZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aXN1YWxPdXRwdXRSb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpc3VhbE91dHB1dENvbnQgbGVuc2NhbGNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidmlzdWFsT3V0VGl0bGVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsQ2FsY1ZhbEF0UG9zJyl9PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz12aXN1YWxPdXRUYWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXZpc3VhbE91dFJvdz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERpc3RhbmNlJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj45OSBtPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dmlzdWFsT3V0Um93PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsUmVzb2x1dGlvbicpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+OTkgcHBtPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dmlzdWFsT3V0Um93PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsSGVpZ2h0Jyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj45OSBtPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dmlzdWFsT3V0Um93PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsSG9yaXpvbnRhbEFuZ2xlJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4wIMKwPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlzdWFsT3V0cHV0Q29udCBjYW1lcmEgaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInZpc3VhbE91dFRpdGxlXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbENhbGNWYWxBdFBvcycpfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dmlzdWFsT3V0VGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz12aXN1YWxPdXRSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxEaXN0YW5jZScpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+OTkgbTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXZpc3VhbE91dFJvdz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbFJlc29sdXRpb24nKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjk5IHBwbTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXZpc3VhbE91dFJvdz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbEhlaWdodCcpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+OTkgbTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXZpc3VhbE91dFJvdz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbEhvcml6b250YWxBbmdsZScpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+MCDCsDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpc3VhbE91dHB1dENvbnQgdmlfYW4gbm9uLXBhbm8gaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInZpc3VhbE91dFRpdGxlXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbENhbGNWYWxBdFBvcycpfTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgY2xhc3M9XCJ2aXN1YWxPdXRJbmZvXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbEluZm9ybWF0aW9uJyl9PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz12aXN1YWxPdXRUYWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXZpc3VhbE91dFJvdz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERpc3RhbmNlJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj45OSBtPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxlc3NUYWJsZVwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxJbmZvcm1hdGlvblZBTWluRGV0UmVhbCcpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsZXNzVGFibGVcIj45OSBtKjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb3JlVGFibGVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsSW5mb3JtYXRpb25WQUhlYWRsaW5lRGV0Jyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vcmVUYWJsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXZpc3VhbE91dFJvdz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbEhlaWdodCcpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+OTkgbTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsZXNzVGFibGVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsSW5mb3JtYXRpb25WQU1heERldFJlYWwnKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGVzc1RhYmxlXCI+OTkgbSo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9yZVRhYmxlXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbEluZm9ybWF0aW9uVkFNaW5EZXQnKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9yZVRhYmxlXCI+OTkgbSo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dmlzdWFsT3V0Um93PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsSG9yaXpvbnRhbEFuZ2xlJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4wIMKwPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxlc3NUYWJsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsZXNzVGFibGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9yZVRhYmxlXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbEluZm9ybWF0aW9uVkFNYXhEZXQnKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9yZVRhYmxlXCI+OTkgbSo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidmlzdWFsT3V0Tm90aWNlXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE91dFZBTm90aWNlJyl9PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpc3VhbE91dHB1dENvbnQgdmlfYW4gcGFubyBoaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidmlzdWFsT3V0VGl0bGVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsQ2FsY1ZhbEF0UG9zJyl9PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIGNsYXNzPVwidmlzdWFsT3V0SW5mb1wiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxJbmZvcm1hdGlvbicpfTwvYT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXZpc3VhbE91dFRhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dmlzdWFsT3V0Um93PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRGlzdGFuY2UnKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjk5IG08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxJbmZvcm1hdGlvblZBTWluRGV0UmVhbCcpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+OTkgbSo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz12aXN1YWxPdXRSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsSW5mb3JtYXRpb25WQU1heERldFJlYWxUeXBpY2FsJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj45OSBtKjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpc3VhbE91dHB1dENvbnQgZG9yaSBoaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidmlzdWFsT3V0VGl0bGVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsQ2FsY1ZhbEF0UG9zJyl9PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIGNsYXNzPVwidmlzdWFsT3V0SW5mb1wiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxJbmZvcm1hdGlvbicpfTwvYT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInZpc3VhbE91dEluZm9cIiBkYXRhLW9wZW49XCJkb3JpSW5mb1wiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxBYm91dERPUklEUkknKX08L2E+XHJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJldmVhbFwiIGlkPVwiZG9yaUluZm9cIiBkYXRhLXJldmVhbD5cclxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb250ZW50XCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklJbmZvJyl9PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgZGF0YS1jbG9zZSBhcmlhLWxhYmVsPVwiQ2xvc2UgbW9kYWxcIiB0eXBlPVwiYnV0dG9uXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dmlzdWFsT3V0VGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz12aXN1YWxPdXRSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX0QnKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibW9yZVRhYmxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vcmVUYWJsZVwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxPdXRNYXhXaWR0aCcpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb3JlVGFibGVcIj48L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dmlzdWFsT3V0Um93PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRE9SSV9PJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1vcmVUYWJsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb3JlVGFibGVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsT3V0TWF4V2lkdGgnKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9yZVRhYmxlXCI+PC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXZpc3VhbE91dFJvdz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklfUicpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJtb3JlVGFibGVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9yZVRhYmxlXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE91dE1heFdpZHRoJyl9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vcmVUYWJsZVwiPjwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz12aXN1YWxPdXRSb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX0knKX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibW9yZVRhYmxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vcmVUYWJsZVwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxPdXRNYXhXaWR0aCcpfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb3JlVGFibGVcIj48L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgc2F2ZXByaW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIHNtYWxsLTEyIG1lZGl1bS0xMiBsYXJnZS0xMiB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJveCBzbWFsbC0xMiBsYXJnZS0xMiBtZWRpdW0tMTIgY29sdW1uIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJwcmludEJ1dHRvbiBsYXJnZSBidXR0b24gaG9sbG93XCIgaHJlZj1cImphdmFzY3JpcHQ6d2luZG93LnByaW50KCk7XCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVByaW50Jyl9PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwic2F2ZUJ1dHRvbiBsYXJnZSBidXR0b25cIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTYXZlJyl9PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHZlcnRpY2FsLXBhZGRpbmctYmlnXCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJjb2x1bW5zIHNtYWxsLTEyIG1lZGl1bS0xMiBsYXJnZS0xMiB0ZXh0LWNlbnRlclwiIHN0eWxlPVwicG9zaXRpb246cmVsYXRpdmU7XCI+XHJcblx0XHRcdFx0PGg2IGNsYXNzPVwiXCI+JHthcHAubGwoJ3NldHRpbmdzTW9kZVdoYXROZXh0Jyl9PC9oNj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93IHdoYXRuZXh0XCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sdW1ucyBzbWFsbC0xMiBtZWRpdW0tNCBsYXJnZS00XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZ3JhcGhpYyBncmFwaGljMVwiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJoZWFkbGluZVwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVXaGVyZVRvQnV5VGl0bGUnKX08L3A+XHJcblx0XHRcdFx0XHRcdDxwPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVXaGVyZVRvQnV5VGV4dCcpfTwvcD5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbHVtbnMgc21hbGwtMTIgbWVkaXVtLTQgbGFyZ2UtNFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImdyYXBoaWMgZ3JhcGhpYzJcIj48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDxwIGNsYXNzPVwiaGVhZGxpbmVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlTW9yZVByb2R1Y3RJbmZvVGl0bGUnKX08L3A+XHJcblx0XHRcdFx0XHRcdDxwPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVNb3JlUHJvZHVjdEluZm9UZXh0Jyl9PC9wPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sdW1ucyBzbWFsbC0xMiBtZWRpdW0tNCBsYXJnZS00XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiZ3JhcGhpYyBncmFwaGljM1wiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PHAgY2xhc3M9XCJoZWFkbGluZVwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVHZXRJblRvdWNoVGl0bGUnKX08L3A+XHJcblx0XHRcdFx0XHRcdDxwPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVHZXRJblRvdWNoVGV4dCcpfTwvcD5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG4gICAgICAgIGBcclxuICAgICk7XHJcblxyXG4gICAgbmV3IEZvdW5kYXRpb24uVGFicygkKCcjdmlldy10YWJzJykpO1xyXG4gICAgJCgnI3ZpZXctdGFicycpLm9uKCdjaGFuZ2UuemYudGFicycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgYXBwLnZpZXcgPSAkKCcjdmlldy10YWJzJykuZmluZCgnLmlzLWFjdGl2ZSBhJykuYXR0cignaHJlZicpID09PSAnI3ZpZXctc2lkZS1wYW5lbCcgPyAnc2lkZScgOiAndG9wJztcclxuICAgICAgICBpZiAoIWFwcC5zZXR0aW5ncy5hY3RpdmVDYW52YXMpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgcmVuZGVyVmlzdWFsKCk7XHJcbiAgICB9KTtcclxuICAgIGFwcC52aWV3ID0gJ3NpZGUnO1xyXG5cclxuICAgIHRoYXQuJGRvbS5vbignY2xpY2snLCAnLnZpc3VhbEJ1dHRvbnMgYnV0dG9uJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICB2YXIgcmF3ID0gYXBwLmdldFJhd0RhdGEoKTtcclxuICAgICAgICBpZiAoJChlLnRhcmdldCkuaGFzQ2xhc3MoJ2FjdGl2ZScpKSB7IHJldHVybjsgfVxyXG4gICAgICAgIC8vY2FtZXJhLCBkb3JpLCB2aV9hblxyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsQnV0dG9ucyBidXR0b24nKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcclxuICAgICAgICAkKGUudGFyZ2V0KS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgJCgnLnZpZXctY29udGVudCcpLmNzcygnZGlzcGxheScsICcnKTtcclxuICAgICAgICAkKCcudmlzdWFsU2Vjb25kUm93JykuY3NzKCd2aXNpYmlsaXR5JywgJycpO1xyXG4gICAgICAgIGlmICgkKGUudGFyZ2V0KS5oYXNDbGFzcygnYnV0dG9uRk9WRG9yaScpKSB7XHJcbiAgICAgICAgICAgICQoJy52aWV3LWNvbnRlbnQnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgICAgICAgICAkKCcudmlzdWFsU2Vjb25kUm93JykuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xyXG4gICAgICAgICAgICBhcHAuY3VycmVudC52aWV3ID0gJ3RoYXRkYW10YWJsZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgkKGUudGFyZ2V0KS5oYXNDbGFzcygnYnV0dG9uRk9WQ2FtZXJhJykpIHtcclxuICAgICAgICAgICAgYXBwLmN1cnJlbnQudmlldyA9ICdjYW1lcmEnO1xyXG4gICAgICAgICAgICAvLyAkKCcjdmlldy10b3AtcGFuZWwtbGFiZWwnKS5jc3MoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgkKGUudGFyZ2V0KS5oYXNDbGFzcygnYnV0dG9uRk9WVmlkZW9BbmFseXRpY3MnKSkge1xyXG4gICAgICAgICAgICBhcHAuY3VycmVudC52aWV3ID0gJ3ZpX2FuJztcclxuICAgICAgICAgICAgaWYgKGFwcC5jdXJyZW50LnZhLnR5cGUgPT0gXCJJVkEgUHJvIFRyYWZmaWNcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gJCgnI3ZpZXctc2lkZS1wYW5lbC1sYWJlbCcpLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAkKCcjdmlldy10b3AtcGFuZWwtbGFiZWwnKS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vICQoJyN2aWV3LXRvcC1wYW5lbC1sYWJlbCcpLmNzcyhcImRpc3BsYXlcIiwgXCJibG9ja1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoJChlLnRhcmdldCkuaGFzQ2xhc3MoJ2J1dHRvbkZPVkxlbnNjYWxjJykpIHtcclxuICAgICAgICAgICAgYXBwLmN1cnJlbnQudmlldyA9ICdkb3JpJztcclxuICAgICAgICAgICAgLy8gJCgnI3ZpZXctdG9wLXBhbmVsLWxhYmVsJykuY3NzKFwiZGlzcGxheVwiLCBcImJsb2NrXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaGFuZ2VMZWdlbmQocmF3KTtcclxuICAgICAgICBpZiAoIWFwcC5zZXR0aW5ncy5hY3RpdmVDYW52YXMpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKCQoZS50YXJnZXQpLmhhc0NsYXNzKCdidXR0b25GT1ZEb3JpJykpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgcmVuZGVyVmlzdWFsKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdW5jdGlvbiBjaGFuZ2VMZWdlbmQoKSB7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy5sZWdlbmRDb250JykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udCcpLmFkZENsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgICBpZiAoYXBwLmN1cnJlbnQudmlldyA9PT0gJ2NhbWVyYScpIHtcclxuICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy5sZWdlbmRDb250LmNhbWVyYScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFwcC5jdXJyZW50LnZpZXcgPT09ICdkb3JpJykge1xyXG4gICAgICAgICAgICBpZiAocmF3LlRoZXJtYWwgPT09ICdUUlVFJyB8fCByYXcuVGhlcm1hbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy5sZWdlbmRDb250LmRyaScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kcmknKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy5sZWdlbmRDb250LmRvcmknKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYycpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFwcC5jdXJyZW50LnZpZXcgPT09ICd2aV9hbicpIHtcclxuICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy5sZWdlbmRDb250LnZpX2FuJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xyXG4gICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4nKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhcHAuY3VycmVudC52aWV3ID09PSAndGhhdGRhbXRhYmxlJykge1xyXG4gICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLmxlZ2VuZENvbnQuZG9yaScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmknKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcC5vbignY2FtZXJhQ2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciByYXcgPSBhcHAuZ2V0UmF3RGF0YSgpO1xyXG4gICAgICAgIGlmIChyYXcuVGhlcm1hbCA9PT0gJ1RSVUUnIHx8IHJhdy5UaGVybWFsID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICQoJyNkb3JpSW5mbyAuY29udGVudCcpLmh0bWwoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxEUklJbmZvJykpO1xyXG4gICAgICAgICAgICAkKCcuYnV0dG9uRk9WRG9yaScpLnRleHQoJ0RSSScpO1xyXG4gICAgICAgICAgICBzZXRWaXVzYWxPdXRwdXRUb0RyaSgnJywgJycsICcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKCcjZG9yaUluZm8gLmNvbnRlbnQnKS5odG1sKGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRE9SSUluZm8nKSk7XHJcbiAgICAgICAgICAgICQoJy5idXR0b25GT1ZEb3JpJykudGV4dCgnRE9SSScpO1xyXG4gICAgICAgICAgICBzZXRWaXVzYWxPdXRwdXRUb0RvcmkoJycsICcnLCAnJywgJycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxCdXR0b25zIGJ1dHRvbicpLnJlbW92ZUNsYXNzKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgIGlmIChyYXcuSWxsdW1pbmF0b3IgIT09ICdUUlVFJykgeyB0aGF0LiRkb20uZmluZCgnLnZpc3VhbEJ1dHRvbnMgLmJ1dHRvbkZPVkNhbWVyYScpLmFkZENsYXNzKFwiaGlkZGVuXCIpOyB9XHJcbiAgICAgICAgaWYgKHJhdy5WaWRlb0FuYWx5dGljcyAhPT0gJ1RSVUUnKSB7IHRoYXQuJGRvbS5maW5kKCcudmlzdWFsQnV0dG9ucyAuYnV0dG9uRk9WVmlkZW9BbmFseXRpY3MnKS5hZGRDbGFzcyhcImhpZGRlblwiKTsgfVxyXG5cclxuICAgICAgICBpZiAoYXBwLmN1cnJlbnQudmEudHlwZSA9PSBcIklWQSBQcm8gVHJhZmZpY1wiKSB7XHJcbiAgICAgICAgICAgIC8vICQoJyN2aWV3LXNpZGUtcGFuZWwtbGFiZWwnKS5jbGljaygpO1xyXG4gICAgICAgICAgICAvLyAkKCcjdmlldy10b3AtcGFuZWwtbGFiZWwnKS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyAkKCcjdmlldy10b3AtcGFuZWwtbGFiZWwnKS5jc3MoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKGFwcC5jdXJyZW50LnZpZXcgPT09ICd2aV9hbicgJiYgcmF3LlZpZGVvQW5hbHl0aWNzICE9PSAnVFJVRScpIHx8IChhcHAuY3VycmVudC52aWV3ID09PSAnY2FtZXJhJyAmJiByYXcuSWxsdW1pbmF0b3IgIT09ICdUUlVFJykpIHtcclxuICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxCdXR0b25zIGJ1dHRvbicpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbEJ1dHRvbnMgLmJ1dHRvbkZPVkRvcmknKS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgYXBwLmN1cnJlbnQudmlldyA9ICdkb3JpJztcclxuICAgICAgICAgICAgY2hhbmdlTGVnZW5kKCk7XHJcbiAgICAgICAgICAgIGlmICghYXBwLnNldHRpbmdzLmFjdGl2ZUNhbnZhcykgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgcmVuZGVyVmlzdWFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIHJhdyA9IGFwcC5nZXRSYXdEYXRhKCk7XHJcbiAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbEJ1dHRvbnMgYnV0dG9uJykucmVtb3ZlQ2xhc3MoXCJoaWRkZW5cIik7XHJcbiAgICBpZiAocmF3LklsbHVtaW5hdG9yICE9PSAnVFJVRScpIHsgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxCdXR0b25zIC5idXR0b25GT1ZDYW1lcmEnKS5hZGRDbGFzcyhcImhpZGRlblwiKTsgfVxyXG4gICAgaWYgKHJhdy5WaWRlb0FuYWx5dGljcyAhPT0gJ1RSVUUnKSB7IHRoYXQuJGRvbS5maW5kKCcudmlzdWFsQnV0dG9ucyAuYnV0dG9uRk9WVmlkZW9BbmFseXRpY3MnKS5hZGRDbGFzcyhcImhpZGRlblwiKTsgfVxyXG5cclxuICAgIHRoYXQuJGRvbS5vbignY2xpY2snLCAnYS5zYXZlQnV0dG9uJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHdpbmRvdy5hcHBTYXZlKCk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgdmFyIHBpeGlSZWFkeSA9IGZhbHNlO1xyXG4gICAgdGhhdC4kZG9tLm9uKCdjbGljaycsICdhLmNhbGN1bGF0ZUJ1dHRvbicsIHJlbmRlclZpc3VhbCk7XHJcblxyXG4gICAgbGV0IGRlbGF5ID0gc2V0VGltZW91dCgoKSA9PiB7IHJlbmRlclZpc3VhbCgpOyB9LCAyMDApO1xyXG4gICAgJCgnLnNldHRpbmdzLXN0aWNreS1sb2FkLWluZGljYXRvcicpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgIHRoYXQuJGRvbS5vbignY2hhbmdlJywgJ2lucHV0JywgKCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWxheSkgeyBjbGVhclRpbWVvdXQoZGVsYXkpOyB9XHJcbiAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS1sb2FkLWluZGljYXRvcicpLmFkZENsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICBkZWxheSA9IHNldFRpbWVvdXQoKCkgPT4geyByZW5kZXJWaXN1YWwoKTsgfSwgMjAwKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoYXQuJGRvbS5vbignY2hhbmdlZC56Zi5zbGlkZXInLCAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRlbGF5KSB7IGNsZWFyVGltZW91dChkZWxheSk7IH1cclxuICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LWxvYWQtaW5kaWNhdG9yJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgIGRlbGF5ID0gc2V0VGltZW91dCgoKSA9PiB7IHJlbmRlclZpc3VhbCgpOyB9LCAyMDApO1xyXG4gICAgfSlcclxuXHJcblxyXG4gICAgLy8gZnVuY3Rpb24gY3JlYXRlVmlzdWFsaXplSW5mbygpIHtcclxuICAgIC8vICAgICBpZiAoJCgnLnZpc3VhbGl6ZUluZm8nKS5sZW5ndGgpIHsgcmV0dXJuOyB9XHJcbiAgICAvLyAgICAgJCgnPHNwYW4gY2xhc3M9XCJ2aXN1YWxpemVJbmZvXCI+JyArIGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsUGxlYXNlV2FpdCcpICsgJzwvc3Bhbj4nKS5jc3Moe1xyXG4gICAgLy8gICAgICAgICAncG9zaXRpb24nOiAnZml4ZWQnLFxyXG4gICAgLy8gICAgICAgICAndG9wJzogJzUwJScsXHJcbiAgICAvLyAgICAgICAgICdsZWZ0JzogJzUwJScsXHJcbiAgICAvLyAgICAgICAgICd0cmFuc2Zvcm0nOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcclxuICAgIC8vICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI2RiNWM2OCcsXHJcbiAgICAvLyAgICAgICAgICdwYWRkaW5nJzogJzVweCcsXHJcbiAgICAvLyAgICAgICAgICd6LWluZGV4JzogJzEwMDAyJyxcclxuICAgIC8vICAgICB9KS5hcHBlbmRUbygnYm9keScpO1xyXG4gICAgLy8gICAgICQoJ2JvZHknKS5jc3MoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZW5kZXJWaXN1YWwoZXZlbnQsIHBvcG91dCwgdHlwZSkge1xyXG4gICAgICAgIGlmICghcGl4aVJlYWR5KSB7IHJldHVybjsgfVxyXG4gICAgICAgICQoJy5oaWRlVGlsbENhbGMnKS5yZW1vdmVDbGFzcygnaGlkZVRpbGxDYWxjJyk7XHJcbiAgICAgICAgdmFyIGZpcnN0UnVuID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFhcHAuc2V0dGluZ3MuZmlyc3RWaXN1YWxpc2F0aW9uKSB7XHJcbiAgICAgICAgICAgIGZpcnN0UnVuID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgICBhcHAuc2V0dGluZ3MuZmlyc3RWaXN1YWxpc2F0aW9uID0gdHJ1ZTtcclxuICAgICAgICBhcHAuc2V0dGluZ3MuYWN0aXZlQ2FudmFzID0gdHJ1ZTtcclxuICAgICAgICB2YXIgY3VycmVudCA9IGFwcC5jdXJyZW50O1xyXG4gICAgICAgIHZhciByYXcgPSBhcHAuZ2V0UmF3RGF0YSgpO1xyXG5cclxuICAgICAgICAvLyBjcmVhdGVWaXN1YWxpemVJbmZvKCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAocmF3LmN0eXBlID09PSAnbm9ucGFubycgfHwgcmF3LmN0eXBlID09PSAnT3RoZXJzJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFwcC5jdXJyZW50LnZpZXcgPT0gXCJ2aV9hblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuLm5vbi1wYW5vJykuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuLnBhbm8nKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ubm9uLXBhbm8nKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IGFwcC5jdXJyZW50LnZpZXcsXHJcbiAgICAgICAgICAgICAgICAgICAgcmF3OiByYXcsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RSdW46IGZpcnN0UnVuLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgdE9IZWlnaHQgPSBOdW1iZXIucGFyc2VGbG9hdChjdXJyZW50LnRPSGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIHZhciB0T1dpZHRoID0gTnVtYmVyLnBhcnNlRmxvYXQoY3VycmVudC50T1dpZHRoKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC50T1dpZHRoID0gdE9XaWR0aDtcclxuICAgICAgICAgICAgICAgIHZhciBlbGV2YXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdChjdXJyZW50LmNhbWVyYUhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGlsdCA9IE51bWJlci5wYXJzZUZsb2F0KGN1cnJlbnQuY2FtVGlsdCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzX2hvciA9IE51bWJlci5wYXJzZUZsb2F0KHJhdy5Ib3Jpem9udGFsUmVzb2x1dGlvbik7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzX3ZlciA9IE51bWJlci5wYXJzZUZsb2F0KHJhdy5WZXJ0aWNhbFJlc29sdXRpb24pO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvdl9ob3IgPSBOdW1iZXIucGFyc2VGbG9hdChjdXJyZW50LmZvdl9ob3IgfHwgcmF3LkhGT1ZtaW4pO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvdl92ZXIgPSBOdW1iZXIucGFyc2VGbG9hdChjdXJyZW50LmZvdl92ZXIgfHwgcmF3LlZGT1ZtaW4pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNfaG9yID0gcmVzX2hvcjtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNfdmVyID0gcmVzX3ZlcjtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5mb3ZfaG9yID0gZm92X2hvcjtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5mb3ZfdmVyID0gZm92X3ZlcjtcclxuXHJcbiAgICAgICAgICAgICAgICByZXN1bHQudGlsdCA9IHRpbHQ7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZWxldmF0aW9uID0gZWxldmF0aW9uO1xyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5kbWluID0gZWxldmF0aW9uICogTWF0aC50YW4oZGVnVG9SYWQoOTAgLSB0aWx0IC0gZm92X3ZlciAvIDIpKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG1pbiA8IDApIHsgcmVzdWx0LmRtaW4gPSAwOyB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZG1heCA9IGVsZXZhdGlvbiAqIE1hdGgudGFuKGRlZ1RvUmFkKDkwIC0gdGlsdCArIGZvdl92ZXIgLyAyKSk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQub3Zlckhvcml6b24gPSAoOTAgLSB0aWx0ICsgZm92X3ZlciAvIDIpID49IDkwO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmRtYXhwID0gKGVsZXZhdGlvbiAtIEhVTUFOX0hFSUdIVCkgKiBNYXRoLnRhbihkZWdUb1JhZCg5MCAtIHRpbHQgKyBmb3ZfdmVyIC8gMikpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyYXcuSWxsdW1pbmF0b3IgPT09ICdUUlVFJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5pbGx1bWluYXRvciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlsbHVfcmFuZ2UgPSBOdW1iZXIucGFyc2VGbG9hdChyYXcuSWxsdW1pbmF0b3JSYW5nZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlsbHVfcmFuZ2VfZ3JvdW5kID0gTWF0aC5taW4oTWF0aC5zcXJ0KChyZXN1bHQuaWxsdV9yYW5nZSAqIHJlc3VsdC5pbGx1X3JhbmdlKSAtIChlbGV2YXRpb24gKiBlbGV2YXRpb24pKSwgcmVzdWx0LmRtYXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5pbGx1X2Z1bGxEaXN0YW5jZSA9IHJlc3VsdC5kbWF4O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQub3Zlckhvcml6b24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlsbHVfcmFuZ2VfZ3JvdW5kID0gTWF0aC5zcXJ0KChyZXN1bHQuaWxsdV9yYW5nZSAqIHJlc3VsdC5pbGx1X3JhbmdlKSAtIChlbGV2YXRpb24gKiBlbGV2YXRpb24pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlsbHVfZnVsbERpc3RhbmNlID0gcmVzdWx0LmlsbHVfcmFuZ2VfZ3JvdW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYocmVzdWx0LmlsbHVfcmFuZ2UpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYocmVzdWx0LmlsbHVfcmFuZ2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDQpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dCgoYXBwLnZpZXcgIT09ICdzaWRlJyA/IGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsSG9yaXpvbnRhbEFuZ2xlJykgOiBhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbFZlcnRpY2FsQW5nbGUnKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoNCkgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KChhcHAudmlldyAhPT0gJ3NpZGUnID8gZm92X2hvciA6IGZvdl92ZXIpLnRvRml4ZWQoMCkgKyAnwrAnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS10aXRsZS5pcicpLmNzcygndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS1jb250ZW50LmlyJykuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC5pciAuc2V0dGluZ3Mtc3RpY2t5LXJvdycpLmNoaWxkcmVuKClbMV0pLnRleHQoYXBwLmlGdEYocmVzdWx0LmlsbHVfcmFuZ2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS10aXRsZS5pcicpLmNzcygndmlzaWJpbGl0eScsICdoaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQuaXInKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJhdy5WaWRlb0FuYWx5dGljcyA9PT0gJ1RSVUUnIHx8IHJhdy5WaWRlb0FuYWx5dGljcyA9PT0gJ09QVCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhhcHAuY3VycmVudC52YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhX3Jlc19ob3IgPSBOdW1iZXIucGFyc2VGbG9hdChhcHAuY3VycmVudC52YS5oUmVzKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFfcmVzX3ZlciA9IE51bWJlci5wYXJzZUZsb2F0KGFwcC5jdXJyZW50LnZhLnZSZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YV90eXBlID0gYXBwLmN1cnJlbnQudmEudHlwZTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFfbWluX3NpemUgPSBhcHAuY3VycmVudC52YS5taW5fc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIiE/XCIsIHZhX21pbl9zaXplKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqX3ggPSB0T1dpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmpfeSA9IHRPSGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQudmFfZG1heE9iamVjdCA9IChlbGV2YXRpb24gLSB0T0hlaWdodCkgKiBNYXRoLnRhbihkZWdUb1JhZCg5MCAtIHRpbHQgKyBmb3ZfdmVyIC8gMikpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1nX3ggPSByZXNfaG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbWdfeSA9IHJlc192ZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YV94ID0gdmFfcmVzX2hvcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFfeSA9IHZhX3Jlc192ZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBWQV9vYmplY3RfcGl4ZWxfYmFzZV94LCBWQV9vYmplY3RfcGl4ZWxfYmFzZV95LCBWQV9taW5fb2JqZWN0X3BpeGVsX3gsIFZBX21pbl9vYmplY3RfcGl4ZWxfeTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgVkFfTUlOX1NJWkVfRVZBX0lWQV9QUk9fUEVSSU1FVEVSID0gMjA7IC8vIDIwIHBpeGVsIGFyZWEgc3VyZmFjZS4gaXMgaW4gdGhlIHRhYmxlIGZvciBubyByZWFzb25cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBWQV9NSU5fU0laRV9CVUlMRElOR19UUkFGRklDX0FSRUEgPSAyNTY7IC8vIDI1NiBwaXhlbCBhcmVhIHN1cmZhY2UgaXMgcmVxdWlyZWQsIG5vdyBzYW1lIGFsZ28gYXMgUGVyaW1ldGVyXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgVkFfTUlOX1NJWkVfUFJPX0FQUEVBUkFOQ0UgPSAyNzg0OyAvLyAyNTYgcGl4ZWwgYXJlYSBzdXJmYWNlIGlzIHJlcXVpcmVkLCBub3cgc2FtZSBhbGdvIGFzIFBlcmltZXRlclxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFZBX01JTl9TSVpFX1BST19QUEUgPSAyNzg0OyAvLyAyNTYgcGl4ZWwgYXJlYSBzdXJmYWNlIGlzIHJlcXVpcmVkLCBub3cgc2FtZSBhbGdvIGFzIFBlcmltZXRlclxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCB2YV9taW5fc2l6ZV90eXBlID0gMjA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHZhX3R5cGUgPT0gXCJFVkFcIiB8fCB2YV90eXBlID09IFwiSVZBXCIgfHwgdmFfdHlwZSA9PSBcIklWQSBQcm8gUGVyaW1ldGVyXCIgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHZhX21pbl9zaXplX3R5cGUgPSBWQV9NSU5fU0laRV9FVkFfSVZBX1BST19QRVJJTUVURVI7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICggdmFfdHlwZSA9PSBcIklWQSBQcm8gQXBwZWFyYW5jZVwiICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB2YV9taW5fc2l6ZV90eXBlID0gVkFfTUlOX1NJWkVfUFJPX0FQUEVBUkFOQ0U7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICh2YV90eXBlID09IFwiSVZBIFBybyBQUEVcIiApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdmFfbWluX3NpemVfdHlwZSA9IFZBX01JTl9TSVpFX1BST19QUEU7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAodmFfdHlwZSA9PSBcIklWQSBQcm8gQnVpbGRpbmdzXCIgfHwgdmFfdHlwZSA9PSBcIklWQSBQcm8gVHJhZmZpY1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHZhX21pbl9zaXplX3R5cGUgPSBWQV9NSU5fU0laRV9CVUlMRElOR19UUkFGRklDX0FSRUE7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqX3ggPCBvYmpfeSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBWQV9vYmplY3RfcGl4ZWxfYmFzZV94ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVkFfb2JqZWN0X3BpeGVsX2Jhc2VfeSA9IG9ial95IC8gb2JqX3g7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVkFfb2JqZWN0X3BpeGVsX2Jhc2VfeSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFZBX29iamVjdF9waXhlbF9iYXNlX3ggPSBvYmpfeCAvIG9ial95O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBWQV9taW5fb2JqZWN0X3BpeGVsX3ggPSBWQV9vYmplY3RfcGl4ZWxfYmFzZV94O1xyXG4gICAgICAgICAgICAgICAgICAgIFZBX21pbl9vYmplY3RfcGl4ZWxfeSA9IFZBX29iamVjdF9waXhlbF9iYXNlX3k7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChWQV9taW5fb2JqZWN0X3BpeGVsX3ggKiBWQV9taW5fb2JqZWN0X3BpeGVsX3kgPCB2YV9taW5fc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBWQV9taW5fb2JqZWN0X3BpeGVsX3ggKz0gVkFfb2JqZWN0X3BpeGVsX2Jhc2VfeDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVkFfbWluX29iamVjdF9waXhlbF95ICs9IFZBX29iamVjdF9waXhlbF9iYXNlX3k7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBWQV9taW5fb2JqZWN0X3BpeGVsX3ggPSBNYXRoLmNlaWwoVkFfbWluX29iamVjdF9waXhlbF94KTtcclxuICAgICAgICAgICAgICAgICAgICBWQV9taW5fb2JqZWN0X3BpeGVsX3kgPSBNYXRoLmNlaWwoVkFfbWluX29iamVjdF9waXhlbF95KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIElQUE1feCA9IFZBX21pbl9vYmplY3RfcGl4ZWxfeCAvIG9ial94ICogaW1nX3ggLyB2YV94O1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBJUFBNX3kgPSBWQV9taW5fb2JqZWN0X3BpeGVsX3kgLyBvYmpfeSAqIGltZ195IC8gdmFfeTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRtaW5oID0gdE9XaWR0aCAvICgyICogMC4zICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAvIDIpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRtaW52ID0gdE9IZWlnaHQgLyAoMiAqIDAuMyAqIE1hdGgudGFuKGRlZ1RvUmFkKGZvdl92ZXIgLyAyKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgZG1heHYgPSBvYmpfeSAvICgyICogKFZBX21pbl9vYmplY3RfcGl4ZWxfeSAvIHZhX3Jlc192ZXIpICogTWF0aC50YW4oZGVnVG9SYWQoZm92X3ZlciAqIC41KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkbWF4aCA9IG9ial94IC8gKDIgKiAoVkFfbWluX29iamVjdF9waXhlbF94IC8gdmFfcmVzX2hvcikgKiBNYXRoLnRhbihkZWdUb1JhZChmb3ZfaG9yICogLjUpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YV9kbWluID0gTWF0aC5tYXgoZG1pbnYsIGRtaW5oKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhX2RtaW4gPCBlbGV2YXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhX2RtaW5fZ3JvdW5kID0gcmVzdWx0LmRtaW47XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhX2RtaW5fZ3JvdW5kID0gTWF0aC5tYXgoTWF0aC5zcXJ0KChyZXN1bHQudmFfZG1pbiAqIHJlc3VsdC52YV9kbWluKSAtIChlbGV2YXRpb24gKiBlbGV2YXRpb24pKSwgcmVzdWx0LmRtaW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQudmFfZG1heCA9IE1hdGgubWluKGRtYXh2LCBkbWF4aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhX2RtYXhfZ3JvdW5kID0gTWF0aC5taW4oTWF0aC5zcXJ0KChyZXN1bHQudmFfZG1heCAqIHJlc3VsdC52YV9kbWF4KSAtIChlbGV2YXRpb24gKiBlbGV2YXRpb24pKSwgcmVzdWx0LnZhX2RtYXhPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YV9mdWxsRGlzdGFuY2UgPSByZXN1bHQuZG1heDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lm92ZXJIb3Jpem9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YV9kbWF4X2dyb3VuZCA9IE1hdGguc3FydCgocmVzdWx0LnZhX2RtYXggKiByZXN1bHQudmFfZG1heCkgLSAoZWxldmF0aW9uICogZWxldmF0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YV9mdWxsRGlzdGFuY2UgPSByZXN1bHQudmFfZG1heF9ncm91bmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5jZW50ZXIgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogNTQsXHJcbiAgICAgICAgICAgICAgICAgICAgeTogMTY5XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJhdy5UaGVybWFsID09PSAnVFJVRScgfHwgcmF3LlRoZXJtYWwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlcm1hbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBfZ3JvdW5kX21heCA9IC0xMDAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kX2RyaV9pID0gcmVzX2hvciAvICgyICogRFJJX0kgKiBNYXRoLnRhbihkZWdUb1JhZChmb3ZfaG9yICogMC41KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZF9kcmlfaSA+IGVsZXZhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZF9kcmlfaV9ncm91bmQgPSBNYXRoLnNxcnQoKHJlc3VsdC5kX2RyaV9pICogcmVzdWx0LmRfZHJpX2kpIC0gKGVsZXZhdGlvbiAqIGVsZXZhdGlvbikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucF9ncm91bmRfbWF4ID0gTWF0aC5tYXgocmVzdWx0LnBfZ3JvdW5kX21heCwgcmVzdWx0LmRfZHJpX2lfZ3JvdW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRfZHJpX3IgPSByZXNfaG9yIC8gKDIgKiBEUklfUiAqIE1hdGgudGFuKGRlZ1RvUmFkKGZvdl9ob3IgKiAwLjUpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kX2RyaV9yID4gZWxldmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kX2RyaV9yX2dyb3VuZCA9IE1hdGguc3FydCgocmVzdWx0LmRfZHJpX3IgKiByZXN1bHQuZF9kcmlfcikgLSAoZWxldmF0aW9uICogZWxldmF0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wX2dyb3VuZF9tYXggPSBNYXRoLm1heChyZXN1bHQucF9ncm91bmRfbWF4LCByZXN1bHQuZF9kcmlfcl9ncm91bmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZF9kcmlfZCA9IHJlc19ob3IgLyAoMiAqIERSSV9EICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAqIDAuNSkpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRfZHJpX2QgPiBlbGV2YXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRfZHJpX2RfZ3JvdW5kID0gTWF0aC5zcXJ0KChyZXN1bHQuZF9kcmlfZCAqIHJlc3VsdC5kX2RyaV9kKSAtIChlbGV2YXRpb24gKiBlbGV2YXRpb24pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBfZ3JvdW5kX21heCA9IE1hdGgubWF4KHJlc3VsdC5wX2dyb3VuZF9tYXgsIHJlc3VsdC5kX2RyaV9kX2dyb3VuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG1heHAgPiAwICYmIHJlc3VsdC5kbWF4cCA8IDEwMDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wX2dyb3VuZF9tYXggPSBNYXRoLm1pbihyZXN1bHQucF9ncm91bmRfbWF4LCByZXN1bHQuZG1heHApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZG9yaV9ncm91bmRfbWF4ID0gcmVzdWx0LnBfZ3JvdW5kX21heDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5vdmVySG9yaXpvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZG9yaV9ncm91bmRfbWF4ID0gTWF0aC5tYXgocmVzdWx0LmRtYXgsIHJlc3VsdC5wX2dyb3VuZF9tYXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRoZXJtYWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucF9ncm91bmRfbWF4ID0gLTEwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRfZG9yaV9pID0gcmVzX2hvciAvICgyICogRE9SSV9JICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAqIDAuNSkpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRfZG9yaV9pID4gZWxldmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kX2RvcmlfaV9ncm91bmQgPSBNYXRoLnNxcnQoKHJlc3VsdC5kX2RvcmlfaSAqIHJlc3VsdC5kX2RvcmlfaSkgLSAoZWxldmF0aW9uICogZWxldmF0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wX2dyb3VuZF9tYXggPSBNYXRoLm1heChyZXN1bHQucF9ncm91bmRfbWF4LCByZXN1bHQuZF9kb3JpX2lfZ3JvdW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRfZG9yaV9yID0gcmVzX2hvciAvICgyICogRE9SSV9SICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAqIDAuNSkpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRfZG9yaV9yID4gZWxldmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kX2Rvcmlfcl9ncm91bmQgPSBNYXRoLnNxcnQoKHJlc3VsdC5kX2RvcmlfciAqIHJlc3VsdC5kX2RvcmlfcikgLSAoZWxldmF0aW9uICogZWxldmF0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wX2dyb3VuZF9tYXggPSBNYXRoLm1heChyZXN1bHQucF9ncm91bmRfbWF4LCByZXN1bHQuZF9kb3JpX3JfZ3JvdW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRfZG9yaV9vID0gcmVzX2hvciAvICgyICogRE9SSV9PICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAqIDAuNSkpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRfZG9yaV9vID4gZWxldmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kX2Rvcmlfb19ncm91bmQgPSBNYXRoLnNxcnQoKHJlc3VsdC5kX2RvcmlfbyAqIHJlc3VsdC5kX2RvcmlfbykgLSAoZWxldmF0aW9uICogZWxldmF0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wX2dyb3VuZF9tYXggPSBNYXRoLm1heChyZXN1bHQucF9ncm91bmRfbWF4LCByZXN1bHQuZF9kb3JpX29fZ3JvdW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRfZG9yaV9kID0gcmVzX2hvciAvICgyICogRE9SSV9EICogTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAqIDAuNSkpKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRfZG9yaV9kID4gZWxldmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kX2RvcmlfZF9ncm91bmQgPSBNYXRoLnNxcnQoKHJlc3VsdC5kX2RvcmlfZCAqIHJlc3VsdC5kX2RvcmlfZCkgLSAoZWxldmF0aW9uICogZWxldmF0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wX2dyb3VuZF9tYXggPSBNYXRoLm1heChyZXN1bHQucF9ncm91bmRfbWF4LCByZXN1bHQuZF9kb3JpX2RfZ3JvdW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWF4cCA+IDAgJiYgcmVzdWx0LmRtYXhwIDwgMTAwMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBfZ3JvdW5kX21heCA9IE1hdGgubWluKHJlc3VsdC5wX2dyb3VuZF9tYXgsIHJlc3VsdC5kbWF4cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kb3JpX2dyb3VuZF9tYXggPSByZXN1bHQucF9ncm91bmRfbWF4O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Lm92ZXJIb3Jpem9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kb3JpX2dyb3VuZF9tYXggPSBNYXRoLm1heChyZXN1bHQuZG1heCwgcmVzdWx0LnBfZ3JvdW5kX21heCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5tYXNrUG9pbnQxID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IDYyMCxcclxuICAgICAgICAgICAgICAgICAgICB5OiByZXN1bHQuY2VudGVyLnkgLSBNYXRoLnRhbihkZWdUb1JhZChmb3ZfaG9yICogMC41KSkgKiA1NjZcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXN1bHQubWFza1BvaW50MiA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4OiA2MjAsXHJcbiAgICAgICAgICAgICAgICAgICAgeTogcmVzdWx0LmNlbnRlci55ICsgTWF0aC50YW4oZGVnVG9SYWQoZm92X2hvciAqIDAuNSkpICogNTY2XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJhdy5UaGVybWFsID09PSAnVFJVRScgfHwgcmF3LlRoZXJtYWwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2hvcmRNYXggPSAyICogKHJlc3VsdC5kbWF4ID4gcmVzdWx0LmRfZHJpX2QgPyByZXN1bHQuZG1heCA6IHJlc3VsdC5kX2RyaV9kKSAqIE1hdGguc2luKGRlZ1RvUmFkKGZvdl9ob3IgLyAyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNob3JkRG1heCA9IDIgKiByZXN1bHQuZG1heCAqIE1hdGguc2luKGRlZ1RvUmFkKHJlc3VsdC5mb3ZfaG9yIC8gMikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jaG9yZERvcmlkID0gMiAqIHJlc3VsdC5kX2RyaV9kICogTWF0aC5zaW4oZGVnVG9SYWQocmVzdWx0LmZvdl9ob3IgLyAyKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5taWRkbGUgPSAoKHJlc3VsdC5kbWF4cCA8IHJlc3VsdC5kX2RyaV9kID8gcmVzdWx0LmRtYXhwIDogcmVzdWx0LmRfZHJpX2QpICsgcmVzdWx0LmRtaW4pIC8gMjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRtYXggPCAwKSB7IHJlc3VsdC5taWRkbGUgPSAocmVzdWx0LmRfZHJpX2QgKyByZXN1bHQuZG1pbikgLyAyOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNob3JkTWlkZGxlID0gcmVzdWx0Lm1pZGRsZSAqIE1hdGguc2luKGRlZ1RvUmFkKGZvdl9ob3IgLyAyKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jaG9yZE1heCA9IDIgKiAocmVzdWx0LmRtYXggPiByZXN1bHQuZF9kb3JpX2QgPyByZXN1bHQuZG1heCA6IHJlc3VsdC5kX2RvcmlfZCkgKiBNYXRoLnNpbihkZWdUb1JhZChmb3ZfaG9yIC8gMikpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jaG9yZERtYXggPSAyICogcmVzdWx0LmRtYXggKiBNYXRoLnNpbihkZWdUb1JhZChyZXN1bHQuZm92X2hvciAvIDIpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2hvcmREb3JpZCA9IDIgKiByZXN1bHQuZF9kb3JpX2QgKiBNYXRoLnNpbihkZWdUb1JhZChyZXN1bHQuZm92X2hvciAvIDIpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1pZGRsZSA9ICgocmVzdWx0LmRtYXhwIDwgcmVzdWx0LmRfZG9yaV9kID8gcmVzdWx0LmRtYXhwIDogcmVzdWx0LmRfZG9yaV9kKSArIHJlc3VsdC5kbWluKSAvIDI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWF4IDwgMCkgeyByZXN1bHQubWlkZGxlID0gKHJlc3VsdC5kX2RvcmlfZCArIHJlc3VsdC5kbWluKSAvIDI7IH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2hvcmRNaWRkbGUgPSByZXN1bHQubWlkZGxlICogTWF0aC5zaW4oZGVnVG9SYWQoZm92X2hvciAvIDIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhcHAudmlldyA9PSAnc2lkZScgPyBWaXN1YWxOb25wYW5vU2lkZSh0aGF0LiRkb20uZmluZCgnLmZvdlNpZGVDb250YWluZXInKSwgcmVzdWx0KSA6IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYXBwLnZpZXcgPT0gJ3RvcCcgPyBWaXN1YWxOb25wYW5vVG9wKHRoYXQuJGRvbS5maW5kKCcuZm92VG9wQ29udGFpbmVyJyksIHJlc3VsdCkgOiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmF3LlZpZGVvQW5hbHl0aWNzID09PSAnVFJVRScgfHwgcmF3LlZpZGVvQW5hbHl0aWNzID09PSAnT1BUJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YW1pbiA9IHJlc3VsdC5kbWluO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YW1heCA9IHJlc3VsdC5kbWF4cDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFtYXggPiAxMDAwMCkgeyB2YW1heCA9IHJlc3VsdC5kX2RvcmlfZDsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YW1pbiA8IDApIHsgdmFtaW4gPSAwOyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbiAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuLmxlc3NUYWJsZTpudGgtY2hpbGQoNCknKS50ZXh0KGFwcC5pRnRGKHJlc3VsdC52YV9kbWluX2dyb3VuZCkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbiAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuLmxlc3NUYWJsZTpudGgtY2hpbGQoNCknKS50ZXh0KGFwcC5pRnRGKHJlc3VsdC52YV9kbWF4X2dyb3VuZCkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbiAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuLm1vcmVUYWJsZTpudGgtY2hpbGQoNiknKS50ZXh0KGFwcC5pRnRGKHJlc3VsdC52YV9kbWluKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSArICcqJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW4ubW9yZVRhYmxlOm50aC1jaGlsZCg2KScpLnRleHQoYXBwLmlGdEYocmVzdWx0LnZhX2RtYXgpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpICsgJyonKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4gLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KChhcHAudmlldyAhPT0gJ3NpZGUnID8gZm92X2hvciA6IGZvdl92ZXIpLnRvRml4ZWQoMCkgKyAnwrAnKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4gLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMSknKS50ZXh0KChhcHAudmlldyAhPT0gJ3NpZGUnID8gYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxIb3Jpem9udGFsQW5nbGUnKSA6IGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsVmVydGljYWxBbmdsZScpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1zdGlja3ktdGl0bGUudmEtbW9kZScpLmNzcygndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS1jb250ZW50LnZhLW1vZGUnKS5jc3MoJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC52YS1tb2RlIC5zZXR0aW5ncy1zdGlja3ktcm93Om50aC1jaGlsZCgxKScpLmNoaWxkcmVuKCkuZmlyc3QoKS5uZXh0KCkudGV4dChhcHAuaUZ0RihyZXN1bHQudmFfZG1heCkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC52YS1tb2RlIC5zZXR0aW5ncy1zdGlja3ktcm93Om50aC1jaGlsZCgyKScpLmNoaWxkcmVuKCkuZmlyc3QoKS5uZXh0KCkudGV4dChhcHAuaUZ0RihyZXN1bHQudmFfZG1pbikudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LXRpdGxlLnZhLW1vZGUnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS1jb250ZW50LnZhLW1vZGUnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LXRpdGxlLnZhLW1vZGUnKS50ZXh0KHZhX3R5cGUpO1xyXG4gICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDQpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dCgoYXBwLnZpZXcgIT09ICdzaWRlJyA/IGZvdl9ob3IgOiBmb3ZfdmVyKS50b0ZpeGVkKDApICsgJ8KwJyk7XHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoNCkgc3BhbjpudGgtY2hpbGQoMSknKS50ZXh0KChhcHAudmlldyAhPT0gJ3NpZGUnID8gYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxIb3Jpem9udGFsQW5nbGUnKSA6IGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsVmVydGljYWxBbmdsZScpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJhdy5UaGVybWFsID09PSAnVFJVRScgfHwgcmF3LlRoZXJtYWwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRWaXVzYWxPdXRwdXRUb0RyaShhcHAuaUZ0RihyZXN1bHQuZF9kcmlfZCkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCksIGFwcC5pRnRGKHJlc3VsdC5kX2RyaV9yKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSwgYXBwLmlGdEYocmVzdWx0LmRfZHJpX2kpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0Vml1c2FsT3V0cHV0VG9Eb3JpKGFwcC5pRnRGKHJlc3VsdC5kX2RvcmlfZCkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCksIGFwcC5pRnRGKHJlc3VsdC5kX2RvcmlfbykudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCksIGFwcC5pRnRGKHJlc3VsdC5kX2RvcmlfcikudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCksIGFwcC5pRnRGKHJlc3VsdC5kX2RvcmlfaSkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC5kb3JpIC5zZXR0aW5ncy1zdGlja3ktcm93JykuZXEoMCkuY2hpbGRyZW4oKS5maXJzdCgpLm5leHQoKS50ZXh0KGFwcC5pRnRGKHJlc3VsdC5kX2RvcmlfZCkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS1jb250ZW50LmRvcmkgLnNldHRpbmdzLXN0aWNreS1yb3cnKS5lcSgxKS5jaGlsZHJlbigpLmZpcnN0KCkubmV4dCgpLnRleHQoYXBwLmlGdEYocmVzdWx0LmRfZG9yaV9vKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQuZG9yaSAuc2V0dGluZ3Mtc3RpY2t5LXJvdycpLmVxKDIpLmNoaWxkcmVuKCkuZmlyc3QoKS5uZXh0KCkudGV4dChhcHAuaUZ0RihyZXN1bHQuZF9kb3JpX3IpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC5kb3JpIC5zZXR0aW5ncy1zdGlja3ktcm93JykuZXEoMykuY2hpbGRyZW4oKS5maXJzdCgpLm5leHQoKS50ZXh0KGFwcC5pRnRGKHJlc3VsdC5kX2RvcmlfaSkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vICQoJy52aXN1YWxpemVJbmZvJykucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAkKCdib2R5JykuY3NzKCdwb2ludGVyLWV2ZW50cycsICdhdXRvJyk7XHJcbiAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LWxvYWQtaW5kaWNhdG9yJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgYXBwLmxhc3RSZXN1bHQgPSByZXN1bHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmF3LmN0eXBlID09PSAncGFubycpIHtcclxuICAgICAgICAgICAgICAgIC8vICQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE5vdEF2YWlsYWJsZScpKTtcclxuICAgICAgICAgICAgICAgICQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDQpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE5vdEF2YWlsYWJsZScpKTtcclxuICAgICAgICAgICAgICAgICQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCg0KSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxOb3RBdmFpbGFibGUnKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBwLmN1cnJlbnQudmlldyA9PSBcInZpX2FuXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ubm9uLXBhbm8nKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vJykuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5ub24tcGFubycpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuLnBhbm8nKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHZhciBvYmogPSBvYmogfHwge307XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB2aWV3OiBhcHAuY3VycmVudC52aWV3LFxyXG4gICAgICAgICAgICAgICAgICAgIHJhdzogcmF3LFxyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0UnVuOiBmaXJzdFJ1bixcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB2YXIgdE9IZWlnaHQgPSBOdW1iZXIucGFyc2VGbG9hdChjdXJyZW50LnRPSGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIHZhciB0T1dpZHRoID0gTnVtYmVyLnBhcnNlRmxvYXQoY3VycmVudC50T1dpZHRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZWxldmF0aW9uID0gTnVtYmVyLnBhcnNlRmxvYXQoY3VycmVudC5jYW1lcmFIZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmExID0gTnVtYmVyLnBhcnNlRmxvYXQocmF3LkExKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5hMyA9IE51bWJlci5wYXJzZUZsb2F0KHJhdy5BMyk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuYTUgPSBOdW1iZXIucGFyc2VGbG9hdChyYXcuQTUpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnBpeGVsX3NpemUgPSBOdW1iZXIucGFyc2VGbG9hdChyYXcuUGl4ZWxTaXplKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5mb3YgPSAzNjA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJhdy5JbGx1bWluYXRvciA9PT0gJ1RSVUUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlsbHVtaW5hdG9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuaWxsdV9yYW5nZSA9IE51bWJlci5wYXJzZUZsb2F0KHJhdy5JbGx1bWluYXRvclJhbmdlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuaWxsdV9yYW5nZV9ncm91bmQgPSByZXN1bHQuaWxsdV9yYW5nZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS10aXRsZS5pcicpLmNzcygndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS1jb250ZW50LmlyJykuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC5pciAuc2V0dGluZ3Mtc3RpY2t5LXJvdycpLmNoaWxkcmVuKClbMV0pLnRleHQoYXBwLmlGdEYocmVzdWx0LmlsbHVfcmFuZ2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS10aXRsZS5pcicpLmNzcygndmlzaWJpbGl0eScsICdoaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQuaXInKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJhdy5WaWRlb0FuYWx5dGljcyA9PT0gJ09QVCcgfHwgcmF3LlZpZGVvQW5hbHl0aWNzID09PSAnVFJVRScpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqX3ggPSB0T1dpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmpfeSA9IHRPSGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1nX3ggPSBOdW1iZXIucGFyc2VGbG9hdChyYXcuSG9yaXpvbnRhbFJlc29sdXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbWdfeSA9IE51bWJlci5wYXJzZUZsb2F0KHJhdy5WZXJ0aWNhbFJlc29sdXRpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFfeCA9IE51bWJlci5wYXJzZUZsb2F0KGFwcC5jdXJyZW50LnZhLmhSZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YV95ID0gTnVtYmVyLnBhcnNlRmxvYXQoYXBwLmN1cnJlbnQudmEudlJlcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBWQV9vYmplY3RfcGl4ZWxfYmFzZV94LCBWQV9vYmplY3RfcGl4ZWxfYmFzZV95LCBWQV9taW5fb2JqZWN0X3BpeGVsX3gsIFZBX21pbl9vYmplY3RfcGl4ZWxfeTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9ial94IDwgb2JqX3kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVkFfb2JqZWN0X3BpeGVsX2Jhc2VfeCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFZBX29iamVjdF9waXhlbF9iYXNlX3kgPSBvYmpfeSAvIG9ial94O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFZBX29iamVjdF9waXhlbF9iYXNlX3kgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBWQV9vYmplY3RfcGl4ZWxfYmFzZV94ID0gb2JqX3ggLyBvYmpfeTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgVkFfbWluX29iamVjdF9waXhlbF94ID0gVkFfb2JqZWN0X3BpeGVsX2Jhc2VfeDtcclxuICAgICAgICAgICAgICAgICAgICBWQV9taW5fb2JqZWN0X3BpeGVsX3kgPSBWQV9vYmplY3RfcGl4ZWxfYmFzZV95O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoVkFfbWluX29iamVjdF9waXhlbF94ICogVkFfbWluX29iamVjdF9waXhlbF95IDwgYXBwLmN1cnJlbnQudmEubWluX3NpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVkFfbWluX29iamVjdF9waXhlbF94ICs9IFZBX29iamVjdF9waXhlbF9iYXNlX3g7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFZBX21pbl9vYmplY3RfcGl4ZWxfeSArPSBWQV9vYmplY3RfcGl4ZWxfYmFzZV95O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgVkFfbWluX29iamVjdF9waXhlbF94ID0gTWF0aC5jZWlsKFZBX21pbl9vYmplY3RfcGl4ZWxfeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgVkFfbWluX29iamVjdF9waXhlbF95ID0gTWF0aC5jZWlsKFZBX21pbl9vYmplY3RfcGl4ZWxfeSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBJUFBNX3ggPSBWQV9taW5fb2JqZWN0X3BpeGVsX3ggLyBvYmpfeCAqIGltZ194IC8gdmFfeDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgSVBQTV95ID0gVkFfbWluX29iamVjdF9waXhlbF95IC8gb2JqX3kgKiBpbWdfeSAvIHZhX3k7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50T0hlaWdodCA9IHRPSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5JUFBNX3kgPSBJUFBNX3k7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmltZ195ID0gTnVtYmVyLnBhcnNlRmxvYXQocmF3LlZlcnRpY2FsUmVzb2x1dGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmRfZG9yaV9kID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5kX2RvcmlfbyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQuZF9kb3JpX3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmRfZG9yaV9pID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgbGFzdFZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlICs9IDAuMDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcC5jdXJyZW50Lm1vdW50cG9zaXRpb24gPT09ICdXYWxsJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwaGFfaGVhZCA9IHJhZFRvRGVnKE1hdGguYXRhbigocmVzdWx0LmVsZXZhdGlvbiAtIEhVTUFOX0hFSUdIVCkgLyBkaXN0YW5jZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWxwaGFfZm9vdCA9IHJhZFRvRGVnKE1hdGguYXRhbihyZXN1bHQuZWxldmF0aW9uIC8gZGlzdGFuY2UpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwaXhlbF9oZWFkID0gcmVzdWx0LmExICogYWxwaGFfaGVhZCArIHJlc3VsdC5hMyAqIE1hdGgucG93KGFscGhhX2hlYWQsIDMpICsgcmVzdWx0LmE1ICogTWF0aC5wb3coYWxwaGFfaGVhZCwgNSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwaXhlbF9mb290ID0gcmVzdWx0LmExICogYWxwaGFfZm9vdCArIHJlc3VsdC5hMyAqIE1hdGgucG93KGFscGhhX2Zvb3QsIDMpICsgcmVzdWx0LmE1ICogTWF0aC5wb3coYWxwaGFfZm9vdCwgNSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0X3BpeGVsID0gKHBpeGVsX2Zvb3QgLSBwaXhlbF9oZWFkKSAvIHJlc3VsdC5waXhlbF9zaXplICogMTAwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbnNpdHkgPSB0YXJnZXRfcGl4ZWwgLyBIVU1BTl9IRUlHSFQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcHAuY3VycmVudC5tb3VudHBvc2l0aW9uID09PSAnQ2VpbGluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9iYXNlZCBvbiBoZWlnaHRcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBoYV9oZWFkID0gcmFkVG9EZWcoTWF0aC5hdGFuKGRpc3RhbmNlIC8gKHJlc3VsdC5lbGV2YXRpb24gLSBIVU1BTl9IRUlHSFQpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbHBoYV9mb290ID0gcmFkVG9EZWcoTWF0aC5hdGFuKGRpc3RhbmNlIC8gcmVzdWx0LmVsZXZhdGlvbikpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBpeGVsX2hlYWQgPSByZXN1bHQuYTEgKiBhbHBoYV9oZWFkICsgcmVzdWx0LmEzICogTWF0aC5wb3coYWxwaGFfaGVhZCwgMykgKyByZXN1bHQuYTUgKiBNYXRoLnBvdyhhbHBoYV9oZWFkLCA1KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBpeGVsX2Zvb3QgPSByZXN1bHQuYTEgKiBhbHBoYV9mb290ICsgcmVzdWx0LmEzICogTWF0aC5wb3coYWxwaGFfZm9vdCwgMykgKyByZXN1bHQuYTUgKiBNYXRoLnBvdyhhbHBoYV9mb290LCA1KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRfcGl4ZWwgPSAocGl4ZWxfaGVhZCAtIHBpeGVsX2Zvb3QpIC8gcmVzdWx0LnBpeGVsX3NpemUgKiAxMDAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVuc2l0eSA9IHRhcmdldF9waXhlbCAvIEhVTUFOX0hFSUdIVDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vYmFzZWQgb24gd2lkdGhcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhX2xlZnQgPSByYWRUb0RlZyhNYXRoLmF0YW4oKGRpc3RhbmNlICsgKEhVTUFOX1dJRFRIIC8gMikpIC8gKHJlc3VsdC5lbGV2YXRpb24gLSBIVU1BTl9IRUlHSFQpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhX3JpZ2h0ID0gcmFkVG9EZWcoTWF0aC5hdGFuKChkaXN0YW5jZSAtIChIVU1BTl9XSURUSCAvIDIpKSAvIChyZXN1bHQuZWxldmF0aW9uIC0gSFVNQU5fSEVJR0hUKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBpeGVsX2xlZnQgPSByZXN1bHQuYTEgKiBhX2xlZnQgKyByZXN1bHQuYTMgKiBNYXRoLnBvdyhhX2xlZnQsIDMpICsgcmVzdWx0LmE1ICogTWF0aC5wb3coYV9sZWZ0LCA1KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBpeGVsX3JpZ2h0ID0gcmVzdWx0LmExICogYV9yaWdodCArIHJlc3VsdC5hMyAqIE1hdGgucG93KGFfcmlnaHQsIDMpICsgcmVzdWx0LmE1ICogTWF0aC5wb3coYV9yaWdodCwgNSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0X3BpeGVsX2FsdCA9IChwaXhlbF9sZWZ0IC0gcGl4ZWxfcmlnaHQpIC8gcmVzdWx0LnBpeGVsX3NpemUgKiAxMDAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVuc2l0eV9hbHQgPSB0YXJnZXRfcGl4ZWxfYWx0IC8gSFVNQU5fV0lEVEg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVuc2l0eV9hbHQgPiBkZW5zaXR5KSB7IGRlbnNpdHkgPSBkZW5zaXR5X2FsdDsgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gMTAwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZW5zaXR5IDwgRE9SSV9EICYmIGxhc3RWYWx1ZSA+IGRlbnNpdHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBkZW5zaXR5O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVuc2l0eSAqIHJlc3VsdC50T0hlaWdodCA8PSByZXN1bHQuaW1nX3kgKiAuMyAmJiAhcmVzdWx0LnZhX2RtaW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Jc3Qga2xlaW5lciBhbHMgMzAlIGRpZXMgQmlsZHNjaGlybSBTY3JlZW5zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YV9kbWluID0gZGlzdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVuc2l0eSA+IHJlc3VsdC5JUFBNX3kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhX2RtYXggPSBkaXN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZW5zaXR5ID49IERPUklfRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZF9kb3JpX2QgPSBkaXN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZW5zaXR5ID49IERPUklfTykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZF9kb3JpX28gPSBkaXN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZW5zaXR5ID49IERPUklfUikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZF9kb3JpX3IgPSBkaXN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZW5zaXR5ID49IERPUklfSSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZF9kb3JpX2kgPSBkaXN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFwcC5jdXJyZW50Lm1vdW50cG9zaXRpb24gPT09ICdXYWxsJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC52aWV3ID09ICdzaWRlJyA/IFZpc3VhbFBhbm8zNjBTaWRlV2FsbCh0aGF0LiRkb20uZmluZCgnLmZvdlNpZGVDb250YWluZXInKSwgcmVzdWx0KSA6IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC52aWV3ID09ICd0b3AnID8gVmlzdWFsUGFubzM2MFRvcFdhbGwodGhhdC4kZG9tLmZpbmQoJy5mb3ZUb3BDb250YWluZXInKSwgcmVzdWx0KSA6IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcHAuY3VycmVudC5tb3VudHBvc2l0aW9uID09PSAnQ2VpbGluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcHAudmlldyA9PSAnc2lkZScgPyBWaXN1YWxQYW5vMzYwU2lkZUNlaWwodGhhdC4kZG9tLmZpbmQoJy5mb3ZTaWRlQ29udGFpbmVyJyksIHJlc3VsdCkgOiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBhcHAudmlldyA9PSAndG9wJyA/IFZpc3VhbFBhbm8zNjBUb3BDZWlsKHRoYXQuJGRvbS5maW5kKCcuZm92VG9wQ29udGFpbmVyJyksIHJlc3VsdCkgOiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmF3LlZpZGVvQW5hbHl0aWNzID09PSAnVFJVRScgfHwgcmF3LlZpZGVvQW5hbHl0aWNzID09PSAnT1BUJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YW1pbiA9IHJlc3VsdC52YV9kbWluO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YW1heCA9IHJlc3VsdC52YV9kbWF4O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YW1heCA+IDEwMDAwKSB7IHZhbWF4ID0gcmVzdWx0LmRfZG9yaV9kOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbWluIDwgMCkgeyB2YW1pbiA9IDA7IH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpJykuY3NzKCdkaXNwbGF5JywgJ3RhYmxlLXJvdycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDQpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE5vdEF2YWlsYWJsZScpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuLnBhbm8gLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDQpJykudGV4dChhcHAuaUZ0Rih2YW1heCkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LXRpdGxlLnZhLW1vZGUnKS5jc3MoJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC52YS1tb2RlJykuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQudmEtbW9kZSAuc2V0dGluZ3Mtc3RpY2t5LXJvdzpudGgtY2hpbGQoMSknKS5jaGlsZHJlbigpLmZpcnN0KCkubmV4dCgpLnRleHQoYXBwLmlGdEYocmVzdWx0LnZhX2RtYXgpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQudmEtbW9kZSAuc2V0dGluZ3Mtc3RpY2t5LXJvdzpudGgtY2hpbGQoMiknKS5jaGlsZHJlbigpLmZpcnN0KCkubmV4dCgpLnRleHQoYXBwLmlGdEYocmVzdWx0LnZhX2RtaW4pLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS10aXRsZS52YS1tb2RlJykuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC52YS1tb2RlJykuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpJykucmVtb3ZlQ2xhc3MoJ2RyaScpO1xyXG4gICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFRpdGxlJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE91dENhbGNET1JJJykpO1xyXG4gICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dEluZm8nKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsT3V0TW9yZURPUkknKSk7XHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbFNlY29uZFJvdyAudmlzdWFsQnV0dG9ucyAuYnV0dG9uRk9WRG9yaScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJJykpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcHAuY3VycmVudC52aWV3ID09PSAnZG9yaScpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbFNlY29uZFJvdyAubGVnZW5kQ29udC5kcmknKS5hZGRDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxTZWNvbmRSb3cgLmxlZ2VuZENvbnQuZG9yaScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX0QnKSk7XHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX08nKSk7XHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX1InKSk7XHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCg0KSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX0knKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMSkgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRnRGKHJlc3VsdC5kX2RvcmlfZCkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMSkgc3BhbjpudGgtY2hpbGQoMyknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsUmVzb2x1dGlvbicpICsgJyAnICsgYXBwLmlGZkYoRE9SSV9EKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCg1KScpLnRleHQoYXBwLmlGdEYoMiAqIHJlc3VsdC5kX2RvcmlfZCAqIE1hdGguc2luKGRlZ1RvUmFkKHJlc3VsdC5mb3ZfaG9yIC8gMikpKS50b0ZpeGVkKDIpICsgJycgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYocmVzdWx0LmRfZG9yaV9vKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgzKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxSZXNvbHV0aW9uJykgKyAnICcgKyBhcHAuaUZmRihET1JJX08pICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDUpJykudGV4dChhcHAuaUZ0RigyICogcmVzdWx0LmRfZG9yaV9vICogTWF0aC5zaW4oZGVnVG9SYWQocmVzdWx0LmZvdl9ob3IgLyAyKSkpLnRvRml4ZWQoMikgKyAnJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihyZXN1bHQuZF9kb3JpX3IpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDMpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbFJlc29sdXRpb24nKSArICcgJyArIGFwcC5pRmZGKERPUklfUikgKyAnIHBwJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoNSknKS50ZXh0KGFwcC5pRnRGKDIgKiByZXN1bHQuZF9kb3JpX3IgKiBNYXRoLnNpbihkZWdUb1JhZChyZXN1bHQuZm92X2hvciAvIDIpKSkudG9GaXhlZCgyKSArICcnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoNCkgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRnRGKHJlc3VsdC5kX2RvcmlfaSkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoNCkgc3BhbjpudGgtY2hpbGQoMyknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsUmVzb2x1dGlvbicpICsgJyAnICsgYXBwLmlGZkYoRE9SSV9JKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICAgICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCg0KSBzcGFuOm50aC1jaGlsZCg1KScpLnRleHQoYXBwLmlGdEYoMiAqIHJlc3VsdC5kX2RvcmlfaSAqIE1hdGguc2luKGRlZ1RvUmFkKHJlc3VsdC5mb3ZfaG9yIC8gMikpKS50b0ZpeGVkKDIpICsgJycgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQuZG9yaSAuc2V0dGluZ3Mtc3RpY2t5LXJvdycpLmVxKDApLmNoaWxkcmVuKCkuZmlyc3QoKS5uZXh0KCkudGV4dChhcHAuaUZ0RihyZXN1bHQuZF9kb3JpX2QpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1zdGlja3ktY29udGVudC5kb3JpIC5zZXR0aW5ncy1zdGlja3ktcm93JykuZXEoMSkuY2hpbGRyZW4oKS5maXJzdCgpLm5leHQoKS50ZXh0KGFwcC5pRnRGKHJlc3VsdC5kX2RvcmlfbykudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgICAgICAgICAgJCgnLnNldHRpbmdzLXN0aWNreS1jb250ZW50LmRvcmkgLnNldHRpbmdzLXN0aWNreS1yb3cnKS5lcSgyKS5jaGlsZHJlbigpLmZpcnN0KCkubmV4dCgpLnRleHQoYXBwLmlGdEYocmVzdWx0LmRfZG9yaV9yKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICAgICAgICAgICAgICAkKCcuc2V0dGluZ3Mtc3RpY2t5LWNvbnRlbnQuZG9yaSAuc2V0dGluZ3Mtc3RpY2t5LXJvdycpLmVxKDMpLmNoaWxkcmVuKCkuZmlyc3QoKS5uZXh0KCkudGV4dChhcHAuaUZ0RihyZXN1bHQuZF9kb3JpX2kpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXBwLmN1cnJlbnQudmlldyA9PT0gJ2RvcmknKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gJCgnLnZpc3VhbGl6ZUluZm8nKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIC8vICQoJ2JvZHknKS5jc3MoJ3BvaW50ZXItZXZlbnRzJywgJ2F1dG8nKTtcclxuICAgICAgICAgICAgICAgICQoJy5zZXR0aW5ncy1zdGlja3ktbG9hZC1pbmRpY2F0b3InKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgICAgICAgICBhcHAubGFzdFJlc3VsdCA9IHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcC5vbigndW5pdENoYW5nZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoIWFwcC5zZXR0aW5ncy5hY3RpdmVDYW52YXMpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgLy8gY3JlYXRlVmlzdWFsaXplSW5mbygpO1xyXG4gICAgICAgIHJlbmRlclZpc3VhbCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIGxhc3RUeXBlO1xyXG4gICAgY29uc3QgbG9hZGVyID0gUElYSS5sb2FkZXI7XHJcbiAgICBsb2FkZXIuYWRkKCdrYW1lcmEnLCAnLi4vaW1nL2ljb25zL2NhbWVyYS5wbmcnKTtcclxuICAgIGxvYWRlci5hZGQoJ3Bhbm8nLCAnLi4vaW1nL2ljb25zL2NhbWVyYV9wYW5vLnBuZycpO1xyXG4gICAgbG9hZGVyLmFkZCgnYW5mYXNzZXJYJywgJy4uL2ltZy9pY29ucy9hbmZhc3Nlcl9lbnRmZXJudW5nX3hhY2hzZS5wbmcnKTtcclxuICAgIGxvYWRlci5hZGQoJ2FuZmFzc2VyWScsICcuLi9pbWcvaWNvbnMvYW5mYXNzZXJfZW50ZmVybnVuZ195YWNoc2UucG5nJyk7XHJcbiAgICBsb2FkZXIuYWRkKCdtYW4nLCAnLi4vaW1nL2ljb25zL21lbnNjaC5wbmcnKTtcclxuICAgIGxvYWRlci5hZGQoJ2NhcicsICcuLi9pbWcvaWNvbnMvY2FyLnBuZycpO1xyXG4gICAgbG9hZGVyLmFkZCgnbWFuX2NyYXdsaW5nJywgJy4uL2ltZy9pY29ucy9tYW5fY3Jhd2xpbmcucG5nJyk7XHJcbiAgICBsb2FkZXIuYWRkKCdtYW5fdXByaWdodCcsICcuLi9pbWcvaWNvbnMvbWFuX3VwcmlnaHQucG5nJyk7XHJcblxyXG4gICAgbG9hZGVyLmxvYWQoZnVuY3Rpb24gKGxvYWRlciwgbG9hZGVkUmVzb3VyY2VzKSB7XHJcbiAgICAgICAgcGl4aVJlYWR5ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHZhciB3YWl0QWZ0ZXJSZXNpemU7XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0Vml1c2FsT3V0cHV0VG9EcmkoZCwgciwgaSkge1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpJykuYWRkQ2xhc3MoJ2RyaScpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRUaXRsZScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxPdXRDYWxjRFJJJykpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRJbmZvJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE91dE1vcmVEUkknKSk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxTZWNvbmRSb3cgLnZpc3VhbEJ1dHRvbnMgLmJ1dHRvbkZPVkRvcmknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRFJJJykpO1xyXG5cclxuICAgICAgICBpZiAoYXBwLmN1cnJlbnQudmlldyA9PT0gJ2RvcmknKSB7XHJcbiAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsU2Vjb25kUm93IC5sZWdlbmRDb250LmRvcmknKS5hZGRDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsU2Vjb25kUm93IC5sZWdlbmRDb250LmRyaScpLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklfRCcpKTtcclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX1InKSk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMSknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRE9SSV9JJykpO1xyXG5cclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoZCk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KHIpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChpKTtcclxuXHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMSkgc3BhbjpudGgtY2hpbGQoMyknKS50ZXh0KGFwcC5pRmZGKERSSV9EKS50b0ZpeGVkKDApICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgzKScpLnRleHQoYXBwLmlGZkYoRFJJX1IpLnRvRml4ZWQoMCkgKyAnIHBwJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDMpJykudGV4dChhcHAuaUZmRihEUklfSSkudG9GaXhlZCgwKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0Vml1c2FsT3V0cHV0VG9Eb3JpKGQsIG8sIHIsIGkpIHtcclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaScpLnJlbW92ZUNsYXNzKCdkcmknKTtcclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0VGl0bGUnKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsT3V0Q2FsY0RPUkknKSk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dEluZm8nKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsT3V0TW9yZURPUkknKSk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxTZWNvbmRSb3cgLnZpc3VhbEJ1dHRvbnMgLmJ1dHRvbkZPVkRvcmknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRE9SSScpKTtcclxuXHJcbiAgICAgICAgaWYgKGFwcC5jdXJyZW50LnZpZXcgPT09ICdkb3JpJykge1xyXG4gICAgICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbFNlY29uZFJvdyAubGVnZW5kQ29udC5kcmknKS5hZGRDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsU2Vjb25kUm93IC5sZWdlbmRDb250LmRvcmknKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX0QnKSk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMSknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsRE9SSV9PJykpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbERPUklfUicpKTtcclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCg0KSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxET1JJX0knKSk7XHJcblxyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChkKTtcclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQuZG9yaSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQobyk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KHIpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsT3V0cHV0Q29udC5kb3JpIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDQpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChpKTtcclxuXHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMSkgc3BhbjpudGgtY2hpbGQoMyknKS50ZXh0KGFwcC5pRmZGKERPUklfRCkudG9GaXhlZCgwKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMyknKS50ZXh0KGFwcC5pRmZGKERPUklfTykudG9GaXhlZCgwKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMyknKS50ZXh0KGFwcC5pRmZGKERPUklfUikudG9GaXhlZCgwKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy52aXN1YWxPdXRwdXRDb250LmRvcmkgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoNCkgc3BhbjpudGgtY2hpbGQoMyknKS50ZXh0KGFwcC5pRmZGKERPUklfSSkudG9GaXhlZCgwKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICAgICAgdmFyIGhlaWdodCA9IGFwcC52aWV3ID09ICdzaWRlJyA/IHRoYXQuJGRvbS5maW5kKCcuZm92U2lkZUNvbnRhaW5lcicpLndpZHRoKCkgKiAuNDgyOSA6IHRoYXQuJGRvbS5maW5kKCcuZm92VG9wQ29udGFpbmVyJykud2lkdGgoKSAqIC40ODI5O1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcuZm92U2lkZUNvbnRhaW5lcicpLmNzcygnaGVpZ2h0JywgaGVpZ2h0KTtcclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLmZvdlNpZGVDb250YWluZXInKS5jaGlsZHJlbigpLnJlbW92ZSgpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcuZm92VG9wQ29udGFpbmVyJykuY3NzKCdoZWlnaHQnLCBoZWlnaHQpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcuZm92VG9wQ29udGFpbmVyJykuY2hpbGRyZW4oKS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgQ09OVEVOVF9SRVBPU0lUSU9OSU5HID0gNzY7XHJcbiAgICAgICAgY29uc3QgTUFYX0dSSURfU0laRSA9IDEyMDA7XHJcblxyXG4gICAgICAgIHZhciB3aWR0aCA9IE1hdGgubWluKCdzaWRlJyA/IHRoYXQuJGRvbS5maW5kKCcuZm92U2lkZUNvbnRhaW5lcicpLndpZHRoKCkgOiB0aGF0LiRkb20uZmluZCgnLmZvdlRvcENvbnRhaW5lcicpLndpZHRoKCksIE1BWF9HUklEX1NJWkUpO1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCcudmlzdWFsV3JhcCAudGFicy1jb250ZW50JykuY3NzKCdtYXJnaW4tYm90dG9tJywgKC1DT05URU5UX1JFUE9TSVRJT05JTkcgKiB3aWR0aCAvIE1BWF9HUklEX1NJWkUpICsgJ3B4Jyk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJy5mb3ZTaWRlQ29udGFpbmVyLCAuZm92VG9wQ29udGFpbmVyJykuY3NzKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsICcgKyAoLUNPTlRFTlRfUkVQT1NJVElPTklORyAqIHdpZHRoIC8gTUFYX0dSSURfU0laRSkgKyAncHgpJyk7XHJcblxyXG4gICAgICAgIGlmICghYXBwLnNldHRpbmdzLmFjdGl2ZUNhbnZhcykgeyByZXR1cm47IH1cclxuICAgICAgICBpZiAod2FpdEFmdGVyUmVzaXplKSB7IGNsZWFyVGltZW91dCh3YWl0QWZ0ZXJSZXNpemUpOyB9XHJcbiAgICAgICAgLy8gY3JlYXRlVmlzdWFsaXplSW5mbygpO1xyXG4gICAgICAgIHdhaXRBZnRlclJlc2l6ZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZW5kZXJWaXN1YWwoKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgIH1cclxuICAgICQod2luZG93KS5vbigncmVzaXplJywgb25XaW5kb3dSZXNpemUpO1xyXG4gICAgJCgnI3NldHRpbmdzbW9kZS1sYWJlbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KG9uV2luZG93UmVzaXplKTtcclxuICAgIH0pO1xyXG5cclxuICAgIG5ldyBGb3VuZGF0aW9uLlJldmVhbCh0aGF0LiRkb20uZmluZCgnI2RvcmlkcmlXcmFwSW5mbycpKTtcclxuICAgIG5ldyBGb3VuZGF0aW9uLlJldmVhbCh0aGF0LiRkb20uZmluZCgnI2RvcmlJbmZvJykpO1xyXG5cclxuICAgIHRoYXQuJGRvbS5vbignY2xpY2snLCAnLnZpc3VhbE91dEluZm8nLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHRoYXQuJGRvbS5maW5kKCdzcGFuLm1vcmVUYWJsZScpLnRvZ2dsZUNsYXNzKCdzaG93Jyk7XHJcbiAgICAgICAgdGhhdC4kZG9tLmZpbmQoJ3NwYW4ubGVzc1RhYmxlJykudG9nZ2xlQ2xhc3MoJ2hpZGUnKTtcclxuICAgICAgICB0aGF0LiRkb20uZmluZCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4gcC52aXN1YWxPdXROb3RpY2UnKS50b2dnbGVDbGFzcygnc2hvdycpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhhdDtcclxufSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gQWNjb3JkaW9uKCRwYXJlbnQsIGNvbnRlbnQpIHtcclxuICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgIHRoYXQuJGl0ZW0gPSAkKCc8dWwgY2xhc3M9XCJhY2NvcmRpb25cIiBkYXRhLWFjY29yZGlvbiAvPicpLmFwcGVuZFRvKCRwYXJlbnQpO1xyXG4gICAgdmFyIGZpcnN0SXRlbSA9IHRydWU7XHJcblxyXG4gICAgY29udGVudC5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgdmFyICRpdGVtID0gJChgXHJcbiAgICAgICAgPGxpIGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBkYXRhLWFjY29yZGlvbi1pdGVtPlxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYWNjb3JkaW9uLXRpdGxlXCI+PC9hPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIiBkYXRhLXRhYi1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgICAgYCkuYXBwZW5kVG8odGhhdC4kaXRlbSk7XHJcbiAgICAgICAgJGl0ZW0uZmluZCgnLmFjY29yZGlvbi1jb250ZW50JykuYXBwZW5kKHYodGl0bGVDaGFuZ2UpKTtcclxuICAgICAgICBmdW5jdGlvbiB0aXRsZUNoYW5nZShkYXRhKSB7XHJcbiAgICAgICAgICAgICRpdGVtLmZpbmQoJ2EuYWNjb3JkaW9uLXRpdGxlJykuaHRtbChkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBuZXcgRm91bmRhdGlvbi5BY2NvcmRpb24odGhhdC4kaXRlbSwge1xyXG4gICAgICAgICdhbGxvd0FsbENsb3NlZCc6IGZhbHNlLFxyXG4gICAgICAgICdzbGlkZVNwZWVkJzogNTAwLFxyXG4gICAgICAgICdtdWx0aU9wZW4nOiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhhdDtcclxufVxyXG5cclxuIiwidmFyIGN1cnJlbnRJRCA9IDA7XHJcbmNvbnN0IFFVRVNUSU9OX0lEX1BSRUZJWCA9ICdxdWVzdGlvbl8nO1xyXG5jb25zdCBRVUVTVElPTl9OQU1FX1BSRUZJWCA9ICdxdWVzdGlvbl8nO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBRdWVzdGlvbigkcGFyZW50LCBxdWVzdGlvbiwgcmV2ZWFsLCBpbnB1dHMsIG9uVmFsdWVDaGFuZ2UpIHtcclxuXHRpZiAodHlwZW9mIG9uVmFsdWVDaGFuZ2UgIT09ICdmdW5jdGlvbicpIHsgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSBGdW5jdGlvbicpOyB9XHJcblx0aWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHsgdGhyb3cgbmV3IEVycm9yKCdOb3QgYW4gQXJyYXknKTsgfVxyXG5cdHZhciB0aGF0ID0gdGhpcztcclxuXHR2YXIgbXlJZCA9IGN1cnJlbnRJRCsrO1xyXG5cclxuXHR2YXIgaW5wdXRIVE1MID0gJyc7XHJcblx0aW5wdXRzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcclxuXHRcdGlucHV0SFRNTCArPSBgXHJcblx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiJHtRVUVTVElPTl9OQU1FX1BSRUZJWCArIG15SWR9XCIgdmFsdWU9XCIke3YudmFsdWV9XCIgaWQ9XCIke1FVRVNUSU9OX05BTUVfUFJFRklYICsgbXlJZCArIHYudmFsdWV9XCIvPlxyXG5cdFx0XHQ8bGFiZWwgZm9yPVwiJHtRVUVTVElPTl9OQU1FX1BSRUZJWCArIG15SWQgKyB2LnZhbHVlfVwiPjxzcGFuPiR7di5sYWJlbH08L3NwYW4+PC9sYWJlbD5cclxuXHRcdGA7XHJcblx0fSk7XHJcblxyXG5cdHRoYXQuJGl0ZW0gPSAkKGBcclxuXHRcdDxkaXYgY2xhc3M9XCJyb3cgdmVydGljYWwtcGFkZGluZy1taWRkbGUgcXVlc3Rpb24td3JhcHBlciBxdWVzdGlvbi1maXJzdFwiIGlkPVwicXVlc3Rpb25fUTFcIj5cclxuXHRcdFx0XHQ8ZmllbGRzZXQgY2xhc3M9XCJzbWFsbC0xMiBtZWRpdW0tMTIgbGFyZ2UtMTIgY29sdW1ucyB0ZXh0LWNlbnRlclwiPlxyXG5cdFx0XHRcdDxoNT4ke3F1ZXN0aW9ufTwvaDU+XHJcblx0XHRcdFx0PGEgY2xhc3M9XCJpbmZvQnV0dG9uXCIgZGF0YS1vcGVuPVwicXVlc3Rpb25JbmZvJHtjdXJyZW50SUR9XCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIj48L2E+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicmV2ZWFsXCIgaWQ9XCJxdWVzdGlvbkluZm8ke2N1cnJlbnRJRH1cIiBkYXRhLXJldmVhbD5cclxuXHRcdFx0XHRcdCR7cmV2ZWFsfVxyXG5cdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIGRhdGEtY2xvc2UgYXJpYS1sYWJlbD1cIkNsb3NlIG1vZGFsXCIgdHlwZT1cImJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9idXR0b24+XHJcblx0XHRcdFx0PC9kaXY+PGJyPlxyXG5cdFx0XHRcdCR7aW5wdXRIVE1MfVxyXG5cdFx0XHQ8L2ZpZWxkc2V0PlxyXG5cdFx0PC9kaXY+XHJcblx0YCk7XHJcblxyXG5cdHRoYXQuJGl0ZW0ub24oJ2NsaWNrJywgJ2lucHV0W3R5cGU9cmFkaW9dJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdHRoYXQuJGl0ZW0uZmluZCgnaDUnKS5hZGRDbGFzcygnZG9uZScpO1xyXG5cdFx0b25WYWx1ZUNoYW5nZSgkKGUudGFyZ2V0KS5hdHRyKCd2YWx1ZScpKTtcclxuXHR9KTtcclxuXHJcblx0JHBhcmVudC5hcHBlbmQodGhhdC4kaXRlbSk7XHJcblx0bmV3IEZvdW5kYXRpb24uUmV2ZWFsKHRoYXQuJGl0ZW0uZmluZCgnI3F1ZXN0aW9uSW5mbycgKyBjdXJyZW50SUQpKTtcclxuXHJcblx0dGhhdC5uZXh0ID0gbnVsbDtcclxuXHJcblx0dGhhdC5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoKSB7XHJcblx0XHRpZiAodGhhdC5uZXh0KSB7IHRoYXQubmV4dC5yZW1vdmUoKTsgfVxyXG5cdFx0dGhhdC4kaXRlbS5yZW1vdmUoKTtcclxuXHRcdGNvbnNvbGUubG9nKFwidHJpZWQgdG8gcmVtb3ZlXCIpO1xyXG5cdH1cclxufSIsInZhciBjdXJyZW50SUQgPSAwO1xyXG5jb25zdCBTTElERVJfSURfUFJFRklYID0gJ3NsaWRlcl8nO1xyXG5jb25zdCBTTElERVJfTkFNRV9QUkVGSVggPSAnc2xpZGVyXyc7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIFNsaWRlcigkcGFyZW50LCBtaW5WYWx1ZSwgbWF4VmFsdWUsIGluaXRpYWxWYWx1ZSwgbG9nYXJpdGhtVmFsdWUsIG9uVmFsdWVDaGFuZ2UpIHtcclxuICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgIHZhciBteUlkID0gY3VycmVudElEKys7XHJcbiAgICB0aGF0LiRpdGVtID0gJChgXHJcbiAgICAgICAgPGRpdiBjbGFzcz0nZ3VpZGVkU2xpZGVyIHJvdyBjb2xsYXBzZSc+XHJcbiAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwic21hbGwtNCBtZWRpdW0tMyBsYXJnZS0yIGNvbHVtbnNcIj4gLS0+XHJcbiAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0Q29sIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIiR7U0xJREVSX0lEX1BSRUZJWCArIG15SWR9XCIgY2xhc3M9J3NsaWRlclRleHQnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwic21hbGwtOCBtZWRpdW0tOSBsYXJnZS0xMCBjb2x1bW5zXCI+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyQ29sIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXJcIiBkYXRhLXNsaWRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNsaWRlci1oYW5kbGVcIiBkYXRhLXNsaWRlci1oYW5kbGUgcm9sZT1cInNsaWRlclwiIHRhYmluZGV4PVwiMVwiIGFyaWEtY29udHJvbHM9XCIke1NMSURFUl9JRF9QUkVGSVggKyBteUlkfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNsaWRlci1maWxsXCIgZGF0YS1zbGlkZXItZmlsbD48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICBgKTtcclxuICAgIHRoYXQuJGl0ZW0uYXBwZW5kVG8oJHBhcmVudCk7XHJcblxyXG4gICAgdmFyIHNsaWRlcjtcclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHNsaWRlciA9IG5ldyBGb3VuZGF0aW9uLlNsaWRlcih0aGF0LiRpdGVtLmZpbmQoJy5zbGlkZXInKSwge1xyXG4gICAgICAgICAgICAnZGVjaW1hbCc6IDIsXHJcbiAgICAgICAgICAgICdzdGVwJzogMC4wMSxcclxuICAgICAgICAgICAgJ3N0YXJ0JzogbWluVmFsdWUsXHJcbiAgICAgICAgICAgICdlbmQnOiBtYXhWYWx1ZSxcclxuICAgICAgICAgICAgJ2luaXRpYWxTdGFydCc6IGluaXRpYWxWYWx1ZSxcclxuICAgICAgICAgICAgJ3Bvc2l0aW9uVmFsdWVGdW5jdGlvbic6IGxvZ2FyaXRobVZhbHVlID8gJ3BvdycgOiAnbGluZWFyJyxcclxuICAgICAgICAgICAgJ25vbkxpbmVhckJhc2UnOiBsb2dhcml0aG1WYWx1ZSA/IGxvZ2FyaXRobVZhbHVlIDogMSxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoYXQuJGl0ZW0ub24oJ2NoYW5nZWQuemYuc2xpZGVyJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBvblZhbHVlQ2hhbmdlKCQodGhpcykuZmluZCgnLnNsaWRlci1oYW5kbGUnKS5hdHRyKCdhcmlhLXZhbHVlbm93JykpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhhdC51bnNldFxyXG5cclxuICAgIHRoYXQucmVzZXQgPSBmdW5jdGlvbiByZXNldChtaW5WYWx1ZSwgbWF4VmFsdWUsIGluaXRpYWxWYWx1ZSwgbG9nYXJpdGhtVmFsdWUpIHtcclxuICAgICAgICB0aGF0LiRpdGVtLmZpbmQoJy5zbGlkZXInKS5mb3VuZGF0aW9uKCdkZXN0cm95Jyk7XHJcbiAgICAgICAgc2xpZGVyID0gbmV3IEZvdW5kYXRpb24uU2xpZGVyKHRoYXQuJGl0ZW0uZmluZCgnLnNsaWRlcicpLCB7XHJcbiAgICAgICAgICAgICdkZWNpbWFsJzogMixcclxuICAgICAgICAgICAgJ3N0ZXAnOiAwLjAxLFxyXG4gICAgICAgICAgICAnc3RhcnQnOiBtaW5WYWx1ZSxcclxuICAgICAgICAgICAgJ2VuZCc6IG1heFZhbHVlLFxyXG4gICAgICAgICAgICAnaW5pdGlhbFN0YXJ0JzogaW5pdGlhbFZhbHVlLFxyXG4gICAgICAgICAgICAncG9zaXRpb25WYWx1ZUZ1bmN0aW9uJzogbG9nYXJpdGhtVmFsdWUgPyAncG93JyA6ICdsaW5lYXInLFxyXG4gICAgICAgICAgICAnbm9uTGluZWFyQmFzZSc6IGxvZ2FyaXRobVZhbHVlID8gbG9nYXJpdGhtVmFsdWUgOiAxLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiY29uc3QgSFVNQU5fSEVJR0hUID0gMS43LCBIVU1BTl9XSURUSCA9IDAuNTtcclxuXHJcbmZ1bmN0aW9uIHJhZFRvRGVnKG51bWJlcikge1xyXG5cdHJldHVybiBudW1iZXIgKiAxODAgLyBNYXRoLlBJO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZWdUb1JhZChudW1iZXIpIHtcclxuXHRyZXR1cm4gbnVtYmVyICogTWF0aC5QSSAvIDE4MDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFub0RlbnNpdHlBdChlbGV2YXRpb24sIGExLCBhMywgYTUsIHBpeGVsX3NpemUsIGRpc3RhbmNlKSB7XHJcblx0aWYgKGFwcC5jdXJyZW50Lm1vdW50cG9zaXRpb24gPT09ICdXYWxsJykge1xyXG5cdFx0dmFyIGFscGhhX2hlYWQgPSByYWRUb0RlZyhNYXRoLmF0YW4oKGVsZXZhdGlvbiAtIEhVTUFOX0hFSUdIVCkgLyBkaXN0YW5jZSkpO1xyXG5cdFx0dmFyIGFscGhhX2Zvb3QgPSByYWRUb0RlZyhNYXRoLmF0YW4oZWxldmF0aW9uIC8gZGlzdGFuY2UpKTtcclxuXHJcblx0XHR2YXIgcGl4ZWxfaGVhZCA9IGExICogYWxwaGFfaGVhZCArIGEzICogTWF0aC5wb3coYWxwaGFfaGVhZCwgMykgKyBhNSAqIE1hdGgucG93KGFscGhhX2hlYWQsIDUpO1xyXG5cdFx0dmFyIHBpeGVsX2Zvb3QgPSBhMSAqIGFscGhhX2Zvb3QgKyBhMyAqIE1hdGgucG93KGFscGhhX2Zvb3QsIDMpICsgYTUgKiBNYXRoLnBvdyhhbHBoYV9mb290LCA1KTtcclxuXHJcblx0XHR2YXIgdGFyZ2V0X3BpeGVsID0gKHBpeGVsX2Zvb3QgLSBwaXhlbF9oZWFkKSAvIHBpeGVsX3NpemUgKiAxMDAwO1xyXG5cdFx0dmFyIGRlbnNpdHkgPSB0YXJnZXRfcGl4ZWwgLyBIVU1BTl9IRUlHSFQ7XHJcblx0XHRyZXR1cm4gZGVuc2l0eVxyXG5cdH0gZWxzZSBpZiAoYXBwLmN1cnJlbnQubW91bnRwb3NpdGlvbiA9PT0gJ0NlaWxpbmcnKSB7XHJcblx0XHQvL2Jhc2VkIG9uIGhlaWdodFxyXG5cclxuXHRcdHZhciBhbHBoYV9oZWFkID0gcmFkVG9EZWcoTWF0aC5hdGFuKGRpc3RhbmNlIC8gKGVsZXZhdGlvbiAtIEhVTUFOX0hFSUdIVCkpKTtcclxuXHRcdHZhciBhbHBoYV9mb290ID0gcmFkVG9EZWcoTWF0aC5hdGFuKGRpc3RhbmNlIC8gZWxldmF0aW9uKSk7XHJcblxyXG5cdFx0dmFyIHBpeGVsX2hlYWQgPSBhMSAqIGFscGhhX2hlYWQgKyBhMyAqIE1hdGgucG93KGFscGhhX2hlYWQsIDMpICsgYTUgKiBNYXRoLnBvdyhhbHBoYV9oZWFkLCA1KTtcclxuXHRcdHZhciBwaXhlbF9mb290ID0gYTEgKiBhbHBoYV9mb290ICsgYTMgKiBNYXRoLnBvdyhhbHBoYV9mb290LCAzKSArIGE1ICogTWF0aC5wb3coYWxwaGFfZm9vdCwgNSk7XHJcblxyXG5cdFx0dmFyIHRhcmdldF9waXhlbCA9IChwaXhlbF9oZWFkIC0gcGl4ZWxfZm9vdCkgLyBwaXhlbF9zaXplICogMTAwMDtcclxuXHRcdHZhciBkZW5zaXR5ID0gdGFyZ2V0X3BpeGVsIC8gSFVNQU5fSEVJR0hUO1xyXG5cclxuXHRcdC8vYmFzZWQgb24gd2lkdGhcclxuXHJcblx0XHR2YXIgYV9sZWZ0ID0gcmFkVG9EZWcoTWF0aC5hdGFuKChkaXN0YW5jZSArIChIVU1BTl9XSURUSCAvIDIpKSAvIChlbGV2YXRpb24gLSBIVU1BTl9IRUlHSFQpKSk7XHJcblx0XHR2YXIgYV9yaWdodCA9IHJhZFRvRGVnKE1hdGguYXRhbigoZGlzdGFuY2UgLSAoSFVNQU5fV0lEVEggLyAyKSkgLyAoZWxldmF0aW9uIC0gSFVNQU5fSEVJR0hUKSkpO1xyXG5cclxuXHRcdHZhciBwaXhlbF9sZWZ0ID0gYTEgKiBhX2xlZnQgKyBhMyAqIE1hdGgucG93KGFfbGVmdCwgMykgKyBhNSAqIE1hdGgucG93KGFfbGVmdCwgNSk7XHJcblx0XHR2YXIgcGl4ZWxfcmlnaHQgPSBhMSAqIGFfcmlnaHQgKyBhMyAqIE1hdGgucG93KGFfcmlnaHQsIDMpICsgYTUgKiBNYXRoLnBvdyhhX3JpZ2h0LCA1KTtcclxuXHJcblx0XHR2YXIgdGFyZ2V0X3BpeGVsX2FsdCA9IChwaXhlbF9sZWZ0IC0gcGl4ZWxfcmlnaHQpIC8gcGl4ZWxfc2l6ZSAqIDEwMDA7XHJcblx0XHR2YXIgZGVuc2l0eV9hbHQgPSB0YXJnZXRfcGl4ZWxfYWx0IC8gSFVNQU5fV0lEVEg7XHJcblxyXG5cdFx0aWYgKGRlbnNpdHlfYWx0ID4gZGVuc2l0eSkgeyBkZW5zaXR5ID0gZGVuc2l0eV9hbHQ7IH1cclxuXHRcdHJldHVybiBkZW5zaXR5O1xyXG5cdH1cclxufVxyXG5cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xyXG5cdGFwcC5vbigncHBtQ2hhbmdlU2lkZScsIGZ1bmN0aW9uICh2YWx1ZSkge1xyXG5cdFx0dmFyICRzbGlkZXJUb29sVGlwO1xyXG5cdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdCRzbGlkZXJUb29sVGlwID0gJCgnI3NsaWRlclRvb2x0aXAnKTtcclxuXHRcdH0sIDI1KTtcclxuXHRcdGZ1bmN0aW9uIHModikge1xyXG5cdFx0XHRyZXR1cm4gY29udFdpZHRoIC8gNjIwICogdjtcclxuXHRcdH1cclxuXHRcdHZhciBjb250V2lkdGggPSB2YWx1ZS5jb250YWluZXIud2lkdGgoKTtcclxuXHRcdGlmICh2YWx1ZS50eXBlID09PSAnbm9ucGFubycpIHtcclxuXHRcdFx0dmFyIG1pbmltdW0gPSB2YWx1ZS5taW4gPyBzKHZhbHVlLm1pbiAqIHZhbHVlLnBwbSkgOiAwO1xyXG5cdFx0XHR2YXIgbWF4aW11bSA9IHModmFsdWUubWF4ICogdmFsdWUucHBtKTtcclxuXHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdHZhbHVlLnNwb3RzW3hdID0gcyh2YWx1ZS5zcG90c1t4XSAqIHZhbHVlLnBwbSk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWUuc3BvdHMuc29ydCgoYSwgYikgPT4ge1xyXG5cdFx0XHRcdGlmIChhID4gYikgeyByZXR1cm4gMTsgfVxyXG5cdFx0XHRcdGlmIChhIDwgYikgeyByZXR1cm4gLTE7IH1cclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHZhciBwb3NYID0gcyh2YWx1ZS5tYXggKiB2YWx1ZS5wcG0pO1xyXG5cdFx0XHRpZiAodmFsdWUuc3RhcnR2YWx1ZSkgeyBwb3NYID0gcyh2YWx1ZS5zdGFydHZhbHVlICogdmFsdWUucHBtKTsgfVxyXG5cdFx0XHRpZiAocG9zWCA8IG1pbmltdW0pIHsgcG9zWCA9IG1pbmltdW07IH1cclxuXHRcdFx0aWYgKHBvc1ggPiBtYXhpbXVtKSB7IHBvc1ggPSBtYXhpbXVtOyB9XHJcblxyXG5cdFx0XHR2YXIgZm92U2lkZVNsaWRlciA9ICQoJzxkaXYgLz4nKTtcclxuXHRcdFx0Zm92U2lkZVNsaWRlci5hZGRDbGFzcygnZm92U2lkZVNsaWRlciBmb3ZTaWRlU2xpZGVyTGluZScpO1xyXG5cdFx0XHRmb3ZTaWRlU2xpZGVyLmNzcyh7XHJcblx0XHRcdFx0J3dpZHRoJzogJzMwcHgnLFxyXG5cdFx0XHRcdCdoZWlnaHQnOiAnMzBweCcsXHJcblx0XHRcdFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuXHRcdFx0XHQnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoLi4vaW1nL2ljb25zL2FuZmFzc2VyX2VudGZlcm51bmdfeGFjaHNlLnBuZyknLFxyXG5cdFx0XHRcdCdiYWNrZ3JvdW5kLXNpemUnOiAnY29udGFpbicsXHJcblx0XHRcdFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoLTE1cHgsIC0xNXB4KScsXHJcblx0XHRcdFx0J3RvcCc6IHMoMjc4KSArICdweCcsXHJcblx0XHRcdFx0J2xlZnQnOiAocyg1NCkgKyBwb3NYKSArICdweCcsXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0dmFyIGRpc3RhbmNlID0gKHBvc1ggKiA2MjAgLyBjb250V2lkdGgpIC8gdmFsdWUucHBtO1xyXG5cdFx0XHR2YXIgaGVpZ2h0QXRYID0gdmFsdWUuZWxldmF0aW9uIC0gKGRpc3RhbmNlICogTWF0aC50YW4oZGVnVG9SYWQodmFsdWUudGlsdCAtIHZhbHVlLmZvdl92ZXIgLyAyKSkpO1xyXG5cdFx0XHR2YXIgZm92X3dpZHRoID0gMiAqIE1hdGguc3FydCgoZGlzdGFuY2UgKiBkaXN0YW5jZSkgKyAodmFsdWUuZWxldmF0aW9uICogdmFsdWUuZWxldmF0aW9uKSkgKiBNYXRoLnRhbihkZWdUb1JhZCh2YWx1ZS5mb3ZfaG9yIC8gMikpO1xyXG5cdFx0XHR2YXIgcmVzb2x1dGlvbiA9IHZhbHVlLnJlc19ob3IgLyBmb3Zfd2lkdGg7XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBzZXRUZXh0KGRpc3RhbmNlLCBoZWlnaHRBdFgsIGZvdl93aWR0aCwgcmVzb2x1dGlvbikge1xyXG5cdFx0XHRcdGlmIChhcHAuY3VycmVudC52aWV3ID09PSAnZG9yaScpIHtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpJykuY3NzKCdkaXNwbGF5JywgJ3RhYmxlLXJvdycpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoNCknKS5jc3MoJ2Rpc3BsYXknLCAndGFibGUtcm93Jyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYoZGlzdGFuY2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZmRihyZXNvbHV0aW9uKS50b0ZpeGVkKDIpICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihoZWlnaHRBdFgpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbEhlaWdodCcpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGFwcC5jdXJyZW50LnZpZXcgPT09ICd2aV9hbicpIHtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpJykuY3NzKCdkaXNwbGF5JywgJ3RhYmxlLXJvdycpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4gLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMyknKS5jc3MoJ2Rpc3BsYXknLCAndGFibGUtcm93Jyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbiAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYoZGlzdGFuY2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihoZWlnaHRBdFgpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbEhlaWdodCcpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGFwcC5jdXJyZW50LnZpZXcgPT09ICdjYW1lcmEnKSB7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMyknKS5jc3MoJ2Rpc3BsYXknLCAndGFibGUtcm93Jyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoNCknKS5jc3MoJ2Rpc3BsYXknLCAndGFibGUtcm93Jyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMSkgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRnRGKGRpc3RhbmNlKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRmZGKHJlc29sdXRpb24pLnRvRml4ZWQoMikgKyAnIHBwJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihoZWlnaHRBdFgpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxIZWlnaHQnKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cclxuXHRcdFx0dmFsdWUuY29udGFpbmVyLmFwcGVuZChmb3ZTaWRlU2xpZGVyKTtcclxuXHJcblxyXG5cdFx0XHRzZXRUZXh0KGRpc3RhbmNlLCBoZWlnaHRBdFgsIGZvdl93aWR0aCwgcmVzb2x1dGlvbik7XHJcblxyXG5cdFx0XHRmb3ZTaWRlU2xpZGVyLm9uKCdtb3VzZWRvd24gdG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdGlmICgkc2xpZGVyVG9vbFRpcCkgeyAkc2xpZGVyVG9vbFRpcC5yZW1vdmUoKTsgfVxyXG5cdFx0XHRcdHZhciBwcmV2WDtcclxuXHRcdFx0XHRpZiAoZS50eXBlID09PSAndG91Y2hzdGFydCcpIHtcclxuXHRcdFx0XHRcdHByZXZYID0gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlZG93bicpIHtcclxuXHRcdFx0XHRcdHByZXZYID0gZS5jbGllbnRYO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaXNNYWduZXRpYyA9IGZhbHNlO1xyXG5cdFx0XHRcdHZhciBhZGRlZERlbHRhID0gMDtcclxuXHRcdFx0XHR2YXIgbWFnbmV0aWNEaXN0YW5jZSA9IHMoMTUpO1xyXG5cdFx0XHRcdCQoZG9jdW1lbnQpLm9uKCdtb3VzZW1vdmUgdG91Y2htb3ZlJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdHZhciBkZWx0YTtcclxuXHRcdFx0XHRcdGlmIChlLnR5cGUgPT09ICd0b3VjaG1vdmUnKSB7XHJcblx0XHRcdFx0XHRcdGRlbHRhID0gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHByZXZYO1xyXG5cdFx0XHRcdFx0XHRwcmV2WCA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoZS50eXBlID09PSAnbW91c2Vtb3ZlJykge1xyXG5cdFx0XHRcdFx0XHRkZWx0YSA9IGUuY2xpZW50WCAtIHByZXZYO1xyXG5cdFx0XHRcdFx0XHRwcmV2WCA9IGUuY2xpZW50WDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKHBvc1gsIGRlbHRhLCBpc01hZ25ldGljLCBhZGRlZERlbHRhKTtcclxuXHRcdFx0XHRcdGlmIChpc01hZ25ldGljICYmIChhZGRlZERlbHRhID4gLW1hZ25ldGljRGlzdGFuY2UgJiYgYWRkZWREZWx0YSA8IG1hZ25ldGljRGlzdGFuY2UpKSB7XHJcblx0XHRcdFx0XHRcdGFkZGVkRGVsdGEgKz0gZGVsdGE7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNNYWduZXRpYykgeyBpc01hZ25ldGljID0gZmFsc2U7IGRlbHRhID0gYWRkZWREZWx0YTsgYWRkZWREZWx0YSA9IDA7IH1cclxuXHRcdFx0XHRcdHBvc1ggPSBwb3NYICsgZGVsdGE7XHJcblx0XHRcdFx0XHRpZiAoZGVsdGEgPiAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBuZXh0ID0gcG9zWDtcclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZS5zcG90c1t4XSA+PSBwb3NYKSB7IG5leHQgPSB2YWx1ZS5zcG90c1t4XTsgYnJlYWs7IH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAoK25leHQgLSArbWFnbmV0aWNEaXN0YW5jZSA8ICtwb3NYKSB7IHBvc1ggPSBuZXh0OyBpc01hZ25ldGljID0gdHJ1ZTsgfVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKGRlbHRhIDwgMCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgcHJldmlvdXMgPSB2YWx1ZS5zcG90c1swXTtcclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZS5zcG90c1t4XSA+PSBwb3NYKSB7IGJyZWFrOyB9XHJcblx0XHRcdFx0XHRcdFx0cHJldmlvdXMgPSB2YWx1ZS5zcG90c1t4XTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAoK3ByZXZpb3VzICsgK21hZ25ldGljRGlzdGFuY2UgPiArcG9zWCkgeyBwb3NYID0gcHJldmlvdXM7IGlzTWFnbmV0aWMgPSB0cnVlOyB9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAocG9zWCA8IG1pbmltdW0pIHsgcG9zWCA9IG1pbmltdW07IH1cclxuXHRcdFx0XHRcdGlmIChwb3NYID4gbWF4aW11bSkgeyBwb3NYID0gbWF4aW11bTsgfVxyXG5cdFx0XHRcdFx0Zm92U2lkZVNsaWRlci5jc3MoJ2xlZnQnLCAocyg1NCkgKyBwb3NYKSArICdweCcpO1xyXG5cclxuXHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IChwb3NYICogNjIwIC8gY29udFdpZHRoKSAvIHZhbHVlLnBwbTtcclxuXHRcdFx0XHRcdHZhciBoZWlnaHRBdFggPSB2YWx1ZS5lbGV2YXRpb24gLSAoZGlzdGFuY2UgKiBNYXRoLnRhbihkZWdUb1JhZCh2YWx1ZS50aWx0IC0gdmFsdWUuZm92X3ZlciAvIDIpKSk7XHJcblx0XHRcdFx0XHR2YXIgZm92X3dpZHRoID0gMiAqIE1hdGguc3FydCgoZGlzdGFuY2UgKiBkaXN0YW5jZSkgKyAodmFsdWUuZWxldmF0aW9uICogdmFsdWUuZWxldmF0aW9uKSkgKiBNYXRoLnRhbihkZWdUb1JhZCh2YWx1ZS5mb3ZfaG9yIC8gMikpO1xyXG5cdFx0XHRcdFx0dmFyIHJlc29sdXRpb24gPSB2YWx1ZS5yZXNfaG9yIC8gZm92X3dpZHRoO1xyXG5cclxuXHRcdFx0XHRcdHNldFRleHQoZGlzdGFuY2UsIGhlaWdodEF0WCwgZm92X3dpZHRoLCByZXNvbHV0aW9uKTtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0JChkb2N1bWVudCkub24oJ21vdXNldXAgdG91Y2hlbmQnLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHQkKGRvY3VtZW50KS5vZmYoJ21vdXNlbW92ZSB0b3VjaG1vdmUnKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHZhbHVlLnR5cGUgPT09ICdwYW5vQ2VpbCcpIHtcclxuXHRcdFx0dmFyIG1pbmltdW0gPSB2YWx1ZS5taW4gPyBzKHZhbHVlLm1pbiAqIHZhbHVlLnBwbSkgOiAwO1xyXG5cdFx0XHR2YXIgbWF4aW11bSA9IHMoMjc1KTtcclxuXHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdHZhbHVlLnNwb3RzW3hdID0gcyh2YWx1ZS5zcG90c1t4XSAqIHZhbHVlLnBwbSk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWUuc3BvdHMuc29ydCgoYSwgYikgPT4ge1xyXG5cdFx0XHRcdGlmIChhID4gYikgeyByZXR1cm4gMTsgfVxyXG5cdFx0XHRcdGlmIChhIDwgYikgeyByZXR1cm4gLTE7IH1cclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHZhciBwb3NYID0gcyh2YWx1ZS5tYXggKiB2YWx1ZS5wcG0pO1xyXG5cdFx0XHRpZiAodmFsdWUuc3RhcnR2YWx1ZSkgeyBwb3NYID0gcyh2YWx1ZS5zdGFydHZhbHVlICogdmFsdWUucHBtKTsgfVxyXG5cdFx0XHRpZiAocG9zWCA8IG1pbmltdW0pIHsgcG9zWCA9IG1pbmltdW07IH1cclxuXHRcdFx0aWYgKHBvc1ggPiBtYXhpbXVtKSB7IHBvc1ggPSBtYXhpbXVtOyB9XHJcblxyXG5cdFx0XHR2YXIgZm92U2lkZVNsaWRlciA9ICQoJzxkaXYgLz4nKTtcclxuXHRcdFx0Zm92U2lkZVNsaWRlci5hZGRDbGFzcygnZm92U2lkZVNsaWRlciBmb3ZTaWRlU2xpZGVyTGluZScpO1xyXG5cdFx0XHRmb3ZTaWRlU2xpZGVyLmNzcyh7XHJcblx0XHRcdFx0J3dpZHRoJzogJzMwcHgnLFxyXG5cdFx0XHRcdCdoZWlnaHQnOiAnMzBweCcsXHJcblx0XHRcdFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuXHRcdFx0XHQnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoLi4vaW1nL2ljb25zL2FuZmFzc2VyX2VudGZlcm51bmdfeGFjaHNlLnBuZyknLFxyXG5cdFx0XHRcdCdiYWNrZ3JvdW5kLXNpemUnOiAnY29udGFpbicsXHJcblx0XHRcdFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoLTE1cHgsIC0xNXB4KScsXHJcblx0XHRcdFx0J3RvcCc6IHMoMjc4KSArICdweCcsXHJcblx0XHRcdFx0J2xlZnQnOiAocyg1NCArIDI4MSkgKyBwb3NYKSArICdweCcsXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gdmFyIGZvdlNpZGVUZXh0ID0gJCgnPHNwYW4gLz4nKTtcclxuXHRcdFx0Ly8gZm92U2lkZVRleHQuaHRtbChgPGJyLz4ke2FwcC5pRnRGKChwb3NYICogNjIwIC8gY29udFdpZHRoKSAvIHZhbHVlLnBwbSkudG9GaXhlZCgyKX0gJHthcHAudW5pdFN5bWJvbCgpfWApO1xyXG5cdFx0XHQvLyBmb3ZTaWRlVGV4dC5jc3Moe1xyXG5cdFx0XHQvLyBcdCdwb3NpdGlvbic6ICdhYnNvbHV0ZScsXHJcblx0XHRcdC8vIFx0J3RvcCc6IHMoMjc4KSArICdweCcsXHJcblx0XHRcdC8vIFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoNXB4LCAtNTAlKScsXHJcblx0XHRcdC8vIFx0J2NvbG9yJzogJyNiNWI1YjcnLFxyXG5cdFx0XHQvLyBcdCdtYXJnaW4nOiAnMCAxMHB4JyxcclxuXHRcdFx0Ly8gXHQnd2hpdGUtc3BhY2UnOiAnbm93cmFwJyxcclxuXHRcdFx0Ly8gXHQnbGluZS1oZWlnaHQnOiAnMzFweCdcclxuXHRcdFx0Ly8gfSk7XHJcblx0XHRcdC8vIGlmIChwb3NYIDwgMzAwKSB7XHJcblx0XHRcdC8vIFx0Zm92U2lkZVRleHQuY3NzKCdsZWZ0JywgKHMoNTQgKyAyODEpICsgcG9zWCkgKyAncHgnKTtcclxuXHRcdFx0Ly8gfSBlbHNlIHtcclxuXHRcdFx0Ly8gXHRmb3ZTaWRlVGV4dC5jc3MoJ2xlZnQnLCAocyg1NCArIDI4MSkgKyAzMDApICsgJ3B4Jyk7XHJcblx0XHRcdC8vIH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIHNldFRleHQoZGlzdGFuY2UsIGhlaWdodEF0WCkge1xyXG5cdFx0XHRcdGlmIChhcHAuY3VycmVudC52aWV3ID09PSAnZG9yaScpIHtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihkaXN0YW5jZSkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMyknKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoNCknKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsQ2FsY3VsYXRpbmcnKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxOb3RBdmFpbGFibGUnKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxIZWlnaHQnKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhcHAuY3VycmVudC52aWV3ID09PSAndmlfYW4nKSB7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihkaXN0YW5jZSkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKScpLmNzcygnZGlzcGxheScsICd0YWJsZS1yb3cnKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDQpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE5vdEF2YWlsYWJsZScpKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChcIlwiKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGFwcC5jdXJyZW50LnZpZXcgPT09ICdjYW1lcmEnKSB7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMSkgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRnRGKGRpc3RhbmNlKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMyknKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDQpJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxDYWxjdWxhdGluZycpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxOb3RBdmFpbGFibGUnKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMSknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsSGVpZ2h0JykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIGRpc3RhbmNlID0gKHBvc1ggKiA2MjAgLyBjb250V2lkdGgpIC8gdmFsdWUucHBtO1xyXG5cdFx0XHRzZXRUZXh0KGRpc3RhbmNlKTtcclxuXHJcblx0XHRcdHZhciBkZW5zaXR5ID0gcGFub0RlbnNpdHlBdCh2YWx1ZS5yZXN1bHQuZWxldmF0aW9uLCB2YWx1ZS5yZXN1bHQuYTEsIHZhbHVlLnJlc3VsdC5hMywgdmFsdWUucmVzdWx0LmE1LCB2YWx1ZS5yZXN1bHQucGl4ZWxfc2l6ZSwgZGlzdGFuY2UpO1xyXG5cdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGZkYoZGVuc2l0eSkudG9GaXhlZCgyKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGZkYoZGVuc2l0eSkudG9GaXhlZCgyKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblxyXG5cdFx0XHR2YWx1ZS5jb250YWluZXIuYXBwZW5kKGZvdlNpZGVTbGlkZXIpO1xyXG5cdFx0XHQvLyB2YWx1ZS5jb250YWluZXIuYXBwZW5kKGZvdlNpZGVUZXh0KTtcclxuXHJcblxyXG5cdFx0XHRmb3ZTaWRlU2xpZGVyLm9uKCdtb3VzZWRvd24gdG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdGlmICgkc2xpZGVyVG9vbFRpcCkgeyAkc2xpZGVyVG9vbFRpcC5yZW1vdmUoKTsgfVxyXG5cdFx0XHRcdHZhciBwcmV2WDtcclxuXHRcdFx0XHRpZiAoZS50eXBlID09PSAndG91Y2hzdGFydCcpIHtcclxuXHRcdFx0XHRcdHByZXZYID0gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlZG93bicpIHtcclxuXHRcdFx0XHRcdHByZXZYID0gZS5jbGllbnRYO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaXNNYWduZXRpYyA9IGZhbHNlO1xyXG5cdFx0XHRcdHZhciBhZGRlZERlbHRhID0gMDtcclxuXHRcdFx0XHR2YXIgbWFnbmV0aWNEaXN0YW5jZSA9IHMoMTUpO1xyXG5cdFx0XHRcdCQoZG9jdW1lbnQpLm9uKCdtb3VzZW1vdmUgdG91Y2htb3ZlJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdHZhciBkZWx0YTtcclxuXHRcdFx0XHRcdGlmIChlLnR5cGUgPT09ICd0b3VjaG1vdmUnKSB7XHJcblx0XHRcdFx0XHRcdGRlbHRhID0gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHByZXZYO1xyXG5cdFx0XHRcdFx0XHRwcmV2WCA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoZS50eXBlID09PSAnbW91c2Vtb3ZlJykge1xyXG5cdFx0XHRcdFx0XHRkZWx0YSA9IGUuY2xpZW50WCAtIHByZXZYO1xyXG5cdFx0XHRcdFx0XHRwcmV2WCA9IGUuY2xpZW50WDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChpc01hZ25ldGljICYmIChhZGRlZERlbHRhID4gLW1hZ25ldGljRGlzdGFuY2UgJiYgYWRkZWREZWx0YSA8IG1hZ25ldGljRGlzdGFuY2UpKSB7XHJcblx0XHRcdFx0XHRcdGFkZGVkRGVsdGEgKz0gZGVsdGE7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNNYWduZXRpYykgeyBpc01hZ25ldGljID0gZmFsc2U7IGRlbHRhID0gYWRkZWREZWx0YTsgYWRkZWREZWx0YSA9IDA7IH1cclxuXHRcdFx0XHRcdHBvc1ggPSBwb3NYICsgZGVsdGE7XHJcblx0XHRcdFx0XHRpZiAoZGVsdGEgPiAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBuZXh0ID0gcG9zWDtcclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZS5zcG90c1t4XSA+PSBwb3NYKSB7IG5leHQgPSB2YWx1ZS5zcG90c1t4XTsgYnJlYWs7IH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV4dCAtIG1hZ25ldGljRGlzdGFuY2UgPCBwb3NYKSB7IHBvc1ggPSBuZXh0OyBpc01hZ25ldGljID0gdHJ1ZTsgfVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKGRlbHRhIDwgMCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgcHJldmlvdXMgPSB2YWx1ZS5zcG90c1swXTtcclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZS5zcG90c1t4XSA+PSBwb3NYKSB7IGJyZWFrOyB9XHJcblx0XHRcdFx0XHRcdFx0cHJldmlvdXMgPSB2YWx1ZS5zcG90c1t4XTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAocHJldmlvdXMgKyBtYWduZXRpY0Rpc3RhbmNlID4gcG9zWCkgeyBwb3NYID0gcHJldmlvdXM7IGlzTWFnbmV0aWMgPSB0cnVlOyB9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAocG9zWCA8IG1pbmltdW0pIHsgcG9zWCA9IG1pbmltdW07IH1cclxuXHRcdFx0XHRcdGlmIChwb3NYID4gbWF4aW11bSkgeyBwb3NYID0gbWF4aW11bTsgfVxyXG5cdFx0XHRcdFx0Zm92U2lkZVNsaWRlci5jc3MoJ2xlZnQnLCAocyg1NCArIDI4MSkgKyBwb3NYKSArICdweCcpO1xyXG5cdFx0XHRcdFx0Ly8gZm92U2lkZVRleHQuaHRtbChgPGJyLz4ke2FwcC5pRnRGKChwb3NYICogNjIwIC8gY29udFdpZHRoKSAvIHZhbHVlLnBwbSkudG9GaXhlZCgyKX0gJHthcHAudW5pdFN5bWJvbCgpfWApO1xyXG5cdFx0XHRcdFx0Ly8gaWYgKHBvc1ggPCAzMDApIHtcclxuXHRcdFx0XHRcdC8vIFx0Zm92U2lkZVRleHQuY3NzKCdsZWZ0JywgKHMoNTQgKyAyODEpICsgcG9zWCkgKyAncHgnKTtcclxuXHRcdFx0XHRcdC8vIH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBcdGZvdlNpZGVUZXh0LmNzcygnbGVmdCcsIChzKDU0ICsgMjgxKSArIDMwMCkgKyAncHgnKTtcclxuXHRcdFx0XHRcdC8vIH1cclxuXHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IChwb3NYICogNjIwIC8gY29udFdpZHRoKSAvIHZhbHVlLnBwbTtcclxuXHRcdFx0XHRcdHNldFRleHQoZGlzdGFuY2UpO1xyXG5cclxuXHRcdFx0XHRcdGNsZWFyVGltZW91dChkZW5zaXR5VGltZXIpO1xyXG5cdFx0XHRcdFx0ZGVuc2l0eVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0XHRcdHZhciBkZW5zaXR5ID0gcGFub0RlbnNpdHlBdCh2YWx1ZS5yZXN1bHQuZWxldmF0aW9uLCB2YWx1ZS5yZXN1bHQuYTEsIHZhbHVlLnJlc3VsdC5hMywgdmFsdWUucmVzdWx0LmE1LCB2YWx1ZS5yZXN1bHQucGl4ZWxfc2l6ZSwgZGlzdGFuY2UpO1xyXG5cdFx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGZkYoZGVuc2l0eSkudG9GaXhlZCgyKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGZkYoZGVuc2l0eSkudG9GaXhlZCgyKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdFx0XHR9LCAzMDApO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdHZhciBkZW5zaXR5VGltZXI7XHJcblxyXG5cdFx0XHRcdCQoZG9jdW1lbnQpLm9uKCdtb3VzZXVwIHRvdWNoZW5kJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0JChkb2N1bWVudCkub2ZmKCdtb3VzZW1vdmUgdG91Y2htb3ZlJyk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh2YWx1ZS50eXBlID09PSAncGFub1dhbGwnKSB7XHJcblx0XHRcdHZhciBtaW5pbXVtID0gdmFsdWUubWluID8gcyh2YWx1ZS5taW4gKiB2YWx1ZS5wcG0pIDogMDtcclxuXHRcdFx0dmFyIG1heGltdW0gPSBzKHZhbHVlLm1heCAqIHZhbHVlLnBwbSk7XHJcblx0XHRcdGZvciAodmFyIHggaW4gdmFsdWUuc3BvdHMpIHtcclxuXHRcdFx0XHR2YWx1ZS5zcG90c1t4XSA9IHModmFsdWUuc3BvdHNbeF0gKiB2YWx1ZS5wcG0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhbHVlLnNwb3RzLnNvcnQoKGEsIGIpID0+IHtcclxuXHRcdFx0XHRpZiAoYSA+IGIpIHsgcmV0dXJuIDE7IH1cclxuXHRcdFx0XHRpZiAoYSA8IGIpIHsgcmV0dXJuIC0xOyB9XHJcblx0XHRcdFx0cmV0dXJuIDA7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR2YXIgcG9zWCA9IHModmFsdWUubWF4ICogdmFsdWUucHBtKTtcclxuXHRcdFx0aWYgKHZhbHVlLnN0YXJ0dmFsdWUpIHsgcG9zWCA9IHModmFsdWUuc3RhcnR2YWx1ZSAqIHZhbHVlLnBwbSk7IH1cclxuXHRcdFx0aWYgKHBvc1ggPCBtaW5pbXVtKSB7IHBvc1ggPSBtaW5pbXVtOyB9XHJcblx0XHRcdGlmIChwb3NYID4gbWF4aW11bSkgeyBwb3NYID0gbWF4aW11bTsgfVxyXG5cclxuXHRcdFx0dmFyIGZvdlNpZGVTbGlkZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcblx0XHRcdGZvdlNpZGVTbGlkZXIuYWRkQ2xhc3MoJ2ZvdlNpZGVTbGlkZXIgZm92U2lkZVNsaWRlckxpbmUnKTtcclxuXHRcdFx0Zm92U2lkZVNsaWRlci5jc3Moe1xyXG5cdFx0XHRcdCd3aWR0aCc6ICczMHB4JyxcclxuXHRcdFx0XHQnaGVpZ2h0JzogJzMwcHgnLFxyXG5cdFx0XHRcdCdwb3NpdGlvbic6ICdhYnNvbHV0ZScsXHJcblx0XHRcdFx0J2JhY2tncm91bmQtaW1hZ2UnOiAndXJsKC4uL2ltZy9pY29ucy9hbmZhc3Nlcl9lbnRmZXJudW5nX3hhY2hzZS5wbmcpJyxcclxuXHRcdFx0XHQnYmFja2dyb3VuZC1zaXplJzogJ2NvbnRhaW4nLFxyXG5cdFx0XHRcdCd0cmFuc2Zvcm0nOiAndHJhbnNsYXRlKC0xNXB4LCAtMTVweCknLFxyXG5cdFx0XHRcdCd0b3AnOiBzKDI3OCkgKyAncHgnLFxyXG5cdFx0XHRcdCdsZWZ0JzogKHMoNTQpICsgcG9zWCkgKyAncHgnLFxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8vIHZhciBmb3ZTaWRlVGV4dCA9ICQoJzxzcGFuIC8+Jyk7XHJcblx0XHRcdC8vIGZvdlNpZGVUZXh0Lmh0bWwoYDxici8+JHthcHAuaUZ0RigocG9zWCAqIDYyMCAvIGNvbnRXaWR0aCkgLyB2YWx1ZS5wcG0pLnRvRml4ZWQoMil9ICR7YXBwLnVuaXRTeW1ib2woKX1gKTtcclxuXHRcdFx0Ly8gZm92U2lkZVRleHQuY3NzKHtcclxuXHRcdFx0Ly8gXHQncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG5cdFx0XHQvLyBcdCd0b3AnOiBzKDI3OCkgKyAncHgnLFxyXG5cdFx0XHQvLyBcdCd0cmFuc2Zvcm0nOiAndHJhbnNsYXRlKDVweCwgLTUwJSknLFxyXG5cdFx0XHQvLyBcdCdjb2xvcic6ICcjYjViNWI3JyxcclxuXHRcdFx0Ly8gXHQnbWFyZ2luJzogJzAgMTBweCcsXHJcblx0XHRcdC8vIFx0J3doaXRlLXNwYWNlJzogJ25vd3JhcCcsXHJcblx0XHRcdC8vIFx0J2xpbmUtaGVpZ2h0JzogJzMxcHgnXHJcblx0XHRcdC8vIH0pO1xyXG5cdFx0XHQvLyBpZiAocG9zWCA8IDYwMCkge1xyXG5cdFx0XHQvLyBcdGZvdlNpZGVUZXh0LmNzcygnbGVmdCcsIChzKDU0KSArIHBvc1gpICsgJ3B4Jyk7XHJcblx0XHRcdC8vIH0gZWxzZSB7XHJcblx0XHRcdC8vIFx0Zm92U2lkZVRleHQuY3NzKCdsZWZ0JywgKHMoNTQpICsgNjAwKSArICdweCcpO1xyXG5cdFx0XHQvLyB9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBzZXRUZXh0KGRpc3RhbmNlLCBoZWlnaHRBdFgpIHtcclxuXHRcdFx0XHRpZiAoYXBwLmN1cnJlbnQudmlldyA9PT0gJ2RvcmknKSB7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYoZGlzdGFuY2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDQpJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbENhbGN1bGF0aW5nJykpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsTm90QXZhaWxhYmxlJykpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMSknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsSGVpZ2h0JykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoYXBwLmN1cnJlbnQudmlldyA9PT0gJ3ZpX2FuJykge1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYoZGlzdGFuY2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuLnBhbm8gLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMiknKS5jc3MoJ2Rpc3BsYXknLCAndGFibGUtcm93Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCg0KScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxOb3RBdmFpbGFibGUnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoXCJcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhcHAuY3VycmVudC52aWV3ID09PSAnY2FtZXJhJykge1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihkaXN0YW5jZSkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCg0KScpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsQ2FsY3VsYXRpbmcnKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsTm90QXZhaWxhYmxlJykpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbEhlaWdodCcpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBkaXN0YW5jZSA9IChwb3NYICogNjIwIC8gY29udFdpZHRoKSAvIHZhbHVlLnBwbTtcclxuXHRcdFx0c2V0VGV4dChkaXN0YW5jZSk7XHJcblxyXG5cdFx0XHR2YXIgZGVuc2l0eSA9IHBhbm9EZW5zaXR5QXQodmFsdWUucmVzdWx0LmVsZXZhdGlvbiwgdmFsdWUucmVzdWx0LmExLCB2YWx1ZS5yZXN1bHQuYTMsIHZhbHVlLnJlc3VsdC5hNSwgdmFsdWUucmVzdWx0LnBpeGVsX3NpemUsIGRpc3RhbmNlKTtcclxuXHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRmZGKGRlbnNpdHkpLnRvRml4ZWQoMikgKyAnIHBwJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRmZGKGRlbnNpdHkpLnRvRml4ZWQoMikgKyAnIHBwJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cclxuXHRcdFx0dmFsdWUuY29udGFpbmVyLmFwcGVuZChmb3ZTaWRlU2xpZGVyKTtcclxuXHRcdFx0Ly8gdmFsdWUuY29udGFpbmVyLmFwcGVuZChmb3ZTaWRlVGV4dCk7XHJcblxyXG5cclxuXHRcdFx0Zm92U2lkZVNsaWRlci5vbignbW91c2Vkb3duIHRvdWNoc3RhcnQnLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRpZiAoJHNsaWRlclRvb2xUaXApIHsgJHNsaWRlclRvb2xUaXAucmVtb3ZlKCk7IH1cclxuXHRcdFx0XHR2YXIgcHJldlg7XHJcblx0XHRcdFx0aWYgKGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSB7XHJcblx0XHRcdFx0XHRwcmV2WCA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChlLnR5cGUgPT09ICdtb3VzZWRvd24nKSB7XHJcblx0XHRcdFx0XHRwcmV2WCA9IGUuY2xpZW50WDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGlzTWFnbmV0aWMgPSBmYWxzZTtcclxuXHRcdFx0XHR2YXIgYWRkZWREZWx0YSA9IDA7XHJcblx0XHRcdFx0dmFyIG1hZ25ldGljRGlzdGFuY2UgPSBzKDE1KTtcclxuXHRcdFx0XHQkKGRvY3VtZW50KS5vbignbW91c2Vtb3ZlIHRvdWNobW92ZScsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHR2YXIgZGVsdGE7XHJcblx0XHRcdFx0XHRpZiAoZS50eXBlID09PSAndG91Y2htb3ZlJykge1xyXG5cdFx0XHRcdFx0XHRkZWx0YSA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFggLSBwcmV2WDtcclxuXHRcdFx0XHRcdFx0cHJldlggPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcclxuXHRcdFx0XHRcdFx0ZGVsdGEgPSBlLmNsaWVudFggLSBwcmV2WDtcclxuXHRcdFx0XHRcdFx0cHJldlggPSBlLmNsaWVudFg7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoaXNNYWduZXRpYyAmJiAoYWRkZWREZWx0YSA+IC1tYWduZXRpY0Rpc3RhbmNlICYmIGFkZGVkRGVsdGEgPCBtYWduZXRpY0Rpc3RhbmNlKSkge1xyXG5cdFx0XHRcdFx0XHRhZGRlZERlbHRhICs9IGRlbHRhO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGlzTWFnbmV0aWMpIHsgaXNNYWduZXRpYyA9IGZhbHNlOyBkZWx0YSA9IGFkZGVkRGVsdGE7IGFkZGVkRGVsdGEgPSAwOyB9XHJcblx0XHRcdFx0XHRwb3NYID0gcG9zWCArIGRlbHRhO1xyXG5cdFx0XHRcdFx0aWYgKGRlbHRhID4gMCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgbmV4dCA9IHBvc1g7XHJcblx0XHRcdFx0XHRcdGZvciAodmFyIHggaW4gdmFsdWUuc3BvdHMpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodmFsdWUuc3BvdHNbeF0gPj0gcG9zWCkgeyBuZXh0ID0gdmFsdWUuc3BvdHNbeF07IGJyZWFrOyB9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKG5leHQgLSBtYWduZXRpY0Rpc3RhbmNlIDwgcG9zWCkgeyBwb3NYID0gbmV4dDsgaXNNYWduZXRpYyA9IHRydWU7IH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChkZWx0YSA8IDApIHtcclxuXHRcdFx0XHRcdFx0dmFyIHByZXZpb3VzID0gdmFsdWUuc3BvdHNbMF07XHJcblx0XHRcdFx0XHRcdGZvciAodmFyIHggaW4gdmFsdWUuc3BvdHMpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodmFsdWUuc3BvdHNbeF0gPj0gcG9zWCkgeyBicmVhazsgfVxyXG5cdFx0XHRcdFx0XHRcdHByZXZpb3VzID0gdmFsdWUuc3BvdHNbeF07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKHByZXZpb3VzICsgbWFnbmV0aWNEaXN0YW5jZSA+IHBvc1gpIHsgcG9zWCA9IHByZXZpb3VzOyBpc01hZ25ldGljID0gdHJ1ZTsgfVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKHBvc1ggPCBtaW5pbXVtKSB7IHBvc1ggPSBtaW5pbXVtOyB9XHJcblx0XHRcdFx0XHRpZiAocG9zWCA+IG1heGltdW0pIHsgcG9zWCA9IG1heGltdW07IH1cclxuXHRcdFx0XHRcdGZvdlNpZGVTbGlkZXIuY3NzKCdsZWZ0JywgKHMoNTQpICsgcG9zWCkgKyAncHgnKTtcclxuXHRcdFx0XHRcdC8vIGZvdlNpZGVUZXh0Lmh0bWwoYDxici8+JHthcHAuaUZ0RigocG9zWCAqIDYyMCAvIGNvbnRXaWR0aCkgLyB2YWx1ZS5wcG0pLnRvRml4ZWQoMil9ICR7YXBwLnVuaXRTeW1ib2woKX1gKTtcclxuXHRcdFx0XHRcdC8vIGlmIChwb3NYIDwgNjAwKSB7XHJcblx0XHRcdFx0XHQvLyBcdGZvdlNpZGVUZXh0LmNzcygnbGVmdCcsIChzKDU0KSArIHBvc1gpICsgJ3B4Jyk7XHJcblx0XHRcdFx0XHQvLyB9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gXHRmb3ZTaWRlVGV4dC5jc3MoJ2xlZnQnLCAocyg1NCkgKyA2MDApICsgJ3B4Jyk7XHJcblx0XHRcdFx0XHQvLyB9XHJcblxyXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gKHBvc1ggKiA2MjAgLyBjb250V2lkdGgpIC8gdmFsdWUucHBtO1xyXG5cdFx0XHRcdFx0c2V0VGV4dChkaXN0YW5jZSk7XHJcblxyXG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KGRlbnNpdHlUaW1lcik7XHJcblx0XHRcdFx0XHRkZW5zaXR5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRcdFx0dmFyIGRlbnNpdHkgPSBwYW5vRGVuc2l0eUF0KHZhbHVlLnJlc3VsdC5lbGV2YXRpb24sIHZhbHVlLnJlc3VsdC5hMSwgdmFsdWUucmVzdWx0LmEzLCB2YWx1ZS5yZXN1bHQuYTUsIHZhbHVlLnJlc3VsdC5waXhlbF9zaXplLCBkaXN0YW5jZSk7XHJcblx0XHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZmRihkZW5zaXR5KS50b0ZpeGVkKDIpICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZmRihkZW5zaXR5KS50b0ZpeGVkKDIpICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdH0sIDMwMCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0dmFyIGRlbnNpdHlUaW1lcjtcclxuXHJcblx0XHRcdFx0JChkb2N1bWVudCkub24oJ21vdXNldXAgdG91Y2hlbmQnLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHQkKGRvY3VtZW50KS5vZmYoJ21vdXNlbW92ZSB0b3VjaG1vdmUnKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fSk7XHJcblxyXG5cdGFwcC5vbigncHBtQ2hhbmdlVG9wJywgZnVuY3Rpb24gKHZhbHVlKSB7XHJcblx0XHR2YXIgJHNsaWRlclRvb2xUaXAgPSAkKCcjc2xpZGVyVG9vbHRpcCcpO1xyXG5cdFx0ZnVuY3Rpb24gcyh2KSB7XHJcblx0XHRcdHJldHVybiBjb250V2lkdGggLyA2MjAgKiB2O1xyXG5cdFx0fVxyXG5cdFx0dmFyIGNvbnRXaWR0aCA9IHZhbHVlLmNvbnRhaW5lci53aWR0aCgpO1xyXG5cdFx0aWYgKHZhbHVlLnR5cGUgPT09ICdub25wYW5vJykge1xyXG5cdFx0XHRjb25zb2xlLmxvZyh2YWx1ZSlcclxuXHRcdFx0dmFyIG1pbmltdW0gPSB2YWx1ZS5taW4gPyBzKHZhbHVlLm1pbiAqIHZhbHVlLnBwbSkgOiAwO1xyXG5cdFx0XHR2YXIgbWF4aW11bSA9IHModmFsdWUubWF4ICogdmFsdWUucHBtKTtcclxuXHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdHZhbHVlLnNwb3RzW3hdID0gcyh2YWx1ZS5zcG90c1t4XSAqIHZhbHVlLnBwbSk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWUuc3BvdHMuc29ydCgoYSwgYikgPT4ge1xyXG5cdFx0XHRcdGlmIChhID4gYikgeyByZXR1cm4gMTsgfVxyXG5cdFx0XHRcdGlmIChhIDwgYikgeyByZXR1cm4gLTE7IH1cclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHZhciBwb3NYID0gcygodmFsdWUuc3RhcnRQb3MgfHwgdmFsdWUubWF4KSAqIHZhbHVlLnBwbSk7XHJcblx0XHRcdGlmIChwb3NYIDwgbWluaW11bSkgeyBwb3NYID0gbWluaW11bTsgfVxyXG5cdFx0XHRpZiAocG9zWCA+IG1heGltdW0pIHsgcG9zWCA9IG1heGltdW07IH1cclxuXHJcblx0XHRcdHZhciBmb3ZUb3BTbGlkZXIgPSAkKCc8ZGl2IC8+Jyk7XHJcblx0XHRcdGZvdlRvcFNsaWRlci5hZGRDbGFzcygnZm92U2lkZVNsaWRlciBmb3ZTaWRlU2xpZGVyTGluZScpO1xyXG5cdFx0XHRmb3ZUb3BTbGlkZXIuY3NzKHtcclxuXHRcdFx0XHQnd2lkdGgnOiAnMzBweCcsXHJcblx0XHRcdFx0J2hlaWdodCc6ICczMHB4JyxcclxuXHRcdFx0XHQncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG5cdFx0XHRcdCdiYWNrZ3JvdW5kLWltYWdlJzogJ3VybCguLi9pbWcvaWNvbnMvYW5mYXNzZXJfZW50ZmVybnVuZ194YWNoc2UucG5nKScsXHJcblx0XHRcdFx0J2JhY2tncm91bmQtc2l6ZSc6ICdjb250YWluJyxcclxuXHRcdFx0XHQndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgtMTVweCwgLTE1cHgpJyxcclxuXHRcdFx0XHQndG9wJzogcygyNzgpICsgJ3B4JyxcclxuXHRcdFx0XHQnbGVmdCc6IChzKDU0KSArIHBvc1gpICsgJ3B4JyxcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSAocG9zWCAqIDYyMCAvIGNvbnRXaWR0aCkgLyB2YWx1ZS5wcG07XHJcblx0XHRcdHZhciBoZWlnaHRBdFggPSB2YWx1ZS5lbGV2YXRpb24gLSAoZGlzdGFuY2UgKiBNYXRoLnRhbihkZWdUb1JhZCh2YWx1ZS50aWx0IC0gdmFsdWUuZm92X3ZlciAvIDIpKSk7XHJcblx0XHRcdHZhciBmb3Zfd2lkdGggPSAyICogTWF0aC5zcXJ0KChkaXN0YW5jZSAqIGRpc3RhbmNlKSArICh2YWx1ZS5lbGV2YXRpb24gKiB2YWx1ZS5lbGV2YXRpb24pKSAqIE1hdGgudGFuKGRlZ1RvUmFkKHZhbHVlLmZvdl9ob3IgLyAyKSk7XHJcblx0XHRcdHZhciByZXNvbHV0aW9uID0gdmFsdWUucmVzX2hvciAvIGZvdl93aWR0aDtcclxuXHJcblx0XHRcdHZhbHVlLmNvbnRhaW5lci5hcHBlbmQoZm92VG9wU2xpZGVyKTtcclxuXHRcdFx0ZnVuY3Rpb24gc2V0VGV4dChkaXN0YW5jZSwgaGVpZ2h0QXRYLCBmb3Zfd2lkdGgsIHJlc29sdXRpb24pIHtcclxuXHRcdFx0XHRpZiAoYXBwLmN1cnJlbnQudmlldyA9PT0gJ2RvcmknKSB7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYoZGlzdGFuY2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpJykuY3NzKCdkaXNwbGF5JywgJ3RhYmxlLXJvdycpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoNCknKS5jc3MoJ2Rpc3BsYXknLCAndGFibGUtcm93Jyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGZkYocmVzb2x1dGlvbikudG9GaXhlZCgyKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYoZm92X3dpZHRoKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxXaWR0aCcpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGFwcC5jdXJyZW50LnZpZXcgPT09ICd2aV9hbicpIHtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihkaXN0YW5jZSkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4gLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMiknKS5jc3MoJ2Rpc3BsYXknLCAndGFibGUtcm93Jyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbiAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKScpLmNzcygnZGlzcGxheScsICd0YWJsZS1yb3cnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0Rihmb3Zfd2lkdGgpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbFdpZHRoJykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoYXBwLmN1cnJlbnQudmlldyA9PT0gJ2NhbWVyYScpIHtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYoZGlzdGFuY2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKScpLmNzcygnZGlzcGxheScsICd0YWJsZS1yb3cnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCg0KScpLmNzcygnZGlzcGxheScsICd0YWJsZS1yb3cnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGZkYocmVzb2x1dGlvbikudG9GaXhlZCgyKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRnRGKGZvdl93aWR0aCkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbFdpZHRoJykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c2V0VGV4dChkaXN0YW5jZSwgaGVpZ2h0QXRYLCBmb3Zfd2lkdGgsIHJlc29sdXRpb24pO1xyXG5cclxuXHRcdFx0Zm92VG9wU2xpZGVyLm9uKCdtb3VzZWRvd24gdG91Y2hzdGFydCcsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdGlmICgkc2xpZGVyVG9vbFRpcCkgeyAkc2xpZGVyVG9vbFRpcC5yZW1vdmUoKTsgfVxyXG5cdFx0XHRcdHZhciBwcmV2WDtcclxuXHRcdFx0XHRpZiAoZS50eXBlID09PSAndG91Y2hzdGFydCcpIHtcclxuXHRcdFx0XHRcdHByZXZYID0gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlZG93bicpIHtcclxuXHRcdFx0XHRcdHByZXZYID0gZS5jbGllbnRYO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaXNNYWduZXRpYyA9IGZhbHNlO1xyXG5cdFx0XHRcdHZhciBhZGRlZERlbHRhID0gMDtcclxuXHRcdFx0XHR2YXIgbWFnbmV0aWNEaXN0YW5jZSA9IHMoMTUpO1xyXG5cdFx0XHRcdCQoZG9jdW1lbnQpLm9uKCdtb3VzZW1vdmUgdG91Y2htb3ZlJywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRcdHZhciBkZWx0YTtcclxuXHRcdFx0XHRcdGlmIChlLnR5cGUgPT09ICd0b3VjaG1vdmUnKSB7XHJcblx0XHRcdFx0XHRcdGRlbHRhID0gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHByZXZYO1xyXG5cdFx0XHRcdFx0XHRwcmV2WCA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoZS50eXBlID09PSAnbW91c2Vtb3ZlJykge1xyXG5cdFx0XHRcdFx0XHRkZWx0YSA9IGUuY2xpZW50WCAtIHByZXZYO1xyXG5cdFx0XHRcdFx0XHRwcmV2WCA9IGUuY2xpZW50WDtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChpc01hZ25ldGljICYmIChhZGRlZERlbHRhID4gLW1hZ25ldGljRGlzdGFuY2UgJiYgYWRkZWREZWx0YSA8IG1hZ25ldGljRGlzdGFuY2UpKSB7XHJcblx0XHRcdFx0XHRcdGFkZGVkRGVsdGEgKz0gZGVsdGE7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNNYWduZXRpYykgeyBpc01hZ25ldGljID0gZmFsc2U7IGRlbHRhID0gYWRkZWREZWx0YTsgYWRkZWREZWx0YSA9IDA7IH1cclxuXHRcdFx0XHRcdHBvc1ggPSBwb3NYICsgZGVsdGE7XHJcblx0XHRcdFx0XHRpZiAoZGVsdGEgPiAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBuZXh0ID0gcG9zWDtcclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZS5zcG90c1t4XSA+PSBwb3NYKSB7IG5leHQgPSB2YWx1ZS5zcG90c1t4XTsgYnJlYWs7IH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV4dCAtIG1hZ25ldGljRGlzdGFuY2UgPCBwb3NYKSB7IHBvc1ggPSBuZXh0OyBpc01hZ25ldGljID0gdHJ1ZTsgfVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKGRlbHRhIDwgMCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgcHJldmlvdXMgPSB2YWx1ZS5zcG90c1swXTtcclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh2YWx1ZS5zcG90c1t4XSA+PSBwb3NYKSB7IGJyZWFrOyB9XHJcblx0XHRcdFx0XHRcdFx0cHJldmlvdXMgPSB2YWx1ZS5zcG90c1t4XTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAocHJldmlvdXMgKyBtYWduZXRpY0Rpc3RhbmNlID4gcG9zWCkgeyBwb3NYID0gcHJldmlvdXM7IGlzTWFnbmV0aWMgPSB0cnVlOyB9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAocG9zWCA8IG1pbmltdW0pIHsgcG9zWCA9IG1pbmltdW07IH1cclxuXHRcdFx0XHRcdGlmIChwb3NYID4gbWF4aW11bSkgeyBwb3NYID0gbWF4aW11bTsgfVxyXG5cdFx0XHRcdFx0Zm92VG9wU2xpZGVyLmNzcygnbGVmdCcsIHMoNTQpICsgcG9zWCArICdweCcpO1xyXG5cclxuXHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IChwb3NYICogNjIwIC8gY29udFdpZHRoKSAvIHZhbHVlLnBwbTtcclxuXHRcdFx0XHRcdHZhciBoZWlnaHRBdFggPSB2YWx1ZS5lbGV2YXRpb24gLSAoZGlzdGFuY2UgKiBNYXRoLnRhbihkZWdUb1JhZCh2YWx1ZS50aWx0IC0gdmFsdWUuZm92X3ZlciAvIDIpKSk7XHJcblx0XHRcdFx0XHR2YXIgZm92X3dpZHRoID0gMiAqIE1hdGguc3FydCgoZGlzdGFuY2UgKiBkaXN0YW5jZSkgKyAodmFsdWUuZWxldmF0aW9uICogdmFsdWUuZWxldmF0aW9uKSkgKiBNYXRoLnRhbihkZWdUb1JhZCh2YWx1ZS5mb3ZfaG9yIC8gMikpO1xyXG5cdFx0XHRcdFx0dmFyIHJlc29sdXRpb24gPSB2YWx1ZS5yZXNfaG9yIC8gZm92X3dpZHRoO1xyXG5cclxuXHRcdFx0XHRcdHNldFRleHQoZGlzdGFuY2UsIGhlaWdodEF0WCwgZm92X3dpZHRoLCByZXNvbHV0aW9uKTtcclxuXHJcblx0XHRcdFx0XHQvLyBjbGVhclRpbWVvdXQoZGVuc2l0eVRpbWVyKTtcclxuXHRcdFx0XHRcdC8vIGRlbnNpdHlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdFx0Ly8gXHR2YXIgZGVuc2l0eSA9IHBhbm9EZW5zaXR5KHZhbHVlLnJlc3VsdC5lbGV2YXRpb24sIHZhbHVlLnJlc3VsdC5yYXcuYTEsIHZhbHVlLnJlc3VsdC5yYXcuYTMsIHZhbHVlLnJlc3VsdC5yYXcuYTUsIHZhbHVlLnJlc3VsdC5yYXcucGl4ZWxfc2l6ZSk7XHJcblx0XHRcdFx0XHQvLyBcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihkZW5zaXR5KS50b0ZpeGVkKDIpICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdC8vIFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihkZW5zaXR5KS50b0ZpeGVkKDIpICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdC8vIH0sIDMwMDApO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdC8vIHZhciBkZW5zaXR5VGltZXI7XHJcblxyXG5cdFx0XHRcdCQoZG9jdW1lbnQpLm9uKCdtb3VzZXVwIHRvdWNoZW5kJywgZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0JChkb2N1bWVudCkub2ZmKCdtb3VzZW1vdmUgdG91Y2htb3ZlJyk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh2YWx1ZS50eXBlID09PSAncGFub0NlaWwnKSB7XHJcblx0XHRcdHZhciBtaW5pbXVtID0gdmFsdWUubWluID8gcyh2YWx1ZS5taW4gKiB2YWx1ZS5wcG0pIDogMDtcclxuXHRcdFx0dmFyIG1heGltdW0gPSBzKDE3MyAqIC41KTtcclxuXHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdHZhbHVlLnNwb3RzW3hdID0gcyh2YWx1ZS5zcG90c1t4XSAqIHZhbHVlLnBwbSk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWUuc3BvdHMuc29ydCgoYSwgYikgPT4ge1xyXG5cdFx0XHRcdGlmIChhID4gYikgeyByZXR1cm4gMTsgfVxyXG5cdFx0XHRcdGlmIChhIDwgYikgeyByZXR1cm4gLTE7IH1cclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHZhciBwb3NZID0gcyh2YWx1ZS5tYXggKiB2YWx1ZS5wcG0pO1xyXG5cdFx0XHRpZiAocG9zWSA8IG1pbmltdW0pIHsgcG9zWSA9IG1pbmltdW07IH1cclxuXHRcdFx0aWYgKHBvc1kgPiBtYXhpbXVtKSB7IHBvc1kgPSBtYXhpbXVtOyB9XHJcblxyXG5cdFx0XHR2YXIgZm92VG9wU2xpZGVyID0gJCgnPGRpdiAvPicpO1xyXG5cdFx0XHRmb3ZUb3BTbGlkZXIuYWRkQ2xhc3MoJ2ZvdlNpZGVTbGlkZXInKTtcclxuXHRcdFx0Zm92VG9wU2xpZGVyLmNzcyh7XHJcblx0XHRcdFx0J3dpZHRoJzogJzMwcHgnLFxyXG5cdFx0XHRcdCdoZWlnaHQnOiAnMzBweCcsXHJcblx0XHRcdFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuXHRcdFx0XHQnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoLi4vaW1nL2ljb25zL2FuZmFzc2VyX2VudGZlcm51bmdfeWFjaHNlLnBuZyknLFxyXG5cdFx0XHRcdCdiYWNrZ3JvdW5kLXNpemUnOiAnY29udGFpbicsXHJcblx0XHRcdFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoLTE1cHgsIC0xNXB4KScsXHJcblx0XHRcdFx0J3RvcCc6IChzKDg0ICsgMTc1ICogLjUpIC0gcG9zWSkgKyAncHgnLFxyXG5cdFx0XHRcdCdsZWZ0Jzogcyg0OCkgKyAncHgnLFxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8vIHZhciBmb3ZUb3BUZXh0ID0gJCgnPHNwYW4gLz4nKTtcclxuXHRcdFx0Ly8gZm92VG9wVGV4dC50ZXh0KGAke2FwcC5pRnRGKChwb3NZICogNjIwIC8gY29udFdpZHRoKSAvIHZhbHVlLnBwbSkudG9GaXhlZCgyKX0gJHthcHAudW5pdFN5bWJvbCgpfWApO1xyXG5cdFx0XHQvLyBmb3ZUb3BUZXh0LmNzcyh7XHJcblx0XHRcdC8vIFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuXHRcdFx0Ly8gXHQndG9wJzogKHMoODQgKyAxNzUgKiAuNSkgLSBwb3NZKSArICdweCcsXHJcblx0XHRcdC8vIFx0J2xlZnQnOiBzKDUyKSArICdweCcsXHJcblx0XHRcdC8vIFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoNXB4LCAtNTAlKScsXHJcblx0XHRcdC8vIFx0J2NvbG9yJzogJyNiNWI1YjcnLFxyXG5cdFx0XHQvLyBcdCdtYXJnaW4nOiAnMCAxMHB4JyxcclxuXHRcdFx0Ly8gXHQnd2hpdGUtc3BhY2UnOiAnbm93cmFwJyxcclxuXHRcdFx0Ly8gXHQnbGluZS1oZWlnaHQnOiAnMzFweCdcclxuXHRcdFx0Ly8gfSlcclxuXHRcdFx0dmFsdWUuY29udGFpbmVyLmFwcGVuZChmb3ZUb3BTbGlkZXIpO1xyXG5cdFx0XHQvLyB2YWx1ZS5jb250YWluZXIuYXBwZW5kKGZvdlRvcFRleHQpO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gc2V0VGV4dChkaXN0YW5jZSwgaGVpZ2h0QXRYKSB7XHJcblx0XHRcdFx0aWYgKGFwcC5jdXJyZW50LnZpZXcgPT09ICdkb3JpJykge1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMSkgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRnRGKGRpc3RhbmNlKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKScpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCg0KScpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxDYWxjdWxhdGluZycpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE5vdEF2YWlsYWJsZScpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbFdpZHRoJykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoYXBwLmN1cnJlbnQudmlldyA9PT0gJ3ZpX2FuJykge1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYoZGlzdGFuY2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LnZpX2FuLnBhbm8gLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMiknKS5jc3MoJ2Rpc3BsYXknLCAndGFibGUtcm93Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCg0KScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxOb3RBdmFpbGFibGUnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgxKScpLnRleHQoXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgJCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoXCJcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhcHAuY3VycmVudC52aWV3ID09PSAnY2FtZXJhJykge1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihkaXN0YW5jZSkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCg0KScpLmNzcygnZGlzcGxheScsICdub25lJyk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsQ2FsY3VsYXRpbmcnKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsTm90QXZhaWxhYmxlJykpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbFdpZHRoJykpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIGRpc3RhbmNlID0gKHBvc1kgKiA2MjAgLyBjb250V2lkdGgpIC8gdmFsdWUucHBtO1xyXG5cdFx0XHRzZXRUZXh0KGRpc3RhbmNlKTtcclxuXHJcblx0XHRcdHZhciBkZW5zaXR5ID0gcGFub0RlbnNpdHlBdCh2YWx1ZS5yZXN1bHQuZWxldmF0aW9uLCB2YWx1ZS5yZXN1bHQuYTEsIHZhbHVlLnJlc3VsdC5hMywgdmFsdWUucmVzdWx0LmE1LCB2YWx1ZS5yZXN1bHQucGl4ZWxfc2l6ZSwgZGlzdGFuY2UpO1xyXG5cdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGZkYoZGVuc2l0eSkudG9GaXhlZCgyKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGZkYoZGVuc2l0eSkudG9GaXhlZCgyKSArICcgcHAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblxyXG5cdFx0XHRmb3ZUb3BTbGlkZXIub24oJ21vdXNlZG93biB0b3VjaHN0YXJ0JywgZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0aWYgKCRzbGlkZXJUb29sVGlwKSB7ICRzbGlkZXJUb29sVGlwLnJlbW92ZSgpOyB9XHJcblx0XHRcdFx0dmFyIHByZXZZO1xyXG5cdFx0XHRcdGlmIChlLnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xyXG5cdFx0XHRcdFx0cHJldlkgPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoZS50eXBlID09PSAnbW91c2Vkb3duJykge1xyXG5cdFx0XHRcdFx0cHJldlkgPSBlLmNsaWVudFk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBpc01hZ25ldGljID0gZmFsc2U7XHJcblx0XHRcdFx0dmFyIGFkZGVkRGVsdGEgPSAwO1xyXG5cdFx0XHRcdHZhciBtYWduZXRpY0Rpc3RhbmNlID0gcygxMCk7XHJcblx0XHRcdFx0JChkb2N1bWVudCkub24oJ21vdXNlbW92ZSB0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdFx0dmFyIGRlbHRhO1xyXG5cdFx0XHRcdFx0aWYgKGUudHlwZSA9PT0gJ3RvdWNobW92ZScpIHtcclxuXHRcdFx0XHRcdFx0ZGVsdGEgPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRZIC0gcHJldlk7XHJcblx0XHRcdFx0XHRcdHByZXZZID0gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChlLnR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XHJcblx0XHRcdFx0XHRcdGRlbHRhID0gZS5jbGllbnRZIC0gcHJldlk7XHJcblx0XHRcdFx0XHRcdHByZXZZID0gZS5jbGllbnRZO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKGlzTWFnbmV0aWMgJiYgKGFkZGVkRGVsdGEgPiAtbWFnbmV0aWNEaXN0YW5jZSAmJiBhZGRlZERlbHRhIDwgbWFnbmV0aWNEaXN0YW5jZSkpIHtcclxuXHRcdFx0XHRcdFx0YWRkZWREZWx0YSArPSBkZWx0YTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpc01hZ25ldGljKSB7IGlzTWFnbmV0aWMgPSBmYWxzZTsgZGVsdGEgPSBhZGRlZERlbHRhOyBhZGRlZERlbHRhID0gMDsgfVxyXG5cdFx0XHRcdFx0cG9zWSA9IHBvc1kgLSBkZWx0YTtcclxuXHRcdFx0XHRcdGlmIChkZWx0YSA8IDApIHtcclxuXHRcdFx0XHRcdFx0dmFyIG5leHQgPSBwb3NZO1xyXG5cdFx0XHRcdFx0XHRmb3IgKHZhciB4IGluIHZhbHVlLnNwb3RzKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHZhbHVlLnNwb3RzW3hdID49IHBvc1kpIHsgbmV4dCA9IHZhbHVlLnNwb3RzW3hdOyBicmVhazsgfVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmICgrbmV4dCAtICttYWduZXRpY0Rpc3RhbmNlIDwgK3Bvc1kpIHsgcG9zWSA9IG5leHQ7IGlzTWFnbmV0aWMgPSB0cnVlOyB9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoZGVsdGEgPiAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBwcmV2aW91cyA9IHZhbHVlLnNwb3RzWzBdO1xyXG5cdFx0XHRcdFx0XHRmb3IgKHZhciB4IGluIHZhbHVlLnNwb3RzKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHZhbHVlLnNwb3RzW3hdID49IHBvc1kpIHsgYnJlYWs7IH1cclxuXHRcdFx0XHRcdFx0XHRwcmV2aW91cyA9IHZhbHVlLnNwb3RzW3hdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmICgrcHJldmlvdXMgKyArbWFnbmV0aWNEaXN0YW5jZSA+ICtwb3NZKSB7IHBvc1kgPSBwcmV2aW91czsgaXNNYWduZXRpYyA9IHRydWU7IH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChwb3NZIDwgbWluaW11bSkgeyBwb3NZID0gbWluaW11bTsgfVxyXG5cdFx0XHRcdFx0aWYgKHBvc1kgPiBtYXhpbXVtKSB7IHBvc1kgPSBtYXhpbXVtOyB9XHJcblx0XHRcdFx0XHRmb3ZUb3BTbGlkZXIuY3NzKCd0b3AnLCAocyg4NCArIDE3NSAqIC41KSAtIHBvc1kpICsgJ3B4Jyk7IC8vIHRoYXQgLjgyIGlzIGEgZml4LCBidXQgd2h5LCBwbGVhc2UgZW5saWdodGVuIG1lZWVcclxuXHRcdFx0XHRcdC8vIGZvdlRvcFRleHQudGV4dChgJHthcHAuaUZ0RigocG9zWSAqIDYyMCAvIGNvbnRXaWR0aCkgLyB2YWx1ZS5wcG0pLnRvRml4ZWQoMil9ICR7YXBwLnVuaXRTeW1ib2woKX1gKTtcclxuXHRcdFx0XHRcdC8vIGZvdlRvcFRleHQuY3NzKCd0b3AnLCAocyg4NCArIDE3NSAqIC41KSAtIHBvc1kpICsgJ3B4Jyk7XHJcblxyXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gKHBvc1kgKiA2MjAgLyBjb250V2lkdGgpIC8gdmFsdWUucHBtO1xyXG5cdFx0XHRcdFx0c2V0VGV4dChkaXN0YW5jZSk7XHJcblxyXG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KGRlbnNpdHlUaW1lcik7XHJcblx0XHRcdFx0XHRkZW5zaXR5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRcdFx0dmFyIGRlbnNpdHkgPSBwYW5vRGVuc2l0eUF0KHZhbHVlLnJlc3VsdC5lbGV2YXRpb24sIHZhbHVlLnJlc3VsdC5hMSwgdmFsdWUucmVzdWx0LmEzLCB2YWx1ZS5yZXN1bHQuYTUsIHZhbHVlLnJlc3VsdC5waXhlbF9zaXplLCBkaXN0YW5jZSk7XHJcblx0XHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZmRihkZW5zaXR5KS50b0ZpeGVkKDIpICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZmRihkZW5zaXR5KS50b0ZpeGVkKDIpICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdH0sIDMwMCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0dmFyIGRlbnNpdHlUaW1lcjtcclxuXHJcblx0XHRcdFx0JChkb2N1bWVudCkub24oJ21vdXNldXAgdG91Y2hlbmQnLCBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHQkKGRvY3VtZW50KS5vZmYoJ21vdXNlbW92ZSB0b3VjaG1vdmUnKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHZhbHVlLnR5cGUgPT09ICdwYW5vV2FsbCcpIHtcclxuXHRcdFx0dmFyIG1pbmltdW0gPSB2YWx1ZS5taW4gPyBzKHZhbHVlLm1pbiAqIHZhbHVlLnBwbSkgOiAwO1xyXG5cdFx0XHR2YXIgbWF4aW11bSA9IHModmFsdWUubWF4ICogdmFsdWUucHBtKTtcclxuXHRcdFx0Zm9yICh2YXIgeCBpbiB2YWx1ZS5zcG90cykge1xyXG5cdFx0XHRcdHZhbHVlLnNwb3RzW3hdID0gcyh2YWx1ZS5zcG90c1t4XSAqIHZhbHVlLnBwbSk7XHJcblx0XHRcdH1cclxuXHRcdFx0dmFsdWUuc3BvdHMuc29ydCgoYSwgYikgPT4ge1xyXG5cdFx0XHRcdGlmIChhID4gYikgeyByZXR1cm4gMTsgfVxyXG5cdFx0XHRcdGlmIChhIDwgYikgeyByZXR1cm4gLTE7IH1cclxuXHRcdFx0XHRyZXR1cm4gMDtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHZhciBwb3NYID0gcyh2YWx1ZS5tYXggKiB2YWx1ZS5wcG0pO1xyXG5cdFx0XHRpZiAodmFsdWUuc3RhcnR2YWx1ZSkgeyBwb3NYID0gcyh2YWx1ZS5zdGFydHZhbHVlICogdmFsdWUucHBtKTsgfVxyXG5cdFx0XHRpZiAocG9zWCA8IG1pbmltdW0pIHsgcG9zWCA9IG1pbmltdW07IH1cclxuXHRcdFx0aWYgKHBvc1ggPiBtYXhpbXVtKSB7IHBvc1ggPSBtYXhpbXVtOyB9XHJcblxyXG5cdFx0XHR2YXIgZm92VG9wU2xpZGVyID0gJCgnPGRpdiAvPicpO1xyXG5cdFx0XHRmb3ZUb3BTbGlkZXIuYWRkQ2xhc3MoJ2ZvdlNpZGVTbGlkZXIgZm92U2lkZVNsaWRlckxpbmUnKTtcclxuXHRcdFx0Zm92VG9wU2xpZGVyLmNzcyh7XHJcblx0XHRcdFx0J3dpZHRoJzogJzMwcHgnLFxyXG5cdFx0XHRcdCdoZWlnaHQnOiAnMzBweCcsXHJcblx0XHRcdFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuXHRcdFx0XHQnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoLi4vaW1nL2ljb25zL2FuZmFzc2VyX2VudGZlcm51bmdfeGFjaHNlLnBuZyknLFxyXG5cdFx0XHRcdCdiYWNrZ3JvdW5kLXNpemUnOiAnY29udGFpbicsXHJcblx0XHRcdFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoLTE1cHgsIC0xNXB4KScsXHJcblx0XHRcdFx0J3RvcCc6IHMoMjc4KSArICdweCcsXHJcblx0XHRcdFx0J2xlZnQnOiAocyg1NCArIDI4MSkgKyBwb3NYKSArICdweCcsXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gdmFyIGZvdlRvcFRleHQgPSAkKCc8c3BhbiAvPicpO1xyXG5cdFx0XHQvLyBmb3ZUb3BUZXh0Lmh0bWwoYDxici8+JHthcHAuaUZ0RigocG9zWCAqIDYyMCAvIGNvbnRXaWR0aCkgLyB2YWx1ZS5wcG0pLnRvRml4ZWQoMil9ICR7YXBwLnVuaXRTeW1ib2woKX1gKTtcclxuXHRcdFx0Ly8gZm92VG9wVGV4dC5jc3Moe1xyXG5cdFx0XHQvLyBcdCdwb3NpdGlvbic6ICdhYnNvbHV0ZScsXHJcblx0XHRcdC8vIFx0J3RvcCc6IHMoMjc4KSArICdweCcsXHJcblx0XHRcdC8vIFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoNXB4LCAtNTAlKScsXHJcblx0XHRcdC8vIFx0J2NvbG9yJzogJyNiNWI1YjcnLFxyXG5cdFx0XHQvLyBcdCdtYXJnaW4nOiAnMCAxMHB4JyxcclxuXHRcdFx0Ly8gXHQnd2hpdGUtc3BhY2UnOiAnbm93cmFwJyxcclxuXHRcdFx0Ly8gXHQnbGluZS1oZWlnaHQnOiAnMzFweCdcclxuXHRcdFx0Ly8gfSk7XHJcblx0XHRcdC8vIGlmIChwb3NYIDwgMzAwKSB7XHJcblx0XHRcdC8vIFx0Zm92VG9wVGV4dC5jc3MoJ2xlZnQnLCAocyg1NCArIDI4MSkgKyBwb3NYKSArICdweCcpO1xyXG5cdFx0XHQvLyB9IGVsc2Uge1xyXG5cdFx0XHQvLyBcdGZvdlRvcFRleHQuY3NzKCdsZWZ0JywgKHMoNTQgKyAyODEpICsgMzAwKSArICdweCcpO1xyXG5cdFx0XHQvLyB9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBzZXRUZXh0KGRpc3RhbmNlLCBoZWlnaHRBdFgpIHtcclxuXHRcdFx0XHRpZiAoYXBwLmN1cnJlbnQudmlldyA9PT0gJ2RvcmknKSB7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5sZW5zY2FsYyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgxKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmlGdEYoZGlzdGFuY2UpLnRvRml4ZWQoMikgKyAnICcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDMpJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDQpJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbENhbGN1bGF0aW5nJykpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsTm90QXZhaWxhYmxlJykpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMSknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsV2lkdGgnKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChhcHAuY3VycmVudC52aWV3ID09PSAndmlfYW4nKSB7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZ0RihkaXN0YW5jZSkudG9GaXhlZCgyKSArICcgJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQudmlfYW4ucGFubyAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKScpLmNzcygnZGlzcGxheScsICd0YWJsZS1yb3cnKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDEpIHNwYW46bnRoLWNoaWxkKDQpJykudGV4dChhcHAubGwoJ3NldHRpbmdzTW9kZVZpc3VhbE5vdEF2YWlsYWJsZScpKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDEpJykudGV4dChcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAkKCcudmlzdWFsT3V0cHV0Q29udC52aV9hbi5wYW5vIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChcIlwiKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGFwcC5jdXJyZW50LnZpZXcgPT09ICdjYW1lcmEnKSB7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMSkgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRnRGKGRpc3RhbmNlKS50b0ZpeGVkKDIpICsgJyAnICsgYXBwLnVuaXRTeW1ib2woKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMyknKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDQpJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgyKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxDYWxjdWxhdGluZycpKTtcclxuXHRcdFx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmNhbWVyYSAudmlzdWFsT3V0Um93Om50aC1jaGlsZCgzKSBzcGFuOm50aC1jaGlsZCgyKScpLnRleHQoYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxOb3RBdmFpbGFibGUnKSk7XHJcblx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMykgc3BhbjpudGgtY2hpbGQoMSknKS50ZXh0KGFwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsV2lkdGgnKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSAocG9zWCAqIDYyMCAvIGNvbnRXaWR0aCkgLyB2YWx1ZS5wcG07XHJcblx0XHRcdHNldFRleHQoZGlzdGFuY2UpO1xyXG5cclxuXHRcdFx0dmFyIGRlbnNpdHkgPSBwYW5vRGVuc2l0eUF0KHZhbHVlLnJlc3VsdC5lbGV2YXRpb24sIHZhbHVlLnJlc3VsdC5hMSwgdmFsdWUucmVzdWx0LmEzLCB2YWx1ZS5yZXN1bHQuYTUsIHZhbHVlLnJlc3VsdC5waXhlbF9zaXplLCBkaXN0YW5jZSk7XHJcblx0XHRcdCQoJy52aXN1YWxPdXRwdXRDb250LmxlbnNjYWxjIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZmRihkZW5zaXR5KS50b0ZpeGVkKDIpICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQuY2FtZXJhIC52aXN1YWxPdXRSb3c6bnRoLWNoaWxkKDIpIHNwYW46bnRoLWNoaWxkKDIpJykudGV4dChhcHAuaUZmRihkZW5zaXR5KS50b0ZpeGVkKDIpICsgJyBwcCcgKyBhcHAudW5pdFN5bWJvbCgpKTtcclxuXHJcblx0XHRcdHZhbHVlLmNvbnRhaW5lci5hcHBlbmQoZm92VG9wU2xpZGVyKTtcclxuXHRcdFx0Ly8gdmFsdWUuY29udGFpbmVyLmFwcGVuZChmb3ZUb3BUZXh0KTtcclxuXHJcblx0XHRcdGZvdlRvcFNsaWRlci5vbignbW91c2Vkb3duIHRvdWNoc3RhcnQnLCBmdW5jdGlvbiAoZSkge1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRpZiAoJHNsaWRlclRvb2xUaXApIHsgJHNsaWRlclRvb2xUaXAucmVtb3ZlKCk7IH1cclxuXHRcdFx0XHR2YXIgcHJldlg7XHJcblx0XHRcdFx0aWYgKGUudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSB7XHJcblx0XHRcdFx0XHRwcmV2WCA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChlLnR5cGUgPT09ICdtb3VzZWRvd24nKSB7XHJcblx0XHRcdFx0XHRwcmV2WCA9IGUuY2xpZW50WDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGlzTWFnbmV0aWMgPSBmYWxzZTtcclxuXHRcdFx0XHR2YXIgYWRkZWREZWx0YSA9IDA7XHJcblx0XHRcdFx0dmFyIG1hZ25ldGljRGlzdGFuY2UgPSBzKDE1KTtcclxuXHRcdFx0XHQkKGRvY3VtZW50KS5vbignbW91c2Vtb3ZlIHRvdWNobW92ZScsIGZ1bmN0aW9uIChlKSB7XHJcblx0XHRcdFx0XHR2YXIgZGVsdGE7XHJcblx0XHRcdFx0XHRpZiAoZS50eXBlID09PSAndG91Y2htb3ZlJykge1xyXG5cdFx0XHRcdFx0XHRkZWx0YSA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLmNsaWVudFggLSBwcmV2WDtcclxuXHRcdFx0XHRcdFx0cHJldlggPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcclxuXHRcdFx0XHRcdFx0ZGVsdGEgPSBlLmNsaWVudFggLSBwcmV2WDtcclxuXHRcdFx0XHRcdFx0cHJldlggPSBlLmNsaWVudFg7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAoaXNNYWduZXRpYyAmJiAoYWRkZWREZWx0YSA+IC1tYWduZXRpY0Rpc3RhbmNlICYmIGFkZGVkRGVsdGEgPCBtYWduZXRpY0Rpc3RhbmNlKSkge1xyXG5cdFx0XHRcdFx0XHRhZGRlZERlbHRhICs9IGRlbHRhO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGlzTWFnbmV0aWMpIHsgaXNNYWduZXRpYyA9IGZhbHNlOyBkZWx0YSA9IGFkZGVkRGVsdGE7IGFkZGVkRGVsdGEgPSAwOyB9XHJcblx0XHRcdFx0XHRwb3NYID0gcG9zWCArIGRlbHRhO1xyXG5cdFx0XHRcdFx0aWYgKGRlbHRhID4gMCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgbmV4dCA9IHBvc1g7XHJcblx0XHRcdFx0XHRcdGZvciAodmFyIHggaW4gdmFsdWUuc3BvdHMpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodmFsdWUuc3BvdHNbeF0gPj0gcG9zWCkgeyBuZXh0ID0gdmFsdWUuc3BvdHNbeF07IGJyZWFrOyB9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKG5leHQgLSBtYWduZXRpY0Rpc3RhbmNlIDwgcG9zWCkgeyBwb3NYID0gbmV4dDsgaXNNYWduZXRpYyA9IHRydWU7IH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChkZWx0YSA8IDApIHtcclxuXHRcdFx0XHRcdFx0dmFyIHByZXZpb3VzID0gdmFsdWUuc3BvdHNbMF07XHJcblx0XHRcdFx0XHRcdGZvciAodmFyIHggaW4gdmFsdWUuc3BvdHMpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodmFsdWUuc3BvdHNbeF0gPj0gcG9zWCkgeyBicmVhazsgfVxyXG5cdFx0XHRcdFx0XHRcdHByZXZpb3VzID0gdmFsdWUuc3BvdHNbeF07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKHByZXZpb3VzICsgbWFnbmV0aWNEaXN0YW5jZSA+IHBvc1gpIHsgcG9zWCA9IHByZXZpb3VzOyBpc01hZ25ldGljID0gdHJ1ZTsgfVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKHBvc1ggPCBtaW5pbXVtKSB7IHBvc1ggPSBtaW5pbXVtOyB9XHJcblx0XHRcdFx0XHRpZiAocG9zWCA+IG1heGltdW0pIHsgcG9zWCA9IG1heGltdW07IH1cclxuXHRcdFx0XHRcdGZvdlRvcFNsaWRlci5jc3MoJ2xlZnQnLCBzKDU0ICsgMjgxKSArIHBvc1ggKyAncHgnKTtcclxuXHRcdFx0XHRcdC8vIGZvdlRvcFRleHQuaHRtbChgPGJyLz4ke2FwcC5pRnRGKChwb3NYICogNjIwIC8gY29udFdpZHRoKSAvIHZhbHVlLnBwbSkudG9GaXhlZCgyKX0gJHthcHAudW5pdFN5bWJvbCgpfWApO1xyXG5cdFx0XHRcdFx0Ly8gaWYgKHBvc1ggPCAzMDApIHtcclxuXHRcdFx0XHRcdC8vIFx0Zm92VG9wVGV4dC5jc3MoJ2xlZnQnLCAocyg1NCArIDI4MSkgKyBwb3NYKSArICdweCcpO1xyXG5cdFx0XHRcdFx0Ly8gfSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIFx0Zm92VG9wVGV4dC5jc3MoJ2xlZnQnLCAocyg1NCArIDI4MSkgKyAzMDApICsgJ3B4Jyk7XHJcblx0XHRcdFx0XHQvLyB9XHJcblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSAocG9zWCAqIDYyMCAvIGNvbnRXaWR0aCkgLyB2YWx1ZS5wcG07XHJcblx0XHRcdFx0XHRzZXRUZXh0KGRpc3RhbmNlKTtcclxuXHJcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQoZGVuc2l0eVRpbWVyKTtcclxuXHRcdFx0XHRcdGRlbnNpdHlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHR2YXIgZGVuc2l0eSA9IHBhbm9EZW5zaXR5QXQodmFsdWUucmVzdWx0LmVsZXZhdGlvbiwgdmFsdWUucmVzdWx0LmExLCB2YWx1ZS5yZXN1bHQuYTMsIHZhbHVlLnJlc3VsdC5hNSwgdmFsdWUucmVzdWx0LnBpeGVsX3NpemUsIGRpc3RhbmNlKTtcclxuXHRcdFx0XHRcdFx0JCgnLnZpc3VhbE91dHB1dENvbnQubGVuc2NhbGMgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRmZGKGRlbnNpdHkpLnRvRml4ZWQoMikgKyAnIHBwJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0XHQkKCcudmlzdWFsT3V0cHV0Q29udC5jYW1lcmEgLnZpc3VhbE91dFJvdzpudGgtY2hpbGQoMikgc3BhbjpudGgtY2hpbGQoMiknKS50ZXh0KGFwcC5pRmZGKGRlbnNpdHkpLnRvRml4ZWQoMikgKyAnIHBwJyArIGFwcC51bml0U3ltYm9sKCkpO1xyXG5cdFx0XHRcdFx0fSwgMzAwKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHR2YXIgZGVuc2l0eVRpbWVyO1xyXG5cclxuXHRcdFx0XHQkKGRvY3VtZW50KS5vbignbW91c2V1cCB0b3VjaGVuZCcsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdCQoZG9jdW1lbnQpLm9mZignbW91c2Vtb3ZlIHRvdWNobW92ZScpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9KTtcclxufSIsImNvbnN0IENPTE9SX0RPUklfRCA9IDB4MDA1NjkxO1xyXG5jb25zdCBDT0xPUl9ET1JJX08gPSAweDEyNzJBQTtcclxuY29uc3QgQ09MT1JfRE9SSV9SID0gMHgyQjhGQzM7XHJcbmNvbnN0IENPTE9SX0RPUklfSSA9IDB4M0VBQURCO1xyXG5cclxuY29uc3QgQ09MT1JfRk9WID0gMHgzRUFBREI7XHJcbmNvbnN0IENPTE9SX09VVEZPViA9IDB4REI1QzY4O1xyXG5jb25zdCBDT0xPUl9TVVBQT1JUX0xJTkVTID0gMHhCNUI1Qjc7XHJcbmNvbnN0IEhVTUFOX0hFSUdIVCA9IDEuNyxcclxuICAgIEhVTUFOX1dJRFRIID0gMC41O1xyXG5cclxuZnVuY3Rpb24gcmFkVG9EZWcobnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbnVtYmVyICogMTgwIC8gTWF0aC5QSTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVnVG9SYWQobnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbnVtYmVyICogTWF0aC5QSSAvIDE4MDtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2Tm9ucGFub1RvcCgkZWxlbWVudCwgcmVzdWx0KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHQpO1xyXG5cclxuICAgICQoXCIuc2F2ZXByaW50XCIpLnNob3coKTtcclxuICAgICQoXCIucmVzdWx0c1wiKS5zaG93KCk7XHJcbiAgICAkZWxlbWVudC5maW5kKCcuY2FudmFzTWVzc2FnZXMnKS5yZW1vdmUoKTtcclxuICAgIGZ1bmN0aW9uIGVycm9yTWVzc2FnZSgpIHtcclxuICAgICAgICBjb250YWluZXIuaHRtbCgnJyk7XHJcbiAgICAgICAgJCgnPHNwYW4+VGhlIHZhbHVlcyB5b3UgaGF2ZSBjaG9zZW4gYXJlPGJyLz48dWw+PGxpPmJlbG93IG9yIGFib3ZlIGxpbWl0cyB0aGF0IGNhbiBiZSByZW5kZXJlZCBmb3IgZGlzcGxheTwvbGk+PGxpPm5vdCBhIHZhbGlkIGNvbWJpbmF0aW9uLjwvbGk+PC91bD48L3NwYW4+JykuY3NzKHtcclxuICAgICAgICAgICAgJ3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuICAgICAgICAgICAgJ3RvcCc6ICc1MCUnLFxyXG4gICAgICAgICAgICAnbGVmdCc6ICc1MCUnLFxyXG4gICAgICAgICAgICAnZGlzcGxheSc6ICdpbmxpbmUtYmxvY2snLFxyXG4gICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHZhRXJyb3IoKSB7XHJcbiAgICAgICAgY29udGFpbmVyLmh0bWwoJycpO1xyXG4gICAgICAgICQoJzxzcGFuPicgKyBhcHAubGwoJ3ZpZGVvQW5hbHl0aWNzRXJyb3InKSArICc8L3NwYW4+JykuY3NzKHtcclxuICAgICAgICAgICAgJ3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuICAgICAgICAgICAgJ3RvcCc6ICc1MCUnLFxyXG4gICAgICAgICAgICAnbGVmdCc6ICc1MCUnLFxyXG4gICAgICAgICAgICAnZGlzcGxheSc6ICdpbmxpbmUtYmxvY2snLFxyXG4gICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBjb250YWluZXIgPSAkZWxlbWVudDtcclxuICAgIGNvbnRhaW5lci5odG1sKCcnKTtcclxuICAgIGNvbnRhaW5lci5jc3MoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcbiAgICBjb250YWluZXIuY3NzKCdoZWlnaHQnLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSArICdweCcpO1xyXG5cclxuICAgIHZhciByZW5kZXJlciA9IG5ldyBQSVhJLkNhbnZhc1JlbmRlcmVyKGNvbnRhaW5lci53aWR0aCgpLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSwgeyBhbnRpYWxpYXM6IHRydWUsIGJhY2tncm91bmRDb2xvcjogMHhlNmU2ZTgsIHJvdW5kUGl4ZWxzOiB0cnVlLCBmb3JjZUZYQUE6IHRydWUgfSk7XHJcbiAgICB3aW5kb3cucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuICAgIGNvbnRhaW5lci5hcHBlbmQocmVuZGVyZXIudmlldyk7XHJcblxyXG4gICAgcmVuZGVyZXIuYXV0b3Jlc2l6ZSA9IHRydWU7XHJcbiAgICByZW5kZXJlci5yZXNpemUoY29udGFpbmVyLndpZHRoKCksIGNvbnRhaW5lci53aWR0aCgpICogMC40ODI5KTtcclxuXHJcbiAgICB2YXIgc3RhZ2UgPSBuZXcgUElYSS5Db250YWluZXIoKTtcclxuICAgIHZhciBzY2FsYWJsZUNvbnQgPSBuZXcgUElYSS5Db250YWluZXIoKTtcclxuXHJcbiAgICBjb25zdCBsb2FkZXIgPSBQSVhJLmxvYWRlcjtcclxuICAgIHJlbmRlcigpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJlbmRlcigpIHtcclxuICAgICAgICBmdW5jdGlvbiBzKHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLndpZHRoIC8gNjIwICogdjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ0FOVkFTIEdyYXBoaWMgU2l6ZSA1NjYgeCAxNzVcclxuICAgICAgICAvLyBERVNJUkVEIFNJWkUgNTUwIHggMTc1XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ3ZpX2FuJyAmJiBpc05hTihyZXN1bHQudmFfZG1heF9ncm91bmQpKSB7IHZhRXJyb3IoKTsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQuZG1pbiA+IHJlc3VsdC5wX2dyb3VuZF9tYXgpIHsgZXJyb3JNZXNzYWdlKCk7IHJldHVybjsgfVxyXG4gICAgICAgIGlmIChyZXN1bHQuZWxldmF0aW9uIDw9IDIpIHsgZXJyb3JNZXNzYWdlKCk7IHJldHVybjsgfVxyXG5cclxuICAgICAgICB2YXIgcHBtQ2FudmFzO1xyXG4gICAgICAgIHZhciBrYW1lcmFQUE0gPSAxNzUgLyByZXN1bHQuZWxldmF0aW9uO1xyXG4gICAgICAgIHZhciBkX2RvcmlfZFBQTTtcclxuICAgICAgICBkX2RvcmlfZFBQTSA9IDU1MCAvIHJlc3VsdC5kb3JpX2dyb3VuZF9tYXg7XHJcbiAgICAgICAgdmFyIGRtYXhQUE0gPSA1NTAgLyByZXN1bHQuZG1heDtcclxuXHJcbiAgICAgICAgdmFyIHN0YXJ0ID0gcmVzdWx0LnRpbHQgLSAocmVzdWx0LmZvdl92ZXIgKiAwLjUpO1xyXG4gICAgICAgIHZhciBlbmQgPSByZXN1bHQudGlsdCArIChyZXN1bHQuZm92X3ZlciAqIDAuNSk7XHJcbiAgICAgICAgdmFyIG1hc2tTZWxlY3RvciA9IDA7XHJcbiAgICAgICAgdmFyIGRpc3BsYXlNYXhXaWR0aDtcclxuICAgICAgICBpZiAoc3RhcnQgPD0gMCkge1xyXG4gICAgICAgICAgICBpZiAoZW5kIDw9IDApIHsgZXJyb3JNZXNzYWdlKCk7IHJldHVybjsgfVxyXG4gICAgICAgICAgICBwcG1DYW52YXMgPSBkX2RvcmlfZFBQTTtcclxuICAgICAgICAgICAgZGlzcGxheU1heFdpZHRoID0gcmVzdWx0LmRfZG9yaV9kO1xyXG4gICAgICAgICAgICBtYXNrU2VsZWN0b3IgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnRoZXJtYWwpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWF4IDwgcmVzdWx0LmRfZHJpX2QpIHtcclxuICAgICAgICAgICAgICAgIHBwbUNhbnZhcyA9IGRtYXhQUE1cclxuICAgICAgICAgICAgICAgIGRpc3BsYXlNYXhXaWR0aCA9IHJlc3VsdC5kbWF4O1xyXG4gICAgICAgICAgICAgICAgbWFza1NlbGVjdG9yID0gMTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBwbUNhbnZhcyA9IGRfZG9yaV9kUFBNO1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheU1heFdpZHRoID0gcmVzdWx0LmRfZG9yaV9kO1xyXG4gICAgICAgICAgICAgICAgbWFza1NlbGVjdG9yID0gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG1heCA8IHJlc3VsdC5kX2RvcmlfZCkge1xyXG4gICAgICAgICAgICAgICAgcHBtQ2FudmFzID0gZG1heFBQTVxyXG4gICAgICAgICAgICAgICAgZGlzcGxheU1heFdpZHRoID0gcmVzdWx0LmRtYXg7XHJcbiAgICAgICAgICAgICAgICBtYXNrU2VsZWN0b3IgPSAxO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHBtQ2FudmFzID0gZF9kb3JpX2RQUE07XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TWF4V2lkdGggPSByZXN1bHQuZF9kb3JpX2Q7XHJcbiAgICAgICAgICAgICAgICBtYXNrU2VsZWN0b3IgPSAyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ3ZpX2FuJyAmJiByZXN1bHQudmFfZG1heCkge1xyXG4gICAgICAgICAgICBwcG1DYW52YXMgPSA1NTAgLyByZXN1bHQudmFfZnVsbERpc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzdWx0LnZpZXcgPT09ICdjYW1lcmEnKSB7XHJcbiAgICAgICAgICAgIHBwbUNhbnZhcyA9IDU1MCAvIHJlc3VsdC5pbGx1X2Z1bGxEaXN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBrYW1lcmFDYW52YXNZID0gMjU2IC0gcmVzdWx0LmVsZXZhdGlvbiAqIHBwbUNhbnZhcztcclxuXHJcbiAgICAgICAgaWYgKGthbWVyYUNhbnZhc1kgPD0gODIpIHtcclxuICAgICAgICAgICAga2FtZXJhQ2FudmFzWSA9IDgyO1xyXG4gICAgICAgICAgICBwcG1DYW52YXMgPSBrYW1lcmFQUE07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0LnZpZXcgPT09ICdkb3JpJykge1xyXG4gICAgICAgICAgICBhcHAuZW1pdCgncHBtQ2hhbmdlU2lkZScsIHsgc3BvdHM6IFtyZXN1bHQuZG1pbiwgcmVzdWx0LnBfZ3JvdW5kX21heCwgcmVzdWx0LmRfZG9yaV9pX2dyb3VuZCwgcmVzdWx0LmRfZG9yaV9yX2dyb3VuZCwgcmVzdWx0LmRfZG9yaV9vX2dyb3VuZCwgcmVzdWx0LmRfZG9yaV9kX2dyb3VuZCwgcmVzdWx0LmRvcmlfZ3JvdW5kX21heF0sIHR5cGU6ICdub25wYW5vJywgcmVzX2hvcjogcmVzdWx0LnJlc19ob3IsIHBwbTogcHBtQ2FudmFzLCBlbGV2YXRpb246IHJlc3VsdC5lbGV2YXRpb24sIGZvdl92ZXI6IHJlc3VsdC5mb3ZfdmVyLCB0aWx0OiByZXN1bHQudGlsdCwgZm92X2hvcjogcmVzdWx0LmZvdl9ob3IsIG1pbjogcmVzdWx0LmRtaW4sIG1heDogcmVzdWx0LmRvcmlfZ3JvdW5kX21heCwgY29udGFpbmVyOiBjb250YWluZXIsIHN0YXJ0dmFsdWU6IHJlc3VsdC5wX2dyb3VuZF9tYXggfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQudmlldyA9PT0gJ2NhbWVyYScpIHtcclxuICAgICAgICAgICAgYXBwLmVtaXQoJ3BwbUNoYW5nZVNpZGUnLCB7IHNwb3RzOiBbcmVzdWx0LmRtaW4sIHJlc3VsdC5wX2dyb3VuZF9tYXgsIHJlc3VsdC5pbGx1X3JhbmdlX2dyb3VuZCwgcmVzdWx0LmlsbHVfZnVsbERpc3RhbmNlXSwgdHlwZTogJ25vbnBhbm8nLCByZXNfaG9yOiByZXN1bHQucmVzX2hvciwgcHBtOiBwcG1DYW52YXMsIGVsZXZhdGlvbjogcmVzdWx0LmVsZXZhdGlvbiwgZm92X3ZlcjogcmVzdWx0LmZvdl92ZXIsIHRpbHQ6IHJlc3VsdC50aWx0LCBmb3ZfaG9yOiByZXN1bHQuZm92X2hvciwgbWluOiByZXN1bHQuZG1pbiwgbWF4OiByZXN1bHQuaWxsdV9mdWxsRGlzdGFuY2UsIGNvbnRhaW5lcjogY29udGFpbmVyLCBzdGFydHZhbHVlOiByZXN1bHQucF9ncm91bmRfbWF4IH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnZhX2RtYXggPiByZXN1bHQudmFfZG1pbikge1xyXG4gICAgICAgICAgICBhcHAuZW1pdCgncHBtQ2hhbmdlU2lkZScsIHsgc3BvdHM6IFtyZXN1bHQudmFfZG1pbl9ncm91bmQsIHJlc3VsdC52YV9kbWF4X2dyb3VuZCwgcmVzdWx0LnZhX2Z1bGxEaXN0YW5jZV0sIHR5cGU6ICdub25wYW5vJywgcmVzX2hvcjogcmVzdWx0LnJlc19ob3IsIHBwbTogcHBtQ2FudmFzLCBlbGV2YXRpb246IHJlc3VsdC5lbGV2YXRpb24sIGZvdl92ZXI6IHJlc3VsdC5mb3ZfdmVyLCB0aWx0OiByZXN1bHQudGlsdCwgZm92X2hvcjogcmVzdWx0LmZvdl9ob3IsIG1pbjogcmVzdWx0LnZhX2RtaW5fZ3JvdW5kLCBtYXg6IHJlc3VsdC52YV9mdWxsRGlzdGFuY2UsIGNvbnRhaW5lcjogY29udGFpbmVyLCBzdGFydHZhbHVlOiByZXN1bHQucF9ncm91bmRfbWF4IH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFwcC5lbWl0KCdwcG1DaGFuZ2VTaWRlJywgeyBzcG90czogWzBdLCB0eXBlOiAnbm9ucGFubycsIHJlc19ob3I6IHJlc3VsdC5yZXNfaG9yLCBwcG06IHBwbUNhbnZhcywgZWxldmF0aW9uOiByZXN1bHQuZWxldmF0aW9uLCBmb3ZfdmVyOiByZXN1bHQuZm92X3ZlciwgdGlsdDogcmVzdWx0LnRpbHQsIGZvdl9ob3I6IHJlc3VsdC5mb3ZfaG9yLCBtYXg6IDAsIGNvbnRhaW5lcjogY29udGFpbmVyIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC5kbWF4IDwgMCkge1xyXG4gICAgICAgICAgICB2YXIgZG1heEdyYXBoaWMgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgICAgICBkbWF4R3JhcGhpYy5iZWdpbkZpbGwoQ09MT1JfT1VURk9WKTtcclxuICAgICAgICAgICAgZG1heEdyYXBoaWMuZHJhd1BvbHlnb24oXHJcbiAgICAgICAgICAgICAgICBzKDU0KSwgcyhrYW1lcmFDYW52YXNZKSxcclxuICAgICAgICAgICAgICAgIHMoNTQgKyAoKDE3NSAtIHJlc3VsdC5lbGV2YXRpb24gKiBwcG1DYW52YXMpICogTWF0aC50YW4oZGVnVG9SYWQoOTAgKyArcmVzdWx0LnRpbHQgLSArcmVzdWx0LmZvdl92ZXIgKiAwLjUpKSkpLCBzKDgyKSxcclxuICAgICAgICAgICAgICAgIHMoNTY2ICsgNTQpLCBzKDgyKSxcclxuICAgICAgICAgICAgICAgIHMoNTY2ICsgNTQpLCBzKDI1NiksXHJcbiAgICAgICAgICAgICAgICBzKDU0KSwgcygyNTYpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGRtYXhHcmFwaGljLmVuZEZpbGwoKTtcclxuICAgICAgICAgICAgc2NhbGFibGVDb250LmFkZENoaWxkKGRtYXhHcmFwaGljKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgZG1heEdyYXBoaWMgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgICAgICBkbWF4R3JhcGhpYy5iZWdpbkZpbGwoQ09MT1JfT1VURk9WKTtcclxuICAgICAgICAgICAgZG1heEdyYXBoaWMuZHJhd1BvbHlnb24oXHJcbiAgICAgICAgICAgICAgICBzKDU0KSwgcyhrYW1lcmFDYW52YXNZKSxcclxuICAgICAgICAgICAgICAgIHMocmVzdWx0LmRtYXggKiBwcG1DYW52YXMgKyA1NCksIHMoMjU2KSxcclxuICAgICAgICAgICAgICAgIHMoNTQpLCBzKDI1NilcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgZG1heEdyYXBoaWMuZW5kRmlsbCgpO1xyXG4gICAgICAgICAgICBzY2FsYWJsZUNvbnQuYWRkQ2hpbGQoZG1heEdyYXBoaWMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGNpcmNsZU1hc2sgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgIGNpcmNsZU1hc2suYmVnaW5GaWxsKDB4MDAwMDAwKTtcclxuICAgICAgICBpZiAobWFza1NlbGVjdG9yID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNpcmNsZU1hc2suZHJhd1BvbHlnb24oXHJcbiAgICAgICAgICAgICAgICBzKDU0KSwgcyhrYW1lcmFDYW52YXNZKSxcclxuICAgICAgICAgICAgICAgIHMoNTQgKyAoKDE3NSAtIHJlc3VsdC5lbGV2YXRpb24gKiBwcG1DYW52YXMpICogTWF0aC50YW4oZGVnVG9SYWQoOTAgKyArcmVzdWx0LnRpbHQgLSArcmVzdWx0LmZvdl92ZXIgKiAwLjUpKSkpLCBzKDgyKSxcclxuICAgICAgICAgICAgICAgIHMoNTY2ICsgNTQpLCBzKDgyKSxcclxuICAgICAgICAgICAgICAgIHMoNTY2ICsgNTQpLCBzKDI1NiksXHJcbiAgICAgICAgICAgICAgICBzKHJlc3VsdC5kbWluICogcHBtQ2FudmFzICsgNTQpLCBzKDI1NilcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1hc2tTZWxlY3RvciA9PT0gMSkge1xyXG4gICAgICAgICAgICBjaXJjbGVNYXNrLmRyYXdQb2x5Z29uKFxyXG4gICAgICAgICAgICAgICAgcyg1NCksIHMoa2FtZXJhQ2FudmFzWSksXHJcbiAgICAgICAgICAgICAgICBzKHJlc3VsdC5kbWF4ICogcHBtQ2FudmFzICsgNTQpLCBzKDI1NiksXHJcbiAgICAgICAgICAgICAgICBzKHJlc3VsdC5kbWluICogcHBtQ2FudmFzICsgNTQpLCBzKDI1NilcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG1hc2tTZWxlY3RvciA9PT0gMikge1xyXG4gICAgICAgICAgICBjaXJjbGVNYXNrLmRyYXdQb2x5Z29uKFxyXG4gICAgICAgICAgICAgICAgcyg1NCksIHMoa2FtZXJhQ2FudmFzWSksXHJcbiAgICAgICAgICAgICAgICBzKHJlc3VsdC5kbWF4ICogcHBtQ2FudmFzICsgNTQpLCBzKDI1NiksXHJcbiAgICAgICAgICAgICAgICBzKHJlc3VsdC5kbWluICogcHBtQ2FudmFzICsgNTQpLCBzKDI1NilcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2lyY2xlTWFzay5lbmRGaWxsKCk7XHJcbiAgICAgICAgc2NhbGFibGVDb250LmFkZENoaWxkKGNpcmNsZU1hc2spO1xyXG4gICAgICAgIGlmIChyZXN1bHQudmlldyAhPT0gJ3ZpX2FuJykge1xyXG4gICAgICAgICAgICBjcmVhdGVET1JJKGNpcmNsZU1hc2spO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC52aWV3ID09PSAndmlfYW4nKSB7XHJcbiAgICAgICAgICAgIHZhciBjaXJjbGUgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgICAgICBjaXJjbGUuYmVnaW5GaWxsKENPTE9SX0RPUklfSSk7XHJcbiAgICAgICAgICAgIGNpcmNsZS5saW5lU3R5bGUoMCk7XHJcbiAgICAgICAgICAgIGNpcmNsZS5kcmF3Q2lyY2xlKHMoNTQpLCBzKGthbWVyYUNhbnZhc1kpLCBzKHJlc3VsdC52YV9kbWF4X2dyb3VuZCAqIHBwbUNhbnZhcykpO1xyXG4gICAgICAgICAgICBjaXJjbGUuZW5kRmlsbCgpO1xyXG4gICAgICAgICAgICBjaXJjbGUubWFzayA9IGNpcmNsZU1hc2s7XHJcbiAgICAgICAgICAgIHNjYWxhYmxlQ29udC5hZGRDaGlsZChjaXJjbGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHNpZGVXYWxsID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuICAgICAgICBzaWRlV2FsbC5iZWdpbkZpbGwoMHgwMDAwMDApO1xyXG4gICAgICAgIHNpZGVXYWxsLmRyYXdSZWN0KHMoNTQpLCBzKGthbWVyYUNhbnZhc1kpLCBzKDEpLCBzKDI1NiAtIGthbWVyYUNhbnZhc1kpKTtcclxuICAgICAgICBzY2FsYWJsZUNvbnQuYWRkQ2hpbGQoc2lkZVdhbGwpO1xyXG5cclxuICAgICAgICB2YXIgYm90dG9tV2FsbCA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcbiAgICAgICAgYm90dG9tV2FsbC5iZWdpbkZpbGwoMHgwMDAwMDApO1xyXG4gICAgICAgIGJvdHRvbVdhbGwuZHJhd1JlY3Qocyg1NCksIHMoMjU2KSwgcyg1NjYpLCBzKDEpKTtcclxuICAgICAgICBzdGFnZS5hZGRDaGlsZChib3R0b21XYWxsKTtcclxuXHJcbiAgICAgICAgdmFyIGJvdHRvbWxpbmUxID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuICAgICAgICBib3R0b21saW5lMS5iZWdpbkZpbGwoQ09MT1JfU1VQUE9SVF9MSU5FUyk7XHJcbiAgICAgICAgYm90dG9tbGluZTEuZHJhd1JlY3Qocyg1NCksIHMoMjY0KSwgcygxKSwgcygxNCkpO1xyXG4gICAgICAgIHN0YWdlLmFkZENoaWxkKGJvdHRvbWxpbmUxKTtcclxuXHJcbiAgICAgICAgdmFyIGJvdHRvbWxpbmUzID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuICAgICAgICBib3R0b21saW5lMy5iZWdpbkZpbGwoQ09MT1JfU1VQUE9SVF9MSU5FUyk7XHJcbiAgICAgICAgYm90dG9tbGluZTMuZHJhd1JlY3Qocyg1NCksIHMoMjc3KSwgcyg1NjYpLCBzKDEpKTtcclxuICAgICAgICBzdGFnZS5hZGRDaGlsZChib3R0b21saW5lMyk7XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ3ZpX2FuJykge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnZhX2RtYXggPD0gcmVzdWx0LnZhX2RtaW4pIHsgdmFFcnJvcigpOyByZXR1cm47IH1cclxuICAgICAgICAgICAgLy8gaWYgKHJlc3VsdC52YV9kbWluID49IHJlc3VsdC5kbWF4cCkgeyB2YUVycm9yKCk7IHJldHVybjsgfVxyXG4gICAgICAgICAgICB2YXIgdmFNYXNrID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuICAgICAgICAgICAgdmFNYXNrLmJlZ2luRmlsbCgweDAwMDAwMCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobWFza1NlbGVjdG9yID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YU1hc2suZHJhd1BvbHlnb24oXHJcbiAgICAgICAgICAgICAgICAgICAgcyg1NCksIHMoa2FtZXJhQ2FudmFzWSksXHJcbiAgICAgICAgICAgICAgICAgICAgcyg1NCArICgoMTc1IC0gcmVzdWx0LmVsZXZhdGlvbiAqIHBwbUNhbnZhcykgKiBNYXRoLnRhbihkZWdUb1JhZCg5MCArICtyZXN1bHQudGlsdCAtICtyZXN1bHQuZm92X3ZlciAqIDAuNSkpKSksIHMoODIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHMoNTY2ICsgNTQpLCBzKDgyKSxcclxuICAgICAgICAgICAgICAgICAgICBzKDU2NiArIDU0KSwgcygyNTYpLFxyXG4gICAgICAgICAgICAgICAgICAgIHMocmVzdWx0LmRtaW4gKiBwcG1DYW52YXMgKyA1NCksIHMoMjU2KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWFza1NlbGVjdG9yID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB2YU1hc2suZHJhd1BvbHlnb24oXHJcbiAgICAgICAgICAgICAgICAgICAgcyg1NCksIHMoa2FtZXJhQ2FudmFzWSksXHJcbiAgICAgICAgICAgICAgICAgICAgcyhyZXN1bHQuZG1heCAqIHBwbUNhbnZhcyArIDU0KSwgcygyNTYpLFxyXG4gICAgICAgICAgICAgICAgICAgIHMocmVzdWx0LmRtaW4gKiBwcG1DYW52YXMgKyA1NCksIHMoMjU2KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWFza1NlbGVjdG9yID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICB2YU1hc2suZHJhd1BvbHlnb24oXHJcbiAgICAgICAgICAgICAgICAgICAgcyg1NCksIHMoa2FtZXJhQ2FudmFzWSksXHJcbiAgICAgICAgICAgICAgICAgICAgcyhyZXN1bHQuZG1heCAqIHBwbUNhbnZhcyArIDU0KSwgcygyNTYpLFxyXG4gICAgICAgICAgICAgICAgICAgIHMocmVzdWx0LmRtaW4gKiBwcG1DYW52YXMgKyA1NCksIHMoMjU2KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFNYXNrLmVuZEZpbGwoKTtcclxuICAgICAgICAgICAgc2NhbGFibGVDb250LmFkZENoaWxkKHZhTWFzayk7XHJcblxyXG4gICAgICAgICAgICB2YXIgY2lyY2xlID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuICAgICAgICAgICAgY2lyY2xlLmJlZ2luRmlsbChDT0xPUl9PVVRGT1YpO1xyXG4gICAgICAgICAgICBjaXJjbGUuYWxwaGEgPSAxO1xyXG4gICAgICAgICAgICBjaXJjbGUubGluZVN0eWxlKDApO1xyXG4gICAgICAgICAgICBjaXJjbGUuZHJhd0NpcmNsZShzKDU0KSwgcyhrYW1lcmFDYW52YXNZKSwgcyhyZXN1bHQudmFfZG1pbiAqIHBwbUNhbnZhcykpO1xyXG4gICAgICAgICAgICBjaXJjbGUuZW5kRmlsbCgpO1xyXG4gICAgICAgICAgICBjaXJjbGUubWFzayA9IHZhTWFzaztcclxuICAgICAgICAgICAgc2NhbGFibGVDb250LmFkZENoaWxkKGNpcmNsZSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgdmFfY2lyY2xlID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuICAgICAgICAgICAgdmFfY2lyY2xlLmJlZ2luRmlsbCgweDAwMDAwMCwgMCk7XHJcbiAgICAgICAgICAgIHZhX2NpcmNsZS5saW5lU3R5bGUocygocmVzdWx0LnZhX2RtYXhfZ3JvdW5kIC0gcmVzdWx0LnZhX2RtaW4pICogcHBtQ2FudmFzKSwgQ09MT1JfRE9SSV9JLCAxKTtcclxuICAgICAgICAgICAgdmFfY2lyY2xlLmRyYXdDaXJjbGUocyg1NCksIHMoa2FtZXJhQ2FudmFzWSksIHMoKHJlc3VsdC52YV9kbWluICsgcmVzdWx0LnZhX2RtYXhfZ3JvdW5kKSAqIC41ICogcHBtQ2FudmFzKSk7XHJcbiAgICAgICAgICAgIHZhX2NpcmNsZS5lbmRGaWxsKCk7XHJcbiAgICAgICAgICAgIHZhX2NpcmNsZS5tYXNrID0gdmFNYXNrO1xyXG4gICAgICAgICAgICBzY2FsYWJsZUNvbnQuYWRkQ2hpbGQodmFfY2lyY2xlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIChyZXN1bHQuZG1heCA+IDAgJiYgKChyZXN1bHQudGhlcm1hbCAmJiByZXN1bHQuZG1heCA8IHJlc3VsdC5kX2RyaV9kKSB8fCAoIXJlc3VsdC50aGVybWFsICYmIHJlc3VsdC5kbWF4IDwgcmVzdWx0LmRfZG9yaV9kKSkgJiYgcmVzdWx0LnZpZXcgPT09ICdkb3JpJykge1xyXG4gICAgICAgIC8vICAgICB2YXIgY3V0T3V0ID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuICAgICAgICAvLyAgICAgY3V0T3V0LmJlZ2luRmlsbChDT0xPUl9PVVRGT1YpO1xyXG4gICAgICAgIC8vICAgICBjdXRPdXQuZHJhd1BvbHlnb24oXHJcbiAgICAgICAgLy8gICAgICAgICBzKDU0ICsgcmVzdWx0LmRtYXhwICogcHBtQ2FudmFzKSwgcygyNTYgLSBIVU1BTl9IRUlHSFQgKiBwcG1DYW52YXMpLFxyXG4gICAgICAgIC8vICAgICAgICAgcyg1NCArIHJlc3VsdC5kbWF4ICogcHBtQ2FudmFzKSwgcygyNTYpLFxyXG4gICAgICAgIC8vICAgICAgICAgcyg1NCArIHJlc3VsdC5kbWF4cCAqIHBwbUNhbnZhcyksIHMoMjU2KVxyXG4gICAgICAgIC8vICAgICApO1xyXG4gICAgICAgIC8vICAgICBjdXRPdXQuZW5kRmlsbCgpO1xyXG4gICAgICAgIC8vICAgICBzdGFnZS5hZGRDaGlsZChjdXRPdXQpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC52aWV3ID09PSAnZG9yaScgJiYgcmVzdWx0LmRvcmlfZ3JvdW5kX21heCA+IDEwMCkge1xyXG4gICAgICAgICAgICBzY2FsYWJsZUNvbnQuc2V0VHJhbnNmb3JtKDAsIDAsIDEsIDEyMCAvIChyZXN1bHQuZWxldmF0aW9uICogcHBtQ2FudmFzKSwgMCwgMCwgMCwgcyg1NCksIHMoMjU2KSk7XHJcbiAgICAgICAgICAgIHNjYWxhYmxlQ29udC5wb3NpdGlvbiA9IG5ldyBQSVhJLlBvaW50KHMoNTQpLCBzKDI1NikpO1xyXG4gICAgICAgICAgICBzY2FsZWRZTWVzc2FnZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzdWx0LnZpZXcgPT09ICd2aV9hbicgJiYgcmVzdWx0LnZhX2Z1bGxEaXN0YW5jZSA+IDEwMCkge1xyXG4gICAgICAgICAgICBzY2FsYWJsZUNvbnQuc2V0VHJhbnNmb3JtKDAsIDAsIDEsIDEyMCAvIChyZXN1bHQuZWxldmF0aW9uICogcHBtQ2FudmFzKSwgMCwgMCwgMCwgcyg1NCksIHMoMjU2KSk7XHJcbiAgICAgICAgICAgIHNjYWxhYmxlQ29udC5wb3NpdGlvbiA9IG5ldyBQSVhJLlBvaW50KHMoNTQpLCBzKDI1NikpO1xyXG4gICAgICAgICAgICBzY2FsZWRZTWVzc2FnZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzdWx0LnZpZXcgPT09ICdjYW1lcmEnICYmIHJlc3VsdC5pbGx1X2Z1bGxEaXN0YW5jZSA+IDEwMCkge1xyXG4gICAgICAgICAgICBzY2FsYWJsZUNvbnQuc2V0VHJhbnNmb3JtKDAsIDAsIDEsIDEyMCAvIChyZXN1bHQuZWxldmF0aW9uICogcHBtQ2FudmFzKSwgMCwgMCwgMCwgcyg1NCksIHMoMjU2KSk7XHJcbiAgICAgICAgICAgIHNjYWxhYmxlQ29udC5wb3NpdGlvbiA9IG5ldyBQSVhJLlBvaW50KHMoNTQpLCBzKDI1NikpO1xyXG4gICAgICAgICAgICBzY2FsZWRZTWVzc2FnZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdGFnZS5hZGRDaGlsZChzY2FsYWJsZUNvbnQpO1xyXG5cclxuICAgICAgICBpZiAoKHJlc3VsdC52aWV3ID09PSAnZG9yaScgJiYgcmVzdWx0LmRvcmlfZ3JvdW5kX21heCA8IDEwMCkgfHwgKHJlc3VsdC52aWV3ID09PSAndmlfYW4nICYmIHJlc3VsdC52YV9mdWxsRGlzdGFuY2UgPCAxMDApIHx8IChyZXN1bHQudmlldyA9PT0gJ2NhbWVyYScgJiYgcmVzdWx0LmlsbHVfZnVsbERpc3RhbmNlIDwgMTAwKSkge1xyXG4gICAgICAgICAgICB2YXIga2FtZXJhID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMua2FtZXJhLnRleHR1cmUpO1xyXG4gICAgICAgICAgICBrYW1lcmEuYW5jaG9yLnNldCgwLjgsIDAuNSk7XHJcbiAgICAgICAgICAgIGthbWVyYS5zY2FsZSA9IG5ldyBQSVhJLlBvaW50KC41MSwgLjUxKTtcclxuICAgICAgICAgICAga2FtZXJhLnggPSBzKDU1KTtcclxuICAgICAgICAgICAga2FtZXJhLnkgPSBzKGthbWVyYUNhbnZhc1kgKyAuOCk7XHJcbiAgICAgICAgICAgIGthbWVyYS5yb3RhdGlvbiA9IGRlZ1RvUmFkKHJlc3VsdC50aWx0KTtcclxuICAgICAgICAgICAgc2NhbGFibGVDb250LmFkZENoaWxkKGthbWVyYSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGthbWVyYSA9IG5ldyBQSVhJLlNwcml0ZShsb2FkZXIucmVzb3VyY2VzLmthbWVyYS50ZXh0dXJlKTtcclxuICAgICAgICAgICAga2FtZXJhLmFuY2hvci5zZXQoMC44LCAwLjUpO1xyXG4gICAgICAgICAgICBrYW1lcmEuc2NhbGUgPSBuZXcgUElYSS5Qb2ludCguNTEsIC41MSAvICgxMjAgLyAocmVzdWx0LmVsZXZhdGlvbiAqIHBwbUNhbnZhcykpKTtcclxuICAgICAgICAgICAga2FtZXJhLnggPSBzKDU1KTtcclxuICAgICAgICAgICAga2FtZXJhLnkgPSBzKGthbWVyYUNhbnZhc1kgKyAoLjggLyAoMTIwIC8gKHJlc3VsdC5lbGV2YXRpb24gKiBwcG1DYW52YXMpKSkpO1xyXG4gICAgICAgICAgICBzY2FsYWJsZUNvbnQuYWRkQ2hpbGQoa2FtZXJhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdmFyIGh1bWFuU2NhbGUgPSBIVU1BTl9IRUlHSFQgKiBwcG1DYW52YXMgLyAxMzYgKiAxLjAxO1xyXG4gICAgICAgIHZhciBodW1hblNjYWxlID0gSFVNQU5fSEVJR0hUICogcHBtQ2FudmFzIC8gMTM2ICogMS4wMTtcclxuICAgICAgICB2YXIgdGFyZ2V0T0hlaWdodCA9IGFwcC5jdXJyZW50LnRPSGVpZ2h0ICogcHBtQ2FudmFzIC8gMTM2ICogMS4wMTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhhcHAuY3VycmVudC50T0hlaWdodCwgaHVtYW5TY2FsZSwgdGFyZ2V0T0hlaWdodCk7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5kb3JpX2dyb3VuZF9tYXggPCAxMDApIHtcclxuICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBsb2FkZXIucmVzb3VyY2VzLm1hbi50ZXh0dXJlO1xyXG4gICAgICAgICAgICBpZiAoYXBwLmN1cnJlbnQudmEudHlwZSA9PSBcIklWQSBQcm8gVHJhZmZpY1wiKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0dXJlID0gbG9hZGVyLnJlc291cmNlcy5jYXIudGV4dHVyZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoISQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvblBlcmltZXRlclVwcmlnaHQnKS5oYXNDbGFzcygnaG9sbG93JykpIHsgdGV4dHVyZSA9IGxvYWRlci5yZXNvdXJjZXMubWFuX3VwcmlnaHQudGV4dHVyZTsgfVxyXG4gICAgICAgICAgICBpZiAoISQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvblBlcmltZXRlckNyYXdsaW5nJykuaGFzQ2xhc3MoJ2hvbGxvdycpKSB7IHRleHR1cmUgPSBsb2FkZXIucmVzb3VyY2VzLm1hbl9jcmF3bGluZy50ZXh0dXJlOyB9XHJcbiAgICAgICAgICAgIGlmICghJCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uQnVpbGRpbmdzVXByaWdodCcpLmhhc0NsYXNzKCdob2xsb3cnKSkgeyB0ZXh0dXJlID0gbG9hZGVyLnJlc291cmNlcy5tYW5fdXByaWdodC50ZXh0dXJlOyB9XHJcbiAgICAgICAgICAgIGlmICghJCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uVHJhZmZpY1VwcmlnaHQnKS5oYXNDbGFzcygnaG9sbG93JykpIHsgdGV4dHVyZSA9IGxvYWRlci5yZXNvdXJjZXMubWFuX3VwcmlnaHQudGV4dHVyZTsgfVxyXG4gICAgICAgICAgICBpZiAoISQoJy5zZXR0aW5nc1RhcmdldEJ1dHRvbkJ1aWxkaW5nc0Zyb250YWwnKS5oYXNDbGFzcygnaG9sbG93JykpIHsgdGV4dHVyZSA9IGxvYWRlci5yZXNvdXJjZXMuY2FyLnRleHR1cmU7IH1cclxuICAgICAgICAgICAgaWYgKCEkKCcuc2V0dGluZ3NUYXJnZXRCdXR0b25QZXJpbWV0ZXJGcm9udGFsJykuaGFzQ2xhc3MoJ2hvbGxvdycpKSB7IHRleHR1cmUgPSBsb2FkZXIucmVzb3VyY2VzLmNhci50ZXh0dXJlOyB9XHJcbiAgICAgICAgICAgIGlmICghJCgnLnNldHRpbmdzVGFyZ2V0QnV0dG9uVHJhZmZpY0Zyb250YWwnKS5oYXNDbGFzcygnaG9sbG93JykpIHsgdGV4dHVyZSA9IGxvYWRlci5yZXNvdXJjZXMuY2FyLnRleHR1cmU7IH1cclxuICAgICAgICAgICAgaWYgKGFwcC5jdXJyZW50LnZhLnR5cGUgPT0gXCJJVkEgUHJvIFRyYWZmaWNcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52aWV3ID09ICd2aV9hbicpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FyID0gbmV3IFBJWEkuU3ByaXRlKHRleHR1cmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhci5hbmNob3Iuc2V0KDAuMDUsIDAuOTk1KTtcclxuICAgICAgICAgICAgICAgICAgICBjYXIuc2NhbGUgPSBuZXcgUElYSS5Qb2ludChzKHRhcmdldE9IZWlnaHQpLCBzKHRhcmdldE9IZWlnaHQpKTtcclxuICAgICAgICAgICAgICAgICAgICBjYXIueCA9IHMoNTQgKyAocmVzdWx0LnZhX2RtaW5fZ3JvdW5kICsgMC4yNSkgKiBwcG1DYW52YXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhci55ID0gcygyNTYpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YWdlLmFkZENoaWxkKGNhcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYXIgPSBuZXcgUElYSS5TcHJpdGUodGV4dHVyZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FyLmFuY2hvci5zZXQoMC4wNSwgMC45OTUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhci5zY2FsZSA9IG5ldyBQSVhJLlBvaW50KHModGFyZ2V0T0hlaWdodCksIHModGFyZ2V0T0hlaWdodCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhci54ID0gcyg1NCArIHJlc3VsdC5kbWluICogcHBtQ2FudmFzKTtcclxuICAgICAgICAgICAgICAgICAgICBjYXIueSA9IHMoMjU2KTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFnZS5hZGRDaGlsZChjYXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52aWV3ID09PSAndmlfYW4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNhcjIgPSBuZXcgUElYSS5TcHJpdGUodGV4dHVyZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FyMi5hbmNob3Iuc2V0KC45NSwgMC45OTI1KTtcclxuICAgICAgICAgICAgICAgICAgICBjYXIyLnNjYWxlID0gbmV3IFBJWEkuUG9pbnQocyh0YXJnZXRPSGVpZ2h0KSwgcyh0YXJnZXRPSGVpZ2h0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FyMi54ID0gcyg1NCArIChyZXN1bHQudmFfZG1heF9ncm91bmQgLSAwLjI1KSAqIHBwbUNhbnZhcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FyMi55ID0gcygyNTYpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YWdlLmFkZENoaWxkKGNhcjIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2FyMiA9IG5ldyBQSVhJLlNwcml0ZSh0ZXh0dXJlKTtcclxuICAgICAgICAgICAgICAgICAgICBjYXIyLmFuY2hvci5zZXQoLjk1LCAwLjk5MjUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcjIuc2NhbGUgPSBuZXcgUElYSS5Qb2ludChzKHRhcmdldE9IZWlnaHQpLCBzKHRhcmdldE9IZWlnaHQpKTtcclxuICAgICAgICAgICAgICAgICAgICBjYXIyLnggPSBzKDU0ICsgcmVzdWx0LnBfZ3JvdW5kX21heCAqIHBwbUNhbnZhcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FyMi55ID0gcygyNTYpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YWdlLmFkZENoaWxkKGNhcjIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52aWV3ID09ICd2aV9hbicpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWFuID0gbmV3IFBJWEkuU3ByaXRlKHRleHR1cmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hbi5hbmNob3Iuc2V0KDAuNjI1LCAwLjk5NSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFuLnNjYWxlID0gbmV3IFBJWEkuUG9pbnQocyh0YXJnZXRPSGVpZ2h0KSwgcyh0YXJnZXRPSGVpZ2h0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFuLnggPSBzKDU0ICsgKHJlc3VsdC52YV9kbWluX2dyb3VuZCArIDAuMjUpICogcHBtQ2FudmFzKTtcclxuICAgICAgICAgICAgICAgICAgICBtYW4ueSA9IHMoMjU2KTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFnZS5hZGRDaGlsZChtYW4pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWFuID0gbmV3IFBJWEkuU3ByaXRlKHRleHR1cmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hbi5hbmNob3Iuc2V0KDAuNjI1LCAwLjk5NSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFuLnNjYWxlID0gbmV3IFBJWEkuUG9pbnQocyh0YXJnZXRPSGVpZ2h0KSwgcyh0YXJnZXRPSGVpZ2h0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFuLnggPSBzKDU0ICsgcmVzdWx0LmRtaW4gKiBwcG1DYW52YXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hbi55ID0gcygyNTYpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YWdlLmFkZENoaWxkKG1hbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZpZXcgPT09ICd2aV9hbicpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbWFuMiA9IG5ldyBQSVhJLlNwcml0ZSh0ZXh0dXJlKTtcclxuICAgICAgICAgICAgICAgICAgICBtYW4yLmFuY2hvci5zZXQoMC42MjUsIDAuOTkyNSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFuMi5zY2FsZSA9IG5ldyBQSVhJLlBvaW50KHModGFyZ2V0T0hlaWdodCksIHModGFyZ2V0T0hlaWdodCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hbjIueCA9IHMoNTQgKyAocmVzdWx0LnZhX2RtYXhfZ3JvdW5kIC0gMC4yNSkgKiBwcG1DYW52YXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hbjIueSA9IHMoMjU2KTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFnZS5hZGRDaGlsZChtYW4yKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hbjIgPSBuZXcgUElYSS5TcHJpdGUodGV4dHVyZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFuMi5hbmNob3Iuc2V0KDAuNjI1LCAwLjk5MjUpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1hbjIuc2NhbGUgPSBuZXcgUElYSS5Qb2ludChzKHRhcmdldE9IZWlnaHQpLCBzKHRhcmdldE9IZWlnaHQpKTtcclxuICAgICAgICAgICAgICAgICAgICBtYW4yLnggPSBzKDU0ICsgcmVzdWx0LnBfZ3JvdW5kX21heCAqIHBwbUNhbnZhcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFuMi55ID0gcygyNTYpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YWdlLmFkZENoaWxkKG1hbjIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gc2NhbGVkWU1lc3NhZ2UoKSB7XHJcbiAgICAgICAgICAgICQoJzxzcGFuIGNsYXNzPVwiY2FudmFzTWVzc2FnZXNcIj4nICsgYXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxTY2FsZWRXYXJuaW5nJykgKyAnPC9zcGFuPicpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG4gICAgICAgICAgICAgICAgJ3RvcCc6ICc1MCUnLFxyXG4gICAgICAgICAgICAgICAgJ2xlZnQnOiAnNTAlJyxcclxuICAgICAgICAgICAgICAgICdkaXNwbGF5JzogJ2lubGluZS1ibG9jaycsXHJcbiAgICAgICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXHJcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogJzFyZW0nLFxyXG4gICAgICAgICAgICAgICAgJ2NvbG9yJzogJyM4YThhOGEnLFxyXG4gICAgICAgICAgICAgICAgJ3RleHQtYWxpZ24nOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICdsaW5lLWhlaWdodCc6ICcxNXB4JyxcclxuICAgICAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgIGZpbmFsUmVuZGVyZXIoKTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlRE9SSShtYXNrKSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VET1JJQ2lyY2xlKHNpemUsIGNvbG9yLCBhbHBoYSA9IDEpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaXJjbGUgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgICAgICAgICAgY2lyY2xlLmJlZ2luRmlsbChjb2xvcik7XHJcbiAgICAgICAgICAgICAgICBjaXJjbGUuYWxwaGEgPSBhbHBoYTtcclxuICAgICAgICAgICAgICAgIGNpcmNsZS5saW5lU3R5bGUoMCk7XHJcbiAgICAgICAgICAgICAgICBjaXJjbGUuZHJhd0NpcmNsZShzKDU0KSwgcyhrYW1lcmFDYW52YXNZKSwgcyhzaXplKSk7XHJcbiAgICAgICAgICAgICAgICBjaXJjbGUuZW5kRmlsbCgpO1xyXG4gICAgICAgICAgICAgICAgY2lyY2xlLm1hc2sgPSBtYXNrO1xyXG4gICAgICAgICAgICAgICAgc2NhbGFibGVDb250LmFkZENoaWxkKGNpcmNsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ2NhbWVyYScpIHtcclxuICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5pbGx1X3JhbmdlICogcHBtQ2FudmFzLCBDT0xPUl9ET1JJX0ksIDEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnZpZXcgPT09ICdkb3JpJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50aGVybWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRfZHJpX2QgKiBwcG1DYW52YXMsIENPTE9SX0RPUklfRCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRfZHJpX3IgKiBwcG1DYW52YXMsIENPTE9SX0RPUklfTyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRfZHJpX2kgKiBwcG1DYW52YXMsIENPTE9SX0RPUklfUik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kX2RvcmlfZCAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9EKTtcclxuICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZF9kb3JpX28gKiBwcG1DYW52YXMsIENPTE9SX0RPUklfTyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRfZG9yaV9yICogcHBtQ2FudmFzLCBDT0xPUl9ET1JJX1IpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kX2RvcmlfaSAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9JKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmaW5hbFJlbmRlcmVyKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzdGFnZSk7XHJcbiAgICAgICAgICAgIC8vIHdpbmRvdy50ZXN0ID0gZnVuY3Rpb24gKCkgeyByZW5kZXJlci5yZW5kZXIoc3RhZ2UpOyB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2kgYWN0dWFsbHkganVzdCBicm9rZScpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImNvbnN0IENPTE9SX0RPUklfRCA9IDB4MDA1NjkxO1xyXG5jb25zdCBDT0xPUl9ET1JJX08gPSAweDEyNzJBQTtcclxuY29uc3QgQ09MT1JfRE9SSV9SID0gMHgyQjhGQzM7XHJcbmNvbnN0IENPTE9SX0RPUklfSSA9IDB4M0VBQURCO1xyXG5cclxuY29uc3QgQ09MT1JfRk9WID0gMHgzRUFBREI7XHJcbmNvbnN0IENPTE9SX09VVEZPViA9IDB4REI1QzY4O1xyXG5jb25zdCBDT0xPUl9TVVBQT1JUX0xJTkVTID0gMHhCNUI1Qjc7XHJcblxyXG5mdW5jdGlvbiByYWRUb0RlZyhudW1iZXIpIHtcclxuICAgIHJldHVybiBudW1iZXIgKiAxODAgLyBNYXRoLlBJO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZWdUb1JhZChudW1iZXIpIHtcclxuICAgIHJldHVybiBudW1iZXIgKiBNYXRoLlBJIC8gMTgwO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZOb25wYW5vVG9wKCRlbGVtZW50LCByZXN1bHQpIHtcclxuICAgIGZ1bmN0aW9uIGVycm9yTWVzc2FnZSgpIHtcclxuICAgICAgICBjb250YWluZXIuaHRtbCgnJyk7XHJcbiAgICAgICAgJCgnPHNwYW4+VGhlIHZhbHVlcyB5b3UgaGF2ZSBjaG9zZW4gYXJlPGJyLz48dWw+PGxpPmJlbG93IG9yIGFib3ZlIGxpbWl0cyB0aGF0IGNhbiBiZSByZW5kZXJlZCBmb3IgZGlzcGxheTwvbGk+PGxpPm5vdCBhIHZhbGlkIGNvbWJpbmF0aW9uLjwvbGk+PC91bD48L3NwYW4+JykuY3NzKHtcclxuICAgICAgICAgICAgJ3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuICAgICAgICAgICAgJ3RvcCc6ICc1MCUnLFxyXG4gICAgICAgICAgICAnbGVmdCc6ICc1MCUnLFxyXG4gICAgICAgICAgICAnZGlzcGxheSc6ICdpbmxpbmUtYmxvY2snLFxyXG4gICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHZhRXJyb3IoKSB7XHJcbiAgICAgICAgY29udGFpbmVyLmh0bWwoJycpO1xyXG4gICAgICAgICQoJzxzcGFuPicgKyBhcHAubGwoJ3ZpZGVvQW5hbHl0aWNzRXJyb3InKSArICc8L3NwYW4+JykuY3NzKHtcclxuICAgICAgICAgICAgJ3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuICAgICAgICAgICAgJ3RvcCc6ICc1MCUnLFxyXG4gICAgICAgICAgICAnbGVmdCc6ICc1MCUnLFxyXG4gICAgICAgICAgICAnZGlzcGxheSc6ICdpbmxpbmUtYmxvY2snLFxyXG4gICAgICAgICAgICAndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXHJcbiAgICAgICAgfSkuYXBwZW5kVG8oY29udGFpbmVyKVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBjb250YWluZXIgPSAkZWxlbWVudDtcclxuICAgIGNvbnRhaW5lci5odG1sKCcnKTtcclxuICAgIGNvbnRhaW5lci5jc3MoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcbiAgICBjb250YWluZXIuY3NzKCdoZWlnaHQnLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSArICdweCcpO1xyXG5cclxuICAgIHZhciByZW5kZXJlciA9IG5ldyBQSVhJLkNhbnZhc1JlbmRlcmVyKGNvbnRhaW5lci53aWR0aCgpLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSwgeyBhbnRpYWxpYXM6IHRydWUsIGJhY2tncm91bmRDb2xvcjogMHhlNmU2ZTgsIHJvdW5kUGl4ZWxzOiB0cnVlLCBmb3JjZUZYQUE6IHRydWUgfSk7XHJcbiAgICBjb250YWluZXIuYXBwZW5kKHJlbmRlcmVyLnZpZXcpO1xyXG5cclxuICAgIHJlbmRlcmVyLmF1dG9yZXNpemUgPSB0cnVlO1xyXG4gICAgcmVuZGVyZXIucmVzaXplKGNvbnRhaW5lci53aWR0aCgpLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSk7XHJcblxyXG4gICAgdmFyIHN0YWdlID0gbmV3IFBJWEkuQ29udGFpbmVyKClcclxuXHJcbiAgICBjb25zdCBsb2FkZXIgPSBQSVhJLmxvYWRlcjtcclxuICAgIHJlbmRlcigpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJlbmRlcigpIHtcclxuICAgICAgICBmdW5jdGlvbiBzKHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLndpZHRoIC8gNjIwICogdjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQudGhlcm1hbCkge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmRtaW4gPiByZXN1bHQuZF9kcmlfZCkgeyBlcnJvck1lc3NhZ2UoKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWluID4gcmVzdWx0LmRfZG9yaV9kKSB7IGVycm9yTWVzc2FnZSgpOyByZXR1cm47IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3VsdC5lbGV2YXRpb24gPD0gMikgeyBlcnJvck1lc3NhZ2UoKTsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIHZhciBkaXNwbGF5TWF4V2lkdGggPSByZXN1bHQuZG9yaV9ncm91bmRfbWF4O1xyXG4gICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ3ZpX2FuJykge1xyXG4gICAgICAgICAgICBkaXNwbGF5TWF4V2lkdGggPSByZXN1bHQudmFfZG1heF9ncm91bmQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0LnZpZXcgPT09ICdjYW1lcmEnKSB7XHJcbiAgICAgICAgICAgIGRpc3BsYXlNYXhXaWR0aCA9IHJlc3VsdC5pbGx1X3JhbmdlX2dyb3VuZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1heFdpZHRoQ2hvcmQgPSAyICogZGlzcGxheU1heFdpZHRoICogTWF0aC5zaW4oZGVnVG9SYWQocmVzdWx0LmZvdl9ob3IgLyAyKSk7XHJcbiAgICAgICAgLy8gaWYgKHJlc3VsdC50aWx0ICogMiA+PSByZXN1bHQuZm92X3ZlcikgeyBjb25zb2xlLmxvZygnaG8nKTsgZGlzcGxheU1heFdpZHRoID0gcmVzdWx0LmRfZG9yaV9kOyB9XHJcblxyXG4gICAgICAgIHZhciB1c2VSaWdodFNpZGUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgcHBtQ2FudmFzID0gMTc1IC8gbWF4V2lkdGhDaG9yZDtcclxuICAgICAgICBpZiAocHBtQ2FudmFzICogZGlzcGxheU1heFdpZHRoID4gNTQwKSB7XHJcbiAgICAgICAgICAgIHVzZVJpZ2h0U2lkZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHBwbUNhbnZhcyA9IDU0MCAvIGRpc3BsYXlNYXhXaWR0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ2RvcmknKSB7XHJcbiAgICAgICAgICAgIGFwcC5lbWl0KCdwcG1DaGFuZ2VUb3AnLCB7IHNwb3RzOiBbcmVzdWx0LmRtaW4sIHJlc3VsdC5kX2RvcmlfZF9ncm91bmQsIHJlc3VsdC5kX2Rvcmlfb19ncm91bmQsIHJlc3VsdC5kX2Rvcmlfcl9ncm91bmQsIHJlc3VsdC5kX2RvcmlfaV9ncm91bmQsIHJlc3VsdC5kb3JpX2dyb3VuZF9tYXhdLCB0eXBlOiAnbm9ucGFubycsIHJlc19ob3I6IHJlc3VsdC5yZXNfaG9yLCBwcG06IHBwbUNhbnZhcywgZWxldmF0aW9uOiByZXN1bHQuZWxldmF0aW9uLCBmb3ZfdmVyOiByZXN1bHQuZm92X3ZlciwgdGlsdDogcmVzdWx0LnRpbHQsIGZvdl9ob3I6IHJlc3VsdC5mb3ZfaG9yLCBzdGFydFBvczogcmVzdWx0LnBfZ3JvdW5kX21heCwgbWluOiByZXN1bHQuZG1pbiwgbWF4OiByZXN1bHQuZG9yaV9ncm91bmRfbWF4LCBjb250YWluZXI6IGNvbnRhaW5lciB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC52aWV3ID09PSAnY2FtZXJhJykge1xyXG4gICAgICAgICAgICBhcHAuZW1pdCgncHBtQ2hhbmdlVG9wJywgeyBzcG90czogW3Jlc3VsdC5kbWluLCByZXN1bHQuaWxsdV9yYW5nZV9ncm91bmQsIHJlc3VsdC5pbGx1X2Z1bGxEaXN0YW5jZV0sIHR5cGU6ICdub25wYW5vJywgcmVzX2hvcjogcmVzdWx0LnJlc19ob3IsIHBwbTogcHBtQ2FudmFzLCBlbGV2YXRpb246IHJlc3VsdC5lbGV2YXRpb24sIGZvdl92ZXI6IHJlc3VsdC5mb3ZfdmVyLCB0aWx0OiByZXN1bHQudGlsdCwgZm92X2hvcjogcmVzdWx0LmZvdl9ob3IsIG1pbjogcmVzdWx0LmRtaW4sIG1heDogcmVzdWx0LmlsbHVfcmFuZ2VfZ3JvdW5kLCBjb250YWluZXI6IGNvbnRhaW5lciB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC52YV9kbWF4ID4gcmVzdWx0LnZhX2RtaW4pIHtcclxuICAgICAgICAgICAgdmFyIHZhbWF4ID0gcmVzdWx0LmRtYXhwO1xyXG4gICAgICAgICAgICBpZiAodmFtYXggPiAxMDAwMCkgeyB2YW1heCA9IHJlc3VsdC5kX2RvcmlfZDsgfVxyXG4gICAgICAgICAgICBhcHAuZW1pdCgncHBtQ2hhbmdlVG9wJywgeyBzcG90czogW3Jlc3VsdC52YV9kbWluX2dyb3VuZCwgcmVzdWx0LnZhX2RtYXhfZ3JvdW5kLCByZXN1bHQudmFfZnVsbERpc3RhbmNlXSwgdHlwZTogJ25vbnBhbm8nLCByZXNfaG9yOiByZXN1bHQucmVzX2hvciwgcHBtOiBwcG1DYW52YXMsIGVsZXZhdGlvbjogcmVzdWx0LmVsZXZhdGlvbiwgZm92X3ZlcjogcmVzdWx0LmZvdl92ZXIsIHRpbHQ6IHJlc3VsdC50aWx0LCBmb3ZfaG9yOiByZXN1bHQuZm92X2hvciwgbWluOiByZXN1bHQudmFfZG1pbl9ncm91bmQsIG1heDogcmVzdWx0LnZhX2RtYXhfZ3JvdW5kLCBjb250YWluZXI6IGNvbnRhaW5lciB9KTtcclxuICAgICAgICAgICAgLy8gYXBwLmVtaXQoJ3BwbUNoYW5nZVRvcCcsIHsgdHlwZTogJ25vbnBhbm8nLCBwcG06IHBwbUNhbnZhcywgZm92X2hvcjogcmVzdWx0LmZvdl9ob3IsIG1pbjogcmVzdWx0LnZhX2RtaW4gPiByZXN1bHQuZG1pbiA/IHJlc3VsdC52YV9kbWluIDogcmVzdWx0LmRtaW4sIG1heDogdmFtYXgsIGNvbnRhaW5lcjogY29udGFpbmVyIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFwcC5lbWl0KCdwcG1DaGFuZ2VUb3AnLCB7IHNwb3RzOiBbMF0sIHR5cGU6ICdub25wYW5vJywgcmVzX2hvcjogcmVzdWx0LnJlc19ob3IsIHBwbTogcHBtQ2FudmFzLCBmb3ZfaG9yOiByZXN1bHQuZm92X2hvciwgbWF4OiAwLCBjb250YWluZXI6IGNvbnRhaW5lciB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB4TWF4Q2hvcmRXaWR0aCA9IE1hdGguc3FydCgoKGRpc3BsYXlNYXhXaWR0aCAqIHBwbUNhbnZhcyAqIGRpc3BsYXlNYXhXaWR0aCAqIHBwbUNhbnZhcykpIC0gKDg3ICogODcpKTtcclxuXHJcbiAgICAgICAgdmFyIGNpcmNsZU1hc2sgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgIGNpcmNsZU1hc2suYmVnaW5GaWxsKDB4MDAwMDAwKTtcclxuICAgICAgICBpZiAodXNlUmlnaHRTaWRlKSB7XHJcbiAgICAgICAgICAgIGNpcmNsZU1hc2suZHJhd1BvbHlnb24ocyhyZXN1bHQuY2VudGVyLngpLCBzKHJlc3VsdC5jZW50ZXIueSksIHMocmVzdWx0Lm1hc2tQb2ludDEueCksIHMocmVzdWx0Lm1hc2tQb2ludDEueSksIHMocmVzdWx0Lm1hc2tQb2ludDIueCksIHMocmVzdWx0Lm1hc2tQb2ludDIueSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNpcmNsZU1hc2suZHJhd1BvbHlnb24oXHJcbiAgICAgICAgICAgICAgICBzKHJlc3VsdC5jZW50ZXIueCksIHMocmVzdWx0LmNlbnRlci55KSxcclxuICAgICAgICAgICAgICAgIHMoeE1heENob3JkV2lkdGggKyA1NCksIHMoMCArIDgyKSxcclxuICAgICAgICAgICAgICAgIHMocmVzdWx0Lm1hc2tQb2ludDEueCksIHMoMCArIDgyKSxcclxuICAgICAgICAgICAgICAgIHMocmVzdWx0Lm1hc2tQb2ludDIueCksIHMoMTc0ICsgODIpLFxyXG4gICAgICAgICAgICAgICAgcyh4TWF4Q2hvcmRXaWR0aCArIDU0KSwgcygxNzQgKyA4MilcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2lyY2xlTWFzay5lbmRGaWxsKCk7XHJcbiAgICAgICAgc3RhZ2UuYWRkQ2hpbGQoY2lyY2xlTWFzayk7XHJcbiAgICAgICAgaWYgKGNyZWF0ZURPUkkoY2lyY2xlTWFzaykpIHsgcmV0dXJuIH07XHJcblxyXG4gICAgICAgIHZhciBzaWRlV2FsbCA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcbiAgICAgICAgc2lkZVdhbGwuYmVnaW5GaWxsKDB4MDAwMDAwKTtcclxuICAgICAgICBzaWRlV2FsbC5kcmF3UmVjdChzKDU0KSwgcyg4MiksIHMoMSksIHMoMTc1KSk7XHJcbiAgICAgICAgc3RhZ2UuYWRkQ2hpbGQoc2lkZVdhbGwpO1xyXG5cclxuICAgICAgICB2YXIgYm90dG9tbGluZTEgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgIGJvdHRvbWxpbmUxLmJlZ2luRmlsbChDT0xPUl9TVVBQT1JUX0xJTkVTKTtcclxuICAgICAgICBib3R0b21saW5lMS5kcmF3UmVjdChzKDU0KSwgcygyNjQpLCBzKDEpLCBzKDE0KSk7XHJcbiAgICAgICAgc3RhZ2UuYWRkQ2hpbGQoYm90dG9tbGluZTEpO1xyXG5cclxuICAgICAgICB2YXIgYm90dG9tbGluZTMgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgIGJvdHRvbWxpbmUzLmJlZ2luRmlsbChDT0xPUl9TVVBQT1JUX0xJTkVTKTtcclxuICAgICAgICBib3R0b21saW5lMy5kcmF3UmVjdChzKDU0KSwgcygyNzcpLCBzKDU2NiksIHMoMSkpO1xyXG4gICAgICAgIHN0YWdlLmFkZENoaWxkKGJvdHRvbWxpbmUzKTtcclxuXHJcbiAgICAgICAgdmFyIGthbWVyYSA9IG5ldyBQSVhJLlNwcml0ZShsb2FkZXIucmVzb3VyY2VzLmthbWVyYS50ZXh0dXJlKTtcclxuICAgICAgICBrYW1lcmEuYW5jaG9yLnNldCgxLCAwLjUpO1xyXG4gICAgICAgIGthbWVyYS5zY2FsZSA9IG5ldyBQSVhJLlBvaW50KC41MSwgLjUxKTtcclxuICAgICAgICBrYW1lcmEueCA9IHMoNTYpO1xyXG4gICAgICAgIGthbWVyYS55ID0gcygxNjkpO1xyXG4gICAgICAgIHN0YWdlLmFkZENoaWxkKGthbWVyYSk7XHJcblxyXG4gICAgICAgIHZhciBkaWZmZXJlbmNlO1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0LnRoZXJtYWwpIHtcclxuICAgICAgICAgICAgZGlmZmVyZW5jZSA9IChyZXN1bHQuZG1heCA8IHJlc3VsdC5kX2RyaV9kID8gcmVzdWx0LmRtYXggOiByZXN1bHQuZF9kcmlfZCkgLSByZXN1bHQuZG1pbjtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWF4IDwgMCkgeyBkaWZmZXJlbmNlID0gcmVzdWx0LmRfZHJpX2QgLSByZXN1bHQuZG1pbjsgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRpZmZlcmVuY2UgPSAocmVzdWx0LmRtYXggPCByZXN1bHQuZF9kb3JpX2QgPyByZXN1bHQuZG1heCA6IHJlc3VsdC5kX2RvcmlfZCkgLSByZXN1bHQuZG1pbjtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWF4IDwgMCkgeyBkaWZmZXJlbmNlID0gcmVzdWx0LmRfZG9yaV9kIC0gcmVzdWx0LmRtaW47IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxSZW5kZXJlcigpO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVET1JJKG1hc2spIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gbWFrZURPUklDaXJjbGUoc2l6ZSwgY29sb3IsIGFscGhhID0gMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgKHNpemUgPCAwKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGNpcmNsZSA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcbiAgICAgICAgICAgICAgICBjaXJjbGUuYmVnaW5GaWxsKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgIGNpcmNsZS5hbHBoYSA9IGFscGhhO1xyXG4gICAgICAgICAgICAgICAgY2lyY2xlLmxpbmVTdHlsZSgwKTtcclxuICAgICAgICAgICAgICAgIGNpcmNsZS5kcmF3Q2lyY2xlKHMoNTQpLCBzKDE2OSksIHMoc2l6ZSkpO1xyXG4gICAgICAgICAgICAgICAgY2lyY2xlLmVuZEZpbGwoKTtcclxuICAgICAgICAgICAgICAgIGNpcmNsZS5tYXNrID0gbWFzaztcclxuICAgICAgICAgICAgICAgIHN0YWdlLmFkZENoaWxkKGNpcmNsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ2RvcmknICYmICFyZXN1bHQudGhlcm1hbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWF4IDwgcmVzdWx0LmRfZG9yaV9kICYmIHJlc3VsdC5kbWF4ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kX2RvcmlfZCAqIHBwbUNhbnZhcywgQ09MT1JfT1VURk9WKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRtYXggPiByZXN1bHQuZF9kb3JpX28pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRvcmlfZ3JvdW5kX21heCAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9EKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRfZG9yaV9vICogcHBtQ2FudmFzLCBDT0xPUl9ET1JJX08pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZF9kb3JpX3IgKiBwcG1DYW52YXMsIENPTE9SX0RPUklfUik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kX2RvcmlfaSAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9JKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWluIDwgMCkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRtaW4gKiBwcG1DYW52YXMsIENPTE9SX09VVEZPVik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWF4ID4gcmVzdWx0LmRfZG9yaV9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kb3JpX2dyb3VuZF9tYXggKiBwcG1DYW52YXMsIENPTE9SX0RPUklfTyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kX2RvcmlfciAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9SKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRfZG9yaV9pICogcHBtQ2FudmFzLCBDT0xPUl9ET1JJX0kpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRtaW4gPCAwKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZG1pbiAqIHBwbUNhbnZhcywgQ09MT1JfT1VURk9WKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRtYXggPiByZXN1bHQuZF9kb3JpX2kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRvcmlfZ3JvdW5kX21heCAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9SKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRfZG9yaV9pICogcHBtQ2FudmFzLCBDT0xPUl9ET1JJX0kpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRtaW4gPCAwKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZG1pbiAqIHBwbUNhbnZhcywgQ09MT1JfT1VURk9WKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRtYXggPiByZXN1bHQuZG1pbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZG9yaV9ncm91bmRfbWF4ICogcHBtQ2FudmFzLCBDT0xPUl9ET1JJX0kpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRtaW4gPCAwKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZG1pbiAqIHBwbUNhbnZhcywgQ09MT1JfT1VURk9WKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHJlc3VsdC5kbWF4ID4gMCkgeyBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZG1heCAqIHBwbUNhbnZhcywgQ09MT1JfT1VURk9WKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kb3JpX2dyb3VuZF9tYXggKiBwcG1DYW52YXMsIENPTE9SX0RPUklfRCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRfZG9yaV9vICogcHBtQ2FudmFzLCBDT0xPUl9ET1JJX08pO1xyXG4gICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kX2RvcmlfciAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9SKTtcclxuICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZF9kb3JpX2kgKiBwcG1DYW52YXMsIENPTE9SX0RPUklfSSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWluIDwgMCkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZG1pbiAqIHBwbUNhbnZhcywgQ09MT1JfT1VURk9WKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3VsdC52aWV3ID09PSAnZG9yaScgJiYgcmVzdWx0LnRoZXJtYWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG1heCA8IHJlc3VsdC5kX2RyaV9kICYmIHJlc3VsdC5kbWF4ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kX2RyaV9kICogcHBtQ2FudmFzLCBDT0xPUl9PVVRGT1YpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG1heCA+IHJlc3VsdC5kX2RyaV9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kb3JpX2dyb3VuZF9tYXggKiBwcG1DYW52YXMsIENPTE9SX0RPUklfRCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kX2RyaV9yICogcHBtQ2FudmFzLCBDT0xPUl9ET1JJX08pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZF9kcmlfaSAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9SKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWluIDwgMCkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRtaW4gKiBwcG1DYW52YXMsIENPTE9SX09VVEZPVik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kbWF4ID4gcmVzdWx0LmRfZHJpX2kpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRvcmlfZ3JvdW5kX21heCAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9PKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRfZHJpX2kgKiBwcG1DYW52YXMsIENPTE9SX0RPUklfUik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG1pbiA8IDApIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kbWluICogcHBtQ2FudmFzLCBDT0xPUl9PVVRGT1YpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG1heCA+IHJlc3VsdC5kbWluKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kb3JpX2dyb3VuZF9tYXggKiBwcG1DYW52YXMsIENPTE9SX0RPUklfSSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG1pbiA8IDApIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kbWluICogcHBtQ2FudmFzLCBDT0xPUl9PVVRGT1YpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAocmVzdWx0LmRtYXggPiAwKSB7IG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kbWF4ICogcHBtQ2FudmFzLCBDT0xPUl9PVVRGT1YpOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LmRvcmlfZ3JvdW5kX21heCAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9EKTtcclxuICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZF9kcmlfciAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9PKTtcclxuICAgICAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuZF9kcmlfaSAqIHBwbUNhbnZhcywgQ09MT1JfRE9SSV9SKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRtaW4gPCAwKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kbWluICogcHBtQ2FudmFzLCBDT0xPUl9PVVRGT1YpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnZpZXcgPT09ICdjYW1lcmEnKSB7XHJcbiAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQuaWxsdV9yYW5nZV9ncm91bmQgKiBwcG1DYW52YXMsIENPTE9SX0RPUklfSSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ3ZpX2FuJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YV9kbWF4IDw9IHJlc3VsdC52YV9kbWluKSB7IHZhRXJyb3IoKTsgcmV0dXJuIHRydWU7IH1cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmFfZG1pbiA+PSByZXN1bHQuZG1heHApIHsgdmFFcnJvcigpOyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmFfZG1heCA8PSByZXN1bHQudmFfZG1pbikgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgICAgIG1ha2VET1JJQ2lyY2xlKHJlc3VsdC5kbWF4ICogcHBtQ2FudmFzLCBDT0xPUl9PVVRGT1YpO1xyXG4gICAgICAgICAgICAgICAgbWFrZURPUklDaXJjbGUocmVzdWx0LnZhX2RtYXhfZ3JvdW5kICogcHBtQ2FudmFzLCBDT0xPUl9ET1JJX0kpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIHZhciBjaXJjbGUgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2lyY2xlLmJlZ2luRmlsbCgweDAwMDAwMCwgMCk7XHJcbiAgICAgICAgICAgICAgICAvLyBjaXJjbGUubGluZVN0eWxlKHMoKHJlc3VsdC52YV9kbWF4X2dyb3VuZCAtIHJlc3VsdC52YV9kbWluX2dyb3VuZCkgKiBwcG1DYW52YXMpLCBDT0xPUl9ET1JJX0ksIDEpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2lyY2xlLmRyYXdDaXJjbGUocyg1NCksIHMoMTY5KSwgcygocmVzdWx0LnZhX2RtaW5fZ3JvdW5kICsgcmVzdWx0LnZhX2RtYXhfZ3JvdW5kKSAqIC41ICogcHBtQ2FudmFzKSk7XHJcbiAgICAgICAgICAgICAgICAvLyBjaXJjbGUuZW5kRmlsbCgpO1xyXG4gICAgICAgICAgICAgICAgLy8gY2lyY2xlLm1hc2sgPSBtYXNrO1xyXG4gICAgICAgICAgICAgICAgLy8gc3RhZ2UuYWRkQ2hpbGQoY2lyY2xlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBtYWtlRE9SSUNpcmNsZShyZXN1bHQudmFfZG1pbl9ncm91bmQgKiBwcG1DYW52YXMsIENPTE9SX09VVEZPVik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZURSSShtYXNrKSB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBmaW5hbFJlbmRlcmVyKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzdGFnZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2kgYWN0dWFsbHkganVzdCBicm9rZScpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImNvbnN0IENPTE9SX0JHID0gMHhFNkU2RTg7XHJcblxyXG5jb25zdCBDT0xPUl9ET1JJX0QgPSAweDAwNTY5MTtcclxuY29uc3QgQ09MT1JfRE9SSV9PID0gMHgxMjcyQUE7XHJcbmNvbnN0IENPTE9SX0RPUklfUiA9IDB4MkI4RkMzO1xyXG5jb25zdCBDT0xPUl9ET1JJX0kgPSAweDNFQUFEQjtcclxuXHJcbmNvbnN0IENPTE9SX0ZPViA9IDB4M0VBQURCO1xyXG5jb25zdCBDT0xPUl9PVVRGT1YgPSAweERCNUM2ODtcclxuY29uc3QgQ09MT1JfU1VQUE9SVF9MSU5FUyA9IDB4QjVCNUI3O1xyXG5cclxuY29uc3QgRE9SSV9EID0gMjUsIERPUklfTyA9IDYzLCBET1JJX1IgPSAxMjUsIERPUklfSSA9IDI1MDtcclxuY29uc3QgRFJJX0QgPSAzLCBEUklfUiA9IDEyLCBEUklfSSA9IDI0O1xyXG5jb25zdCBIVU1BTl9IRUlHSFQgPSAxLjcsIEhVTUFOX1dJRFRIID0gMC41O1xyXG5cclxuZnVuY3Rpb24gcmFkVG9EZWcobnVtYmVyKSB7XHJcblx0cmV0dXJuIG51bWJlciAqIDE4MCAvIE1hdGguUEk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlZ1RvUmFkKG51bWJlcikge1xyXG5cdHJldHVybiBudW1iZXIgKiBNYXRoLlBJIC8gMTgwO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZQYW5vMzYwU2lkZVdhbGwoJGVsZW1lbnQsIHJlc3VsdCkge1xyXG5cdGNvbnNvbGUubG9nKHJlc3VsdCk7XHJcblx0ZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkge1xyXG5cdFx0Y29udGFpbmVyLmh0bWwoJycpO1xyXG5cdFx0JCgnPHNwYW4+VGhlIHZhbHVlcyB5b3UgaGF2ZSBjaG9zZW4gYXJlPGJyLz48dWw+PGxpPmJlbG93IG9yIGFib3ZlIGxpbWl0cyB0aGF0IGNhbiBiZSByZW5kZXJlZCBmb3IgZGlzcGxheTwvbGk+PGxpPm5vdCBhIHZhbGlkIGNvbWJpbmF0aW9uLjwvbGk+PC91bD48L3NwYW4+JykuY3NzKHtcclxuXHRcdFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuXHRcdFx0J3RvcCc6ICc1MCUnLFxyXG5cdFx0XHQnbGVmdCc6ICc1MCUnLFxyXG5cdFx0XHQnZGlzcGxheSc6ICdpbmxpbmUtYmxvY2snLFxyXG5cdFx0XHQndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXHJcblx0XHR9KS5hcHBlbmRUbyhjb250YWluZXIpXHJcblx0fVxyXG5cclxuXHR2YXIgY29udGFpbmVyID0gJGVsZW1lbnQ7XHJcblx0Y29udGFpbmVyLmh0bWwoJycpO1xyXG5cdGNvbnRhaW5lci5jc3MoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcblx0Y29udGFpbmVyLmNzcygnaGVpZ2h0JywgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjkgKyAncHgnKTtcclxuXHJcblx0Ly8gJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcblx0Ly8gXHRzdGFnZS5yZW1vdmVDaGlsZHJlbigpO1xyXG5cdC8vIFx0cmVuZGVyZXIucmVzaXplKGNvbnRhaW5lci53aWR0aCgpLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSk7XHJcblx0Ly8gXHRjb250YWluZXIuZmluZCgnc3BhbicpLnJlbW92ZSgpO1xyXG5cdC8vIFx0Y29udGFpbmVyLmNzcygnaGVpZ2h0JywgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjkgKyAncHgnKTtcclxuXHQvLyBcdHJlbmRlcigpO1xyXG5cdC8vIH0pO1xyXG5cclxuXHR2YXIgcmVuZGVyZXIgPSBuZXcgUElYSS5DYW52YXNSZW5kZXJlcihjb250YWluZXIud2lkdGgoKSwgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjksIHsgYW50aWFsaWFzOiB0cnVlLCBiYWNrZ3JvdW5kQ29sb3I6IDB4ZTZlNmU4LCByb3VuZFBpeGVsczogdHJ1ZSwgZm9yY2VGWEFBOiB0cnVlIH0pO1xyXG5cdGNvbnRhaW5lci5hcHBlbmQocmVuZGVyZXIudmlldyk7XHJcblxyXG5cdHJlbmRlcmVyLmF1dG9yZXNpemUgPSB0cnVlO1xyXG5cdHJlbmRlcmVyLnJlc2l6ZShjb250YWluZXIud2lkdGgoKSwgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjkpO1xyXG5cclxuXHR2YXIgc3RhZ2UgPSBuZXcgUElYSS5Db250YWluZXIoKVxyXG5cclxuXHRjb25zdCBsb2FkZXIgPSBQSVhJLmxvYWRlcjtcclxuXHRyZW5kZXIoKTtcclxuXHJcblx0ZnVuY3Rpb24gcmVuZGVyKCkge1xyXG5cdFx0ZnVuY3Rpb24gcyh2YWx1ZSkge1xyXG5cdFx0XHRyZXR1cm4gcmVuZGVyZXIud2lkdGggLyA2MjAgKiB2YWx1ZTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgcHBtQ2FudmFzID0gMTc1IC8gcmVzdWx0LmVsZXZhdGlvbjtcclxuXHRcdHZhciBwcG1Eb3JpX2QgPSAyNzUgLyByZXN1bHQuZF9kb3JpX2Q7XHJcblx0XHRwcG1Eb3JpX2QgPCBwcG1DYW52YXMgPyBwcG1DYW52YXMgPSBwcG1Eb3JpX2QgOiBmYWxzZTtcclxuXHRcdHZhciB0b3BQb2ludCA9IHMoODIgKyAxNzQgLSAocmVzdWx0LmVsZXZhdGlvbiAqIHBwbUNhbnZhcykpO1xyXG5cdFx0dmFyIG1pZFBvaW50ID0gcyg1NCArIDU2NiAqIDAuNSk7XHJcblx0XHR2YXIgaHVtYW5TY2FsZSA9IEhVTUFOX0hFSUdIVCAqIHBwbUNhbnZhcyAvIDEzNiAqIDEuMDE7XHJcblxyXG5cclxuXHRcdHZhciBhMSA9IHJlc3VsdC5hMTtcclxuXHRcdHZhciBhMyA9IHJlc3VsdC5hMztcclxuXHRcdHZhciBhNSA9IHJlc3VsdC5hNTtcclxuXHRcdHZhciBwaXhlbF9zaXplID0gcmVzdWx0LnBpeGVsX3NpemU7XHJcblxyXG5cdFx0dmFyIGVsZXZhdGlvbjtcclxuXHRcdHZhciBkaXN0YW5jZTtcclxuXHJcblx0XHR2YXIgYmFja2dyb3VuZCA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcblx0XHRiYWNrZ3JvdW5kLmJlZ2luRmlsbChDT0xPUl9PVVRGT1YpO1xyXG5cdFx0YmFja2dyb3VuZC5kcmF3UmVjdChzKDU1KSwgcyg4MiksIHMoNTY1KSwgcygxNzQpKTtcclxuXHRcdHN0YWdlLmFkZENoaWxkKGJhY2tncm91bmQpO1xyXG5cclxuXHRcdGZ1bmN0aW9uIHN1cGVyRmlsbERlcHJlY2F0ZWQoKSB7XHJcblx0XHRcdC8vIHZhciBzdXBlckZpbGwgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0XHQvLyBmb3IgKHZhciB4ID0gMDsgeCA8IHMoNTY1KTsgeCsrKSB7XHJcblx0XHRcdC8vIFx0Zm9yICh2YXIgeSA9IDA7IHkgPCBzKDE3My41KTsgeSsrKSB7XHJcblx0XHRcdC8vIFx0XHRlbGV2YXRpb24gPSB5ICogNjIwIC8gcmVuZGVyZXIud2lkdGggLyBwcG1DYW52YXM7XHJcblx0XHRcdC8vIFx0XHRkaXN0YW5jZSA9IHggKiA2MjAgLyByZW5kZXJlci53aWR0aCAvIHBwbUNhbnZhcztcclxuXHJcblx0XHRcdC8vIFx0XHRkaXN0YW5jZSAtPSBzKDU2NSkgKiAwLjUgKiA2MjAgLyByZW5kZXJlci53aWR0aCAvIHBwbUNhbnZhcztcclxuXHRcdFx0Ly8gXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoZGlzdGFuY2UpO1xyXG5cclxuXHRcdFx0Ly8gXHRcdC8vYmFzZWQgb24gaGVpZ2h0XHJcblxyXG5cdFx0XHQvLyBcdFx0dmFyIGFscGhhX2hlYWQgPSByYWRUb0RlZyhNYXRoLmF0YW4oZGlzdGFuY2UgLyAoZWxldmF0aW9uIC0gSFVNQU5fSEVJR0hUKSkpO1xyXG5cdFx0XHQvLyBcdFx0dmFyIGFscGhhX2Zvb3QgPSByYWRUb0RlZyhNYXRoLmF0YW4oZGlzdGFuY2UgLyBlbGV2YXRpb24pKTtcclxuXHJcblx0XHRcdC8vIFx0XHR2YXIgcGl4ZWxfaGVhZCA9IGExICogYWxwaGFfaGVhZCArIGEzICogTWF0aC5wb3coYWxwaGFfaGVhZCwgMykgKyBhNSAqIE1hdGgucG93KGFscGhhX2hlYWQsIDUpO1xyXG5cdFx0XHQvLyBcdFx0dmFyIHBpeGVsX2Zvb3QgPSBhMSAqIGFscGhhX2Zvb3QgKyBhMyAqIE1hdGgucG93KGFscGhhX2Zvb3QsIDMpICsgYTUgKiBNYXRoLnBvdyhhbHBoYV9mb290LCA1KTtcclxuXHJcblx0XHRcdC8vIFx0XHR2YXIgdGFyZ2V0X3BpeGVsID0gKHBpeGVsX2hlYWQgLSBwaXhlbF9mb290KSAvIHBpeGVsX3NpemUgKiAxMDAwO1xyXG5cdFx0XHQvLyBcdFx0dmFyIGRlbnNpdHkgPSB0YXJnZXRfcGl4ZWwgLyBIVU1BTl9IRUlHSFQ7XHJcblxyXG5cdFx0XHQvLyBcdFx0Ly9iYXNlZCBvbiB3aWR0aFxyXG5cclxuXHRcdFx0Ly8gXHRcdHZhciBhX2xlZnQgPSByYWRUb0RlZyhNYXRoLmF0YW4oKGRpc3RhbmNlICsgSFVNQU5fV0lEVEgpIC8gKGVsZXZhdGlvbiAtIEhVTUFOX0hFSUdIVCkpKTtcclxuXHRcdFx0Ly8gXHRcdHZhciBhX3JpZ2h0ID0gcmFkVG9EZWcoTWF0aC5hdGFuKGRpc3RhbmNlIC8gKGVsZXZhdGlvbiAtIEhVTUFOX0hFSUdIVCkpKTtcclxuXHJcblx0XHRcdC8vIFx0XHR2YXIgcGl4ZWxfbGVmdCA9IGExICogYV9sZWZ0ICsgYTMgKiBNYXRoLnBvdyhhX2xlZnQsIDMpICsgYTUgKiBNYXRoLnBvdyhhX2xlZnQsIDUpO1xyXG5cdFx0XHQvLyBcdFx0dmFyIHBpeGVsX3JpZ2h0ID0gYTEgKiBhX3JpZ2h0ICsgYTMgKiBNYXRoLnBvdyhhX3JpZ2h0LCAzKSArIGE1ICogTWF0aC5wb3coYV9yaWdodCwgNSk7XHJcblxyXG5cdFx0XHQvLyBcdFx0dmFyIHRhcmdldF9waXhlbF9hbHQgPSAocGl4ZWxfbGVmdCAtIHBpeGVsX3JpZ2h0KSAvIHBpeGVsX3NpemUgKiAxMDAwO1xyXG5cdFx0XHQvLyBcdFx0dmFyIGRlbnNpdHlfYWx0ID0gdGFyZ2V0X3BpeGVsX2FsdCAvIEhVTUFOX1dJRFRIO1xyXG5cclxuXHRcdFx0Ly8gXHRcdGlmIChkZW5zaXR5X2FsdCA+IGRlbnNpdHkpIHsgZGVuc2l0eSA9IGRlbnNpdHlfYWx0OyB9XHJcblxyXG5cdFx0XHQvLyBcdFx0aWYgKHJlc3VsdC52aWV3ID09PSAnY2FtZXJhJykge1xyXG5cdFx0XHQvLyBcdFx0XHRpZiAoZGVuc2l0eSA+IERPUklfRCkge1xyXG5cdFx0XHQvLyBcdFx0XHRcdHN1cGVyRmlsbC5iZWdpbkZpbGwoQ09MT1JfRE9SSV9JKTtcclxuXHRcdFx0Ly8gXHRcdFx0XHRzdXBlckZpbGwuZHJhd1JlY3Qocyg1NSkgKyB4LCBzKDgyKSArIHksIDEsIDEpO1xyXG5cdFx0XHQvLyBcdFx0XHR9XHJcblx0XHRcdC8vIFx0XHR9XHJcblx0XHRcdC8vIFx0XHRpZiAocmVzdWx0LnZpZXcgPT09ICdkb3JpJykge1xyXG5cdFx0XHQvLyBcdFx0XHRpZiAoZGVuc2l0eSA+IERPUklfSSkge1xyXG5cdFx0XHQvLyBcdFx0XHRcdHN1cGVyRmlsbC5iZWdpbkZpbGwoQ09MT1JfRE9SSV9JKTtcclxuXHRcdFx0Ly8gXHRcdFx0XHRzdXBlckZpbGwuZHJhd1JlY3Qocyg1NSkgKyB4LCBzKDgyKSArIHksIDEsIDEpO1xyXG5cdFx0XHQvLyBcdFx0XHR9IGVsc2UgaWYgKGRlbnNpdHkgPiBET1JJX1IpIHtcclxuXHRcdFx0Ly8gXHRcdFx0XHRzdXBlckZpbGwuYmVnaW5GaWxsKENPTE9SX0RPUklfUik7XHJcblx0XHRcdC8vIFx0XHRcdFx0c3VwZXJGaWxsLmRyYXdSZWN0KHMoNTUpICsgeCwgcyg4MikgKyB5LCAxLCAxKTtcclxuXHRcdFx0Ly8gXHRcdFx0fSBlbHNlIGlmIChkZW5zaXR5ID4gRE9SSV9PKSB7XHJcblx0XHRcdC8vIFx0XHRcdFx0c3VwZXJGaWxsLmJlZ2luRmlsbChDT0xPUl9ET1JJX08pO1xyXG5cdFx0XHQvLyBcdFx0XHRcdHN1cGVyRmlsbC5kcmF3UmVjdChzKDU1KSArIHgsIHMoODIpICsgeSwgMSwgMSk7XHJcblx0XHRcdC8vIFx0XHRcdH0gZWxzZSBpZiAoZGVuc2l0eSA+IERPUklfRCkge1xyXG5cdFx0XHQvLyBcdFx0XHRcdHN1cGVyRmlsbC5iZWdpbkZpbGwoQ09MT1JfRE9SSV9EKTtcclxuXHRcdFx0Ly8gXHRcdFx0XHRzdXBlckZpbGwuZHJhd1JlY3Qocyg1NSkgKyB4LCBzKDgyKSArIHksIDEsIDEpO1xyXG5cdFx0XHQvLyBcdFx0XHR9XHJcblx0XHRcdC8vIFx0XHR9XHJcblx0XHRcdC8vIFx0XHRpZiAocmVzdWx0LnZpZXcgPT09ICd2aV9hbicpIHtcclxuXHRcdFx0Ly8gXHRcdFx0aWYgKGRlbnNpdHkgPiByZXN1bHQuSVBQTV95ICYmIGRlbnNpdHkgKiByZXN1bHQudE9IZWlnaHQgPD0gcmVzdWx0LmltZ195ICogLjMpIHtcclxuXHRcdFx0Ly8gXHRcdFx0XHRzdXBlckZpbGwuYmVnaW5GaWxsKENPTE9SX0RPUklfRCk7XHJcblx0XHRcdC8vIFx0XHRcdFx0c3VwZXJGaWxsLmRyYXdSZWN0KHMoNTUpICsgeCwgcyg4MikgKyB5LCAxLCAxKTtcclxuXHRcdFx0Ly8gXHRcdFx0fSBlbHNlIGlmIChkZW5zaXR5ID4gRE9SSV9EKSB7XHJcblx0XHRcdC8vIFx0XHRcdFx0c3VwZXJGaWxsLmJlZ2luRmlsbChDT0xPUl9ET1JJX0kpO1xyXG5cdFx0XHQvLyBcdFx0XHRcdHN1cGVyRmlsbC5kcmF3UmVjdChzKDU1KSArIHgsIHMoODIpICsgeSwgMSwgMSk7XHJcblx0XHRcdC8vIFx0XHRcdH1cclxuXHRcdFx0Ly8gXHRcdH1cclxuXHJcblx0XHRcdC8vIFx0fVxyXG5cdFx0XHQvLyB9XHJcblx0XHRcdC8vIHN1cGVyRmlsbC5lbmRGaWxsKCk7XHJcblx0XHRcdC8vIHN0YWdlLmFkZENoaWxkKHN1cGVyRmlsbCk7XHJcblx0XHR9XHJcblxyXG4gICAgICAgIHZhciBzcG90cyA9IFtdO1xyXG4gICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ2NhbWVyYScpIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZHJhd1RlbnQod2lkdGgsIGNvbG9yKSB7XHJcblx0XHRcdFx0dmFyIGRtYXhHcmFwaGljID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuXHRcdFx0XHRkbWF4R3JhcGhpYy5iZWdpbkZpbGwoY29sb3IpO1xyXG5cdFx0XHRcdGRtYXhHcmFwaGljLmRyYXdQb2x5Z29uKFxyXG5cdFx0XHRcdFx0bWlkUG9pbnQsIHRvcFBvaW50LFxyXG5cdFx0XHRcdFx0bWlkUG9pbnQgKyBzKHdpZHRoICogcHBtQ2FudmFzKSwgcygyNTYgLSAoSFVNQU5fSEVJR0hUICogcHBtQ2FudmFzKSksXHJcblx0XHRcdFx0XHRtaWRQb2ludCArIHMod2lkdGggKiBwcG1DYW52YXMpLCBzKDI1NiksXHJcblx0XHRcdFx0XHRtaWRQb2ludCAtIHMod2lkdGggKiBwcG1DYW52YXMpLCBzKDI1NiksXHJcblx0XHRcdFx0XHRtaWRQb2ludCAtIHMod2lkdGggKiBwcG1DYW52YXMpLCBzKDI1NiAtIChIVU1BTl9IRUlHSFQgKiBwcG1DYW52YXMpKVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0ZG1heEdyYXBoaWMuZW5kRmlsbCgpO1xyXG5cdFx0XHRcdHN0YWdlLmFkZENoaWxkKGRtYXhHcmFwaGljKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHJlc3VsdC5kX2RvcmlfZCA+IHJlc3VsdC5pbGx1X3JhbmdlX2dyb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgZHJhd1RlbnQocmVzdWx0LmRfZG9yaV9kLCBDT0xPUl9PVVRGT1YpO1xyXG4gICAgICAgICAgICAgICAgZHJhd1RlbnQocmVzdWx0LmlsbHVfcmFuZ2VfZ3JvdW5kLCBDT0xPUl9ET1JJX0kpO1xyXG4gICAgICAgICAgICAgICAgc3BvdHMgPSBbMCwgcmVzdWx0LmlsbHVfcmFuZ2VfZ3JvdW5kLCByZXN1bHQuZF9kb3JpX2RdO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGRyYXdUZW50KHJlc3VsdC5pbGx1X3JhbmdlX2dyb3VuZCwgQ09MT1JfRE9SSV9JKTtcclxuICAgICAgICAgICAgICAgIHNwb3RzID0gWzAsIHJlc3VsdC5pbGx1X3JhbmdlX2dyb3VuZF07XHJcbiAgICAgICAgICAgIH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAocmVzdWx0LnZpZXcgPT09ICdkb3JpJykge1xyXG5cdFx0XHRmdW5jdGlvbiBkcmF3VGVudCh3aWR0aCwgY29sb3IpIHtcclxuXHRcdFx0XHR2YXIgZG1heEdyYXBoaWMgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0XHRcdGRtYXhHcmFwaGljLmJlZ2luRmlsbChjb2xvcik7XHJcblx0XHRcdFx0ZG1heEdyYXBoaWMuZHJhd1BvbHlnb24oXHJcblx0XHRcdFx0XHRtaWRQb2ludCwgdG9wUG9pbnQsXHJcblx0XHRcdFx0XHRtaWRQb2ludCArIHMod2lkdGggKiBwcG1DYW52YXMpLCBzKDI1NiAtIChIVU1BTl9IRUlHSFQgKiBwcG1DYW52YXMpKSxcclxuXHRcdFx0XHRcdG1pZFBvaW50ICsgcyh3aWR0aCAqIHBwbUNhbnZhcyksIHMoMjU2KSxcclxuXHRcdFx0XHRcdG1pZFBvaW50IC0gcyh3aWR0aCAqIHBwbUNhbnZhcyksIHMoMjU2KSxcclxuXHRcdFx0XHRcdG1pZFBvaW50IC0gcyh3aWR0aCAqIHBwbUNhbnZhcyksIHMoMjU2IC0gKEhVTUFOX0hFSUdIVCAqIHBwbUNhbnZhcykpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRkbWF4R3JhcGhpYy5lbmRGaWxsKCk7XHJcblx0XHRcdFx0c3RhZ2UuYWRkQ2hpbGQoZG1heEdyYXBoaWMpO1xyXG5cclxuXHRcdFx0XHR2YXIgbWFuID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMubWFuLnRleHR1cmUpO1xyXG5cdFx0XHRcdG1hbi5hbmNob3Iuc2V0KDAuNjI1LCAwLjk5NSk7XHJcblx0XHRcdFx0bWFuLnNjYWxlID0gbmV3IFBJWEkuUG9pbnQocyhodW1hblNjYWxlKSwgcyhodW1hblNjYWxlKSk7XHJcblx0XHRcdFx0bWFuLnggPSBtaWRQb2ludCArIHMod2lkdGggKiBwcG1DYW52YXMpO1xyXG5cdFx0XHRcdG1hbi55ID0gcygyNTYpO1xyXG5cdFx0XHRcdHN0YWdlLmFkZENoaWxkKG1hbik7XHJcblxyXG5cdFx0XHRcdHZhciBtYW4yID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMubWFuLnRleHR1cmUpO1xyXG5cdFx0XHRcdG1hbjIuYW5jaG9yLnNldCgwLjYyNSwgMC45OTUpO1xyXG5cdFx0XHRcdG1hbjIuc2NhbGUgPSBuZXcgUElYSS5Qb2ludChzKGh1bWFuU2NhbGUpLCBzKGh1bWFuU2NhbGUpKTtcclxuXHRcdFx0XHRtYW4yLnggPSBtaWRQb2ludCAtIHMod2lkdGggKiBwcG1DYW52YXMpO1xyXG5cdFx0XHRcdG1hbjIueSA9IHMoMjU2KTtcclxuXHRcdFx0XHRzdGFnZS5hZGRDaGlsZChtYW4yKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHJlc3VsdC5kX2RvcmlfZCkgeyBkcmF3VGVudChyZXN1bHQuZF9kb3JpX2QsIENPTE9SX0RPUklfRCk7IH1cclxuXHRcdFx0aWYgKHJlc3VsdC5kX2RvcmlfbykgeyBkcmF3VGVudChyZXN1bHQuZF9kb3JpX28sIENPTE9SX0RPUklfTyk7IH1cclxuXHRcdFx0aWYgKHJlc3VsdC5kX2RvcmlfcikgeyBkcmF3VGVudChyZXN1bHQuZF9kb3JpX3IsIENPTE9SX0RPUklfUik7IH1cclxuXHRcdFx0aWYgKHJlc3VsdC5kX2RvcmlfaSkgeyBkcmF3VGVudChyZXN1bHQuZF9kb3JpX2ksIENPTE9SX0RPUklfSSk7IH1cclxuICAgICAgICAgICAgc3BvdHMgPSBbMCwgcmVzdWx0LmRfZG9yaV9pLCByZXN1bHQuZF9kb3JpX3IsIHJlc3VsdC5kX2RvcmlfbywgcmVzdWx0LmRfZG9yaV9kXTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAocmVzdWx0LnZpZXcgPT09ICd2aV9hbicpIHtcclxuXHRcdFx0ZnVuY3Rpb24gZHJhd0d1eXMod2lkdGgpIHtcclxuXHRcdFx0XHR2YXIgbWFuID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMubWFuLnRleHR1cmUpO1xyXG5cdFx0XHRcdG1hbi5hbmNob3Iuc2V0KDAuNjI1LCAwLjk5NSk7XHJcblx0XHRcdFx0bWFuLnNjYWxlID0gbmV3IFBJWEkuUG9pbnQocyhodW1hblNjYWxlKSwgcyhodW1hblNjYWxlKSk7XHJcblx0XHRcdFx0bWFuLnggPSBtaWRQb2ludCArIHMod2lkdGggKiBwcG1DYW52YXMpO1xyXG5cdFx0XHRcdG1hbi55ID0gcygyNTYpO1xyXG5cdFx0XHRcdHN0YWdlLmFkZENoaWxkKG1hbik7XHJcblxyXG5cdFx0XHRcdHZhciBtYW4yID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMubWFuLnRleHR1cmUpO1xyXG5cdFx0XHRcdG1hbjIuYW5jaG9yLnNldCgwLjYyNSwgMC45OTUpO1xyXG5cdFx0XHRcdG1hbjIuc2NhbGUgPSBuZXcgUElYSS5Qb2ludChzKGh1bWFuU2NhbGUpLCBzKGh1bWFuU2NhbGUpKTtcclxuXHRcdFx0XHRtYW4yLnggPSBtaWRQb2ludCAtIHMod2lkdGggKiBwcG1DYW52YXMpO1xyXG5cdFx0XHRcdG1hbjIueSA9IHMoMjU2KTtcclxuXHRcdFx0XHRzdGFnZS5hZGRDaGlsZChtYW4yKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gZHJhd1RlbnQod2lkdGgsIGNvbG9yKSB7XHJcblx0XHRcdFx0dmFyIGRtYXhHcmFwaGljID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuXHRcdFx0XHRkbWF4R3JhcGhpYy5iZWdpbkZpbGwoY29sb3IpO1xyXG5cdFx0XHRcdGRtYXhHcmFwaGljLmRyYXdQb2x5Z29uKFxyXG5cdFx0XHRcdFx0bWlkUG9pbnQsIHRvcFBvaW50LFxyXG5cdFx0XHRcdFx0bWlkUG9pbnQgKyBzKHdpZHRoICogcHBtQ2FudmFzKSwgcygyNTYgLSAoSFVNQU5fSEVJR0hUICogcHBtQ2FudmFzKSksXHJcblx0XHRcdFx0XHRtaWRQb2ludCArIHMod2lkdGggKiBwcG1DYW52YXMpLCBzKDI1NiksXHJcblx0XHRcdFx0XHRtaWRQb2ludCAtIHMod2lkdGggKiBwcG1DYW52YXMpLCBzKDI1NiksXHJcblx0XHRcdFx0XHRtaWRQb2ludCAtIHMod2lkdGggKiBwcG1DYW52YXMpLCBzKDI1NiAtIChIVU1BTl9IRUlHSFQgKiBwcG1DYW52YXMpKVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0ZG1heEdyYXBoaWMuZW5kRmlsbCgpO1xyXG5cdFx0XHRcdHN0YWdlLmFkZENoaWxkKGRtYXhHcmFwaGljKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gdmFyIGJhY2tncm91bmRfZ3JleSA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcblx0XHRcdC8vIGJhY2tncm91bmRfZ3JleS5iZWdpbkZpbGwoQ09MT1JfQkcpO1xyXG5cdFx0XHQvLyBiYWNrZ3JvdW5kX2dyZXkuZHJhd1JlY3Qocyg1NCksIHMoODEpLCBzKDU2NiksIHMoMTc0IC0gKEhVTUFOX0hFSUdIVCAqIHBwbUNhbnZhcykpKTtcclxuXHRcdFx0Ly8gYmFja2dyb3VuZF9ncmV5LmRyYXdSZWN0KHMoNTQpLCBzKDgxKSwgcyg1NjYpLCBzKDE3NikpO1xyXG5cdFx0XHQvLyBzdGFnZS5hZGRDaGlsZChiYWNrZ3JvdW5kX2dyZXkpO1xyXG5cclxuXHRcdFx0Ly8gaWYgKHJlc3VsdC5kX2RvcmlfZCkgeyBkcmF3VGVudChyZXN1bHQuZF9kb3JpX2QsIENPTE9SX0RPUklfSSk7IH1cclxuXHRcdFx0ZHJhd1RlbnQocmVzdWx0LnZhX2RtYXgsIENPTE9SX0RPUklfUik7XHJcblx0XHRcdGlmIChyZXN1bHQuZF9kb3JpX2QpIHsgZHJhd0d1eXMocmVzdWx0LmRfZG9yaV9kKTsgfVxyXG4gICAgICAgICAgICBzcG90cyA9IFswLCByZXN1bHQudmFfZG1pbiwgcmVzdWx0LnZhX2RtYXgsIHJlc3VsdC5kX2RvcmlfZF07XHJcblx0XHR9XHJcblxyXG5cdFx0YXBwLmVtaXQoJ3BwbUNoYW5nZVNpZGUnLCB7IHNwb3RzOiBzcG90cywgcmVzdWx0OiByZXN1bHQsIHR5cGU6ICdwYW5vQ2VpbCcsIHBwbTogcHBtQ2FudmFzLCBjb250YWluZXI6IGNvbnRhaW5lciwgbWF4OiByZXN1bHQuZF9kb3JpX2QgfSk7XHJcblxyXG5cclxuXHRcdHZhciBib3R0b21saW5lMSA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcblx0XHRib3R0b21saW5lMS5iZWdpbkZpbGwoQ09MT1JfU1VQUE9SVF9MSU5FUyk7XHJcblx0XHRib3R0b21saW5lMS5kcmF3UmVjdChzKDU0ICsgMjgxKSwgcygyNjQpLCBzKDEpLCBzKDE0KSk7XHJcblx0XHRzdGFnZS5hZGRDaGlsZChib3R0b21saW5lMSk7XHJcblxyXG5cdFx0dmFyIGJvdHRvbWxpbmUzID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuXHRcdGJvdHRvbWxpbmUzLmJlZ2luRmlsbChDT0xPUl9TVVBQT1JUX0xJTkVTKTtcclxuXHRcdGJvdHRvbWxpbmUzLmRyYXdSZWN0KHMoNTQgKyAyODEpLCBzKDI3NyksIHMoNTY2KSwgcygxKSk7XHJcblx0XHRzdGFnZS5hZGRDaGlsZChib3R0b21saW5lMyk7XHJcblxyXG5cdFx0dmFyIGthbWVyYSA9IG5ldyBQSVhJLlNwcml0ZShsb2FkZXIucmVzb3VyY2VzLnBhbm8udGV4dHVyZSk7XHJcblx0XHRrYW1lcmEuYW5jaG9yLnNldCgwLjUsIDAuNSk7XHJcblx0XHRrYW1lcmEuc2NhbGUgPSBuZXcgUElYSS5Qb2ludCguNTEsIC41MSk7XHJcblx0XHRrYW1lcmEueCA9IG1pZFBvaW50O1xyXG5cdFx0a2FtZXJhLnkgPSB0b3BQb2ludDtcclxuXHRcdGthbWVyYS5yb3RhdGlvbiA9IGRlZ1RvUmFkKDkwKTtcclxuXHRcdHN0YWdlLmFkZENoaWxkKGthbWVyYSk7XHJcblx0XHRjb25zb2xlLmxvZyhrYW1lcmEpO1xyXG5cclxuXHRcdC8vICQoYDxzcGFuPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZDYW1IZWlnaHQnKX06ICR7YXBwLmlGdEYocmVzdWx0LmVsZXZhdGlvbikudG9GaXhlZCgyKX0gJHthcHAudW5pdFN5bWJvbCgpfSA8YnIvPiBIb3Jpem9udGFsIEZPVjogJHtyZXN1bHQuZm92LnRvRml4ZWQoMil9wrA8L3NwYW4+YCkuY3NzKHtcclxuXHRcdC8vIFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuXHRcdC8vIFx0J3RvcCc6IHMoMjcpICsgJ3B4JyxcclxuXHRcdC8vIFx0J2xlZnQnOiBzKDE5KSArICdweCcsXHJcblx0XHQvLyBcdCdjb2xvcic6ICcjMDAwJyxcclxuXHRcdC8vIFx0J3BhZGRpbmcnOiAnMnB4JyxcclxuXHRcdC8vIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcblxyXG5cdFx0Ly8gJChgPHNwYW4gY2xhc3M9XCJ2aWV3VHlwZVwiPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVWaXN1YWxTaWRlVmlldycpfTwvc3Bhbj5gKS5jc3Moe1xyXG5cdFx0Ly8gXHQncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG5cdFx0Ly8gXHQndG9wJzogcygyNykgKyAncHgnLFxyXG5cdFx0Ly8gXHQncmlnaHQnOiBzKDYwKSArICdweCcsXHJcblx0XHQvLyBcdCdjb2xvcic6ICcjMDAwJyxcclxuXHRcdC8vIFx0J3BhZGRpbmcnOiAnMnB4JyxcclxuXHRcdC8vIFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoMCwgLTUwJSknLFxyXG5cdFx0Ly8gXHQnZm9udC1zaXplJzogJzJyZW0nLFxyXG5cdFx0Ly8gfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuXHJcblx0XHRmaW5hbFJlbmRlcmVyKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBmaW5hbFJlbmRlcmVyKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHN0YWdlKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdpIGFjdHVhbGx5IGp1c3QgYnJva2UnKTtcclxuXHRcdFx0Y29uc29sZS5sb2coZXJyb3IpO1xyXG5cdFx0XHRlcnJvck1lc3NhZ2UoKTtcclxuXHRcdH1cclxuXHR9XHJcbn0iLCJjb25zdCBDT0xPUl9CRyA9IDB4RTZFNkU4O1xyXG5cclxuY29uc3QgQ09MT1JfRE9SSV9EID0gMHgwMDU2OTE7XHJcbmNvbnN0IENPTE9SX0RPUklfTyA9IDB4MTI3MkFBO1xyXG5jb25zdCBDT0xPUl9ET1JJX1IgPSAweDJCOEZDMztcclxuY29uc3QgQ09MT1JfRE9SSV9JID0gMHgzRUFBREI7XHJcblxyXG5jb25zdCBDT0xPUl9GT1YgPSAweDNFQUFEQjtcclxuY29uc3QgQ09MT1JfT1VURk9WID0gMHhEQjVDNjg7XHJcbmNvbnN0IENPTE9SX1NVUFBPUlRfTElORVMgPSAweEI1QjVCNztcclxuXHJcbmNvbnN0IERPUklfRCA9IDI1LCBET1JJX08gPSA2MywgRE9SSV9SID0gMTI1LCBET1JJX0kgPSAyNTA7XHJcbmNvbnN0IERSSV9EID0gMywgRFJJX1IgPSAxMiwgRFJJX0kgPSAyNDtcclxuY29uc3QgSFVNQU5fSEVJR0hUID0gMS43LCBIVU1BTl9XSURUSCA9IDAuNTtcclxuXHJcbmZ1bmN0aW9uIHJhZFRvRGVnKG51bWJlcikge1xyXG5cdHJldHVybiBudW1iZXIgKiAxODAgLyBNYXRoLlBJO1xyXG59XHJcblxyXG5mdW5jdGlvbiBkZWdUb1JhZChudW1iZXIpIHtcclxuXHRyZXR1cm4gbnVtYmVyICogTWF0aC5QSSAvIDE4MDtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2UGFubzM2MFNpZGVXYWxsKCRlbGVtZW50LCByZXN1bHQpIHtcclxuXHRjb25zb2xlLmxvZyhyZXN1bHQpO1xyXG5cdGZ1bmN0aW9uIGVycm9yTWVzc2FnZSgpIHtcclxuXHRcdGNvbnRhaW5lci5odG1sKCcnKTtcclxuXHRcdCQoJzxzcGFuPlRoZSB2YWx1ZXMgeW91IGhhdmUgY2hvc2VuIGFyZTxici8+PHVsPjxsaT5iZWxvdyBvciBhYm92ZSBsaW1pdHMgdGhhdCBjYW4gYmUgcmVuZGVyZWQgZm9yIGRpc3BsYXk8L2xpPjxsaT5ub3QgYSB2YWxpZCBjb21iaW5hdGlvbi48L2xpPjwvdWw+PC9zcGFuPicpLmNzcyh7XHJcblx0XHRcdCdwb3NpdGlvbic6ICdhYnNvbHV0ZScsXHJcblx0XHRcdCd0b3AnOiAnNTAlJyxcclxuXHRcdFx0J2xlZnQnOiAnNTAlJyxcclxuXHRcdFx0J2Rpc3BsYXknOiAnaW5saW5lLWJsb2NrJyxcclxuXHRcdFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknLFxyXG5cdFx0fSkuYXBwZW5kVG8oY29udGFpbmVyKVxyXG5cdH1cclxuXHJcblx0dmFyIGNvbnRhaW5lciA9ICRlbGVtZW50O1xyXG5cdGNvbnRhaW5lci5odG1sKCcnKTtcclxuXHRjb250YWluZXIuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xyXG5cdGNvbnRhaW5lci5jc3MoJ2hlaWdodCcsIGNvbnRhaW5lci53aWR0aCgpICogMC40ODI5ICsgJ3B4Jyk7XHJcblxyXG5cdC8vICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xyXG5cdC8vIFx0c3RhZ2UucmVtb3ZlQ2hpbGRyZW4oKTtcclxuXHQvLyBcdHJlbmRlcmVyLnJlc2l6ZShjb250YWluZXIud2lkdGgoKSwgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjkpO1xyXG5cdC8vIFx0Y29udGFpbmVyLmZpbmQoJ3NwYW4nKS5yZW1vdmUoKTtcclxuXHQvLyBcdGNvbnRhaW5lci5jc3MoJ2hlaWdodCcsIGNvbnRhaW5lci53aWR0aCgpICogMC40ODI5ICsgJ3B4Jyk7XHJcblx0Ly8gXHRyZW5kZXIoKTtcclxuXHQvLyB9KTtcclxuXHJcblx0dmFyIHJlbmRlcmVyID0gbmV3IFBJWEkuQ2FudmFzUmVuZGVyZXIoY29udGFpbmVyLndpZHRoKCksIGNvbnRhaW5lci53aWR0aCgpICogMC40ODI5LCB7IGFudGlhbGlhczogdHJ1ZSwgYmFja2dyb3VuZENvbG9yOiAweGU2ZTZlOCwgcm91bmRQaXhlbHM6IHRydWUsIGZvcmNlRlhBQTogdHJ1ZSB9KTtcclxuXHRjb250YWluZXIuYXBwZW5kKHJlbmRlcmVyLnZpZXcpO1xyXG5cclxuXHRyZW5kZXJlci5hdXRvcmVzaXplID0gdHJ1ZTtcclxuXHRyZW5kZXJlci5yZXNpemUoY29udGFpbmVyLndpZHRoKCksIGNvbnRhaW5lci53aWR0aCgpICogMC40ODI5KTtcclxuXHJcblx0dmFyIHN0YWdlID0gbmV3IFBJWEkuQ29udGFpbmVyKClcclxuXHJcblx0Y29uc3QgbG9hZGVyID0gUElYSS5sb2FkZXI7XHJcblx0cmVuZGVyKCk7XHJcblxyXG5cdGZ1bmN0aW9uIHJlbmRlcigpIHtcclxuXHRcdGZ1bmN0aW9uIHModmFsdWUpIHtcclxuXHRcdFx0cmV0dXJuIHJlbmRlcmVyLndpZHRoIC8gNjIwICogdmFsdWU7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFyZXN1bHQuZF9kb3JpX2QpIHsgZXJyb3JNZXNzYWdlKCk7IHJldHVybjsgfVxyXG5cclxuXHJcblx0XHR2YXIgcHBtQ2FudmFzID0gMTc1IC8gcmVzdWx0LmVsZXZhdGlvbjtcclxuXHRcdHZhciBwcG1Eb3JpX2QgPSA1NTAgLyByZXN1bHQuZF9kb3JpX2Q7XHJcblxyXG5cdFx0cHBtRG9yaV9kIDwgcHBtQ2FudmFzID8gcHBtQ2FudmFzID0gcHBtRG9yaV9kIDogZmFsc2U7XHJcblx0XHR2YXIgaHVtYW5TY2FsZSA9IEhVTUFOX0hFSUdIVCAqIHBwbUNhbnZhcyAvIDEzNiAqIDEuMDE7XHJcblxyXG5cdFx0YXBwLmVtaXQoJ3BwbUNoYW5nZVNpZGUnLCB7IHNwb3RzOiBbMCwgcmVzdWx0LmRfZG9yaV9pLCByZXN1bHQuZF9kb3JpX3IsIHJlc3VsdC5kX2RvcmlfbywgcmVzdWx0LmRfZG9yaV9kXSxyZXN1bHQ6IHJlc3VsdCwgdHlwZTogJ3Bhbm9XYWxsJywgcHBtOiBwcG1DYW52YXMsIGNvbnRhaW5lcjogY29udGFpbmVyLCBtYXg6IHJlc3VsdC5kX2RvcmlfZCB9KTtcclxuXHJcblx0XHR2YXIgYTEgPSByZXN1bHQuYTE7XHJcblx0XHR2YXIgYTMgPSByZXN1bHQuYTM7XHJcblx0XHR2YXIgYTUgPSByZXN1bHQuYTU7XHJcblx0XHR2YXIgcGl4ZWxfc2l6ZSA9IHJlc3VsdC5waXhlbF9zaXplO1xyXG5cclxuXHRcdHZhciBlbGV2YXRpb247XHJcblx0XHR2YXIgZGlzdGFuY2U7XHJcblxyXG5cdFx0dmFyIGJhY2tncm91bmQgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0YmFja2dyb3VuZC5iZWdpbkZpbGwoQ09MT1JfT1VURk9WKTtcclxuXHRcdGJhY2tncm91bmQuZHJhd1JlY3Qocyg1NSksIHMoODIpLCBzKDU2NSksIHMoMTc0KSk7XHJcblx0XHRzdGFnZS5hZGRDaGlsZChiYWNrZ3JvdW5kKTtcclxuXHJcblx0XHRpZiAocmVzdWx0LmRfZG9yaV9kX21pbikge1xyXG5cdFx0XHR2YXIgbWFuID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMubWFuLnRleHR1cmUpO1xyXG5cdFx0XHRtYW4uYW5jaG9yLnNldCgwLjYyNSwgMC45OTUpO1xyXG5cclxuXHRcdFx0bWFuLnNjYWxlID0gbmV3IFBJWEkuUG9pbnQocyhodW1hblNjYWxlKSwgcyhodW1hblNjYWxlKSk7XHJcblx0XHRcdG1hbi54ID0gcyg1NCArIHJlc3VsdC5kX2RvcmlfZF9taW4gKiBwcG1DYW52YXMpO1xyXG5cdFx0XHQvLyBtYW4ueCA9IHMoMTApO1xyXG5cdFx0XHRtYW4ueSA9IHMoMjU2KTtcclxuXHRcdFx0c3RhZ2UuYWRkQ2hpbGQobWFuKTtcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiBkcmF3U29tZXRoaW5nKHdpZHRoLCBjb2xvcikge1xyXG5cdFx0XHR2YXIgZG1heEdyYXBoaWMgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0XHRkbWF4R3JhcGhpYy5iZWdpbkZpbGwoY29sb3IpO1xyXG5cdFx0XHRkbWF4R3JhcGhpYy5kcmF3UG9seWdvbihcclxuXHRcdFx0XHRzKDU0KSwgcygyNTYgLSByZXN1bHQuZWxldmF0aW9uICogcHBtQ2FudmFzKSxcclxuXHRcdFx0XHRzKDU0ICsgKHdpZHRoICogcHBtQ2FudmFzKSksIHMoMjU2IC0gKEhVTUFOX0hFSUdIVCAqIHBwbUNhbnZhcykpLFxyXG5cdFx0XHRcdHMoNTQgKyAod2lkdGggKiBwcG1DYW52YXMpKSwgcygyNTYpLFxyXG5cdFx0XHRcdHMoNTQpLCBzKDI1NilcclxuXHRcdFx0KTtcclxuXHRcdFx0ZG1heEdyYXBoaWMuZW5kRmlsbCgpO1xyXG5cdFx0XHRzdGFnZS5hZGRDaGlsZChkbWF4R3JhcGhpYyk7XHJcblxyXG5cdFx0XHR2YXIgbWFuID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMubWFuLnRleHR1cmUpO1xyXG5cdFx0XHRtYW4uYW5jaG9yLnNldCgwLjYyNSwgMC45OTUpO1xyXG5cdFx0XHRtYW4uc2NhbGUgPSBuZXcgUElYSS5Qb2ludChzKGh1bWFuU2NhbGUpLCBzKGh1bWFuU2NhbGUpKTtcclxuXHRcdFx0bWFuLnggPSBzKDU0ICsgKHdpZHRoICogcHBtQ2FudmFzKSk7XHJcblx0XHRcdG1hbi55ID0gcygyNTYpO1xyXG5cdFx0XHRzdGFnZS5hZGRDaGlsZChtYW4pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChyZXN1bHQudmlldyA9PT0gXCJkb3JpXCIpIHtcclxuXHRcdFx0aWYgKHJlc3VsdC5kX2RvcmlfZCkgeyBkcmF3U29tZXRoaW5nKHJlc3VsdC5kX2RvcmlfZCwgQ09MT1JfRE9SSV9EKTsgfVxyXG5cdFx0XHRpZiAocmVzdWx0LmRfZG9yaV9vKSB7IGRyYXdTb21ldGhpbmcocmVzdWx0LmRfZG9yaV9vLCBDT0xPUl9ET1JJX08pOyB9XHJcblx0XHRcdGlmIChyZXN1bHQuZF9kb3JpX3IpIHsgZHJhd1NvbWV0aGluZyhyZXN1bHQuZF9kb3JpX3IsIENPTE9SX0RPUklfUik7IH1cclxuXHRcdFx0aWYgKHJlc3VsdC5kX2RvcmlfaSkgeyBkcmF3U29tZXRoaW5nKHJlc3VsdC5kX2RvcmlfaSwgQ09MT1JfRE9SSV9JKTsgfVxyXG5cdFx0fVxyXG5cdFx0aWYgKHJlc3VsdC52aWV3ID09PSAndmlfYW4nKSB7XHJcblx0XHRcdGlmIChyZXN1bHQudmFfZG1pbiA+PSByZXN1bHQudmFfZG1heCkgeyBlcnJvck1lc3NhZ2UoKTsgcmV0dXJuOyB9XHJcblx0XHRcdC8vIHZhciBiYWNrZ3JvdW5kX2dyZXkgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0XHQvLyBiYWNrZ3JvdW5kX2dyZXkuYmVnaW5GaWxsKENPTE9SX0JHKTtcclxuXHRcdFx0Ly8gYmFja2dyb3VuZF9ncmV5LmRyYXdSZWN0KHMoNTQpLCBzKDgxKSwgcyg1NjYpLCBzKDE3NikpO1xyXG5cdFx0XHQvLyBzdGFnZS5hZGRDaGlsZChiYWNrZ3JvdW5kX2dyZXkpO1xyXG5cclxuXHRcdFx0dmFyIGNpcmNsZU1hc2sgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgIFx0Y2lyY2xlTWFzay5iZWdpbkZpbGwoMHgwMDAwMDApO1xyXG5cdFx0XHRjaXJjbGVNYXNrLmRyYXdQb2x5Z29uKFxyXG4gICAgICAgICAgICAgICAgcyg1NSksIHMoODIpLFxyXG4gICAgICAgICAgICAgICAgcyg1MTIpLCBzKDgyKSxcclxuICAgICAgICAgICAgICAgIHMoNTEyKSwgcygyNTYpLFxyXG4gICAgICAgICAgICAgICAgcyg1NSksIHMoMjU2KSxcclxuICAgICAgICAgICAgKTtcclxuXHRcdFx0Y2lyY2xlTWFzay5lbmRGaWxsKCk7XHJcblxyXG5cdFx0XHR2YXIgZG1heEdyYXBoaWMgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0XHRkbWF4R3JhcGhpYy5iZWdpbkZpbGwoQ09MT1JfRE9SSV9SKTtcclxuICAgICAgICAgICAgZG1heEdyYXBoaWMuZHJhd0NpcmNsZShzKDU0KSwgcygyNTYgLSByZXN1bHQuZWxldmF0aW9uICogcHBtQ2FudmFzKSwgcyhyZXN1bHQudmFfZG1heCAqIHBwbUNhbnZhcykpO1xyXG4gICAgICAgICAgICBkbWF4R3JhcGhpYy5tYXNrID0gY2lyY2xlTWFzaztcclxuXHRcdFx0Ly8gZG1heEdyYXBoaWMuZHJhd1BvbHlnb24oXHJcblx0XHRcdC8vIFx0cyg1NCksIHMoMjU2IC0gcmVzdWx0LmVsZXZhdGlvbiAqIHBwbUNhbnZhcyksXHJcblx0XHRcdC8vIFx0cyg1NCArIChyZXN1bHQudmFfZG1heCAqIHBwbUNhbnZhcykpLCBzKDI1NiksXHJcblx0XHRcdC8vIFx0cyg1NCArIChyZXN1bHQudmFfZG1pbiA+PSByZXN1bHQudmFfZG1heCAqIHBwbUNhbnZhcykpLCBzKDI1NilcclxuXHRcdFx0Ly8gKTtcclxuXHRcdFx0ZG1heEdyYXBoaWMuZW5kRmlsbCgpO1xyXG5cdFx0XHRzdGFnZS5hZGRDaGlsZChkbWF4R3JhcGhpYyk7XHJcblx0XHR9XHJcblx0XHRpZiAocmVzdWx0LnZpZXcgPT09ICdjYW1lcmEnKSB7XHJcblx0XHRcdHZhciBkbWF4R3JhcGhpYyA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcblx0XHRcdGRtYXhHcmFwaGljLmJlZ2luRmlsbChDT0xPUl9ET1JJX0kpO1xyXG5cdFx0XHRkbWF4R3JhcGhpYy5kcmF3UG9seWdvbihcclxuXHRcdFx0XHRzKDU0KSwgcygyNTYgLSByZXN1bHQuZWxldmF0aW9uICogcHBtQ2FudmFzKSxcclxuXHRcdFx0XHRzKDU0ICsgKHJlc3VsdC5kX2RvcmlfZCAqIHBwbUNhbnZhcykpLCBzKDI1NiksXHJcblx0XHRcdFx0cyg1NCksIHMoMjU2KVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRkbWF4R3JhcGhpYy5lbmRGaWxsKCk7XHJcblx0XHRcdHN0YWdlLmFkZENoaWxkKGRtYXhHcmFwaGljKTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgc2lkZVdhbGwgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0c2lkZVdhbGwuYmVnaW5GaWxsKDB4MDAwMDAwKTtcclxuXHRcdHNpZGVXYWxsLmRyYXdSZWN0KHMoNTQpLCBzKDI1NiAtIHJlc3VsdC5lbGV2YXRpb24gKiBwcG1DYW52YXMpLCBzKDEpLCBzKHJlc3VsdC5lbGV2YXRpb24gKiBwcG1DYW52YXMpKTtcclxuXHRcdHN0YWdlLmFkZENoaWxkKHNpZGVXYWxsKTtcclxuXHJcblx0XHR2YXIgYm90dG9tV2FsbCA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcblx0XHRzaWRlV2FsbC5iZWdpbkZpbGwoMHgwMDAwMDApO1xyXG5cdFx0c2lkZVdhbGwuZHJhd1JlY3Qocyg1NCksIHMoMjU2KSwgcyg1NjYpLCBzKDEpKTtcclxuXHRcdHN0YWdlLmFkZENoaWxkKHNpZGVXYWxsKTtcclxuXHJcblx0XHR2YXIgYm90dG9tbGluZTEgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0Ym90dG9tbGluZTEuYmVnaW5GaWxsKENPTE9SX1NVUFBPUlRfTElORVMpO1xyXG5cdFx0Ym90dG9tbGluZTEuZHJhd1JlY3Qocyg1NCksIHMoMjY0KSwgcygxKSwgcygxNCkpO1xyXG5cdFx0c3RhZ2UuYWRkQ2hpbGQoYm90dG9tbGluZTEpO1xyXG5cclxuXHRcdHZhciBib3R0b21saW5lMyA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcblx0XHRib3R0b21saW5lMy5iZWdpbkZpbGwoQ09MT1JfU1VQUE9SVF9MSU5FUyk7XHJcblx0XHRib3R0b21saW5lMy5kcmF3UmVjdChzKDU0KSwgcygyNzcpLCBzKDU2NiksIHMoMSkpO1xyXG5cdFx0c3RhZ2UuYWRkQ2hpbGQoYm90dG9tbGluZTMpO1xyXG5cclxuXHRcdHZhciBrYW1lcmEgPSBuZXcgUElYSS5TcHJpdGUobG9hZGVyLnJlc291cmNlcy5wYW5vLnRleHR1cmUpO1xyXG5cdFx0a2FtZXJhLmFuY2hvci5zZXQoMC41LCAwLjUpO1xyXG5cdFx0a2FtZXJhLnNjYWxlID0gbmV3IFBJWEkuUG9pbnQoLjUxLCAuNTEpO1xyXG5cdFx0a2FtZXJhLnggPSBzKDU0KTtcclxuXHRcdGthbWVyYS55ID0gcygyNTYgLSByZXN1bHQuZWxldmF0aW9uICogcHBtQ2FudmFzKTtcclxuXHRcdHN0YWdlLmFkZENoaWxkKGthbWVyYSk7XHJcblxyXG5cdFx0Ly8gdmFyIGJvdHRvbWxpbmUxID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuXHRcdC8vIGJvdHRvbWxpbmUxLmJlZ2luRmlsbChDT0xPUl9TVVBQT1JUX0xJTkVTKTtcclxuXHRcdC8vIGJvdHRvbWxpbmUxLmRyYXdSZWN0KHMoNTQpLCBzKDI2NCksIHMoMSksIHMoMTQpKTtcclxuXHRcdC8vIHN0YWdlLmFkZENoaWxkKGJvdHRvbWxpbmUxKTtcclxuXHJcblx0XHQvLyB2YXIgYm90dG9tbGluZTIgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0Ly8gYm90dG9tbGluZTIuYmVnaW5GaWxsKENPTE9SX1NVUFBPUlRfTElORVMpO1xyXG5cdFx0Ly8gYm90dG9tbGluZTIuZHJhd1JlY3Qocyg1NCArIHJlc3VsdC5kX2RvcmlfZF9taW4gKiBwcG1DYW52YXMpLCBzKDI2NCksIHMoMSksIHMoMTQpKTtcclxuXHRcdC8vIHN0YWdlLmFkZENoaWxkKGJvdHRvbWxpbmUyKTtcclxuXHJcblx0XHQvLyB2YXIgYm90dG9tbGluZTMgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0Ly8gYm90dG9tbGluZTMuYmVnaW5GaWxsKENPTE9SX1NVUFBPUlRfTElORVMpO1xyXG5cdFx0Ly8gYm90dG9tbGluZTMuZHJhd1JlY3Qocyg1NCksIHMoMjc3KSwgcyhyZXN1bHQuZF9kb3JpX2RfbWluICogcHBtQ2FudmFzKSwgcygxKSk7XHJcblx0XHQvLyBzdGFnZS5hZGRDaGlsZChib3R0b21saW5lMyk7XHJcblxyXG5cdFx0Ly8gdmFyIGFuZmFzc2VyID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMuYW5mYXNzZXJYLnRleHR1cmUpO1xyXG5cdFx0Ly8gYW5mYXNzZXIuYW5jaG9yLnNldCgwLjUpO1xyXG5cdFx0Ly8gYW5mYXNzZXIuc2NhbGUgPSBuZXcgUElYSS5Qb2ludCguNTEsIC41MSk7XHJcblx0XHQvLyBhbmZhc3Nlci54ID0gcyg1NCArIHJlc3VsdC5kX2RvcmlfZF9taW4gKiBwcG1DYW52YXMpO1xyXG5cdFx0Ly8gYW5mYXNzZXIueSA9IHMoMjc4KTtcclxuXHRcdC8vIHN0YWdlLmFkZENoaWxkKGFuZmFzc2VyKTtcclxuXHJcblx0XHQvLyBpZiAocmVzdWx0LmRfZG9yaV9kX21pbikge1xyXG5cdFx0Ly8gXHQkKGA8c3Bhbj4ke2FwcC5pRnRGKHJlc3VsdC5kX2RvcmlfZF9taW4pLnRvRml4ZWQoMil9ICR7YXBwLnVuaXRTeW1ib2woKX08L3NwYW4+YCkuY3NzKHtcclxuXHRcdC8vIFx0XHQncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG5cdFx0Ly8gXHRcdCd0b3AnOiBzKDI3Ni41KSArICdweCcsXHJcblx0XHQvLyBcdFx0J2xlZnQnOiBzKDU0ICsgcmVzdWx0LmRfZG9yaV9kX21pbiAqIHBwbUNhbnZhcykgKyAxNSArICdweCcsXHJcblx0XHQvLyBcdFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoMCwgLTUwJSknLFxyXG5cdFx0Ly8gXHRcdCdjb2xvcic6ICcjYjViNWI3JyxcclxuXHRcdC8vIFx0fSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuXHRcdC8vIH1cclxuXHJcblxyXG5cdFx0Ly8gJChgPHNwYW4+JHthcHAubGwoJ3NldHRpbmdzTW9kZVNlbGVjdG9yc0ZPVkNhbUhlaWdodCcpfTogJHthcHAuaUZ0RihyZXN1bHQuZWxldmF0aW9uKS50b0ZpeGVkKDIpfSAke2FwcC51bml0U3ltYm9sKCl9PGJyLz4gSG9yaXpvbnRhbCBGT1Y6ICR7cmVzdWx0LmZvdi50b0ZpeGVkKDIpfcKwPC9zcGFuPmApLmNzcyh7XHJcblx0XHQvLyBcdCdwb3NpdGlvbic6ICdhYnNvbHV0ZScsXHJcblx0XHQvLyBcdCd0b3AnOiBzKDI3KSArICdweCcsXHJcblx0XHQvLyBcdCdsZWZ0JzogcygxOSkgKyAncHgnLFxyXG5cdFx0Ly8gXHQnY29sb3InOiAnIzAwMCcsXHJcblx0XHQvLyBcdCdwYWRkaW5nJzogJzJweCcsXHJcblx0XHQvLyB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG5cclxuXHRcdC8vICQoYDxzcGFuIGNsYXNzPVwidmlld1R5cGVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsU2lkZVZpZXcnKX08L3NwYW4+YCkuY3NzKHtcclxuXHRcdC8vIFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuXHRcdC8vIFx0J3RvcCc6IHMoMjcpICsgJ3B4JyxcclxuXHRcdC8vIFx0J3JpZ2h0Jzogcyg2MCkgKyAncHgnLFxyXG5cdFx0Ly8gXHQnY29sb3InOiAnIzAwMCcsXHJcblx0XHQvLyBcdCdwYWRkaW5nJzogJzJweCcsXHJcblx0XHQvLyBcdCd0cmFuc2Zvcm0nOiAndHJhbnNsYXRlKDAsIC01MCUpJyxcclxuXHRcdC8vIFx0J2ZvbnQtc2l6ZSc6ICcycmVtJyxcclxuXHRcdC8vIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcblxyXG5cdFx0ZmluYWxSZW5kZXJlcigpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZmluYWxSZW5kZXJlcigpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHJlbmRlcmVyLnJlbmRlcihzdGFnZSk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnaSBhY3R1YWxseSBqdXN0IGJyb2tlJyk7XHJcblx0XHRcdGNvbnNvbGUubG9nKGVycm9yKTtcclxuXHRcdFx0ZXJyb3JNZXNzYWdlKCk7XHJcblx0XHR9XHJcblx0fVxyXG59IiwiY29uc3QgQ09MT1JfRE9SSV9EID0gMHgwMDU2OTE7XHJcbmNvbnN0IENPTE9SX0RPUklfTyA9IDB4MTI3MkFBO1xyXG5jb25zdCBDT0xPUl9ET1JJX1IgPSAweDJCOEZDMztcclxuY29uc3QgQ09MT1JfRE9SSV9JID0gMHgzRUFBREI7XHJcblxyXG5jb25zdCBDT0xPUl9GT1YgPSAweDNFQUFEQjtcclxuY29uc3QgQ09MT1JfT1VURk9WID0gMHhEQjVDNjg7XHJcbmNvbnN0IENPTE9SX1NVUFBPUlRfTElORVMgPSAweEI1QjVCNztcclxuXHJcbmNvbnN0IERPUklfRCA9IDI1LCBET1JJX08gPSA2MywgRE9SSV9SID0gMTI1LCBET1JJX0kgPSAyNTA7XHJcbmNvbnN0IERSSV9EID0gMywgRFJJX1IgPSAxMiwgRFJJX0kgPSAyNDtcclxuY29uc3QgSFVNQU5fSEVJR0hUID0gMS43LCBIVU1BTl9XSURUSCA9IDAuNTtcclxuXHJcbmZ1bmN0aW9uIHJhZFRvRGVnKG51bWJlcikge1xyXG4gICAgcmV0dXJuIG51bWJlciAqIDE4MCAvIE1hdGguUEk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlZ1RvUmFkKG51bWJlcikge1xyXG4gICAgcmV0dXJuIG51bWJlciAqIE1hdGguUEkgLyAxODA7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdlBhbm8zNjBTaWRlV2FsbCgkZWxlbWVudCwgcmVzdWx0KSB7XHJcbiAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xyXG4gICAgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkge1xyXG4gICAgICAgIGNvbnRhaW5lci5odG1sKCcnKTtcclxuICAgICAgICAkKCc8c3Bhbj5UaGUgdmFsdWVzIHlvdSBoYXZlIGNob3NlbiBhcmU8YnIvPjx1bD48bGk+YmVsb3cgb3IgYWJvdmUgbGltaXRzIHRoYXQgY2FuIGJlIHJlbmRlcmVkIGZvciBkaXNwbGF5PC9saT48bGk+bm90IGEgdmFsaWQgY29tYmluYXRpb24uPC9saT48L3VsPjwvc3Bhbj4nKS5jc3Moe1xyXG4gICAgICAgICAgICAncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG4gICAgICAgICAgICAndG9wJzogJzUwJScsXHJcbiAgICAgICAgICAgICdsZWZ0JzogJzUwJScsXHJcbiAgICAgICAgICAgICdkaXNwbGF5JzogJ2lubGluZS1ibG9jaycsXHJcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcclxuICAgICAgICB9KS5hcHBlbmRUbyhjb250YWluZXIpXHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGNvbnRhaW5lciA9ICRlbGVtZW50O1xyXG4gICAgY29udGFpbmVyLmh0bWwoJycpO1xyXG4gICAgY29udGFpbmVyLmNzcygncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuICAgIGNvbnRhaW5lci5jc3MoJ2hlaWdodCcsIGNvbnRhaW5lci53aWR0aCgpICogMC40ODI5ICsgJ3B4Jyk7XHJcblxyXG4gICAgLy8gJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAvLyBcdHN0YWdlLnJlbW92ZUNoaWxkcmVuKCk7XHJcbiAgICAvLyBcdHJlbmRlcmVyLnJlc2l6ZShjb250YWluZXIud2lkdGgoKSwgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjkpO1xyXG4gICAgLy8gXHRjb250YWluZXIuZmluZCgnc3BhbicpLnJlbW92ZSgpO1xyXG4gICAgLy8gXHRjb250YWluZXIuY3NzKCdoZWlnaHQnLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSArICdweCcpO1xyXG4gICAgLy8gXHRyZW5kZXIoKTtcclxuICAgIC8vIH0pO1xyXG5cclxuICAgIHZhciByZW5kZXJlciA9IG5ldyBQSVhJLkNhbnZhc1JlbmRlcmVyKGNvbnRhaW5lci53aWR0aCgpLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSwgeyBhbnRpYWxpYXM6IHRydWUsIGJhY2tncm91bmRDb2xvcjogMHhlNmU2ZTgsIHJvdW5kUGl4ZWxzOiB0cnVlLCBmb3JjZUZYQUE6IHRydWUgfSk7XHJcbiAgICBjb250YWluZXIuYXBwZW5kKHJlbmRlcmVyLnZpZXcpO1xyXG5cclxuICAgIHJlbmRlcmVyLmF1dG9yZXNpemUgPSB0cnVlO1xyXG4gICAgcmVuZGVyZXIucmVzaXplKGNvbnRhaW5lci53aWR0aCgpLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSk7XHJcblxyXG4gICAgdmFyIHN0YWdlID0gbmV3IFBJWEkuQ29udGFpbmVyKClcclxuXHJcbiAgICBjb25zdCBsb2FkZXIgPSBQSVhJLmxvYWRlcjtcclxuICAgIHJlbmRlcigpO1xyXG5cclxuICAgIGZ1bmN0aW9uIHJlbmRlcigpIHtcclxuICAgICAgICBmdW5jdGlvbiBzKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJlci53aWR0aCAvIDYyMCAqIHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHBwbUNhbnZhcyA9IDE3MyAvIHJlc3VsdC5kX2RvcmlfZCAqIC41O1xyXG5cclxuICAgICAgICB2YXIgYTEgPSByZXN1bHQuYTE7XHJcbiAgICAgICAgdmFyIGEzID0gcmVzdWx0LmEzO1xyXG4gICAgICAgIHZhciBhNSA9IHJlc3VsdC5hNTtcclxuICAgICAgICB2YXIgcGl4ZWxfc2l6ZSA9IHJlc3VsdC5waXhlbF9zaXplO1xyXG5cclxuICAgICAgICB2YXIgZWxldmF0aW9uO1xyXG4gICAgICAgIHZhciBkaXN0YW5jZTtcclxuXHJcbiAgICAgICAgLy8gdmFyIHNpZGVsaW5lMSA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcbiAgICAgICAgLy8gc2lkZWxpbmUxLmJlZ2luRmlsbChDT0xPUl9TVVBQT1JUX0xJTkVTKTtcclxuICAgICAgICAvLyBzaWRlbGluZTEuZHJhd1JlY3QocygzMiksIHMoODQpLCBzKDE0KSwgcygxKSk7XHJcbiAgICAgICAgLy8gc3RhZ2UuYWRkQ2hpbGQoc2lkZWxpbmUxKTtcclxuXHJcbiAgICAgICAgLy8gdmFyIHNpZGVsaW5lMiA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcbiAgICAgICAgLy8gc2lkZWxpbmUyLmJlZ2luRmlsbChDT0xPUl9TVVBQT1JUX0xJTkVTKTtcclxuICAgICAgICAvLyBzaWRlbGluZTIuZHJhd1JlY3QocygzMiksIHMoODQgKyAxNzMgKiAuNSksIHMoNTY2ICogLjUpLCBzKDEpKTtcclxuICAgICAgICAvLyBzdGFnZS5hZGRDaGlsZChzaWRlbGluZTIpO1xyXG5cclxuICAgICAgICAvLyB2YXIgc2lkZWxpbmUzID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuICAgICAgICAvLyBzaWRlbGluZTMuYmVnaW5GaWxsKENPTE9SX1NVUFBPUlRfTElORVMpO1xyXG4gICAgICAgIC8vIHNpZGVsaW5lMy5kcmF3UmVjdChzKDMyKSwgcyg4NCksIHMoMSksIHMoMTczICogLjUpKTtcclxuICAgICAgICAvLyBzdGFnZS5hZGRDaGlsZChzaWRlbGluZTMpO1xyXG5cclxuICAgICAgICB2YXIgYmdPdXQgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0YmdPdXQuYmVnaW5GaWxsKENPTE9SX09VVEZPVik7XHJcblx0XHRiZ091dC5kcmF3UmVjdChzKDU0KSwgcyg4NCksIHMoNTY2KSwgcygxNzMpKTtcclxuXHRcdHN0YWdlLmFkZENoaWxkKGJnT3V0KTtcclxuXHJcbiAgICAgICAgdmFyIGJvdHRvbWxpbmUxID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuICAgICAgICBib3R0b21saW5lMS5iZWdpbkZpbGwoQ09MT1JfU1VQUE9SVF9MSU5FUyk7XHJcbiAgICAgICAgYm90dG9tbGluZTEuZHJhd1JlY3QocygzOCksIHMoODQpLCBzKDIwKSwgcygxKSk7XHJcbiAgICAgICAgc3RhZ2UuYWRkQ2hpbGQoYm90dG9tbGluZTEpO1xyXG5cclxuICAgICAgICB2YXIgYm90dG9tbGluZTIgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgIGJvdHRvbWxpbmUyLmJlZ2luRmlsbChDT0xPUl9TVVBQT1JUX0xJTkVTKTtcclxuICAgICAgICBib3R0b21saW5lMi5kcmF3UmVjdChzKDQ4KSwgcyg4NCArIDE3NSAqIC41KSwgcygyODEpLCBzKDEpKTtcclxuICAgICAgICBzdGFnZS5hZGRDaGlsZChib3R0b21saW5lMik7XHJcblxyXG4gICAgICAgIHZhciBib3R0b21saW5lMyA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcbiAgICAgICAgYm90dG9tbGluZTMuYmVnaW5GaWxsKENPTE9SX1NVUFBPUlRfTElORVMpO1xyXG4gICAgICAgIGJvdHRvbWxpbmUzLmRyYXdSZWN0KHMoNDgpLCBzKDg0KSwgcygxKSwgcygxNzUgKiAuNSkpO1xyXG4gICAgICAgIHN0YWdlLmFkZENoaWxkKGJvdHRvbWxpbmUzKTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZHJhd0NpcmNsZShyYWRpdXMsIGNvbG9yKSB7XHJcbiAgICAgICAgICAgIHZhciBjaXJjbGUgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG4gICAgICAgICAgICBjaXJjbGUuYmVnaW5GaWxsKGNvbG9yKTtcclxuICAgICAgICAgICAgY2lyY2xlLmRyYXdDaXJjbGUocyg1NCArIDU2NiAqIDAuNSksIHMoODQgKyAxNzMgKiAuNSksIHMocmFkaXVzKSk7XHJcbiAgICAgICAgICAgIHN0YWdlLmFkZENoaWxkKGNpcmNsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzcG90cyA9IFswXTtcclxuICAgICAgICBpZiAocmVzdWx0LnZpZXcgPT09ICdjYW1lcmEnKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZF9kb3JpX2QgPiByZXN1bHQuaWxsdV9yYW5nZV9ncm91bmQpIHtcclxuICAgICAgICAgICAgICAgIGRyYXdDaXJjbGUocmVzdWx0LmRfZG9yaV9kICogcHBtQ2FudmFzLCBDT0xPUl9PVVRGT1YpO1xyXG4gICAgICAgICAgICAgICAgZHJhd0NpcmNsZShyZXN1bHQuaWxsdV9yYW5nZV9ncm91bmQgKiBwcG1DYW52YXMsIENPTE9SX0RPUklfSSk7XHJcbiAgICAgICAgICAgICAgICBzcG90cyA9IFswLCByZXN1bHQuaWxsdV9yYW5nZV9ncm91bmQsIHJlc3VsdC5kX2RvcmlfZF07XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgZHJhd0NpcmNsZShyZXN1bHQuaWxsdV9yYW5nZV9ncm91bmQgKiBwcG1DYW52YXMsIENPTE9SX0RPUklfSSk7XHJcbiAgICAgICAgICAgICAgICBzcG90cyA9IFswLCByZXN1bHQuaWxsdV9yYW5nZV9ncm91bmRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ2RvcmknKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5kX2RvcmlfZCwgcHBtQ2FudmFzLCBDT0xPUl9ET1JJX0QsIGRyYXdDaXJjbGUpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmRfZG9yaV9kKSB7IGRyYXdDaXJjbGUocHBtQ2FudmFzICogcmVzdWx0LmRfZG9yaV9kLCBDT0xPUl9ET1JJX0QpOyB9XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZF9kb3JpX28pIHsgZHJhd0NpcmNsZShwcG1DYW52YXMgKiByZXN1bHQuZF9kb3JpX28sIENPTE9SX0RPUklfTyk7IH1cclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5kX2RvcmlfcikgeyBkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC5kX2RvcmlfciwgQ09MT1JfRE9SSV9SKTsgfVxyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmRfZG9yaV9pKSB7IGRyYXdDaXJjbGUocHBtQ2FudmFzICogcmVzdWx0LmRfZG9yaV9pLCBDT0xPUl9ET1JJX0kpOyB9XHJcbiAgICAgICAgICAgIHNwb3RzID0gWzAsIHJlc3VsdC5kX2RvcmlfaSwgcmVzdWx0LmRfZG9yaV9yLCByZXN1bHQuZF9kb3JpX28sIHJlc3VsdC5kX2RvcmlfZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQudmlldyA9PT0gJ3ZpX2FuJykge1xyXG4gICAgICAgICAgICAvLyBkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC5kX2RvcmlfZCwgQ09MT1JfRE9SSV9JKTtcclxuICAgICAgICAgICAgc3BvdHMgPSBbcmVzdWx0LmRfZG9yaV9kXTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC52YV9kbWluICYmIHJlc3VsdC52YV9kbWF4KSB7XHJcbiAgICAgICAgICAgICAgICBkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC52YV9kbWF4LCBDT0xPUl9ET1JJX08pO1xyXG4gICAgICAgICAgICAgICAgZHJhd0NpcmNsZShwcG1DYW52YXMgKiByZXN1bHQudmFfZG1pbiwgQ09MT1JfT1VURk9WKTtcclxuICAgICAgICAgICAgICAgIHNwb3RzLnVuc2hpZnQocmVzdWx0LnZhX2RtaW4sIHJlc3VsdC52YV9kbWF4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzcG90cy51bnNoaWZ0KDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXBwLmVtaXQoJ3BwbUNoYW5nZVRvcCcsIHsgc3BvdHM6IHNwb3RzLCByZXN1bHQ6IHJlc3VsdCwgdHlwZTogJ3Bhbm9DZWlsJywgcHBtOiBwcG1DYW52YXMsIGNvbnRhaW5lcjogY29udGFpbmVyLCBtYXg6IHJlc3VsdC5kX2RvcmlfZCB9KTtcclxuXHJcblxyXG4gICAgICAgIHZhciBrYW1lcmEgPSBuZXcgUElYSS5TcHJpdGUobG9hZGVyLnJlc291cmNlcy5wYW5vLnRleHR1cmUpO1xyXG4gICAgICAgIGthbWVyYS5hbmNob3Iuc2V0KDAuNSwgMC41KTtcclxuICAgICAgICBrYW1lcmEuc2NhbGUgPSBuZXcgUElYSS5Qb2ludCguNTEsIC41MSk7XHJcbiAgICAgICAga2FtZXJhLnggPSBzKDU0ICsgNTY2ICogMC41KTtcclxuICAgICAgICBrYW1lcmEueSA9IHMoODQgKyAxNzMgKiAuNSk7XHJcbiAgICAgICAga2FtZXJhLnJvdGF0aW9uID0gZGVnVG9SYWQoOTApO1xyXG4gICAgICAgIHN0YWdlLmFkZENoaWxkKGthbWVyYSk7XHJcblxyXG4gICAgICAgIC8vIHZhciBhbmZhc3NlciA9IG5ldyBQSVhJLlNwcml0ZShsb2FkZXIucmVzb3VyY2VzLmFuZmFzc2VyWS50ZXh0dXJlKTtcclxuICAgICAgICAvLyBhbmZhc3Nlci5hbmNob3Iuc2V0KDAuNSk7XHJcbiAgICAgICAgLy8gYW5mYXNzZXIuc2NhbGUgPSBuZXcgUElYSS5Qb2ludCguNTEsIC41MSk7XHJcbiAgICAgICAgLy8gYW5mYXNzZXIueCA9IHMoMzIgKyAxKTtcclxuICAgICAgICAvLyBhbmZhc3Nlci55ID0gcyg4NCArIDEpO1xyXG4gICAgICAgIC8vIHN0YWdlLmFkZENoaWxkKGFuZmFzc2VyKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKHJlc3VsdC5kX2RvcmlfZF9taW4pIHtcclxuICAgICAgICAvLyBcdCQoYDxzcGFuPiR7YXBwLmlGdEYocmVzdWx0LmRfZG9yaV9kX21heCkudG9GaXhlZCgyKX0gJHthcHAudW5pdFN5bWJvbCgpfTwvc3Bhbj5gKS5jc3Moe1xyXG4gICAgICAgIC8vIFx0XHQncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG4gICAgICAgIC8vIFx0XHQndG9wJzogcyg4NCkgKyAncHgnLFxyXG4gICAgICAgIC8vIFx0XHQnbGVmdCc6IHMoMzIpICsgMTggKyAncHgnLFxyXG4gICAgICAgIC8vIFx0XHQndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgwLCAtNTAlKScsXHJcbiAgICAgICAgLy8gXHRcdCdjb2xvcic6ICcjYjViNWI3JyxcclxuICAgICAgICAvLyBcdH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAvLyAkKGA8c3Bhbj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlU2VsZWN0b3JzRk9WSG9yaXpvbnRhbEZvdicpfTogJHtyZXN1bHQuZm92LnRvRml4ZWQoMil9wrA8L3NwYW4+YCkuY3NzKHtcclxuICAgICAgICAvLyBcdCdwb3NpdGlvbic6ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgLy8gXHQndG9wJzogcygyNykgKyAncHgnLFxyXG4gICAgICAgIC8vIFx0J2xlZnQnOiBzKDE5KSArICdweCcsXHJcbiAgICAgICAgLy8gXHQnY29sb3InOiAnIzAwMCcsXHJcbiAgICAgICAgLy8gXHQncGFkZGluZyc6ICcycHgnLFxyXG4gICAgICAgIC8vIFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoMCwgLTUwJSknLFxyXG4gICAgICAgIC8vIH0pLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIC8vICQoYDxzcGFuIGNsYXNzPVwidmlld1R5cGVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsVG9wVmlldycpfTwvc3Bhbj5gKS5jc3Moe1xyXG4gICAgICAgIC8vIFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuICAgICAgICAvLyBcdCd0b3AnOiBzKDI3KSArICdweCcsXHJcbiAgICAgICAgLy8gXHQncmlnaHQnOiBzKDYwKSArICdweCcsXHJcbiAgICAgICAgLy8gXHQnY29sb3InOiAnIzAwMCcsXHJcbiAgICAgICAgLy8gXHQncGFkZGluZyc6ICcycHgnLFxyXG4gICAgICAgIC8vIFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoMCwgLTUwJSknLFxyXG4gICAgICAgIC8vIFx0J2ZvbnQtc2l6ZSc6ICcycmVtJyxcclxuICAgICAgICAvLyB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG5cclxuICAgICAgICBmaW5hbFJlbmRlcmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZmluYWxSZW5kZXJlcigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZW5kZXJlci5yZW5kZXIoc3RhZ2UpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdpIGFjdHVhbGx5IGp1c3QgYnJva2UnKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJjb25zdCBDT0xPUl9ET1JJX0QgPSAweDAwNTY5MTtcclxuY29uc3QgQ09MT1JfRE9SSV9PID0gMHgxMjcyQUE7XHJcbmNvbnN0IENPTE9SX0RPUklfUiA9IDB4MkI4RkMzO1xyXG5jb25zdCBDT0xPUl9ET1JJX0kgPSAweDNFQUFEQjtcclxuXHJcbmNvbnN0IENPTE9SX0ZPViA9IDB4M0VBQURCO1xyXG5jb25zdCBDT0xPUl9PVVRGT1YgPSAweERCNUM2ODtcclxuY29uc3QgQ09MT1JfU1VQUE9SVF9MSU5FUyA9IDB4QjVCNUI3O1xyXG5cclxuY29uc3QgRE9SSV9EID0gMjUsIERPUklfTyA9IDYzLCBET1JJX1IgPSAxMjUsIERPUklfSSA9IDI1MDtcclxuY29uc3QgRFJJX0QgPSAzLCBEUklfUiA9IDEyLCBEUklfSSA9IDI0O1xyXG5jb25zdCBIVU1BTl9IRUlHSFQgPSAxLjcsIEhVTUFOX1dJRFRIID0gMC41O1xyXG5cclxuZnVuY3Rpb24gcmFkVG9EZWcobnVtYmVyKSB7XHJcblx0cmV0dXJuIG51bWJlciAqIDE4MCAvIE1hdGguUEk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlZ1RvUmFkKG51bWJlcikge1xyXG5cdHJldHVybiBudW1iZXIgKiBNYXRoLlBJIC8gMTgwO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZQYW5vMzYwU2lkZVdhbGwoJGVsZW1lbnQsIHJlc3VsdCkge1xyXG5cdGNvbnNvbGUubG9nKHJlc3VsdCk7XHJcblx0ZnVuY3Rpb24gZXJyb3JNZXNzYWdlKCkge1xyXG5cdFx0Y29udGFpbmVyLmh0bWwoJycpO1xyXG5cdFx0JCgnPHNwYW4+VGhlIHZhbHVlcyB5b3UgaGF2ZSBjaG9zZW4gYXJlPGJyLz48dWw+PGxpPmJlbG93IG9yIGFib3ZlIGxpbWl0cyB0aGF0IGNhbiBiZSByZW5kZXJlZCBmb3IgZGlzcGxheTwvbGk+PGxpPm5vdCBhIHZhbGlkIGNvbWJpbmF0aW9uLjwvbGk+PC91bD48L3NwYW4+JykuY3NzKHtcclxuXHRcdFx0J3Bvc2l0aW9uJzogJ2Fic29sdXRlJyxcclxuXHRcdFx0J3RvcCc6ICc1MCUnLFxyXG5cdFx0XHQnbGVmdCc6ICc1MCUnLFxyXG5cdFx0XHQnZGlzcGxheSc6ICdpbmxpbmUtYmxvY2snLFxyXG5cdFx0XHQndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXHJcblx0XHR9KS5hcHBlbmRUbyhjb250YWluZXIpXHJcblx0fVxyXG5cclxuXHR2YXIgY29udGFpbmVyID0gJGVsZW1lbnQ7XHJcblx0Y29udGFpbmVyLmh0bWwoJycpO1xyXG5cdGNvbnRhaW5lci5jc3MoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcblx0Y29udGFpbmVyLmNzcygnaGVpZ2h0JywgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjkgKyAncHgnKTtcclxuXHJcblx0Ly8gJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcblx0Ly8gXHRzdGFnZS5yZW1vdmVDaGlsZHJlbigpO1xyXG5cdC8vIFx0cmVuZGVyZXIucmVzaXplKGNvbnRhaW5lci53aWR0aCgpLCBjb250YWluZXIud2lkdGgoKSAqIDAuNDgyOSk7XHJcblx0Ly8gXHRjb250YWluZXIuZmluZCgnc3BhbicpLnJlbW92ZSgpO1xyXG5cdC8vIFx0Y29udGFpbmVyLmNzcygnaGVpZ2h0JywgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjkgKyAncHgnKTtcclxuXHQvLyBcdHJlbmRlcigpO1xyXG5cdC8vIH0pO1xyXG5cclxuXHR2YXIgcmVuZGVyZXIgPSBuZXcgUElYSS5DYW52YXNSZW5kZXJlcihjb250YWluZXIud2lkdGgoKSwgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjksIHsgYW50aWFsaWFzOiB0cnVlLCBiYWNrZ3JvdW5kQ29sb3I6IDB4ZTZlNmU4LCByb3VuZFBpeGVsczogdHJ1ZSwgZm9yY2VGWEFBOiB0cnVlIH0pO1xyXG5cdGNvbnRhaW5lci5hcHBlbmQocmVuZGVyZXIudmlldyk7XHJcblxyXG5cdHJlbmRlcmVyLmF1dG9yZXNpemUgPSB0cnVlO1xyXG5cdHJlbmRlcmVyLnJlc2l6ZShjb250YWluZXIud2lkdGgoKSwgY29udGFpbmVyLndpZHRoKCkgKiAwLjQ4MjkpO1xyXG5cclxuXHR2YXIgc3RhZ2UgPSBuZXcgUElYSS5Db250YWluZXIoKVxyXG5cclxuXHRjb25zdCBsb2FkZXIgPSBQSVhJLmxvYWRlcjtcclxuXHRyZW5kZXIoKTtcclxuXHJcblx0ZnVuY3Rpb24gcmVuZGVyKCkge1xyXG5cdFx0ZnVuY3Rpb24gcyh2YWx1ZSkge1xyXG5cdFx0XHRyZXR1cm4gcmVuZGVyZXIud2lkdGggLyA2MjAgKiB2YWx1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXJlc3VsdC5kX2RvcmlfZCkgeyBlcnJvck1lc3NhZ2UoKTsgcmV0dXJuOyB9XHJcblx0XHR2YXIgcHBtQ2FudmFzID0gMTczIC8gcmVzdWx0LmRfZG9yaV9kO1xyXG5cclxuXHRcdGFwcC5lbWl0KCdwcG1DaGFuZ2VUb3AnLCB7IHNwb3RzOiBbMCwgcmVzdWx0LmRfZG9yaV9pLCByZXN1bHQuZF9kb3JpX3IsIHJlc3VsdC5kX2RvcmlfbywgcmVzdWx0LmRfZG9yaV9kXSxyZXN1bHQ6IHJlc3VsdCwgdHlwZTogJ3Bhbm9XYWxsJywgcHBtOiBwcG1DYW52YXMsIGNvbnRhaW5lcjogY29udGFpbmVyLCBtYXg6IHJlc3VsdC5kX2RvcmlfZCB9KTtcclxuXHJcblx0XHR2YXIgYTEgPSByZXN1bHQuYTE7XHJcblx0XHR2YXIgYTMgPSByZXN1bHQuYTM7XHJcblx0XHR2YXIgYTUgPSByZXN1bHQuYTU7XHJcblx0XHR2YXIgcGl4ZWxfc2l6ZSA9IHJlc3VsdC5waXhlbF9zaXplO1xyXG5cclxuXHRcdHZhciBlbGV2YXRpb247XHJcblx0XHR2YXIgZGlzdGFuY2U7XHJcblxyXG5cdFx0dmFyIGJnT3V0ID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuXHRcdGJnT3V0LmJlZ2luRmlsbChDT0xPUl9PVVRGT1YpO1xyXG5cdFx0YmdPdXQuZHJhd1JlY3Qocyg1NCksIHMoODQpLCBzKDU2NiksIHMoMTczKSk7XHJcblx0XHRzdGFnZS5hZGRDaGlsZChiZ091dCk7XHJcblxyXG5cdFx0dmFyIGNpcmNsZU1hc2sgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0Y2lyY2xlTWFzay5iZWdpbkZpbGwoMHgwMDAwMDApO1xyXG5cdFx0Y2lyY2xlTWFzay5kcmF3UmVjdChzKDU0KSwgcyg4NCksIHMoNTY2KSwgcygxNzMpKTtcclxuXHRcdHN0YWdlLmFkZENoaWxkKGNpcmNsZU1hc2spO1xyXG5cclxuXHRcdGZ1bmN0aW9uIGRyYXdDaXJjbGUocmFkaXVzLCBjb2xvcikge1xyXG5cdFx0XHR2YXIgY2lyY2xlID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuXHRcdFx0Y2lyY2xlLmJlZ2luRmlsbChjb2xvcik7XHJcblx0XHRcdGNpcmNsZS5kcmF3Q2lyY2xlKHMoNTQgKyA1NjYgKiAwLjUpLCBzKDI1NyksIHMocmFkaXVzKSk7XHJcblx0XHRcdGNpcmNsZS5tYXNrID0gY2lyY2xlTWFzaztcclxuXHRcdFx0c3RhZ2UuYWRkQ2hpbGQoY2lyY2xlKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC5kX2RvcmlfZF9tYXgsIENPTE9SX0RPUklfRCk7XHJcblx0XHQvLyBpZiAocmVzdWx0LmRfZG9yaV9vX21heCkgeyBkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC5kX2Rvcmlfb19tYXgsIENPTE9SX0RPUklfTyk7IH1cclxuXHRcdC8vIGlmIChyZXN1bHQuZF9kb3JpX3JfbWF4KSB7IGRyYXdDaXJjbGUocHBtQ2FudmFzICogcmVzdWx0LmRfZG9yaV9yX21heCwgQ09MT1JfRE9SSV9SKTsgfVxyXG5cdFx0Ly8gaWYgKHJlc3VsdC5kX2RvcmlfaV9tYXgpIHsgZHJhd0NpcmNsZShwcG1DYW52YXMgKiByZXN1bHQuZF9kb3JpX2lfbWF4LCBDT0xPUl9ET1JJX0kpOyB9XHJcblxyXG5cdFx0Ly8gaWYgKHJlc3VsdC5kX2RvcmlfaV9taW4pIHsgZHJhd0NpcmNsZShwcG1DYW52YXMgKiByZXN1bHQuZF9kb3JpX2lfbWluLCBDT0xPUl9ET1JJX1IpOyB9XHJcblx0XHQvLyBpZiAocmVzdWx0LmRfZG9yaV9yX21pbikgeyBkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC5kX2Rvcmlfcl9taW4sIENPTE9SX0RPUklfTyk7IH1cclxuXHRcdC8vIGlmIChyZXN1bHQuZF9kb3JpX29fbWluKSB7IGRyYXdDaXJjbGUocHBtQ2FudmFzICogcmVzdWx0LmRfZG9yaV9vX21pbiwgQ09MT1JfRE9SSV9EKTsgfVxyXG5cdFx0Ly8gaWYgKHJlc3VsdC5kX2RvcmlfZF9taW4pIHsgZHJhd0NpcmNsZShwcG1DYW52YXMgKiByZXN1bHQuZF9kb3JpX2RfbWluLCBDT0xPUl9PVVRGT1YpOyB9XHJcblxyXG5cdFx0aWYgKHJlc3VsdC52aWV3ID09PSAnY2FtZXJhJykge1xyXG5cdFx0XHRkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC5kX2RvcmlfZCwgQ09MT1JfRE9SSV9JKTtcclxuXHRcdH1cclxuXHRcdGlmIChyZXN1bHQudmlldyA9PT0gJ2RvcmknKSB7XHJcblx0XHRcdGlmIChyZXN1bHQuZF9kb3JpX2QpIHsgZHJhd0NpcmNsZShwcG1DYW52YXMgKiByZXN1bHQuZF9kb3JpX2QsIENPTE9SX0RPUklfRCk7IH1cclxuXHRcdFx0aWYgKHJlc3VsdC5kX2RvcmlfbykgeyBkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC5kX2RvcmlfbywgQ09MT1JfRE9SSV9PKTsgfVxyXG5cdFx0XHRpZiAocmVzdWx0LmRfZG9yaV9yKSB7IGRyYXdDaXJjbGUocHBtQ2FudmFzICogcmVzdWx0LmRfZG9yaV9yLCBDT0xPUl9ET1JJX1IpOyB9XHJcblx0XHRcdGlmIChyZXN1bHQuZF9kb3JpX2kpIHsgZHJhd0NpcmNsZShwcG1DYW52YXMgKiByZXN1bHQuZF9kb3JpX2ksIENPTE9SX0RPUklfSSk7IH1cclxuXHRcdH1cclxuXHRcdGlmIChyZXN1bHQudmlldyA9PT0gJ3ZpX2FuJykge1xyXG5cdFx0XHQvLyBkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC5kX2RvcmlfZCwgQ09MT1JfRE9SSV9JKTtcclxuXHRcdFx0aWYgKHJlc3VsdC52YV9kbWluICYmIHJlc3VsdC52YV9kbWF4KSB7XHJcblx0XHRcdFx0ZHJhd0NpcmNsZShwcG1DYW52YXMgKiByZXN1bHQudmFfZG1heCwgQ09MT1JfRE9SSV9PKTtcclxuXHRcdFx0XHRkcmF3Q2lyY2xlKHBwbUNhbnZhcyAqIHJlc3VsdC52YV9kbWluLCBDT0xPUl9PVVRGT1YpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGJvdHRvbVdhbGwgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0Ym90dG9tV2FsbC5iZWdpbkZpbGwoMHgwMDAwMDApO1xyXG5cdFx0Ym90dG9tV2FsbC5kcmF3UmVjdChzKDU0KSwgcygyNTYpLCBzKDU2NiksIHMoMSkpO1xyXG5cdFx0c3RhZ2UuYWRkQ2hpbGQoYm90dG9tV2FsbCk7XHJcblxyXG5cdFx0dmFyIGJvdHRvbWxpbmUxID0gbmV3IFBJWEkuR3JhcGhpY3MoKTtcclxuXHRcdGJvdHRvbWxpbmUxLmJlZ2luRmlsbChDT0xPUl9TVVBQT1JUX0xJTkVTKTtcclxuXHRcdGJvdHRvbWxpbmUxLmRyYXdSZWN0KHMoNTQgKyAyODIpLCBzKDI2NCksIHMoMSksIHMoMTQpKTtcclxuXHRcdHN0YWdlLmFkZENoaWxkKGJvdHRvbWxpbmUxKTtcclxuXHJcblx0XHR2YXIgYm90dG9tbGluZTMgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0Ym90dG9tbGluZTMuYmVnaW5GaWxsKENPTE9SX1NVUFBPUlRfTElORVMpO1xyXG5cdFx0Ym90dG9tbGluZTMuZHJhd1JlY3Qocyg1NCArIDI4MiksIHMoMjc3KSwgcyg1NjYpLCBzKDEpKTtcclxuXHRcdHN0YWdlLmFkZENoaWxkKGJvdHRvbWxpbmUzKTtcclxuXHJcblx0XHR2YXIga2FtZXJhID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMucGFuby50ZXh0dXJlKTtcclxuXHRcdGthbWVyYS5hbmNob3Iuc2V0KDAuNSwgMC41KTtcclxuXHRcdGthbWVyYS5zY2FsZSA9IG5ldyBQSVhJLlBvaW50KC41MSwgLjUxKTtcclxuXHRcdGthbWVyYS54ID0gcyg1NCArIDU2NiAqIDAuNSk7XHJcblx0XHRrYW1lcmEueSA9IHMoMjU2KTtcclxuXHRcdGthbWVyYS5yb3RhdGlvbiA9IGRlZ1RvUmFkKC05MCk7XHJcblx0XHRzdGFnZS5hZGRDaGlsZChrYW1lcmEpO1xyXG5cclxuXHRcdC8vIHZhciBzaWRlbGluZTEgPSBuZXcgUElYSS5HcmFwaGljcygpO1xyXG5cdFx0Ly8gc2lkZWxpbmUxLmJlZ2luRmlsbChDT0xPUl9TVVBQT1JUX0xJTkVTKTtcclxuXHRcdC8vIHNpZGVsaW5lMS5kcmF3UmVjdChzKDMyKSwgcyg4NCksIHMoMTQpLCBzKDEpKTtcclxuXHRcdC8vIHN0YWdlLmFkZENoaWxkKHNpZGVsaW5lMSk7XHJcblxyXG5cdFx0Ly8gdmFyIHNpZGVsaW5lMiA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcblx0XHQvLyBzaWRlbGluZTIuYmVnaW5GaWxsKENPTE9SX1NVUFBPUlRfTElORVMpO1xyXG5cdFx0Ly8gc2lkZWxpbmUyLmRyYXdSZWN0KHMoMzIpLCBzKDI1NiksIHMoMTQpLCBzKDEpKTtcclxuXHRcdC8vIHN0YWdlLmFkZENoaWxkKHNpZGVsaW5lMik7XHJcblxyXG5cdFx0Ly8gdmFyIHNpZGVsaW5lMyA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XHJcblx0XHQvLyBzaWRlbGluZTMuYmVnaW5GaWxsKENPTE9SX1NVUFBPUlRfTElORVMpO1xyXG5cdFx0Ly8gc2lkZWxpbmUzLmRyYXdSZWN0KHMoMzIpLCBzKDg0KSwgcygxKSwgcygxNzMpKTtcclxuXHRcdC8vIHN0YWdlLmFkZENoaWxkKHNpZGVsaW5lMyk7XHJcblxyXG5cdFx0Ly8gdmFyIGFuZmFzc2VyID0gbmV3IFBJWEkuU3ByaXRlKGxvYWRlci5yZXNvdXJjZXMuYW5mYXNzZXJZLnRleHR1cmUpO1xyXG5cdFx0Ly8gYW5mYXNzZXIuYW5jaG9yLnNldCgwLjUpO1xyXG5cdFx0Ly8gYW5mYXNzZXIuc2NhbGUgPSBuZXcgUElYSS5Qb2ludCguNTEsIC41MSk7XHJcblx0XHQvLyBhbmZhc3Nlci54ID0gcygzMiArIDEpO1xyXG5cdFx0Ly8gYW5mYXNzZXIueSA9IHMoODQgKyAxKTtcclxuXHRcdC8vIHN0YWdlLmFkZENoaWxkKGFuZmFzc2VyKTtcclxuXHJcblx0XHQvLyBpZiAocmVzdWx0LmRfZG9yaV9kX21pbikge1xyXG5cdFx0Ly8gXHQkKGA8c3Bhbj4ke2FwcC5pRnRGKHJlc3VsdC5kX2RvcmlfZF9tYXgpLnRvRml4ZWQoMil9ICR7YXBwLnVuaXRTeW1ib2woKX08L3NwYW4+YCkuY3NzKHtcclxuXHRcdC8vIFx0XHQncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG5cdFx0Ly8gXHRcdCd0b3AnOiBzKDg0KSArICdweCcsXHJcblx0XHQvLyBcdFx0J2xlZnQnOiBzKDMyKSArIDE4ICsgJ3B4JyxcclxuXHRcdC8vIFx0XHQndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgwLCAtNTAlKScsXHJcblx0XHQvLyBcdFx0J2NvbG9yJzogJyNiNWI1YjcnLFxyXG5cdFx0Ly8gXHR9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG5cdFx0Ly8gfVxyXG5cclxuXHRcdC8vICQoYDxzcGFuPiR7YXBwLmxsKCdzZXR0aW5nc01vZGVTZWxlY3RvcnNGT1ZIb3Jpem9udGFsRm92Jyl9OiAke3Jlc3VsdC5mb3YudG9GaXhlZCgyKX3CsDwvc3Bhbj5gKS5jc3Moe1xyXG5cdFx0Ly8gXHQncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG5cdFx0Ly8gXHQndG9wJzogcygyNykgKyAncHgnLFxyXG5cdFx0Ly8gXHQnbGVmdCc6IHMoMTkpICsgJ3B4JyxcclxuXHRcdC8vIFx0J2NvbG9yJzogJyMwMDAnLFxyXG5cdFx0Ly8gXHQncGFkZGluZyc6ICcycHgnLFxyXG5cdFx0Ly8gXHQndHJhbnNmb3JtJzogJ3RyYW5zbGF0ZSgwLCAtNTAlKScsXHJcblx0XHQvLyB9KS5hcHBlbmRUbyhjb250YWluZXIpO1xyXG5cclxuXHRcdC8vICQoYDxzcGFuIGNsYXNzPVwidmlld1R5cGVcIj4ke2FwcC5sbCgnc2V0dGluZ3NNb2RlVmlzdWFsVG9wVmlldycpfTwvc3Bhbj5gKS5jc3Moe1xyXG5cdFx0Ly8gXHQncG9zaXRpb24nOiAnYWJzb2x1dGUnLFxyXG5cdFx0Ly8gXHQndG9wJzogcygyNykgKyAncHgnLFxyXG5cdFx0Ly8gXHQncmlnaHQnOiBzKDYwKSArICdweCcsXHJcblx0XHQvLyBcdCdjb2xvcic6ICcjMDAwJyxcclxuXHRcdC8vIFx0J3BhZGRpbmcnOiAnMnB4JyxcclxuXHRcdC8vIFx0J3RyYW5zZm9ybSc6ICd0cmFuc2xhdGUoMCwgLTUwJSknLFxyXG5cdFx0Ly8gXHQnZm9udC1zaXplJzogJzJyZW0nLFxyXG5cdFx0Ly8gfSkuYXBwZW5kVG8oY29udGFpbmVyKTtcclxuXHJcblx0XHRmaW5hbFJlbmRlcmVyKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBmaW5hbFJlbmRlcmVyKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKHN0YWdlKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdpIGFjdHVhbGx5IGp1c3QgYnJva2UnKTtcclxuXHRcdFx0Y29uc29sZS5sb2coZXJyb3IpO1xyXG5cdFx0XHRlcnJvck1lc3NhZ2UoKTtcclxuXHRcdH1cclxuXHR9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcclxuXHR2YXIgbXNfaWUgPSBmYWxzZTtcclxuXHR2YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuXHR2YXIgb2xkX2llID0gdWEuaW5kZXhPZignTVNJRSAnKTtcclxuXHR2YXIgbmV3X2llID0gdWEuaW5kZXhPZignVHJpZGVudC8nKTtcclxuXHJcblx0aWYgKChvbGRfaWUgPiAtMSkgfHwgKG5ld19pZSA+IC0xKSkge1xyXG5cdFx0bXNfaWUgPSB0cnVlO1xyXG5cdH1cclxuXHJcblx0aWYgKG1zX2llKSB7XHJcblx0XHQvL0lFIHNwZWNpZmljIGNvZGUgZ29lcyBoZXJlXHJcblx0XHQoZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRmdW5jdGlvbiBDdXN0b21FdmVudChldmVudCwgcGFyYW1zKSB7XHJcblx0XHRcdFx0cGFyYW1zID0gcGFyYW1zIHx8IHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlLCBkZXRhaWw6IHVuZGVmaW5lZCB9O1xyXG5cdFx0XHRcdHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcclxuXHRcdFx0XHRldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50LCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwpO1xyXG5cdFx0XHRcdHJldHVybiBldnQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XHJcblxyXG5cdFx0XHR3aW5kb3cuQ3VzdG9tRXZlbnQgPSBDdXN0b21FdmVudDtcclxuXHRcdFx0d2luZG93LkV2ZW50ID0gQ3VzdG9tRXZlbnQ7XHJcblx0XHR9KSgpO1xyXG5cclxuXHRcdChmdW5jdGlvbiAoKSB7XHJcblx0XHRcdE51bWJlci5wYXJzZUZsb2F0ID0gcGFyc2VGbG9hdDtcclxuXHRcdH0pKCk7XHJcblx0fVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ=="}