Ktlo

Stargate Security Terminal

Nov 25th, 2024 (edited)
429
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 357.05 KB | Software | 0 0
  1. VERSION = 'v1.6.1'
  2. local base64 = [[local a={}local b=_G.bit32 and _G.bit32.extract;if not b then if _G.bit then local c,d,e=_G.bit.lshift,_G.bit.rshift,_G.bit.band;b=function(f,g,h)return e(d(f,g),c(1,h)-1)end elseif _G._VERSION=="Lua 5.1"then b=function(f,g,h)local i=0;local j=2^g;for k=0,h-1 do local l=j+j;if f%l>=j then i=i+2^k end;j=l end;return i end else b=load'return function( v, from, width )return ( v >> from ) & ((1 << width) - 1)end'()end end;function a.makeencoder(m,n,o)local p={}for q,r in pairs{[0]='A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9',m or'+',n or'/',o or'='}do p[q]=r:byte()end;return p end;function a.makedecoder(m,n,o)local s={}for q,t in pairs(a.makeencoder(m,n,o))do s[t]=q end;return s end;local u=a.makeencoder()local v=a.makedecoder()local r,w=string.char,table.concat;function a.encode(x,p,y)p=p or u;local z,A,B={},1,#x;local C=B%3;local D={}for k=1,B-C,3 do local E,F,G=x:byte(k,k+2)local f=E*0x10000+F*0x100+G;local H;if y then H=D[f]if not H then H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])D[f]=H end else H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])end;z[A]=H;A=A+1 end;if C==2 then local E,F=x:byte(B-1,B)local f=E*0x10000+F*0x100;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[64])elseif C==1 then local f=x:byte(B)*0x10000;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[64],p[64])end;return w(z)end;function a.decode(I,s,y)s=s or v;local J='[^%w%+%/%=]'if s then local m,n;for t,q in pairs(s)do if q==62 then m=t elseif q==63 then n=t end end;J=('[^%%w%%%s%%%s%%=]'):format(r(m),r(n))end;I=I:gsub(J,'')local D=y and{}local z,A={},1;local B=#I;local K=I:sub(-2)=='=='and 2 or I:sub(-1)=='='and 1 or 0;for k=1,K>0 and B-4 or B,4 do local E,F,G,L=I:byte(k,k+3)local H;if y then local M=E*0x1000000+F*0x10000+G*0x100+L;H=D[M]if not H then local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))D[M]=H end else local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))end;z[A]=H;A=A+1 end;if K==1 then local E,F,G=I:byte(B-3,B-1)local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40;z[A]=r(b(f,16,8),b(f,8,8))elseif K==2 then local E,F=I:byte(B-3,B-2)local f=s[E]*0x40000+s[F]*0x1000;z[A]=r(b(f,16,8))end;return w(z)end;return a
  3. ]]
  4. base64 = load(base64, "@[included]/base64.lua", 't', _ENV)()
  5.  
  6. function saveExtra(resource, filename)
  7.     filename = filename or resource
  8.     local file = assert(io.open(filename, 'w'))
  9.     file:write(EXTRAS[resource])
  10.     file:close()
  11. end
  12. function saveProgram(filename)
  13.     filename = filename or "ssg.lua"
  14.     local file = assert(io.open(filename, 'w'))
  15.     file:write(PROGRAM)
  16.     file:close()
  17. end
  18. function typeY()
  19.     write("Do you want to continue? (Type Y for continue): ")
  20.     local read = read(nil, nil, nil, "N")
  21.     if read ~= 'Y' then
  22.         print("Exiting...")
  23.         error("Terminated", 0)
  24.     end
  25. end
  26. EXTRAS = {
  27. }
  28. PROGRAM = ([[VERSION = 'v1.6.1'
  29. local base64 = <$<local a={}local b=_G.bit32 and _G.bit32.extract;if not b then if _G.bit then local c,d,e=_G.bit.lshift,_G.bit.rshift,_G.bit.band;b=function(f,g,h)return e(d(f,g),c(1,h)-1)end elseif _G._VERSION=="Lua 5.1"then b=function(f,g,h)local i=0;local j=2^g;for k=0,h-1 do local l=j+j;if f%l>=j then i=i+2^k end;j=l end;return i end else b=load'return function( v, from, width )return ( v >> from ) & ((1 << width) - 1)end'()end end;function a.makeencoder(m,n,o)local p={}for q,r in pairs{[0]='A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9',m or'+',n or'/',o or'='}do p[q]=r:byte()end;return p end;function a.makedecoder(m,n,o)local s={}for q,t in pairs(a.makeencoder(m,n,o))do s[t]=q end;return s end;local u=a.makeencoder()local v=a.makedecoder()local r,w=string.char,table.concat;function a.encode(x,p,y)p=p or u;local z,A,B={},1,#x;local C=B%3;local D={}for k=1,B-C,3 do local E,F,G=x:byte(k,k+2)local f=E*0x10000+F*0x100+G;local H;if y then H=D[f]if not H then H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])D[f]=H end else H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])end;z[A]=H;A=A+1 end;if C==2 then local E,F=x:byte(B-1,B)local f=E*0x10000+F*0x100;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[64])elseif C==1 then local f=x:byte(B)*0x10000;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[64],p[64])end;return w(z)end;function a.decode(I,s,y)s=s or v;local J='[^%w%+%/%=]'if s then local m,n;for t,q in pairs(s)do if q==62 then m=t elseif q==63 then n=t end end;J=('[^%%w%%%s%%%s%%=]'):format(r(m),r(n))end;I=I:gsub(J,'')local D=y and{}local z,A={},1;local B=#I;local K=I:sub(-2)=='=='and 2 or I:sub(-1)=='='and 1 or 0;for k=1,K>0 and B-4 or B,4 do local E,F,G,L=I:byte(k,k+3)local H;if y then local M=E*0x1000000+F*0x10000+G*0x100+L;H=D[M]if not H then local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))D[M]=H end else local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))end;z[A]=H;A=A+1 end;if K==1 then local E,F,G=I:byte(B-3,B-1)local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40;z[A]=r(b(f,16,8),b(f,8,8))elseif K==2 then local E,F=I:byte(B-3,B-2)local f=s[E]*0x40000+s[F]*0x1000;z[A]=r(b(f,16,8))end;return w(z)end;return a
  30. >$>
  31. base64 = load(base64, "@[included]/base64.lua", 't', _ENV)()
  32. local modules = {
  33.     ["basalt"] = base64.decode "bG9jYWwgYWE9e31sb2NhbCBiYT10cnVlO2xvY2FsIGNhPXJlcXVpcmUKbG9jYWwgZGE9ZnVuY3Rpb24oYWIpCmZvciBiYixjYiBpbiBwYWlycyhhYSlkbwppZih0eXBlKGNiKT09InRhYmxlIil0aGVuIGZvciBkYixfYyBpbiBwYWlycyhjYilkbyBpZihkYj09YWIpdGhlbgpyZXR1cm4gX2MoKWVuZCBlbmQgZWxzZSBpZihiYj09YWIpdGhlbiByZXR1cm4gY2IoKWVuZCBlbmQgZW5kO3JldHVybiBjYShhYillbmQKbG9jYWwgX2I9ZnVuY3Rpb24oYWIpaWYoYWJ+PW5pbCl0aGVuIHJldHVybiBhYVthYl1lbmQ7cmV0dXJuIGFhIGVuZAphYVsibW9kdWxlIl09ZnVuY3Rpb24oLi4uKXJldHVybgpmdW5jdGlvbihhYilsb2NhbCBiYixjYj1wY2FsbChkYSxhYilyZXR1cm4gYmIgYW5kIGNiIG9yIG5pbCBlbmQgZW5kCmFhWyJGcmFtZSJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgibW9kdWxlIilsb2NhbCBiYj1kYSgiT2JqZWN0IikKbG9jYWwgY2I9ZGEoImxvYWRPYmplY3RzIilsb2NhbCBkYj1kYSgiYmFzYWx0RHJhdyIpbG9jYWwgX2M9ZGEoInV0aWxzIilsb2NhbCBhYz1hYigibGF5b3V0IikKbG9jYWwgYmM9YWIoImJhc2FsdE1vbiIpbG9jYWwgY2M9X2MudXVpZDtsb2NhbCBkYz1fYy5ycGFpcnM7bG9jYWwgX2Q9X2MuZ2V0VmFsdWVGcm9tWE1MO2xvY2FsIGFkPV9jLnRhYmxlQ291bnQKbG9jYWwgYmQsY2QsZGQ9c3RyaW5nLnN1YixtYXRoLm1pbixtYXRoLm1heApyZXR1cm4KZnVuY3Rpb24oX19hLGFfYSxiX2EsY19hKWxvY2FsIGRfYT1iYihfX2EpbG9jYWwgX2FhPSJGcmFtZSJsb2NhbCBhYWE9e31sb2NhbCBiYWE9e31sb2NhbCBjYWE9e31sb2NhbCBkYWE9e31sb2NhbCBfYmE9e31sb2NhbCBhYmE9e30KbG9jYWwgYmJhPXt9bG9jYWwgY2JhPXt9bG9jYWwgZGJhPTA7bG9jYWwgX2NhPWJfYSBvciB0ZXJtLmN1cnJlbnQoKWxvY2FsIGFjYT0iImxvY2FsIGJjYT1mYWxzZQpsb2NhbCBjY2E9ZmFsc2U7bG9jYWwgZGNhPWZhbHNlO2xvY2FsIF9kYT0wO2xvY2FsIGFkYT0wO2xvY2FsIGJkYT1mYWxzZTtsb2NhbCBjZGE9MDtsb2NhbCBkZGE9ZmFsc2U7bG9jYWwgX19iPWZhbHNlO2xvY2FsIGFfYj0iImxvY2FsIGJfYj1mYWxzZQpsb2NhbCBjX2I9ZmFsc2U7bG9jYWwgZF9iO2xvY2FsIF9hYjtsb2NhbCBhYWI9dHJ1ZTtsb2NhbCBiYWI9dHJ1ZTtsb2NhbCBjYWI9ZmFsc2U7bG9jYWwgZGFiPXt9bG9jYWwgX2JiPXt9CmRfYTpzZXRaSW5kZXgoMTApbG9jYWwgYWJiPWRiKF9jYSlsb2NhbCBiYmI9ZmFsc2U7bG9jYWwgY2JiPTE7bG9jYWwgZGJiPTE7bG9jYWwgX2NiPWNvbG9ycy53aGl0ZTtsb2NhbCBhY2IsYmNiPTAsMDtsb2NhbCBjY2I9e30KbG9jYWwgZnVuY3Rpb24gZGNiKGRiYyxfY2MpaWYoX2Njfj0KbmlsKXRoZW4gX2NjOnNldFZhbHVlc0J5WE1MRGF0YShkYmMpZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfZGIoZGJjLF9jYyxhY2MpCmlmKGRiY349bmlsKXRoZW4gaWYoZGJjLnByb3BlcnRpZXN+PW5pbCl0aGVuIGRiYz17ZGJjfWVuZDtmb3IgYmNjLGNjYyBpbiBwYWlycyhkYmMpZG8gbG9jYWwgZGNjPV9jYyhhY2MsCmNjY1siQGlkIl1vciBjYygpKQp0YWJsZS5pbnNlcnQoY2NiLGRjYylkY2IoY2NjLGRjYyllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBhZGIoZGJjKWlmKHR5cGUoZGJjKX49InN0cmluZyIpdGhlbiBkYmM9ZGJjLm5hbWUgZW5kO2ZvciBfY2MsYWNjIGluIHBhaXJzKGFhYSlkbwpmb3IgYmNjLGNjYyBpbgpwYWlycyhhY2MpZG8gaWYoY2NjOmdldE5hbWUoKT09ZGJjKXRoZW4gcmV0dXJuIGNjYyBlbmQgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYmRiKGRiYylsb2NhbCBfY2M9YWRiKGRiYylpZihfY2N+PW5pbCl0aGVuIHJldHVybiBfY2MgZW5kCmZvciBhY2MsYmNjIGluIHBhaXJzKGFhYSlkbwpmb3IgY2NjLGRjYyBpbiBwYWlycyhiY2MpZG8gaWYoCmRjYzpnZXRUeXBlKCk9PSJGcmFtZSIpdGhlbiBsb2NhbCBfZGM9ZGNjOmdldERlZXBPYmplY3QoZGJjKQppZihfZGN+PW5pbCl0aGVuIHJldHVybiBfZGMgZW5kIGVuZCBlbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBjZGIoZGJjKWxvY2FsIF9jYz1kYmM6Z2V0WkluZGV4KCkKaWYoYWRiKGRiYy5uYW1lKX49bmlsKXRoZW4gcmV0dXJuIG5pbCBlbmQKaWYoYWFhW19jY109PW5pbCl0aGVuCmZvciB4PTEsI2JhYSsxIGRvIGlmKGJhYVt4XX49bmlsKXRoZW4gaWYoX2NjPT1iYWFbeF0pdGhlbiBicmVhayBlbmQ7aWYKKF9jYz5iYWFbeF0pdGhlbiB0YWJsZS5pbnNlcnQoYmFhLHgsX2NjKWJyZWFrIGVuZCBlbHNlCnRhYmxlLmluc2VydChiYWEsX2NjKWVuZCBlbmQ7aWYoI2JhYTw9MCl0aGVuIHRhYmxlLmluc2VydChiYWEsX2NjKWVuZDthYWFbX2NjXT17fWVuZDtkYmMucGFyZW50PWNhYTtpZihkYmMuaW5pdH49bmlsKXRoZW4gZGJjOmluaXQoKWVuZAp0YWJsZS5pbnNlcnQoYWFhW19jY10sZGJjKXJldHVybiBkYmMgZW5kCmxvY2FsIGZ1bmN0aW9uIGRkYihkYmMsX2NjKQpmb3IgYWNjLGJjYyBpbiBwYWlycyhkYWEpZG8KZm9yIGNjYyxkY2MgaW4gcGFpcnMoYmNjKWRvCmZvciBfZGMsYWRjIGluIHBhaXJzKGRjYylkbwppZihhZGM9PV9jYyl0aGVuCnRhYmxlLnJlbW92ZShkYWFbYWNjXVtjY2NdLF9kYylpZihkYmMucGFyZW50fj1uaWwpdGhlbiBpZihhZChkYWFbYWNjXSk8PTApdGhlbgpkYmMucGFyZW50OnJlbW92ZUV2ZW50KGFjYyxkYmMpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIF9fYyhkYmMsX2NjKQpmb3IgYWNjLGJjYyBpbiBwYWlycyhhYWEpZG8KZm9yIGNjYyxkY2MgaW4gcGFpcnMoYmNjKWRvCmlmKHR5cGUoX2NjKT09InN0cmluZyIpdGhlbgppZihkY2M6Z2V0TmFtZSgpPT1fY2MpdGhlbgp0YWJsZS5yZW1vdmUoYWFhW2FjY10sY2NjKWRkYihjYWEsZGNjKWRiYzp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQgZWxzZSBpZihkY2M9PV9jYyl0aGVuIHRhYmxlLnJlbW92ZShhYWFbYWNjXSxjY2MpZGRiKGNhYSxkY2MpCmRiYzp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtsb2NhbCBmdW5jdGlvbiBhX2MoZGJjLF9jYyxhY2MpCmZvciBiY2MsY2NjIGluIHBhaXJzKGRhYVtfY2NdKWRvIGZvciBkY2MsX2RjIGluIHBhaXJzKGNjYylkbwppZihfZGM6Z2V0TmFtZSgpPT1hY2MpdGhlbiByZXR1cm4gX2RjIGVuZCBlbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBiX2MoZGJjLF9jYyxhY2MpCmxvY2FsIGJjYz1hY2M6Z2V0WkluZGV4KClpZihkYWFbX2NjXT09bmlsKXRoZW4gZGFhW19jY109e31lbmQ7aWYoX2JhW19jY109PW5pbCl0aGVuCl9iYVtfY2NdPXt9ZW5kCmlmKGFfYyhkYmMsX2NjLGFjYy5uYW1lKX49bmlsKXRoZW4gcmV0dXJuIG5pbCBlbmQKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4gZGJjLnBhcmVudDphZGRFdmVudChfY2MsZGJjKWVuZDtkYWJbX2NjXT10cnVlCmlmKGRhYVtfY2NdW2JjY109PW5pbCl0aGVuCmZvciB4PTEsI19iYVtfY2NdKzEgZG8KaWYKKF9iYVtfY2NdW3hdfj1uaWwpdGhlbiBpZihiY2M9PV9iYVtfY2NdW3hdKXRoZW4gYnJlYWsgZW5kO2lmKGJjYz5fYmFbX2NjXVt4XSl0aGVuCnRhYmxlLmluc2VydChfYmFbX2NjXSx4LGJjYylicmVhayBlbmQgZWxzZQp0YWJsZS5pbnNlcnQoX2JhW19jY10sYmNjKWVuZCBlbmQKaWYoI19iYVtfY2NdPD0wKXRoZW4gdGFibGUuaW5zZXJ0KF9iYVtfY2NdLGJjYyllbmQ7ZGFhW19jY11bYmNjXT17fWVuZDt0YWJsZS5pbnNlcnQoZGFhW19jY11bYmNjXSxhY2MpcmV0dXJuIGFjYyBlbmQKbG9jYWwgZnVuY3Rpb24gY19jKGRiYyxfY2MsYWNjKQppZihkYWFbX2NjXX49bmlsKXRoZW4KZm9yIGJjYyxjY2MgaW4gcGFpcnMoZGFhW19jY10pZG8KZm9yIGRjYyxfZGMgaW4gcGFpcnMoY2NjKWRvCmlmKF9kYz09YWNjKXRoZW4KdGFibGUucmVtb3ZlKGRhYVtfY2NdW2JjY10sZGNjKWlmKCNkYWFbX2NjXVtiY2NdPD0wKXRoZW4gZGFhW19jY11bYmNjXT1uaWwKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4gaWYoCmFkKGRhYVtfY2NdKTw9MCl0aGVuIGRhYltfY2NdPWZhbHNlCmRiYy5wYXJlbnQ6cmVtb3ZlRXZlbnQoX2NjLGRiYyllbmQgZW5kIGVuZDtyZXR1cm4KdHJ1ZSBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtsb2NhbCBkX2M9bWF0aApsb2NhbCBmdW5jdGlvbiBfYWMoZGJjKQpsb2NhbCBfY2MsYWNjPXBjYWxsKGxvYWQoInJldHVybiAiLi5kYmMsIiIsbmlsLHttYXRoPWRfY30pKWlmIG5vdChfY2MpdGhlbgplcnJvcihkYmMuLiIgaXMgbm90IGEgdmFsaWQgZHluYW1pYyBjb2RlIillbmQ7cmV0dXJuIGFjYyBlbmQKbG9jYWwgZnVuY3Rpb24gYWFjKGRiYyxfY2MsYWNjKWZvciBiY2MsY2NjIGluIHBhaXJzKGNiYSlkbwppZihjY2NbMl09PWFjYylhbmQoY2NjWzRdPT1fY2MpdGhlbiByZXR1cm4gY2NjIGVuZCBlbmQ7ZGJhPWRiYSsxCmNiYVtkYmFdPXswLGFjYyx7fSxfY2MsZGJhfXJldHVybiBjYmFbZGJhXWVuZApsb2NhbCBmdW5jdGlvbiBiYWMoZGJjLF9jYylsb2NhbCBhY2M9e31sb2NhbCBiY2M9e31mb3IgY2NjIGluIF9jYzpnbWF0Y2goIiVhKyUueCIpZG8gbG9jYWwgZGNjPWNjYzpnc3ViKCIlLngiLCIiKQppZgooZGNjfj0ic2VsZiIpYW5kKGRjY349InBhcmVudCIpdGhlbiB0YWJsZS5pbnNlcnQoYWNjLGRjYyllbmQgZW5kCmZvciBjY2MgaW4KX2NjOmdtYXRjaCgiJXcrJS55IilkbyBsb2NhbCBkY2M9Y2NjOmdzdWIoIiUueSIsIiIpaWYoZGNjfj0ic2VsZiIpYW5kKGRjY349InBhcmVudCIpdGhlbgp0YWJsZS5pbnNlcnQoYWNjLGRjYyllbmQgZW5kO2ZvciBjY2MgaW4gX2NjOmdtYXRjaCgiJWErJS53IilkbyBsb2NhbCBkY2M9Y2NjOmdzdWIoIiUudyIsIiIpCmlmKGRjY349InNlbGYiKWFuZAooZGNjfj0icGFyZW50Iil0aGVuIHRhYmxlLmluc2VydChhY2MsZGNjKWVuZCBlbmQKZm9yIGNjYyBpbgpfY2M6Z21hdGNoKCIlYSslLmgiKWRvIGxvY2FsIGRjYz1jY2M6Z3N1YigiJS5oIiwiIilpZihkY2N+PSJzZWxmIilhbmQoZGNjfj0icGFyZW50Iil0aGVuCnRhYmxlLmluc2VydChhY2MsZGNjKWVuZCBlbmQKZm9yIGNjYyxkY2MgaW4gcGFpcnMoYWNjKWRvIGJjY1tkY2NdPWFkYihkY2MpaWYoYmNjW2RjY109PW5pbCl0aGVuCmVycm9yKCJEeW5hbWljIFZhbHVlcyAtIHVuYWJsZSB0byBmaW5kIG9iamVjdCAiLi5kY2MpZW5kIGVuZDtiY2NbInNlbGYiXT1kYmM7YmNjWyJwYXJlbnQiXT1kYmM6Z2V0UGFyZW50KClyZXR1cm4gYmNjIGVuZApsb2NhbCBmdW5jdGlvbiBjYWMoZGJjLF9jYylsb2NhbCBhY2M9ZGJjO2ZvciBiY2MgaW4gZGJjOmdtYXRjaCgiJXcrJS54IilkbwphY2M9YWNjOmdzdWIoYmNjLF9jY1tiY2M6Z3N1YigiJS54IiwiIildOmdldFgoKSllbmQ7Zm9yIGJjYyBpbiBkYmM6Z21hdGNoKCIldyslLnkiKWRvCmFjYz1hY2M6Z3N1YihiY2MsX2NjW2JjYzpnc3ViKCIlLnkiLCIiKV06Z2V0WSgpKWVuZDtmb3IgYmNjIGluIGRiYzpnbWF0Y2goIiV3KyUudyIpZG8KYWNjPWFjYzpnc3ViKGJjYyxfY2NbYmNjOmdzdWIoIiUudyIsIiIpXTpnZXRXaWR0aCgpKWVuZDtmb3IgYmNjIGluIGRiYzpnbWF0Y2goIiV3KyUuaCIpZG8KYWNjPWFjYzpnc3ViKGJjYyxfY2NbYmNjOmdzdWIoIiUuaCIsIiIpXTpnZXRIZWlnaHQoKSllbmQ7cmV0dXJuIGFjYyBlbmQKbG9jYWwgZnVuY3Rpb24gZGFjKGRiYykKaWYoI2NiYT4wKXRoZW4KZm9yIG49MSxkYmEgZG8KaWYoY2JhW25dfj1uaWwpdGhlbiBsb2NhbCBfY2M7aWYoI2NiYVtuXVszXTw9MCl0aGVuCmNiYVtuXVszXT1iYWMoY2JhW25dWzRdLGNiYVtuXVsyXSllbmQKX2NjPWNhYyhjYmFbbl1bMl0sY2JhW25dWzNdKWNiYVtuXVsxXT1fYWMoX2NjKWlmKGNiYVtuXVs0XTpnZXRUeXBlKCk9PSJGcmFtZSIpdGhlbgpjYmFbbl1bNF06cmVjYWxjdWxhdGVEeW5hbWljVmFsdWVzKCllbmQgZW5kIGVuZApmb3IgX2NjLGFjYyBpbiBwYWlycyhiYWEpZG8KaWYoYWFhW2FjY11+PW5pbCl0aGVuCmZvciBiY2MsY2NjIGluIHBhaXJzKGFhYVthY2NdKWRvCmlmCihjX2EuZ2V0RHluYW1pY1ZhbHVlRXZlbnRTZXR0aW5nKCkpdGhlbiBpZihjY2MuZXZlbnRIYW5kbGVyfj1uaWwpdGhlbgpjY2M6ZXZlbnRIYW5kbGVyKCJiYXNhbHRfZHluYW1pY3ZhbHVlIixkYmMpZW5kIGVuZDtpZihjY2MuY3VzdG9tRXZlbnRIYW5kbGVyfj1uaWwpdGhlbgpjY2M6Y3VzdG9tRXZlbnRIYW5kbGVyKCJiYXNhbHRfcmVzaXplIixkYmMpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gX2JjKGRiYylyZXR1cm4gY2JhW2RiY11bMV1lbmQKbG9jYWwgZnVuY3Rpb24gYWJjKGRiYylsb2NhbCBfY2M9MApmb3IgYWNjLGJjYyBpbiBwYWlycyhhYWEpZG8KZm9yIGNjYyxkY2MgaW4gcGFpcnMoYmNjKWRvCmlmKApkY2MuZ2V0SGVpZ2h0fj1uaWwpYW5kKGRjYy5nZXRZfj1uaWwpdGhlbgppZgooZGNjOmdldFR5cGUoKT09IkRyb3Bkb3duIil0aGVuIGxvY2FsIF9kYyxhZGM9ZGNjOmdldEhlaWdodCgpLGRjYzpnZXRZKCkKbG9jYWwgYmRjLGNkYz1kY2M6Z2V0RHJvcGRvd25TaXplKClfZGM9X2RjK2NkYy0xCmlmKF9kYythZGMtZGJjOmdldEhlaWdodCgpPj1fY2MpdGhlbiBfY2M9ZGQoCl9kYythZGMtZGJjOmdldEhlaWdodCgpLDApZW5kIGVsc2UgbG9jYWwgX2RjLGFkYz1kY2M6Z2V0SGVpZ2h0KCksZGNjOmdldFkoKWlmKApfZGMrYWRjLWRiYzpnZXRIZWlnaHQoKT49X2NjKXRoZW4KX2NjPWRkKF9kYythZGMtZGJjOmdldEhlaWdodCgpLDApZW5kIGVuZCBlbmQgZW5kIGVuZDtyZXR1cm4gX2NjIGVuZApsb2NhbCBmdW5jdGlvbiBiYmMoZGJjKWxvY2FsIF9jYz0wCmZvciBhY2MsYmNjIGluIHBhaXJzKGFhYSlkbwpmb3IgY2NjLGRjYyBpbiBwYWlycyhiY2MpZG8KaWYKKGRjYy5nZXRXaWR0aH49bmlsKWFuZChkY2MuZ2V0WH49bmlsKXRoZW4gbG9jYWwgX2RjLGFkYz1kY2M6Z2V0V2lkdGgoKSxkY2M6Z2V0WCgpaWYoCl9kYythZGMtZGJjOmdldFdpZHRoKCk+PV9jYyl0aGVuCl9jYz1kZChfZGMrYWRjLWRiYzpnZXRXaWR0aCgpLDApZW5kIGVuZCBlbmQgZW5kO3JldHVybiBfY2MgZW5kO2xvY2FsIGZ1bmN0aW9uIGNiYyhkYmMpaWYoYmFiKXRoZW4gY2RhPWFiYyhkYmMpZW5kIGVuZApjYWE9e2JhckFjdGl2ZT1mYWxzZSxiYXJCYWNrZ3JvdW5kPWNvbG9ycy5ncmF5LGJhclRleHRjb2xvcj1jb2xvcnMuYmxhY2ssYmFyVGV4dD0iTmV3IEZyYW1lIixiYXJUZXh0QWxpZ249ImxlZnQiLGFkZEV2ZW50PWJfYyxyZW1vdmVFdmVudD1jX2MscmVtb3ZlRXZlbnRzPWRkYixnZXRFdmVudD1hX2MsbmV3RHluYW1pY1ZhbHVlPWFhYyxyZWNhbGN1bGF0ZUR5bmFtaWNWYWx1ZXM9ZGFjLGdldER5bmFtaWNWYWx1ZT1fYmMsZ2V0VHlwZT1mdW5jdGlvbihkYmMpcmV0dXJuCl9hYSBlbmQsc2V0WkluZGV4PWZ1bmN0aW9uKGRiYyxfY2MpZF9hLnNldFpJbmRleChkYmMsX2NjKWZvciBhY2MsYmNjIGluIHBhaXJzKGRhYilkbyBpZihiY2MpdGhlbgpkYmMucGFyZW50OmFkZEV2ZW50KGFjYyxkYmMpZW5kIGVuZDtyZXR1cm4gZGJjIGVuZCxzZXRGb2N1c2VkT2JqZWN0PWZ1bmN0aW9uKGRiYyxfY2MpCmlmKApfYWJ+PV9jYyl0aGVuIGlmKF9hYn49bmlsKXRoZW4KaWYoYWRiKF9hYil+PW5pbCl0aGVuIF9hYjpsb3NlRm9jdXNIYW5kbGVyKCllbmQgZW5kO2lmKF9jY349bmlsKXRoZW4gaWYoYWRiKF9jYyl+PW5pbCl0aGVuCl9jYzpnZXRGb2N1c0hhbmRsZXIoKWVuZCBlbmQ7X2FiPV9jYyBlbmQ7cmV0dXJuIGRiYyBlbmQsZ2V0VmFyaWFibGU9ZnVuY3Rpb24oZGJjLF9jYylyZXR1cm4KY19hLmdldFZhcmlhYmxlKF9jYyllbmQsc2V0U2l6ZT1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpCmRfYS5zZXRTaXplKGRiYyxfY2MsYWNjLGJjYylpZihkYmMucGFyZW50PT1uaWwpdGhlbiBhYmI9ZGIoX2NhKWVuZApmb3IgY2NjLGRjYyBpbiBwYWlycyhiYWEpZG8gaWYoYWFhW2RjY11+PW5pbCl0aGVuCmZvciBfZGMsYWRjIGluCnBhaXJzKGFhYVtkY2NdKWRvIGlmKGFkYy5jdXN0b21FdmVudEhhbmRsZXJ+PW5pbCl0aGVuCmFkYzpjdXN0b21FdmVudEhhbmRsZXIoImJhc2FsdF9yZXNpemUiLGRiYyllbmQgZW5kIGVuZCBlbmQ7ZGJjOnJlY2FsY3VsYXRlRHluYW1pY1ZhbHVlcygpYWFiPWZhbHNlO3JldHVybiBkYmMgZW5kLHNldFRoZW1lPWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQppZigKdHlwZShfY2MpPT0idGFibGUiKXRoZW4gYmJhPV9jYyBlbHNlaWYodHlwZShfY2MpPT0ic3RyaW5nIil0aGVuIGJiYVtfY2NdPWFjYyBlbmQ7ZGJjOnVwZGF0ZURyYXcoKXJldHVybiBkYmMgZW5kLGdldFRoZW1lPWZ1bmN0aW9uKGRiYyxfY2MpCnJldHVybgpiYmFbX2NjXW9yKGRiYy5wYXJlbnR+PW5pbCBhbmQgZGJjLnBhcmVudDpnZXRUaGVtZShfY2Mpb3IKY19hLmdldFRoZW1lKF9jYykpZW5kLGdldFRoZW1lQ29sb3I9ZnVuY3Rpb24oZGJjLF9jYylyZXR1cm4KX2Njfj1uaWwgYW5kIF9iYltfY2Ndb3IgX2JiIGVuZCxzZXRUaGVtZUNvbG9yPWZ1bmN0aW9uKGRiYyxfY2MsLi4uKQppZgooZGJjLnBhcmVudD09bmlsKXRoZW4KaWYoZGJjPT1jX2EuZ2V0QWN0aXZlRnJhbWUoKSl0aGVuCmlmKHR5cGUoX2NjKT09InN0cmluZyIpdGhlbiBfYmJbX2NjXT0uLi4KX2NhLnNldFBhbGV0dGVDb2xvcigKdHlwZShfY2MpPT0ibnVtYmVyImFuZCBfY2Mgb3IgY29sb3JzW19jY10sLi4uKWVsc2VpZih0eXBlKF9jYyk9PSJ0YWJsZSIpdGhlbgpmb3IgYWNjLGJjYyBpbiBwYWlycyhfY2MpZG8gX2JiW2FjY109YmNjCmlmKHR5cGUoYmNjKT09Im51bWJlciIpdGhlbgpfY2Euc2V0UGFsZXR0ZUNvbG9yKAp0eXBlKGFjYyk9PSJudW1iZXIiYW5kIGFjYyBvciBjb2xvcnNbYWNjXSxiY2MpZWxzZSBsb2NhbCBjY2MsZGNjLF9kYz10YWJsZS51bnBhY2soYmNjKQpfY2Euc2V0UGFsZXR0ZUNvbG9yKAp0eXBlKGFjYyk9PSJudW1iZXIiYW5kIGFjYyBvciBjb2xvcnNbYWNjXSxjY2MsZGNjLF9kYyllbmQgZW5kIGVuZCBlbmQgZW5kO3JldHVybiBkYmMgZW5kLHNldFBvc2l0aW9uPWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYykKZF9hLnNldFBvc2l0aW9uKGRiYyxfY2MsYWNjLGJjYylkYmM6cmVjYWxjdWxhdGVEeW5hbWljVmFsdWVzKClyZXR1cm4gZGJjIGVuZCxnZXRCYXNhbHRJbnN0YW5jZT1mdW5jdGlvbihkYmMpcmV0dXJuCmNfYSBlbmQsc2V0T2Zmc2V0PWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQphY2I9X2Njfj1uaWwgYW5kCmRfYy5mbG9vcihfY2M8MCBhbmQgZF9jLmFicyhfY2Mpb3ItX2NjKW9yIGFjYgpiY2I9YWNjfj1uaWwgYW5kCmRfYy5mbG9vcihhY2M8MCBhbmQgZF9jLmFicyhhY2Mpb3ItYWNjKW9yIGJjYjtkYmM6dXBkYXRlRHJhdygpcmV0dXJuIGRiYyBlbmQsZ2V0T2Zmc2V0SW50ZXJuYWw9ZnVuY3Rpb24oZGJjKXJldHVybgphY2IsYmNiIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oZGJjKXJldHVybiBhY2I8MCBhbmQgZF9jLmFicyhhY2Ipb3ItYWNiLGJjYjwwIGFuZApkX2MuYWJzKGJjYilvci1iY2IgZW5kLHJlbW92ZUZvY3VzZWRPYmplY3Q9ZnVuY3Rpb24oZGJjKWlmKApfYWJ+PW5pbCl0aGVuCmlmKGFkYihfYWIpfj1uaWwpdGhlbiBfYWI6bG9zZUZvY3VzSGFuZGxlcigpZW5kIGVuZDtfYWI9bmlsO3JldHVybiBkYmMgZW5kLGdldEZvY3VzZWRPYmplY3Q9ZnVuY3Rpb24oZGJjKXJldHVybgpfYWIgZW5kLHNldEN1cnNvcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MsY2NjKQppZihkYmMucGFyZW50fj1uaWwpdGhlbgpsb2NhbCBkY2MsX2RjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpCmRiYy5wYXJlbnQ6c2V0Q3Vyc29yKF9jYyBvciBmYWxzZSwoYWNjIG9yIDApK2RjYy0xLChiY2Mgb3IgMCkrX2RjLTEsCmNjYyBvciBfY2IpZWxzZQpsb2NhbCBkY2MsX2RjPWRiYzpnZXRBYnNvbHV0ZVBvc2l0aW9uKGRiYzpnZXRBbmNob3JQb3NpdGlvbihkYmM6Z2V0WCgpLGRiYzpnZXRZKCksdHJ1ZSkpYmJiPV9jYyBvciBmYWxzZTtpZihhY2N+PW5pbCl0aGVuIGNiYj1kY2MrYWNjLTEgZW5kO2lmKGJjY349bmlsKXRoZW4gZGJiPV9kYysKYmNjLTEgZW5kO19jYj1jY2Mgb3IgX2NiO2lmKGJiYil0aGVuCl9jYS5zZXRUZXh0Q29sb3IoX2NiKV9jYS5zZXRDdXJzb3JQb3MoY2JiLGRiYilfY2Euc2V0Q3Vyc29yQmxpbmsoYmJiKWVsc2UKX2NhLnNldEN1cnNvckJsaW5rKGZhbHNlKWVuZCBlbmQ7cmV0dXJuIGRiYyBlbmQsc2V0TW92YWJsZT1mdW5jdGlvbihkYmMsX2NjKQppZigKZGJjLnBhcmVudH49bmlsKXRoZW4gYl9iPV9jYyBvciBub3QgYl9iCmRiYy5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixkYmMpZGFiWyJtb3VzZV9jbGljayJdPXRydWUKZGJjLnBhcmVudDphZGRFdmVudCgibW91c2VfdXAiLGRiYylkYWJbIm1vdXNlX3VwIl09dHJ1ZQpkYmMucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9kcmFnIixkYmMpZGFiWyJtb3VzZV9kcmFnIl09dHJ1ZSBlbmQ7cmV0dXJuIGRiYyBlbmQsc2V0U2Nyb2xsYWJsZT1mdW5jdGlvbihkYmMsX2NjKWJkYT0oCl9jYyBvciBfY2M9PW5pbClhbmQgdHJ1ZSBvciBmYWxzZQppZigKZGJjLnBhcmVudH49bmlsKXRoZW4gZGJjLnBhcmVudDphZGRFdmVudCgibW91c2Vfc2Nyb2xsIixkYmMpZW5kO2RhYlsibW91c2Vfc2Nyb2xsIl09dHJ1ZTtyZXR1cm4gZGJjIGVuZCxzZXRTY3JvbGxBbW91bnQ9ZnVuY3Rpb24oZGJjLF9jYyljZGE9Cl9jYyBvciBjZGE7YmFiPWZhbHNlO3JldHVybiBkYmMgZW5kLGdldFNjcm9sbEFtb3VudD1mdW5jdGlvbihkYmMpcmV0dXJuIGJhYiBhbmQgY2JjKGRiYylvcgpjZGEgZW5kLGdldENhbGN1bGF0ZWRWZXJ0aWNhbFNjcm9sbD1hYmMsZ2V0Q2FsY3VsYXRlZEhvcml6b250YWxTY3JvbGw9YmJjLHNob3c9ZnVuY3Rpb24oZGJjKWRfYS5zaG93KGRiYykKaWYoCmRiYy5wYXJlbnQ9PW5pbCl0aGVuIGNfYS5zZXRBY3RpdmVGcmFtZShkYmMpCmZvciBfY2MsYWNjIGluIHBhaXJzKGNvbG9ycylkbyBpZgoodHlwZShhY2MpPT0ibnVtYmVyIil0aGVuCl9jYS5zZXRQYWxldHRlQ29sb3IoYWNjLGNvbG9ycy5wYWNrUkdCKHRlcm0ubmF0aXZlUGFsZXR0ZUNvbG9yKChhY2MpKSkpZW5kIGVuZApmb3IgX2NjLGFjYyBpbiBwYWlycyhfYmIpZG8KaWYodHlwZShhY2MpPT0ibnVtYmVyIil0aGVuCl9jYS5zZXRQYWxldHRlQ29sb3IoCnR5cGUoX2NjKT09Im51bWJlciJhbmQgX2NjIG9yIGNvbG9yc1tfY2NdLGFjYyllbHNlIGxvY2FsIGJjYyxjY2MsZGNjPXRhYmxlLnVucGFjayhhY2MpCl9jYS5zZXRQYWxldHRlQ29sb3IoCnR5cGUoX2NjKT09Im51bWJlciJhbmQgX2NjIG9yIGNvbG9yc1tfY2NdLGJjYyxjY2MsZGNjKWVuZCBlbmQKaWYoYmNhKWFuZCBub3QoY2NhKXRoZW4gY19hLnNldE1vbml0b3JGcmFtZShhY2EsZGJjKWVsc2VpZihjY2EpdGhlbgpjX2Euc2V0TW9uaXRvckZyYW1lKGRiYzpnZXROYW1lKCksZGJjLGFjYSllbHNlIGNfYS5zZXRNYWluRnJhbWUoZGJjKWVuZCBlbmQ7cmV0dXJuIGRiYyBlbmQsaGlkZT1mdW5jdGlvbihkYmMpCmRfYS5oaWRlKGRiYykKaWYoZGJjLnBhcmVudD09bmlsKXRoZW4gaWYoYWN0aXZlRnJhbWU9PWRiYyl0aGVuIGFjdGl2ZUZyYW1lPW5pbCBlbmQKaWYoYmNhKWFuZApub3QoY2NhKXRoZW4gaWYoY19hLmdldE1vbml0b3JGcmFtZShhY2EpPT1kYmMpdGhlbgpjX2Euc2V0QWN0aXZlRnJhbWUobmlsKWVuZCBlbHNlaWYoY2NhKXRoZW4KaWYoCmNfYS5nZXRNb25pdG9yRnJhbWUoZGJjOmdldE5hbWUoKSk9PWRiYyl0aGVuIGNfYS5zZXRBY3RpdmVGcmFtZShuaWwpZW5kIGVsc2UKaWYoY19hLmdldE1haW5GcmFtZSgpPT1kYmMpdGhlbiBjX2Euc2V0TWFpbkZyYW1lKG5pbCllbmQgZW5kIGVuZDtyZXR1cm4gZGJjIGVuZCxhZGRMYXlvdXQ9ZnVuY3Rpb24oZGJjLF9jYykKaWYoCl9jY349bmlsKXRoZW4KaWYoZnMuZXhpc3RzKF9jYykpdGhlbiBsb2NhbCBhY2M9ZnMub3BlbihfY2MsInIiKQpsb2NhbCBiY2M9YWM6UGFyc2VYbWxUZXh0KGFjYy5yZWFkQWxsKCkpYWNjLmNsb3NlKCljY2I9e31kYmM6c2V0VmFsdWVzQnlYTUxEYXRhKGJjYyllbmQgZW5kO3JldHVybiBkYmMgZW5kLGdldExhc3RMYXlvdXQ9ZnVuY3Rpb24oZGJjKXJldHVybgpjY2IgZW5kLGFkZExheW91dEZyb21TdHJpbmc9ZnVuY3Rpb24oZGJjLF9jYylpZihfY2N+PW5pbCl0aGVuIGxvY2FsIGFjYz1hYzpQYXJzZVhtbFRleHQoX2NjKQpkYmM6c2V0VmFsdWVzQnlYTUxEYXRhKGFjYyllbmQ7cmV0dXJuIGRiYyBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGRiYyxfY2MpCmRfYS5zZXRWYWx1ZXNCeVhNTERhdGEoZGJjLF9jYylpZihfZCgibW92YWJsZSIsX2NjKX49bmlsKXRoZW4gaWYoX2QoIm1vdmFibGUiLF9jYykpdGhlbgpkYmM6c2V0TW92YWJsZSh0cnVlKWVuZCBlbmQ7aWYoCl9kKCJzY3JvbGxhYmxlIixfY2Mpfj1uaWwpdGhlbgppZihfZCgic2Nyb2xsYWJsZSIsX2NjKSl0aGVuIGRiYzpzZXRTY3JvbGxhYmxlKHRydWUpZW5kIGVuZDtpZgooX2QoIm1vbml0b3IiLF9jYyl+PW5pbCl0aGVuCmRiYzpzZXRNb25pdG9yKF9kKCJtb25pdG9yIixfY2MpKTpzaG93KCllbmQ7aWYoX2QoIm1pcnJvciIsX2NjKX49bmlsKXRoZW4KZGJjOnNldE1pcnJvcihfZCgibWlycm9yIixfY2MpKWVuZAppZihfZCgiYmFyIixfY2Mpfj1uaWwpdGhlbiBpZihfZCgiYmFyIixfY2MpKXRoZW4KZGJjOnNob3dCYXIodHJ1ZSllbHNlIGRiYzpzaG93QmFyKGZhbHNlKWVuZCBlbmQKaWYoX2QoImJhclRleHQiLF9jYyl+PW5pbCl0aGVuIGRiYy5iYXJUZXh0PV9kKCJiYXJUZXh0IixfY2MpZW5kO2lmKF9kKCJiYXJCRyIsX2NjKX49bmlsKXRoZW4KZGJjLmJhckJhY2tncm91bmQ9Y29sb3JzW19kKCJiYXJCRyIsX2NjKV1lbmQ7aWYoX2QoImJhckZHIixfY2Mpfj1uaWwpdGhlbgpkYmMuYmFyVGV4dGNvbG9yPWNvbG9yc1tfZCgiYmFyRkciLF9jYyldZW5kO2lmKF9kKCJiYXJBbGlnbiIsX2NjKX49bmlsKXRoZW4KZGJjLmJhclRleHRBbGlnbj1fZCgiYmFyQWxpZ24iLF9jYyllbmQ7aWYoX2QoImxheW91dCIsX2NjKX49bmlsKXRoZW4KZGJjOmFkZExheW91dChfZCgibGF5b3V0IixfY2MpKWVuZDtpZihfZCgieE9mZnNldCIsX2NjKX49bmlsKXRoZW4KZGJjOnNldE9mZnNldChfZCgieE9mZnNldCIsX2NjKSxiY2IpZW5kO2lmKF9kKCJ5T2Zmc2V0IixfY2Mpfj1uaWwpdGhlbgpkYmM6c2V0T2Zmc2V0KGJjYixfZCgieU9mZnNldCIsX2NjKSllbmQ7aWYoX2QoInNjcm9sbEFtb3VudCIsX2NjKX49bmlsKXRoZW4KZGJjOnNldFNjcm9sbEFtb3VudChfZCgic2Nyb2xsQW1vdW50IixfY2MpKWVuZDtsb2NhbCBhY2M9X2NjOmNoaWxkcmVuKCkKZm9yIGJjYyxjY2MgaW4KcGFpcnMoYWNjKWRvIGlmKGNjYy5fX19uYW1lfj0iYW5pbWF0aW9uIil0aGVuCmxvY2FsIGRjYz1jY2MuX19fbmFtZTpnc3ViKCJeJWwiLHN0cmluZy51cHBlcikKaWYoY2JbZGNjXX49bmlsKXRoZW4gX2RiKGNjYyxkYmNbImFkZCIuLmRjY10sZGJjKWVuZCBlbmQgZW5kO19kYihfY2NbImZyYW1lIl0sZGJjLmFkZEZyYW1lLGRiYykKX2RiKF9jY1siYW5pbWF0aW9uIl0sZGJjLmFkZEFuaW1hdGlvbixkYmMpcmV0dXJuIGRiYyBlbmQsc2hvd0Jhcj1mdW5jdGlvbihkYmMsX2NjKWRiYy5iYXJBY3RpdmU9Cl9jYyBvciBub3QgZGJjLmJhckFjdGl2ZTtkYmM6dXBkYXRlRHJhdygpCnJldHVybiBkYmMgZW5kLHNldEJhcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpZGJjLmJhclRleHQ9X2NjIG9yIiJkYmMuYmFyQmFja2dyb3VuZD0KYWNjIG9yIGRiYy5iYXJCYWNrZ3JvdW5kCmRiYy5iYXJUZXh0Y29sb3I9YmNjIG9yIGRiYy5iYXJUZXh0Y29sb3I7ZGJjOnVwZGF0ZURyYXcoKXJldHVybiBkYmMgZW5kLHNldEJhclRleHRBbGlnbj1mdW5jdGlvbihkYmMsX2NjKWRiYy5iYXJUZXh0QWxpZ249Cl9jYyBvciJsZWZ0ImRiYzp1cGRhdGVEcmF3KClyZXR1cm4gZGJjIGVuZCxzZXRNaXJyb3I9ZnVuY3Rpb24oZGJjLF9jYylpZigKZGJjLnBhcmVudH49bmlsKXRoZW4KZXJyb3IoIkZyYW1lIGhhcyB0byBiZSBhIGJhc2UgZnJhbWUgaW4gb3JkZXIgdG8gYXR0YWNoIGEgbWlycm9yLiIpZW5kO2FfYj1fY2M7aWYobWlycm9yfj1uaWwpdGhlbgphYmIuc2V0TWlycm9yKG1pcnJvcillbmQ7ZGRhPXRydWU7cmV0dXJuIGRiYyBlbmQscmVtb3ZlTWlycm9yPWZ1bmN0aW9uKGRiYyltaXJyb3I9Cm5pbDtkZGE9ZmFsc2U7YWJiLnNldE1pcnJvcihuaWwpcmV0dXJuIGRiYyBlbmQsc2V0TW9uaXRvclNjYWxlPWZ1bmN0aW9uKGRiYyxfY2MpaWYKKGJjYSl0aGVuIF9jYS5zZXRUZXh0U2NhbGUoX2NjKWVuZDtyZXR1cm4gZGJjIGVuZCxzZXRNb25pdG9yPWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQppZigKX2Njfj1uaWwpYW5kKF9jY349ZmFsc2UpdGhlbgppZih0eXBlKF9jYyk9PSJzdHJpbmciKXRoZW4KaWYoCnBlcmlwaGVyYWwuZ2V0VHlwZShfY2MpPT0ibW9uaXRvciIpdGhlbiBfY2E9cGVyaXBoZXJhbC53cmFwKF9jYylkY2E9dHJ1ZSBlbmQKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4gZGJjLnBhcmVudDpyZW1vdmVPYmplY3QoZGJjKWVuZDtiY2E9dHJ1ZTtjX2Euc2V0TW9uaXRvckZyYW1lKF9jYyxkYmMpZWxzZWlmKHR5cGUoX2NjKT09InRhYmxlIil0aGVuCl9jYT1iYyhfY2MpZGNhPXRydWU7YmNhPXRydWU7Y2NhPXRydWUKY19hLnNldE1vbml0b3JGcmFtZShkYmM6Z2V0TmFtZSgpLGRiYyx0cnVlKWVuZCBlbHNlIF9jYT1wYXJlbnRUZXJtaW5hbDtiY2E9ZmFsc2U7Y2NhPWZhbHNlCmlmKHR5cGUoYWNhKT09InN0cmluZyIpdGhlbgppZigKY19hLmdldE1vbml0b3JGcmFtZShhY2EpPT1kYmMpdGhlbiBjX2Euc2V0TW9uaXRvckZyYW1lKGFjYSxuaWwpZW5kIGVsc2UKaWYoY19hLmdldE1vbml0b3JGcmFtZShkYmM6Z2V0TmFtZSgpKT09ZGJjKXRoZW4gY19hLnNldE1vbml0b3JGcmFtZShkYmM6Z2V0TmFtZSgpLApuaWwpZW5kIGVuZCBlbmQ7aWYoYWNjfj1uaWwpdGhlbiBfY2Euc2V0VGV4dFNjYWxlKGFjYyllbmQ7YWJiPWRiKF9jYSkKZGJjOnNldFNpemUoX2NhLmdldFNpemUoKSlhYWI9dHJ1ZTthY2E9X2NjIG9yIG5pbDtkYmM6dXBkYXRlRHJhdygpcmV0dXJuIGRiYyBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihkYmMpCmRfYS5sb3NlRm9jdXNIYW5kbGVyKGRiYylpZihfYWJ+PW5pbCl0aGVuIF9hYjpsb3NlRm9jdXNIYW5kbGVyKClfYWI9bmlsIGVuZCBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGRiYykKZF9hLmdldEZvY3VzSGFuZGxlcihkYmMpCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmlmKGJfYil0aGVuIGRiYy5wYXJlbnQ6cmVtb3ZlRXZlbnRzKGRiYykKZGJjLnBhcmVudDpyZW1vdmVPYmplY3QoZGJjKWRiYy5wYXJlbnQ6YWRkT2JqZWN0KGRiYylmb3IgX2NjLGFjYyBpbiBwYWlycyhkYWIpZG8gaWYoYWNjKXRoZW4KZGJjLnBhcmVudDphZGRFdmVudChfY2MsZGJjKWVuZCBlbmQKZGJjOnVwZGF0ZURyYXcoKWVuZCBlbmQ7aWYoX2Fifj1uaWwpdGhlbiBfYWI6Z2V0Rm9jdXNIYW5kbGVyKCllbmQgZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLC4uLikKZF9hLmV2ZW50SGFuZGxlcihkYmMsX2NjLC4uLikKaWYoZGFhWyJvdGhlcl9ldmVudCJdfj1uaWwpdGhlbgpmb3IgYWNjLGJjYyBpbiBpcGFpcnMoX2JhWyJvdGhlcl9ldmVudCJdKWRvIGlmKApkYWFbIm90aGVyX2V2ZW50Il1bYmNjXX49bmlsKXRoZW4KZm9yIGNjYyxkY2MgaW4gZGMoZGFhWyJvdGhlcl9ldmVudCJdW2JjY10pZG8gaWYKKGRjYy5ldmVudEhhbmRsZXJ+PW5pbCl0aGVuIGRjYzpldmVudEhhbmRsZXIoX2NjLC4uLillbmQgZW5kIGVuZCBlbmQgZW5kCmlmKGFhYilhbmQgbm90KGJjYSl0aGVuIGlmKGRiYy5wYXJlbnQ9PW5pbCl0aGVuCmlmKF9jYz09InRlcm1fcmVzaXplIil0aGVuCmRiYzpzZW5kRXZlbnQoImJhc2FsdF9yZXNpemUiLGRiYyxfY2MsLi4uKWRiYzpzZXRTaXplKF9jYS5nZXRTaXplKCkpYWFiPXRydWUgZW5kIGVuZCBlbmQKaWYoYmNhKXRoZW4KaWYoYWFiKXRoZW4KaWYoX2NjPT0ibW9uaXRvcl9yZXNpemUiKXRoZW4KaWYodHlwZShhY2EpPT0ic3RyaW5nIil0aGVuCmRiYzpzZXRTaXplKF9jYS5nZXRTaXplKCkpZWxzZWlmKHR5cGUoYWNhKT09InRhYmxlIil0aGVuCmZvciBhY2MsYmNjIGluIHBhaXJzKGFjYSlkbyBmb3IgY2NjLGRjYyBpbiBwYWlycyhiY2MpZG8gaWYocDEgPT1kY2MpdGhlbgpkYmM6c2V0U2l6ZShfY2EuZ2V0U2l6ZSgpKWVuZCBlbmQgZW5kIGVuZDthYWI9dHJ1ZTtkYmM6dXBkYXRlRHJhdygpZW5kIGVuZAppZihfY2M9PSJwZXJpcGhlcmFsIilhbmQocDEgPT1hY2EpdGhlbiBpZgoocGVyaXBoZXJhbC5nZXRUeXBlKGFjYSk9PSJtb25pdG9yIil0aGVuIGRjYT10cnVlO19jYT1wZXJpcGhlcmFsLndyYXAoYWNhKWFiYj1kYihfY2EpCmRiYzp1cGRhdGVEcmF3KCllbmQgZW5kCmlmKF9jYz09InBlcmlwaGVyYWxfZGV0YWNoIilhbmQocDEgPT1hY2EpdGhlbiBkY2E9ZmFsc2UgZW5kIGVuZAppZihkZGEpdGhlbiBpZihwZXJpcGhlcmFsLmdldFR5cGUoYV9iKT09Im1vbml0b3IiKXRoZW4gX19iPXRydWUKYWJiLnNldE1pcnJvcihwZXJpcGhlcmFsLndyYXAoYV9iKSllbmQ7aWYoX2NjPT0icGVyaXBoZXJhbF9kZXRhY2giKWFuZAoocDEgPT1hX2IpdGhlbiBkY2E9ZmFsc2UgZW5kCmlmCihfY2M9PSJtb25pdG9yX3RvdWNoIilhbmQoYV9iPT1wMSl0aGVuIGRiYzptb3VzZUhhbmRsZXIoMSxwMixwMyx0cnVlKWVuZCBlbmQgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MsY2NjLGRjYykKaWYKKGNjYSl0aGVuIGlmKF9jYS5jYWxjdWxhdGVDbGlja349bmlsKXRoZW4KYWNjLGJjYz1fY2EuY2FsY3VsYXRlQ2xpY2soZGNjLGFjYyxiY2MpZW5kIGVuZAppZihkX2EubW91c2VIYW5kbGVyKGRiYyxfY2MsYWNjLGJjYyxjY2MpKXRoZW4KaWYoZGFhWyJtb3VzZV9jbGljayJdfj1uaWwpdGhlbgpkYmM6c2V0Q3Vyc29yKGZhbHNlKQpmb3IgX2RjLGFkYyBpbiBpcGFpcnMoX2JhWyJtb3VzZV9jbGljayJdKWRvCmlmCihkYWFbIm1vdXNlX2NsaWNrIl1bYWRjXX49bmlsKXRoZW4gZm9yIGJkYyxjZGMgaW4gZGMoZGFhWyJtb3VzZV9jbGljayJdW2FkY10pZG8KaWYoY2RjLm1vdXNlSGFuZGxlcn49bmlsKXRoZW4gaWYKKGNkYzptb3VzZUhhbmRsZXIoX2NjLGFjYyxiY2MsY2NjKSl0aGVuIHJldHVybiB0cnVlIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kCmlmKGJfYil0aGVuCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFic29sdXRlUG9zaXRpb24oZGJjOmdldEFuY2hvclBvc2l0aW9uKCkpaWYKKGFjYz49X2RjKWFuZChhY2M8PV9kYytkYmM6Z2V0V2lkdGgoKS0xKWFuZChiY2M9PWFkYyl0aGVuIGNfYj10cnVlO19kYT1fZGMtYWNjCmFkYT15T2ZmIGFuZCAxIG9yIDAgZW5kIGVuZDtkYmM6cmVtb3ZlRm9jdXNlZE9iamVjdCgpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjKWlmCihjX2IpdGhlbiBjX2I9ZmFsc2UgZW5kCmlmKGRfYS5tb3VzZVVwSGFuZGxlcihkYmMsX2NjLGFjYyxiY2MpKXRoZW4KaWYKKGRhYVsibW91c2VfdXAiXX49bmlsKXRoZW4KZm9yIGNjYyxkY2MgaW4gaXBhaXJzKF9iYVsibW91c2VfdXAiXSlkbwppZihkYWFbIm1vdXNlX3VwIl1bZGNjXX49bmlsKXRoZW4KZm9yIF9kYyxhZGMgaW4KZGMoZGFhWyJtb3VzZV91cCJdW2RjY10pZG8gaWYoYWRjLm1vdXNlVXBIYW5kbGVyfj1uaWwpdGhlbgppZihhZGM6bW91c2VVcEhhbmRsZXIoX2NjLGFjYyxiY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpCmlmCihkX2Euc2Nyb2xsSGFuZGxlcihkYmMsX2NjLGFjYyxiY2MpKXRoZW4KaWYoZGFhWyJtb3VzZV9zY3JvbGwiXX49bmlsKXRoZW4KZm9yIGRjYyxfZGMgaW4gcGFpcnMoX2JhWyJtb3VzZV9zY3JvbGwiXSlkbwppZigKZGFhWyJtb3VzZV9zY3JvbGwiXVtfZGNdfj1uaWwpdGhlbgpmb3IgYWRjLGJkYyBpbiBkYyhkYWFbIm1vdXNlX3Njcm9sbCJdW19kY10pZG8gaWYoYmRjLnNjcm9sbEhhbmRsZXJ+PQpuaWwpdGhlbgppZihiZGM6c2Nyb2xsSGFuZGxlcihfY2MsYWNjLGJjYykpdGhlbiByZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZDtsb2NhbCBjY2M9YmNiCmlmKGJkYSl0aGVuIGNiYyhkYmMpaWYoX2NjPjApb3IoX2NjPDApdGhlbgpiY2I9ZGQoY2QoYmNiLV9jYywwKSwtY2RhKWRiYzp1cGRhdGVEcmF3KCllbmQgZW5kO2lmKGJjYj09Y2NjKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDtkYmM6cmVtb3ZlRm9jdXNlZE9iamVjdCgpCnJldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGhvdmVySGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpCmlmCihkX2EuaG92ZXJIYW5kbGVyKGRiYyxfY2MsYWNjLGJjYykpdGhlbgppZihkYWFbIm1vdXNlX21vdmUiXX49bmlsKXRoZW4KZm9yIGNjYyxkY2MgaW4gcGFpcnMoX2JhWyJtb3VzZV9tb3ZlIl0pZG8KaWYoCmRhYVsibW91c2VfbW92ZSJdW2RjY11+PW5pbCl0aGVuIGZvciBfZGMsYWRjIGluIGRjKGRhYVsibW91c2VfbW92ZSJdW2RjY10pZG8KaWYKKGFkYy5ob3ZlckhhbmRsZXJ+PW5pbCl0aGVuIGlmKGFkYzpob3ZlckhhbmRsZXIoX2NjLGFjYyxiY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kO3JldHVybiBmYWxzZSBlbmQsZHJhZ0hhbmRsZXI9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjKQppZgooY19iKXRoZW4gbG9jYWwgY2NjLGRjYz1kYmMucGFyZW50OmdldE9mZnNldEludGVybmFsKCljY2M9Y2NjPDAgYW5kCmRfYy5hYnMoY2NjKW9yLWNjYztkY2M9ZGNjPDAgYW5kIGRfYy5hYnMoZGNjKW9yLQpkY2M7bG9jYWwgX2RjPTE7bG9jYWwgYWRjPTE7aWYoZGJjLnBhcmVudH49bmlsKXRoZW4KX2RjLGFkYz1kYmMucGFyZW50OmdldEFic29sdXRlUG9zaXRpb24oZGJjLnBhcmVudDpnZXRBbmNob3JQb3NpdGlvbigpKWVuZApkYmM6c2V0UG9zaXRpb24oCmFjYytfZGEtIChfZGMtMSkrY2NjLGJjYythZGEtIChhZGMtMSkrZGNjKWRiYzp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQKaWYoZGJjOmlzVmlzaWJsZSgpKWFuZChkYmM6aXNFbmFibGVkKCkpdGhlbgppZgooZGFhWyJtb3VzZV9kcmFnIl1+PW5pbCl0aGVuCmZvciBjY2MsZGNjIGluIGlwYWlycyhfYmFbIm1vdXNlX2RyYWciXSlkbwppZgooZGFhWyJtb3VzZV9kcmFnIl1bZGNjXX49bmlsKXRoZW4gZm9yIF9kYyxhZGMgaW4gZGMoZGFhWyJtb3VzZV9kcmFnIl1bZGNjXSlkbwppZihhZGMuZHJhZ0hhbmRsZXJ+PW5pbCl0aGVuIGlmCihhZGM6ZHJhZ0hhbmRsZXIoX2NjLGFjYyxiY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kO2RfYS5kcmFnSGFuZGxlcihkYmMsX2NjLGFjYyxiY2MpcmV0dXJuIGZhbHNlIGVuZCxrZXlIYW5kbGVyPWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQppZgooZGJjOmlzRm9jdXNlZCgpKW9yKGRiYy5wYXJlbnQ9PW5pbCl0aGVuCmxvY2FsIGJjYz1kYmM6Z2V0RXZlbnRTeXN0ZW0oKTpzZW5kRXZlbnQoImtleSIsZGJjLCJrZXkiLF9jYylpZihiY2M9PWZhbHNlKXRoZW4gcmV0dXJuIGZhbHNlIGVuZAppZihkYWFbImtleSJdfj1uaWwpdGhlbgpmb3IgY2NjLGRjYyBpbiBwYWlycyhfYmFbImtleSJdKWRvCmlmKApkYWFbImtleSJdW2RjY11+PW5pbCl0aGVuCmZvciBfZGMsYWRjIGluIGRjKGRhYVsia2V5Il1bZGNjXSlkbyBpZihhZGMua2V5SGFuZGxlcn49bmlsKXRoZW4gaWYKKGFkYzprZXlIYW5kbGVyKF9jYyxhY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kO3JldHVybiBmYWxzZSBlbmQsa2V5VXBIYW5kbGVyPWZ1bmN0aW9uKGRiYyxfY2MpCmlmCihkYmM6aXNGb2N1c2VkKCkpb3IoZGJjLnBhcmVudD09bmlsKXRoZW4KbG9jYWwgYWNjPWRiYzpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgia2V5X3VwIixkYmMsImtleV91cCIsX2NjKWlmKGFjYz09ZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kCmlmKGRhYVsia2V5X3VwIl1+PW5pbCl0aGVuCmZvciBiY2MsY2NjIGluCnBhaXJzKF9iYVsia2V5X3VwIl0pZG8KaWYoZGFhWyJrZXlfdXAiXVtjY2Ndfj1uaWwpdGhlbiBmb3IgZGNjLF9kYyBpbiBkYyhkYWFbImtleV91cCJdW2NjY10pZG8KaWYoCl9kYy5rZXlVcEhhbmRsZXJ+PW5pbCl0aGVuIGlmKF9kYzprZXlVcEhhbmRsZXIoX2NjKSl0aGVuIHJldHVybiB0cnVlIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGNoYXJIYW5kbGVyPWZ1bmN0aW9uKGRiYyxfY2MpCmlmCihkYmM6aXNGb2N1c2VkKCkpb3IoZGJjLnBhcmVudD09bmlsKXRoZW4KbG9jYWwgYWNjPWRiYzpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgiY2hhciIsZGJjLCJjaGFyIixfY2MpaWYoYWNjPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQKaWYoZGFhWyJjaGFyIl1+PW5pbCl0aGVuCmZvciBiY2MsY2NjIGluCnBhaXJzKF9iYVsiY2hhciJdKWRvCmlmKGRhYVsiY2hhciJdW2NjY11+PW5pbCl0aGVuIGZvciBkY2MsX2RjIGluIGRjKGRhYVsiY2hhciJdW2NjY10pZG8KaWYKKF9kYy5jaGFySGFuZGxlcn49bmlsKXRoZW4gaWYoX2RjOmNoYXJIYW5kbGVyKF9jYykpdGhlbiByZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxzZXRUZXh0PWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYykKbG9jYWwgY2NjLGRjYz1kYmM6Z2V0QW5jaG9yUG9zaXRpb24oKQppZihhY2M+PTEpYW5kKGFjYzw9ZGJjOmdldEhlaWdodCgpKXRoZW4KaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpzZXRUZXh0KGRkKApfY2MrIChjY2MtMSksY2NjKSxkY2MrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKApkYmM6Z2V0V2lkdGgoKS1fY2MrMSwxKSkpZWxzZQphYmIuc2V0VGV4dChkZChfY2MrIChjY2MtMSksY2NjKSxkY2MrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKApkYmM6Z2V0V2lkdGgoKS1fY2MrMSwxKSkpZW5kIGVuZCBlbmQsc2V0Qkc9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjKQpsb2NhbCBjY2MsZGNjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpCmlmKGFjYz49MSlhbmQoYWNjPD1kYmM6Z2V0SGVpZ2h0KCkpdGhlbgppZihkYmMucGFyZW50fj1uaWwpdGhlbgpkYmMucGFyZW50OnNldEJHKGRkKApfY2MrIChjY2MtMSksY2NjKSxkY2MrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKApkYmM6Z2V0V2lkdGgoKS1fY2MrMSwxKSkpZWxzZQphYmIuc2V0QkcoZGQoX2NjKyAoY2NjLTEpLGNjYyksZGNjK2FjYy0xLGJkKGJjYyxkZCgxIC1fY2MrMSwxKSxkZCgKZGJjOmdldFdpZHRoKCktX2NjKzEsMSkpKWVuZCBlbmQgZW5kLHNldEZHPWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYykKbG9jYWwgY2NjLGRjYz1kYmM6Z2V0QW5jaG9yUG9zaXRpb24oKQppZihhY2M+PTEpYW5kKGFjYzw9ZGJjOmdldEhlaWdodCgpKXRoZW4KaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpzZXRGRyhkZCgKX2NjKyAoY2NjLTEpLGNjYyksZGNjK2FjYy0xLGJkKGJjYyxkZCgxIC1fY2MrMSwxKSxkZCgKZGJjOmdldFdpZHRoKCktX2NjKzEsMSkpKWVsc2UKYWJiLnNldEZHKGRkKF9jYysgKGNjYy0xKSxjY2MpLGRjYythY2MtMSxiZChiY2MsZGQoMSAtX2NjKzEsMSksZGQoCmRiYzpnZXRXaWR0aCgpLV9jYysxLDEpKSllbmQgZW5kIGVuZCx3cml0ZVRleHQ9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjLGNjYyxkY2MpCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFuY2hvclBvc2l0aW9uKCkKaWYoYWNjPj0xKWFuZChhY2M8PWRiYzpnZXRIZWlnaHQoKSl0aGVuCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmRiYy5wYXJlbnQ6d3JpdGVUZXh0KGRkKApfY2MrIChfZGMtMSksX2RjKSxhZGMrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLApkYmM6Z2V0V2lkdGgoKS1fY2MrMSksY2NjLGRjYyllbHNlCmFiYi53cml0ZVRleHQoZGQoX2NjKyAoX2RjLTEpLF9kYyksYWRjK2FjYy0xLGJkKGJjYyxkZCgxIC1fY2MrMSwxKSxkZCgKZGJjOmdldFdpZHRoKCktX2NjKzEsMSkpLGNjYyxkY2MpZW5kIGVuZCBlbmQsYmxpdD1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MsY2NjLGRjYykKbG9jYWwgX2RjLGFkYz1kYmM6Z2V0QW5jaG9yUG9zaXRpb24oKQppZihhY2M+PTEpYW5kKGFjYzw9ZGJjOmdldEhlaWdodCgpKXRoZW4KbG9jYWwgYmRjPWRiYzpnZXRXaWR0aCgpCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmJjYz1iZChiY2MsZGQoMSAtX2NjKzEsMSksYmRjLV9jYysxKWNjYz1iZChjY2MsZGQoMSAtX2NjKzEsMSksYmRjLV9jYysxKWRjYz1iZChkY2MsZGQoCjEgLV9jYysxLDEpLGJkYy1fY2MrMSkKZGJjLnBhcmVudDpibGl0KGRkKApfY2MrIChfZGMtMSksX2RjKSxhZGMrYWNjLTEsYmNjLGNjYyxkY2MpZWxzZQpiY2M9YmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKGJkYy1fY2MrMSwxKSkKY2NjPWJkKGNjYyxkZCgxIC1fY2MrMSwxKSxkZChiZGMtX2NjKzEsMSkpCmRjYz1iZChkY2MsZGQoMSAtX2NjKzEsMSksZGQoYmRjLV9jYysxLDEpKQphYmIuYmxpdChkZChfY2MrIChfZGMtMSksX2RjKSxhZGMrYWNjLTEsYmNjLGNjYyxkY2MpZW5kIGVuZCBlbmQsZHJhd0JhY2tncm91bmRCb3g9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjLGNjYyxkY2MpCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFuY2hvclBvc2l0aW9uKCkKY2NjPShhY2M8MSBhbmQoCmNjYythY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKW9yIGNjYythY2MtMSlvcigKY2NjKwphY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKS1hY2MrMSBvciBjY2MpKQpiY2M9KF9jYzwxIGFuZChiY2MrX2NjPmRiYzpnZXRXaWR0aCgpYW5kIGRiYzpnZXRXaWR0aCgpb3IgYmNjKwpfY2MtMSlvcigKCmJjYytfY2M+ZGJjOmdldFdpZHRoKClhbmQgZGJjOmdldFdpZHRoKCktX2NjKzEgb3IgYmNjKSkKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbHNlCmFiYi5kcmF3QmFja2dyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbmQgZW5kLGRyYXdUZXh0Qm94PWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYyxjY2MsZGNjKQpsb2NhbCBfZGMsYWRjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpCmNjYz0oYWNjPDEgYW5kKApjY2MrYWNjPmRiYzpnZXRIZWlnaHQoKWFuZCBkYmM6Z2V0SGVpZ2h0KClvciBjY2MrYWNjLTEpb3IoCmNjYysKYWNjPmRiYzpnZXRIZWlnaHQoKWFuZCBkYmM6Z2V0SGVpZ2h0KCktYWNjKzEgb3IgY2NjKSkKYmNjPShfY2M8MSBhbmQoYmNjK19jYz5kYmM6Z2V0V2lkdGgoKWFuZCBkYmM6Z2V0V2lkdGgoKW9yIGJjYysKX2NjLTEpb3IoCgpiY2MrX2NjPmRiYzpnZXRXaWR0aCgpYW5kIGRiYzpnZXRXaWR0aCgpLV9jYysxIG9yIGJjYykpCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmRiYy5wYXJlbnQ6ZHJhd1RleHRCb3goZGQoX2NjKyAoX2RjLTEpLF9kYyksZGQoYWNjKyAoYWRjLTEpLGFkYyksYmNjLGNjYyxiZChkY2MsMSwxKSllbHNlCmFiYi5kcmF3VGV4dEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGJkKGRjYywxLDEpKWVuZCBlbmQsZHJhd0ZvcmVncm91bmRCb3g9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjLGNjYyxkY2MpCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFuY2hvclBvc2l0aW9uKCkKY2NjPShhY2M8MSBhbmQoCmNjYythY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKW9yIGNjYythY2MtMSlvcigKY2NjKwphY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKS1hY2MrMSBvciBjY2MpKQpiY2M9KF9jYzwxIGFuZChiY2MrX2NjPmRiYzpnZXRXaWR0aCgpYW5kIGRiYzpnZXRXaWR0aCgpb3IgYmNjKwpfY2MtMSlvcigKCmJjYytfY2M+ZGJjOmdldFdpZHRoKClhbmQgZGJjOmdldFdpZHRoKCktX2NjKzEgb3IgYmNjKSkKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbHNlCmFiYi5kcmF3Rm9yZWdyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbmQgZW5kLGRyYXc9ZnVuY3Rpb24oZGJjLF9jYylpZgooYmNhKWFuZCBub3QoZGNhKXRoZW4gcmV0dXJuIGZhbHNlIGVuZAppZihkYmMucGFyZW50PT1uaWwpdGhlbiBpZihkYmM6Z2V0RHJhdygpPT0KZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kIGVuZAppZihkX2EuZHJhdyhkYmMpKXRoZW4KbG9jYWwgYWNjLGJjYz1kYmM6Z2V0QWJzb2x1dGVQb3NpdGlvbihkYmM6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBjY2MsZGNjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgX2RjLGFkYz1kYmM6Z2V0U2l6ZSgpCmlmKApkYmMucGFyZW50PT1uaWwpdGhlbgppZihkYmMuYmdDb2xvcn49ZmFsc2UpdGhlbgphYmIuZHJhd0JhY2tncm91bmRCb3goY2NjLGRjYyxfZGMsYWRjLGRiYy5iZ0NvbG9yKWFiYi5kcmF3VGV4dEJveChjY2MsZGNjLF9kYyxhZGMsIiAiKWVuZDtpZihkYmMuZmdDb2xvcn49ZmFsc2UpdGhlbgphYmIuZHJhd0ZvcmVncm91bmRCb3goY2NjLGRjYyxfZGMsYWRjLGRiYy5mZ0NvbG9yKWVuZCBlbmQKaWYoZGJjLmJhckFjdGl2ZSl0aGVuCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmRiYy5wYXJlbnQ6d3JpdGVUZXh0KGNjYyxkY2MsX2MuZ2V0VGV4dEhvcml6b250YWxBbGlnbihkYmMuYmFyVGV4dCxfZGMsZGJjLmJhclRleHRBbGlnbiksZGJjLmJhckJhY2tncm91bmQsZGJjLmJhclRleHRjb2xvcillbHNlCmFiYi53cml0ZVRleHQoY2NjLGRjYyxfYy5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKGRiYy5iYXJUZXh0LF9kYyxkYmMuYmFyVGV4dEFsaWduKSxkYmMuYmFyQmFja2dyb3VuZCxkYmMuYmFyVGV4dGNvbG9yKWVuZAppZihkYmM6Z2V0Qm9yZGVyKCJsZWZ0IikpdGhlbgppZihkYmMucGFyZW50fj1uaWwpdGhlbgpkYmMucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGNjYy0xLGRjYywxLDEsZGJjLmJhckJhY2tncm91bmQpaWYoZGJjLmJnQ29sb3J+PWZhbHNlKXRoZW4KZGJjLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChjY2MtMSxkY2MrMSwxLGFkYy0xLGRiYy5iZ0NvbG9yKWVuZCBlbmQgZW5kCmlmKGRiYzpnZXRCb3JkZXIoInRvcCIpKXRoZW4gaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChjY2MtMSxkY2MtMSxfZGMrMSwxLGRiYy5iYXJCYWNrZ3JvdW5kKWVuZCBlbmQgZW5kO2ZvciBiZGMsY2RjIGluIGRjKGJhYSlkbwppZihhYWFbY2RjXX49bmlsKXRoZW4gZm9yIGRkYyxfX2QgaW4gcGFpcnMoYWFhW2NkY10pZG8KaWYoX19kLmRyYXd+PW5pbCl0aGVuIF9fZDpkcmF3KCllbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCx1cGRhdGVUZXJtPWZ1bmN0aW9uKGRiYylpZgooYmNhKWFuZCBub3QoZGNhKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDthYmIudXBkYXRlKCllbmQsYWRkT2JqZWN0PWZ1bmN0aW9uKGRiYyxfY2MpcmV0dXJuCmNkYihfY2MpZW5kLHJlbW92ZU9iamVjdD1fX2MsZ2V0T2JqZWN0PWZ1bmN0aW9uKGRiYyxfY2MpcmV0dXJuIGFkYihfY2MpZW5kLGdldERlZXBPYmplY3Q9ZnVuY3Rpb24oZGJjLF9jYylyZXR1cm4gYmRiKF9jYyllbmQsYWRkRnJhbWU9ZnVuY3Rpb24oZGJjLF9jYylsb2NhbCBhY2M9Y19hLm5ld0ZyYW1lKApfY2Mgb3IgY2MoKSxkYmMsbmlsLGNfYSlyZXR1cm4gY2RiKGFjYyllbmQsaW5pdD1mdW5jdGlvbihkYmMpCmlmCm5vdChjYWIpdGhlbgppZihhX2F+PW5pbCl0aGVuIGRfYS53aWR0aCxkX2EuaGVpZ2h0PWFfYTpnZXRTaXplKCkKZGJjOnNldEJhY2tncm91bmQoYV9hOmdldFRoZW1lKCJGcmFtZUJHIikpCmRiYzpzZXRGb3JlZ3JvdW5kKGFfYTpnZXRUaGVtZSgiRnJhbWVUZXh0IikpZWxzZSBkX2Eud2lkdGgsZF9hLmhlaWdodD1fY2EuZ2V0U2l6ZSgpCmRiYzpzZXRCYWNrZ3JvdW5kKGNfYS5nZXRUaGVtZSgiQmFzYWx0QkciKSkKZGJjOnNldEZvcmVncm91bmQoY19hLmdldFRoZW1lKCJCYXNhbHRUZXh0IikpZW5kO2NhYj10cnVlIGVuZCBlbmR9CmZvciBkYmMsX2NjIGluIHBhaXJzKGNiKWRvIGNhYVsiYWRkIi4uZGJjXT1mdW5jdGlvbihhY2MsYmNjKQpyZXR1cm4gY2RiKF9jYyhiY2Mgb3IgY2MoKSxhY2MpKWVuZCBlbmQ7c2V0bWV0YXRhYmxlKGNhYSxkX2EpcmV0dXJuIGNhYSBlbmQgZW5kCmFhWyJsb2FkT2JqZWN0cyJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj17fWlmKGJhKXRoZW4KZm9yIGRiLF9jIGluIHBhaXJzKF9iKCJvYmplY3RzIikpZG8gYWJbZGJdPV9jKCllbmQ7cmV0dXJuIGFiIGVuZDtsb2NhbCBiYj10YWJsZS5wYWNrKC4uLilsb2NhbCBjYj1mcy5nZXREaXIoCmJiWzJdb3IiQmFzYWx0IilpZihjYj09bmlsKXRoZW4KZXJyb3IoIlVuYWJsZSB0byBmaW5kIGRpcmVjdG9yeSAiLi5iYlsyXS4uCiIgcGxlYXNlIHJlcG9ydCB0aGlzIGJ1ZyB0byBvdXIgZGlzY29yZC4iKWVuZDtmb3IgZGIsX2MgaW4KcGFpcnMoZnMubGlzdChmcy5jb21iaW5lKGNiLCJvYmplY3RzIikpKWRvCmlmKF9jfj0iZXhhbXBsZS5sdWEiKXRoZW4gbG9jYWwgYWM9X2M6Z3N1YigiLmx1YSIsIiIpYWJbYWNdPWRhKGFjKWVuZCBlbmQ7cmV0dXJuIGFiIGVuZAphYVsibWFpbiJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiYmFzYWx0RXZlbnQiKSgpbG9jYWwgYmI9ZGEoIkZyYW1lIikKbG9jYWwgY2I9ZGEoInRoZW1lIilsb2NhbCBkYj1kYSgidXRpbHMiKWxvY2FsIF9jPWRhKCJiYXNhbHRMb2dzIilsb2NhbCBhYz1kYi51dWlkCmxvY2FsIGJjPWRiLmNyZWF0ZVRleHQ7bG9jYWwgY2M9ZGIudGFibGVDb3VudDtsb2NhbCBkYz0zMDA7bG9jYWwgX2Q9NTA7bG9jYWwgYWQ9dGVybS5jdXJyZW50KClsb2NhbCBiZD0iMS42LjQibG9jYWwgY2Q9ZnMuZ2V0RGlyKAp0YWJsZS5wYWNrKC4uLilbMl1vciIiKQpsb2NhbCBkZCxfX2EsYV9hLGJfYSxjX2EsZF9hPXt9LHt9LHt9LHt9LHt9LHt9bG9jYWwgX2FhLGFhYSxiYWEsY2FhO2xvY2FsIGRhYT17fWlmCm5vdCB0ZXJtLmlzQ29sb3Igb3Igbm90IHRlcm0uaXNDb2xvcigpdGhlbgplcnJvcignQmFzYWx0IHJlcXVpcmVzIGFuIGFkdmFuY2VkIChnb2xkZW4pIGNvbXB1dGVyIHRvIHJ1bi4nLDApZW5kO2xvY2FsIF9iYT17fQpmb3IgZGFiLF9iYiBpbgpwYWlycyhjb2xvcnMpZG8gaWYodHlwZShfYmIpPT0ibnVtYmVyIil0aGVuCl9iYVtkYWJdPXthZC5nZXRQYWxldHRlQ29sb3IoX2JiKX1lbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIGFiYSgpY2FhPWZhbHNlO2FkLmNsZWFyKClhZC5zZXRDdXJzb3JQb3MoMSwxKQpmb3IgZGFiLF9iYiBpbiBwYWlycyhjb2xvcnMpZG8gaWYodHlwZShfYmIpPT0KIm51bWJlciIpdGhlbgphZC5zZXRQYWxldHRlQ29sb3IoX2JiLGNvbG9ycy5wYWNrUkdCKHRhYmxlLnVucGFjayhfYmFbZGFiXSkpKWVuZCBlbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIGJiYShkYWIpYWQuY2xlYXIoKWFkLnNldEJhY2tncm91bmRDb2xvcihjb2xvcnMuYmxhY2spCmFkLnNldFRleHRDb2xvcihjb2xvcnMucmVkKWxvY2FsIF9iYixhYmI9YWQuZ2V0U2l6ZSgpaWYoZGFhLmxvZ2dpbmcpdGhlbiBfYyhkYWIsIkVycm9yIillbmQ7bG9jYWwgYmJiPWJjKAoiQmFzYWx0IGVycm9yOiAiLi5kYWIsX2JiKWxvY2FsIGNiYj0xO2ZvciBkYmIsX2NiIGluIHBhaXJzKGJiYilkbwphZC5zZXRDdXJzb3JQb3MoMSxjYmIpYWQud3JpdGUoX2NiKWNiYj1jYmIrMSBlbmQ7YWQuc2V0Q3Vyc29yUG9zKDEsCmNiYisxKWNhYT1mYWxzZSBlbmQKbG9jYWwgZnVuY3Rpb24gY2JhKGRhYikKYXNzZXJ0KGRhYn49ImZ1bmN0aW9uIiwiU2NoZWR1bGUgbmVlZHMgYSBmdW5jdGlvbiBpbiBvcmRlciB0byB3b3JrISIpCnJldHVybiBmdW5jdGlvbiguLi4pbG9jYWwgX2JiPWNvcm91dGluZS5jcmVhdGUoZGFiKQpsb2NhbCBhYmIsYmJiPWNvcm91dGluZS5yZXN1bWUoX2JiLC4uLikKaWYoYWJiKXRoZW4gdGFibGUuaW5zZXJ0KGRfYSx7X2JiLGJiYn0pZWxzZSBiYmEoYmJiKWVuZCBlbmQgZW5kO2xvY2FsIGRiYT1mdW5jdGlvbihkYWIsX2JiKWNfYVtkYWJdPV9iYiBlbmQKbG9jYWwgX2NhPWZ1bmN0aW9uKGRhYilyZXR1cm4gY19hW2RhYl1lbmQ7bG9jYWwgYWNhPWZ1bmN0aW9uKGRhYiljYj1kYWIgZW5kCmxvY2FsIGJjYT1mdW5jdGlvbihkYWIpcmV0dXJuIGNiW2RhYl1lbmQKbG9jYWwgY2NhPXtnZXREeW5hbWljVmFsdWVFdmVudFNldHRpbmc9ZnVuY3Rpb24oKXJldHVybiBkYWEuZHluYW1pY1ZhbHVlRXZlbnRzIGVuZCxnZXRNYWluRnJhbWU9ZnVuY3Rpb24oKXJldHVybiBfYWEgZW5kLHNldFZhcmlhYmxlPWRiYSxnZXRWYXJpYWJsZT1fY2EsZ2V0VGhlbWU9YmNhLHNldE1haW5GcmFtZT1mdW5jdGlvbihkYWIpCl9hYT1kYWIgZW5kLGdldEFjdGl2ZUZyYW1lPWZ1bmN0aW9uKClyZXR1cm4gYWFhIGVuZCxzZXRBY3RpdmVGcmFtZT1mdW5jdGlvbihkYWIpYWFhPWRhYiBlbmQsZ2V0Rm9jdXNlZE9iamVjdD1mdW5jdGlvbigpcmV0dXJuIGJhYSBlbmQsc2V0Rm9jdXNlZE9iamVjdD1mdW5jdGlvbihkYWIpYmFhPWRhYiBlbmQsZ2V0TW9uaXRvckZyYW1lPWZ1bmN0aW9uKGRhYilyZXR1cm4KYV9hW2RhYl1vciBiX2FbZGFiXVsxXWVuZCxzZXRNb25pdG9yRnJhbWU9ZnVuY3Rpb24oZGFiLF9iYixhYmIpaWYoX2FhPT1fYmIpdGhlbgpfYWE9bmlsIGVuZAppZihhYmIpdGhlbiBiX2FbZGFiXT17X2JiLHNpZGVzfWVsc2UgYV9hW2RhYl09X2JiIGVuZDtpZihfYmI9PW5pbCl0aGVuIGJfYVtkYWJdPW5pbCBlbmQgZW5kLGdldEJhc2VUZXJtPWZ1bmN0aW9uKClyZXR1cm4KYWQgZW5kLHNjaGVkdWxlPWNiYSxzdG9wPWFiYSxuZXdGcmFtZT1iYixnZXREaXJlY3Rvcnk9ZnVuY3Rpb24oKXJldHVybiBjZCBlbmR9CmxvY2FsIGZ1bmN0aW9uIGRjYShkYWIsLi4uKQppZigjZF9hPjApdGhlbiBsb2NhbCBfYmI9e30KZm9yIG49MSwjZF9hIGRvCmlmKGRfYVtuXX49bmlsKXRoZW4KaWYKKGNvcm91dGluZS5zdGF0dXMoZF9hW25dWzFdKT09InN1c3BlbmRlZCIpdGhlbgppZihkX2Fbbl1bMl1+PW5pbCl0aGVuCmlmKGRfYVtuXVsyXT09ZGFiKXRoZW4KbG9jYWwgYWJiLGJiYj1jb3JvdXRpbmUucmVzdW1lKGRfYVtuXVsxXSxkYWIsLi4uKWRfYVtuXVsyXT1iYmI7aWYgbm90KGFiYil0aGVuIGJiYShiYmIpZW5kIGVuZCBlbHNlIGxvY2FsIGFiYixiYmI9Y29yb3V0aW5lLnJlc3VtZShkX2Fbbl1bMV0sZGFiLC4uLikKZF9hW25dWzJdPWJiYjtpZiBub3QoYWJiKXRoZW4gYmJhKGJiYillbmQgZW5kIGVsc2UgdGFibGUuaW5zZXJ0KF9iYixuKWVuZCBlbmQgZW5kCmZvciBuPTEsI19iYiBkbyB0YWJsZS5yZW1vdmUoZF9hLF9iYltuXS0gKG4tMSkpZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX2RhKClpZihjYWE9PWZhbHNlKXRoZW4gcmV0dXJuIGVuZDtpZihfYWF+PW5pbCl0aGVuIF9hYTpkcmF3KCkKX2FhOnVwZGF0ZVRlcm0oKWVuZApmb3IgZGFiLF9iYiBpbiBwYWlycyhhX2EpZG8gX2JiOmRyYXcoKV9iYjp1cGRhdGVUZXJtKCllbmQKZm9yIGRhYixfYmIgaW4gcGFpcnMoYl9hKWRvIF9iYlsxXTpkcmF3KClfYmJbMV06dXBkYXRlVGVybSgpZW5kIGVuZDtsb2NhbCBhZGEsYmRhLGNkYT1uaWwsbmlsLG5pbDtsb2NhbCBkZGE9bmlsCmxvY2FsIGZ1bmN0aW9uIF9fYihkYWIsX2JiLGFiYixiYmIpYWRhLGJkYSxjZGE9X2JiLGFiYixiYmI7aWYoZGRhPT1uaWwpdGhlbgpkZGE9b3Muc3RhcnRUaW1lcihkYy8xMDAwKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYV9iKClkZGE9bmlsO19hYTpob3ZlckhhbmRsZXIoYmRhLGNkYSxhZGEpYWFhPV9hYSBlbmQ7bG9jYWwgYl9iLGNfYixkX2I9bmlsLG5pbCxuaWw7bG9jYWwgX2FiPW5pbDtsb2NhbCBmdW5jdGlvbiBhYWIoKV9hYj1uaWw7X2FhOmRyYWdIYW5kbGVyKGJfYixjX2IsZF9iKQphYWE9X2FhIGVuZDtsb2NhbCBmdW5jdGlvbiBiYWIoZGFiLF9iYixhYmIsYmJiKWJfYixjX2IsZF9iPV9iYixhYmIsYmJiCmlmKF9kPDUwKXRoZW4gYWFiKCllbHNlIGlmKF9hYj09bmlsKXRoZW4gX2FiPW9zLnN0YXJ0VGltZXIoCl9kLzEwMDApZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gY2FiKGRhYiwuLi4pCmxvY2FsIF9iYj17Li4ufQppZihhYjpzZW5kRXZlbnQoImJhc2FsdEV2ZW50Q3ljbGUiLGRhYiwuLi4pPT1mYWxzZSl0aGVuIHJldHVybiBlbmQ7aWYoZGFiPT0idGVybWluYXRlIil0aGVuIGRhYS5zdG9wKCllbmQKaWYoX2Fhfj1uaWwpdGhlbgpsb2NhbCBhYmI9e21vdXNlX2NsaWNrPV9hYS5tb3VzZUhhbmRsZXIsbW91c2VfdXA9X2FhLm1vdXNlVXBIYW5kbGVyLG1vdXNlX3Njcm9sbD1fYWEuc2Nyb2xsSGFuZGxlcixtb3VzZV9kcmFnPWJhYixtb3VzZV9tb3ZlPV9fYn1sb2NhbCBiYmI9YWJiW2RhYl0KaWYoYmJifj1uaWwpdGhlbiBiYmIoX2FhLC4uLilkY2EoZGFiLC4uLilfZGEoKXJldHVybiBlbmQgZW5kCmlmKGRhYj09Im1vbml0b3JfdG91Y2giKXRoZW4gaWYoYV9hW19iYlsxXV1+PW5pbCl0aGVuCmFfYVtfYmJbMV1dOm1vdXNlSGFuZGxlcigxLF9iYlsyXSxfYmJbM10sdHJ1ZSlhYWE9YV9hW19iYlsxXV1lbmQKaWYKKGNjKGJfYSk+MCl0aGVuIGZvciBhYmIsYmJiIGluIHBhaXJzKGJfYSlkbwpiYmJbMV06bW91c2VIYW5kbGVyKDEsX2JiWzJdLF9iYlszXSx0cnVlLF9iYlsxXSllbmQgZW5kO2RjYShkYWIsLi4uKV9kYSgpcmV0dXJuIGVuZAppZihhYWF+PW5pbCl0aGVuCmxvY2FsIGFiYj17Y2hhcj1hYWEuY2hhckhhbmRsZXIsa2V5PWFhYS5rZXlIYW5kbGVyLGtleV91cD1hYWEua2V5VXBIYW5kbGVyfWxvY2FsIGJiYj1hYmJbZGFiXWlmKGJiYn49bmlsKXRoZW4gaWYoZGFiPT0ia2V5Iil0aGVuIGRkW19iYlsxXV09dHJ1ZSBlbHNlaWYoZGFiPT0ia2V5X3VwIil0aGVuCmRkW19iYlsxXV09ZmFsc2UgZW5kO2JiYihhYWEsLi4uKWRjYShkYWIsLi4uKQpfZGEoKXJldHVybiBlbmQgZW5kCmlmKGRhYj09InRpbWVyIilhbmQoX2JiWzFdPT1kZGEpdGhlbiBhX2IoKWVsc2VpZgooZGFiPT0idGltZXIiKWFuZChfYmJbMV09PV9hYil0aGVuIGFhYigpZWxzZQpmb3IgYWJiLGJiYiBpbiBwYWlycyhfX2EpZG8gYmJiOmV2ZW50SGFuZGxlcihkYWIsLi4uKWVuZCBlbmQ7ZGNhKGRhYiwuLi4pX2RhKCllbmQKZGFhPXtsb2dnaW5nPWZhbHNlLGR5bmFtaWNWYWx1ZUV2ZW50cz1mYWxzZSxzZXRUaGVtZT1hY2EsZ2V0VGhlbWU9YmNhLGRyYXdGcmFtZXM9X2RhLGdldFZlcnNpb249ZnVuY3Rpb24oKXJldHVybiBiZCBlbmQsc2V0VmFyaWFibGU9ZGJhLGdldFZhcmlhYmxlPV9jYSxzZXRCYXNlVGVybT1mdW5jdGlvbihkYWIpYWQ9ZGFiIGVuZCxsb2c9ZnVuY3Rpb24oLi4uKV9jKC4uLillbmQsc2V0TW91c2VNb3ZlVGhyb3R0bGU9ZnVuY3Rpb24oZGFiKQppZgooX0hPU1Q6ZmluZCgiQ3JhZnRPUyUtUEMiKSl0aGVuIGlmKGNvbmZpZy5nZXQoIm1vdXNlX21vdmVfdGhyb3R0bGUiKX49MTApdGhlbgpjb25maWcuc2V0KCJtb3VzZV9tb3ZlX3Rocm90dGxlIiwxMCllbmQKaWYoZGFiPDEwMCl0aGVuIGRjPTEwMCBlbHNlIGRjPWRhYiBlbmQ7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2V0TW91c2VEcmFnVGhyb3R0bGU9ZnVuY3Rpb24oZGFiKWlmKApkYWI8PTApdGhlbiBfZD0wIGVsc2UgX2FiPW5pbDtfZD1kYWIgZW5kIGVuZCxhdXRvVXBkYXRlPWZ1bmN0aW9uKGRhYikKY2FhPWRhYjtpZihkYWI9PW5pbCl0aGVuIGNhYT10cnVlIGVuZDtsb2NhbCBmdW5jdGlvbiBfYmIoKV9kYSgpd2hpbGUgY2FhIGRvCmNhYihvcy5wdWxsRXZlbnRSYXcoKSllbmQgZW5kCmxvY2FsIGFiYixiYmI9eHBjYWxsKF9iYixkZWJ1Zy50cmFjZWJhY2spaWYgbm90KGFiYil0aGVuIGJiYShiYmIpcmV0dXJuIGVuZCBlbmQsdXBkYXRlPWZ1bmN0aW9uKGRhYiwuLi4paWYoCmRhYn49bmlsKXRoZW4gbG9jYWwgX2JiLGFiYj14cGNhbGwoY2FiLGRlYnVnLnRyYWNlYmFjayxkYWIsLi4uKWlmIG5vdChfYmIpdGhlbgpiYmEoYWJiKXJldHVybiBlbmQgZW5kIGVuZCxzdG9wPWFiYSxzdG9wVXBkYXRlPWFiYSxpc0tleURvd249ZnVuY3Rpb24oZGFiKWlmKApkZFtkYWJdPT1uaWwpdGhlbiByZXR1cm4gZmFsc2UgZW5kO3JldHVybiBkZFtkYWJdZW5kLGdldEZyYW1lPWZ1bmN0aW9uKGRhYilmb3IgX2JiLGFiYiBpbgpwYWlycyhfX2EpZG8gaWYoYWJiLm5hbWU9PWRhYil0aGVuIHJldHVybiBhYmIgZW5kIGVuZCBlbmQsZ2V0QWN0aXZlRnJhbWU9ZnVuY3Rpb24oKXJldHVybgphYWEgZW5kLHNldEFjdGl2ZUZyYW1lPWZ1bmN0aW9uKGRhYikKaWYoZGFiOmdldFR5cGUoKT09IkZyYW1lIil0aGVuIGFhYT1kYWI7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsb25FdmVudD1mdW5jdGlvbiguLi4pCmZvciBkYWIsX2JiIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKF9iYik9PSJmdW5jdGlvbiIpdGhlbgphYjpyZWdpc3RlckV2ZW50KCJiYXNhbHRFdmVudEN5Y2xlIixfYmIpZW5kIGVuZCBlbmQsc2NoZWR1bGU9Y2JhLGNyZWF0ZUZyYW1lPWZ1bmN0aW9uKGRhYikKZGFiPWRhYiBvciBhYygpCmZvciBhYmIsYmJiIGluIHBhaXJzKF9fYSlkbyBpZihiYmIubmFtZT09ZGFiKXRoZW4gcmV0dXJuIG5pbCBlbmQgZW5kO2xvY2FsIF9iYj1iYihkYWIsbmlsLG5pbCxjY2EpX2JiOmluaXQoKQp0YWJsZS5pbnNlcnQoX19hLF9iYilpZgooX2FhPT1uaWwpYW5kKF9iYjpnZXROYW1lKCl+PSJiYXNhbHREZWJ1Z2dpbmdGcmFtZSIpdGhlbiBfYmI6c2hvdygpZW5kO3JldHVybiBfYmIgZW5kLHJlbW92ZUZyYW1lPWZ1bmN0aW9uKGRhYilfX2FbZGFiXT0KbmlsIGVuZCxzZXRQcm9qZWN0RGlyPWZ1bmN0aW9uKGRhYiljZD1kYWIgZW5kLGZvcmNlUmVuZGVyVXBkYXRlPWZ1bmN0aW9uKClfZGEoKWVuZCxkZWJ1Zz1mdW5jdGlvbiguLi4pbG9jYWwgZGFiPXsuLi59aWYKKF9hYT09bmlsKXRoZW4gcHJpbnQoLi4uKXJldHVybiBlbmQ7aWYoX2FhLm5hbWV+PSJiYXNhbHREZWJ1Z2dpbmdGcmFtZSIpdGhlbgppZihfYWF+PQpkYWEuZGVidWdGcmFtZSl0aGVuIGRhYS5kZWJ1Z0xhYmVsOnNldFBhcmVudChfYWEpZW5kIGVuZDtsb2NhbCBfYmI9IiJmb3IgYWJiLGJiYiBpbiBwYWlycyhkYWIpZG8KX2JiPV9iYi4uCnRvc3RyaW5nKGJiYikuLiAoI2RhYn49YWJiIGFuZCIsICJvciIiKWVuZApkYWEuZGVidWdMYWJlbDpzZXRUZXh0KCJbRGVidWddICIuLl9iYilmb3IgYWJiLGJiYiBpbiBwYWlycyhiYyhfYmIsZGFhLmRlYnVnTGlzdDpnZXRXaWR0aCgpKSlkbwpkYWEuZGVidWdMaXN0OmFkZEl0ZW0oYmJiKWVuZAppZigKZGFhLmRlYnVnTGlzdDpnZXRJdGVtQ291bnQoKT41MCl0aGVuIGRhYS5kZWJ1Z0xpc3Q6cmVtb3ZlSXRlbSgxKWVuZApkYWEuZGVidWdMaXN0OnNldFZhbHVlKGRhYS5kZWJ1Z0xpc3Q6Z2V0SXRlbShkYWEuZGVidWdMaXN0OmdldEl0ZW1Db3VudCgpKSlpZgooZGFhLmRlYnVnTGlzdC5nZXRJdGVtQ291bnQoKT5kYWEuZGVidWdMaXN0OmdldEhlaWdodCgpKXRoZW4KZGFhLmRlYnVnTGlzdDpzZXRPZmZzZXQoZGFhLmRlYnVnTGlzdDpnZXRJdGVtQ291bnQoKS0KZGFhLmRlYnVnTGlzdDpnZXRIZWlnaHQoKSllbmQKZGFhLmRlYnVnTGFiZWw6c2hvdygpZW5kfQpkYWEuZGVidWdGcmFtZT1kYWEuY3JlYXRlRnJhbWUoImJhc2FsdERlYnVnZ2luZ0ZyYW1lIik6c2hvd0JhcigpOnNldEJhY2tncm91bmQoY29sb3JzLmxpZ2h0R3JheSk6c2V0QmFyKCJEZWJ1ZyIsY29sb3JzLmJsYWNrLGNvbG9ycy5ncmF5KQpkYWEuZGVidWdGcmFtZTphZGRCdXR0b24oImJhY2siKTpzZXRBbmNob3IoInRvcFJpZ2h0Iik6c2V0U2l6ZSgxLDEpOnNldFRleHQoIlwyMiIpOm9uQ2xpY2soZnVuY3Rpb24oKWlmKApkYWEub2xkRnJhbWV+PW5pbCl0aGVuIGRhYS5vbGRGcmFtZTpzaG93KCllbmQgZW5kKTpzZXRCYWNrZ3JvdW5kKGNvbG9ycy5yZWQpOnNob3coKQpkYWEuZGVidWdMaXN0PWRhYS5kZWJ1Z0ZyYW1lOmFkZExpc3QoImRlYnVnTGlzdCIpOnNldFNpemUoInBhcmVudC53IC0gMiIsInBhcmVudC5oIC0gMyIpOnNldFBvc2l0aW9uKDIsMyk6c2V0U2Nyb2xsYWJsZSh0cnVlKTpzaG93KCkKZGFhLmRlYnVnTGFiZWw9ZGFhLmRlYnVnRnJhbWU6YWRkTGFiZWwoImRlYnVnTGFiZWwiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKZGFhLm9sZEZyYW1lPV9hYTtkYWEuZGVidWdGcmFtZTpzaG93KCllbmQpOnNldEJhY2tncm91bmQoY29sb3JzLmJsYWNrKTpzZXRGb3JlZ3JvdW5kKGNvbG9ycy53aGl0ZSk6c2V0QW5jaG9yKCJib3R0b21MZWZ0Iik6aWdub3JlT2Zmc2V0KCk6c2V0WkluZGV4KDIwKTpzaG93KClyZXR1cm4gZGFhIGVuZAphYVsiT2JqZWN0Il09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJiYXNhbHRFdmVudCIpbG9jYWwgYmI9ZGEoInV0aWxzIikKbG9jYWwgY2I9ZGEoIm1vZHVsZSIpbG9jYWwgZGI9Y2IoImltYWdlcyIpbG9jYWwgX2M9YmIuc3BsaXRTdHJpbmc7bG9jYWwgYWM9YmIubnVtYmVyRnJvbVN0cmluZwpsb2NhbCBiYz1iYi5nZXRWYWx1ZUZyb21YTUw7bG9jYWwgY2MsZGM9dGFibGUudW5wYWNrLHN0cmluZy5zdWIKcmV0dXJuCmZ1bmN0aW9uKF9kKWxvY2FsIGFkPSJPYmplY3QibG9jYWwgYmQ9e31sb2NhbCBjZD0xO2xvY2FsIGRkCmxvY2FsIF9fYT0idG9wTGVmdCJsb2NhbCBhX2E9ZmFsc2U7bG9jYWwgYl9hPXRydWU7bG9jYWwgY19hPWZhbHNlO2xvY2FsIGRfYT1mYWxzZTtsb2NhbCBfYWE9ZmFsc2U7bG9jYWwgYWFhPWZhbHNlCmxvY2FsIGJhYT17bGVmdD1mYWxzZSxyaWdodD1mYWxzZSx0b3A9ZmFsc2UsYm90dG9tPWZhbHNlfWxvY2FsIGNhYT1jb2xvcnMuYmxhY2s7bG9jYWwgZGFhPXRydWU7bG9jYWwgX2JhPWZhbHNlO2xvY2FsIGFiYSxiYmEsY2JhLGRiYT0wLDAsMCwwO2xvY2FsIF9jYTtsb2NhbCBhY2E7bG9jYWwgYmNhPTE7bG9jYWwgY2NhCmxvY2FsIGRjYTtsb2NhbCBfZGE9dHJ1ZTtsb2NhbCBhZGE9dHJ1ZTtsb2NhbCBiZGE9e31sb2NhbCBjZGE9YWIoKQpiZD17eD0xLHk9MSx3aWR0aD0xLGhlaWdodD0xLGJnQ29sb3I9Y29sb3JzLmJsYWNrLGJnU3ltYm9sPSIgIixiZ1N5bWJvbENvbG9yPWNvbG9ycy5ibGFjayxmZ0NvbG9yPWNvbG9ycy53aGl0ZSx0cmFuc3BhcmVudENvbG9yPWZhbHNlLG5hbWU9X2Qgb3IiT2JqZWN0IixwYXJlbnQ9Cm5pbCxzaG93PWZ1bmN0aW9uKGRkYSliX2E9dHJ1ZTtkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsaGlkZT1mdW5jdGlvbihkZGEpYl9hPWZhbHNlCmRkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxlbmFibGU9ZnVuY3Rpb24oZGRhKWRhYT10cnVlO3JldHVybiBkZGEgZW5kLGRpc2FibGU9ZnVuY3Rpb24oZGRhKWRhYT1mYWxzZQpyZXR1cm4gZGRhIGVuZCxpc0VuYWJsZWQ9ZnVuY3Rpb24oZGRhKXJldHVybiBkYWEgZW5kLGdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbj1mdW5jdGlvbihkZGEsX19iLGFfYikKbG9jYWwgYl9iPWZ1bmN0aW9uKGNfYikKaWYoY19iOnN1YigxLDEpPT0iIyIpdGhlbgpsb2NhbCBkX2I9ZGRhOmdldEJhc2VGcmFtZSgpOmdldERlZXBPYmplY3QoY19iOnN1YigyLGNfYjpsZW4oKSkpCmlmKGRfYn49bmlsKWFuZChkX2IuaW50ZXJuYWxPYmpldENhbGx+PW5pbCl0aGVuIF9fYihkZGEsZnVuY3Rpb24oKQpkX2I6aW50ZXJuYWxPYmpldENhbGwoKWVuZCllbmQgZWxzZQpfX2IoZGRhLGRkYTpnZXRCYXNlRnJhbWUoKTpnZXRWYXJpYWJsZShjX2IpKWVuZCBlbmQ7aWYodHlwZShhX2IpPT0ic3RyaW5nIil0aGVuIGJfYihhX2IpZWxzZWlmKHR5cGUoYV9iKT09InRhYmxlIil0aGVuCmZvciBjX2IsZF9iIGluIHBhaXJzKGFfYilkbyBiX2IoZF9iKWVuZCBlbmQ7cmV0dXJuIGRkYSBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGRkYSxfX2IpCmxvY2FsIGFfYj1kZGE6Z2V0QmFzZUZyYW1lKClsb2NhbCBiX2IsY19iLGRfYgppZihiYygidGV4dHVyZSIsX19iKX49bmlsKXRoZW4gYl9iPWJjKCJ0ZXh0dXJlIixfX2IpZW5kO2lmKGJjKCJtb2RlIixfX2Ipfj1uaWwpdGhlbiBjX2I9YmMoIm1vZGUiLF9fYillbmQKaWYoCmJjKCJ0ZXh0dXJlUGxheSIsX19iKX49bmlsKXRoZW4gZF9iPWJjKCJ0ZXh0dXJlUGxheSIsX19iKWVuZDtsb2NhbCBfYWIsYWFiO2lmKGJjKCJ4IixfX2Ipfj1uaWwpdGhlbiBfYWI9YmMoIngiLF9fYillbmQ7aWYoCmJjKCJ5IixfX2Ipfj1uaWwpdGhlbiBhYWI9YmMoInkiLF9fYillbmQ7aWYKKF9hYn49bmlsKW9yKGFhYn49bmlsKXRoZW4gZGRhOnNldFBvc2l0aW9uKF9hYixhYWIpZW5kO2xvY2FsIGJhYixjYWI7aWYoCmJjKCJ3aWR0aCIsX19iKX49bmlsKXRoZW4gYmFiPWJjKCJ3aWR0aCIsX19iKWVuZDtpZigKYmMoImhlaWdodCIsX19iKX49bmlsKXRoZW4gY2FiPWJjKCJoZWlnaHQiLF9fYillbmQ7aWYoYmFifj1uaWwpb3IoCmNhYn49bmlsKXRoZW4gZGRhOnNldFNpemUoYmFiLGNhYillbmQ7aWYoCmJjKCJiZyIsX19iKX49bmlsKXRoZW4KZGRhOnNldEJhY2tncm91bmQoY29sb3JzW2JjKCJiZyIsX19iKV0pZW5kO2lmKGJjKCJiZ1N5bWJvbCIsX19iKX49bmlsKXRoZW4KZGRhOnNldEJhY2tncm91bmQoZGRhLmJnQ29sb3IsYmMoImJnU3ltYm9sIixfX2IpKWVuZDtpZgooYmMoImJnU3ltYm9sQ29sb3IiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRCYWNrZ3JvdW5kKGRkYS5iZ0NvbG9yLGRkYS5iZ1N5bWJvbCxjb2xvcnNbYmMoImJnU3ltYm9sQ29sb3IiLF9fYildKWVuZAppZgooYmMoImZnIixfX2Ipfj1uaWwpdGhlbiBkZGE6c2V0Rm9yZWdyb3VuZChjb2xvcnNbYmMoImZnIixfX2IpXSllbmQ7aWYoYmMoInZhbHVlIixfX2Ipfj1uaWwpdGhlbgpkZGE6c2V0VmFsdWUoY29sb3JzW2JjKCJ2YWx1ZSIsX19iKV0pZW5kCmlmKGJjKCJ2aXNpYmxlIixfX2Ipfj1uaWwpdGhlbiBpZgooYmMoInZpc2libGUiLF9fYikpdGhlbiBkZGE6c2hvdygpZWxzZSBkZGE6aGlkZSgpZW5kIGVuZAppZihiYygiZW5hYmxlZCIsX19iKX49bmlsKXRoZW4gaWYoYmMoImVuYWJsZWQiLF9fYikpdGhlbiBkZGE6ZW5hYmxlKCllbHNlCmRkYTpkaXNhYmxlKCllbmQgZW5kO2lmKGJjKCJ6SW5kZXgiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRaSW5kZXgoYmMoInpJbmRleCIsX19iKSllbmQ7aWYoYmMoImFuY2hvciIsX19iKX49bmlsKXRoZW4KZGRhOnNldEFuY2hvcihiYygiYW5jaG9yIixfX2IpKWVuZDtpZihiYygic2hhZG93Q29sb3IiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRTaGFkb3coY29sb3JzW2JjKCJzaGFkb3dDb2xvciIsX19iKV0pZW5kO2lmKGJjKCJib3JkZXIiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRCb3JkZXIoY29sb3JzW2JjKCJib3JkZXIiLF9fYildKWVuZDtpZihiYygiYm9yZGVyTGVmdCIsX19iKX49bmlsKXRoZW4KYmFhWyJsZWZ0Il09Y29sb3JzW2JjKCJib3JkZXJMZWZ0IixfX2IpXWVuZDtpZihiYygiYm9yZGVyVG9wIixfX2Ipfj1uaWwpdGhlbgpiYWFbInRvcCJdPWNvbG9yc1tiYygiYm9yZGVyVG9wIixfX2IpXWVuZDtpZihiYygiYm9yZGVyUmlnaHQiLF9fYil+PW5pbCl0aGVuCmJhYVsicmlnaHQiXT1jb2xvcnNbYmMoImJvcmRlclJpZ2h0IixfX2IpXWVuZAppZgooYmMoImJvcmRlckJvdHRvbSIsX19iKX49bmlsKXRoZW4gYmFhWyJib3R0b20iXT1jb2xvcnNbYmMoImJvcmRlckJvdHRvbSIsX19iKV1lbmQ7aWYoYmMoImJvcmRlckNvbG9yIixfX2Ipfj1uaWwpdGhlbgpkZGE6c2V0Qm9yZGVyKGNvbG9yc1tiYygiYm9yZGVyQ29sb3IiLF9fYildKWVuZDtpZgooYmMoImlnbm9yZU9mZnNldCIsX19iKX49bmlsKXRoZW4KaWYoYmMoImlnbm9yZU9mZnNldCIsX19iKSl0aGVuIGRkYTppZ25vcmVPZmZzZXQodHJ1ZSllbmQgZW5kO2lmCihiYygib25DbGljayIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25DbGljayxiYygib25DbGljayIsX19iKSllbmQ7aWYKKGJjKCJvbkNsaWNrVXAiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uQ2xpY2tVcCxiYygib25DbGlja1VwIixfX2IpKWVuZDtpZgooYmMoIm9uU2Nyb2xsIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vblNjcm9sbCxiYygib25TY3JvbGwiLF9fYikpZW5kO2lmCihiYygib25EcmFnIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbkRyYWcsYmMoIm9uRHJhZyIsX19iKSllbmQ7aWYoYmMoIm9uSG92ZXIiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uSG92ZXIsYmMoIm9uSG92ZXIiLF9fYikpZW5kO2lmCihiYygib25MZWF2ZSIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25MZWF2ZSxiYygib25MZWF2ZSIsX19iKSllbmQ7aWYoYmMoIm9uS2V5IixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbktleSxiYygib25LZXkiLF9fYikpZW5kO2lmKGJjKCJvbktleVVwIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbktleVVwLGJjKCJvbktleVVwIixfX2IpKWVuZDtpZgooYmMoIm9uQ2hhbmdlIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbkNoYW5nZSxiYygib25DaGFuZ2UiLF9fYikpZW5kO2lmCihiYygib25SZXNpemUiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uUmVzaXplLGJjKCJvblJlc2l6ZSIsX19iKSllbmQ7aWYKKGJjKCJvblJlcG9zaXRpb24iLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uUmVwb3NpdGlvbixiYygib25SZXBvc2l0aW9uIixfX2IpKWVuZDtpZgooYmMoIm9uRXZlbnQiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uRXZlbnQsYmMoIm9uRXZlbnQiLF9fYikpZW5kO2lmCihiYygib25HZXRGb2N1cyIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25HZXRGb2N1cyxiYygib25HZXRGb2N1cyIsX19iKSllbmQ7aWYKKGJjKCJvbkxvc2VGb2N1cyIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25Mb3NlRm9jdXMsYmMoIm9uTG9zZUZvY3VzIixfX2IpKWVuZDtpZihiX2J+PW5pbCl0aGVuCmRkYTpzZXRUZXh0dXJlKGJfYixjX2IsZF9iKWVuZDtkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsaXNWaXNpYmxlPWZ1bmN0aW9uKGRkYSlyZXR1cm4KYl9hIGVuZCxzZXRGb2N1cz1mdW5jdGlvbihkZGEpaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDpzZXRGb2N1c2VkT2JqZWN0KGRkYSllbmQ7cmV0dXJuIGRkYSBlbmQsc2V0WkluZGV4PWZ1bmN0aW9uKGRkYSxfX2IpCmNkPV9fYgppZihkZGEucGFyZW50fj1uaWwpdGhlbiBkZGEucGFyZW50OnJlbW92ZU9iamVjdChkZGEpCmRkYS5wYXJlbnQ6YWRkT2JqZWN0KGRkYSlkZGE6dXBkYXRlRXZlbnRIYW5kbGVycygpZW5kO3JldHVybiBkZGEgZW5kLHVwZGF0ZUV2ZW50SGFuZGxlcnM9ZnVuY3Rpb24oZGRhKQpmb3IgX19iLGFfYiBpbgpwYWlycyhiZGEpZG8gaWYoYV9iKXRoZW4gZGRhLnBhcmVudDphZGRFdmVudChfX2IsZGRhKWVuZCBlbmQgZW5kLGdldFpJbmRleD1mdW5jdGlvbihkZGEpcmV0dXJuIGNkIGVuZCxnZXRUeXBlPWZ1bmN0aW9uKGRkYSlyZXR1cm4gYWQgZW5kLGdldE5hbWU9ZnVuY3Rpb24oZGRhKXJldHVybgpkZGEubmFtZSBlbmQscmVtb3ZlPWZ1bmN0aW9uKGRkYSlpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OnJlbW92ZU9iamVjdChkZGEpZW5kO2RkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxzZXRQYXJlbnQ9ZnVuY3Rpb24oZGRhLF9fYikKaWYoCl9fYi5nZXRUeXBlfj1uaWwgYW5kIF9fYjpnZXRUeXBlKCk9PSJGcmFtZSIpdGhlbgpkZGE6cmVtb3ZlKClfX2I6YWRkT2JqZWN0KGRkYSlpZihkZGEuZHJhdyl0aGVuIGRkYTpzaG93KCllbmQgZW5kO3JldHVybiBkZGEgZW5kLHNldFZhbHVlPWZ1bmN0aW9uKGRkYSxfX2IsYV9iKWlmKApkZH49X19iKXRoZW4gZGQ9X19iO2RkYTp1cGRhdGVEcmF3KClpZihhX2J+PWZhbHNlKXRoZW4KZGRhOnZhbHVlQ2hhbmdlZEhhbmRsZXIoKWVuZCBlbmQKcmV0dXJuIGRkYSBlbmQsZ2V0VmFsdWU9ZnVuY3Rpb24oZGRhKXJldHVybiBkZCBlbmQsZ2V0RHJhdz1mdW5jdGlvbihkZGEpcmV0dXJuCmFkYSBlbmQsdXBkYXRlRHJhdz1mdW5jdGlvbihkZGEsX19iKWFkYT1fX2I7aWYoX19iPT1uaWwpdGhlbiBhZGE9dHJ1ZSBlbmQ7aWYoYWRhKXRoZW4gaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDp1cGRhdGVEcmF3KCllbmQgZW5kO3JldHVybiBkZGEgZW5kLGdldEV2ZW50U3lzdGVtPWZ1bmN0aW9uKGRkYSlyZXR1cm4KY2RhIGVuZCxnZXRQYXJlbnQ9ZnVuY3Rpb24oZGRhKXJldHVybiBkZGEucGFyZW50IGVuZCxzZXRQb3NpdGlvbj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpCmlmKHR5cGUoX19iKT09Im51bWJlciIpdGhlbiBkZGEueD0KYl9iIGFuZCBkZGE6Z2V0WCgpK19fYiBvciBfX2IgZW5kO2lmKHR5cGUoYV9iKT09Im51bWJlciIpdGhlbgpkZGEueT1iX2IgYW5kIGRkYTpnZXRZKCkrYV9iIG9yIGFfYiBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4gaWYodHlwZShfX2IpPT0ic3RyaW5nIil0aGVuCmRkYS54PWRkYS5wYXJlbnQ6bmV3RHluYW1pY1ZhbHVlKGRkYSxfX2IpZW5kO2lmKHR5cGUoYV9iKT09InN0cmluZyIpdGhlbgpkZGEueT1kZGEucGFyZW50Om5ld0R5bmFtaWNWYWx1ZShkZGEsYV9iKWVuZApkZGEucGFyZW50OnJlY2FsY3VsYXRlRHluYW1pY1ZhbHVlcygpZW5kO2RkYTpjdXN0b21FdmVudEhhbmRsZXIoImJhc2FsdF9yZXBvc2l0aW9uIikKZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLGdldFg9ZnVuY3Rpb24oZGRhKXJldHVybgoKdHlwZShkZGEueCk9PSJudW1iZXIiYW5kIGRkYS54IG9yIG1hdGguZmxvb3IoZGRhLnhbMV0rMC41KWVuZCxnZXRZPWZ1bmN0aW9uKGRkYSlyZXR1cm4KCnR5cGUoZGRhLnkpPT0ibnVtYmVyImFuZCBkZGEueSBvciBtYXRoLmZsb29yKGRkYS55WzFdKzAuNSllbmQsZ2V0UG9zaXRpb249ZnVuY3Rpb24oZGRhKXJldHVybgpkZGE6Z2V0WCgpLGRkYTpnZXRZKCllbmQsZ2V0VmlzaWJpbGl0eT1mdW5jdGlvbihkZGEpcmV0dXJuIGJfYSBlbmQsc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihkZGEsX19iKQpiX2E9X19iIG9yIG5vdCBiX2E7ZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLHNldFNpemU9ZnVuY3Rpb24oZGRhLF9fYixhX2IsYl9iKWlmKHR5cGUoX19iKT09CiJudW1iZXIiKXRoZW4KZGRhLndpZHRoPWJfYiBhbmQgZGRhOmdldFdpZHRoKCkrX19iIG9yIF9fYiBlbmQKaWYodHlwZShhX2IpPT0ibnVtYmVyIil0aGVuIGRkYS5oZWlnaHQ9Yl9iIGFuZApkZGE6Z2V0SGVpZ2h0KCkrYV9iIG9yIGFfYiBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4gaWYodHlwZShfX2IpPT0ic3RyaW5nIil0aGVuCmRkYS53aWR0aD1kZGEucGFyZW50Om5ld0R5bmFtaWNWYWx1ZShkZGEsX19iKWVuZDtpZih0eXBlKGFfYik9PSJzdHJpbmciKXRoZW4KZGRhLmhlaWdodD1kZGEucGFyZW50Om5ld0R5bmFtaWNWYWx1ZShkZGEsYV9iKWVuZApkZGEucGFyZW50OnJlY2FsY3VsYXRlRHluYW1pY1ZhbHVlcygpZW5kO2lmKF9jYX49bmlsKWFuZChkY2E9PSJzdHJldGNoIil0aGVuCmFjYT1kYi5yZXNpemVCSU1HKF9jYSxkZGE6Z2V0U2l6ZSgpKVtiY2FdZW5kCmRkYTpjdXN0b21FdmVudEhhbmRsZXIoImJhc2FsdF9yZXNpemUiKWRkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxnZXRIZWlnaHQ9ZnVuY3Rpb24oZGRhKQpyZXR1cm4KdHlwZShkZGEuaGVpZ2h0KT09Im51bWJlciJhbmQgZGRhLmhlaWdodCBvcgptYXRoLmZsb29yKGRkYS5oZWlnaHRbMV0rMC41KWVuZCxnZXRXaWR0aD1mdW5jdGlvbihkZGEpcmV0dXJuCgp0eXBlKGRkYS53aWR0aCk9PSJudW1iZXIiYW5kIGRkYS53aWR0aCBvciBtYXRoLmZsb29yKGRkYS53aWR0aFsxXSswLjUpZW5kLGdldFNpemU9ZnVuY3Rpb24oZGRhKXJldHVybgpkZGE6Z2V0V2lkdGgoKSxkZGE6Z2V0SGVpZ2h0KCllbmQsY2FsY3VsYXRlRHluYW1pY1ZhbHVlcz1mdW5jdGlvbihkZGEpCmlmKAp0eXBlKGRkYS53aWR0aCk9PSJ0YWJsZSIpdGhlbiBkZGEud2lkdGg6Y2FsY3VsYXRlKCllbmQKaWYodHlwZShkZGEuaGVpZ2h0KT09InRhYmxlIil0aGVuIGRkYS5oZWlnaHQ6Y2FsY3VsYXRlKCllbmQKaWYodHlwZShkZGEueCk9PSJ0YWJsZSIpdGhlbiBkZGEueDpjYWxjdWxhdGUoKWVuZAppZih0eXBlKGRkYS55KT09InRhYmxlIil0aGVuIGRkYS55OmNhbGN1bGF0ZSgpZW5kO2RkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxzZXRCYWNrZ3JvdW5kPWZ1bmN0aW9uKGRkYSxfX2IsYV9iLGJfYilkZGEuYmdDb2xvcj0KX19iIG9yIGZhbHNlCmRkYS5iZ1N5bWJvbD1hX2Igb3IoZGRhLmJnQ29sb3J+PWZhbHNlIGFuZCBkZGEuYmdTeW1ib2wgb3IKZmFsc2UpZGRhLmJnU3ltYm9sQ29sb3I9Yl9iIG9yIGRkYS5iZ1N5bWJvbENvbG9yCmRkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxzZXRUZXh0dXJlPWZ1bmN0aW9uKGRkYSxfX2IsYV9iLGJfYilpZigKdHlwZShfX2IpPT0ic3RyaW5nIil0aGVuIF9jYT1kYi5sb2FkSW1hZ2VBc0JpbWcoX19iKWVsc2VpZih0eXBlKF9fYik9PSJ0YWJsZSIpdGhlbgpfY2E9X19iIGVuZAppZihfY2EuYW5pbWF0ZWQpdGhlbiBsb2NhbCBjX2I9X2NhW2JjYV0uZHVyYXRpb24gb3IKX2NhLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2NhPW9zLnN0YXJ0VGltZXIoY19iKWRkYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixkZGEpCmJkYVsib3RoZXJfZXZlbnQiXT10cnVlIGVuZDtfZGE9Yl9iPT1mYWxzZSBhbmQgZmFsc2Ugb3IgdHJ1ZTtiY2E9MQpkY2E9YV9iIG9yIm5vcm1hbCJpZihkY2E9PSJzdHJldGNoIil0aGVuCmFjYT1kYi5yZXNpemVCSU1HKF9jYSxkZGE6Z2V0U2l6ZSgpKVsxXWVsc2UgYWNhPV9jYVsxXWVuZApkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsc2V0VHJhbnNwYXJlbnQ9ZnVuY3Rpb24oZGRhLF9fYilkZGEudHJhbnNwYXJlbnRDb2xvcj0KX19iIG9yIGZhbHNlO2lmKF9fYn49ZmFsc2UpdGhlbiBkZGEuYmdTeW1ib2w9ZmFsc2UKZGRhLmJnU3ltYm9sQ29sb3I9ZmFsc2UgZW5kO2RkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxnZXRCYWNrZ3JvdW5kPWZ1bmN0aW9uKGRkYSlyZXR1cm4KZGRhLmJnQ29sb3IgZW5kLHNldEZvcmVncm91bmQ9ZnVuY3Rpb24oZGRhLF9fYilkZGEuZmdDb2xvcj1fX2Igb3IgZmFsc2UKZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLGdldEZvcmVncm91bmQ9ZnVuY3Rpb24oZGRhKXJldHVybiBkZGEuZmdDb2xvciBlbmQsc2V0U2hhZG93PWZ1bmN0aW9uKGRkYSxfX2IpaWYoCl9fYj09ZmFsc2UpdGhlbiBhYWE9ZmFsc2UgZWxzZSBjYWE9X19iO2FhYT10cnVlIGVuZApkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsaXNTaGFkb3dBY3RpdmU9ZnVuY3Rpb24oZGRhKXJldHVybiBhYWEgZW5kLHNldEJvcmRlcj1mdW5jdGlvbihkZGEsLi4uKQppZigKLi4ufj1uaWwpdGhlbiBsb2NhbCBfX2I9ey4uLn0KZm9yIGFfYixiX2IgaW4gcGFpcnMoX19iKWRvIGlmKGJfYj09ImxlZnQiKW9yKCNfX2I9PTEpdGhlbgpiYWFbImxlZnQiXT1fX2JbMV1lbmQ7aWYoYl9iPT0idG9wIilvcigjX19iPT0xKXRoZW4KYmFhWyJ0b3AiXT1fX2JbMV1lbmQ7aWYoYl9iPT0icmlnaHQiKW9yKCNfX2I9PTEpdGhlbgpiYWFbInJpZ2h0Il09X19iWzFdZW5kO2lmKGJfYj09ImJvdHRvbSIpb3IoI19fYj09MSl0aGVuCmJhYVsiYm90dG9tIl09X19iWzFdZW5kIGVuZCBlbmQ7ZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLGdldEJvcmRlcj1mdW5jdGlvbihkZGEsX19iKWlmKApfX2I9PSJsZWZ0Iil0aGVuIHJldHVybiBib3JkZXJMZWZ0IGVuZAppZihfX2I9PSJ0b3AiKXRoZW4gcmV0dXJuIGJvcmRlclRvcCBlbmQ7aWYoX19iPT0icmlnaHQiKXRoZW4gcmV0dXJuIGJvcmRlclJpZ2h0IGVuZDtpZihfX2I9PSJib3R0b20iKXRoZW4KcmV0dXJuIGJvcmRlckJvdHRvbSBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oZGRhKQppZgooYl9hKXRoZW4KaWYoZGRhLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgX19iLGFfYj1kZGE6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBiX2IsY19iPWRkYTpnZXRTaXplKClsb2NhbCBkX2IsX2FiPWRkYS5wYXJlbnQ6Z2V0U2l6ZSgpCmlmKF9fYitiX2I8MSlvcihfX2I+ZF9iKW9yKGFfYisKY19iPDEpb3IoYV9iPl9hYil0aGVuIHJldHVybiBmYWxzZSBlbmQ7aWYoZGRhLnRyYW5zcGFyZW50Q29sb3J+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IsYV9iLGJfYixjX2IsZGRhLnRyYW5zcGFyZW50Q29sb3IpZW5kO2lmKGRkYS5iZ0NvbG9yfj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iLGFfYixiX2IsY19iLGRkYS5iZ0NvbG9yKWVuZAppZihkZGEuYmdTeW1ib2x+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3VGV4dEJveChfX2IsYV9iLGJfYixjX2IsZGRhLmJnU3ltYm9sKWlmKGRkYS5iZ1N5bWJvbH49IiAiKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IsYV9iLGJfYixjX2IsZGRhLmJnU3ltYm9sQ29sb3IpZW5kIGVuZAppZihhY2F+PW5pbCl0aGVuCmlmKGRjYT09ImNlbnRlciIpdGhlbiBsb2NhbCBiYWIsY2FiPSNhY2FbMV1bMV0sI2FjYQpsb2NhbCBkYWI9YmFiPGJfYiBhbmQgbWF0aC5mbG9vcigoYl9iLWJhYikvCjIpb3IgMApsb2NhbCBfYmI9Y2FiPGNfYiBhbmQgbWF0aC5mbG9vcigoY19iLWNhYikvMilvciAwCmxvY2FsIGFiYj1iYWI8Yl9iIGFuZCAxIG9yIG1hdGguZmxvb3IoKGJhYi1iX2IpLzIpCmxvY2FsIGJiYj1iYWI8Yl9iIGFuZCBiX2Igb3IKYl9iLW1hdGguZmxvb3IoKGJfYi1iYWIpLzIgKzAuNSktMQpsb2NhbCBjYmI9Y2FiPGNfYiBhbmQgMSBvciBtYXRoLmZsb29yKChjYWItY19iKS8yKQpsb2NhbCBkYmI9Y2FiPGNfYiBhbmQgY19iIG9yCmNfYi1tYXRoLmZsb29yKChjX2ItY2FiKS8yICswLjUpLTE7bG9jYWwgX2NiPTEKZm9yIGs9Y2JiLCNhY2EgZG8KaWYoYWNhW2tdfj1uaWwpdGhlbiBsb2NhbCBhY2IsYmNiLGNjYj1jYyhhY2Fba10pYWNiPWRjKGFjYixhYmIsYmJiKQpiY2I9ZGMoYmNiLGFiYixiYmIpY2NiPWRjKGNjYixhYmIsYmJiKQpkZGEucGFyZW50OmJsaXQoX19iK2RhYixhX2IrX2NiLTEgK19iYixhY2IsYmNiLGNjYillbmQ7X2NiPV9jYisxO2lmKGs9PWRiYil0aGVuIGJyZWFrIGVuZCBlbmQgZWxzZQpmb3IgYmFiLGNhYiBpbiBwYWlycyhhY2EpZG8gbG9jYWwgZGFiLF9iYixhYmI9Y2MoY2FiKWRhYj1kYyhkYWIsMSxiX2IpX2JiPWRjKF9iYiwxLGJfYikKYWJiPWRjKGFiYiwxLGJfYilkZGEucGFyZW50OmJsaXQoX19iLGFfYitiYWItMSxkYWIsX2JiLGFiYilpZihiYWI9PQpjX2IpdGhlbiBicmVhayBlbmQgZW5kIGVuZCBlbmQKaWYoYWFhKXRoZW4KZGRhLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChfX2IrMSxhX2IrY19iLGJfYiwxLGNhYSkKZGRhLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChfX2IrYl9iLGFfYisxLDEsY19iLGNhYSkKZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IrMSxhX2IrY19iLGJfYiwxLGNhYSkKZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IrYl9iLGFfYisxLDEsY19iLGNhYSllbmQ7bG9jYWwgYWFiPWRkYS5iZ0NvbG9yCmlmKGJhYVsibGVmdCJdfj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd1RleHRCb3goX19iLGFfYiwxLGNfYiwiXDE0OSIpaWYoYWFifj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iLGFfYiwxLGNfYixhYWIpZW5kCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iLGFfYiwxLGNfYixiYWFbImxlZnQiXSllbmQKaWYoYmFhWyJ0b3AiXX49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdUZXh0Qm94KF9fYixhX2IsYl9iLDEsIlwxMzEiKWlmKGFhYn49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9fYixhX2IsYl9iLDEsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iLGFfYixiX2IsMSxiYWFbInRvcCJdKWVuZAppZihiYWFbImxlZnQiXX49ZmFsc2UpYW5kKGJhYVsidG9wIl1+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3VGV4dEJveChfX2IsYV9iLDEsMSwiXDE1MSIpaWYoYWFifj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iLGFfYiwxLDEsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iLGFfYiwxLDEsYmFhWyJsZWZ0Il0pZW5kCmlmKGJhYVsicmlnaHQiXX49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdUZXh0Qm94KF9fYitiX2ItMSxhX2IsMSxjX2IsIlwxNDkiKWlmKGFhYn49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdGb3JlZ3JvdW5kQm94KF9fYitiX2ItMSxhX2IsMSxjX2IsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iK2JfYi0xLGFfYiwxLGNfYixiYWFbInJpZ2h0Il0pZW5kCmlmKGJhYVsiYm90dG9tIl1+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3VGV4dEJveChfX2IsYV9iK2NfYi0xLGJfYiwxLCJcMTQzIilpZihhYWJ+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IsYV9iK2NfYi0xLGJfYiwxLGRkYS5iZ0NvbG9yKWVuZApkZGEucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9fYixhX2IrY19iLTEsYl9iLDEsYmFhWyJib3R0b20iXSllbmQKaWYoYmFhWyJ0b3AiXX49ZmFsc2UpYW5kKGJhYVsicmlnaHQiXX49ZmFsc2UpdGhlbiBkZGEucGFyZW50OmRyYXdUZXh0Qm94KApfX2IrYl9iLTEsYV9iLDEsMSwiXDE0OCIpaWYKKGFhYn49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdGb3JlZ3JvdW5kQm94KF9fYitiX2ItMSxhX2IsMSwxLGRkYS5iZ0NvbG9yKWVuZApkZGEucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9fYitiX2ItMSxhX2IsMSwxLGJhYVsicmlnaHQiXSllbmQKaWYoYmFhWyJyaWdodCJdfj1mYWxzZSlhbmQoYmFhWyJib3R0b20iXX49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdUZXh0Qm94KApfX2IrYl9iLTEsYV9iK2NfYi0xLDEsMSwiXDEzMyIpaWYoYWFifj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iK2JfYi0xLGFfYitjX2ItMSwxLDEsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iK2JfYi0xLAphX2IrY19iLTEsMSwxLGJhYVsicmlnaHQiXSllbmQKaWYoYmFhWyJib3R0b20iXX49ZmFsc2UpYW5kKGJhYVsibGVmdCJdfj1mYWxzZSl0aGVuIGRkYS5wYXJlbnQ6ZHJhd1RleHRCb3goX19iLAphX2IrY19iLTEsMSwxLCJcMTM4IilpZihhYWJ+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveCgKX19iLTEsYV9iK2NfYi0xLDEsMSxkZGEuYmdDb2xvcillbmQKZGRhLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChfX2IsYV9iK2NfYi0xLDEsMSxiYWFbImxlZnQiXSllbmQgZW5kO2FkYT1mYWxzZTtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxnZXRBYnNvbHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKGRkYSxfX2IsYV9iKQppZigKX19iPT1uaWwpb3IoYV9iPT1uaWwpdGhlbiBfX2IsYV9iPWRkYTpnZXRBbmNob3JQb3NpdGlvbigpZW5kCmlmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmxvY2FsIGJfYixjX2I9ZGRhLnBhcmVudDpnZXRBYnNvbHV0ZVBvc2l0aW9uKClfX2I9Yl9iK19fYi0xO2FfYj1jX2IrYV9iLTEgZW5kO3JldHVybiBfX2IsYV9iIGVuZCxnZXRBbmNob3JQb3NpdGlvbj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpaWYoCl9fYj09bmlsKXRoZW4gX19iPWRkYTpnZXRYKCllbmQKaWYoYV9iPT1uaWwpdGhlbiBhX2I9ZGRhOmdldFkoKWVuZAppZihkZGEucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYS5wYXJlbnQ6Z2V0U2l6ZSgpCmlmKF9fYT09InRvcCIpdGhlbiBfX2I9bWF0aC5mbG9vcigKY19iLzIpK19fYi0xIGVsc2VpZihfX2E9PSJ0b3BSaWdodCIpdGhlbgpfX2I9Y19iK19fYi0xIGVsc2VpZihfX2E9PSJyaWdodCIpdGhlbiBfX2I9Y19iK19fYi0xCmFfYj1tYXRoLmZsb29yKGRfYi8yKSthX2ItMSBlbHNlaWYoX19hPT0iYm90dG9tUmlnaHQiKXRoZW4gX19iPWNfYitfX2ItMTthX2I9ZF9iK2FfYi0xIGVsc2VpZihfX2E9PSJib3R0b20iKXRoZW4gX19iPW1hdGguZmxvb3IoCmNfYi8yKStfX2ItMTthX2I9ZF9iK2FfYi0xIGVsc2VpZihfX2E9PQoiYm90dG9tTGVmdCIpdGhlbiBhX2I9ZF9iK2FfYi0xIGVsc2VpZihfX2E9PSJsZWZ0Iil0aGVuCmFfYj1tYXRoLmZsb29yKGRfYi8yKSthX2ItMSBlbHNlaWYoX19hPT0iY2VudGVyIil0aGVuIF9fYj1tYXRoLmZsb29yKGNfYi8yKStfX2ItMTthX2I9bWF0aC5mbG9vcigKZF9iLzIpK2FfYi0xIGVuZDtsb2NhbCBfYWIsYWFiPWRkYS5wYXJlbnQ6Z2V0T2Zmc2V0SW50ZXJuYWwoKWlmIG5vdChhX2Egb3IgYl9iKXRoZW4gcmV0dXJuCl9fYitfYWIsYV9iK2FhYiBlbmQgZW5kO3JldHVybiBfX2IsYV9iIGVuZCxpZ25vcmVPZmZzZXQ9ZnVuY3Rpb24oZGRhLF9fYikKYV9hPV9fYjtpZihfX2I9PW5pbCl0aGVuIGFfYT10cnVlIGVuZDtyZXR1cm4gZGRhIGVuZCxnZXRCYXNlRnJhbWU9ZnVuY3Rpb24oZGRhKQppZigKZGRhLnBhcmVudH49bmlsKXRoZW4gcmV0dXJuIGRkYS5wYXJlbnQ6Z2V0QmFzZUZyYW1lKCllbmQ7cmV0dXJuIGRkYSBlbmQsc2V0QW5jaG9yPWZ1bmN0aW9uKGRkYSxfX2IpX19hPV9fYgpkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsZ2V0QW5jaG9yPWZ1bmN0aW9uKGRkYSlyZXR1cm4gX19hIGVuZCxvbkNoYW5nZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoInZhbHVlX2NoYW5nZWQiLGFfYillbmQgZW5kO3JldHVybiBkZGEgZW5kLG9uQ2xpY2s9ZnVuY3Rpb24oZGRhLC4uLikKZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJtb3VzZV9jbGljayIsYV9iKWVuZCBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRkYSliZGFbIm1vdXNlX2NsaWNrIl09dHJ1ZQpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZGRhKWJkYVsibW91c2VfdXAiXT10cnVlIGVuZDtyZXR1cm4gZGRhIGVuZCxvbkNsaWNrVXA9ZnVuY3Rpb24oZGRhLC4uLilmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8KaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4gZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX3VwIixhX2IpZW5kIGVuZAppZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsZGRhKWJkYVsibW91c2VfY2xpY2siXT10cnVlCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3VwIixkZGEpYmRhWyJtb3VzZV91cCJdPXRydWUgZW5kO3JldHVybiBkZGEgZW5kLG9uUmVsZWFzZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX3JlbGVhc2UiLGFfYillbmQgZW5kCmlmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixkZGEpYmRhWyJtb3VzZV9jbGljayJdPXRydWUKZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfdXAiLGRkYSliZGFbIm1vdXNlX3VwIl09dHJ1ZSBlbmQ7cmV0dXJuIGRkYSBlbmQsb25TY3JvbGw9ZnVuY3Rpb24oZGRhLC4uLikKZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJtb3VzZV9zY3JvbGwiLGFfYillbmQgZW5kCmlmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3Njcm9sbCIsZGRhKWJkYVsibW91c2Vfc2Nyb2xsIl09dHJ1ZSBlbmQ7cmV0dXJuIGRkYSBlbmQsb25Ib3Zlcj1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX2hvdmVyIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9tb3ZlIixkZGEpYmRhWyJtb3VzZV9tb3ZlIl09dHJ1ZSBlbmQKcmV0dXJuIGRkYSBlbmQsb25MZWF2ZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX2xlYXZlIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9tb3ZlIixkZGEpYmRhWyJtb3VzZV9tb3ZlIl09dHJ1ZSBlbmQKcmV0dXJuIGRkYSBlbmQsb25EcmFnPWZ1bmN0aW9uKGRkYSwuLi4pCmZvciBfX2IsYV9iIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGFfYik9PSJmdW5jdGlvbiIpdGhlbgpkZGE6cmVnaXN0ZXJFdmVudCgibW91c2VfZHJhZyIsYV9iKWVuZCBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfZHJhZyIsZGRhKWJkYVsibW91c2VfZHJhZyJdPXRydWUKZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRkYSliZGFbIm1vdXNlX2NsaWNrIl09dHJ1ZQpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZGRhKWJkYVsibW91c2VfdXAiXT10cnVlIGVuZDtyZXR1cm4gZGRhIGVuZCxvbkV2ZW50PWZ1bmN0aW9uKGRkYSwuLi4pCmZvciBfX2IsYV9iIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGFfYik9PSJmdW5jdGlvbiIpdGhlbgpkZGE6cmVnaXN0ZXJFdmVudCgib3RoZXJfZXZlbnQiLGFfYillbmQgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixkZGEpYmRhWyJvdGhlcl9ldmVudCJdPXRydWUgZW5kO3JldHVybgpkZGEgZW5kLG9uS2V5PWZ1bmN0aW9uKGRkYSwuLi4pCmlmCihkYWEpdGhlbgpmb3IgX19iLGFfYiBpbiBwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImtleSIsYV9iKWVuZCBlbmQ7aWYoZGRhLnBhcmVudH49bmlsKXRoZW4gZGRhLnBhcmVudDphZGRFdmVudCgia2V5IixkZGEpCmJkYVsia2V5Il09dHJ1ZSBlbmQgZW5kO3JldHVybiBkZGEgZW5kLG9uQ2hhcj1mdW5jdGlvbihkZGEsLi4uKQppZgooZGFhKXRoZW4KZm9yIF9fYixhX2IgaW4gcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJjaGFyIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbiBkZGEucGFyZW50OmFkZEV2ZW50KCJjaGFyIixkZGEpCmJkYVsiY2hhciJdPXRydWUgZW5kIGVuZDtyZXR1cm4gZGRhIGVuZCxvblJlc2l6ZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImJhc2FsdF9yZXNpemUiLGFfYillbmQgZW5kO3JldHVybiBkZGEgZW5kLG9uUmVwb3NpdGlvbj1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImJhc2FsdF9yZXBvc2l0aW9uIixhX2IpZW5kIGVuZDtyZXR1cm4gZGRhIGVuZCxvbktleVVwPWZ1bmN0aW9uKGRkYSwuLi4pZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvCmlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuIGRkYTpyZWdpc3RlckV2ZW50KCJrZXlfdXAiLGFfYillbmQgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoImtleV91cCIsZGRhKWJkYVsia2V5X3VwIl09dHJ1ZSBlbmQ7cmV0dXJuIGRkYSBlbmQsaXNGb2N1c2VkPWZ1bmN0aW9uKGRkYSlpZigKZGRhLnBhcmVudH49bmlsKXRoZW4KcmV0dXJuIGRkYS5wYXJlbnQ6Z2V0Rm9jdXNlZE9iamVjdCgpPT1kZGEgZW5kO3JldHVybiBmYWxzZSBlbmQsb25HZXRGb2N1cz1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImdldF9mb2N1cyIsYV9iKWVuZCBlbmQ7aWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRkYSliZGFbIm1vdXNlX2NsaWNrIl09dHJ1ZSBlbmQ7cmV0dXJuCmRkYSBlbmQsb25Mb3NlRm9jdXM9ZnVuY3Rpb24oZGRhLC4uLikKZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJsb3NlX2ZvY3VzIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsZGRhKWJkYVsibW91c2VfY2xpY2siXT10cnVlIGVuZDtyZXR1cm4KZGRhIGVuZCxyZWdpc3RlckV2ZW50PWZ1bmN0aW9uKGRkYSxfX2IsYV9iKXJldHVybgpjZGE6cmVnaXN0ZXJFdmVudChfX2IsYV9iKWVuZCxyZW1vdmVFdmVudD1mdW5jdGlvbihkZGEsX19iLGFfYikKcmV0dXJuIGNkYTpyZW1vdmVFdmVudChfX2IsYV9iKWVuZCxzZW5kRXZlbnQ9ZnVuY3Rpb24oZGRhLF9fYiwuLi4pcmV0dXJuIGNkYTpzZW5kRXZlbnQoX19iLGRkYSwuLi4pZW5kLGlzQ29vcmRzSW5PYmplY3Q9ZnVuY3Rpb24oZGRhLF9fYixhX2IpCmlmCihiX2EpYW5kKGRhYSl0aGVuIGlmKF9fYj09bmlsKW9yKGFfYj09bmlsKXRoZW4gcmV0dXJuIGZhbHNlIGVuZApsb2NhbCBiX2IsY19iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKClsb2NhbCBkX2IsX2FiPWRkYTpnZXRTaXplKCkKaWYKKGJfYjw9X19iKWFuZChiX2IrZF9iPl9fYilhbmQoY19iPD1hX2IpYW5kKGNfYitfYWI+YV9iKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4gZmFsc2UgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IsY19iKQppZgooZGRhOmlzQ29vcmRzSW5PYmplY3QoYV9iLGJfYikpdGhlbiBsb2NhbCBkX2IsX2FiPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgYWFiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX2NsaWNrIixkZGEsIm1vdXNlX2NsaWNrIixfX2IsYV9iLQooZF9iLTEpLGJfYi0gKF9hYi0xKSxhX2IsYl9iLGNfYilpZihhYWI9PWZhbHNlKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OnNldEZvY3VzZWRPYmplY3QoZGRhKWVuZDtfYWE9dHJ1ZTtfYmE9dHJ1ZTthYmEsYmJhPWFfYixiX2I7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYixhX2IsYl9iKQpfYmE9ZmFsc2UKaWYoX2FhKXRoZW4gbG9jYWwgY19iLGRfYj1kZGE6Z2V0QWJzb2x1dGVQb3NpdGlvbigpCmxvY2FsIF9hYj1jZGE6c2VuZEV2ZW50KCJtb3VzZV9yZWxlYXNlIixkZGEsIm1vdXNlX3JlbGVhc2UiLF9fYixhX2ItICgKY19iLTEpLGJfYi0gKGRfYi0xKSxhX2IsYl9iKV9hYT1mYWxzZSBlbmQKaWYoZGRhOmlzQ29vcmRzSW5PYmplY3QoYV9iLGJfYikpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgX2FiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX3VwIixkZGEsIm1vdXNlX3VwIixfX2IsCmFfYi0gKGNfYi0xKSxiX2ItIChkX2ItMSksYV9iLGJfYilpZihfYWI9PWZhbHNlKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmFnSGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpCmlmCihfYmEpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgX2FiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX2RyYWciLGRkYSwibW91c2VfZHJhZyIsX19iLGFfYi0gKGNfYi0xKSwKYl9iLSAoZF9iLTEpLGFiYS1hX2IsYmJhLWJfYixhX2IsYl9iKWFiYSxiYmE9YV9iLGJfYjtpZihfYWJ+PW5pbCl0aGVuIHJldHVybiBfYWIgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6c2V0Rm9jdXNlZE9iamVjdChkZGEpZW5kO3JldHVybiB0cnVlIGVuZAppZihkZGE6aXNDb29yZHNJbk9iamVjdChhX2IsYl9iKSl0aGVuCmxvY2FsIGNfYixkX2I9ZGRhOmdldEFic29sdXRlUG9zaXRpb24oZGRhOmdldEFuY2hvclBvc2l0aW9uKCkpYWJhLGJiYT1hX2IsYl9iO2NiYSxkYmE9Y19iLWFfYixkX2ItYl9iIGVuZDtyZXR1cm4gZmFsc2UgZW5kLHNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYixhX2IsYl9iKQppZgooZGRhOmlzQ29vcmRzSW5PYmplY3QoYV9iLGJfYikpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgX2FiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX3Njcm9sbCIsZGRhLCJtb3VzZV9zY3JvbGwiLF9fYixhX2ItCihjX2ItMSksYl9iLSAoZF9iLTEpKWlmKF9hYj09ZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6c2V0Rm9jdXNlZE9iamVjdChkZGEpZW5kO3JldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGhvdmVySGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpCmlmCihkZGE6aXNDb29yZHNJbk9iamVjdChfX2IsYV9iKSl0aGVuCmxvY2FsIGNfYj1jZGE6c2VuZEV2ZW50KCJtb3VzZV9ob3ZlciIsZGRhLCJtb3VzZV9ob3ZlciIsX19iLGFfYixiX2IpaWYoY19iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7ZF9hPXRydWU7cmV0dXJuIHRydWUgZW5kCmlmKGRfYSl0aGVuCmxvY2FsIGNfYj1jZGE6c2VuZEV2ZW50KCJtb3VzZV9sZWF2ZSIsZGRhLCJtb3VzZV9sZWF2ZSIsX19iLGFfYixiX2IpaWYoY19iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7ZF9hPWZhbHNlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGtleUhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYixhX2IpaWYKKGRhYSlhbmQoYl9hKXRoZW4KaWYoZGRhOmlzRm9jdXNlZCgpKXRoZW4KbG9jYWwgYl9iPWNkYTpzZW5kRXZlbnQoImtleSIsZGRhLCJrZXkiLF9fYixhX2IpaWYoYl9iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7cmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4KZmFsc2UgZW5kLGtleVVwSGFuZGxlcj1mdW5jdGlvbihkZGEsX19iKWlmCihkYWEpYW5kKGJfYSl0aGVuCmlmKGRkYTppc0ZvY3VzZWQoKSl0aGVuCmxvY2FsIGFfYj1jZGE6c2VuZEV2ZW50KCJrZXlfdXAiLGRkYSwia2V5X3VwIixfX2IpaWYoYV9iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7cmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4KZmFsc2UgZW5kLGNoYXJIYW5kbGVyPWZ1bmN0aW9uKGRkYSxfX2IpaWYKKGRhYSlhbmQoYl9hKXRoZW4KaWYoZGRhOmlzRm9jdXNlZCgpKXRoZW4KbG9jYWwgYV9iPWNkYTpzZW5kRXZlbnQoImNoYXIiLGRkYSwiY2hhciIsX19iKWlmKGFfYj09ZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQ7cmV0dXJuCmZhbHNlIGVuZCx2YWx1ZUNoYW5nZWRIYW5kbGVyPWZ1bmN0aW9uKGRkYSkKY2RhOnNlbmRFdmVudCgidmFsdWVfY2hhbmdlZCIsZGRhLGRkKWVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYiwuLi4pbG9jYWwgYV9iPXsuLi59CmlmCihfX2I9PSJ0aW1lciIpYW5kKGFfYlsxXT09Y2NhKXRoZW4KaWYoX2NhW2JjYSsxXX49bmlsKXRoZW4gYmNhPWJjYSsxO2lmKGRjYT09InN0cmV0Y2giKXRoZW4KYWNhPWRiLnJlc2l6ZUJJTUcoX2NhLGRkYTpnZXRTaXplKCkpW2JjYV1lbHNlIGFjYT1fY2FbYmNhXWVuZDtsb2NhbCBjX2I9X2NhW2JjYV0uZHVyYXRpb24gb3IKX2NhLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2NhPW9zLnN0YXJ0VGltZXIoY19iKWVsc2UKaWYoX2RhKXRoZW4gYmNhPTE7aWYoZGNhPT0ic3RyZXRjaCIpdGhlbgphY2E9ZGIucmVzaXplQklNRyhfY2EsZGRhOmdldFNpemUoKSlbMV1lbHNlIGFjYT1fY2FbMV1lbmQ7bG9jYWwgY19iPQpfY2FbMV0uZHVyYXRpb24gb3IgX2NhLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2NhPW9zLnN0YXJ0VGltZXIoY19iKWVuZCBlbmQ7ZGRhOnVwZGF0ZURyYXcoKWVuZDtsb2NhbCBiX2I9Y2RhOnNlbmRFdmVudCgib3RoZXJfZXZlbnQiLGRkYSxfX2IsLi4uKWlmKGJfYn49bmlsKXRoZW4KcmV0dXJuIGJfYiBlbmQgZW5kLGN1c3RvbUV2ZW50SGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLC4uLikKaWYKKApfY2F+PW5pbClhbmQoZGNhPT0ic3RyZXRjaCIpYW5kKF9fYj09ImJhc2FsdF9yZXNpemUiKXRoZW4KYWNhPWRiLnJlc2l6ZUJJTUcoX2NhLGRkYTpnZXRTaXplKCkpW2JjYV1kZGE6dXBkYXRlRHJhdygpZW5kO2xvY2FsIGFfYj1jZGE6c2VuZEV2ZW50KCJjdXN0b21fZXZlbnQiLGRkYSxfX2IsLi4uKWlmKGFfYn49bmlsKXRoZW4KcmV0dXJuIGFfYiBlbmQ7cmV0dXJuIHRydWUgZW5kLGdldEZvY3VzSGFuZGxlcj1mdW5jdGlvbihkZGEpCmxvY2FsIF9fYj1jZGE6c2VuZEV2ZW50KCJnZXRfZm9jdXMiLGRkYSlpZihfX2J+PW5pbCl0aGVuIHJldHVybiBfX2IgZW5kO3JldHVybiB0cnVlIGVuZCxsb3NlRm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGRkYSkKX2JhPWZhbHNlO2xvY2FsIF9fYj1jZGE6c2VuZEV2ZW50KCJsb3NlX2ZvY3VzIixkZGEpCmlmKF9fYn49bmlsKXRoZW4gcmV0dXJuIF9fYiBlbmQ7cmV0dXJuIHRydWUgZW5kLGluaXQ9ZnVuY3Rpb24oZGRhKQppZgooZGRhLnBhcmVudH49bmlsKXRoZW4gZm9yIF9fYixhX2IgaW4gcGFpcnMoYmRhKWRvCmlmKGFfYil0aGVuIGRkYS5wYXJlbnQ6YWRkRXZlbnQoX19iLGRkYSllbmQgZW5kIGVuZDtpZiBub3QoY19hKXRoZW4gY19hPXRydWU7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmR9YmQuX19pbmRleD1iZDtyZXR1cm4gYmQgZW5kIGVuZAphYVsidGhlbWUiXT1mdW5jdGlvbiguLi4pCnJldHVybgp7QmFzYWx0Qkc9Y29sb3JzLmxpZ2h0R3JheSxCYXNhbHRUZXh0PWNvbG9ycy5ibGFjayxGcmFtZUJHPWNvbG9ycy5ncmF5LEZyYW1lVGV4dD1jb2xvcnMuYmxhY2ssQnV0dG9uQkc9Y29sb3JzLmdyYXksQnV0dG9uVGV4dD1jb2xvcnMuYmxhY2ssQ2hlY2tib3hCRz1jb2xvcnMuZ3JheSxDaGVja2JveFRleHQ9Y29sb3JzLmJsYWNrLElucHV0Qkc9Y29sb3JzLmdyYXksSW5wdXRUZXh0PWNvbG9ycy5ibGFjayxUZXh0ZmllbGRCRz1jb2xvcnMuZ3JheSxUZXh0ZmllbGRUZXh0PWNvbG9ycy5ibGFjayxMaXN0Qkc9Y29sb3JzLmdyYXksTGlzdFRleHQ9Y29sb3JzLmJsYWNrLE1lbnViYXJCRz1jb2xvcnMuZ3JheSxNZW51YmFyVGV4dD1jb2xvcnMuYmxhY2ssRHJvcGRvd25CRz1jb2xvcnMuZ3JheSxEcm9wZG93blRleHQ9Y29sb3JzLmJsYWNrLFJhZGlvQkc9Y29sb3JzLmdyYXksUmFkaW9UZXh0PWNvbG9ycy5ibGFjayxTZWxlY3Rpb25CRz1jb2xvcnMuYmxhY2ssU2VsZWN0aW9uVGV4dD1jb2xvcnMubGlnaHRHcmF5LEdyYXBoaWNCRz1jb2xvcnMuYmxhY2ssSW1hZ2VCRz1jb2xvcnMuYmxhY2ssUGFuZUJHPWNvbG9ycy5ibGFjayxQcm9ncmFtQkc9Y29sb3JzLmJsYWNrLFByb2dyZXNzYmFyQkc9Y29sb3JzLmdyYXksUHJvZ3Jlc3NiYXJUZXh0PWNvbG9ycy5ibGFjayxQcm9ncmVzc2JhckFjdGl2ZUJHPWNvbG9ycy5ibGFjayxTY3JvbGxiYXJCRz1jb2xvcnMubGlnaHRHcmF5LFNjcm9sbGJhclRleHQ9Y29sb3JzLmdyYXksU2Nyb2xsYmFyU3ltYm9sQ29sb3I9Y29sb3JzLmJsYWNrLFNsaWRlckJHPWZhbHNlLFNsaWRlclRleHQ9Y29sb3JzLmdyYXksU2xpZGVyU3ltYm9sQ29sb3I9Y29sb3JzLmJsYWNrLFN3aXRjaEJHPWNvbG9ycy5saWdodEdyYXksU3dpdGNoVGV4dD1jb2xvcnMuZ3JheSxTd2l0Y2hCR1N5bWJvbD1jb2xvcnMuYmxhY2ssU3dpdGNoSW5hY3RpdmU9Y29sb3JzLnJlZCxTd2l0Y2hBY3RpdmU9Y29sb3JzLmdyZWVuLExhYmVsQkc9ZmFsc2UsTGFiZWxUZXh0PWNvbG9ycy5ibGFjayxHcmFwaEJHPWNvbG9ycy5ncmF5LEdyYXBoVGV4dD1jb2xvcnMuYmxhY2t9ZW5kO2FhWyJvYmplY3RzIl09e30KYWFbIm9iamVjdHMiXVsiVGltZXIiXT1mdW5jdGlvbiguLi4pCmxvY2FsIGFiPWRhKCJiYXNhbHRFdmVudCIpbG9jYWwgYmI9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MCnJldHVybgpmdW5jdGlvbihjYilsb2NhbCBkYj0iVGltZXIibG9jYWwgX2M9MDtsb2NhbCBhYz0wO2xvY2FsIGJjPTA7bG9jYWwgY2MKbG9jYWwgZGM9YWIoKWxvY2FsIF9kPWZhbHNlCmxvY2FsIGFkPWZ1bmN0aW9uKGNkLGRkLF9fYSkKbG9jYWwgYV9hPWZ1bmN0aW9uKGJfYSkKaWYoYl9hOnN1YigxLDEpPT0iIyIpdGhlbgpsb2NhbCBjX2E9Y2Q6Z2V0QmFzZUZyYW1lKCk6Z2V0RGVlcE9iamVjdChiX2E6c3ViKDIsYl9hOmxlbigpKSkKaWYoY19hfj1uaWwpYW5kKGNfYS5pbnRlcm5hbE9iamV0Q2FsbH49bmlsKXRoZW4gZGQoY2QsZnVuY3Rpb24oKQpjX2E6aW50ZXJuYWxPYmpldENhbGwoKWVuZCllbmQgZWxzZQpkZChjZCxjZDpnZXRCYXNlRnJhbWUoKTpnZXRWYXJpYWJsZShiX2EpKWVuZCBlbmQ7aWYodHlwZShfX2EpPT0ic3RyaW5nIil0aGVuIGFfYShfX2EpZWxzZWlmKHR5cGUoX19hKT09InRhYmxlIil0aGVuCmZvciBiX2EsY19hIGluIHBhaXJzKF9fYSlkbyBhX2EoY19hKWVuZCBlbmQ7cmV0dXJuIGNkIGVuZApsb2NhbCBiZD17bmFtZT1jYixnZXRUeXBlPWZ1bmN0aW9uKGNkKXJldHVybiBkYiBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGNkLGRkKQppZihiYigidGltZSIsZGQpfj1uaWwpdGhlbiBfYz1iYigidGltZSIsZGQpZW5kO2lmKGJiKCJyZXBlYXQiLGRkKX49bmlsKXRoZW4gYWM9YmIoInJlcGVhdCIsZGQpZW5kCmlmKApiYigic3RhcnQiLGRkKX49bmlsKXRoZW4gaWYoYmIoInN0YXJ0IixkZCkpdGhlbiBjZDpzdGFydCgpZW5kIGVuZDtpZihiYigib25DYWxsIixkZCl+PW5pbCl0aGVuCmFkKGNkLGNkLm9uQ2FsbCxiYigib25DYWxsIixkZCkpZW5kO3JldHVybiBjZCBlbmQsZ2V0QmFzZUZyYW1lPWZ1bmN0aW9uKGNkKQppZigKY2QucGFyZW50fj1uaWwpdGhlbiByZXR1cm4gY2QucGFyZW50OmdldEJhc2VGcmFtZSgpZW5kO3JldHVybiBjZCBlbmQsZ2V0WkluZGV4PWZ1bmN0aW9uKGNkKXJldHVybiAxIGVuZCxnZXROYW1lPWZ1bmN0aW9uKGNkKQpyZXR1cm4gY2QubmFtZSBlbmQsc2V0VGltZT1mdW5jdGlvbihjZCxkZCxfX2EpX2M9ZGQgb3IgMDthYz1fX2Egb3IgMTtyZXR1cm4gY2QgZW5kLHN0YXJ0PWZ1bmN0aW9uKGNkKWlmKF9kKXRoZW4Kb3MuY2FuY2VsVGltZXIoY2MpZW5kO2JjPWFjO2NjPW9zLnN0YXJ0VGltZXIoX2MpX2Q9dHJ1ZQpjZC5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixjZClyZXR1cm4gY2QgZW5kLGlzQWN0aXZlPWZ1bmN0aW9uKGNkKXJldHVybiBfZCBlbmQsY2FuY2VsPWZ1bmN0aW9uKGNkKWlmKApjY349bmlsKXRoZW4gb3MuY2FuY2VsVGltZXIoY2MpZW5kO19kPWZhbHNlCmNkLnBhcmVudDpyZW1vdmVFdmVudCgib3RoZXJfZXZlbnQiLGNkKXJldHVybiBjZCBlbmQsb25DYWxsPWZ1bmN0aW9uKGNkLGRkKQpkYzpyZWdpc3RlckV2ZW50KCJ0aW1lZF9ldmVudCIsZGQpcmV0dXJuIGNkIGVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oY2QsZGQsX19hKQppZgpkZD09InRpbWVyImFuZCBfX2E9PWNjIGFuZCBfZCB0aGVuIGRjOnNlbmRFdmVudCgidGltZWRfZXZlbnQiLGNkKQppZihiYz49MSl0aGVuIGJjPWJjLTE7aWYoYmM+PTEpdGhlbgpjYz1vcy5zdGFydFRpbWVyKF9jKWVuZCBlbHNlaWYoYmM9PS0xKXRoZW4gY2M9b3Muc3RhcnRUaW1lcihfYyllbmQgZW5kIGVuZH1iZC5fX2luZGV4PWJkO3JldHVybiBiZCBlbmQgZW5kCmFhWyJvYmplY3RzIl1bIklucHV0Il09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWRhKCJiYXNhbHRMb2dzIilsb2NhbCBkYj1iYi5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKF9jKWxvY2FsIGFjPWFiKF9jKWxvY2FsIGJjPSJJbnB1dCJsb2NhbCBjYz0idGV4dCJsb2NhbCBkYz0wCmFjOnNldFpJbmRleCg1KWFjOnNldFZhbHVlKCIiKWFjLndpZHRoPTEwO2FjLmhlaWdodD0xO2xvY2FsIF9kPTE7bG9jYWwgYWQ9MTtsb2NhbCBiZD0iImxvY2FsIGNkO2xvY2FsIGRkCmxvY2FsIF9fYT1iZDtsb2NhbCBhX2E9ZmFsc2UKbG9jYWwgYl9hPXtnZXRUeXBlPWZ1bmN0aW9uKGNfYSlyZXR1cm4gYmMgZW5kLHNldElucHV0VHlwZT1mdW5jdGlvbihjX2EsZF9hKWlmKGRfYT09InBhc3N3b3JkIilvcihkX2E9PSJudW1iZXIiKW9yKGRfYT09CiJ0ZXh0Iil0aGVuIGNjPWRfYSBlbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldERlZmF1bHRUZXh0PWZ1bmN0aW9uKGNfYSxkX2EsX2FhLGFhYSliZD1kX2EKY2Q9YWFhIG9yIGNkO2RkPV9hYSBvciBkZDtpZihjX2E6aXNGb2N1c2VkKCkpdGhlbiBfX2E9IiJlbHNlIF9fYT1iZCBlbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldElucHV0VHlwZT1mdW5jdGlvbihjX2EpCnJldHVybiBjYyBlbmQsc2V0VmFsdWU9ZnVuY3Rpb24oY19hLGRfYSlhYy5zZXRWYWx1ZShjX2EsdG9zdHJpbmcoZF9hKSkKaWYgbm90KGFfYSl0aGVuIF9kPQp0b3N0cmluZyhkX2EpOmxlbigpKzEKYWQ9bWF0aC5tYXgoMSxfZC1jX2E6Z2V0V2lkdGgoKSsxKWlmKGNfYTppc0ZvY3VzZWQoKSl0aGVuIGxvY2FsIF9hYSxhYWE9Y19hOmdldEFuY2hvclBvc2l0aW9uKCkKY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSwKX2FhK19kLWFkLGFhYSttYXRoLmZsb29yKGNfYTpnZXRIZWlnaHQoKS8yKSxjX2EuZmdDb2xvcillbmQgZW5kO2NfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxnZXRWYWx1ZT1mdW5jdGlvbihjX2EpCmxvY2FsIGRfYT1hYy5nZXRWYWx1ZShjX2EpCnJldHVybiBjYz09Im51bWJlciJhbmQgdG9udW1iZXIoZF9hKW9yIGRfYSBlbmQsc2V0SW5wdXRMaW1pdD1mdW5jdGlvbihjX2EsZF9hKQpkYz10b251bWJlcihkX2Epb3IgZGM7Y19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldElucHV0TGltaXQ9ZnVuY3Rpb24oY19hKXJldHVybiBkYyBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGNfYSxkX2EpCmFjLnNldFZhbHVlc0J5WE1MRGF0YShjX2EsZF9hKWxvY2FsIF9hYSxhYWEKaWYoZGIoImRlZmF1bHRCRyIsZF9hKX49bmlsKXRoZW4gX2FhPWRiKCJkZWZhdWx0QkciLGRfYSllbmQKaWYoZGIoImRlZmF1bHRGRyIsZF9hKX49bmlsKXRoZW4gYWFhPWRiKCJkZWZhdWx0RkciLGRfYSllbmQ7aWYoZGIoImRlZmF1bHQiLGRfYSl+PW5pbCl0aGVuCmNfYTpzZXREZWZhdWx0VGV4dChkYigiZGVmYXVsdCIsZF9hKSxhYWF+PW5pbCBhbmQgY29sb3JzW2FhYV0sCl9hYX49bmlsIGFuZCBjb2xvcnNbX2FhXSllbmQKaWYoZGIoImxpbWl0IixkX2Epfj0KbmlsKXRoZW4gY19hOnNldElucHV0TGltaXQoZGIoImxpbWl0IixkX2EpKWVuZDtpZihkYigidHlwZSIsZF9hKX49bmlsKXRoZW4KY19hOnNldElucHV0VHlwZShkYigidHlwZSIsZF9hKSllbmQ7cmV0dXJuIGNfYSBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGNfYSkKYWMuZ2V0Rm9jdXNIYW5kbGVyKGNfYSkKaWYoY19hLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgZF9hLF9hYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKV9fYT0iImlmKGJkfj0iIil0aGVuCmNfYTp1cGRhdGVEcmF3KCllbmQKY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxkX2ErX2QtYWQsX2FhK21hdGgubWF4KG1hdGguY2VpbCgKY19hOmdldEhlaWdodCgpLzIgLTEsMSkpLGNfYS5mZ0NvbG9yKWVuZCBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihjX2EpCmFjLmxvc2VGb2N1c0hhbmRsZXIoY19hKWlmKGNfYS5wYXJlbnR+PW5pbCl0aGVuIF9fYT1iZDtpZihiZH49IiIpdGhlbiBjX2E6dXBkYXRlRHJhdygpZW5kCmNfYS5wYXJlbnQ6c2V0Q3Vyc29yKGZhbHNlKWVuZCBlbmQsa2V5SGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hKQppZgooYWMua2V5SGFuZGxlcihjX2EsZF9hKSl0aGVuIGxvY2FsIF9hYSxhYWE9Y19hOmdldFNpemUoKWFfYT10cnVlCmlmKGRfYT09a2V5cy5iYWNrc3BhY2UpdGhlbgpsb2NhbCBiYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSlpZihfZD4xKXRoZW4KY19hOnNldFZhbHVlKGJiYTpzdWIoMSxfZC0yKS4uYmJhOnN1YihfZCxiYmE6bGVuKCkpKWlmKF9kPjEpdGhlbiBfZD1fZC0xIGVuZAppZihhZD4xKXRoZW4gaWYoX2Q8YWQpdGhlbiBhZD1hZC0xIGVuZCBlbmQgZW5kIGVuZDtpZihkX2E9PWtleXMuZW50ZXIpdGhlbiBpZihjX2EucGFyZW50fj1uaWwpdGhlbiBlbmQgZW5kCmlmKApkX2E9PWtleXMucmlnaHQpdGhlbgpsb2NhbCBiYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSk6bGVuKClfZD1fZCsxO2lmKF9kPmJiYSl0aGVuIF9kPWJiYSsxIGVuZDtpZihfZDwxKXRoZW4gX2Q9MSBlbmQ7aWYKKF9kPGFkKW9yKF9kPj1fYWErYWQpdGhlbiBhZD1fZC1fYWErMSBlbmQ7aWYoYWQ8MSl0aGVuIGFkPTEgZW5kIGVuZAppZihkX2E9PWtleXMubGVmdCl0aGVuIF9kPV9kLTE7aWYoX2Q+PTEpdGhlbgppZihfZDxhZClvcihfZD49X2FhK2FkKXRoZW4gYWQ9X2QgZW5kIGVuZDtpZihfZDwxKXRoZW4gX2Q9MSBlbmQ7aWYoYWQ8MSl0aGVuIGFkPTEgZW5kIGVuZDtsb2NhbCBiYWEsY2FhPWNfYTpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGRhYT10b3N0cmluZyhhYy5nZXRWYWx1ZSgpKQpsb2NhbCBfYmE9KF9kPD1kYWE6bGVuKClhbmQgX2QtMSBvciBkYWE6bGVuKCkpLSAoYWQtMSlsb2NhbCBhYmE9Y19hOmdldFgoKQppZihfYmE+YWJhK19hYS0xKXRoZW4gX2JhPWFiYStfYWEtMSBlbmQ7aWYoY19hLnBhcmVudH49bmlsKXRoZW4KY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxiYWErX2JhLGNhYSsKbWF0aC5tYXgobWF0aC5jZWlsKGFhYS8yIC0xLDEpKSxjX2EuZmdDb2xvcillbmQKY19hOnVwZGF0ZURyYXcoKWFfYT1mYWxzZTtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxjaGFySGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hKQppZgooYWMuY2hhckhhbmRsZXIoY19hLGRfYSkpdGhlbiBhX2E9dHJ1ZTtsb2NhbCBfYWEsYWFhPWNfYTpnZXRTaXplKClsb2NhbCBiYWE9YWMuZ2V0VmFsdWUoKQppZigKYmFhOmxlbigpPGRjIG9yIGRjPD0wKXRoZW4KaWYoY2M9PSJudW1iZXIiKXRoZW4gbG9jYWwgY2JhPWJhYQppZgooX2Q9PTEgYW5kIGRfYT09Ii0iKW9yKGRfYT09Ii4iKW9yKHRvbnVtYmVyKGRfYSl+PW5pbCl0aGVuCmNfYTpzZXRWYWx1ZShiYWE6c3ViKDEsX2QtMSkuLgpkX2EuLmJhYTpzdWIoX2QsYmFhOmxlbigpKSlfZD1fZCsxO2lmKGRfYT09Ii4iKW9yKGRfYT09Ii0iKWFuZCgjYmFhPjApdGhlbgppZigKdG9udW1iZXIoYWMuZ2V0VmFsdWUoKSk9PW5pbCl0aGVuIGNfYTpzZXRWYWx1ZShjYmEpX2Q9X2QtMSBlbmQgZW5kIGVuZCBlbHNlCmNfYTpzZXRWYWx1ZShiYWE6c3ViKDEsX2QtMSkuLmRfYS4uYmFhOnN1YihfZCxiYWE6bGVuKCkpKV9kPV9kKzEgZW5kO2lmKF9kPj1fYWErYWQpdGhlbiBhZD1hZCsxIGVuZCBlbmQ7bG9jYWwgY2FhLGRhYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBfYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSkKbG9jYWwgYWJhPShfZDw9X2JhOmxlbigpYW5kIF9kLTEgb3IgX2JhOmxlbigpKS0gKGFkLTEpbG9jYWwgYmJhPWNfYTpnZXRYKCkKaWYoYWJhPmJiYStfYWEtMSl0aGVuIGFiYT1iYmErX2FhLTEgZW5kO2lmKGNfYS5wYXJlbnR+PW5pbCl0aGVuCmNfYS5wYXJlbnQ6c2V0Q3Vyc29yKHRydWUsY2FhK2FiYSxkYWErCm1hdGgubWF4KG1hdGguY2VpbChhYWEvMiAtMSwxKSksY19hLmZnQ29sb3IpZW5kO2FfYT1mYWxzZQpjX2E6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKGNfYSxkX2EsX2FhLGFhYSkKaWYKKGFjLm1vdXNlSGFuZGxlcihjX2EsZF9hLF9hYSxhYWEpKXRoZW4gbG9jYWwgYmFhLGNhYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBkYWEsX2JhPWNfYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGJhYSxjYWEpbG9jYWwgYWJhLGJiYT1jX2E6Z2V0U2l6ZSgpX2Q9X2FhLWRhYSthZDtsb2NhbCBjYmE9YWMuZ2V0VmFsdWUoKWlmKF9kPgpjYmE6bGVuKCkpdGhlbiBfZD1jYmE6bGVuKCkrMSBlbmQ7aWYoX2Q8YWQpdGhlbiBhZD1fZC0xCmlmKGFkPDEpdGhlbiBhZD0xIGVuZCBlbmQKY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxiYWErX2QtYWQsY2FhKwptYXRoLm1heChtYXRoLmNlaWwoYmJhLzIgLTEsMSkpLGNfYS5mZ0NvbG9yKXJldHVybiB0cnVlIGVuZCBlbmQsZHJhZ0hhbmRsZXI9ZnVuY3Rpb24oY19hLGRfYSxfYWEsYWFhLGJhYSxjYWEpCmlmCihjX2E6aXNGb2N1c2VkKCkpdGhlbiBpZihjX2E6aXNDb29yZHNJbk9iamVjdChfYWEsYWFhKSl0aGVuCmlmKGFjLmRyYWdIYW5kbGVyKGNfYSxkX2EsX2FhLGFhYSxiYWEsY2FhKSl0aGVuIHJldHVybiB0cnVlIGVuZCBlbmQKY19hLnBhcmVudDpyZW1vdmVGb2N1c2VkT2JqZWN0KCllbmQgZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hLF9hYSwuLi4pCmFjLmV2ZW50SGFuZGxlcihjX2EsZF9hLF9hYSwuLi4pCmlmKGRfYT09InBhc3RlIil0aGVuCmlmKGNfYTppc0ZvY3VzZWQoKSl0aGVuIGxvY2FsIGFhYT1hYy5nZXRWYWx1ZSgpCmxvY2FsIGJhYSxjYWE9Y19hOmdldFNpemUoKWFfYT10cnVlCmlmKGNjPT0ibnVtYmVyIil0aGVuIGxvY2FsIGRiYT1hYWEKaWYoX2FhPT0iLiIpb3IodG9udW1iZXIoX2FhKX49bmlsKXRoZW4KY19hOnNldFZhbHVlKGFhYTpzdWIoMSwKX2QtMSkuLl9hYS4uYWFhOnN1YihfZCxhYWE6bGVuKCkpKV9kPV9kK19hYTpsZW4oKWVuZAppZih0b251bWJlcihhYy5nZXRWYWx1ZSgpKT09bmlsKXRoZW4gY19hOnNldFZhbHVlKGRiYSllbmQgZWxzZQpjX2E6c2V0VmFsdWUoYWFhOnN1YigxLF9kLTEpLi5fYWEuLmFhYTpzdWIoX2QsYWFhOmxlbigpKSlfZD1fZCtfYWE6bGVuKCllbmQ7aWYoX2Q+PWJhYSthZCl0aGVuIGFkPShfZCsxKS1iYWEgZW5kCmxvY2FsIGRhYSxfYmE9Y19hOmdldEFuY2hvclBvc2l0aW9uKClsb2NhbCBhYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSkKbG9jYWwgYmJhPSgKX2Q8PWFiYTpsZW4oKWFuZCBfZC0xIG9yIGFiYTpsZW4oKSktIChhZC0xKWxvY2FsIGNiYT1jX2E6Z2V0WCgpCmlmKGJiYT5jYmErYmFhLTEpdGhlbiBiYmE9Y2JhK2JhYS0xIGVuZDtpZihjX2EucGFyZW50fj1uaWwpdGhlbgpjX2EucGFyZW50OnNldEN1cnNvcih0cnVlLGRhYStiYmEsX2JhKwptYXRoLm1heChtYXRoLmNlaWwoY2FhLzIgLTEsMSkpLGNfYS5mZ0NvbG9yKWVuZApjX2E6dXBkYXRlRHJhdygpYV9hPWZhbHNlIGVuZCBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oY19hKQppZgooYWMuZHJhdyhjX2EpKXRoZW4KaWYoY19hLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgZF9hLF9hYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBhYWEsYmFhPWNfYTpnZXRTaXplKClsb2NhbCBjYWE9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oYmFhLCJjZW50ZXIiKWlmCihjX2EuYmdDb2xvcn49ZmFsc2UpdGhlbgpjX2EucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRfYSxfYWEsYWFhLGJhYSxjX2EuYmdDb2xvcillbmQKZm9yIG49MSxiYWEgZG8KaWYobj09Y2FhKXRoZW4KbG9jYWwgZGFhPXRvc3RyaW5nKGFjLmdldFZhbHVlKCkpbG9jYWwgX2JhPWNfYS5iZ0NvbG9yO2xvY2FsIGFiYT1jX2EuZmdDb2xvcjtsb2NhbCBiYmE7aWYoZGFhOmxlbigpPD0wKXRoZW4gYmJhPV9fYQpfYmE9Y2Qgb3IgX2JhO2FiYT1kZCBvciBhYmEgZW5kO2JiYT1fX2EKaWYoZGFhfj0iIil0aGVuIGJiYT1kYWEgZW5kO2JiYT1iYmE6c3ViKGFkLGFhYSthZC0xKWxvY2FsIGNiYT1hYWEtYmJhOmxlbigpaWYoY2JhPDApdGhlbgpjYmE9MCBlbmQ7aWYoY2M9PSJwYXNzd29yZCIpYW5kKGRhYX49IiIpdGhlbgpiYmE9c3RyaW5nLnJlcCgiKiIsYmJhOmxlbigpKWVuZApiYmE9YmJhLi5zdHJpbmcucmVwKGNfYS5iZ1N5bWJvbCxjYmEpCmNfYS5wYXJlbnQ6d3JpdGVUZXh0KGRfYSxfYWErIChuLTEpLGJiYSxfYmEsYWJhKWVuZCBlbmQ7aWYoY19hOmlzRm9jdXNlZCgpKXRoZW4KY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxkX2ErX2QtYWQsX2FhKwptYXRoLmZsb29yKGNfYTpnZXRIZWlnaHQoKS8yKSxjX2EuZmdDb2xvcillbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihjX2EpCmlmKApjX2EucGFyZW50fj1uaWwpdGhlbiBjX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsY19hKQpjX2EucGFyZW50OmFkZEV2ZW50KCJrZXkiLGNfYSljX2EucGFyZW50OmFkZEV2ZW50KCJjaGFyIixjX2EpCmNfYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixjX2EpY19hLnBhcmVudDphZGRFdmVudCgibW91c2VfZHJhZyIsY19hKWVuZAppZihhYy5pbml0KGNfYSkpdGhlbgpjX2EuYmdDb2xvcj1jX2EucGFyZW50OmdldFRoZW1lKCJJbnB1dEJHIiljX2EuZmdDb2xvcj1jX2EucGFyZW50OmdldFRoZW1lKCJJbnB1dFRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShiX2EsYWMpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJDaGVja2JveCJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidXRpbHMiKQpsb2NhbCBjYj1iYi5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGRiKWxvY2FsIF9jPWFiKGRiKWxvY2FsIGFjPSJDaGVja2JveCJfYzpzZXRaSW5kZXgoNSkKX2M6c2V0VmFsdWUoZmFsc2UpX2Mud2lkdGg9MTtfYy5oZWlnaHQ9MTtsb2NhbCBiYz0iXDQyIgpsb2NhbCBjYz17Z2V0VHlwZT1mdW5jdGlvbihkYylyZXR1cm4gYWMgZW5kLHNldFN5bWJvbD1mdW5jdGlvbihkYyxfZCliYz1fZApkYzp1cGRhdGVEcmF3KClyZXR1cm4gZGMgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkYyxfZCxhZCxiZCkKaWYoX2MubW91c2VIYW5kbGVyKGRjLF9kLGFkLGJkKSl0aGVuCmlmKF9kPT0xKXRoZW4KaWYoCmRjOmdldFZhbHVlKCl+PXRydWUpYW5kKGRjOmdldFZhbHVlKCl+PWZhbHNlKXRoZW4KZGM6c2V0VmFsdWUoZmFsc2UpZWxzZSBkYzpzZXRWYWx1ZShub3QgZGM6Z2V0VmFsdWUoKSllbmQ7ZGM6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4gZmFsc2UgZW5kLHRvdWNoSGFuZGxlcj1mdW5jdGlvbihkYyxfZCxhZClyZXR1cm4KZGM6bW91c2VIYW5kbGVyKDEsX2QsYWQpZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihkYyxfZCkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGRjLF9kKQppZihjYigiY2hlY2tlZCIsX2Qpfj1uaWwpdGhlbiBpZihjYigiY2hlY2tlZCIsX2QpKXRoZW4gZGM6c2V0VmFsdWUodHJ1ZSllbHNlCmRjOnNldFZhbHVlKGZhbHNlKWVuZCBlbmQ7cmV0dXJuIGRjIGVuZCxkcmF3PWZ1bmN0aW9uKGRjKQppZgooX2MuZHJhdyhkYykpdGhlbgppZihkYy5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIF9kLGFkPWRjOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgYmQsY2Q9ZGM6Z2V0U2l6ZSgpbG9jYWwgZGQ9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oY2QsImNlbnRlciIpaWYKKGRjLmJnQ29sb3J+PWZhbHNlKXRoZW4KZGMucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9kLGFkLGJkLGNkLGRjLmJnQ29sb3IpZW5kCmZvciBuPTEsY2QgZG8KaWYobj09ZGQpdGhlbgppZihkYzpnZXRWYWx1ZSgpPT10cnVlKXRoZW4KZGMucGFyZW50OndyaXRlVGV4dChfZCwKYWQrIChuLTEpLGJiLmdldFRleHRIb3Jpem9udGFsQWxpZ24oYmMsYmQsImNlbnRlciIpLGRjLmJnQ29sb3IsZGMuZmdDb2xvcillbHNlCmRjLnBhcmVudDp3cml0ZVRleHQoX2QsYWQrIChuLTEpLGJiLmdldFRleHRIb3Jpem9udGFsQWxpZ24oIiAiLGJkLCJjZW50ZXIiKSxkYy5iZ0NvbG9yLGRjLmZnQ29sb3IpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihkYykKZGMucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsZGMpZGMucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZGMpCmlmKF9jLmluaXQoZGMpKXRoZW4KZGMuYmdDb2xvcj1kYy5wYXJlbnQ6Z2V0VGhlbWUoIkNoZWNrYm94QkciKWRjLmZnQ29sb3I9ZGMucGFyZW50OmdldFRoZW1lKCJDaGVja2JveFRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShjYyxfYyllbmQgZW5kCmFhWyJvYmplY3RzIl1bIlBhbmUiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpbG9jYWwgYmI9ZGEoImJhc2FsdExvZ3MiKQpyZXR1cm4KZnVuY3Rpb24oY2IpCmxvY2FsIGRiPWFiKGNiKWxvY2FsIF9jPSJQYW5lIgpsb2NhbCBhYz17Z2V0VHlwZT1mdW5jdGlvbihiYylyZXR1cm4gX2MgZW5kLHNldEJhY2tncm91bmQ9ZnVuY3Rpb24oYmMsY2MsZGMsX2QpZGIuc2V0QmFja2dyb3VuZChiYyxjYyxkYyxfZCkKcmV0dXJuIGJjIGVuZCxpbml0PWZ1bmN0aW9uKGJjKQppZihkYi5pbml0KGJjKSl0aGVuCmJjLmJnQ29sb3I9YmMucGFyZW50OmdldFRoZW1lKCJQYW5lQkciKWJjLmZnQ29sb3I9YmMucGFyZW50OmdldFRoZW1lKCJQYW5lQkciKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShhYyxkYillbmQgZW5kCmFhWyJvYmplY3RzIl1bIlByb2dyZXNzYmFyIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKQpsb2NhbCBiYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGNiKWxvY2FsIGRiPWFiKGNiKWxvY2FsIF9jPSJQcm9ncmVzc2JhciJsb2NhbCBhYz0wO2RiOnNldFpJbmRleCg1KQpkYjpzZXRWYWx1ZShmYWxzZSlkYi53aWR0aD0yNTtkYi5oZWlnaHQ9MTtsb2NhbCBiYztsb2NhbCBjYz0iImxvY2FsIGRjPWNvbG9ycy53aGl0ZTtsb2NhbCBfZD0iImxvY2FsIGFkPTAKbG9jYWwgYmQ9e2luaXQ9ZnVuY3Rpb24oY2QpCmlmCihkYi5pbml0KGNkKSl0aGVuIGNkLmJnQ29sb3I9Y2QucGFyZW50OmdldFRoZW1lKCJQcm9ncmVzc2JhckJHIikKY2QuZmdDb2xvcj1jZC5wYXJlbnQ6Z2V0VGhlbWUoIlByb2dyZXNzYmFyVGV4dCIpYmM9Y2QucGFyZW50OmdldFRoZW1lKCJQcm9ncmVzc2JhckFjdGl2ZUJHIillbmQgZW5kLGdldFR5cGU9ZnVuY3Rpb24oY2QpcmV0dXJuCl9jIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oY2QsZGQpZGIuc2V0VmFsdWVzQnlYTUxEYXRhKGNkLGRkKWlmKGJiKCJkaXJlY3Rpb24iLGRkKX49Cm5pbCl0aGVuIGFkPWJiKCJkaXJlY3Rpb24iLGRkKWVuZAppZigKYmIoInByb2dyZXNzQ29sb3IiLGRkKX49bmlsKXRoZW4gYmM9Y29sb3JzW2JiKCJwcm9ncmVzc0NvbG9yIixkZCldZW5kCmlmKGJiKCJwcm9ncmVzc1N5bWJvbCIsZGQpfj1uaWwpdGhlbiBjYz1iYigicHJvZ3Jlc3NTeW1ib2wiLGRkKWVuZDtpZihiYigiYmFja2dyb3VuZFN5bWJvbCIsZGQpfj1uaWwpdGhlbgpfZD1iYigiYmFja2dyb3VuZFN5bWJvbCIsZGQpZW5kCmlmCihiYigicHJvZ3Jlc3NTeW1ib2xDb2xvciIsZGQpfj1uaWwpdGhlbiBkYz1jb2xvcnNbYmIoInByb2dyZXNzU3ltYm9sQ29sb3IiLGRkKV1lbmQ7aWYoYmIoIm9uRG9uZSIsZGQpfj1uaWwpdGhlbgpjZDpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oY2Qub25Qcm9ncmVzc0RvbmUsYmIoIm9uRG9uZSIsZGQpKWVuZDtyZXR1cm4gY2QgZW5kLHNldERpcmVjdGlvbj1mdW5jdGlvbihjZCxkZCkKYWQ9ZGQ7Y2Q6dXBkYXRlRHJhdygpcmV0dXJuIGNkIGVuZCxzZXRQcm9ncmVzc0Jhcj1mdW5jdGlvbihjZCxkZCxfX2EsYV9hKWJjPWRkIG9yIGJjCmNjPV9fYSBvciBjYztkYz1hX2Egb3IgZGM7Y2Q6dXBkYXRlRHJhdygpcmV0dXJuIGNkIGVuZCxzZXRCYWNrZ3JvdW5kU3ltYm9sPWZ1bmN0aW9uKGNkLGRkKQpfZD1kZDpzdWIoMSwxKWNkOnVwZGF0ZURyYXcoKXJldHVybiBjZCBlbmQsc2V0UHJvZ3Jlc3M9ZnVuY3Rpb24oY2QsZGQpaWYKKGRkPj0wKWFuZChkZDw9MTAwKWFuZChhY349ZGQpdGhlbiBhYz1kZDtjZDpzZXRWYWx1ZShhYylpZihhYz09MTAwKXRoZW4KY2Q6cHJvZ3Jlc3NEb25lSGFuZGxlcigpZW5kIGVuZApjZDp1cGRhdGVEcmF3KClyZXR1cm4gY2QgZW5kLGdldFByb2dyZXNzPWZ1bmN0aW9uKGNkKXJldHVybgphYyBlbmQsb25Qcm9ncmVzc0RvbmU9ZnVuY3Rpb24oY2QsZGQpY2Q6cmVnaXN0ZXJFdmVudCgicHJvZ3Jlc3NfZG9uZSIsZGQpCnJldHVybiBjZCBlbmQscHJvZ3Jlc3NEb25lSGFuZGxlcj1mdW5jdGlvbihjZCkKY2Q6c2VuZEV2ZW50KCJwcm9ncmVzc19kb25lIixjZCllbmQsZHJhdz1mdW5jdGlvbihjZCkKaWYoZGIuZHJhdyhjZCkpdGhlbgppZihjZC5wYXJlbnR+PW5pbCl0aGVuCmxvY2FsIGRkLF9fYT1jZDpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYV9hLGJfYT1jZDpnZXRTaXplKClpZihjZC5iZ0NvbG9yfj1mYWxzZSl0aGVuCmNkLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChkZCxfX2EsYV9hLGJfYSxjZC5iZ0NvbG9yKWVuZDtpZihfZH49IiIpdGhlbgpjZC5wYXJlbnQ6ZHJhd1RleHRCb3goZGQsX19hLGFfYSxiX2EsX2QpZW5kO2lmKGNkLmZnQ29sb3J+PWZhbHNlKXRoZW4KY2QucGFyZW50OmRyYXdGb3JlZ3JvdW5kQm94KGRkLF9fYSxhX2EsYl9hLGNkLmZnQ29sb3IpZW5kCmlmKGFkPT0xKXRoZW4gY2QucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRkLF9fYSxhX2EsCmJfYS8xMDAgKmFjLGJjKWNkLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZCxfX2EsYV9hLApiX2EvMTAwICphYyxkYyljZC5wYXJlbnQ6ZHJhd1RleHRCb3goZGQsX19hLGFfYSwKYl9hLzEwMCAqYWMsY2MpZWxzZWlmKGFkPT0yKXRoZW4KY2QucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRkLApfX2ErbWF0aC5jZWlsKGJfYS1iX2EvMTAwICphYyksYV9hLGJfYS8xMDAgKmFjLGJjKQpjZC5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goZGQsX19hK21hdGguY2VpbChiX2EtYl9hLzEwMCAqYWMpLGFfYSwKYl9hLzEwMCAqYWMsZGMpCmNkLnBhcmVudDpkcmF3VGV4dEJveChkZCxfX2ErbWF0aC5jZWlsKGJfYS1iX2EvMTAwICphYyksYV9hLApiX2EvMTAwICphYyxjYyllbHNlaWYoYWQ9PTMpdGhlbgpjZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goZGQrbWF0aC5jZWlsKGFfYS1hX2EvMTAwICphYyksX19hLAphX2EvMTAwICphYyxiX2EsYmMpCmNkLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZCttYXRoLmNlaWwoYV9hLWFfYS8xMDAgKmFjKSxfX2EsCmFfYS8xMDAgKmFjLGJfYSxkYykKY2QucGFyZW50OmRyYXdUZXh0Qm94KGRkK21hdGguY2VpbChhX2EtYV9hLzEwMCAqYWMpLF9fYSwKYV9hLzEwMCAqYWMsYl9hLGNjKWVsc2UKY2QucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRkLF9fYSxhX2EvMTAwICphYyxiX2EsYmMpCmNkLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZCxfX2EsYV9hLzEwMCAqYWMsYl9hLGRjKQpjZC5wYXJlbnQ6ZHJhd1RleHRCb3goZGQsX19hLGFfYS8xMDAgKmFjLGJfYSxjYyllbmQgZW5kIGVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShiZCxkYillbmQgZW5kCmFhWyJvYmplY3RzIl1bIkRyb3Bkb3duIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWRhKCJ1dGlscyIpLmdldFZhbHVlRnJvbVhNTApyZXR1cm4KZnVuY3Rpb24oZGIpbG9jYWwgX2M9YWIoZGIpbG9jYWwgYWM9IkRyb3Bkb3duIl9jLndpZHRoPTEyO19jLmhlaWdodD0xO19jOnNldFpJbmRleCg2KQpsb2NhbCBiYz17fWxvY2FsIGNjO2xvY2FsIGRjO2xvY2FsIF9kPXRydWU7bG9jYWwgYWQ9ImxlZnQibG9jYWwgYmQ9MDtsb2NhbCBjZD0xNjtsb2NhbCBkZD02O2xvY2FsIF9fYT0iXDE2ImxvY2FsIGFfYT0iXDMxImxvY2FsIGJfYT1mYWxzZQpsb2NhbCBjX2E9e2dldFR5cGU9ZnVuY3Rpb24oZF9hKXJldHVybgphYyBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGRfYSxfYWEpX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGRfYSxfYWEpCmlmKApjYigic2VsZWN0aW9uQkciLF9hYSl+PW5pbCl0aGVuIGNjPWNvbG9yc1tjYigic2VsZWN0aW9uQkciLF9hYSldZW5kO2lmKGNiKCJzZWxlY3Rpb25GRyIsX2FhKX49bmlsKXRoZW4KZGM9Y29sb3JzW2NiKCJzZWxlY3Rpb25GRyIsX2FhKV1lbmQ7aWYoY2IoImRyb3Bkb3duV2lkdGgiLF9hYSl+PW5pbCl0aGVuCmNkPWNiKCJkcm9wZG93bldpZHRoIixfYWEpZW5kO2lmKGNiKCJkcm9wZG93bkhlaWdodCIsX2FhKX49bmlsKXRoZW4KZGQ9Y2IoImRyb3Bkb3duSGVpZ2h0IixfYWEpZW5kO2lmKGNiKCJvZmZzZXQiLF9hYSl+PW5pbCl0aGVuCmJkPWNiKCJvZmZzZXQiLF9hYSllbmQKaWYoX2FhWyJpdGVtIl1+PW5pbCl0aGVuIGxvY2FsIGFhYT1fYWFbIml0ZW0iXWlmKAphYWEucHJvcGVydGllc349bmlsKXRoZW4gYWFhPXthYWF9ZW5kO2ZvciBiYWEsY2FhIGluIHBhaXJzKGFhYSlkbwpkX2E6YWRkSXRlbShjYigidGV4dCIsY2FhKSxjb2xvcnNbY2IoImJnIixjYWEpXSxjb2xvcnNbY2IoImZnIixjYWEpXSllbmQgZW5kIGVuZCxzZXRPZmZzZXQ9ZnVuY3Rpb24oZF9hLF9hYSkKYmQ9X2FhO2RfYTp1cGRhdGVEcmF3KClyZXR1cm4gZF9hIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oZF9hKXJldHVybiBiZCBlbmQsYWRkSXRlbT1mdW5jdGlvbihkX2EsX2FhLGFhYSxiYWEsLi4uKQp0YWJsZS5pbnNlcnQoYmMse3RleHQ9X2FhLGJnQ29sPQphYWEgb3IgZF9hLmJnQ29sb3IsZmdDb2w9YmFhIG9yIGRfYS5mZ0NvbG9yLGFyZ3M9ey4uLn19KWRfYTp1cGRhdGVEcmF3KClyZXR1cm4gZF9hIGVuZCxnZXRBbGw9ZnVuY3Rpb24oZF9hKXJldHVybgpiYyBlbmQscmVtb3ZlSXRlbT1mdW5jdGlvbihkX2EsX2FhKXRhYmxlLnJlbW92ZShiYyxfYWEpZF9hOnVwZGF0ZURyYXcoKQpyZXR1cm4gZF9hIGVuZCxnZXRJdGVtPWZ1bmN0aW9uKGRfYSxfYWEpcmV0dXJuIGJjW19hYV1lbmQsZ2V0SXRlbUluZGV4PWZ1bmN0aW9uKGRfYSkKbG9jYWwgX2FhPWRfYTpnZXRWYWx1ZSgpZm9yIGFhYSxiYWEgaW4gcGFpcnMoYmMpZG8gaWYoYmFhPT1fYWEpdGhlbiByZXR1cm4gYWFhIGVuZCBlbmQgZW5kLGNsZWFyPWZ1bmN0aW9uKGRfYSkKYmM9e31kX2E6c2V0VmFsdWUoe30sZmFsc2UpZF9hOnVwZGF0ZURyYXcoKXJldHVybiBkX2EgZW5kLGdldEl0ZW1Db3VudD1mdW5jdGlvbihkX2EpcmV0dXJuCiNiYyBlbmQsZWRpdEl0ZW09ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhLGNhYSwuLi4pdGFibGUucmVtb3ZlKGJjLF9hYSkKdGFibGUuaW5zZXJ0KGJjLF9hYSx7dGV4dD1hYWEsYmdDb2w9YmFhIG9yIGRfYS5iZ0NvbG9yLGZnQ29sPQpjYWEgb3IgZF9hLmZnQ29sb3IsYXJncz17Li4ufX0pZF9hOnVwZGF0ZURyYXcoKXJldHVybiBkX2EgZW5kLHNlbGVjdEl0ZW09ZnVuY3Rpb24oZF9hLF9hYSlkX2E6c2V0VmFsdWUoCmJjW19hYV1vcnt9LGZhbHNlKWRfYTp1cGRhdGVEcmF3KClyZXR1cm4gZF9hIGVuZCxzZXRTZWxlY3RlZEl0ZW09ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhKWNjPQpfYWEgb3IgZF9hLmJnQ29sb3I7ZGM9YWFhIG9yIGRfYS5mZ0NvbG9yCl9kPWJhYX49bmlsIGFuZCBiYWE7ZF9hOnVwZGF0ZURyYXcoKXJldHVybiBkX2EgZW5kLHNldERyb3Bkb3duU2l6ZT1mdW5jdGlvbihkX2EsX2FhLGFhYSkKY2QsZGQ9X2FhLGFhYTtkX2E6dXBkYXRlRHJhdygpcmV0dXJuIGRfYSBlbmQsZ2V0RHJvcGRvd25TaXplPWZ1bmN0aW9uKGRfYSlyZXR1cm4gY2QsZGQgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkX2EsX2FhLGFhYSxiYWEsY2FhKQppZgooYl9hKXRoZW4KbG9jYWwgZGFhLF9iYT1kX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihkX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSkKaWYoX2FhPT0xKXRoZW4KaWYoI2JjPjApdGhlbgpmb3Igbj0xLGRkIGRvCmlmKGJjW24rYmRdfj1uaWwpdGhlbgppZihkYWE8PWFhYSlhbmQoZGFhK2NkPmFhYSlhbmQKKF9iYStuPT1iYWEpdGhlbiBkX2E6c2V0VmFsdWUoYmNbbitiZF0pCmRfYTp1cGRhdGVEcmF3KCkKbG9jYWwgYWJhPWRfYTpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgibW91c2VfY2xpY2siLGRfYSwibW91c2VfY2xpY2siLGRpcixhYWEsYmFhKWlmKGNhYSl0aGVuIGRfYTptb3VzZVVwSGFuZGxlcihfYWEsYWFhLGJhYSllbmQ7aWYoYWJhPT0KZmFsc2UpdGhlbiByZXR1cm4gYWJhIGVuZDtyZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZAppZihfYy5tb3VzZUhhbmRsZXIoZF9hLF9hYSxhYWEsYmFhKSl0aGVuIGJfYT0obm90IGJfYSlkX2E6dXBkYXRlRHJhdygpCnJldHVybiB0cnVlIGVsc2UgaWYoYl9hKXRoZW4gZF9hOnVwZGF0ZURyYXcoKWJfYT1mYWxzZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCBlbmQsbW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhKQppZgooYl9hKXRoZW4KbG9jYWwgY2FhLGRhYT1kX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihkX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSkKaWYoX2FhPT0xKXRoZW4KaWYoI2JjPjApdGhlbgpmb3Igbj0xLGRkIGRvCmlmKGJjW24rYmRdfj1uaWwpdGhlbgppZihjYWE8PWFhYSlhbmQoY2FhK2NkPmFhYSlhbmQKKGRhYStuPT1iYWEpdGhlbiBiX2E9ZmFsc2U7ZF9hOnVwZGF0ZURyYXcoKQpsb2NhbCBfYmE9ZF9hOmdldEV2ZW50U3lzdGVtKCk6c2VuZEV2ZW50KCJtb3VzZV91cCIsZF9hLCJtb3VzZV91cCIsZGlyLGFhYSxiYWEpaWYoX2JhPT1mYWxzZSl0aGVuIHJldHVybiBfYmEgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCxzY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKGRfYSxfYWEsYWFhLGJhYSkKaWYKKGJfYSlhbmQoZF9hOmlzRm9jdXNlZCgpKXRoZW4gYmQ9YmQrX2FhO2lmKGJkPDApdGhlbiBiZD0wIGVuZDtpZihfYWE9PTEpdGhlbgppZigjYmM+ZGQpdGhlbiBpZihiZD4KI2JjLWRkKXRoZW4gYmQ9I2JjLWRkIGVuZCBlbHNlIGJkPW1hdGgubWluKCNiYy0xLDApZW5kIGVuZApsb2NhbCBjYWE9ZF9hOmdldEV2ZW50U3lzdGVtKCk6c2VuZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGRfYSwibW91c2Vfc2Nyb2xsIixfYWEsYWFhLGJhYSlpZihjYWE9PWZhbHNlKXRoZW4gcmV0dXJuIGNhYSBlbmQ7ZF9hOnVwZGF0ZURyYXcoKXJldHVybiB0cnVlIGVuZCBlbmQsZHJhdz1mdW5jdGlvbihkX2EpCmlmCihfYy5kcmF3KGRfYSkpdGhlbiBsb2NhbCBfYWEsYWFhPWRfYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYmFhLGNhYT1kX2E6Z2V0U2l6ZSgpCmlmKApkX2EucGFyZW50fj1uaWwpdGhlbiBpZihkX2EuYmdDb2xvcn49ZmFsc2UpdGhlbgpkX2EucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9hYSxhYWEsYmFhLGNhYSxkX2EuYmdDb2xvcillbmQ7bG9jYWwgZGFhPWRfYTpnZXRWYWx1ZSgpCmxvY2FsIF9iYT1iYi5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKCgKZGFhfj1uaWwgYW5kIGRhYS50ZXh0IG9yIiIpLGJhYSxhZCk6c3ViKDEsCmJhYS0xKS4uIChiX2EgYW5kIGFfYSBvciBfX2EpCmRfYS5wYXJlbnQ6d3JpdGVUZXh0KF9hYSxhYWEsX2JhLGRfYS5iZ0NvbG9yLGRfYS5mZ0NvbG9yKQppZihiX2EpdGhlbgpmb3Igbj0xLGRkIGRvCmlmKGJjW24rYmRdfj1uaWwpdGhlbgppZihiY1tuK2JkXT09ZGFhKXRoZW4KaWYoX2QpdGhlbgpkX2EucGFyZW50OndyaXRlVGV4dChfYWEsYWFhK24sYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1sKbitiZF0udGV4dCxjZCxhZCksY2MsZGMpZWxzZQpkX2EucGFyZW50OndyaXRlVGV4dChfYWEsYWFhK24sYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1tuK2JkXS50ZXh0LGNkLGFkKSxiY1sKbitiZF0uYmdDb2wsYmNbbitiZF0uZmdDb2wpZW5kIGVsc2UKZF9hLnBhcmVudDp3cml0ZVRleHQoX2FhLGFhYStuLGJiLmdldFRleHRIb3Jpem9udGFsQWxpZ24oYmNbbitiZF0udGV4dCxjZCxhZCksYmNbCm4rYmRdLmJnQ29sLGJjW24rYmRdLmZnQ29sKWVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGRfYSkKZF9hLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRfYSlkX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZF9hKQpkX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGRfYSkKaWYoX2MuaW5pdChkX2EpKXRoZW4KZF9hLmJnQ29sb3I9ZF9hLnBhcmVudDpnZXRUaGVtZSgiRHJvcGRvd25CRyIpZF9hLmZnQ29sb3I9ZF9hLnBhcmVudDpnZXRUaGVtZSgiRHJvcGRvd25UZXh0IikKY2M9ZF9hLnBhcmVudDpnZXRUaGVtZSgiU2VsZWN0aW9uQkciKWRjPWRfYS5wYXJlbnQ6Z2V0VGhlbWUoIlNlbGVjdGlvblRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShjX2EsX2MpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJMYWJlbCJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidXRpbHMiKQpsb2NhbCBjYj1iYi5nZXRWYWx1ZUZyb21YTUw7bG9jYWwgZGI9YmIuY3JlYXRlVGV4dDtsb2NhbCBfYz1kYSgidEhleCIpbG9jYWwgYWM9ZGEoImJpZ2ZvbnQiKQpyZXR1cm4KZnVuY3Rpb24oYmMpbG9jYWwgY2M9YWIoYmMpCmxvY2FsIGRjPSJMYWJlbCJjYzpzZXRaSW5kZXgoMylsb2NhbCBfZD10cnVlO2NjOnNldFZhbHVlKCJMYWJlbCIpY2Mud2lkdGg9NQpsb2NhbCBhZD0ibGVmdCJsb2NhbCBiZD0idG9wImxvY2FsIGNkPTA7bG9jYWwgZGQsX19hPWZhbHNlLGZhbHNlCmxvY2FsIGFfYT17Z2V0VHlwZT1mdW5jdGlvbihiX2EpcmV0dXJuIGRjIGVuZCxzZXRUZXh0PWZ1bmN0aW9uKGJfYSxjX2EpY19hPXRvc3RyaW5nKGNfYSkKY2M6c2V0VmFsdWUoY19hKQppZihfZCl0aGVuIGxvY2FsIGRfYT1iX2EucGFyZW50OmdldE9mZnNldCgpCmlmKApjX2E6bGVuKCkrYl9hOmdldFgoKT5iX2EucGFyZW50OmdldFdpZHRoKCkrZF9hKXRoZW4gbG9jYWwgX2FhPQpiX2EucGFyZW50OmdldFdpZHRoKCkrZF9hLWJfYTpnZXRYKCljYy5zZXRTaXplKGJfYSxfYWEsCiNkYihjX2EsX2FhKSllbHNlCmNjLnNldFNpemUoYl9hLGNfYTpsZW4oKSwxKWVuZCBlbmQ7Yl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHNldEJhY2tncm91bmQ9ZnVuY3Rpb24oYl9hLGNfYSkKY2Muc2V0QmFja2dyb3VuZChiX2EsY19hKV9fYT10cnVlO2JfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxzZXRGb3JlZ3JvdW5kPWZ1bmN0aW9uKGJfYSxjX2EpCmNjLnNldEZvcmVncm91bmQoYl9hLGNfYSlkZD10cnVlO2JfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxzZXRUZXh0QWxpZ249ZnVuY3Rpb24oYl9hLGNfYSxkX2EpYWQ9CmNfYSBvciBhZDtiZD1kX2Egb3IgYmQ7Yl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHNldEZvbnRTaXplPWZ1bmN0aW9uKGJfYSxjX2EpaWYoCmNfYT4wKWFuZChjX2E8PTQpdGhlbiBjZD1jX2EtMSBvciAwIGVuZApiX2E6dXBkYXRlRHJhdygpcmV0dXJuIGJfYSBlbmQsZ2V0Rm9udFNpemU9ZnVuY3Rpb24oYl9hKXJldHVybiBjZCsxIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYl9hLGNfYSkKY2Muc2V0VmFsdWVzQnlYTUxEYXRhKGJfYSxjX2EpCmlmKGNiKCJ0ZXh0IixjX2Epfj1uaWwpdGhlbiBiX2E6c2V0VGV4dChjYigidGV4dCIsY19hKSllbmQKaWYoY2IoInZlcnRpY2FsQWxpZ24iLGNfYSl+PW5pbCl0aGVuIGJkPWNiKCJ2ZXJ0aWNhbEFsaWduIixjX2EpZW5kO2lmKGNiKCJob3Jpem9udGFsQWxpZ24iLGNfYSl+PW5pbCl0aGVuCmFkPWNiKCJob3Jpem9udGFsQWxpZ24iLGNfYSllbmQ7aWYoY2IoImZvbnQiLGNfYSl+PW5pbCl0aGVuCmJfYTpzZXRGb250U2l6ZShjYigiZm9udCIsY19hKSllbmQ7cmV0dXJuIGJfYSBlbmQsc2V0U2l6ZT1mdW5jdGlvbihiX2EsY19hLGRfYSxfYWEpCmNjLnNldFNpemUoYl9hLGNfYSxkX2EsX2FhKV9kPWZhbHNlO2JfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oYl9hLGNfYSkKaWYoCmNfYT09ImJhc2FsdF9yZXNpemUiKXRoZW4KaWYoX2QpdGhlbiBsb2NhbCBkX2E9Yl9hOmdldFZhbHVlKCkKaWYoCmRfYTpsZW4oKStiX2E6Z2V0WCgpPmJfYS5wYXJlbnQ6Z2V0V2lkdGgoKSl0aGVuIGxvY2FsIF9hYT0KYl9hLnBhcmVudDpnZXRXaWR0aCgpLWJfYTpnZXRYKCkKY2Muc2V0U2l6ZShiX2EsX2FhLCNkYihkX2EsX2FhKSllbHNlIGNjLnNldFNpemUoYl9hLGRfYTpsZW4oKSwxKWVuZCBlbHNlIGVuZCBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oYl9hKQppZgooY2MuZHJhdyhiX2EpKXRoZW4KaWYoYl9hLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgY19hLGRfYT1iX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBfYWEsYWFhPWJfYTpnZXRTaXplKClsb2NhbCBiYWE9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oYWFhLGJkKQppZihjZD09MCl0aGVuCmlmIG5vdChfZCl0aGVuCmxvY2FsIGNhYT1kYihiX2E6Z2V0VmFsdWUoKSxiX2E6Z2V0V2lkdGgoKSkKZm9yIGRhYSxfYmEgaW4gcGFpcnMoY2FhKWRvIGlmKGRhYTw9YWFhKXRoZW4KYl9hLnBhcmVudDp3cml0ZVRleHQoY19hLGRfYStkYWEtMSxfYmEsYl9hLmJnQ29sb3IsYl9hLmZnQ29sb3IpZW5kIGVuZCBlbHNlCmlmCigjYl9hOmdldFZhbHVlKCkrY19hPmJfYS5wYXJlbnQ6Z2V0V2lkdGgoKSl0aGVuIGxvY2FsIGNhYT1kYihiX2E6Z2V0VmFsdWUoKSxiX2E6Z2V0V2lkdGgoKSkKZm9yIGRhYSxfYmEgaW4KcGFpcnMoY2FhKWRvIGlmKGRhYTw9YWFhKXRoZW4KYl9hLnBhcmVudDp3cml0ZVRleHQoY19hLGRfYStkYWEtMSxfYmEsYl9hLmJnQ29sb3IsYl9hLmZnQ29sb3IpZW5kIGVuZCBlbHNlCmJfYS5wYXJlbnQ6d3JpdGVUZXh0KGNfYSxkX2EsYl9hOmdldFZhbHVlKCksYl9hLmJnQ29sb3IsYl9hLmZnQ29sb3IpZW5kIGVuZCBlbHNlCmxvY2FsIGNhYT1hYyhjZCxiX2E6Z2V0VmFsdWUoKSxiX2EuZmdDb2xvcixiX2EuYmdDb2xvciBvciBjb2xvcnMubGlnaHRHcmF5KQppZihfZCl0aGVuIGJfYTpzZXRTaXplKCNjYWFbMV1bMV0sI2NhYVsxXS0xKWVuZDtsb2NhbCBkYWEsX2JhPWJfYS5wYXJlbnQ6Z2V0U2l6ZSgpCmxvY2FsIGFiYSxiYmE9I2NhYVsxXVsxXSwjY2FhWzFdCmNfYT1jX2Egb3IgbWF0aC5mbG9vcigoZGFhLWFiYSkvMikrMQpkX2E9ZF9hIG9yIG1hdGguZmxvb3IoKF9iYS1iYmEpLzIpKzEKZm9yIGk9MSxiYmEgZG8KYl9hLnBhcmVudDpzZXRGRyhjX2EsZF9hK2ktMSxjYWFbMl1baV0pYl9hLnBhcmVudDpzZXRCRyhjX2EsZF9hK2ktMSxjYWFbM11baV0pYl9hLnBhcmVudDpzZXRUZXh0KGNfYSwKZF9hK2ktMSxjYWFbMV1baV0pZW5kIGVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGJfYSkKYl9hLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLGJfYSkKaWYoY2MuaW5pdChiX2EpKXRoZW4KYl9hLmJnQ29sb3I9Yl9hLnBhcmVudDpnZXRUaGVtZSgiTGFiZWxCRyIpYl9hLmZnQ29sb3I9Yl9hLnBhcmVudDpnZXRUaGVtZSgiTGFiZWxUZXh0IikKaWYKKApiX2EucGFyZW50LmJnQ29sb3I9PWNvbG9ycy5ibGFjaylhbmQoYl9hLmZnQ29sb3I9PWNvbG9ycy5ibGFjayl0aGVuIGJfYS5mZ0NvbG9yPWNvbG9ycy5saWdodEdyYXkgZW5kIGVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShhX2EsY2MpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJUaHJlYWQiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MCnJldHVybgpmdW5jdGlvbihiYilsb2NhbCBjYgpsb2NhbCBkYj0iVGhyZWFkImxvY2FsIF9jO2xvY2FsIGFjO2xvY2FsIGJjPWZhbHNlO2xvY2FsIGNjCmxvY2FsIGRjPWZ1bmN0aW9uKF9kLGFkKQppZihhZDpzdWIoMSwxKT09IiMiKXRoZW4KbG9jYWwgYmQ9X2Q6Z2V0QmFzZUZyYW1lKCk6Z2V0RGVlcE9iamVjdChhZDpzdWIoMixhZDpsZW4oKSkpCmlmKGJkfj1uaWwpYW5kKGJkLmludGVybmFsT2JqZXRDYWxsfj1uaWwpdGhlbiByZXR1cm4oZnVuY3Rpb24oKQpiZDppbnRlcm5hbE9iamV0Q2FsbCgpZW5kKWVuZCBlbHNlIHJldHVybiBfZDpnZXRCYXNlRnJhbWUoKTpnZXRWYXJpYWJsZShhZCllbmQ7cmV0dXJuIF9kIGVuZApjYj17bmFtZT1iYixnZXRUeXBlPWZ1bmN0aW9uKF9kKXJldHVybiBkYiBlbmQsZ2V0WkluZGV4PWZ1bmN0aW9uKF9kKXJldHVybiAxIGVuZCxnZXROYW1lPWZ1bmN0aW9uKF9kKXJldHVybiBfZC5uYW1lIGVuZCxnZXRCYXNlRnJhbWU9ZnVuY3Rpb24oX2QpaWYKKF9kLnBhcmVudH49bmlsKXRoZW4gcmV0dXJuIF9kLnBhcmVudDpnZXRCYXNlRnJhbWUoKWVuZApyZXR1cm4gX2QgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfZCxhZClsb2NhbCBiZDtpZihhYigidGhyZWFkIixhZCl+PW5pbCl0aGVuCmJkPWRjKF9kLGFiKCJ0aHJlYWQiLGFkKSllbmQKaWYoYWIoInN0YXJ0IixhZCl+PW5pbCl0aGVuIGlmCihhYigic3RhcnQiLGFkKSlhbmQoYmR+PW5pbCl0aGVuIF9kOnN0YXJ0KGJkKWVuZCBlbmQ7cmV0dXJuIF9kIGVuZCxzdGFydD1mdW5jdGlvbihfZCxhZCkKaWYoCmFkPT1uaWwpdGhlbiBlcnJvcigiRnVuY3Rpb24gcHJvdmlkZWQgdG8gdGhyZWFkIGlzIG5pbCIpZW5kO19jPWFkO2FjPWNvcm91dGluZS5jcmVhdGUoX2MpYmM9dHJ1ZTtjYz1uaWwKbG9jYWwgYmQsY2Q9Y29yb3V0aW5lLnJlc3VtZShhYyljYz1jZDtpZiBub3QoYmQpdGhlbiBpZihjZH49IlRlcm1pbmF0ZWQiKXRoZW4KZXJyb3IoIlRocmVhZCBFcnJvciBPY2N1cnJlZCAtICIuLmNkKWVuZCBlbmQKX2QucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsX2QpX2QucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsX2QpCl9kLnBhcmVudDphZGRFdmVudCgibW91c2Vfc2Nyb2xsIixfZClfZC5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2RyYWciLF9kKQpfZC5wYXJlbnQ6YWRkRXZlbnQoImtleSIsX2QpX2QucGFyZW50OmFkZEV2ZW50KCJrZXlfdXAiLF9kKQpfZC5wYXJlbnQ6YWRkRXZlbnQoImNoYXIiLF9kKV9kLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLF9kKXJldHVybiBfZCBlbmQsZ2V0U3RhdHVzPWZ1bmN0aW9uKF9kLGFkKWlmKAphY349bmlsKXRoZW4gcmV0dXJuIGNvcm91dGluZS5zdGF0dXMoYWMpZW5kO3JldHVybiBuaWwgZW5kLHN0b3A9ZnVuY3Rpb24oX2QsYWQpCmJjPWZhbHNlO19kLnBhcmVudDpyZW1vdmVFdmVudCgibW91c2VfY2xpY2siLF9kKQpfZC5wYXJlbnQ6cmVtb3ZlRXZlbnQoIm1vdXNlX3VwIixfZClfZC5wYXJlbnQ6cmVtb3ZlRXZlbnQoIm1vdXNlX3Njcm9sbCIsX2QpCl9kLnBhcmVudDpyZW1vdmVFdmVudCgibW91c2VfZHJhZyIsX2QpX2QucGFyZW50OnJlbW92ZUV2ZW50KCJrZXkiLF9kKQpfZC5wYXJlbnQ6cmVtb3ZlRXZlbnQoImtleV91cCIsX2QpX2QucGFyZW50OnJlbW92ZUV2ZW50KCJjaGFyIixfZCkKX2QucGFyZW50OnJlbW92ZUV2ZW50KCJvdGhlcl9ldmVudCIsX2QpcmV0dXJuIF9kIGVuZCxtb3VzZUhhbmRsZXI9ZnVuY3Rpb24oX2QsLi4uKQpfZDpldmVudEhhbmRsZXIoIm1vdXNlX2NsaWNrIiwuLi4pZW5kLG1vdXNlVXBIYW5kbGVyPWZ1bmN0aW9uKF9kLC4uLilfZDpldmVudEhhbmRsZXIoIm1vdXNlX3VwIiwuLi4pZW5kLG1vdXNlU2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihfZCwuLi4pCl9kOmV2ZW50SGFuZGxlcigibW91c2Vfc2Nyb2xsIiwuLi4pZW5kLG1vdXNlRHJhZ0hhbmRsZXI9ZnVuY3Rpb24oX2QsLi4uKQpfZDpldmVudEhhbmRsZXIoIm1vdXNlX2RyYWciLC4uLillbmQsbW91c2VNb3ZlSGFuZGxlcj1mdW5jdGlvbihfZCwuLi4pCl9kOmV2ZW50SGFuZGxlcigibW91c2VfbW92ZSIsLi4uKWVuZCxrZXlIYW5kbGVyPWZ1bmN0aW9uKF9kLC4uLilfZDpldmVudEhhbmRsZXIoImtleSIsLi4uKWVuZCxrZXlVcEhhbmRsZXI9ZnVuY3Rpb24oX2QsLi4uKQpfZDpldmVudEhhbmRsZXIoImtleV91cCIsLi4uKWVuZCxjaGFySGFuZGxlcj1mdW5jdGlvbihfZCwuLi4pX2Q6ZXZlbnRIYW5kbGVyKCJjaGFyIiwuLi4pZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihfZCxhZCwuLi4pCmlmCihiYyl0aGVuCmlmKGNvcm91dGluZS5zdGF0dXMoYWMpPT0ic3VzcGVuZGVkIil0aGVuIGlmKGNjfj1uaWwpdGhlbiBpZihhZH49Y2MpdGhlbiByZXR1cm4gZW5kO2NjPQpuaWwgZW5kCmxvY2FsIGJkLGNkPWNvcm91dGluZS5yZXN1bWUoYWMsYWQsLi4uKWNjPWNkO2lmIG5vdChiZCl0aGVuIGlmKGNkfj0iVGVybWluYXRlZCIpdGhlbgplcnJvcigiVGhyZWFkIEVycm9yIE9jY3VycmVkIC0gIi4uY2QpZW5kIGVuZCBlbHNlCl9kOnN0b3AoKWVuZCBlbmQgZW5kfWNiLl9faW5kZXg9Y2I7cmV0dXJuIGNiIGVuZCBlbmQKYWFbIm9iamVjdHMiXVsiVGV4dGZpZWxkIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ0SGV4IikKbG9jYWwgY2I9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MO2xvY2FsIGRiPWRhKCJiYXNhbHRMb2dzIikKbG9jYWwgX2MsYWMsYmMsY2MsZGM9c3RyaW5nLnJlcCxzdHJpbmcuZmluZCxzdHJpbmcuZ21hdGNoLHN0cmluZy5zdWIsc3RyaW5nLmxlbgpyZXR1cm4KZnVuY3Rpb24oX2QpbG9jYWwgYWQ9YWIoX2QpbG9jYWwgYmQ9IlRleHRmaWVsZCJsb2NhbCBjZCxkZCxfX2EsYV9hPTEsMSwxLDE7bG9jYWwgYl9hPXsiIn1sb2NhbCBjX2E9eyIifWxvY2FsIGRfYT17IiJ9CmxvY2FsIF9hYT17fWxvY2FsIGFhYT17fWxvY2FsIGJhYSxjYWEsZGFhLF9iYTtsb2NhbCBhYmEsYmJhPWNvbG9ycy5saWdodEJsdWUsY29sb3JzLmJsYWNrO2FkLndpZHRoPTMwCmFkLmhlaWdodD0xMjthZDpzZXRaSW5kZXgoNSlsb2NhbCBmdW5jdGlvbiBjYmEoKQppZgooYmFhfj1uaWwpYW5kKGNhYX49bmlsKWFuZChkYWF+PW5pbClhbmQoX2Jhfj1uaWwpdGhlbiByZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZApsb2NhbCBmdW5jdGlvbiBkYmEoKWxvY2FsIGFkYSxiZGEsY2RhLGRkYQppZgooY2JhKCkpdGhlbiBpZihiYWE+Y2FhKXRoZW4gYWRhLGJkYT1jYWEsYmFhIGVsc2UgYWRhLGJkYT1iYWEsY2FhIGVuZDtpZihkYWE+X2JhKXRoZW4KY2RhLGRkYT1fYmEsZGFhIGVsc2UgY2RhLGRkYT1kYWEsX2JhIGVuZCBlbmQ7cmV0dXJuIGFkYSxiZGEsY2RhLGRkYSBlbmQ7bG9jYWwgZnVuY3Rpb24gX2NhKCllbmQKbG9jYWwgZnVuY3Rpb24gYWNhKGFkYSlsb2NhbCBiZGEsY2RhLGRkYSxfX2I9ZGJhKGFkYSkKZm9yIG49X19iLGRkYSwtMSBkbwppZihuPT1kZGEpb3Iobj09X19iKXRoZW4gbG9jYWwgYV9iPWJfYVtuXQpsb2NhbCBiX2I9Y19hW25dbG9jYWwgY19iPWRfYVtuXQppZihuPT1kZGEpYW5kKG49PV9fYil0aGVuIGFfYj1hX2I6c3ViKDEsYmRhLTEpLi4KYV9iOnN1YihjZGErMSxhX2I6bGVuKCkpYl9iPWJfYjpzdWIoMSxiZGEtMSkuLgpiX2I6c3ViKGNkYSsxLGJfYjpsZW4oKSljX2I9Y19iOnN1YigxLGJkYS0xKS4uCmNfYjpzdWIoY2RhKzEsY19iOmxlbigpKWVsc2VpZihuPT1iZGEpdGhlbgphX2I9YV9iOnN1YigxLGJkYSliX2I9Yl9iOnN1YigxLGJkYSljX2I9Y19iOnN1YigxLGJkYSllbHNlaWYobj09ZGRhKXRoZW4KYV9iPWFfYjpzdWIoY2RhLGFfYjpsZW4oKSliX2I9Yl9iOnN1YihjZGEsYl9iOmxlbigpKQpjX2I9Y19iOnN1YihjZGEsY19iOmxlbigpKWVuZDtiX2Fbbl09YV9iO2NfYVtuXT1iX2I7ZF9hW25dPWNfYiBlbHNlIHRhYmxlLnJlbW92ZShiX2EsbikKdGFibGUucmVtb3ZlKGNfYSxuKXRhYmxlLnJlbW92ZShkX2EsbillbmQgZW5kO19fYSxhX2E9YmFhLGRhYTtiYWEsY2FhLGRhYSxfYmE9bmlsLG5pbCxuaWwsbmlsO3JldHVybiBhZGEgZW5kCmxvY2FsIGZ1bmN0aW9uIGJjYShhZGEsYmRhKWxvY2FsIGNkYT17fQppZihhZGE6bGVuKCk+MCl0aGVuCmZvciBkZGEgaW4gYmMoYWRhLGJkYSlkbyBsb2NhbCBfX2IsYV9iPWFjKGFkYSxkZGEpCmlmCihfX2J+PW5pbClhbmQoYV9ifj1uaWwpdGhlbiB0YWJsZS5pbnNlcnQoY2RhLF9fYil0YWJsZS5pbnNlcnQoY2RhLGFfYikKbG9jYWwgYl9iPWNjKGFkYSwxLChfX2ItMSkpbG9jYWwgY19iPWNjKGFkYSxhX2IrMSxhZGE6bGVuKCkpYWRhPWJfYi4uICgiOiIpOnJlcChkZGE6bGVuKCkpLi4KY19iIGVuZCBlbmQgZW5kO3JldHVybiBjZGEgZW5kCmxvY2FsIGZ1bmN0aW9uIGNjYShhZGEsYmRhKWJkYT1iZGEgb3IgYV9hCmxvY2FsIGNkYT1iYlthZGEuZmdDb2xvcl06cmVwKGRfYVtiZGFdOmxlbigpKQpsb2NhbCBkZGE9YmJbYWRhLmJnQ29sb3JdOnJlcChjX2FbYmRhXTpsZW4oKSkKZm9yIF9fYixhX2IgaW4gcGFpcnMoYWFhKWRvIGxvY2FsIGJfYj1iY2EoYl9hW2JkYV0sYV9iWzFdKQppZigjYl9iPjApdGhlbgpmb3IgeD0xLCNiX2IvMiBkbwpsb2NhbCBjX2I9eCoyIC0xO2lmKGFfYlsyXX49bmlsKXRoZW4KY2RhPWNkYTpzdWIoMSxiX2JbY19iXS0xKS4uYmJbYV9iWzJdXTpyZXAoYl9iW2NfYisxXS0gKApiX2JbY19iXS0xKSkuLgpjZGE6c3ViKGJfYltjX2IrMV0rMSxjZGE6bGVuKCkpZW5kO2lmCihhX2JbM11+PW5pbCl0aGVuCmRkYT1kZGE6c3ViKDEsYl9iW2NfYl0tMSkuLgoKYmJbYV9iWzNdXTpyZXAoYl9iW2NfYisxXS0gKGJfYltjX2JdLTEpKS4uZGRhOnN1YihiX2JbY19iKzFdKzEsZGRhOmxlbigpKWVuZCBlbmQgZW5kIGVuZApmb3IgX19iLGFfYiBpbiBwYWlycyhfYWEpZG8KZm9yIGJfYixjX2IgaW4gcGFpcnMoYV9iKWRvIGxvY2FsIGRfYj1iY2EoYl9hW2JkYV0sY19iKQppZigjZF9iPjApdGhlbiBmb3IgeD0xLCNkX2IvMiBkbwpsb2NhbCBfYWI9eCoyIC0xCmNkYT1jZGE6c3ViKDEsZF9iW19hYl0tMSkuLgoKYmJbX19iXTpyZXAoZF9iW19hYisxXS0gKGRfYltfYWJdLTEpKS4uY2RhOnN1YihkX2JbX2FiKzFdKzEsY2RhOmxlbigpKWVuZCBlbmQgZW5kIGVuZDtkX2FbYmRhXT1jZGE7Y19hW2JkYV09ZGRhO2FkYTp1cGRhdGVEcmF3KCllbmQ7bG9jYWwgZnVuY3Rpb24gZGNhKGFkYSlmb3Igbj0xLCNiX2EgZG8gY2NhKGFkYSxuKWVuZCBlbmQKbG9jYWwgX2RhPXtnZXRUeXBlPWZ1bmN0aW9uKGFkYSlyZXR1cm4gYmQgZW5kLHNldEJhY2tncm91bmQ9ZnVuY3Rpb24oYWRhLGJkYSkKYWQuc2V0QmFja2dyb3VuZChhZGEsYmRhKWRjYShhZGEpcmV0dXJuIGFkYSBlbmQsc2V0Rm9yZWdyb3VuZD1mdW5jdGlvbihhZGEsYmRhKQphZC5zZXRGb3JlZ3JvdW5kKGFkYSxiZGEpZGNhKGFkYSlyZXR1cm4gYWRhIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYWRhLGJkYSkKYWQuc2V0VmFsdWVzQnlYTUxEYXRhKGFkYSxiZGEpCmlmKGJkYVsibGluZXMiXX49bmlsKXRoZW4gbG9jYWwgY2RhPWJkYVsibGluZXMiXVsibGluZSJdaWYKKGNkYS5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBjZGE9e2NkYX1lbmQ7Zm9yIGRkYSxfX2IgaW4gcGFpcnMoY2RhKWRvCmFkYTphZGRMaW5lKF9fYjp2YWx1ZSgpKWVuZCBlbmQKaWYoYmRhWyJrZXl3b3JkcyJdfj1uaWwpdGhlbgpmb3IgY2RhLGRkYSBpbiBwYWlycyhiZGFbImtleXdvcmRzIl0pZG8KaWYoY29sb3JzW2NkYV1+PW5pbCl0aGVuCmxvY2FsIF9fYj1kZGE7aWYoX19iLnByb3BlcnRpZXN+PW5pbCl0aGVuIF9fYj17X19ifWVuZDtsb2NhbCBhX2I9e30KZm9yIGJfYixjX2IgaW4gcGFpcnMoX19iKWRvCmxvY2FsIGRfYj1jX2JbImtleXdvcmQiXWlmKGNfYlsia2V5d29yZCJdLnByb3BlcnRpZXN+PW5pbCl0aGVuCmRfYj17Y19iWyJrZXl3b3JkIl19ZW5kO2ZvciBfYWIsYWFiIGluIHBhaXJzKGRfYilkbwp0YWJsZS5pbnNlcnQoYV9iLGFhYjp2YWx1ZSgpKWVuZCBlbmQ7YWRhOmFkZEtleXdvcmRzKGNvbG9yc1tjZGFdLGFfYillbmQgZW5kIGVuZAppZihiZGFbInJ1bGVzIl1+PW5pbCl0aGVuCmlmKGJkYVsicnVsZXMiXVsicnVsZSJdfj1uaWwpdGhlbgpsb2NhbCBjZGE9YmRhWyJydWxlcyJdWyJydWxlIl1pZihiZGFbInJ1bGVzIl1bInJ1bGUiXS5wcm9wZXJ0aWVzfj1uaWwpdGhlbgpjZGE9e2JkYVsicnVsZXMiXVsicnVsZSJdfWVuZApmb3IgZGRhLF9fYiBpbiBwYWlycyhjZGEpZG8gaWYoY2IoInBhdHRlcm4iLF9fYil+PW5pbCl0aGVuCmFkYTphZGRSdWxlKGNiKCJwYXR0ZXJuIixfX2IpLGNvbG9yc1tjYigiZmciLF9fYildLGNvbG9yc1tjYigiYmciLF9fYildKWVuZCBlbmQgZW5kIGVuZCBlbmQsZ2V0TGluZXM9ZnVuY3Rpb24oYWRhKXJldHVybgpiX2EgZW5kLGdldExpbmU9ZnVuY3Rpb24oYWRhLGJkYSlyZXR1cm4gYl9hW2JkYV1lbmQsZWRpdExpbmU9ZnVuY3Rpb24oYWRhLGJkYSxjZGEpCmJfYVtiZGFdPWNkYSBvciBiX2FbYmRhXWNjYShhZGEsYmRhKWFkYTp1cGRhdGVEcmF3KClyZXR1cm4gYWRhIGVuZCxjbGVhcj1mdW5jdGlvbihhZGEpCmJfYT17IiJ9Y19hPXsiIn1kX2E9eyIifWJhYSxjYWEsZGFhLF9iYT1uaWwsbmlsLG5pbCxuaWw7Y2QsZGQsX19hLGFfYT0xLDEsMSwxCmFkYTp1cGRhdGVEcmF3KClyZXR1cm4gYWRhIGVuZCxhZGRMaW5lPWZ1bmN0aW9uKGFkYSxiZGEsY2RhKQppZgooYmRhfj1uaWwpdGhlbgppZigjYl9hPT0xKWFuZChiX2FbMV09PSIiKXRoZW4gYl9hWzFdPWJkYQpjX2FbMV09YmJbYWRhLmJnQ29sb3JdOnJlcChiZGE6bGVuKCkpZF9hWzFdPWJiW2FkYS5mZ0NvbG9yXTpyZXAoYmRhOmxlbigpKQpjY2EoYWRhLDEpcmV0dXJuIGFkYSBlbmQKaWYoY2Rhfj1uaWwpdGhlbiB0YWJsZS5pbnNlcnQoYl9hLGNkYSxiZGEpCnRhYmxlLmluc2VydChjX2EsY2RhLGJiW2FkYS5iZ0NvbG9yXTpyZXAoYmRhOmxlbigpKSkKdGFibGUuaW5zZXJ0KGRfYSxjZGEsYmJbYWRhLmZnQ29sb3JdOnJlcChiZGE6bGVuKCkpKWVsc2UgdGFibGUuaW5zZXJ0KGJfYSxiZGEpCnRhYmxlLmluc2VydChjX2EsYmJbYWRhLmJnQ29sb3JdOnJlcChiZGE6bGVuKCkpKQp0YWJsZS5pbnNlcnQoZF9hLGJiW2FkYS5mZ0NvbG9yXTpyZXAoYmRhOmxlbigpKSllbmQgZW5kO2NjYShhZGEsY2RhIG9yI2JfYSlhZGE6dXBkYXRlRHJhdygpcmV0dXJuIGFkYSBlbmQsYWRkS2V5d29yZHM9ZnVuY3Rpb24oYWRhLGJkYSxjZGEpaWYoCl9hYVtiZGFdPT1uaWwpdGhlbiBfYWFbYmRhXT17fWVuZDtmb3IgZGRhLF9fYiBpbiBwYWlycyhjZGEpZG8KdGFibGUuaW5zZXJ0KF9hYVtiZGFdLF9fYillbmQ7YWRhOnVwZGF0ZURyYXcoKXJldHVybiBhZGEgZW5kLGFkZFJ1bGU9ZnVuY3Rpb24oYWRhLGJkYSxjZGEsZGRhKQp0YWJsZS5pbnNlcnQoYWFhLHtiZGEsY2RhLGRkYX0pYWRhOnVwZGF0ZURyYXcoKXJldHVybiBhZGEgZW5kLGVkaXRSdWxlPWZ1bmN0aW9uKGFkYSxiZGEsY2RhLGRkYSlmb3IgX19iLGFfYiBpbgpwYWlycyhhYWEpZG8KaWYoYV9iWzFdPT1iZGEpdGhlbiBhYWFbX19iXVsyXT1jZGE7YWFhW19fYl1bM109ZGRhIGVuZCBlbmQ7YWRhOnVwZGF0ZURyYXcoKXJldHVybiBhZGEgZW5kLHJlbW92ZVJ1bGU9ZnVuY3Rpb24oYWRhLGJkYSkKZm9yIGNkYSxkZGEgaW4KcGFpcnMoYWFhKWRvIGlmKGRkYVsxXT09YmRhKXRoZW4gdGFibGUucmVtb3ZlKGFhYSxjZGEpZW5kIGVuZDthZGE6dXBkYXRlRHJhdygpcmV0dXJuIGFkYSBlbmQsc2V0S2V5d29yZHM9ZnVuY3Rpb24oYWRhLGJkYSxjZGEpCl9hYVtiZGFdPWNkYTthZGE6dXBkYXRlRHJhdygpcmV0dXJuIGFkYSBlbmQscmVtb3ZlTGluZT1mdW5jdGlvbihhZGEsYmRhKQppZigjYl9hPjEpdGhlbiB0YWJsZS5yZW1vdmUoYl9hLApiZGEgb3IjYl9hKQp0YWJsZS5yZW1vdmUoY19hLGJkYSBvciNjX2EpdGFibGUucmVtb3ZlKGRfYSxiZGEgb3IjZF9hKWVsc2UgYl9hPXsiIn1jX2E9eyIifWRfYT17IiJ9ZW5kO2FkYTp1cGRhdGVEcmF3KClyZXR1cm4gYWRhIGVuZCxnZXRUZXh0Q3Vyc29yPWZ1bmN0aW9uKGFkYSlyZXR1cm4KX19hLGFfYSBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGFkYSlhZC5nZXRGb2N1c0hhbmRsZXIoYWRhKQppZihhZGEucGFyZW50fj1uaWwpdGhlbgpsb2NhbCBiZGEsY2RhPWFkYTpnZXRBbmNob3JQb3NpdGlvbigpaWYoYWRhLnBhcmVudH49bmlsKXRoZW4KYWRhLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxiZGErX19hLWRkLGNkYSthX2EtY2QsYWRhLmZnQ29sb3IpZW5kIGVuZCBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihhZGEpCmFkLmxvc2VGb2N1c0hhbmRsZXIoYWRhKQppZihhZGEucGFyZW50fj1uaWwpdGhlbiBhZGEucGFyZW50OnNldEN1cnNvcihmYWxzZSllbmQgZW5kLGtleUhhbmRsZXI9ZnVuY3Rpb24oYWRhLGJkYSkKaWYKKGFkLmtleUhhbmRsZXIoYWRhLGV2ZW50LGJkYSkpdGhlbiBsb2NhbCBjZGEsZGRhPWFkYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgX19iLGFfYj1hZGE6Z2V0U2l6ZSgpCmlmKGJkYT09CmtleXMuYmFja3NwYWNlKXRoZW4KaWYoYl9hW2FfYV09PSIiKXRoZW4KaWYoYV9hPjEpdGhlbiB0YWJsZS5yZW1vdmUoYl9hLGFfYSkKdGFibGUucmVtb3ZlKGRfYSxhX2EpdGFibGUucmVtb3ZlKGNfYSxhX2EpCl9fYT1iX2FbYV9hLTFdOmxlbigpKzE7ZGQ9X19hLV9fYisxO2lmKGRkPDEpdGhlbiBkZD0xIGVuZDthX2E9YV9hLTEgZW5kIGVsc2VpZihfX2E8PTEpdGhlbgppZihhX2E+MSl0aGVuIF9fYT1iX2FbYV9hLTFdOmxlbigpKzEKZGQ9X19hLV9fYisxO2lmKGRkPDEpdGhlbiBkZD0xIGVuZDtiX2FbYV9hLTFdPWJfYVthX2EtMV0uLmJfYVthX2FdZF9hWwphX2EtMV09ZF9hW2FfYS0xXS4uZF9hW2FfYV1jX2FbYV9hLTFdPWNfYVthX2EtMV0uLgpjX2FbYV9hXXRhYmxlLnJlbW92ZShiX2EsYV9hKQp0YWJsZS5yZW1vdmUoZF9hLGFfYSl0YWJsZS5yZW1vdmUoY19hLGFfYSlhX2E9YV9hLTEgZW5kIGVsc2UgYl9hW2FfYV09Yl9hW2FfYV06c3ViKDEsX19hLTIpLi4KYl9hW2FfYV06c3ViKF9fYSxiX2FbYV9hXTpsZW4oKSkKZF9hW2FfYV09ZF9hW2FfYV06c3ViKDEsCl9fYS0yKS4uZF9hW2FfYV06c3ViKF9fYSxkX2FbYV9hXTpsZW4oKSljX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMikuLgpjX2FbYV9hXTpzdWIoX19hLGNfYVthX2FdOmxlbigpKWlmKF9fYT4xKXRoZW4KX19hPV9fYS0xIGVuZDtpZihkZD4xKXRoZW4gaWYoX19hPGRkKXRoZW4gZGQ9ZGQtMSBlbmQgZW5kIGVuZDtpZihhX2E8Y2QpdGhlbiBjZD1jZC0xIGVuZDtjY2EoYWRhKWFkYTpzZXRWYWx1ZSgiIillbmQKaWYoYmRhPT1rZXlzLmRlbGV0ZSl0aGVuCmlmKGNiYSgpKXRoZW4gYWNhKGFkYSllbHNlCmlmKF9fYT5iX2FbYV9hXTpsZW4oKSl0aGVuCmlmKApiX2FbYV9hKzFdfj1uaWwpdGhlbiBiX2FbYV9hXT1iX2FbYV9hXS4uYl9hW2FfYSsxXQp0YWJsZS5yZW1vdmUoYl9hLGFfYSsxKXRhYmxlLnJlbW92ZShjX2EsYV9hKzEpdGFibGUucmVtb3ZlKGRfYSxhX2ErMSllbmQgZWxzZSBiX2FbYV9hXT1iX2FbYV9hXTpzdWIoMSxfX2EtMSkuLgpiX2FbYV9hXTpzdWIoX19hKzEsYl9hW2FfYV06bGVuKCkpCmRfYVthX2FdPWRfYVthX2FdOnN1YigxLApfX2EtMSkuLmRfYVthX2FdOnN1YihfX2ErMSxkX2FbYV9hXTpsZW4oKSljX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMSkuLgpjX2FbYV9hXTpzdWIoX19hKzEsY19hW2FfYV06bGVuKCkpZW5kIGVuZDtjY2EoYWRhKWVuZAppZihiZGE9PWtleXMuZW50ZXIpdGhlbgp0YWJsZS5pbnNlcnQoYl9hLGFfYSsxLGJfYVthX2FdOnN1YihfX2EsYl9hW2FfYV06bGVuKCkpKQp0YWJsZS5pbnNlcnQoZF9hLGFfYSsxLGRfYVthX2FdOnN1YihfX2EsZF9hW2FfYV06bGVuKCkpKQp0YWJsZS5pbnNlcnQoY19hLGFfYSsxLGNfYVthX2FdOnN1YihfX2EsY19hW2FfYV06bGVuKCkpKWJfYVthX2FdPWJfYVthX2FdOnN1YigxLF9fYS0xKQpkX2FbYV9hXT1kX2FbYV9hXTpzdWIoMSxfX2EtMSljX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMSlhX2E9YV9hKzE7X19hPTE7ZGQ9MTtpZihhX2EtY2Q+PQphX2IpdGhlbiBjZD1jZCsxIGVuZDthZGE6c2V0VmFsdWUoIiIpZW5kCmlmKGJkYT09a2V5cy51cCl0aGVuCmlmKGFfYT4xKXRoZW4gYV9hPWFfYS0xO2lmKF9fYT5iX2FbYV9hXTpsZW4oKSsxKXRoZW4gX19hPQpiX2FbYV9hXTpsZW4oKSsxIGVuZAppZihkZD4xKXRoZW4gaWYoX19hPGRkKXRoZW4KZGQ9X19hLV9fYisxO2lmKGRkPDEpdGhlbiBkZD0xIGVuZCBlbmQgZW5kO2lmKGNkPjEpdGhlbiBpZihhX2E8Y2QpdGhlbiBjZD1jZC0xIGVuZCBlbmQgZW5kIGVuZAppZihiZGE9PWtleXMuZG93bil0aGVuCmlmKGFfYTwjYl9hKXRoZW4gYV9hPWFfYSsxO2lmCihfX2E+Yl9hW2FfYV06bGVuKCkrMSl0aGVuIF9fYT1iX2FbYV9hXTpsZW4oKSsxIGVuZAppZihkZD4xKXRoZW4gaWYKKF9fYTxkZCl0aGVuIGRkPV9fYS1fX2IrMTtpZihkZDwxKXRoZW4gZGQ9MSBlbmQgZW5kIGVuZDtpZihhX2E+PWNkK2FfYil0aGVuIGNkPWNkKzEgZW5kIGVuZCBlbmQKaWYoYmRhPT1rZXlzLnJpZ2h0KXRoZW4gX19hPV9fYSsxCmlmKGFfYTwjYl9hKXRoZW4gaWYKKF9fYT5iX2FbYV9hXTpsZW4oKSsxKXRoZW4gX19hPTE7YV9hPWFfYSsxIGVuZCBlbHNlaWYoX19hPmJfYVthX2FdOmxlbigpKXRoZW4gX19hPQpiX2FbYV9hXTpsZW4oKSsxIGVuZDtpZihfX2E8MSl0aGVuIF9fYT0xIGVuZAppZihfX2E8ZGQpb3IoX19hPj1fX2IrZGQpdGhlbiBkZD1fX2EtX19iKzEgZW5kO2lmKGRkPDEpdGhlbiBkZD0xIGVuZCBlbmQKaWYoYmRhPT1rZXlzLmxlZnQpdGhlbiBfX2E9X19hLTE7aWYoX19hPj0xKXRoZW4KaWYoX19hPGRkKW9yKF9fYT49X19iK2RkKXRoZW4gZGQ9X19hIGVuZCBlbmQKaWYoYV9hPjEpdGhlbiBpZihfX2E8MSl0aGVuIGFfYT1hX2EtMQpfX2E9Yl9hW2FfYV06bGVuKCkrMTtkZD1fX2EtX19iKzEgZW5kIGVuZDtpZihfX2E8MSl0aGVuIF9fYT0xIGVuZDtpZihkZDwxKXRoZW4gZGQ9MSBlbmQgZW5kCmlmIG5vdAooIChjZGErX19hLWRkPj1jZGEgYW5kIGNkYStfX2EtZGQ8Y2RhK19fYilhbmQoCmRkYSthX2EtY2Q+PWRkYSBhbmQgZGRhK2FfYS1jZDxkZGErYV9iKSl0aGVuIGRkPW1hdGgubWF4KDEsCmJfYVthX2FdOmxlbigpLV9fYisxKQpjZD1tYXRoLm1heCgxLGFfYS1hX2IrMSllbmQ7bG9jYWwgYl9iPQooX19hPD1iX2FbYV9hXTpsZW4oKWFuZCBfX2EtMSBvciBiX2FbYV9hXTpsZW4oKSktIChkZC0xKQppZihiX2I+CmFkYTpnZXRYKCkrX19iLTEpdGhlbiBiX2I9YWRhOmdldFgoKStfX2ItMSBlbmQKbG9jYWwgY19iPShhX2EtY2Q8YV9iIGFuZCBhX2EtY2Qgb3IgYV9hLWNkLTEpaWYoYl9iPDEpdGhlbiBiX2I9MCBlbmQKYWRhLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxjZGErYl9iLGRkYStjX2IsYWRhLmZnQ29sb3IpYWRhOnVwZGF0ZURyYXcoKXJldHVybiB0cnVlIGVuZCBlbmQsY2hhckhhbmRsZXI9ZnVuY3Rpb24oYWRhLGJkYSkKaWYKKGFkLmNoYXJIYW5kbGVyKGFkYSxiZGEpKXRoZW4gbG9jYWwgY2RhLGRkYT1hZGE6Z2V0QW5jaG9yUG9zaXRpb24oKWxvY2FsIF9fYixhX2I9YWRhOmdldFNpemUoKWJfYVthX2FdPWJfYVthX2FdOnN1YigxLApfX2EtMSkuLgpiZGEuLmJfYVthX2FdOnN1YihfX2EsYl9hW2FfYV06bGVuKCkpCmRfYVthX2FdPWRfYVthX2FdOnN1YigxLApfX2EtMSkuLmJiW2FkYS5mZ0NvbG9yXS4uCmRfYVthX2FdOnN1YihfX2EsZF9hW2FfYV06bGVuKCkpCmNfYVthX2FdPWNfYVthX2FdOnN1YigxLF9fYS0xKS4uYmJbYWRhLmJnQ29sb3JdLi4KY19hW2FfYV06c3ViKF9fYSxjX2FbYV9hXTpsZW4oKSlfX2E9X19hKzE7aWYoX19hPj1fX2IrZGQpdGhlbiBkZD1kZCsxIGVuZDtjY2EoYWRhKQphZGE6c2V0VmFsdWUoIiIpCmlmIG5vdAooIChjZGErX19hLWRkPj1jZGEgYW5kIGNkYStfX2EtZGQ8Y2RhK19fYilhbmQoCmRkYSthX2EtY2Q+PWRkYSBhbmQgZGRhK2FfYS1jZDxkZGErYV9iKSl0aGVuIGRkPW1hdGgubWF4KDEsCmJfYVthX2FdOmxlbigpLV9fYisxKQpjZD1tYXRoLm1heCgxLGFfYS1hX2IrMSllbmQ7bG9jYWwgYl9iPQooX19hPD1iX2FbYV9hXTpsZW4oKWFuZCBfX2EtMSBvciBiX2FbYV9hXTpsZW4oKSktIChkZC0xKQppZihiX2I+CmFkYTpnZXRYKCkrX19iLTEpdGhlbiBiX2I9YWRhOmdldFgoKStfX2ItMSBlbmQKbG9jYWwgY19iPShhX2EtY2Q8YV9iIGFuZCBhX2EtY2Qgb3IgYV9hLWNkLTEpaWYoYl9iPDEpdGhlbiBiX2I9MCBlbmQ7aWYoY2JhKCkpdGhlbiBhY2EoYWRhKWVuZDthZGEucGFyZW50OnNldEN1cnNvcih0cnVlLGNkYStiX2IsCmRkYStjX2IsYWRhLmZnQ29sb3IpCmFkYTp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQgZW5kLGRyYWdIYW5kbGVyPWZ1bmN0aW9uKGFkYSxiZGEsY2RhLGRkYSkKaWYKKGFkLmRyYWdIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKClsb2NhbCBkX2IsX2FiPWFkYTpnZXRTaXplKCkKaWYoYl9hWwpkZGEtYV9iK2NkXX49bmlsKXRoZW4KaWYKKGJfYitkX2I+Yl9iK2NkYS0gKF9fYisxKStkZClhbmQoYl9iPGJfYitjZGEtX19iK2RkKXRoZW4KX19hPWNkYS1fX2IrZGQ7YV9hPWRkYS1hX2IrY2Q7Y2FhPV9fYTtfYmE9YV9hO2lmKF9fYT5iX2FbYV9hXTpsZW4oKSl0aGVuIF9fYT0KYl9hW2FfYV06bGVuKCkrMTtjYWE9X19hIGVuZDtpZihfX2E8ZGQpdGhlbiBkZD1fX2EtMTtpZgooZGQ8MSl0aGVuIGRkPTEgZW5kIGVuZDthZGEucGFyZW50OnNldEN1cnNvcih0cnVlLGJfYitfX2EtZGQsCmNfYithX2EtY2QsYWRhLmZnQ29sb3IpCmFkYTp1cGRhdGVEcmF3KCllbmQgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihhZGEsYmRhLGNkYSxkZGEpCmlmCihhZC5zY3JvbGxIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKClsb2NhbCBkX2IsX2FiPWFkYTpnZXRTaXplKCkKY2Q9Y2QrYmRhO2lmKGNkPiNiX2EtIChfYWItMSkpdGhlbiBjZD0jYl9hLSAoX2FiLTEpZW5kO2lmCihjZDwxKXRoZW4gY2Q9MSBlbmQKaWYKCihfX2IrX19hLWRkPj1fX2IgYW5kIF9fYitfX2EtZGQ8X19iK2RfYilhbmQoY19iK2FfYS1jZD49Y19iIGFuZCBjX2IrYV9hLWNkPGNfYitfYWIpdGhlbgphZGEucGFyZW50OnNldEN1cnNvcih0cnVlLGJfYitfX2EtZGQsY19iK2FfYS1jZCxhZGEuZmdDb2xvcillbHNlIGFkYS5wYXJlbnQ6c2V0Q3Vyc29yKGZhbHNlKWVuZDthZGE6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kIGVuZCxtb3VzZUhhbmRsZXI9ZnVuY3Rpb24oYWRhLGJkYSxjZGEsZGRhKQppZgooYWQubW91c2VIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKaWYKKGJfYVtkZGEtYV9iK2NkXX49bmlsKXRoZW4gX19hPWNkYS1fX2IrZGQ7YV9hPWRkYS1hX2IrY2Q7Y2FhPW5pbDtfYmE9bmlsO2JhYT1fX2E7ZGFhPWFfYQppZihfX2E+CmJfYVthX2FdOmxlbigpKXRoZW4gX19hPWJfYVthX2FdOmxlbigpKzE7YmFhPV9fYSBlbmQ7aWYoX19hPGRkKXRoZW4gZGQ9X19hLTE7aWYoZGQ8MSl0aGVuIGRkPTEgZW5kIGVuZAphZGE6dXBkYXRlRHJhdygpZW5kO2lmKGFkYS5wYXJlbnR+PW5pbCl0aGVuCmFkYS5wYXJlbnQ6c2V0Q3Vyc29yKHRydWUsYl9iK19fYS1kZCxjX2IrYV9hLWNkLGFkYS5mZ0NvbG9yKWVuZDtyZXR1cm4gdHJ1ZSBlbmQgZW5kLG1vdXNlVXBIYW5kbGVyPWZ1bmN0aW9uKGFkYSxiZGEsY2RhLGRkYSkKaWYKKGFkLm1vdXNlVXBIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKaWYKKGJfYVtkZGEtYV9iK2NkXX49bmlsKXRoZW4gY2FhPWNkYS1fX2IrZGQ7X2JhPWRkYS1hX2IrY2Q7aWYoY2FhPmJfYVtfYmFdOmxlbigpKXRoZW4gY2FhPQpiX2FbX2JhXTpsZW4oKSsxIGVuZDtpZihiYWE9PWNhYSlhbmQoZGFhPT1fYmEpdGhlbiBiYWEsY2FhLGRhYSxfYmE9Cm5pbCxuaWwsbmlsLG5pbCBlbmQKYWRhOnVwZGF0ZURyYXcoKWVuZDtyZXR1cm4gdHJ1ZSBlbmQgZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihhZGEsYmRhLGNkYSxkZGEsX19iLGFfYikKYWQuZXZlbnRIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSxfX2IsYV9iKQppZihiZGE9PSJwYXN0ZSIpdGhlbgppZihhZGE6aXNGb2N1c2VkKCkpdGhlbiBsb2NhbCBiX2IsY19iPWFkYTpnZXRTaXplKCliX2FbYV9hXT1iX2FbYV9hXTpzdWIoMSwKX19hLTEpLi4KY2RhLi5iX2FbYV9hXTpzdWIoX19hLGJfYVthX2FdOmxlbigpKQpkX2FbYV9hXT1kX2FbYV9hXTpzdWIoMSwKX19hLTEpLi5iYlthZGEuZmdDb2xvcl06cmVwKGNkYTpsZW4oKSkuLgpkX2FbYV9hXTpzdWIoX19hLGRfYVthX2FdOmxlbigpKQpjX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMSkuLgoKYmJbYWRhLmJnQ29sb3JdOnJlcChjZGE6bGVuKCkpLi5jX2FbYV9hXTpzdWIoX19hLGNfYVthX2FdOmxlbigpKV9fYT1fX2ErY2RhOmxlbigpCmlmKF9fYT49Yl9iK2RkKXRoZW4gZGQ9KF9fYSsxKS1iX2IgZW5kO2xvY2FsIGRfYixfYWI9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKYWRhLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxkX2IrX19hLWRkLF9hYisKYV9hLWNkLGFkYS5mZ0NvbG9yKWNjYShhZGEpYWRhOnVwZGF0ZURyYXcoKWVuZCBlbmQgZW5kLHNldFNlbGVjdGlvbkNvbG9yPWZ1bmN0aW9uKGFkYSxiZGEsY2RhKWFiYT0KYmRhIG9yIGFiYTtiYmE9Y2RhIG9yIGJiYTtyZXR1cm4gYWRhIGVuZCxkcmF3PWZ1bmN0aW9uKGFkYSkKaWYKKGFkLmRyYXcoYWRhKSl0aGVuCmlmKGFkYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGJkYSxjZGE9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgZGRhLF9fYj1hZGE6Z2V0U2l6ZSgpCmZvciBuPTEsX19iIGRvIGxvY2FsIGFfYj0iImxvY2FsIGJfYj0iImxvY2FsIGNfYj0iIgppZihiX2FbbitjZC0xXX49bmlsKXRoZW4gYV9iPWJfYVtuK2NkLTFdY19iPWRfYVsKbitjZC0xXWJfYj1jX2FbbitjZC0xXWVuZDthX2I9YV9iOnN1YihkZCxkZGErZGQtMSkKYl9iPWJfYjpzdWIoZGQsZGRhK2RkLTEpY19iPWNfYjpzdWIoZGQsZGRhK2RkLTEpbG9jYWwgZF9iPWRkYS1hX2I6bGVuKClpZihkX2I8MCl0aGVuCmRfYj0wIGVuZDthX2I9YV9iLi5fYyhhZGEuYmdTeW1ib2wsZF9iKWJfYj1iX2IuLgpfYyhiYlthZGEuYmdDb2xvcl0sZF9iKQpjX2I9Y19iLi5fYyhiYlthZGEuZmdDb2xvcl0sZF9iKWFkYS5wYXJlbnQ6c2V0VGV4dChiZGEsY2RhK24tMSxhX2IpYWRhLnBhcmVudDpzZXRCRyhiZGEsCmNkYStuLTEsYl9iKQphZGEucGFyZW50OnNldEZHKGJkYSxjZGErbi0xLGNfYillbmQKaWYoYWRhOmlzRm9jdXNlZCgpKXRoZW4gbG9jYWwgYV9iLGJfYj1hZGE6Z2V0QW5jaG9yUG9zaXRpb24oKWVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGFkYSkKYWRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGFkYSlhZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsYWRhKQphZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGFkYSlhZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9kcmFnIixhZGEpCmFkYS5wYXJlbnQ6YWRkRXZlbnQoImtleSIsYWRhKWFkYS5wYXJlbnQ6YWRkRXZlbnQoImNoYXIiLGFkYSkKYWRhLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLGFkYSkKaWYoYWQuaW5pdChhZGEpKXRoZW4KYWRhLmJnQ29sb3I9YWRhLnBhcmVudDpnZXRUaGVtZSgiVGV4dGZpZWxkQkciKWFkYS5mZ0NvbG9yPWFkYS5wYXJlbnQ6Z2V0VGhlbWUoIlRleHRmaWVsZFRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShfZGEsYWQpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJTY3JvbGxiYXIiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpCmxvY2FsIGJiPWRhKCJ1dGlscyIpLmdldFZhbHVlRnJvbVhNTApyZXR1cm4KZnVuY3Rpb24oY2IpbG9jYWwgZGI9YWIoY2IpbG9jYWwgX2M9IlNjcm9sbGJhciJkYi53aWR0aD0xO2RiLmhlaWdodD04O2RiOnNldFZhbHVlKDEpCmRiOnNldFpJbmRleCgyKWxvY2FsIGFjPSJ2ZXJ0aWNhbCJsb2NhbCBiYz0iICJsb2NhbCBjYztsb2NhbCBkYz0iXDEyNyJsb2NhbCBfZD1kYi5oZWlnaHQ7bG9jYWwgYWQ9MTtsb2NhbCBiZD0xCmxvY2FsIGZ1bmN0aW9uIGNkKF9fYSxhX2EsYl9hLGNfYSkKbG9jYWwgZF9hLF9hYT1fX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihfX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBhYWEsYmFhPV9fYTpnZXRTaXplKCkKaWYoYWM9PSJob3Jpem9udGFsIil0aGVuCmZvciBfaW5kZXg9MCxhYWEgZG8KaWYKKGRfYStfaW5kZXg9PWJfYSlhbmQoX2FhPD1jX2EpYW5kKF9hYStiYWE+Y19hKXRoZW4KYWQ9bWF0aC5taW4oX2luZGV4KzEsYWFhLSAoYmQtMSkpX19hOnNldFZhbHVlKF9kL2FhYSogKGFkKSlfX2E6dXBkYXRlRHJhdygpZW5kIGVuZCBlbmQKaWYoYWM9PSJ2ZXJ0aWNhbCIpdGhlbgpmb3IgX2luZGV4PTAsYmFhIGRvCmlmCihfYWErX2luZGV4PT1jX2EpYW5kKGRfYTw9Yl9hKWFuZChkX2ErYWFhPmJfYSl0aGVuIGFkPW1hdGgubWluKF9pbmRleCsxLGJhYS0gKGJkLTEpKQpfX2E6c2V0VmFsdWUoX2QvYmFhKiAoYWQpKV9fYTp1cGRhdGVEcmF3KCllbmQgZW5kIGVuZCBlbmQKbG9jYWwgZGQ9e2dldFR5cGU9ZnVuY3Rpb24oX19hKXJldHVybiBfYyBlbmQsc2V0U3ltYm9sPWZ1bmN0aW9uKF9fYSxhX2EpYmM9YV9hOnN1YigxLDEpX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfX2EsYV9hKQpkYi5zZXRWYWx1ZXNCeVhNTERhdGEoX19hLGFfYSkKaWYoYmIoIm1heFZhbHVlIixhX2Epfj1uaWwpdGhlbiBfZD1iYigibWF4VmFsdWUiLGFfYSllbmQ7aWYoYmIoImJhY2tncm91bmRTeW1ib2wiLGFfYSl+PW5pbCl0aGVuCmRjPWJiKCJiYWNrZ3JvdW5kU3ltYm9sIixhX2EpOnN1YigxLDEpZW5kO2lmKGJiKCJzeW1ib2wiLGFfYSl+PW5pbCl0aGVuCmJjPWJiKCJzeW1ib2wiLGFfYSk6c3ViKDEsMSllbmQ7aWYoYmIoImJhclR5cGUiLGFfYSl+PW5pbCl0aGVuCmFjPWJiKCJiYXJUeXBlIixhX2EpOmxvd2VyKCllbmQ7aWYoYmIoInN5bWJvbFNpemUiLGFfYSl+PW5pbCl0aGVuCl9fYTpzZXRTeW1ib2xTaXplKGJiKCJzeW1ib2xTaXplIixhX2EpKWVuZDtpZihiYigic3ltYm9sQ29sb3IiLGFfYSl+PW5pbCl0aGVuCmNjPWNvbG9yc1tiYigic3ltYm9sQ29sb3IiLGFfYSldZW5kO2lmKGJiKCJpbmRleCIsYV9hKX49bmlsKXRoZW4KX19hOnNldEluZGV4KGJiKCJpbmRleCIsYV9hKSllbmQgZW5kLHNldEluZGV4PWZ1bmN0aW9uKF9fYSxhX2EpCmFkPWFfYTtpZihhZDwxKXRoZW4gYWQ9MSBlbmQ7bG9jYWwgYl9hLGNfYT1fX2E6Z2V0U2l6ZSgpCmFkPW1hdGgubWluKGFkLCgKYWM9PSJ2ZXJ0aWNhbCJhbmQgY19hIG9yIGJfYSktIChiZC0xKSkKX19hOnNldFZhbHVlKF9kLyAoYWM9PSJ2ZXJ0aWNhbCJhbmQgY19hIG9yIGJfYSkqYWQpX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLGdldEluZGV4PWZ1bmN0aW9uKF9fYSlyZXR1cm4KYWQgZW5kLHNldFN5bWJvbFNpemU9ZnVuY3Rpb24oX19hLGFfYSliZD10b251bWJlcihhX2Epb3IgMQpsb2NhbCBiX2EsY19hPV9fYTpnZXRTaXplKCkKaWYoYWM9PSJ2ZXJ0aWNhbCIpdGhlbgpfX2E6c2V0VmFsdWUoYWQtMSAqIChfZC8gKGNfYS0gKGJkLTEpKSktIChfZC8gKGNfYS0KKGJkLTEpKSkpZWxzZWlmKGFjPT0iaG9yaXpvbnRhbCIpdGhlbgpfX2E6c2V0VmFsdWUoYWQtMSAqIChfZC8gKGJfYS0gKGJkLTEpKSktIChfZC8gKGJfYS0gKApiZC0xKSkpKWVuZDtfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsc2V0TWF4VmFsdWU9ZnVuY3Rpb24oX19hLGFfYSkKX2Q9YV9hO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRCYWNrZ3JvdW5kU3ltYm9sPWZ1bmN0aW9uKF9fYSxhX2EpCmRjPXN0cmluZy5zdWIoYV9hLDEsMSlfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsc2V0U3ltYm9sQ29sb3I9ZnVuY3Rpb24oX19hLGFfYSljYz1hX2EKX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLHNldEJhclR5cGU9ZnVuY3Rpb24oX19hLGFfYSlhYz1hX2E6bG93ZXIoKQpfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hLGNfYSlpZihkYi5tb3VzZUhhbmRsZXIoX19hLGFfYSxiX2EsY19hKSl0aGVuCmNkKF9fYSxhX2EsYl9hLGNfYSlyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmFnSGFuZGxlcj1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EpaWYKKGRiLmRyYWdIYW5kbGVyKF9fYSxhX2EsYl9hLGNfYSkpdGhlbiBjZChfX2EsYV9hLGJfYSxjX2EpcmV0dXJuIHRydWUgZW5kCnJldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EpCmlmCihkYi5zY3JvbGxIYW5kbGVyKF9fYSxhX2EsYl9hLGNfYSkpdGhlbiBsb2NhbCBkX2EsX2FhPV9fYTpnZXRTaXplKClhZD1hZCthX2E7aWYoYWQ8MSl0aGVuIGFkPTEgZW5kCmFkPW1hdGgubWluKGFkLCgKYWM9PSJ2ZXJ0aWNhbCJhbmQgX2FhIG9yIGRfYSktIChiZC0xKSkKX19hOnNldFZhbHVlKF9kLyAoYWM9PSJ2ZXJ0aWNhbCJhbmQgX2FhIG9yIGRfYSkqYWQpX19hOnVwZGF0ZURyYXcoKWVuZCBlbmQsZHJhdz1mdW5jdGlvbihfX2EpCmlmCihkYi5kcmF3KF9fYSkpdGhlbgppZihfX2EucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBhX2EsYl9hPV9fYTpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGNfYSxkX2E9X19hOmdldFNpemUoKQppZihhYz09Imhvcml6b250YWwiKXRoZW4KX19hLnBhcmVudDp3cml0ZVRleHQoYV9hLGJfYSxkYzpyZXAoYWQtMSksX19hLmJnQ29sb3IsX19hLmZnQ29sb3IpCl9fYS5wYXJlbnQ6d3JpdGVUZXh0KGFfYSthZC0xLGJfYSxiYzpyZXAoYmQpLGNjLGNjKQpfX2EucGFyZW50OndyaXRlVGV4dChhX2ErYWQrYmQtMSxiX2EsZGM6cmVwKGNfYS0gKGFkK2JkLTEpKSxfX2EuYmdDb2xvcixfX2EuZmdDb2xvcillbmQKaWYoYWM9PSJ2ZXJ0aWNhbCIpdGhlbgpmb3Igbj0wLGRfYS0xIGRvCmlmKGFkPT1uKzEpdGhlbgpmb3IgY3VySW5kZXhPZmZzZXQ9MCxtYXRoLm1pbihiZC0xLGRfYSlkbyBfX2EucGFyZW50OndyaXRlVGV4dChhX2EsYl9hK24rCmN1ckluZGV4T2Zmc2V0LGJjLGNjLGNjKWVuZCBlbHNlIGlmKG4rMSA8YWQpb3IobisxID5hZC0xICtiZCl0aGVuCl9fYS5wYXJlbnQ6d3JpdGVUZXh0KGFfYSxiX2ErbixkYyxfX2EuYmdDb2xvcixfX2EuZmdDb2xvcillbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihfX2EpCl9fYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixfX2EpX19hLnBhcmVudDphZGRFdmVudCgibW91c2VfZHJhZyIsX19hKQpfX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLF9fYSkKaWYoZGIuaW5pdChfX2EpKXRoZW4KX19hLmJnQ29sb3I9X19hLnBhcmVudDpnZXRUaGVtZSgiU2Nyb2xsYmFyQkciKV9fYS5mZ0NvbG9yPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIlNjcm9sbGJhclRleHQiKQpjYz1fX2EucGFyZW50OmdldFRoZW1lKCJTY3JvbGxiYXJTeW1ib2xDb2xvciIpZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKGRkLGRiKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiUHJvZ3JhbSJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidEhleCIpCmxvY2FsIGNiPWRhKCJwcm9jZXNzIilsb2NhbCBkYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUw7bG9jYWwgX2M9c3RyaW5nLnN1YgpyZXR1cm4KZnVuY3Rpb24oYWMsYmMpbG9jYWwgY2M9YWIoYWMpCmxvY2FsIGRjPSJQcm9ncmFtImNjOnNldFpJbmRleCg1KWxvY2FsIF9kO2xvY2FsIGFkO2xvY2FsIGJkPXt9CmxvY2FsIGZ1bmN0aW9uIGNkKGJhYSxjYWEsZGFhLF9iYSxhYmEpbG9jYWwgYmJhLGNiYT0xLDEKbG9jYWwgZGJhLF9jYT1jb2xvcnMuYmxhY2ssY29sb3JzLndoaXRlO2xvY2FsIGFjYT1mYWxzZTtsb2NhbCBiY2E9ZmFsc2U7bG9jYWwgY2NhPXt9bG9jYWwgZGNhPXt9bG9jYWwgX2RhPXt9bG9jYWwgYWRhPXt9bG9jYWwgYmRhO2xvY2FsIGNkYT17fWZvciBpPTAsMTUgZG8gbG9jYWwgYWJiPTIgXmkKYWRhW2FiYl09e2JjOmdldEJhc2FsdEluc3RhbmNlKCkuZ2V0QmFzZVRlcm0oKS5nZXRQYWxldHRlQ29sb3VyKGFiYil9ZW5kO2xvY2FsIGZ1bmN0aW9uIGRkYSgpCmJkYT0oIiAiKTpyZXAoZGFhKQpmb3Igbj0wLDE1IGRvIGxvY2FsIGFiYj0yIF5uO2xvY2FsIGJiYj1iYlthYmJdY2RhW2FiYl09YmJiOnJlcChkYWEpZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfX2IoKWRkYSgpbG9jYWwgYWJiPWJkYQpsb2NhbCBiYmI9Y2RhW2NvbG9ycy53aGl0ZV1sb2NhbCBjYmI9Y2RhW2NvbG9ycy5ibGFja10KZm9yIG49MSxfYmEgZG8KY2NhW25dPV9jKGNjYVtuXT09bmlsIGFuZCBhYmIgb3IgY2NhW25dLi5hYmI6c3ViKDEsCmRhYS1jY2Fbbl06bGVuKCkpLDEsZGFhKQpfZGFbbl09X2MoX2RhW25dPT1uaWwgYW5kIGJiYiBvciBfZGFbbl0uLgpiYmI6c3ViKDEsZGFhLV9kYVtuXTpsZW4oKSksMSxkYWEpCmRjYVtuXT1fYyhkY2Fbbl09PW5pbCBhbmQgY2JiIG9yIGRjYVtuXS4uCmNiYjpzdWIoMSxkYWEtZGNhW25dOmxlbigpKSwxLGRhYSllbmQ7Y2MudXBkYXRlRHJhdyhjYyllbmQ7X19iKClsb2NhbCBmdW5jdGlvbiBhX2IoKWlmCmJiYT49MSBhbmQgY2JhPj0xIGFuZCBiYmE8PWRhYSBhbmQgY2JhPD1fYmEgdGhlbiBlbHNlIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYl9iKGFiYixiYmIsY2JiKQpsb2NhbCBkYmI9YmJhO2xvY2FsIF9jYj1kYmIrI2FiYi0xCmlmIGNiYT49MSBhbmQgY2JhPD1fYmEgdGhlbgppZiBkYmI8PWRhYSBhbmQgX2NiPj0xIHRoZW4KaWYgZGJiPT0xIGFuZCBfY2I9PQpkYWEgdGhlbiBjY2FbY2JhXT1hYmI7X2RhW2NiYV09YmJiO2RjYVtjYmFdPWNiYiBlbHNlIGxvY2FsIGFjYixiY2IsY2NiCmlmIGRiYjwxIHRoZW4gbG9jYWwgX19jPQoxIC1kYmIrMTtsb2NhbCBhX2M9ZGFhLWRiYisxO2FjYj1fYyhhYmIsX19jLGFfYykKYmNiPV9jKGJiYixfX2MsYV9jKWNjYj1fYyhjYmIsX19jLGFfYyllbHNlaWYgX2NiPmRhYSB0aGVuIGxvY2FsIF9fYz1kYWEtZGJiKzE7YWNiPV9jKGFiYiwxLF9fYykKYmNiPV9jKGJiYiwxLF9fYyljY2I9X2MoY2JiLDEsX19jKWVsc2UgYWNiPWFiYjtiY2I9YmJiO2NjYj1jYmIgZW5kO2xvY2FsIGRjYj1jY2FbY2JhXWxvY2FsIF9kYj1fZGFbY2JhXWxvY2FsIGFkYj1kY2FbY2JhXWxvY2FsIGJkYixjZGIsZGRiCmlmIGRiYj4xIHRoZW4gbG9jYWwgX19jPWRiYi0xO2JkYj0KX2MoZGNiLDEsX19jKS4uYWNiO2NkYj1fYyhfZGIsMSxfX2MpLi5iY2IKZGRiPV9jKGFkYiwxLF9fYykuLmNjYiBlbHNlIGJkYj1hY2I7Y2RiPWJjYjtkZGI9Y2NiIGVuZAppZiBfY2I8ZGFhIHRoZW4gbG9jYWwgX19jPV9jYisxO2JkYj1iZGIuLl9jKGRjYixfX2MsZGFhKQpjZGI9Y2RiLi5fYyhfZGIsX19jLGRhYSlkZGI9ZGRiLi5fYyhhZGIsX19jLGRhYSllbmQ7Y2NhW2NiYV09YmRiO19kYVtjYmFdPWNkYjtkY2FbY2JhXT1kZGIgZW5kO19kOnVwZGF0ZURyYXcoKWVuZDtiYmE9X2NiKzE7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBjX2IoYWJiLGJiYixjYmIpCmlmKGNiYn49bmlsKXRoZW4gbG9jYWwgZGJiPWNjYVtiYmJdaWYoZGJifj1uaWwpdGhlbgpjY2FbYmJiXT1fYyhkYmI6c3ViKDEsYWJiLTEpLi5jYmIuLmRiYjpzdWIoYWJiKwooY2JiOmxlbigpKSxkYWEpLDEsZGFhKWVuZCBlbmQ7X2Q6dXBkYXRlRHJhdygpZW5kCmxvY2FsIGZ1bmN0aW9uIGRfYihhYmIsYmJiLGNiYikKaWYoY2Jifj1uaWwpdGhlbiBsb2NhbCBkYmI9ZGNhW2JiYl1pZihkYmJ+PW5pbCl0aGVuCmRjYVtiYmJdPV9jKGRiYjpzdWIoMSxhYmItMSkuLmNiYi4uZGJiOnN1YihhYmIrCihjYmI6bGVuKCkpLGRhYSksMSxkYWEpZW5kIGVuZDtfZDp1cGRhdGVEcmF3KCllbmQKbG9jYWwgZnVuY3Rpb24gX2FiKGFiYixiYmIsY2JiKQppZihjYmJ+PW5pbCl0aGVuIGxvY2FsIGRiYj1fZGFbYmJiXWlmKGRiYn49bmlsKXRoZW4KX2RhW2JiYl09X2MoZGJiOnN1YigxLGFiYi0xKS4uY2JiLi5kYmI6c3ViKGFiYisKKGNiYjpsZW4oKSksZGFhKSwxLGRhYSllbmQgZW5kO19kOnVwZGF0ZURyYXcoKWVuZApsb2NhbCBhYWI9ZnVuY3Rpb24oYWJiKQppZiB0eXBlKGFiYil+PSJudW1iZXIidGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGFiYikuLiIpIiwyKWVsc2VpZiBiYlthYmJdPT1uaWwgdGhlbgplcnJvcigiSW52YWxpZCBjb2xvciAoZ290ICIuLmFiYi4uIikiLDIpZW5kO19jYT1hYmIgZW5kCmxvY2FsIGJhYj1mdW5jdGlvbihhYmIpCmlmIHR5cGUoYWJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzEgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYWJiKS4uIikiLDIpZWxzZWlmIGJiW2FiYl09PW5pbCB0aGVuCmVycm9yKCJJbnZhbGlkIGNvbG9yIChnb3QgIi4uYWJiLi4iKSIsMillbmQ7ZGJhPWFiYiBlbmQKbG9jYWwgY2FiPWZ1bmN0aW9uKGFiYixiYmIsY2JiLGRiYilpZiB0eXBlKGFiYil+PSJudW1iZXIidGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGFiYikuLiIpIiwyKWVuZAppZiBiYlthYmJdPT1uaWwgdGhlbiBlcnJvcigiSW52YWxpZCBjb2xvciAoZ290ICIuLgphYmIuLiIpIiwyKWVuZDtsb2NhbCBfY2IKaWYKdHlwZShiYmIpPT0ibnVtYmVyImFuZCBjYmI9PW5pbCBhbmQgZGJiPT1uaWwgdGhlbiBfY2I9e2NvbG91cnMucmdiOChiYmIpfWFkYVthYmJdPV9jYiBlbHNlIGlmCnR5cGUoYmJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzIgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYmJiKS4uIikiLDIpZW5kO2lmIHR5cGUoY2JiKX49Im51bWJlciJ0aGVuCmVycm9yKAoiYmFkIGFyZ3VtZW50ICMzIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGNiYikuLiIpIiwyKWVuZDtpZiB0eXBlKGRiYil+PSJudW1iZXIidGhlbgplcnJvcigKImJhZCBhcmd1bWVudCAjNCAoZXhwZWN0ZWQgbnVtYmVyLCBnb3QgIi4udHlwZShkYmIpLi4iKSIsMillbmQ7X2NiPWFkYVthYmJdX2NiWzFdPWJiYgpfY2JbMl09Y2JiO19jYlszXT1kYmIgZW5kIGVuZApsb2NhbCBkYWI9ZnVuY3Rpb24oYWJiKWlmIHR5cGUoYWJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzEgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYWJiKS4uIikiLDIpZW5kCmlmIGJiW2FiYl09PW5pbCB0aGVuIGVycm9yKCJJbnZhbGlkIGNvbG9yIChnb3QgIi4uCmFiYi4uIikiLDIpZW5kO2xvY2FsIGJiYj1hZGFbYWJiXXJldHVybiBiYmJbMV0sYmJiWzJdLGJiYlszXWVuZApsb2NhbCBfYmI9e3NldEN1cnNvclBvcz1mdW5jdGlvbihhYmIsYmJiKWlmIHR5cGUoYWJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzEgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYWJiKS4uIikiLDIpZW5kO2lmIHR5cGUoYmJiKX49Im51bWJlciJ0aGVuCmVycm9yKAoiYmFkIGFyZ3VtZW50ICMyIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGJiYikuLiIpIiwyKWVuZDtiYmE9bWF0aC5mbG9vcihhYmIpCmNiYT1tYXRoLmZsb29yKGJiYilpZihiY2EpdGhlbiBhX2IoKWVuZCBlbmQsZ2V0Q3Vyc29yUG9zPWZ1bmN0aW9uKClyZXR1cm4KYmJhLGNiYSBlbmQsc2V0Q3Vyc29yQmxpbms9ZnVuY3Rpb24oYWJiKWlmIHR5cGUoYWJiKX49ImJvb2xlYW4idGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBib29sZWFuLCBnb3QgIi4uCnR5cGUoYWJiKS4uIikiLDIpZW5kO2FjYT1hYmIgZW5kLGdldEN1cnNvckJsaW5rPWZ1bmN0aW9uKClyZXR1cm4KYWNhIGVuZCxnZXRQYWxldHRlQ29sb3I9ZGFiLGdldFBhbGV0dGVDb2xvdXI9ZGFiLHNldEJhY2tncm91bmRDb2xvcj1iYWIsc2V0QmFja2dyb3VuZENvbG91cj1iYWIsc2V0VGV4dENvbG9yPWFhYixzZXRUZXh0Q29sb3VyPWFhYixzZXRQYWxldHRlQ29sb3I9Y2FiLHNldFBhbGV0dGVDb2xvdXI9Y2FiLGdldEJhY2tncm91bmRDb2xvcj1mdW5jdGlvbigpcmV0dXJuIGRiYSBlbmQsZ2V0QmFja2dyb3VuZENvbG91cj1mdW5jdGlvbigpcmV0dXJuIGRiYSBlbmQsZ2V0U2l6ZT1mdW5jdGlvbigpCnJldHVybiBkYWEsX2JhIGVuZCxnZXRUZXh0Q29sb3I9ZnVuY3Rpb24oKXJldHVybiBfY2EgZW5kLGdldFRleHRDb2xvdXI9ZnVuY3Rpb24oKXJldHVybiBfY2EgZW5kLGJhc2FsdF9yZXNpemU9ZnVuY3Rpb24oYWJiLGJiYilkYWEsX2JhPWFiYixiYmI7X19iKCllbmQsYmFzYWx0X3JlcG9zaXRpb249ZnVuY3Rpb24oYWJiLGJiYikKYmFhLGNhYT1hYmIsYmJiIGVuZCxiYXNhbHRfc2V0VmlzaWJsZT1mdW5jdGlvbihhYmIpYmNhPWFiYiBlbmQsZHJhd0JhY2tncm91bmRCb3g9ZnVuY3Rpb24oYWJiLGJiYixjYmIsZGJiLF9jYilmb3Igbj0xLGRiYiBkbwpkX2IoYWJiLGJiYisgKG4tMSksYmJbX2NiXTpyZXAoY2JiKSllbmQgZW5kLGRyYXdGb3JlZ3JvdW5kQm94PWZ1bmN0aW9uKGFiYixiYmIsY2JiLGRiYixfY2IpCmZvciBuPTEsZGJiIGRvIF9hYihhYmIsCmJiYisgKG4tMSksYmJbX2NiXTpyZXAoY2JiKSllbmQgZW5kLGRyYXdUZXh0Qm94PWZ1bmN0aW9uKGFiYixiYmIsY2JiLGRiYixfY2IpZm9yIG49MSxkYmIgZG8KY19iKGFiYixiYmIrIChuLTEpLF9jYjpyZXAoY2JiKSllbmQgZW5kLHdyaXRlVGV4dD1mdW5jdGlvbihhYmIsYmJiLGNiYixkYmIsX2NiKQpkYmI9ZGJiIG9yIGRiYTtfY2I9X2NiIG9yIF9jYTtjX2IoYmFhLGJiYixjYmIpCmRfYihhYmIsYmJiLGJiW2RiYl06cmVwKGNiYjpsZW4oKSkpX2FiKGFiYixiYmIsYmJbX2NiXTpyZXAoY2JiOmxlbigpKSllbmQsYmFzYWx0X3VwZGF0ZT1mdW5jdGlvbigpCmlmKApiY349bmlsKXRoZW4gZm9yIG49MSxfYmEgZG8gYmM6c2V0VGV4dChiYWEsY2FhKyAobi0xKSxjY2Fbbl0pYmM6c2V0QkcoYmFhLGNhYSsKKG4tMSksZGNhW25dKQpiYzpzZXRGRyhiYWEsY2FhKyAobi0xKSxfZGFbbl0pZW5kIGVuZCBlbmQsc2Nyb2xsPWZ1bmN0aW9uKGFiYilpZgp0eXBlKGFiYil+PSJudW1iZXIidGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGFiYikuLiIpIiwyKWVuZAppZiBhYmJ+PTAgdGhlbiBsb2NhbCBiYmI9YmRhCmxvY2FsIGNiYj1jZGFbX2NhXWxvY2FsIGRiYj1jZGFbZGJhXQpmb3IgbmV3WT0xLF9iYSBkbyBsb2NhbCBfY2I9bmV3WSthYmIKaWYgX2NiPj0xIGFuZCBfY2I8PV9iYSB0aGVuCmNjYVtuZXdZXT1jY2FbX2NiXWRjYVtuZXdZXT1kY2FbX2NiXV9kYVtuZXdZXT1fZGFbX2NiXWVsc2UgY2NhW25ld1ldPWJiYgpfZGFbbmV3WV09Y2JiO2RjYVtuZXdZXT1kYmIgZW5kIGVuZCBlbmQ7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kLGlzQ29sb3I9ZnVuY3Rpb24oKXJldHVybgpiYzpnZXRCYXNhbHRJbnN0YW5jZSgpLmdldEJhc2VUZXJtKCkuaXNDb2xvcigpZW5kLGlzQ29sb3VyPWZ1bmN0aW9uKClyZXR1cm4KYmM6Z2V0QmFzYWx0SW5zdGFuY2UoKS5nZXRCYXNlVGVybSgpLmlzQ29sb3IoKWVuZCx3cml0ZT1mdW5jdGlvbihhYmIpCmFiYj10b3N0cmluZyhhYmIpaWYoYmNhKXRoZW4KYl9iKGFiYixiYltfY2FdOnJlcChhYmI6bGVuKCkpLGJiW2RiYV06cmVwKGFiYjpsZW4oKSkpZW5kIGVuZCxjbGVhckxpbmU9ZnVuY3Rpb24oKQppZgooYmNhKXRoZW4gY19iKDEsY2JhLCgiICIpOnJlcChkYWEpKQpkX2IoMSxjYmEsYmJbZGJhXTpyZXAoZGFhKSlfYWIoMSxjYmEsYmJbX2NhXTpyZXAoZGFhKSllbmQ7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kLGNsZWFyPWZ1bmN0aW9uKCkKZm9yIG49MSxfYmEKZG8gY19iKDEsbiwoIiAiKTpyZXAoZGFhKSkKZF9iKDEsbixiYltkYmFdOnJlcChkYWEpKV9hYigxLG4sYmJbX2NhXTpyZXAoZGFhKSllbmQ7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kLGJsaXQ9ZnVuY3Rpb24oYWJiLGJiYixjYmIpaWYKdHlwZShhYmIpfj0ic3RyaW5nInRoZW4KZXJyb3IoImJhZCBhcmd1bWVudCAjMSAoZXhwZWN0ZWQgc3RyaW5nLCBnb3QgIi4udHlwZShhYmIpLi4iKSIsMillbmQ7aWYgdHlwZShiYmIpfj0ic3RyaW5nInRoZW4KZXJyb3IoCiJiYWQgYXJndW1lbnQgIzIgKGV4cGVjdGVkIHN0cmluZywgZ290ICIuLnR5cGUoYmJiKS4uIikiLDIpZW5kO2lmIHR5cGUoY2JiKX49InN0cmluZyJ0aGVuCmVycm9yKAoiYmFkIGFyZ3VtZW50ICMzIChleHBlY3RlZCBzdHJpbmcsIGdvdCAiLi50eXBlKGNiYikuLiIpIiwyKWVuZAppZgojYmJifj0jYWJiIG9yI2NiYn49I2FiYiB0aGVuIGVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGgiLDIpZW5kO2lmKGJjYSl0aGVuIGJfYihhYmIsYmJiLGNiYillbmQgZW5kfXJldHVybiBfYmIgZW5kO2NjLndpZHRoPTMwO2NjLmhlaWdodD0xMjtsb2NhbCBkZD1jZCgxLDEsY2Mud2lkdGgsY2MuaGVpZ2h0KWxvY2FsIF9fYQpsb2NhbCBhX2E9ZmFsc2U7bG9jYWwgYl9hPXt9CmxvY2FsIGZ1bmN0aW9uIGNfYShiYWEpbG9jYWwgY2FhLGRhYT1kZC5nZXRDdXJzb3JQb3MoKQpsb2NhbCBfYmEsYWJhPWJhYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYmJhLGNiYT1iYWE6Z2V0U2l6ZSgpCmlmKF9iYStjYWEtMSA+PTEgYW5kCl9iYStjYWEtMSA8PV9iYStiYmEtMSBhbmQgZGFhK2FiYS0xID49MSBhbmQKZGFhK2FiYS0xIDw9YWJhK2NiYS0xKXRoZW4KYmFhLnBhcmVudDpzZXRDdXJzb3IoCmJhYTppc0ZvY3VzZWQoKWFuZCBkZC5nZXRDdXJzb3JCbGluaygpLF9iYStjYWEtMSxkYWErYWJhLTEsZGQuZ2V0VGV4dENvbG9yKCkpZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBkX2EoYmFhLGNhYSwuLi4pbG9jYWwgZGFhLF9iYT1fX2E6cmVzdW1lKGNhYSwuLi4pCmlmKGRhYT09ZmFsc2UpYW5kKF9iYX49bmlsKWFuZAooX2Jhfj0iVGVybWluYXRlZCIpdGhlbgpsb2NhbCBhYmE9YmFhOnNlbmRFdmVudCgicHJvZ3JhbV9lcnJvciIsX2JhKQppZihhYmF+PWZhbHNlKXRoZW4gZXJyb3IoIkJhc2FsdCBQcm9ncmFtIC0gIi4uX2JhKWVuZCBlbmQKaWYoX19hOmdldFN0YXR1cygpPT0iZGVhZCIpdGhlbiBiYWE6c2VuZEV2ZW50KCJwcm9ncmFtX2RvbmUiKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX2FhKGJhYSxjYWEsZGFhLF9iYSxhYmEpaWYoX19hPT1uaWwpdGhlbiByZXR1cm4gZmFsc2UgZW5kCmlmIG5vdChfX2E6aXNEZWFkKCkpdGhlbiBpZiBub3QoYV9hKXRoZW4KbG9jYWwgYmJhLGNiYT1iYWE6Z2V0QWJzb2x1dGVQb3NpdGlvbihiYWE6Z2V0QW5jaG9yUG9zaXRpb24oCm5pbCxuaWwsdHJ1ZSkpZF9hKGJhYSxjYWEsZGFhLF9iYS1iYmErMSxhYmEtY2JhKzEpCmNfYShiYWEpZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYWFhKGJhYSxjYWEsZGFhLF9iYSlpZihfX2E9PW5pbCl0aGVuIHJldHVybiBmYWxzZSBlbmQKaWYgbm90KF9fYTppc0RlYWQoKSl0aGVuIGlmIG5vdChhX2EpdGhlbiBpZihiYWEuZHJhdyl0aGVuCmRfYShiYWEsY2FhLGRhYSxfYmEpY19hKGJhYSllbmQgZW5kIGVuZCBlbmQKX2Q9e2dldFR5cGU9ZnVuY3Rpb24oYmFhKXJldHVybiBkYyBlbmQsc2hvdz1mdW5jdGlvbihiYWEpY2Muc2hvdyhiYWEpCmRkLnNldEJhY2tncm91bmRDb2xvcihiYWEuYmdDb2xvcilkZC5zZXRUZXh0Q29sb3IoYmFhLmZnQ29sb3IpCmRkLmJhc2FsdF9zZXRWaXNpYmxlKHRydWUpcmV0dXJuIGJhYSBlbmQsaGlkZT1mdW5jdGlvbihiYWEpCmNjLmhpZGUoYmFhKWRkLmJhc2FsdF9zZXRWaXNpYmxlKGZhbHNlKXJldHVybiBiYWEgZW5kLHNldFBvc2l0aW9uPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKY2Muc2V0UG9zaXRpb24oYmFhLGNhYSxkYWEsX2JhKQpkZC5iYXNhbHRfcmVwb3NpdGlvbihiYWE6Z2V0QW5jaG9yUG9zaXRpb24oKSlyZXR1cm4gYmFhIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYmFhLGNhYSkKY2Muc2V0VmFsdWVzQnlYTUxEYXRhKGJhYSxjYWEpaWYoZGIoInBhdGgiLGNhYSl+PW5pbCl0aGVuIGFkPWRiKCJwYXRoIixjYWEpZW5kCmlmKApkYigiZXhlY3V0ZSIsY2FhKX49bmlsKXRoZW4gaWYoZGIoImV4ZWN1dGUiLGNhYSkpdGhlbgppZihhZH49bmlsKXRoZW4gYmFhOmV4ZWN1dGUoYWQpZW5kIGVuZCBlbmQgZW5kLGdldEJhc2FsdFdpbmRvdz1mdW5jdGlvbigpcmV0dXJuCmRkIGVuZCxnZXRCYXNhbHRQcm9jZXNzPWZ1bmN0aW9uKClyZXR1cm4gX19hIGVuZCxzZXRTaXplPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSljYy5zZXRTaXplKGJhYSxjYWEsZGFhLF9iYSkKZGQuYmFzYWx0X3Jlc2l6ZShiYWE6Z2V0V2lkdGgoKSxiYWE6Z2V0SGVpZ2h0KCkpcmV0dXJuIGJhYSBlbmQsZ2V0U3RhdHVzPWZ1bmN0aW9uKGJhYSlpZihfX2F+PW5pbCl0aGVuIHJldHVybgpfX2E6Z2V0U3RhdHVzKCllbmQ7cmV0dXJuImluYWN0aXZlImVuZCxzZXRFbnZpcm9tZW50PWZ1bmN0aW9uKGJhYSxjYWEpYmQ9CmNhYSBvcnt9cmV0dXJuIGJhYSBlbmQsZXhlY3V0ZT1mdW5jdGlvbihiYWEsY2FhLC4uLilhZD1jYWEgb3IgYWQKX19hPWNiOm5ldyhhZCxkZCxiZCwuLi4pZGQuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9ycy5ibGFjaykKZGQuc2V0VGV4dENvbG9yKGNvbG9ycy53aGl0ZSlkZC5jbGVhcigpZGQuc2V0Q3Vyc29yUG9zKDEsMSkKZGQuc2V0QmFja2dyb3VuZENvbG9yKGJhYS5iZ0NvbG9yKWRkLnNldFRleHRDb2xvcihiYWEuZmdDb2xvcikKZGQuYmFzYWx0X3NldFZpc2libGUodHJ1ZSlkX2EoYmFhKWFfYT1mYWxzZQppZihiYWEucGFyZW50fj1uaWwpdGhlbgpiYWEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsYmFhKWJhYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3VwIixiYWEpCmJhYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2RyYWciLGJhYSliYWEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGJhYSkKYmFhLnBhcmVudDphZGRFdmVudCgia2V5IixiYWEpYmFhLnBhcmVudDphZGRFdmVudCgia2V5X3VwIixiYWEpCmJhYS5wYXJlbnQ6YWRkRXZlbnQoImNoYXIiLGJhYSliYWEucGFyZW50OmFkZEV2ZW50KCJvdGhlcl9ldmVudCIsYmFhKWVuZDtyZXR1cm4gYmFhIGVuZCxzdG9wPWZ1bmN0aW9uKGJhYSkKaWYoCl9fYX49bmlsKXRoZW4KaWYgbm90KF9fYTppc0RlYWQoKSl0aGVuIGRfYShiYWEsInRlcm1pbmF0ZSIpaWYoX19hOmlzRGVhZCgpKXRoZW4KaWYoCmJhYS5wYXJlbnR+PW5pbCl0aGVuIGJhYS5wYXJlbnQ6c2V0Q3Vyc29yKGZhbHNlKWVuZCBlbmQgZW5kIGVuZDtiYWEucGFyZW50OnJlbW92ZUV2ZW50cyhiYWEpcmV0dXJuIGJhYSBlbmQscGF1c2U9ZnVuY3Rpb24oYmFhLGNhYSlhX2E9CmNhYSBvcihub3QgYV9hKQppZihfX2F+PW5pbCl0aGVuIGlmIG5vdChfX2E6aXNEZWFkKCkpdGhlbiBpZiBub3QoYV9hKXRoZW4KYmFhOmluamVjdEV2ZW50cyhiX2EpYl9hPXt9ZW5kIGVuZCBlbmQ7cmV0dXJuIGJhYSBlbmQsaXNQYXVzZWQ9ZnVuY3Rpb24oYmFhKXJldHVybgphX2EgZW5kLGluamVjdEV2ZW50PWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSxhYmEsYmJhLGNiYSkKaWYoX19hfj1uaWwpdGhlbgppZiBub3QoX19hOmlzRGVhZCgpKXRoZW4gaWYoYV9hPT1mYWxzZSlvcihjYmEpdGhlbgpkX2EoYmFhLGNhYSxkYWEsX2JhLGFiYSxiYmEpZWxzZQp0YWJsZS5pbnNlcnQoYl9hLHtldmVudD1jYWEsYXJncz17ZGFhLF9iYSxhYmEsYmJhfX0pZW5kIGVuZCBlbmQ7cmV0dXJuIGJhYSBlbmQsZ2V0UXVldWVkRXZlbnRzPWZ1bmN0aW9uKGJhYSlyZXR1cm4KYl9hIGVuZCx1cGRhdGVRdWV1ZWRFdmVudHM9ZnVuY3Rpb24oYmFhLGNhYSliX2E9Y2FhIG9yIGJfYTtyZXR1cm4gYmFhIGVuZCxpbmplY3RFdmVudHM9ZnVuY3Rpb24oYmFhLGNhYSlpZihfX2F+PW5pbCl0aGVuCmlmIG5vdAooX19hOmlzRGVhZCgpKXRoZW4gZm9yIGRhYSxfYmEgaW4gcGFpcnMoY2FhKWRvCmRfYShiYWEsX2JhLmV2ZW50LHRhYmxlLnVucGFjayhfYmEuYXJncykpZW5kIGVuZCBlbmQ7cmV0dXJuIGJhYSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKaWYKKGNjLm1vdXNlSGFuZGxlcihiYWEsY2FhLGRhYSxfYmEpKXRoZW4gX2FhKGJhYSwibW91c2VfY2xpY2siLGNhYSxkYWEsX2JhKXJldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLG1vdXNlVXBIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKaWYKKGNjLm1vdXNlVXBIYW5kbGVyKGJhYSxjYWEsZGFhLF9iYSkpdGhlbiBfYWEoYmFhLCJtb3VzZV91cCIsY2FhLGRhYSxfYmEpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihiYWEsY2FhLGRhYSxfYmEpCmlmCihjYy5zY3JvbGxIYW5kbGVyKGJhYSxjYWEsZGFhLF9iYSkpdGhlbiBfYWEoYmFhLCJtb3VzZV9zY3JvbGwiLGNhYSxkYWEsX2JhKXJldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGRyYWdIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKaWYKKGNjLmRyYWdIYW5kbGVyKGJhYSxjYWEsZGFhLF9iYSkpdGhlbiBfYWEoYmFhLCJtb3VzZV9kcmFnIixjYWEsZGFhLF9iYSlyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxrZXlIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhKWlmCihjYy5rZXlIYW5kbGVyKGJhYSxjYWEsZGFhKSl0aGVuIGFhYShiYWEsImtleSIsY2FhLGRhYSlyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuCmZhbHNlIGVuZCxrZXlVcEhhbmRsZXI9ZnVuY3Rpb24oYmFhLGNhYSlpZgooY2Mua2V5VXBIYW5kbGVyKGJhYSxjYWEpKXRoZW4gYWFhKGJhYSwia2V5X3VwIixjYWEpcmV0dXJuIHRydWUgZW5kCnJldHVybiBmYWxzZSBlbmQsY2hhckhhbmRsZXI9ZnVuY3Rpb24oYmFhLGNhYSlpZgooY2MuY2hhckhhbmRsZXIoYmFhLGNhYSkpdGhlbiBhYWEoYmFhLCJjaGFyIixjYWEpcmV0dXJuIHRydWUgZW5kCnJldHVybiBmYWxzZSBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGJhYSkKY2MuZ2V0Rm9jdXNIYW5kbGVyKGJhYSkKaWYoX19hfj1uaWwpdGhlbgppZiBub3QoX19hOmlzRGVhZCgpKXRoZW4KaWYgbm90KGFfYSl0aGVuCmlmKGJhYS5wYXJlbnR+PW5pbCl0aGVuCmxvY2FsIGNhYSxkYWE9ZGQuZ2V0Q3Vyc29yUG9zKClsb2NhbCBfYmEsYWJhPWJhYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYmJhLGNiYT1iYWE6Z2V0U2l6ZSgpCmlmCigKX2JhK2NhYS0xID49MSBhbmQgX2JhK2NhYS0xIDw9X2JhK2JiYS0xIGFuZApkYWErYWJhLTEgPj0xIGFuZCBkYWErYWJhLTEgPD1hYmErY2JhLTEpdGhlbgpiYWEucGFyZW50OnNldEN1cnNvcihkZC5nZXRDdXJzb3JCbGluaygpLF9iYStjYWEtMSxkYWErYWJhLTEsZGQuZ2V0VGV4dENvbG9yKCkpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihiYWEpCmNjLmxvc2VGb2N1c0hhbmRsZXIoYmFhKQppZihfX2F+PW5pbCl0aGVuIGlmIG5vdChfX2E6aXNEZWFkKCkpdGhlbiBpZihiYWEucGFyZW50fj1uaWwpdGhlbgpiYWEucGFyZW50OnNldEN1cnNvcihmYWxzZSllbmQgZW5kIGVuZCBlbmQsY3VzdG9tRXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsLi4uKQpjYy5jdXN0b21FdmVudEhhbmRsZXIoYmFhLGNhYSwuLi4paWYoX19hPT1uaWwpdGhlbiByZXR1cm4gZW5kCmlmKGNhYT09ImJhc2FsdF9yZXNpemUiKXRoZW4gbG9jYWwgZGFhLF9iYT1kZC5nZXRTaXplKCkKbG9jYWwgYWJhLGJiYT1iYWE6Z2V0U2l6ZSgpCmlmKGRhYX49YWJhKW9yKF9iYX49YmJhKXRoZW4gZGQuYmFzYWx0X3Jlc2l6ZShhYmEsYmJhKWlmIG5vdAooX19hOmlzRGVhZCgpKXRoZW4gZF9hKGJhYSwidGVybV9yZXNpemUiKWVuZCBlbmQKZGQuYmFzYWx0X3JlcG9zaXRpb24oYmFhOmdldEFuY2hvclBvc2l0aW9uKCkpZW5kIGVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oYmFhLGNhYSxkYWEsX2JhLGFiYSxiYmEpCmNjLmV2ZW50SGFuZGxlcihiYWEsY2FhLGRhYSxfYmEsYWJhLGJiYSlpZihfX2E9PW5pbCl0aGVuIHJldHVybiBlbmQKaWYgbm90KF9fYTppc0RlYWQoKSl0aGVuCmlmIG5vdChhX2EpdGhlbiBpZihjYWF+PSJ0ZXJtaW5hdGUiKXRoZW4KZF9hKGJhYSxjYWEsZGFhLF9iYSxhYmEsYmJhKWVuZAppZihiYWE6aXNGb2N1c2VkKCkpdGhlbgpsb2NhbCBjYmEsZGJhPWJhYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgX2NhLGFjYT1kZC5nZXRDdXJzb3JQb3MoKQppZihiYWEucGFyZW50fj1uaWwpdGhlbgpsb2NhbCBiY2EsY2NhPWJhYTpnZXRTaXplKCkKaWYKKGNiYStfY2EtMSA+PTEgYW5kIGNiYStfY2EtMSA8PWNiYStiY2EtMSBhbmQKYWNhK2RiYS0xID49MSBhbmQgYWNhK2RiYS0xIDw9ZGJhK2NjYS0xKXRoZW4KYmFhLnBhcmVudDpzZXRDdXJzb3IoZGQuZ2V0Q3Vyc29yQmxpbmsoKSxjYmErX2NhLTEsYWNhK2RiYS0xLGRkLmdldFRleHRDb2xvcigpKWVuZCBlbmQ7aWYoY2FhPT0idGVybWluYXRlIil0aGVuIGRfYShiYWEsY2FhKQpiYWEucGFyZW50OnNldEN1cnNvcihmYWxzZSlyZXR1cm4gdHJ1ZSBlbmQgZW5kIGVsc2UKdGFibGUuaW5zZXJ0KGJfYSx7ZXZlbnQ9Y2FhLGFyZ3M9e2RhYSxfYmEsYWJhLGJiYX19KWVuZCBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oYmFhKQppZgooY2MuZHJhdyhiYWEpKXRoZW4KaWYoYmFhLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgY2FhLGRhYT1iYWE6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBfYmEsYWJhPWRkLmdldEN1cnNvclBvcygpbG9jYWwgYmJhLGNiYT1iYWE6Z2V0U2l6ZSgpZGQuYmFzYWx0X3JlcG9zaXRpb24oY2FhLGRhYSkKZGQuYmFzYWx0X3VwZGF0ZSgpCmlmCihjYWErX2JhLTEgPj0xIGFuZCBjYWErX2JhLTEgPD1jYWErYmJhLTEgYW5kCmFiYStkYWEtMSA+PTEgYW5kIGFiYStkYWEtMSA8PWRhYStjYmEtMSl0aGVuCmJhYS5wYXJlbnQ6c2V0Q3Vyc29yKGJhYTppc0ZvY3VzZWQoKWFuZCBkZC5nZXRDdXJzb3JCbGluaygpLApjYWErX2JhLTEsYWJhK2RhYS0xLGRkLmdldFRleHRDb2xvcigpKWVuZCBlbmQgZW5kIGVuZCxvbkVycm9yPWZ1bmN0aW9uKGJhYSwuLi4pCmZvciBjYWEsZGFhIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGRhYSk9PSJmdW5jdGlvbiIpdGhlbgpiYWE6cmVnaXN0ZXJFdmVudCgicHJvZ3JhbV9lcnJvciIsZGFhKWVuZCBlbmQ7aWYoYmFhLnBhcmVudH49bmlsKXRoZW4KYmFhLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLGJhYSllbmQ7cmV0dXJuIGJhYSBlbmQsb25Eb25lPWZ1bmN0aW9uKGJhYSwuLi4pCmZvciBjYWEsZGFhIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGRhYSk9PSJmdW5jdGlvbiIpdGhlbgpiYWE6cmVnaXN0ZXJFdmVudCgicHJvZ3JhbV9kb25lIixkYWEpZW5kIGVuZDtpZihiYWEucGFyZW50fj1uaWwpdGhlbgpiYWEucGFyZW50OmFkZEV2ZW50KCJvdGhlcl9ldmVudCIsYmFhKWVuZDtyZXR1cm4gYmFhIGVuZCxpbml0PWZ1bmN0aW9uKGJhYSkKaWYKKGNjLmluaXQoYmFhKSl0aGVuIGJhYS5iZ0NvbG9yPWJhYS5wYXJlbnQ6Z2V0VGhlbWUoIlByb2dyYW1CRyIpZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKF9kLGNjKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiU3dpdGNoIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKQpsb2NhbCBiYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGNiKWxvY2FsIGRiPWFiKGNiKWxvY2FsIF9jPSJTd2l0Y2giZGIud2lkdGg9MjtkYi5oZWlnaHQ9MQpkYi5iZ0NvbG9yPWNvbG9ycy5saWdodEdyYXk7ZGIuZmdDb2xvcj1jb2xvcnMuZ3JheTtkYjpzZXRWYWx1ZShmYWxzZSlkYjpzZXRaSW5kZXgoNSkKbG9jYWwgYWM9Y29sb3JzLmJsYWNrO2xvY2FsIGJjPWNvbG9ycy5yZWQ7bG9jYWwgY2M9Y29sb3JzLmdyZWVuCmxvY2FsIGRjPXtnZXRUeXBlPWZ1bmN0aW9uKF9kKXJldHVybiBfYyBlbmQsc2V0U3ltYm9sQ29sb3I9ZnVuY3Rpb24oX2QsYWQpYWM9YWQKX2Q6dXBkYXRlRHJhdygpcmV0dXJuIF9kIGVuZCxzZXRBY3RpdmVCYWNrZ3JvdW5kPWZ1bmN0aW9uKF9kLGFkKWNjPWFkO19kOnVwZGF0ZURyYXcoKXJldHVybiBfZCBlbmQsc2V0SW5hY3RpdmVCYWNrZ3JvdW5kPWZ1bmN0aW9uKF9kLGFkKQpiYz1hZDtfZDp1cGRhdGVEcmF3KClyZXR1cm4gX2QgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfZCxhZCkKZGIuc2V0VmFsdWVzQnlYTUxEYXRhKF9kLGFkKWlmKGJiKCJpbmFjdGl2ZUJHIixhZCl+PW5pbCl0aGVuCmJjPWNvbG9yc1tiYigiaW5hY3RpdmVCRyIsYWQpXWVuZDtpZihiYigiYWN0aXZlQkciLGFkKX49bmlsKXRoZW4KY2M9Y29sb3JzW2JiKCJhY3RpdmVCRyIsYWQpXWVuZDtpZihiYigic3ltYm9sQ29sb3IiLGFkKX49bmlsKXRoZW4KYWM9Y29sb3JzW2JiKCJzeW1ib2xDb2xvciIsYWQpXWVuZCBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKF9kLGFkLGJkLGNkKQppZgooZGIubW91c2VIYW5kbGVyKF9kLGFkLGJkLGNkKSl0aGVuCmxvY2FsIGRkLF9fYT1fZDpnZXRBYnNvbHV0ZVBvc2l0aW9uKF9kOmdldEFuY2hvclBvc2l0aW9uKCkpX2Q6c2V0VmFsdWUobm90IF9kOmdldFZhbHVlKCkpCl9kOnVwZGF0ZURyYXcoKXJldHVybiB0cnVlIGVuZCBlbmQsZHJhdz1mdW5jdGlvbihfZCkKaWYKKGRiLmRyYXcoX2QpKXRoZW4KaWYoX2QucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBhZCxiZD1fZDpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGNkLGRkPV9kOmdldFNpemUoKQpfZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYWQsYmQsY2QsZGQsX2QuYmdDb2xvcikKaWYoX2Q6Z2V0VmFsdWUoKSl0aGVuCl9kLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChhZCxiZCwxLGRkLGNjKV9kLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChhZCsxLGJkLDEsZGQsYWMpZWxzZQpfZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYWQsYmQsMSxkZCxhYylfZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYWQrMSxiZCwxLGRkLGJjKWVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKF9kKQpfZC5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixfZCkKaWYoZGIuaW5pdChfZCkpdGhlbiBfZC5iZ0NvbG9yPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoQkciKQpfZC5mZ0NvbG9yPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoVGV4dCIpYWM9X2QucGFyZW50OmdldFRoZW1lKCJTd2l0Y2hCR1N5bWJvbCIpCmJjPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoSW5hY3RpdmUiKWNjPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoQWN0aXZlIillbmQgZW5kfXJldHVybiBzZXRtZXRhdGFibGUoZGMsZGIpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJTbGlkZXIiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpCmxvY2FsIGJiPWRhKCJiYXNhbHRMb2dzIilsb2NhbCBjYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGRiKWxvY2FsIF9jPWFiKGRiKWxvY2FsIGFjPSJTbGlkZXIiCl9jLndpZHRoPTg7X2MuaGVpZ2h0PTE7X2M6c2V0VmFsdWUoMSlsb2NhbCBiYz0iaG9yaXpvbnRhbCJsb2NhbCBjYz0iICJsb2NhbCBkYztsb2NhbCBfZD0iXDE0MCIKbG9jYWwgYWQ9X2Mud2lkdGg7bG9jYWwgYmQ9MTtsb2NhbCBjZD0xCmxvY2FsIGZ1bmN0aW9uIGRkKGFfYSxiX2EsY19hLGRfYSkKbG9jYWwgX2FhLGFhYT1hX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihhX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBiYWEsY2FhPWFfYTpnZXRTaXplKCkKaWYoYmM9PSJob3Jpem9udGFsIil0aGVuCmZvciBfaW5kZXg9MCxiYWEgZG8KaWYKKF9hYStfaW5kZXg9PWNfYSlhbmQoYWFhPD1kX2EpYW5kKGFhYStjYWE+ZF9hKXRoZW4KYmQ9bWF0aC5taW4oX2luZGV4KzEsYmFhLSAoY2QtMSkpYV9hOnNldFZhbHVlKGFkL2JhYSogKGJkKSlhX2E6dXBkYXRlRHJhdygpZW5kIGVuZCBlbmQKaWYoYmM9PSJ2ZXJ0aWNhbCIpdGhlbgpmb3IgX2luZGV4PTAsY2FhIGRvCmlmCihhYWErX2luZGV4PT1kX2EpYW5kKF9hYTw9Y19hKWFuZChfYWErYmFhPmNfYSl0aGVuIGJkPW1hdGgubWluKF9pbmRleCsxLGNhYS0gKGNkLTEpKQphX2E6c2V0VmFsdWUoYWQvY2FhKiAoYmQpKWFfYTp1cGRhdGVEcmF3KCllbmQgZW5kIGVuZCBlbmQKbG9jYWwgX19hPXtnZXRUeXBlPWZ1bmN0aW9uKGFfYSlyZXR1cm4gYWMgZW5kLHNldFN5bWJvbD1mdW5jdGlvbihhX2EsYl9hKWNjPWJfYTpzdWIoMSwxKWFfYTp1cGRhdGVEcmF3KClyZXR1cm4gYV9hIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYV9hLGJfYSkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGFfYSxiX2EpCmlmKGNiKCJtYXhWYWx1ZSIsYl9hKX49bmlsKXRoZW4gYWQ9Y2IoIm1heFZhbHVlIixiX2EpZW5kO2lmKGNiKCJiYWNrZ3JvdW5kU3ltYm9sIixiX2Epfj1uaWwpdGhlbgpfZD1jYigiYmFja2dyb3VuZFN5bWJvbCIsYl9hKTpzdWIoMSwxKWVuZDtpZihjYigiYmFyVHlwZSIsYl9hKX49bmlsKXRoZW4KYmM9Y2IoImJhclR5cGUiLGJfYSk6bG93ZXIoKWVuZDtpZihjYigic3ltYm9sIixiX2Epfj1uaWwpdGhlbgpjYz1jYigic3ltYm9sIixiX2EpOnN1YigxLDEpZW5kO2lmKGNiKCJzeW1ib2xTaXplIixiX2Epfj1uaWwpdGhlbgphX2E6c2V0U3ltYm9sU2l6ZShjYigic3ltYm9sU2l6ZSIsYl9hKSllbmQ7aWYoY2IoInN5bWJvbENvbG9yIixiX2Epfj1uaWwpdGhlbgpkYz1jb2xvcnNbY2IoInN5bWJvbENvbG9yIixiX2EpXWVuZDtpZihjYigiaW5kZXgiLGJfYSl+PW5pbCl0aGVuCmFfYTpzZXRJbmRleChjYigiaW5kZXgiLGJfYSkpZW5kIGVuZCxzZXRJbmRleD1mdW5jdGlvbihhX2EsYl9hKQpiZD1iX2E7aWYoYmQ8MSl0aGVuIGJkPTEgZW5kO2xvY2FsIGNfYSxkX2E9YV9hOmdldFNpemUoKQpiZD1tYXRoLm1pbihiZCwoCmJjPT0idmVydGljYWwiYW5kIGRfYSBvciBjX2EpLSAoY2QtMSkpCmFfYTpzZXRWYWx1ZShhZC8gKGJjPT0idmVydGljYWwiYW5kIGRfYSBvciBjX2EpKmJkKWFfYTp1cGRhdGVEcmF3KClyZXR1cm4gYV9hIGVuZCxnZXRJbmRleD1mdW5jdGlvbihhX2EpcmV0dXJuCmJkIGVuZCxzZXRTeW1ib2xTaXplPWZ1bmN0aW9uKGFfYSxiX2EpY2Q9dG9udW1iZXIoYl9hKW9yIDEKaWYoYmM9PSJ2ZXJ0aWNhbCIpdGhlbgphX2E6c2V0VmFsdWUoYmQtMSAqIChhZC8gKGgtIChjZC0KMSkpKS0gKGFkLyAoaC0gKGNkLTEpKSkpZWxzZWlmKGJjPT0iaG9yaXpvbnRhbCIpdGhlbgphX2E6c2V0VmFsdWUoYmQtMSAqIChhZC8gKHctIChjZC0xKSkpLSAoYWQvCih3LSAoY2QtMSkpKSllbmQ7YV9hOnVwZGF0ZURyYXcoKXJldHVybiBhX2EgZW5kLHNldE1heFZhbHVlPWZ1bmN0aW9uKGFfYSxiX2EpCmFkPWJfYTtyZXR1cm4gYV9hIGVuZCxzZXRCYWNrZ3JvdW5kU3ltYm9sPWZ1bmN0aW9uKGFfYSxiX2EpX2Q9c3RyaW5nLnN1YihiX2EsMSwxKQphX2E6dXBkYXRlRHJhdygpcmV0dXJuIGFfYSBlbmQsc2V0U3ltYm9sQ29sb3I9ZnVuY3Rpb24oYV9hLGJfYSlkYz1iX2E7YV9hOnVwZGF0ZURyYXcoKQpyZXR1cm4gYV9hIGVuZCxzZXRCYXJUeXBlPWZ1bmN0aW9uKGFfYSxiX2EpYmM9Yl9hOmxvd2VyKClhX2E6dXBkYXRlRHJhdygpCnJldHVybiBhX2EgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihhX2EsYl9hLGNfYSxkX2EpaWYoX2MubW91c2VIYW5kbGVyKGFfYSxiX2EsY19hLGRfYSkpdGhlbgpkZChhX2EsYl9hLGNfYSxkX2EpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsZHJhZ0hhbmRsZXI9ZnVuY3Rpb24oYV9hLGJfYSxjX2EsZF9hKWlmCihfYy5kcmFnSGFuZGxlcihhX2EsYl9hLGNfYSxkX2EpKXRoZW4gZGQoYV9hLGJfYSxjX2EsZF9hKXJldHVybiB0cnVlIGVuZApyZXR1cm4gZmFsc2UgZW5kLHNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oYV9hLGJfYSxjX2EsZF9hKQppZgooX2Muc2Nyb2xsSGFuZGxlcihhX2EsYl9hLGNfYSxkX2EpKXRoZW4gbG9jYWwgX2FhLGFhYT1hX2E6Z2V0U2l6ZSgpYmQ9YmQrYl9hO2lmKGJkPDEpdGhlbiBiZD0xIGVuZApiZD1tYXRoLm1pbihiZCwoCmJjPT0idmVydGljYWwiYW5kIGFhYSBvciBfYWEpLSAoY2QtMSkpCmFfYTpzZXRWYWx1ZShhZC8gKGJjPT0idmVydGljYWwiYW5kIGFhYSBvciBfYWEpKmJkKWFfYTp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmF3PWZ1bmN0aW9uKGFfYSkKaWYKKF9jLmRyYXcoYV9hKSl0aGVuCmlmKGFfYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGJfYSxjX2E9YV9hOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgZF9hLF9hYT1hX2E6Z2V0U2l6ZSgpCmlmKGJjPT0iaG9yaXpvbnRhbCIpdGhlbgphX2EucGFyZW50OndyaXRlVGV4dChiX2EsY19hLF9kOnJlcChiZC0xKSxhX2EuYmdDb2xvcixhX2EuZmdDb2xvcikKYV9hLnBhcmVudDp3cml0ZVRleHQoYl9hK2JkLTEsY19hLGNjOnJlcChjZCksZGMsZGMpCmFfYS5wYXJlbnQ6d3JpdGVUZXh0KGJfYStiZCtjZC0xLGNfYSxfZDpyZXAoZF9hLSAoYmQrY2QtMSkpLGFfYS5iZ0NvbG9yLGFfYS5mZ0NvbG9yKWVuZAppZihiYz09InZlcnRpY2FsIil0aGVuCmZvciBuPTAsX2FhLTEgZG8KaWYoYmQ9PW4rMSl0aGVuCmZvciBjdXJJbmRleE9mZnNldD0wLG1hdGgubWluKGNkLTEsX2FhKWRvIGFfYS5wYXJlbnQ6d3JpdGVUZXh0KGJfYSxjX2ErbisKY3VySW5kZXhPZmZzZXQsY2MsZGMsZGMpZW5kIGVsc2UgaWYobisxIDxiZClvcihuKzEgPmJkLTEgK2NkKXRoZW4KYV9hLnBhcmVudDp3cml0ZVRleHQoYl9hLGNfYStuLF9kLGFfYS5iZ0NvbG9yLGFfYS5mZ0NvbG9yKWVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGFfYSkKYV9hLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGFfYSlhX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9kcmFnIixhX2EpCmFfYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3Njcm9sbCIsYV9hKQppZihfYy5pbml0KGFfYSkpdGhlbgphX2EuYmdDb2xvcj1hX2EucGFyZW50OmdldFRoZW1lKCJTbGlkZXJCRyIpYV9hLmZnQ29sb3I9YV9hLnBhcmVudDpnZXRUaGVtZSgiU2xpZGVyVGV4dCIpCmRjPWFfYS5wYXJlbnQ6Z2V0VGhlbWUoIlNsaWRlclN5bWJvbENvbG9yIillbmQgZW5kfXJldHVybiBzZXRtZXRhdGFibGUoX19hLF9jKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiR3JhcGhpYyJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidEhleCIpCmxvY2FsIGNiPWRhKCJ1dGlscyIpLmdldFZhbHVlRnJvbVhNTDtsb2NhbCBkYj1kYSgiYmltZyIpbG9jYWwgX2M9ZGEoImltYWdlcyIpCmxvY2FsIGFjLGJjLGNjLGRjPXN0cmluZy5zdWIsc3RyaW5nLmxlbixtYXRoLm1heCxtYXRoLm1pbgpyZXR1cm4KZnVuY3Rpb24oX2QpbG9jYWwgYWQ9YWIoX2QpbG9jYWwgYmQ9IkdyYXBoaWMibG9jYWwgY2Q9ZGIoKWxvY2FsIGRkPWNkLmdldEZyYW1lT2JqZWN0KDEpbG9jYWwgX19hCmxvY2FsIGFfYT0xO2FkOnNldFpJbmRleCg1KWxvY2FsIGJfYSxjX2E9MCwwCmxvY2FsIGRfYT17Z2V0VHlwZT1mdW5jdGlvbihfYWEpcmV0dXJuIGJkIGVuZCxzZXRPZmZzZXQ9ZnVuY3Rpb24oX2FhLGFhYSxiYWEsY2FhKQppZihjYWEpdGhlbgpiX2E9Yl9hK2FhYSBvciAwO2NfYT1jX2ErYmFhIG9yIDAgZWxzZSBiX2E9YWFhIG9yIGJfYTtjX2E9YmFhIG9yIGNfYSBlbmQ7X2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLGdldE9mZnNldD1mdW5jdGlvbihfYWEpcmV0dXJuCmJfYSxjX2EgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfYWEsYWFhKWFkLnNldFZhbHVlc0J5WE1MRGF0YShfYWEsYWFhKXJldHVybiBfYWEgZW5kLHNlbGVjdEZyYW1lPWZ1bmN0aW9uKF9hYSxhYWEpaWYoCmNkLmdldEZyYW1lT2JqZWN0KGFhYSk9PW5pbCl0aGVuIGNkLmFkZEZyYW1lKGFhYSllbmQKZGQ9Y2QuZ2V0RnJhbWVPYmplY3QoYWFhKV9fYT1kZC5nZXRJbWFnZShhYWEpYV9hPWFhYTtfYWE6dXBkYXRlRHJhdygpZW5kLGFkZEZyYW1lPWZ1bmN0aW9uKF9hYSxhYWEpCmNkLmFkZEZyYW1lKGFhYSlyZXR1cm4gX2FhIGVuZCxnZXRGcmFtZU1ldGFkYXRhPWZ1bmN0aW9uKF9hYSxhYWEsYmFhKXJldHVybiBjZC5nZXRGcmFtZURhdGEoYWFhLGJhYSllbmQsc2V0RnJhbWVNZXRhZGF0YT1mdW5jdGlvbihfYWEsYWFhLGJhYSxjYWEpCmNkLnNldEZyYW1lRGF0YShhYWEsYmFhLGNhYSlyZXR1cm4gX2FhIGVuZCxnZXRNZXRhZGF0YT1mdW5jdGlvbihfYWEsYWFhKXJldHVybiBjZC5nZXRNZXRhZGF0YShhYWEpZW5kLHNldE1ldGFkYXRhPWZ1bmN0aW9uKF9hYSxhYWEsYmFhKXJldHVybgpjZC5zZXRNZXRhZGF0YShhYWEsYmFhKWVuZCxnZXRGcmFtZT1mdW5jdGlvbihfYWEsYWFhKXJldHVybiBjZC5nZXRGcmFtZShhYWEpZW5kLGdldEZyYW1lT2JqZWN0PWZ1bmN0aW9uKF9hYSxhYWEpcmV0dXJuCmNkLmdldEZyYW1lT2JqZWN0KGFhYSllbmQscmVtb3ZlRnJhbWU9ZnVuY3Rpb24oX2FhLGFhYSljZC5yZW1vdmVGcmFtZShhYWEpcmV0dXJuIF9hYSBlbmQsbW92ZUZyYW1lPWZ1bmN0aW9uKF9hYSxhYWEsYmFhKQpjZC5tb3ZlRnJhbWUoYWFhLGJhYSlyZXR1cm4gX2FhIGVuZCxnZXRGcmFtZXM9ZnVuY3Rpb24oX2FhKXJldHVybiBjZC5nZXRGcmFtZXMoKWVuZCxnZXRGcmFtZUNvdW50PWZ1bmN0aW9uKF9hYSlyZXR1cm4KI2NkLmdldEZyYW1lcygpZW5kLGdldFNlbGVjdGVkRnJhbWU9ZnVuY3Rpb24oX2FhKXJldHVybiBhX2EgZW5kLGJsaXQ9ZnVuY3Rpb24oX2FhLGFhYSxiYWEsY2FhLGRhYSxfYmEpCng9ZGFhIG9yIHg7eT1fYmEgb3IgeTtkZC5ibGl0KGFhYSxiYWEsY2FhLHgseSlfX2E9ZGQuZ2V0SW1hZ2UoKQpfYWE6dXBkYXRlRHJhdygpcmV0dXJuIF9hYSBlbmQsc2V0VGV4dD1mdW5jdGlvbihfYWEsYWFhLGJhYSxjYWEpCng9YmFhIG9yIHg7eT1jYWEgb3IgeTtkZC50ZXh0KGFhYSx4LHkpX19hPWRkLmdldEltYWdlKCkKX2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLHNldEJnPWZ1bmN0aW9uKF9hYSxhYWEsYmFhLGNhYSl4PWJhYSBvciB4O3k9CmNhYSBvciB5O2RkLmJnKGFhYSx4LHkpX19hPWRkLmdldEltYWdlKCkKX2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLHNldEZnPWZ1bmN0aW9uKF9hYSxhYWEsYmFhLGNhYSl4PWJhYSBvciB4O3k9Y2FhIG9yCnk7ZGQuZmcoYWFhLHgseSlfX2E9ZGQuZ2V0SW1hZ2UoKQpfYWE6dXBkYXRlRHJhdygpcmV0dXJuIF9hYSBlbmQsZ2V0SW1hZ2VTaXplPWZ1bmN0aW9uKF9hYSkKcmV0dXJuIGNkLmdldFNpemUoKWVuZCxzZXRJbWFnZVNpemU9ZnVuY3Rpb24oX2FhLGFhYSxiYWEpY2Quc2V0U2l6ZShhYWEsYmFhKV9fYT1kZC5nZXRJbWFnZSgpCl9hYTp1cGRhdGVEcmF3KClyZXR1cm4gX2FhIGVuZCxyZXNpemVJbWFnZT1mdW5jdGlvbihfYWEsYWFhLGJhYSkKbG9jYWwgY2FhPV9jLnJlc2l6ZUJJTUcoY2QuY3JlYXRlQmltZygpLGFhYSxiYWEpY2Q9ZGIoY2FhKWFfYT0xO2RkPWNkLmdldEZyYW1lT2JqZWN0KDEpX19hPWRkLmdldEltYWdlKCkKX2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLGxvYWRJbWFnZT1mdW5jdGlvbihfYWEsYWFhKQppZgooZnMuZXhpc3RzKGFhYSkpdGhlbiBsb2NhbCBiYWE9X2MubG9hZEJJTUcoYWFhKWNkPWRiKGJhYSlhX2E9MQpkZD1jZC5nZXRGcmFtZU9iamVjdCgxKV9fYT1kZC5nZXRJbWFnZSgpX2FhOnVwZGF0ZURyYXcoKWVuZDtyZXR1cm4gX2FhIGVuZCxjbGVhcj1mdW5jdGlvbihfYWEpCmNkPWRiKClfX2E9bmlsO19hYTp1cGRhdGVEcmF3KClyZXR1cm4gX2FhIGVuZCxnZXRJbWFnZT1mdW5jdGlvbihfYWEpcmV0dXJuCmNkLmNyZWF0ZUJpbWcoKWVuZCxkcmF3PWZ1bmN0aW9uKF9hYSkKaWYoYWQuZHJhdyhfYWEpKXRoZW4KaWYoX2FhLnBhcmVudH49bmlsKXRoZW4KbG9jYWwgYWFhLGJhYT1fYWE6Z2V0QW5jaG9yUG9zaXRpb24oKWxvY2FsIGNhYSxkYWE9X2FhOmdldFNpemUoKQppZihfX2F+PW5pbCl0aGVuCmZvciBfYmEsYWJhIGluIHBhaXJzKF9fYSlkbyBpZgooX2JhPD1kYWEtY19hKWFuZChfYmErY19hPj0xKXRoZW4KX2FhLnBhcmVudDpibGl0KGFhYStiX2EsYmFhK19iYS0xICtjX2EsYWJhWzFdLGFiYVsyXSxhYmFbM10pZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihfYWEpCmlmCihhZC5pbml0KF9hYSkpdGhlbiBfYWEuYmdDb2xvcj1fYWEucGFyZW50OmdldFRoZW1lKCJHcmFwaGljQkciKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShkX2EsYWQpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJJbWFnZSJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0IikKbG9jYWwgYmI9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MO2xvY2FsIGNiPWRhKCJpbWFnZXMiKWxvY2FsIGRiLF9jPXRhYmxlLnVucGFjayxzdHJpbmcuc3ViCnJldHVybgpmdW5jdGlvbihhYylsb2NhbCBiYz1hYihhYykKbG9jYWwgY2M9IkltYWdlImJjOnNldFpJbmRleCgyKWxvY2FsIGRjO2xvY2FsIF9kO2xvY2FsIGFkPTE7bG9jYWwgYmQ9ZmFsc2U7bG9jYWwgY2Q7bG9jYWwgZGQ9ZmFsc2U7YmMud2lkdGg9MjQKYmMuaGVpZ2h0PTgKbG9jYWwgZnVuY3Rpb24gX19hKGJfYSkKaWYoZGN+PW5pbCl0aGVuIGxvY2FsIGNfYT17fQpmb3IgZF9hLF9hYSBpbiBwYWlycyhjb2xvcnMpZG8gaWYodHlwZShfYWEpPT0ibnVtYmVyIil0aGVuCmNfYVtfYWFdPXt0ZXJtLm5hdGl2ZVBhbGV0dGVDb2xvcihfYWEpfWVuZCBlbmQ7aWYoZGMucGFsZXR0ZX49bmlsKXRoZW4KZm9yIGRfYSxfYWEgaW4gcGFpcnMoZGMucGFsZXR0ZSlkbyBjX2FbMiBeZF9hXT1fYWEgZW5kIGVuZDtpZihkY1tiX2Fdfj1uaWwpYW5kCihkY1tiX2FdLnBhbGV0dGV+PW5pbCl0aGVuCmZvciBkX2EsX2FhIGluIHBhaXJzKGRjW2JfYV0ucGFsZXR0ZSlkbyBjX2FbMiBeZF9hXT1fYWEgZW5kIGVuZDtyZXR1cm4gY19hIGVuZCBlbmQKbG9jYWwgYV9hPXtpbml0PWZ1bmN0aW9uKGJfYSlpZihiYy5pbml0KGJfYSkpdGhlbgpiX2EuYmdDb2xvcj1iX2EucGFyZW50OmdldFRoZW1lKCJJbWFnZUJHIillbmQgZW5kLGdldFR5cGU9ZnVuY3Rpb24oYl9hKXJldHVybgpjYyBlbmQsbG9hZEltYWdlPWZ1bmN0aW9uKGJfYSxjX2EsZF9hKWlmIG5vdChmcy5leGlzdHMoY19hKSl0aGVuCmVycm9yKCJObyB2YWxpZCBwYXRoOiAiLi5jX2EpZW5kO2RjPWNiLmxvYWRJbWFnZUFzQmltZyhjX2EsZF9hKQphZD0xO19kPWRjO2lmKGNkfj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihjZCllbmQKYl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHNldEltYWdlPWZ1bmN0aW9uKGJfYSxjX2EpCmRjPWNfYTtfZD1kYzthZD0xO2lmKGNkfj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihjZCllbmQKYl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHVzZVBhbGV0dGU9ZnVuY3Rpb24oYl9hLGNfYSlkZD0KY19hfj1uaWwgYW5kIGNfYSBvciB0cnVlO3JldHVybiBiX2EgZW5kLHBsYXk9ZnVuY3Rpb24oYl9hLGNfYSkKaWYoZGMuYW5pbWF0ZWQpdGhlbgpsb2NhbCBkX2E9CmRjW2FkXS5kdXJhdGlvbiBvciBkYy5zZWNvbmRzUGVyRnJhbWUgb3IgMC4yO2JfYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixiX2EpCmNkPW9zLnN0YXJ0VGltZXIoZF9hKWJkPWNfYSBvciBmYWxzZSBlbmQ7cmV0dXJuIGJfYSBlbmQsc2VsZWN0RnJhbWU9ZnVuY3Rpb24oYl9hLGNfYSlpZigKZGNbY19hXX49bmlsKXRoZW4gYWQ9Y19hO2lmKGNkfj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihjZCllbmQKYl9hOnVwZGF0ZURyYXcoKWVuZCBlbmQsZXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGJfYSxjX2EsZF9hLC4uLikKYmMuZXZlbnRIYW5kbGVyKGJfYSxjX2EsZF9hLC4uLikKaWYoY19hPT0idGltZXIiKXRoZW4KaWYoZF9hPT1jZCl0aGVuCmlmKGRjW2FkKzFdfj1uaWwpdGhlbiBhZD1hZCsxO2xvY2FsIF9hYT0KZGNbYWRdLmR1cmF0aW9uIG9yIGRjLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2Q9b3Muc3RhcnRUaW1lcihfYWEpZWxzZQppZihiZCl0aGVuIGFkPTEKbG9jYWwgX2FhPWRjW2FkXS5kdXJhdGlvbiBvciBkYy5zZWNvbmRzUGVyRnJhbWUgb3IgMC4yO2NkPW9zLnN0YXJ0VGltZXIoX2FhKWVuZCBlbmQ7Yl9hOnVwZGF0ZURyYXcoKWVuZCBlbmQgZW5kLGdldE1ldGFkYXRhPWZ1bmN0aW9uKGJfYSxjX2EpcmV0dXJuCmRjW2NfYV1lbmQsZ2V0SW1hZ2VTaXplPWZ1bmN0aW9uKGJfYSlyZXR1cm4gZGMud2lkdGgsZGMuaGVpZ2h0IGVuZCxyZXNpemVJbWFnZT1mdW5jdGlvbihiX2EsY19hLGRfYSkKX2Q9Y2IucmVzaXplQklNRyhkYyxjX2EsZF9hKWJfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYl9hLGNfYSkKYmMuc2V0VmFsdWVzQnlYTUxEYXRhKGJfYSxjX2EpCmlmKGJiKCJwYXRoIixjX2Epfj1uaWwpdGhlbiBiX2E6bG9hZEltYWdlKGJiKCJwYXRoIixjX2EpKWVuZDtyZXR1cm4gYl9hIGVuZCxkcmF3PWZ1bmN0aW9uKGJfYSkKaWYKKGJjLmRyYXcoYl9hKSl0aGVuCmlmKF9kfj1uaWwpdGhlbiBpZihkZCl0aGVuCmJfYTpnZXRCYXNlRnJhbWUoKTpzZXRUaGVtZUNvbG9yKF9fYShhZCkpZW5kO2xvY2FsIGNfYSxkX2E9Yl9hOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgX2FhLGFhYT1iX2E6Z2V0U2l6ZSgpCmZvciBiYWEsY2FhIGluIGlwYWlycyhfZFthZF0pZG8gbG9jYWwgZGFhLF9iYSxhYmE9ZGIoY2FhKWRhYT1fYyhkYWEsMSxfYWEpCl9iYT1fYyhfYmEsMSxfYWEpYWJhPV9jKGFiYSwxLF9hYSkKYl9hLnBhcmVudDpibGl0KGNfYSxkX2ErYmFhLTEsZGFhLF9iYSxhYmEpaWYoYmFhPT1hYWEpdGhlbiBicmVhayBlbmQgZW5kIGVuZCBlbmQgZW5kfXJldHVybiBzZXRtZXRhdGFibGUoYV9hLGJjKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiTGlzdCJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidXRpbHMiKQpsb2NhbCBjYj1iYi5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGRiKWxvY2FsIF9jPWFiKGRiKWxvY2FsIGFjPSJMaXN0Il9jLndpZHRoPTE2O19jLmhlaWdodD02O19jOnNldFpJbmRleCg1KWxvY2FsIGJjPXt9CmxvY2FsIGNjO2xvY2FsIGRjO2xvY2FsIF9kPXRydWU7bG9jYWwgYWQ9ImxlZnQibG9jYWwgYmQ9MDtsb2NhbCBjZD10cnVlCmxvY2FsIGRkPXtnZXRUeXBlPWZ1bmN0aW9uKF9fYSlyZXR1cm4gYWMgZW5kLGFkZEl0ZW09ZnVuY3Rpb24oX19hLGFfYSxiX2EsY19hLC4uLikKdGFibGUuaW5zZXJ0KGJjLHt0ZXh0PWFfYSxiZ0NvbD1iX2Egb3IgX19hLmJnQ29sb3IsZmdDb2w9CmNfYSBvciBfX2EuZmdDb2xvcixhcmdzPXsuLi59fSlpZigjYmM8PTEpdGhlbiBfX2E6c2V0VmFsdWUoYmNbMV0sZmFsc2UpZW5kCl9fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRPZmZzZXQ9ZnVuY3Rpb24oX19hLGFfYSkKYmQ9YV9hO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oX19hKXJldHVybiBiZCBlbmQscmVtb3ZlSXRlbT1mdW5jdGlvbihfX2EsYV9hKQp0YWJsZS5yZW1vdmUoYmMsYV9hKV9fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxnZXRJdGVtPWZ1bmN0aW9uKF9fYSxhX2EpCnJldHVybiBiY1thX2FdZW5kLGdldEFsbD1mdW5jdGlvbihfX2EpcmV0dXJuIGJjIGVuZCxnZXRJdGVtSW5kZXg9ZnVuY3Rpb24oX19hKWxvY2FsIGFfYT1fX2E6Z2V0VmFsdWUoKWZvciBiX2EsY19hIGluIHBhaXJzKGJjKWRvIGlmCihjX2E9PWFfYSl0aGVuIHJldHVybiBiX2EgZW5kIGVuZCBlbmQsY2xlYXI9ZnVuY3Rpb24oX19hKQpiYz17fV9fYTpzZXRWYWx1ZSh7fSxmYWxzZSlfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsZ2V0SXRlbUNvdW50PWZ1bmN0aW9uKF9fYSlyZXR1cm4KI2JjIGVuZCxlZGl0SXRlbT1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EsZF9hLC4uLil0YWJsZS5yZW1vdmUoYmMsYV9hKQp0YWJsZS5pbnNlcnQoYmMsYV9hLHt0ZXh0PWJfYSxiZ0NvbD1jX2Egb3IgX19hLmJnQ29sb3IsZmdDb2w9CmRfYSBvciBfX2EuZmdDb2xvcixhcmdzPXsuLi59fSlfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsc2VsZWN0SXRlbT1mdW5jdGlvbihfX2EsYV9hKV9fYTpzZXRWYWx1ZSgKYmNbYV9hXW9ye30sZmFsc2UpX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLHNldFNlbGVjdGVkSXRlbT1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EpY2M9CmFfYSBvciBfX2EuYmdDb2xvcjtkYz1iX2Egb3IgX19hLmZnQ29sb3I7X2Q9Y19hfj1uaWwgYW5kIGNfYSBvcgp0cnVlO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRTY3JvbGxhYmxlPWZ1bmN0aW9uKF9fYSxhX2EpCmNkPWFfYTtpZihhX2E9PW5pbCl0aGVuIGNkPXRydWUgZW5kO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oX19hLGFfYSkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKF9fYSxhX2EpaWYoY2IoInNlbGVjdGlvbkJHIixhX2Epfj1uaWwpdGhlbgpjYz1jb2xvcnNbY2IoInNlbGVjdGlvbkJHIixhX2EpXWVuZDtpZihjYigic2VsZWN0aW9uRkciLGFfYSl+PW5pbCl0aGVuCmRjPWNvbG9yc1tjYigic2VsZWN0aW9uRkciLGFfYSldZW5kO2lmKGNiKCJzY3JvbGxhYmxlIixhX2Epfj1uaWwpdGhlbgppZgooY2IoInNjcm9sbGFibGUiLGFfYSkpdGhlbiBfX2E6c2V0U2Nyb2xsYWJsZSh0cnVlKWVsc2UgX19hOnNldFNjcm9sbGFibGUoZmFsc2UpZW5kIGVuZDtpZigKY2IoIm9mZnNldCIsYV9hKX49bmlsKXRoZW4gYmQ9Y2IoIm9mZnNldCIsYV9hKWVuZAppZihhX2FbIml0ZW0iXX49Cm5pbCl0aGVuIGxvY2FsIGJfYT1hX2FbIml0ZW0iXQppZihiX2EucHJvcGVydGllc349bmlsKXRoZW4gYl9hPXtiX2F9ZW5kO2ZvciBjX2EsZF9hIGluIHBhaXJzKGJfYSlkbwpfX2E6YWRkSXRlbShjYigidGV4dCIsZF9hKSxjb2xvcnNbY2IoImJnIixkX2EpXSxjb2xvcnNbY2IoImZnIixkX2EpXSllbmQgZW5kO3JldHVybiBfX2EgZW5kLHNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oX19hLGFfYSxiX2EsY19hKQppZgooX2Muc2Nyb2xsSGFuZGxlcihfX2EsYV9hLGJfYSxjX2EpKXRoZW4KaWYoY2QpdGhlbiBsb2NhbCBkX2EsX2FhPV9fYTpnZXRTaXplKCliZD1iZCthX2E7aWYoYmQ8MCl0aGVuIGJkPTAgZW5kCmlmKGFfYT49MSl0aGVuIGlmKCNiYz5fYWEpdGhlbiBpZihiZD4KI2JjLV9hYSl0aGVuIGJkPSNiYy1fYWEgZW5kO2lmKGJkPj0jYmMpdGhlbiBiZD0jYmMtMSBlbmQgZWxzZSBiZD0KYmQtMSBlbmQgZW5kO19fYTp1cGRhdGVEcmF3KCllbmQ7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hLGNfYSkKaWYKKF9jLm1vdXNlSGFuZGxlcihfX2EsYV9hLGJfYSxjX2EpKXRoZW4KbG9jYWwgZF9hLF9hYT1fX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihfX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBhYWEsYmFhPV9fYTpnZXRTaXplKCkKaWYoI2JjPjApdGhlbiBmb3Igbj0xLGJhYSBkbwppZihiY1tuK2JkXX49bmlsKXRoZW4gaWYoZF9hPD1iX2EpYW5kCihkX2ErYWFhPmJfYSlhbmQoX2FhK24tMSA9PWNfYSl0aGVuCl9fYTpzZXRWYWx1ZShiY1tuK2JkXSlfX2E6dXBkYXRlRHJhdygpZW5kIGVuZCBlbmQgZW5kO3JldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGRyYWdIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hLGNfYSlyZXR1cm4KX19hOm1vdXNlSGFuZGxlcihhX2EsYl9hLGNfYSllbmQsdG91Y2hIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hKXJldHVybgpfX2E6bW91c2VIYW5kbGVyKDEsYV9hLGJfYSllbmQsZHJhdz1mdW5jdGlvbihfX2EpCmlmKF9jLmRyYXcoX19hKSl0aGVuCmlmCihfX2EucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBhX2EsYl9hPV9fYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgY19hLGRfYT1fX2E6Z2V0U2l6ZSgpaWYoCl9fYS5iZ0NvbG9yfj1mYWxzZSl0aGVuCl9fYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYV9hLGJfYSxjX2EsZF9hLF9fYS5iZ0NvbG9yKWVuZApmb3Igbj0xLGRfYSBkbwppZihiY1tuK2JkXX49bmlsKXRoZW4KaWYoYmNbbitiZF09PQpfX2E6Z2V0VmFsdWUoKSl0aGVuCmlmKF9kKXRoZW4KX19hLnBhcmVudDp3cml0ZVRleHQoYV9hLGJfYStuLTEsYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1tuK2JkXS50ZXh0LGNfYSxhZCksY2MsZGMpZWxzZQpfX2EucGFyZW50OndyaXRlVGV4dChhX2EsYl9hK24tMSxiYi5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKGJjW24rYmRdLnRleHQsY19hLGFkKSxiY1sKbitiZF0uYmdDb2wsYmNbbitiZF0uZmdDb2wpZW5kIGVsc2UKX19hLnBhcmVudDp3cml0ZVRleHQoYV9hLGJfYStuLTEsYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1tuK2JkXS50ZXh0LGNfYSxhZCksYmNbCm4rYmRdLmJnQ29sLGJjW24rYmRdLmZnQ29sKWVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kLGluaXQ9ZnVuY3Rpb24oX19hKQpfX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsX19hKV9fYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2RyYWciLF9fYSkKX19hLnBhcmVudDphZGRFdmVudCgibW91c2Vfc2Nyb2xsIixfX2EpCmlmKF9jLmluaXQoX19hKSl0aGVuIF9fYS5iZ0NvbG9yPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIkxpc3RCRyIpCl9fYS5mZ0NvbG9yPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIkxpc3RUZXh0IiljYz1fX2EucGFyZW50OmdldFRoZW1lKCJTZWxlY3Rpb25CRyIpCmRjPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIlNlbGVjdGlvblRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShkZCxfYyllbmQgZW5kCmFhWyJvYmplY3RzIl1bIkFuaW1hdGlvbiJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKbG9jYWwgYmI9ZGEoImJhc2FsdEV2ZW50IikKbG9jYWwgY2IsZGIsX2MsYWMsYmMsY2M9bWF0aC5mbG9vcixtYXRoLnNpbixtYXRoLmNvcyxtYXRoLnBpLG1hdGguc3FydCxtYXRoLnBvdwpsb2NhbCBkYz1mdW5jdGlvbihjYWIsZGFiLF9iYilyZXR1cm4gY2FiKyAoZGFiLWNhYikqX2JiIGVuZDtsb2NhbCBfZD1mdW5jdGlvbihjYWIpcmV0dXJuIGNhYiBlbmQKbG9jYWwgYWQ9ZnVuY3Rpb24oY2FiKXJldHVybiAxIC1jYWIgZW5kO2xvY2FsIGJkPWZ1bmN0aW9uKGNhYilyZXR1cm4gY2FiKmNhYipjYWIgZW5kO2xvY2FsIGNkPWZ1bmN0aW9uKGNhYilyZXR1cm4KYWQoYmQoYWQoY2FiKSkpZW5kO2xvY2FsIGRkPWZ1bmN0aW9uKGNhYilyZXR1cm4KZGMoYmQoY2FiKSxjZChjYWIpLGNhYillbmQ7bG9jYWwgX19hPWZ1bmN0aW9uKGNhYilyZXR1cm4KZGIoKGNhYiphYykvMillbmQ7bG9jYWwgYV9hPWZ1bmN0aW9uKGNhYilyZXR1cm4KYWQoX2MoKGNhYiphYykvMikpZW5kO2xvY2FsIGJfYT1mdW5jdGlvbihjYWIpcmV0dXJuCi0gKF9jKGFjKngpLTEpLzIgZW5kCmxvY2FsIGNfYT1mdW5jdGlvbihjYWIpCmxvY2FsIGRhYj0xLjcwMTU4O2xvY2FsIF9iYj1kYWIrMTtyZXR1cm4gX2JiKmNhYl4zIC1kYWIqY2FiXjIgZW5kO2xvY2FsIGRfYT1mdW5jdGlvbihjYWIpcmV0dXJuIGNhYl4zIGVuZApsb2NhbCBfYWE9ZnVuY3Rpb24oY2FiKWxvY2FsIGRhYj0oMiAqYWMpLzM7cmV0dXJuCgpjYWI9PTAgYW5kIDAgb3IoY2FiPT0xIGFuZCAxIG9yKC0yIF4gKDEwICpjYWItMTApKgpkYigoY2FiKjEwIC0xMC43NSkqZGFiKSkpZW5kCmxvY2FsIGZ1bmN0aW9uIGFhYShjYWIpcmV0dXJuIGNhYj09MCBhbmQgMCBvciAyIF4gKDEwICpjYWItMTApZW5kCmxvY2FsIGZ1bmN0aW9uIGJhYShjYWIpcmV0dXJuIGNhYj09MCBhbmQgMCBvciAyIF4gKDEwICpjYWItMTApZW5kCmxvY2FsIGZ1bmN0aW9uIGNhYShjYWIpbG9jYWwgZGFiPTEuNzAxNTg7bG9jYWwgX2JiPWRhYioxLjUyNTtyZXR1cm4KY2FiPDAuNSBhbmQoICgyICpjYWIpXjIgKgooIChfYmIrMSkqMiAqY2FiLV9iYikpLzIgb3IKKAooMiAqY2FiLTIpXjIgKiAoIChfYmIrMSkqIChjYWIqMiAtMikrX2JiKSsyKS8yIGVuZDtsb2NhbCBmdW5jdGlvbiBkYWEoY2FiKXJldHVybgpjYWI8MC41IGFuZCA0ICpjYWJeMyBvciAxIC0gKC0yICpjYWIrMileMyAvMiBlbmQKbG9jYWwgZnVuY3Rpb24gX2JhKGNhYikKbG9jYWwgZGFiPSgyICphYykvNC41CnJldHVybgpjYWI9PTAgYW5kIDAgb3IoY2FiPT0xIGFuZCAxIG9yCigKY2FiPDAuNSBhbmQtICgyIF4gKDIwICpjYWItMTApKgpkYigoMjAgKmNhYi0xMS4xMjUpKmRhYikpLzIgb3IKKDIgXiAoLTIwICpjYWIrMTApKmRiKCgyMCAqY2FiLTExLjEyNSkqZGFiKSkvMiArMSkpZW5kCmxvY2FsIGZ1bmN0aW9uIGFiYShjYWIpcmV0dXJuCmNhYj09MCBhbmQgMCBvcihjYWI9PTEgYW5kIDEgb3IKKApjYWI8MC41IGFuZCAyIF4gKDIwICpjYWItMTApLzIgb3IoMiAtMiBeICgtMjAgKmNhYisxMCkpLzIpKWVuZDtsb2NhbCBmdW5jdGlvbiBiYmEoY2FiKXJldHVybgpjYWI8MC41IGFuZCAyICpjYWJeMiBvciAxIC0gKC0yICpjYWIrMileMiAvMiBlbmQ7bG9jYWwgZnVuY3Rpb24gY2JhKGNhYilyZXR1cm4KY2FiPDAuNSBhbmQgOCAqCmNhYl40IG9yIDEgLSAoLTIgKmNhYisyKV40IC8yIGVuZDtsb2NhbCBmdW5jdGlvbiBkYmEoY2FiKXJldHVybgpjYWI8MC41IGFuZCAxNiAqCmNhYl41IG9yIDEgLSAoLTIgKmNhYisyKV41IC8yIGVuZDtsb2NhbCBmdW5jdGlvbiBfY2EoY2FiKQpyZXR1cm4gY2FiXjIgZW5kO2xvY2FsIGZ1bmN0aW9uIGFjYShjYWIpcmV0dXJuIGNhYl40IGVuZApsb2NhbCBmdW5jdGlvbiBiY2EoY2FiKXJldHVybiBjYWJeNSBlbmQ7bG9jYWwgZnVuY3Rpb24gY2NhKGNhYilsb2NhbCBkYWI9MS43MDE1ODtsb2NhbCBfYmI9ZGFiKzE7cmV0dXJuCjEgK19iYiogKGNhYi0xKV4zICtkYWIqIChjYWItMSleMiBlbmQ7bG9jYWwgZnVuY3Rpb24gZGNhKGNhYilyZXR1cm4gMSAtCigxIC1jYWIpXjMgZW5kCmxvY2FsIGZ1bmN0aW9uIF9kYShjYWIpbG9jYWwgZGFiPSgyICphYykvMztyZXR1cm4KCmNhYj09MCBhbmQgMCBvcihjYWI9PTEgYW5kIDEgb3IoCjIgXiAoLTEwICpjYWIpKmRiKChjYWIqMTAgLTAuNzUpKmRhYikrMSkpZW5kCmxvY2FsIGZ1bmN0aW9uIGFkYShjYWIpcmV0dXJuIGNhYj09MSBhbmQgMSBvciAxIC0yIF4gKC0xMCAqY2FiKWVuZDtsb2NhbCBmdW5jdGlvbiBiZGEoY2FiKXJldHVybiAxIC0gKDEgLWNhYikqICgxIC1jYWIpZW5kO2xvY2FsIGZ1bmN0aW9uIGNkYShjYWIpcmV0dXJuIDEgLSAoCjEgLWNhYileNCBlbmQ7bG9jYWwgZnVuY3Rpb24gZGRhKGNhYikKcmV0dXJuIDEgLSAoMSAtY2FiKV41IGVuZApsb2NhbCBmdW5jdGlvbiBfX2IoY2FiKXJldHVybiAxIC1iYygxIC1jYyhjYWIsMikpZW5kO2xvY2FsIGZ1bmN0aW9uIGFfYihjYWIpcmV0dXJuIGJjKDEgLWNjKGNhYi0xLDIpKWVuZApsb2NhbCBmdW5jdGlvbiBiX2IoY2FiKXJldHVybgoKY2FiPDAuNSBhbmQoMSAtYmMoCjEgLWNjKDIgKmNhYiwyKSkpLzIgb3IoYmMoMSAtY2MoLTIgKmNhYisyLDIpKSsxKS8yIGVuZApsb2NhbCBmdW5jdGlvbiBjX2IoY2FiKWxvY2FsIGRhYj03LjU2MjU7bG9jYWwgX2JiPTIuNzUKaWYoY2FiPDEgL19iYil0aGVuIHJldHVybiBkYWIqY2FiKmNhYiBlbHNlaWYoY2FiPDIgL19iYil0aGVuIGxvY2FsIGFiYj1jYWItCjEuNSAvX2JiO3JldHVybiBkYWIqYWJiKmFiYiswLjc1IGVsc2VpZihjYWI8Mi41IC9fYmIpdGhlbiBsb2NhbCBhYmI9Y2FiLQoyLjI1IC9fYmI7cmV0dXJuIGRhYiphYmIqYWJiKzAuOTM3NSBlbHNlCmxvY2FsIGFiYj1jYWItMi42MjUgL19iYjtyZXR1cm4gZGFiKmFiYiphYmIrMC45ODQzNzUgZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBkX2IoY2FiKXJldHVybiAxIC1jX2IoMSAtY2FiKWVuZDtsb2NhbCBmdW5jdGlvbiBfYWIoY2FiKXJldHVybgp4PDAuNSBhbmQoMSAtCmNfYigxIC0yICpjYWIpKS8yIG9yKDEgK2NfYigyICpjYWItMSkpLzIgZW5kCmxvY2FsIGFhYj17bGluZWFyPV9kLGxlcnA9ZGMsZmxpcD1hZCxlYXNlSW49YmQsZWFzZUluU2luZT1hX2EsZWFzZUluQmFjaz1jX2EsZWFzZUluQ3ViaWM9ZF9hLGVhc2VJbkVsYXN0aWM9X2FhLGVhc2VJbkV4cG89YmFhLGVhc2VJblF1YWQ9X2NhLGVhc2VJblF1YXJ0PWFjYSxlYXNlSW5RdWludD1iY2EsZWFzZUluQ2lyYz1fX2IsZWFzZUluQm91bmNlPWRfYixlYXNlT3V0PWNkLGVhc2VPdXRTaW5lPV9fYSxlYXNlT3V0QmFjaz1jY2EsZWFzZU91dEN1YmljPWRjYSxlYXNlT3V0RWxhc3RpYz1fZGEsZWFzZU91dEV4cG89YWRhLGVhc2VPdXRRdWFkPWJkYSxlYXNlT3V0UXVhcnQ9Y2RhLGVhc2VPdXRRdWludD1kZGEsZWFzZU91dENpcmM9YV9iLGVhc2VPdXRCb3VuY2U9Y19iLGVhc2VJbk91dD1kZCxlYXNlSW5PdXRTaW5lPWJfYSxlYXNlSW5PdXRCYWNrPWNhYSxlYXNlSW5PdXRDdWJpYz1kYWEsZWFzZUluT3V0RWxhc3RpYz1fYmEsZWFzZUluT3V0RXhwbz1hYmEsZWFzZUluT3V0UXVhZD1iYmEsZWFzZUluT3V0UXVhcnQ9Y2JhLGVhc2VJbk91dFF1aW50PWRiYSxlYXNlSW5PdXRDaXJjPWJfYixlYXNlSW5PdXRCb3VuY2U9X2FifWxvY2FsIGJhYj17fQpyZXR1cm4KZnVuY3Rpb24oY2FiKWxvY2FsIGRhYj17fWxvY2FsIF9iYj0iQW5pbWF0aW9uImxvY2FsIGFiYjtsb2NhbCBiYmI9e31sb2NhbCBjYmI9MDtsb2NhbCBkYmI9ZmFsc2U7bG9jYWwgX2NiPTE7bG9jYWwgYWNiPWZhbHNlCmxvY2FsIGJjYj1iYigpbG9jYWwgY2NiPTA7bG9jYWwgZGNiO2xvY2FsIF9kYj1mYWxzZTtsb2NhbCBhZGI9ZmFsc2U7bG9jYWwgYmRiPSJlYXNlT3V0ImxvY2FsIGNkYjtsb2NhbCBmdW5jdGlvbiBkZGIoY19jKWZvciBkX2MsX2FjIGluIHBhaXJzKGNfYylkbwpfYWMoZGFiLGJiYltfY2JdLnQsX2NiKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX19jKGNfYylpZihfY2I9PTEpdGhlbgpjX2M6YW5pbWF0aW9uU3RhcnRIYW5kbGVyKCllbmQ7aWYoYmJiW19jYl1+PW5pbCl0aGVuIGRkYihiYmJbX2NiXS5mKQpjYmI9YmJiW19jYl0udCBlbmQ7X2NiPV9jYisxCmlmKGJiYltfY2JdPT1uaWwpdGhlbiBpZihhY2IpdGhlbiBfY2I9MTtjYmI9MCBlbHNlCmNfYzphbmltYXRpb25Eb25lSGFuZGxlcigpcmV0dXJuIGVuZCBlbmQ7aWYoYmJiW19jYl0udD4wKXRoZW4KYWJiPW9zLnN0YXJ0VGltZXIoYmJiW19jYl0udC1jYmIpZWxzZSBfX2MoY19jKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYV9jKGNfYyxkX2MpZm9yIG49MSwjYmJiIGRvCmlmKGJiYltuXS50PT1jX2MpdGhlbiB0YWJsZS5pbnNlcnQoYmJiW25dLmYsZF9jKXJldHVybiBlbmQgZW5kCmZvciBuPTEsI2JiYiBkbwppZihiYmJbbl0udD5jX2MpdGhlbiBpZgooYmJiW24tMV1+PW5pbCl0aGVuIGlmKGJiYltuLTFdLnQ8Y19jKXRoZW4KdGFibGUuaW5zZXJ0KGJiYixuLTEse3Q9Y19jLGY9e2RfY319KXJldHVybiBlbmQgZWxzZQp0YWJsZS5pbnNlcnQoYmJiLG4se3Q9Y19jLGY9e2RfY319KXJldHVybiBlbmQgZW5kIGVuZAppZigjYmJiPD0wKXRoZW4gdGFibGUuaW5zZXJ0KGJiYiwxLHt0PWNfYyxmPXtkX2N9fSlyZXR1cm4gZWxzZWlmKApiYmJbI2JiYl0udDxjX2MpdGhlbiB0YWJsZS5pbnNlcnQoYmJiLHt0PWNfYyxmPXtkX2N9fSllbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIGJfYyhjX2MsZF9jLF9hYyxhYWMsYmFjLGNhYyxkYWMsX2JjKWxvY2FsIGFiYz1jZGI7bG9jYWwgYmJjLGNiYztsb2NhbCBkYmM9IiJpZihhYmMucGFyZW50fj1uaWwpdGhlbgpkYmM9YWJjLnBhcmVudDpnZXROYW1lKCllbmQ7ZGJjPWRiYy4uYWJjOmdldE5hbWUoKQphX2MoYWFjKzAuMDUsZnVuY3Rpb24oKQppZgooZGFjfj1uaWwpdGhlbiBpZihiYWJbZGFjXT09bmlsKXRoZW4gYmFiW2RhY109e31lbmQ7aWYoYmFiW2RhY11bZGJjXX49bmlsKXRoZW4KaWYoCmJhYltkYWNdW2RiY11+PV9iYyl0aGVuIGJhYltkYWNdW2RiY106Y2FuY2VsKCllbmQgZW5kO2JhYltkYWNdW2RiY109X2JjIGVuZDtiYmMsY2JjPWJhYyhhYmMpZW5kKQpmb3Igbj0wLjA1LF9hYyswLjAxLDAuMDUgZG8KYV9jKGFhYytuLGZ1bmN0aW9uKCkKbG9jYWwgX2NjPW1hdGguZmxvb3IoYWFiLmxlcnAoYmJjLGNfYyxhYWJbYmRiXShuL19hYykpKzAuNSkKbG9jYWwgYWNjPW1hdGguZmxvb3IoYWFiLmxlcnAoY2JjLGRfYyxhYWJbYmRiXShuL19hYykpKzAuNSljYWMoYWJjLF9jYyxhY2MpCmlmKGRhY349bmlsKXRoZW4gaWYobj49X2FjLTAuMDEpdGhlbiBpZihiYWJbZGFjXVtkYmNdPT1fYmMpdGhlbiBiYWJbZGFjXVtkYmNdPQpuaWwgZW5kIGVuZCBlbmQgZW5kKWVuZCBlbmQKZGFiPXtuYW1lPWNhYixnZXRUeXBlPWZ1bmN0aW9uKGNfYylyZXR1cm4gX2JiIGVuZCxnZXRCYXNlRnJhbWU9ZnVuY3Rpb24oY19jKWlmKGNfYy5wYXJlbnR+PW5pbCl0aGVuCnJldHVybiBjX2MucGFyZW50OmdldEJhc2VGcmFtZSgpZW5kO3JldHVybiBjX2MgZW5kLHNldE1vZGU9ZnVuY3Rpb24oY19jLGRfYykKYmRiPWRfYztyZXR1cm4gY19jIGVuZCxhZGRNb2RlPWZ1bmN0aW9uKGNfYyxkX2MsX2FjKWFhYltkX2NdPV9hYztyZXR1cm4gY19jIGVuZCxnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb249ZnVuY3Rpb24oY19jLGRfYyxfYWMpCmxvY2FsIGFhYz1mdW5jdGlvbihiYWMpCmlmKApiYWM6c3ViKDEsMSk9PSIjIil0aGVuCmxvY2FsIGNhYz1jX2M6Z2V0QmFzZUZyYW1lKCk6Z2V0RGVlcE9iamVjdChiYWM6c3ViKDIsYmFjOmxlbigpKSkKaWYoY2Fjfj1uaWwpYW5kKGNhYy5pbnRlcm5hbE9iamV0Q2FsbH49bmlsKXRoZW4gZF9jKGNfYyxmdW5jdGlvbigpCmNhYzppbnRlcm5hbE9iamV0Q2FsbCgpZW5kKWVuZCBlbHNlCmRfYyhjX2MsY19jOmdldEJhc2VGcmFtZSgpOmdldFZhcmlhYmxlKGJhYykpZW5kIGVuZDtpZih0eXBlKF9hYyk9PSJzdHJpbmciKXRoZW4gYWFjKF9hYyllbHNlaWYodHlwZShfYWMpPT0idGFibGUiKXRoZW4KZm9yIGJhYyxjYWMgaW4gcGFpcnMoX2FjKWRvIGFhYyhjYWMpZW5kIGVuZDtyZXR1cm4gY19jIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oY19jLGRfYylfZGI9CmFiKCJsb29wIixkX2MpPT10cnVlIGFuZCB0cnVlIG9yIGZhbHNlCmlmKAphYigib2JqZWN0IixkX2Mpfj1uaWwpdGhlbgpsb2NhbCBfYWM9Y19jOmdldEJhc2VGcmFtZSgpOmdldERlZXBPYmplY3QoYWIoIm9iamVjdCIsZF9jKSlpZihfYWM9PW5pbCl0aGVuCl9hYz1jX2M6Z2V0QmFzZUZyYW1lKCk6Z2V0VmFyaWFibGUoYWIoIm9iamVjdCIsZF9jKSllbmQKaWYoX2Fjfj1uaWwpdGhlbiBjX2M6c2V0T2JqZWN0KF9hYyllbmQgZW5kCmlmKGRfY1sibW92ZSJdfj1uaWwpdGhlbiBsb2NhbCBfYWM9YWIoIngiLGRfY1sibW92ZSJdKQpsb2NhbCBhYWM9YWIoInkiLGRfY1sibW92ZSJdKWxvY2FsIGJhYz1hYigiZHVyYXRpb24iLGRfY1sibW92ZSJdKQpsb2NhbCBjYWM9YWIoInRpbWUiLGRfY1sibW92ZSJdKWNfYzptb3ZlKF9hYyxhYWMsYmFjLGNhYyllbmQKaWYoZF9jWyJzaXplIl1+PW5pbCl0aGVuIGxvY2FsIF9hYz1hYigid2lkdGgiLGRfY1sic2l6ZSJdKQpsb2NhbCBhYWM9YWIoImhlaWdodCIsZF9jWyJzaXplIl0pbG9jYWwgYmFjPWFiKCJkdXJhdGlvbiIsZF9jWyJzaXplIl0pCmxvY2FsIGNhYz1hYigidGltZSIsZF9jWyJzaXplIl0pY19jOnNpemUoX2FjLGFhYyxiYWMsY2FjKWVuZAppZihkX2NbIm9mZnNldCJdfj1uaWwpdGhlbiBsb2NhbCBfYWM9YWIoIngiLGRfY1sib2Zmc2V0Il0pCmxvY2FsIGFhYz1hYigieSIsZF9jWyJvZmZzZXQiXSlsb2NhbCBiYWM9YWIoImR1cmF0aW9uIixkX2NbIm9mZnNldCJdKQpsb2NhbCBjYWM9YWIoInRpbWUiLGRfY1sib2Zmc2V0Il0pY19jOm9mZnNldChfYWMsYWFjLGJhYyxjYWMpZW5kCmlmKGRfY1sidGV4dENvbG9yIl1+PW5pbCl0aGVuCmxvY2FsIF9hYz1hYigiZHVyYXRpb24iLGRfY1sidGV4dENvbG9yIl0pbG9jYWwgYWFjPWFiKCJ0aW1lIixkX2NbInRleHRDb2xvciJdKWxvY2FsIGJhYz17fQpsb2NhbCBjYWM9ZF9jWyJ0ZXh0Q29sb3IiXVsiY29sb3IiXQppZihjYWN+PW5pbCl0aGVuIGlmKGNhYy5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBjYWM9e2NhY31lbmQ7Zm9yIGRhYyxfYmMgaW4gcGFpcnMoY2FjKWRvCnRhYmxlLmluc2VydChiYWMsY29sb3JzW19iYzp2YWx1ZSgpXSllbmQgZW5kO2lmKF9hY349bmlsKWFuZCgjYmFjPjApdGhlbgpjX2M6Y2hhbmdlVGV4dENvbG9yKF9hYyxhYWMgb3IgMCx0YWJsZS51bnBhY2soYmFjKSllbmQgZW5kCmlmKGRfY1siYmFja2dyb3VuZCJdfj1uaWwpdGhlbgpsb2NhbCBfYWM9YWIoImR1cmF0aW9uIixkX2NbImJhY2tncm91bmQiXSlsb2NhbCBhYWM9YWIoInRpbWUiLGRfY1siYmFja2dyb3VuZCJdKWxvY2FsIGJhYz17fQpsb2NhbCBjYWM9ZF9jWyJiYWNrZ3JvdW5kIl1bImNvbG9yIl0KaWYoY2Fjfj1uaWwpdGhlbiBpZihjYWMucHJvcGVydGllc349bmlsKXRoZW4gY2FjPXtjYWN9ZW5kO2ZvciBkYWMsX2JjIGluIHBhaXJzKGNhYylkbwp0YWJsZS5pbnNlcnQoYmFjLGNvbG9yc1tfYmM6dmFsdWUoKV0pZW5kIGVuZDtpZihfYWN+PW5pbClhbmQoI2JhYz4wKXRoZW4KY19jOmNoYW5nZUJhY2tncm91bmQoX2FjLGFhYyBvciAwLHRhYmxlLnVucGFjayhiYWMpKWVuZCBlbmQKaWYoZF9jWyJ0ZXh0Il1+PW5pbCl0aGVuIGxvY2FsIF9hYz1hYigiZHVyYXRpb24iLGRfY1sidGV4dCJdKQpsb2NhbCBhYWM9YWIoInRpbWUiLGRfY1sidGV4dCJdKWxvY2FsIGJhYz17fWxvY2FsIGNhYz1kX2NbInRleHQiXVsidGV4dCJdCmlmKGNhY349bmlsKXRoZW4gaWYoY2FjLnByb3BlcnRpZXN+PW5pbCl0aGVuCmNhYz17Y2FjfWVuZDtmb3IgZGFjLF9iYyBpbiBwYWlycyhjYWMpZG8KdGFibGUuaW5zZXJ0KGJhYyxfYmM6dmFsdWUoKSllbmQgZW5kO2lmKF9hY349bmlsKWFuZCgjYmFjPjApdGhlbgpjX2M6Y2hhbmdlVGV4dChfYWMsYWFjIG9yIDAsdGFibGUudW5wYWNrKGJhYykpZW5kIGVuZDtpZihhYigib25Eb25lIixkX2Mpfj1uaWwpdGhlbgpjX2M6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGNfYy5vbkRvbmUsYWIoIm9uRG9uZSIsZF9jKSllbmQ7aWYoYWIoIm9uU3RhcnQiLGRfYyl+PW5pbCl0aGVuCmNfYzpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oY19jLm9uRG9uZSxhYigib25TdGFydCIsZF9jKSllbmQKaWYKKGFiKCJhdXRvRGVzdHJveSIsZF9jKX49bmlsKXRoZW4gaWYoYWIoImF1dG9EZXN0cm95IixkX2MpKXRoZW4gYWRiPXRydWUgZW5kIGVuZDtiZGI9YWIoIm1vZGUiLGRfYylvciBiZGIKaWYoYWIoInBsYXkiLGRfYyl+PW5pbCl0aGVuIGlmCihhYigicGxheSIsZF9jKSl0aGVuIGNfYzpwbGF5KF9kYillbmQgZW5kO3JldHVybiBjX2MgZW5kLGdldFpJbmRleD1mdW5jdGlvbihjX2MpcmV0dXJuCjEgZW5kLGdldE5hbWU9ZnVuY3Rpb24oY19jKXJldHVybiBjX2MubmFtZSBlbmQsc2V0T2JqZWN0PWZ1bmN0aW9uKGNfYyxkX2MpY2RiPWRfYztyZXR1cm4gY19jIGVuZCxtb3ZlPWZ1bmN0aW9uKGNfYyxkX2MsX2FjLGFhYyxiYWMsY2FjKWNkYj0KY2FjIG9yIGNkYgpiX2MoZF9jLF9hYyxhYWMsYmFjIG9yIDAsY2RiLmdldFBvc2l0aW9uLGNkYi5zZXRQb3NpdGlvbiwicG9zaXRpb24iLGNfYylyZXR1cm4gY19jIGVuZCxvZmZzZXQ9ZnVuY3Rpb24oY19jLGRfYyxfYWMsYWFjLGJhYyxjYWMpY2RiPQpjYWMgb3IgY2RiCmJfYyhkX2MsX2FjLGFhYyxiYWMgb3IgMCxjZGIuZ2V0T2Zmc2V0LGNkYi5zZXRPZmZzZXQsIm9mZnNldCIsY19jKXJldHVybiBjX2MgZW5kLHNpemU9ZnVuY3Rpb24oY19jLGRfYyxfYWMsYWFjLGJhYyxjYWMpY2RiPWNhYyBvcgpjZGIKYl9jKGRfYyxfYWMsYWFjLGJhYyBvciAwLGNkYi5nZXRTaXplLGNkYi5zZXRTaXplLCJzaXplIixjX2MpcmV0dXJuIGNfYyBlbmQsY2hhbmdlVGV4dD1mdW5jdGlvbihjX2MsZF9jLF9hYywuLi4pCmxvY2FsIGFhYz17Li4ufV9hYz1fYWMgb3IgMDtjZGI9b2JqIG9yIGNkYjtmb3Igbj0xLCNhYWMgZG8KYV9jKF9hYytuKiAoZF9jLyNhYWMpLGZ1bmN0aW9uKCkKY2RiLnNldFRleHQoY2RiLGFhY1tuXSllbmQpZW5kO3JldHVybiBjX2MgZW5kLGNoYW5nZUJhY2tncm91bmQ9ZnVuY3Rpb24oY19jLGRfYyxfYWMsLi4uKQpsb2NhbCBhYWM9ey4uLn1fYWM9X2FjIG9yIDA7Y2RiPW9iaiBvciBjZGI7Zm9yIG49MSwjYWFjIGRvCmFfYyhfYWMrbiogKGRfYy8jYWFjKSxmdW5jdGlvbigpCmNkYi5zZXRCYWNrZ3JvdW5kKGNkYixhYWNbbl0pZW5kKWVuZDtyZXR1cm4gY19jIGVuZCxjaGFuZ2VUZXh0Q29sb3I9ZnVuY3Rpb24oY19jLGRfYyxfYWMsLi4uKQpsb2NhbCBhYWM9ey4uLn1fYWM9X2FjIG9yIDA7Y2RiPW9iaiBvciBjZGI7Zm9yIG49MSwjYWFjIGRvCmFfYyhfYWMrbiogKGRfYy8jYWFjKSxmdW5jdGlvbigpCmNkYi5zZXRGb3JlZ3JvdW5kKGNkYixhYWNbbl0pZW5kKWVuZDtyZXR1cm4gY19jIGVuZCxhZGQ9ZnVuY3Rpb24oY19jLGRfYyxfYWMpCmRjYj1kX2MKYV9jKChfYWMgb3IgY2NiKSsKKGJiYlsjYmJiXX49bmlsIGFuZCBiYmJbI2JiYl0udCBvciAwKSxkX2MpcmV0dXJuIGNfYyBlbmQsd2FpdD1mdW5jdGlvbihjX2MsZF9jKWNjYj1kX2M7cmV0dXJuIGNfYyBlbmQscmVwPWZ1bmN0aW9uKGNfYyxkX2MpCmlmKApkY2J+PW5pbCl0aGVuIGZvciBuPTEsZF9jIG9yIDEgZG8KYV9jKCh3YWl0IG9yIGNjYikrCihiYmJbI2JiYl1+PW5pbCBhbmQgYmJiWyNiYmJdLnQgb3IgMCksZGNiKWVuZCBlbmQ7cmV0dXJuIGNfYyBlbmQsb25Eb25lPWZ1bmN0aW9uKGNfYyxkX2MpCmJjYjpyZWdpc3RlckV2ZW50KCJhbmltYXRpb25fZG9uZSIsZF9jKXJldHVybiBjX2MgZW5kLG9uU3RhcnQ9ZnVuY3Rpb24oY19jLGRfYykKYmNiOnJlZ2lzdGVyRXZlbnQoImFuaW1hdGlvbl9zdGFydCIsZF9jKXJldHVybiBjX2MgZW5kLHNldEF1dG9EZXN0cm95PWZ1bmN0aW9uKGNfYyxkX2MpCmFkYj1kX2N+PW5pbCBhbmQgZF9jIG9yIHRydWU7cmV0dXJuIGNfYyBlbmQsYW5pbWF0aW9uRG9uZUhhbmRsZXI9ZnVuY3Rpb24oY19jKQpiY2I6c2VuZEV2ZW50KCJhbmltYXRpb25fZG9uZSIsY19jKWNfYy5wYXJlbnQ6cmVtb3ZlRXZlbnQoIm90aGVyX2V2ZW50IixjX2MpaWYoYWRiKXRoZW4KY19jLnBhcmVudDpyZW1vdmVPYmplY3QoY19jKWNfYz1uaWwgZW5kIGVuZCxhbmltYXRpb25TdGFydEhhbmRsZXI9ZnVuY3Rpb24oY19jKQpiY2I6c2VuZEV2ZW50KCJhbmltYXRpb25fc3RhcnQiLGNfYyllbmQsY2xlYXI9ZnVuY3Rpb24oY19jKWJiYj17fWRjYj1uaWw7Y2NiPTA7X2NiPTE7Y2JiPTA7YWNiPWZhbHNlO3JldHVybiBjX2MgZW5kLHBsYXk9ZnVuY3Rpb24oY19jLGRfYykKY19jOmNhbmNlbCgpZGJiPXRydWU7YWNiPWRfYyBhbmQgdHJ1ZSBvciBmYWxzZTtfY2I9MTtjYmI9MAppZihiYmJbX2NiXX49bmlsKXRoZW4KaWYoCmJiYltfY2JdLnQ+MCl0aGVuIGFiYj1vcy5zdGFydFRpbWVyKGJiYltfY2JdLnQpZWxzZSBfX2MoY19jKWVuZCBlbHNlIGNfYzphbmltYXRpb25Eb25lSGFuZGxlcigpZW5kO2NfYy5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixjX2MpcmV0dXJuIGNfYyBlbmQsY2FuY2VsPWZ1bmN0aW9uKGNfYylpZigKYWJifj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihhYmIpYWNiPWZhbHNlIGVuZApkYmI9ZmFsc2U7Y19jLnBhcmVudDpyZW1vdmVFdmVudCgib3RoZXJfZXZlbnQiLGNfYylyZXR1cm4gY19jIGVuZCxpbnRlcm5hbE9iamV0Q2FsbD1mdW5jdGlvbihjX2MpCmNfYzpwbGF5KF9kYillbmQsZXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGNfYyxkX2MsX2FjKWlmKGRiYil0aGVuCmlmKGRfYz09InRpbWVyIilhbmQoX2FjPT1hYmIpdGhlbiBpZihiYmJbX2NiXX49bmlsKXRoZW4KX19jKGNfYyllbHNlIGNfYzphbmltYXRpb25Eb25lSGFuZGxlcigpZW5kIGVuZCBlbmQgZW5kfWRhYi5fX2luZGV4PWRhYjtyZXR1cm4gZGFiIGVuZCBlbmQKYWFbIm9iamVjdHMiXVsiUmFkaW8iXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpbG9jYWwgYmI9ZGEoInV0aWxzIikKbG9jYWwgY2I9YmIuZ2V0VmFsdWVGcm9tWE1MCnJldHVybgpmdW5jdGlvbihkYilsb2NhbCBfYz1hYihkYilsb2NhbCBhYz0iUmFkaW8iX2Mud2lkdGg9ODtfYzpzZXRaSW5kZXgoNSlsb2NhbCBiYz17fWxvY2FsIGNjO2xvY2FsIGRjCmxvY2FsIF9kO2xvY2FsIGFkO2xvY2FsIGJkO2xvY2FsIGNkO2xvY2FsIGRkPXRydWU7bG9jYWwgX19hPSJcNyJsb2NhbCBhX2E9ImxlZnQiCmxvY2FsIGJfYT17Z2V0VHlwZT1mdW5jdGlvbihjX2EpcmV0dXJuIGFjIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oY19hLGRfYSkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGNfYSxkX2EpaWYoY2IoInNlbGVjdGlvbkJHIixkX2Epfj1uaWwpdGhlbgpjYz1jb2xvcnNbY2IoInNlbGVjdGlvbkJHIixkX2EpXWVuZDtpZihjYigic2VsZWN0aW9uRkciLGRfYSl+PW5pbCl0aGVuCmRjPWNvbG9yc1tjYigic2VsZWN0aW9uRkciLGRfYSldZW5kO2lmKGNiKCJib3hCRyIsZF9hKX49bmlsKXRoZW4KX2Q9Y29sb3JzW2NiKCJib3hCRyIsZF9hKV1lbmQ7aWYoY2IoImluYWN0aXZlQm94QkciLGRfYSl+PW5pbCl0aGVuCmJkPWNvbG9yc1tjYigiaW5hY3RpdmVCb3hCRyIsZF9hKV1lbmQ7aWYoY2IoImluYWN0aXZlQm94RkciLGRfYSl+PW5pbCl0aGVuCmNkPWNvbG9yc1tjYigiaW5hY3RpdmVCb3hGRyIsZF9hKV1lbmQ7aWYoY2IoImJveEZHIixkX2Epfj1uaWwpdGhlbgphZD1jb2xvcnNbY2IoImJveEZHIixkX2EpXWVuZDtpZihjYigic3ltYm9sIixkX2Epfj1uaWwpdGhlbgpfX2E9Y2IoInN5bWJvbCIsZF9hKWVuZAppZihkX2FbIml0ZW0iXX49bmlsKXRoZW4gbG9jYWwgX2FhPWRfYVsiaXRlbSJdaWYoCl9hYS5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBfYWE9e19hYX1lbmQ7Zm9yIGFhYSxiYWEgaW4gcGFpcnMoX2FhKWRvCmNfYTphZGRJdGVtKGNiKCJ0ZXh0IixiYWEpLGNiKCJ4IixiYWEpLGNiKCJ5IixiYWEpLGNvbG9yc1tjYigiYmciLGJhYSldLGNvbG9yc1tjYigiZmciLGJhYSldKWVuZCBlbmQ7cmV0dXJuIGNfYSBlbmQsYWRkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLGNhYSwuLi4pCnRhYmxlLmluc2VydChiYyx7eD0KX2FhIG9yIDEseT1hYWEgb3IgMSx0ZXh0PWRfYSxiZ0NvbD1iYWEgb3IgY19hLmJnQ29sb3IsZmdDb2w9Y2FhIG9yIGNfYS5mZ0NvbG9yLGFyZ3M9ey4uLn19KWlmKCNiYz09MSl0aGVuIGNfYTpzZXRWYWx1ZShiY1sxXSllbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldEFsbD1mdW5jdGlvbihjX2EpcmV0dXJuCmJjIGVuZCxyZW1vdmVJdGVtPWZ1bmN0aW9uKGNfYSxkX2EpdGFibGUucmVtb3ZlKGJjLGRfYSljX2E6dXBkYXRlRHJhdygpCnJldHVybiBjX2EgZW5kLGdldEl0ZW09ZnVuY3Rpb24oY19hLGRfYSlyZXR1cm4gYmNbZF9hXWVuZCxnZXRJdGVtSW5kZXg9ZnVuY3Rpb24oY19hKQpsb2NhbCBkX2E9Y19hOmdldFZhbHVlKClmb3IgX2FhLGFhYSBpbiBwYWlycyhiYylkbyBpZihhYWE9PWRfYSl0aGVuIHJldHVybiBfYWEgZW5kIGVuZCBlbmQsY2xlYXI9ZnVuY3Rpb24oY19hKQpiYz17fWNfYTpzZXRWYWx1ZSh7fSxmYWxzZSljX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsZ2V0SXRlbUNvdW50PWZ1bmN0aW9uKGNfYSlyZXR1cm4KI2JjIGVuZCxlZGl0SXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLGNhYSxkYWEsLi4uKXRhYmxlLnJlbW92ZShiYyxkX2EpCnRhYmxlLmluc2VydChiYyxkX2Ese3g9YWFhIG9yIDEseT1iYWEgb3IgMSx0ZXh0PV9hYSxiZ0NvbD0KY2FhIG9yIGNfYS5iZ0NvbG9yLGZnQ29sPWRhYSBvciBjX2EuZmdDb2xvcixhcmdzPXsuLi59fSljX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsc2VsZWN0SXRlbT1mdW5jdGlvbihjX2EsZF9hKWNfYTpzZXRWYWx1ZSgKYmNbZF9hXW9ye30sZmFsc2UpY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldEFjdGl2ZVN5bWJvbD1mdW5jdGlvbihjX2EsZF9hKQpfX2E9ZF9hOnN1YigxLDEpY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldFNlbGVjdGVkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLGNhYSkKY2M9ZF9hIG9yIGNjO2RjPV9hYSBvciBkYztfZD1hYWEgb3IgX2Q7YWQ9YmFhIG9yIGFkCmRkPWNhYX49bmlsIGFuZCBjYWEgb3IgdHJ1ZTtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKGNfYSxkX2EsX2FhLGFhYSkKaWYoCiNiYz4wKXRoZW4KbG9jYWwgYmFhLGNhYT1jX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihjX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSkKZm9yIGRhYSxfYmEgaW4gcGFpcnMoYmMpZG8KaWYoYmFhK19iYS54LTEgPD1fYWEpYW5kKApiYWErX2JhLngtMSArX2JhLnRleHQ6bGVuKCkrMSA+PV9hYSlhbmQoCmNhYStfYmEueS0xID09YWFhKXRoZW4KY19hOnNldFZhbHVlKF9iYSkKbG9jYWwgYWJhPWNfYTpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgibW91c2VfY2xpY2siLGNfYSwibW91c2VfY2xpY2siLGRfYSxfYWEsYWFhKWlmKGFiYT09ZmFsc2UpdGhlbiByZXR1cm4gYWJhIGVuZDtpZihjX2EucGFyZW50fj1uaWwpdGhlbgpjX2EucGFyZW50OnNldEZvY3VzZWRPYmplY3QoY19hKWVuZDtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmF3PWZ1bmN0aW9uKGNfYSkKaWYoCmNfYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGRfYSxfYWE9Y19hOmdldEFuY2hvclBvc2l0aW9uKCkKZm9yIGFhYSxiYWEgaW4gcGFpcnMoYmMpZG8KaWYoYmFhPT0KY19hOmdldFZhbHVlKCkpdGhlbiBpZihhX2E9PSJsZWZ0Iil0aGVuCmNfYS5wYXJlbnQ6d3JpdGVUZXh0KGJhYS54K2RfYS0xLGJhYS55K19hYS0xLF9fYSxfZCxhZCkKY19hLnBhcmVudDp3cml0ZVRleHQoYmFhLngrMiArZF9hLTEsYmFhLnkrX2FhLTEsYmFhLnRleHQsY2MsZGMpZW5kIGVsc2UKY19hLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveCgKYmFhLngrZF9hLTEsYmFhLnkrX2FhLTEsMSwxLGJkIG9yIGNfYS5iZ0NvbG9yKQpjX2EucGFyZW50OndyaXRlVGV4dChiYWEueCsyICtkX2EtMSxiYWEueStfYWEtMSxiYWEudGV4dCxiYWEuYmdDb2wsYmFhLmZnQ29sKWVuZCBlbmQ7cmV0dXJuIHRydWUgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGNfYSkKY19hLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGNfYSkKaWYoX2MuaW5pdChjX2EpKXRoZW4KY19hLmJnQ29sb3I9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhckJHIiljX2EuZmdDb2xvcj1jX2EucGFyZW50OmdldFRoZW1lKCJNZW51YmFyRkciKQpjYz1jX2EucGFyZW50OmdldFRoZW1lKCJTZWxlY3Rpb25CRyIpZGM9Y19hLnBhcmVudDpnZXRUaGVtZSgiU2VsZWN0aW9uVGV4dCIpCl9kPWNfYS5wYXJlbnQ6Z2V0VGhlbWUoIk1lbnViYXJCRyIpYWQ9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhclRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShiX2EsX2MpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJNZW51YmFyIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWJiLmdldFZhbHVlRnJvbVhNTDtsb2NhbCBkYj1kYSgidEhleCIpCnJldHVybgpmdW5jdGlvbihfYylsb2NhbCBhYz1hYihfYylsb2NhbCBiYz0iTWVudWJhciJsb2NhbCBjYz17fWFjLndpZHRoPTMwO2FjLmhlaWdodD0xCmFjOnNldFpJbmRleCg1KWxvY2FsIGRjPXt9bG9jYWwgX2Q7bG9jYWwgYWQ7bG9jYWwgYmQ9dHJ1ZTtsb2NhbCBjZD0ibGVmdCJsb2NhbCBkZD0wO2xvY2FsIF9fYT0xO2xvY2FsIGFfYT1mYWxzZQpsb2NhbCBmdW5jdGlvbiBiX2EoKWxvY2FsIGNfYT0wO2xvY2FsIGRfYT0wCmxvY2FsIF9hYT1jYzpnZXRXaWR0aCgpCmZvciBuPTEsI2RjIGRvIGlmKGRfYStkY1tuXS50ZXh0OmxlbigpK19fYSoyID5fYWEpdGhlbgppZigKZF9hPF9hYSl0aGVuCmNfYT1jX2ErIChkY1tuXS50ZXh0OmxlbigpK19fYSoyIC0gKF9hYS1kX2EpKWVsc2UgY19hPWNfYStkY1tuXS50ZXh0OmxlbigpK19fYSoyIGVuZCBlbmQ7ZF9hPQpkX2ErZGNbbl0udGV4dDpsZW4oKStfX2EqMiBlbmQ7cmV0dXJuIGNfYSBlbmQKY2M9e2dldFR5cGU9ZnVuY3Rpb24oY19hKXJldHVybiBiYyBlbmQsYWRkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsLi4uKQp0YWJsZS5pbnNlcnQoZGMse3RleHQ9dG9zdHJpbmcoZF9hKSxiZ0NvbD1fYWEgb3IgY19hLmJnQ29sb3IsZmdDb2w9YWFhIG9yIGNfYS5mZ0NvbG9yLGFyZ3M9ey4uLn19KWlmKCNkYz09MSl0aGVuIGNfYTpzZXRWYWx1ZShkY1sxXSllbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldEFsbD1mdW5jdGlvbihjX2EpcmV0dXJuCmRjIGVuZCxnZXRJdGVtSW5kZXg9ZnVuY3Rpb24oY19hKWxvY2FsIGRfYT1jX2E6Z2V0VmFsdWUoKWZvciBfYWEsYWFhIGluIHBhaXJzKGRjKWRvCmlmKGFhYT09ZF9hKXRoZW4gcmV0dXJuIF9hYSBlbmQgZW5kIGVuZCxjbGVhcj1mdW5jdGlvbihjX2EpCmRjPXt9Y19hOnNldFZhbHVlKHt9LGZhbHNlKWNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxzZXRTcGFjZT1mdW5jdGlvbihjX2EsZF9hKV9fYT0KZF9hIG9yIF9fYTtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsc2V0T2Zmc2V0PWZ1bmN0aW9uKGNfYSxkX2EpZGQ9CmRfYSBvciAwO2lmKGRkPDApdGhlbiBkZD0wIGVuZDtsb2NhbCBfYWE9Yl9hKClpZihkZD5fYWEpdGhlbiBkZD1fYWEgZW5kCmNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oY19hKXJldHVybiBkZCBlbmQsc2V0U2Nyb2xsYWJsZT1mdW5jdGlvbihjX2EsZF9hKQphX2E9ZF9hO2lmKGRfYT09bmlsKXRoZW4gYV9hPXRydWUgZW5kO3JldHVybiBjX2EgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihjX2EsZF9hKQphYy5zZXRWYWx1ZXNCeVhNTERhdGEoY19hLGRfYSlpZihjYigic2VsZWN0aW9uQkciLGRfYSl+PW5pbCl0aGVuCl9kPWNvbG9yc1tjYigic2VsZWN0aW9uQkciLGRfYSldZW5kO2lmKGNiKCJzZWxlY3Rpb25GRyIsZF9hKX49bmlsKXRoZW4KYWQ9Y29sb3JzW2NiKCJzZWxlY3Rpb25GRyIsZF9hKV1lbmQ7aWYoY2IoInNjcm9sbGFibGUiLGRfYSl+PW5pbCl0aGVuCmlmCihjYigic2Nyb2xsYWJsZSIsZF9hKSl0aGVuIGNfYTpzZXRTY3JvbGxhYmxlKHRydWUpZWxzZSBjX2E6c2V0U2Nyb2xsYWJsZShmYWxzZSllbmQgZW5kCmlmKApjYigib2Zmc2V0IixkX2Epfj1uaWwpdGhlbiBjX2E6c2V0T2Zmc2V0KGNiKCJvZmZzZXQiLGRfYSkpZW5kCmlmKGNiKCJzcGFjZSIsZF9hKX49bmlsKXRoZW4gX19hPWNiKCJzcGFjZSIsZF9hKWVuZAppZihkX2FbIml0ZW0iXX49bmlsKXRoZW4gbG9jYWwgX2FhPWRfYVsiaXRlbSJdCmlmKF9hYS5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBfYWE9e19hYX1lbmQ7Zm9yIGFhYSxiYWEgaW4gcGFpcnMoX2FhKWRvCmNfYTphZGRJdGVtKGNiKCJ0ZXh0IixiYWEpLGNvbG9yc1tjYigiYmciLGJhYSldLGNvbG9yc1tjYigiZmciLGJhYSldKWVuZCBlbmQ7cmV0dXJuIGNfYSBlbmQscmVtb3ZlSXRlbT1mdW5jdGlvbihjX2EsZF9hKQp0YWJsZS5yZW1vdmUoZGMsZF9hKWNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxnZXRJdGVtPWZ1bmN0aW9uKGNfYSxkX2EpCnJldHVybiBkY1tkX2FdZW5kLGdldEl0ZW1Db3VudD1mdW5jdGlvbihjX2EpcmV0dXJuI2RjIGVuZCxlZGl0SXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLC4uLil0YWJsZS5yZW1vdmUoZGMsZF9hKQp0YWJsZS5pbnNlcnQoZGMsZF9hLHt0ZXh0PV9hYSxiZ0NvbD0KYWFhIG9yIGNfYS5iZ0NvbG9yLGZnQ29sPWJhYSBvciBjX2EuZmdDb2xvcixhcmdzPXsuLi59fSljX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsc2VsZWN0SXRlbT1mdW5jdGlvbihjX2EsZF9hKWNfYTpzZXRWYWx1ZSgKZGNbZF9hXW9ye30sZmFsc2UpY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldFNlbGVjdGVkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEpX2Q9CmRfYSBvciBjX2EuYmdDb2xvcjthZD1fYWEgb3IgY19hLmZnQ29sb3I7YmQ9YWFhCmNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxtb3VzZUhhbmRsZXI9ZnVuY3Rpb24oY19hLGRfYSxfYWEsYWFhKQppZgooYWMubW91c2VIYW5kbGVyKGNfYSxkX2EsX2FhLGFhYSkpdGhlbgpsb2NhbCBiYWEsY2FhPWNfYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGNfYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGRhYSxfYmE9Y19hOmdldFNpemUoKWxvY2FsIGFiYT0wCmZvciBuPTEsI2RjIGRvCmlmKGRjW25dfj1uaWwpdGhlbgppZgooYmFhK2FiYTw9X2FhK2RkKWFuZChiYWErYWJhKwpkY1tuXS50ZXh0OmxlbigpKyAoX19hKjIpPl9hYStkZClhbmQoY2FhPT1hYWEpdGhlbgpjX2E6c2V0VmFsdWUoZGNbbl0pCmNfYTpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudChldmVudCxjX2EsZXZlbnQsMCxfYWEsYWFhLGRjW25dKWVuZDthYmE9YWJhK2RjW25dLnRleHQ6bGVuKCkrX19hKjIgZW5kIGVuZDtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEpCmlmCihhYy5zY3JvbGxIYW5kbGVyKGNfYSxkX2EsX2FhLGFhYSkpdGhlbiBpZihhX2EpdGhlbiBkZD1kZCtkX2E7aWYoZGQ8MCl0aGVuIGRkPTAgZW5kO2xvY2FsIGJhYT1iX2EoKWlmKGRkPmJhYSl0aGVuIGRkPWJhYSBlbmQKY19hOnVwZGF0ZURyYXcoKWVuZDtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmF3PWZ1bmN0aW9uKGNfYSkKaWYKKGFjLmRyYXcoY19hKSl0aGVuCmlmKGNfYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGRfYSxfYWE9Y19hOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgYWFhLGJhYT1jX2E6Z2V0U2l6ZSgpaWYoY19hLmJnQ29sb3J+PWZhbHNlKXRoZW4KY19hLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChkX2EsX2FhLGFhYSxiYWEsY19hLmJnQ29sb3IpZW5kO2xvY2FsIGNhYT0iImxvY2FsIGRhYT0iImxvY2FsIF9iYT0iIgpmb3IgYWJhLGJiYSBpbiBwYWlycyhkYylkbwpsb2NhbCBjYmE9CigiICIpOnJlcChfX2EpLi5iYmEudGV4dC4uICgiICIpOnJlcChfX2EpY2FhPWNhYS4uY2JhCmlmKGJiYT09Y19hOmdldFZhbHVlKCkpdGhlbiBkYWE9ZGFhLi4KZGJbX2Qgb3IgYmJhLmJnQ29sIG9yIGNfYS5iZ0NvbG9yXTpyZXAoY2JhOmxlbigpKV9iYT1fYmEuLgpkYlsKYWQgb3IgYmJhLkZnQ29sIG9yIGNfYS5mZ0NvbG9yXTpyZXAoY2JhOmxlbigpKWVsc2UgZGFhPWRhYS4uCmRiW2JiYS5iZ0NvbCBvciBjX2EuYmdDb2xvcl06cmVwKGNiYTpsZW4oKSlfYmE9X2JhLi4KZGJbYmJhLkZnQ29sIG9yIGNfYS5mZ0NvbG9yXTpyZXAoY2JhOmxlbigpKWVuZCBlbmQKY19hLnBhcmVudDpzZXRUZXh0KGRfYSxfYWEsY2FhOnN1YihkZCsxLGFhYStkZCkpCmNfYS5wYXJlbnQ6c2V0QkcoZF9hLF9hYSxkYWE6c3ViKGRkKzEsYWFhK2RkKSkKY19hLnBhcmVudDpzZXRGRyhkX2EsX2FhLF9iYTpzdWIoZGQrMSxhYWErZGQpKWVuZCBlbmQgZW5kLGluaXQ9ZnVuY3Rpb24oY19hKQpjX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsY19hKWNfYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3Njcm9sbCIsY19hKQppZgooYWMuaW5pdChjX2EpKXRoZW4gY19hLmJnQ29sb3I9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhckJHIikKY19hLmZnQ29sb3I9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhclRleHQiKV9kPWNfYS5wYXJlbnQ6Z2V0VGhlbWUoIlNlbGVjdGlvbkJHIikKYWQ9Y19hLnBhcmVudDpnZXRUaGVtZSgiU2VsZWN0aW9uVGV4dCIpZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKGNjLGFjKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiQnV0dG9uIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWJiLmdldFZhbHVlRnJvbVhNTDtsb2NhbCBkYj1kYSgidEhleCIpCnJldHVybgpmdW5jdGlvbihfYylsb2NhbCBhYz1hYihfYylsb2NhbCBiYz0iQnV0dG9uImxvY2FsIGNjPSJjZW50ZXIibG9jYWwgZGM9ImNlbnRlciIKYWM6c2V0WkluZGV4KDUpYWM6c2V0VmFsdWUoIkJ1dHRvbiIpYWMud2lkdGg9MTI7YWMuaGVpZ2h0PTMKbG9jYWwgX2Q9e2luaXQ9ZnVuY3Rpb24oYWQpCmlmKGFjLmluaXQoYWQpKXRoZW4KYWQuYmdDb2xvcj1hZC5wYXJlbnQ6Z2V0VGhlbWUoIkJ1dHRvbkJHIilhZC5mZ0NvbG9yPWFkLnBhcmVudDpnZXRUaGVtZSgiQnV0dG9uVGV4dCIpZW5kIGVuZCxnZXRUeXBlPWZ1bmN0aW9uKGFkKXJldHVybiBiYyBlbmQsc2V0SG9yaXpvbnRhbEFsaWduPWZ1bmN0aW9uKGFkLGJkKQpjYz1iZDthZDp1cGRhdGVEcmF3KClyZXR1cm4gYWQgZW5kLHNldFZlcnRpY2FsQWxpZ249ZnVuY3Rpb24oYWQsYmQpZGM9YmQKYWQ6dXBkYXRlRHJhdygpcmV0dXJuIGFkIGVuZCxzZXRUZXh0PWZ1bmN0aW9uKGFkLGJkKWFjOnNldFZhbHVlKHRvc3RyaW5nKGJkKSkKYWQ6dXBkYXRlRHJhdygpcmV0dXJuIGFkIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYWQsYmQpCmFjLnNldFZhbHVlc0J5WE1MRGF0YShhZCxiZCkKaWYoY2IoInRleHQiLGJkKX49bmlsKXRoZW4gYWQ6c2V0VGV4dChjYigidGV4dCIsYmQpKWVuZDtpZihjYigiaG9yaXpvbnRhbEFsaWduIixiZCl+PW5pbCl0aGVuCmNjPWNiKCJob3Jpem9udGFsQWxpZ24iLGJkKWVuZDtpZihjYigidmVydGljYWxBbGlnbiIsYmQpfj1uaWwpdGhlbgpkYz1jYigidmVydGljYWxBbGlnbiIsYmQpZW5kO3JldHVybiBhZCBlbmQsZHJhdz1mdW5jdGlvbihhZCkKaWYKKGFjLmRyYXcoYWQpKXRoZW4KaWYoYWQucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBiZCxjZD1hZDpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGRkLF9fYT1hZDpnZXRTaXplKClsb2NhbCBhX2E9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oX19hLGRjKQpmb3Igbj0xLF9fYSBkbwppZihuPT1hX2EpdGhlbgpsb2NhbCBiX2E9YWQ6Z2V0VmFsdWUoKQphZC5wYXJlbnQ6c2V0VGV4dChiZCsgKGRkLzIgLWJfYTpsZW4oKS8yKSxjZCsgKG4tMSksYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiX2EsYl9hOmxlbigpLGNjKSkKYWQucGFyZW50OnNldEZHKGJkKyAoZGQvMiAtYl9hOmxlbigpLzIpLGNkKyAobi0xKSxiYi5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKGRiW2FkLmZnQ29sb3JdOnJlcChiX2E6bGVuKCkpLGJfYTpsZW4oKSxjYykpZW5kIGVuZCBlbmQgZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKF9kLGFjKWVuZCBlbmQ7YWFbImxpYnJhcmllcyJdPXt9CmFhWyJsaWJyYXJpZXMiXVsiYmFzYWx0RHJhdyJdPWZ1bmN0aW9uKC4uLikKbG9jYWwgYWI9ZGEoInRIZXgiKWxvY2FsIGJiLGNiPXN0cmluZy5zdWIsc3RyaW5nLnJlcApyZXR1cm4KZnVuY3Rpb24oZGIpbG9jYWwgX2M9ZGIgb3IgdGVybS5jdXJyZW50KCkKbG9jYWwgYWM7bG9jYWwgYmMsY2M9X2MuZ2V0U2l6ZSgpbG9jYWwgZGM9e31sb2NhbCBfZD17fWxvY2FsIGFkPXt9bG9jYWwgYmQ9e31sb2NhbCBjZD17fWxvY2FsIGRkPXt9bG9jYWwgX19hO2xvY2FsIGFfYT17fWxvY2FsIGZ1bmN0aW9uIGJfYSgpCl9fYT1jYigiICIsYmMpCmZvciBuPTAsMTUgZG8gbG9jYWwgZGFhPTIgXm47bG9jYWwgX2JhPWFiW2RhYV1hX2FbZGFhXT1jYihfYmEsYmMpZW5kIGVuZDtiX2EoKQpsb2NhbCBmdW5jdGlvbiBjX2EoKWJfYSgpbG9jYWwgZGFhPV9fYQpsb2NhbCBfYmE9YV9hW2NvbG9ycy53aGl0ZV1sb2NhbCBhYmE9YV9hW2NvbG9ycy5ibGFja10KZm9yIGN1cnJlbnRZPTEsY2MgZG8KZGNbY3VycmVudFldPWJiKApkY1tjdXJyZW50WV09PW5pbCBhbmQgZGFhIG9yCmRjW2N1cnJlbnRZXS4uZGFhOnN1YigxLGJjLWRjW2N1cnJlbnRZXTpsZW4oKSksMSxiYykKYWRbY3VycmVudFldPWJiKGFkW2N1cnJlbnRZXT09bmlsIGFuZCBfYmEgb3IgYWRbY3VycmVudFldLi5fYmE6c3ViKDEsYmMtCmFkW2N1cnJlbnRZXTpsZW4oKSksMSxiYykKX2RbY3VycmVudFldPWJiKF9kW2N1cnJlbnRZXT09bmlsIGFuZCBhYmEgb3IgX2RbY3VycmVudFldLi5hYmE6c3ViKDEsYmMtCl9kW2N1cnJlbnRZXTpsZW4oKSksMSxiYyllbmQgZW5kO2NfYSgpCmxvY2FsIGZ1bmN0aW9uIGRfYShkYWEsX2JhLGFiYSkKaWYoX2JhPj0xKWFuZChfYmE8PWNjKXRoZW4KaWYKKGRhYSthYmE6bGVuKCk+MClhbmQoZGFhPD1iYyl0aGVuIGxvY2FsIGJiYT1kY1tfYmFdbG9jYWwgY2JhO2xvY2FsIGRiYT1kYWErI2FiYS0xCmlmKGRhYTwxKXRoZW4gbG9jYWwgX2NhPTEgLWRhYSsxCmxvY2FsIGFjYT1iYy1kYWErMTthYmE9YmIoYWJhLF9jYSxhY2EpZWxzZWlmKGRiYT5iYyl0aGVuIGxvY2FsIF9jYT1iYy1kYWErMTthYmE9YmIoYWJhLDEsX2NhKWVuZAppZihkYWE+MSl0aGVuIGxvY2FsIF9jYT1kYWEtMTtjYmE9YmIoYmJhLDEsX2NhKS4uYWJhIGVsc2UgY2JhPWFiYSBlbmQ7aWYgZGJhPGJjIHRoZW4gY2JhPWNiYS4uYmIoYmJhLGRiYSsxLGJjKWVuZApkY1tfYmFdPWNiYSBlbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfYWEoZGFhLF9iYSxhYmEpCmlmKF9iYT49MSlhbmQoX2JhPD1jYyl0aGVuCmlmKGRhYSthYmE6bGVuKCk+MClhbmQoZGFhPD1iYyl0aGVuCmxvY2FsIGJiYT1fZFtfYmFdbG9jYWwgY2JhO2xvY2FsIGRiYT1kYWErI2FiYS0xCmlmKGRhYTwxKXRoZW4KYWJhPWJiKGFiYSwxIC1kYWErMSxiYy1kYWErMSllbHNlaWYoZGJhPmJjKXRoZW4gYWJhPWJiKGFiYSwxLGJjLWRhYSsxKWVuZAppZihkYWE+MSl0aGVuIGNiYT1iYihiYmEsMSxkYWEtMSkuLmFiYSBlbHNlIGNiYT1hYmEgZW5kO2lmIGRiYTxiYyB0aGVuIGNiYT1jYmEuLmJiKGJiYSxkYmErMSxiYyllbmQKX2RbX2JhXT1jYmEgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYWFhKGRhYSxfYmEsYWJhKQppZihfYmE+PTEpYW5kKF9iYTw9Y2MpdGhlbgppZihkYWErYWJhOmxlbigpPjApYW5kKGRhYTw9YmMpdGhlbgpsb2NhbCBiYmE9YWRbX2JhXWxvY2FsIGNiYTtsb2NhbCBkYmE9ZGFhKyNhYmEtMQppZihkYWE8MSl0aGVuIGxvY2FsIF9jYT0xIC1kYWErMTtsb2NhbCBhY2E9YmMtZGFhKzEKYWJhPWJiKGFiYSxfY2EsYWNhKWVsc2VpZihkYmE+YmMpdGhlbiBsb2NhbCBfY2E9YmMtZGFhKzE7YWJhPWJiKGFiYSwxLF9jYSllbmQKaWYoZGFhPjEpdGhlbiBsb2NhbCBfY2E9ZGFhLTE7Y2JhPWJiKGJiYSwxLF9jYSkuLmFiYSBlbHNlIGNiYT1hYmEgZW5kO2lmIGRiYTxiYyB0aGVuIGNiYT1jYmEuLmJiKGJiYSxkYmErMSxiYyllbmQKYWRbX2JhXT1jYmEgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYmFhKGRhYSxfYmEsYWJhLGJiYSxjYmEpCmlmKCNhYmE9PSNiYmEpb3IoI2FiYT09I2NiYSl0aGVuCmlmKF9iYT49MSlhbmQoX2JhPD1jYyl0aGVuCmlmKApkYWErYWJhOmxlbigpPjApYW5kKGRhYTw9YmMpdGhlbiBsb2NhbCBkYmE9ZGNbX2JhXWxvY2FsIF9jYT1hZFtfYmFdbG9jYWwgYWNhPV9kW19iYV0KbG9jYWwgYmNhLGNjYSxkY2E7bG9jYWwgX2RhPWRhYSsjYWJhLTEKaWYoZGFhPDEpdGhlbiBsb2NhbCBhZGE9MSAtZGFhKzE7bG9jYWwgYmRhPWJjLWRhYSsxCmFiYT1iYihhYmEsYWRhLGJkYSliYmE9YmIoYmJhLGFkYSxiZGEpY2JhPWJiKGNiYSxhZGEsYmRhKWVsc2VpZihfZGE+YmMpdGhlbiBsb2NhbCBhZGE9YmMtZGFhKzEKYWJhPWJiKGFiYSwxLGFkYSliYmE9YmIoYmJhLDEsYWRhKWNiYT1iYihjYmEsMSxhZGEpZW5kCmlmKGRhYT4xKXRoZW4gbG9jYWwgYWRhPWRhYS0xO2JjYT1iYihkYmEsMSxhZGEpLi5hYmEKY2NhPWJiKF9jYSwxLGFkYSkuLmJiYTtkY2E9YmIoYWNhLDEsYWRhKS4uY2JhIGVsc2UgYmNhPWFiYTtjY2E9YmJhO2RjYT1jYmEgZW5kCmlmIF9kYTxiYyB0aGVuIGJjYT1iY2EuLmJiKGRiYSxfZGErMSxiYykKY2NhPWNjYS4uYmIoX2NhLF9kYSsxLGJjKWRjYT1kY2EuLmJiKGFjYSxfZGErMSxiYyllbmQ7ZGNbX2JhXT1iY2E7YWRbX2JhXT1jY2E7X2RbX2JhXT1kY2EgZW5kIGVuZCBlbmQgZW5kCmxvY2FsIGNhYT17c2V0U2l6ZT1mdW5jdGlvbihkYWEsX2JhKWJjLGNjPWRhYSxfYmE7Y19hKCllbmQsc2V0TWlycm9yPWZ1bmN0aW9uKGRhYSlhYz1kYWEgZW5kLHNldEJHPWZ1bmN0aW9uKGRhYSxfYmEsYWJhKQpfYWEoZGFhLF9iYSxhYmEpZW5kLHNldFRleHQ9ZnVuY3Rpb24oZGFhLF9iYSxhYmEpZF9hKGRhYSxfYmEsYWJhKWVuZCxzZXRGRz1mdW5jdGlvbihkYWEsX2JhLGFiYSkKYWFhKGRhYSxfYmEsYWJhKWVuZCxibGl0PWZ1bmN0aW9uKGRhYSxfYmEsYWJhLGJiYSxjYmEpYmFhKGRhYSxfYmEsYWJhLGJiYSxjYmEpZW5kLGRyYXdCYWNrZ3JvdW5kQm94PWZ1bmN0aW9uKGRhYSxfYmEsYWJhLGJiYSxjYmEpCmZvciBuPTEsYmJhCmRvIF9hYShkYWEsX2JhKyAobi0xKSxjYihhYltjYmFdLGFiYSkpZW5kIGVuZCxkcmF3Rm9yZWdyb3VuZEJveD1mdW5jdGlvbihkYWEsX2JhLGFiYSxiYmEsY2JhKWZvciBuPTEsYmJhIGRvCmFhYShkYWEsX2JhKyAobi0xKSxjYihhYltjYmFdLGFiYSkpZW5kIGVuZCxkcmF3VGV4dEJveD1mdW5jdGlvbihkYWEsX2JhLGFiYSxiYmEsY2JhKQpmb3Igbj0xLGJiYSBkbyBkX2EoZGFhLApfYmErIChuLTEpLGNiKGNiYSxhYmEpKWVuZCBlbmQsd3JpdGVUZXh0PWZ1bmN0aW9uKGRhYSxfYmEsYWJhLGJiYSxjYmEpCmlmKGFiYX49bmlsKXRoZW4gZF9hKGRhYSxfYmEsYWJhKWlmCihiYmF+PW5pbClhbmQoYmJhfj1mYWxzZSl0aGVuCl9hYShkYWEsX2JhLGNiKGFiW2JiYV0sYWJhOmxlbigpKSllbmQ7aWYoY2Jhfj1uaWwpYW5kKGNiYX49ZmFsc2UpdGhlbgphYWEoZGFhLF9iYSxjYihhYltjYmFdLGFiYTpsZW4oKSkpZW5kIGVuZCBlbmQsdXBkYXRlPWZ1bmN0aW9uKCkKbG9jYWwgZGFhLF9iYT1fYy5nZXRDdXJzb3JQb3MoKWxvY2FsIGFiYT1mYWxzZQppZihfYy5nZXRDdXJzb3JCbGlua349bmlsKXRoZW4gYWJhPV9jLmdldEN1cnNvckJsaW5rKCllbmQ7X2Muc2V0Q3Vyc29yQmxpbmsoZmFsc2UpaWYoYWN+PW5pbCl0aGVuCmFjLnNldEN1cnNvckJsaW5rKGZhbHNlKWVuZApmb3Igbj0xLGNjIGRvIF9jLnNldEN1cnNvclBvcygxLG4pCl9jLmJsaXQoZGNbbl0sYWRbbl0sX2Rbbl0paWYoYWN+PW5pbCl0aGVuIGFjLnNldEN1cnNvclBvcygxLG4pCmFjLmJsaXQoZGNbbl0sYWRbbl0sX2Rbbl0pZW5kIGVuZDtfYy5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3JzLmJsYWNrKQpfYy5zZXRDdXJzb3JCbGluayhhYmEpX2Muc2V0Q3Vyc29yUG9zKGRhYSxfYmEpCmlmKGFjfj1uaWwpdGhlbgphYy5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3JzLmJsYWNrKWFjLnNldEN1cnNvckJsaW5rKGFiYSlhYy5zZXRDdXJzb3JQb3MoZGFhLF9iYSllbmQgZW5kLHNldFRlcm09ZnVuY3Rpb24oZGFhKQpfYz1kYWEgZW5kfXJldHVybiBjYWEgZW5kIGVuZAphYVsibGlicmFyaWVzIl1bInV0aWxzIl09ZnVuY3Rpb24oLi4uKQpsb2NhbCBhYixiYixjYj1zdHJpbmcuc3ViLHN0cmluZy5maW5kLHN0cmluZy5yZXZlcnNlCmxvY2FsIGZ1bmN0aW9uIGRiKGFkLGJkKWxvY2FsIGNkPXt9aWYgYWQ9PSIib3IgYmQ9PSIidGhlbiByZXR1cm4gY2QgZW5kO2xvY2FsIGRkPTEKbG9jYWwgX19hLGFfYT1iYihhZCxiZCxkZCl3aGlsZSBfX2EgZG8gdGFibGUuaW5zZXJ0KGNkLGFiKGFkLGRkLF9fYS0xKSlkZD1hX2ErMQpfX2EsYV9hPWJiKGFkLGJkLGRkKWVuZAp0YWJsZS5pbnNlcnQoY2QsYWIoYWQsZGQpKXJldHVybiBjZCBlbmQKbG9jYWwgX2M9e1swXT17OCw0LDMsNiw1fSx7NCwxNCw4LDd9LHs2LDEwLDgsN30sezksMTEsOCwwfSx7MSwxNCw4LDB9LHsxMywxMiw4LDB9LHsyLDEwLDgsMH0sezE1LDgsMTAsMTEsMTIsMTR9LHswLDcsMSw5LDIsMTN9LHszLDExLDgsN30sezIsNiw3LDE1fSx7OSwzLDcsMTV9LHsxMyw1LDcsMTV9LHs1LDEyLDgsN30sezEsNCw3LDE1fSx7NywxMCwxMSwxMiwxNH19bG9jYWwgYWMsYmMsY2M9e30se30se31mb3IgaT0wLDE1IGRvIGJjWzIgXmldPWkgZW5kCmRvIGxvY2FsIGFkPSIwMTIzNDU2Nzg5YWJjZGVmIgpmb3IgaT0xLDE2IGRvIGFjW2FkOnN1YihpLGkpXT0KaS0xO2FjW2ktMV09YWQ6c3ViKGksaSkKY2NbYWQ6c3ViKGksaSldPTIgXiAoaS0xKWNjWzIgXiAoaS0xKV09YWQ6c3ViKGksaSlsb2NhbCBiZD1fY1tpLTFdZm9yIGk9MSwjYmQgZG8KYmRbaV09MiBeYmRbaV1lbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBkYyhhZClsb2NhbCBiZD1fY1tiY1thZFsjYWRdWzFdXV0KZm9yIGo9MSwjYmQgZG8gbG9jYWwgY2Q9YmRbal1mb3IgaT0xLCNhZC0xIGRvIGlmCmFkW2ldWzFdPT1jZCB0aGVuIHJldHVybiBpIGVuZCBlbmQgZW5kO3JldHVybiAxIGVuZApsb2NhbCBmdW5jdGlvbiBfZChhZCxiZCkKaWYgbm90IGJkIHRoZW4gbG9jYWwgZGQ9e31iZD17fWZvciBpPTEsNiBkbyBsb2NhbCBfX2E9YWRbaV1sb2NhbCBhX2E9YmRbX19hXQpiZFtfX2FdLGRkW2ldPWFfYSBhbmQoYV9hKzEpb3IgMSxfX2EgZW5kO2FkPWRkIGVuZDtsb2NhbCBjZD17fWZvciBkZCxfX2EgaW4gcGFpcnMoYmQpZG8gY2RbI2NkKzFdPXtkZCxfX2F9ZW5kCmlmI2NkPjEgdGhlbgp3aGlsZQojY2Q+MiBkbwp0YWJsZS5zb3J0KGNkLGZ1bmN0aW9uKGRfYSxfYWEpcmV0dXJuIGRfYVsyXT5fYWFbMl1lbmQpbG9jYWwgX19hLGFfYT1kYyhjZCksI2NkO2xvY2FsIGJfYSxjX2E9Y2RbYV9hXVsxXSxjZFtfX2FdWzFdCmZvciBpPTEsNiBkbyBpZiBhZFtpXT09Yl9hIHRoZW4KYWRbaV09Y19hO2NkW19fYV1bMl09Y2RbX19hXVsyXSsxIGVuZCBlbmQ7Y2RbYV9hXT1uaWwgZW5kO2xvY2FsIGRkPTEyOApmb3IgaT0xLCNhZC0xIGRvIGlmIGFkW2ldfj1hZFs2XXRoZW4gZGQ9ZGQrMiBeIChpLTEpZW5kIGVuZDtyZXR1cm4gc3RyaW5nLmNoYXIoZGQpLApjY1tjZFsxXVsxXT09YWRbNl1hbmQgY2RbMl1bMV1vciBjZFsxXVsxXV0sY2NbYWRbNl1dZWxzZQpyZXR1cm4iXDEyOCIsY2NbYWRbMV1dLGNjW2FkWzFdXWVuZCBlbmQKcmV0dXJuCntnZXRUZXh0SG9yaXpvbnRhbEFsaWduPWZ1bmN0aW9uKGFkLGJkLGNkLGRkKWFkPWFiKGFkLDEsYmQpbG9jYWwgX19hPWJkLXN0cmluZy5sZW4oYWQpCmlmKGNkPT0icmlnaHQiKXRoZW4gYWQ9c3RyaW5nLnJlcCgKZGQgb3IiICIsX19hKS4uYWQgZWxzZWlmKGNkPT0iY2VudGVyIil0aGVuCmFkPXN0cmluZy5yZXAoZGQgb3IiICIsbWF0aC5mbG9vcigKX19hLzIpKS4uYWQuLgpzdHJpbmcucmVwKGRkIG9yIiAiLG1hdGguZmxvb3IoX19hLzIpKQphZD1hZC4uIChzdHJpbmcubGVuKGFkKTxiZCBhbmQoZGQgb3IiICIpb3IiIillbHNlIGFkPWFkLi5zdHJpbmcucmVwKGRkIG9yIiAiLF9fYSllbmQ7cmV0dXJuIGFkIGVuZCxnZXRUZXh0VmVydGljYWxBbGlnbj1mdW5jdGlvbihhZCxiZCkKbG9jYWwgY2Q9MAppZihiZD09ImNlbnRlciIpdGhlbiBjZD1tYXRoLmNlaWwoYWQvMilpZihjZDwxKXRoZW4gY2Q9MSBlbmQgZW5kO2lmKGJkPT0iYm90dG9tIil0aGVuIGNkPWFkIGVuZDtpZihjZDwxKXRoZW4gY2Q9MSBlbmQ7cmV0dXJuIGNkIGVuZCxycGFpcnM9ZnVuY3Rpb24oYWQpcmV0dXJuIGZ1bmN0aW9uKGJkLGNkKWNkPQpjZC0xO2lmIGNkfj0wIHRoZW4gcmV0dXJuIGNkLGJkW2NkXWVuZCBlbmQsYWQsCiNhZCsxIGVuZCx0YWJsZUNvdW50PWZ1bmN0aW9uKGFkKQpsb2NhbCBiZD0wO2lmKGFkfj1uaWwpdGhlbiBmb3IgY2QsZGQgaW4gcGFpcnMoYWQpZG8gYmQ9YmQrMSBlbmQgZW5kO3JldHVybiBiZCBlbmQsc3BsaXRTdHJpbmc9ZGIsY3JlYXRlVGV4dD1mdW5jdGlvbihhZCxiZCkKbG9jYWwgY2Q9ZGIoYWQsIlxuIilsb2NhbCBkZD17fQpmb3IgX19hLGFfYSBpbiBwYWlycyhjZClkbyBpZigjYV9hPT0wKXRoZW4gdGFibGUuaW5zZXJ0KGRkLCIiKWVuZAp3aGlsZSNhX2E+CmJkIGRvIGxvY2FsIGJfYT1iYihjYihhYihhX2EsMSxiZCkpLCIgIilpZiBub3QgYl9hIHRoZW4gYl9hPWJkIGVsc2UKYl9hPWJkLWJfYSsxIGVuZDtsb2NhbCBjX2E9YWIoYV9hLDEsYl9hKQp0YWJsZS5pbnNlcnQoZGQsY19hKWFfYT1hYihhX2EsYl9hKzEpZW5kO2lmI2FfYT4wIHRoZW4gdGFibGUuaW5zZXJ0KGRkLGFfYSllbmQgZW5kO3JldHVybiBkZCBlbmQsZ2V0VmFsdWVGcm9tWE1MPWZ1bmN0aW9uKGFkLGJkKQpsb2NhbCBjZDtpZih0eXBlKGJkKX49InRhYmxlIil0aGVuIHJldHVybiBlbmQ7aWYoYmRbYWRdfj1uaWwpdGhlbgppZgoodHlwZShiZFthZF0pPT0idGFibGUiKXRoZW4gaWYoYmRbYWRdLnZhbHVlfj1uaWwpdGhlbiBjZD1iZFthZF06dmFsdWUoKWVuZCBlbmQgZW5kO2lmKGNkPT1uaWwpdGhlbgpjZD1iZFsiQCIuLmFkXWVuZDtpZihjZD09InRydWUiKXRoZW4gY2Q9dHJ1ZSBlbHNlaWYoY2Q9PSJmYWxzZSIpdGhlbiBjZD1mYWxzZSBlbHNlaWYodG9udW1iZXIoY2Qpfj1uaWwpdGhlbgpjZD10b251bWJlcihjZCllbmQ7cmV0dXJuIGNkIGVuZCxudW1iZXJGcm9tU3RyaW5nPWZ1bmN0aW9uKGFkKXJldHVybiBsb2FkKAoicmV0dXJuICIuLmFkKSgpZW5kLHV1aWQ9ZnVuY3Rpb24oKQpsb2NhbCBhZD1tYXRoLnJhbmRvbQpsb2NhbCBmdW5jdGlvbiBiZCgpbG9jYWwgY2Q9J3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCdyZXR1cm4Kc3RyaW5nLmdzdWIoY2QsJ1t4eV0nLGZ1bmN0aW9uKGRkKWxvY2FsIF9fYT0KKGRkPT0neCcpYW5kIGFkKDAsMHhmKW9yIGFkKDgsMHhiKQpyZXR1cm4gc3RyaW5nLmZvcm1hdCgnJXgnLF9fYSllbmQpZW5kO3JldHVybiBiZCgpZW5kLGFycmF5PWZ1bmN0aW9uKGFkLGJkKXJldHVybgpsb2FkKAoicmV0dXJuIHsiLi4KKCJuaWwsIik6cmVwKGFkKS4uICgiWzBdPW5pbCwiKTpyZXAoYmQpLi4ifSIpKCllbmQsc2hyaW5rPWZ1bmN0aW9uKGFkLGJkKWxvY2FsIGNkLGRkLF9fYSxhX2E9e3t9LHt9LHt9fSwwLAojYWQrI2FkJTMsYmQgb3IgY29sb3Vycy5ibGFjaztmb3IgaT0xLCNhZCBkbyBpZgojYWRbaV0+ZGQgdGhlbiBkZD0jYWRbaV1lbmQgZW5kCmZvciB5PTAsX19hLTEsMyBkbwpsb2NhbCBiX2EsY19hLGRfYSxfYWE9e30se30se30sMQpmb3IgeD0wLGRkLTEsMiBkbyBsb2NhbCBhYWEsYmFhPXt9LHt9CmZvciB5eT0xLDMgZG8KZm9yIHh4PTEsMiBkbwphYWFbI2FhYSsxXT0oYWRbeSt5eV1hbmQgYWRbeSt5eV1beCt4eF0pYW5kCihhZFt5Kwp5eV1beCt4eF09PTAgYW5kIGFfYSBvciBhZFt5K3l5XVt4K3h4XSlvciBhX2E7YmFhW2FhYVsjYWFhXV09CmJhYVthYWFbI2FhYV1dYW5kKGJhYVthYWFbI2FhYV1dKzEpb3IgMSBlbmQgZW5kO2JfYVtfYWFdLGNfYVtfYWFdLGRfYVtfYWFdPV9kKGFhYSxiYWEpX2FhPV9hYSsxIGVuZApjZFsxXVsjY2RbMV0rMV0sY2RbMl1bI2NkWzJdKzFdLGNkWzNdWyNjZFszXSsxXT10YWJsZS5jb25jYXQoYl9hKSx0YWJsZS5jb25jYXQoY19hKSx0YWJsZS5jb25jYXQoZF9hKWVuZDtjZC53aWR0aCxjZC5oZWlnaHQ9I2NkWzFdWzFdLCNjZFsxXXJldHVybiBjZCBlbmR9ZW5kCmFhWyJsaWJyYXJpZXMiXVsiYmFzYWx0TG9ncyJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj0iImxvY2FsIGJiPSJiYXNhbHRMb2cudHh0ImxvY2FsIGNiPSJEZWJ1ZyIKZnMuZGVsZXRlKAphYn49IiJhbmQgYWIuLiIvIi4uYmIgb3IgYmIpCmxvY2FsIGRiPXtfX2NhbGw9ZnVuY3Rpb24oX2MsYWMsYmMpaWYoYWM9PW5pbCl0aGVuIHJldHVybiBlbmQKbG9jYWwgY2M9YWJ+PSIiYW5kIGFiLi4iLyIuLmJiIG9yIGJiCmxvY2FsIGRjPWZzLm9wZW4oY2MsZnMuZXhpc3RzKGNjKWFuZCJhIm9yInciKQpkYy53cml0ZUxpbmUoIltCYXNhbHRdWyIuLiAoYmMgYW5kIGJjIG9yIGNiKS4uIl06ICIuLnRvc3RyaW5nKGFjKSlkYy5jbG9zZSgpZW5kfXJldHVybiBzZXRtZXRhdGFibGUoe30sZGIpZW5kCmFhWyJsaWJyYXJpZXMiXVsibGF5b3V0Il09ZnVuY3Rpb24oLi4uKQpsb2NhbCBmdW5jdGlvbiBhYihjYilsb2NhbCBkYj17fWRiLl9fX3ZhbHVlPW5pbDtkYi5fX19uYW1lPWNiCmRiLl9fX2NoaWxkcmVuPXt9ZGIuX19fcHJvcHM9e31mdW5jdGlvbiBkYjp2YWx1ZSgpcmV0dXJuIHNlbGYuX19fdmFsdWUgZW5kO2Z1bmN0aW9uIGRiOnNldFZhbHVlKF9jKQpzZWxmLl9fX3ZhbHVlPV9jIGVuZDtmdW5jdGlvbiBkYjpuYW1lKClyZXR1cm4gc2VsZi5fX19uYW1lIGVuZDtmdW5jdGlvbiBkYjpzZXROYW1lKF9jKQpzZWxmLl9fX25hbWU9X2MgZW5kO2Z1bmN0aW9uIGRiOmNoaWxkcmVuKClyZXR1cm4gc2VsZi5fX19jaGlsZHJlbiBlbmQ7ZnVuY3Rpb24gZGI6bnVtQ2hpbGRyZW4oKXJldHVybgojc2VsZi5fX19jaGlsZHJlbiBlbmQKZnVuY3Rpb24gZGI6YWRkQ2hpbGQoX2MpCmlmCnNlbGZbX2M6bmFtZSgpXX49bmlsIHRoZW4gaWYKdHlwZShzZWxmW19jOm5hbWUoKV0ubmFtZSk9PSJmdW5jdGlvbiJ0aGVuIGxvY2FsIGFjPXt9dGFibGUuaW5zZXJ0KGFjLHNlbGZbX2M6bmFtZSgpXSkKc2VsZltfYzpuYW1lKCldPWFjIGVuZAp0YWJsZS5pbnNlcnQoc2VsZltfYzpuYW1lKCldLF9jKWVsc2Ugc2VsZltfYzpuYW1lKCldPV9jIGVuZDt0YWJsZS5pbnNlcnQoc2VsZi5fX19jaGlsZHJlbixfYyllbmQ7ZnVuY3Rpb24gZGI6cHJvcGVydGllcygpcmV0dXJuIHNlbGYuX19fcHJvcHMgZW5kO2Z1bmN0aW9uIGRiOm51bVByb3BlcnRpZXMoKQpyZXR1cm4jc2VsZi5fX19wcm9wcyBlbmQKZnVuY3Rpb24gZGI6YWRkUHJvcGVydHkoX2MsYWMpbG9jYWwgYmM9IkAiLi5fYwppZiBzZWxmW2JjXX49bmlsIHRoZW4gaWYKdHlwZShzZWxmW2JjXSk9PSJzdHJpbmcidGhlbiBsb2NhbCBjYz17fXRhYmxlLmluc2VydChjYyxzZWxmW2JjXSkKc2VsZltiY109Y2MgZW5kCnRhYmxlLmluc2VydChzZWxmW2JjXSxhYyllbHNlIHNlbGZbYmNdPWFjIGVuZAp0YWJsZS5pbnNlcnQoc2VsZi5fX19wcm9wcyx7bmFtZT1fYyx2YWx1ZT1zZWxmW19jXX0pZW5kO3JldHVybiBkYiBlbmQ7bG9jYWwgYmI9e30KZnVuY3Rpb24gYmI6VG9YbWxTdHJpbmcoY2IpY2I9c3RyaW5nLmdzdWIoY2IsIiYiLCImYW1wOyIpCmNiPXN0cmluZy5nc3ViKGNiLCI8IiwiJmx0OyIpY2I9c3RyaW5nLmdzdWIoY2IsIj4iLCImZ3Q7IikKY2I9c3RyaW5nLmdzdWIoY2IsIlwiIiwiJnF1b3Q7IikKY2I9c3RyaW5nLmdzdWIoY2IsIihbXiV3JSYlOyVwJVx0JSBdKSIsZnVuY3Rpb24oZGIpCnJldHVybiBzdHJpbmcuZm9ybWF0KCImI3glWDsiLHN0cmluZy5ieXRlKGRiKSllbmQpcmV0dXJuIGNiIGVuZApmdW5jdGlvbiBiYjpGcm9tWG1sU3RyaW5nKGNiKQpjYj1zdHJpbmcuZ3N1YihjYiwiJiN4KFsleF0rKSU7IixmdW5jdGlvbihkYikKcmV0dXJuIHN0cmluZy5jaGFyKHRvbnVtYmVyKGRiLDE2KSllbmQpCmNiPXN0cmluZy5nc3ViKGNiLCImIyhbMC05XSspJTsiLGZ1bmN0aW9uKGRiKXJldHVybiBzdHJpbmcuY2hhcih0b251bWJlcihkYiwxMCkpZW5kKWNiPXN0cmluZy5nc3ViKGNiLCImcXVvdDsiLCJcIiIpCmNiPXN0cmluZy5nc3ViKGNiLCImYXBvczsiLCInIiljYj1zdHJpbmcuZ3N1YihjYiwiJmd0OyIsIj4iKQpjYj1zdHJpbmcuZ3N1YihjYiwiJmx0OyIsIjwiKWNiPXN0cmluZy5nc3ViKGNiLCImYW1wOyIsIiYiKXJldHVybiBjYiBlbmQ7ZnVuY3Rpb24gYmI6UGFyc2VBcmdzKGNiLGRiKQpzdHJpbmcuZ3N1YihkYiwiKCV3Kyk9KFtcIiddKSguLSklMiIsZnVuY3Rpb24oX2MsYWMsYmMpCmNiOmFkZFByb3BlcnR5KF9jLHNlbGY6RnJvbVhtbFN0cmluZyhiYykpZW5kKWVuZApmdW5jdGlvbiBiYjpQYXJzZVhtbFRleHQoY2IpCmxvY2FsIGRiPXt9bG9jYWwgX2M9YWIoKXRhYmxlLmluc2VydChkYixfYylsb2NhbCBhYyxiYyxjYyxkYyxfZDtsb2NhbCBhZCxiZD0xLDEKd2hpbGUgdHJ1ZSBkbwphYyxiZCxiYyxjYyxkYyxfZD1zdHJpbmcuZmluZChjYiwiPCglLz8pKFsld186XSspKC4tKSglLz8pPiIsYWQpaWYgbm90IGFjIHRoZW4gYnJlYWsgZW5kO2xvY2FsIGRkPXN0cmluZy5zdWIoY2IsYWQsYWMtMSkKaWYgbm90CnN0cmluZy5maW5kKGRkLCJeJXMqJCIpdGhlbgpsb2NhbCBfX2E9KF9jOnZhbHVlKClvciIiKS4uc2VsZjpGcm9tWG1sU3RyaW5nKGRkKWRiWyNkYl06c2V0VmFsdWUoX19hKWVuZAppZiBfZD09Ii8idGhlbiBsb2NhbCBfX2E9YWIoY2Mpc2VsZjpQYXJzZUFyZ3MoX19hLGRjKQpfYzphZGRDaGlsZChfX2EpZWxzZWlmIGJjPT0iInRoZW4gbG9jYWwgX19hPWFiKGNjKXNlbGY6UGFyc2VBcmdzKF9fYSxkYykKdGFibGUuaW5zZXJ0KGRiLF9fYSlfYz1fX2EgZWxzZSBsb2NhbCBfX2E9dGFibGUucmVtb3ZlKGRiKV9jPWRiWyNkYl0KaWYjZGI8MSB0aGVuIGVycm9yKCJYbWxQYXJzZXI6IG5vdGhpbmcgdG8gY2xvc2Ugd2l0aCAiLi4KY2MpZW5kO2lmIF9fYTpuYW1lKCl+PWNjIHRoZW4KZXJyb3IoIlhtbFBhcnNlcjogdHJ5aW5nIHRvIGNsb3NlICIuLl9fYS5uYW1lLi4iIHdpdGggIi4uY2MpZW5kO19jOmFkZENoaWxkKF9fYSllbmQ7YWQ9YmQrMSBlbmQ7bG9jYWwgY2Q9c3RyaW5nLnN1YihjYixhZClpZiNkYj4xIHRoZW4KZXJyb3IoIlhtbFBhcnNlcjogdW5jbG9zZWQgIi4uZGJbI2RiXTpuYW1lKCkpZW5kO3JldHVybiBfYyBlbmQKZnVuY3Rpb24gYmI6bG9hZEZpbGUoY2IsZGIpaWYgbm90IGRiIHRoZW4gZGI9c3lzdGVtLlJlc291cmNlRGlyZWN0b3J5IGVuZApsb2NhbCBfYz1zeXN0ZW0ucGF0aEZvckZpbGUoY2IsZGIpbG9jYWwgYWMsYmM9aW8ub3BlbihfYywiciIpCmlmIGFjIGFuZCBub3QgYmMgdGhlbiBsb2NhbCBjYz1hYzpyZWFkKCIqYSIpCmlvLmNsb3NlKGFjKXJldHVybiBzZWxmOlBhcnNlWG1sVGV4dChjYyksbmlsIGVsc2UgcHJpbnQoYmMpcmV0dXJuIG5pbCBlbmQgZW5kO3JldHVybiBiYiBlbmQKYWFbImxpYnJhcmllcyJdWyJiaWdmb250Il09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJ0SGV4IikKbG9jYWwgYmI9e3siXDMyXDMyXDMyXDEzN1wxNTZcMTQ4XDE1OFwxNTlcMTQ4XDEzNVwxMzVcMTQ0XDE1OVwxMzlcMzJcMTM2XDE1N1wzMlwxNTlcMTM5XDMyXDMyXDE0M1wzMlwzMlwxNDNcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ3XDE0OFwxNTBcMTMxXDE0OFwzMlwzMlwzMlwxNTFcMTQwXDE0OFwxNTFcMTQwXDE0NyIsIlwzMlwzMlwzMlwxNDlcMTMyXDE0OVwxMzZcMTU2XDE0OVwxNDRcMzJcMTMzXDEzOVwxNTlcMTI5XDE0M1wxNTlcMTMzXDE0M1wxNTlcMTMzXDEzOFwzMlwxMzNcMTM4XDMyXDEzM1wzMlwzMlwzMlwzMlwzMlwzMlwxNTBcMTUwXDEyOVwxMzdcMTU2XDEyOVwzMlwzMlwzMlwxMzNcMTMxXDEyOVwxMzNcMTMxXDEzMiIsIlwzMlwzMlwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMzJcMTI5XDMyXDMyXDMyXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwzMlwzMlwzMlwxNDNcMTQzXDE0M1wzMlwzMlwzMlwzMlwzMlwzMlwxMzBcMTI5XDMyXDEzMFwxMzVcMzJcMzJcMzJcMzJcMTMxXDMyXDMyXDEzMVwzMlwxMzEiLCJcMTM5XDE0NFwzMlwzMlwxNDNcMTQ4XDEzNVwxMzBcMTQ0XDE0OVwzMlwxNDlcMTUwXDE1MVwxNDlcMTU4XDE0MFwxMjlcMzJcMzJcMzJcMTM1XDEzMFwxNDRcMTM1XDEzMFwxNDRcMzJcMTQ5XDMyXDMyXDEzOVwzMlwxNTlcMTQ4XDMyXDMyXDMyXDMyXDE1OVwzMlwxNDRcMzJcMTQ4XDMyXDE0N1wxMzFcMTMyIiwiXDE1OVwxMzVcMTI5XDEzMVwxNDNcMTQ5XDE0M1wxMzhcMTQ0XDEzOFwzMlwxMzNcMTMwXDE0OVwxNDlcMTM3XDE1NVwxNDlcMTU5XDE0M1wxNDRcMTQ3XDEzMFwxMzJcMzJcMTQ5XDMyXDE0N1wxMzBcMTMyXDEzMVwxNTlcMTI5XDEzOVwxNTFcMTI5XDE0OFwzMlwzMlwxMzlcMTMxXDEzNVwxMzNcMzJcMTQ0XDEzMFwxNTFcMzIiLCJcMzJcMzJcMzJcMzJcMzJcMzJcMTMwXDEzNVwzMlwxMzBcMzJcMTI5XDMyXDEyOVwxMjlcMTMxXDEzMVwzMlwxMzBcMTMxXDEyOVwxNDBcMTQxXDEzMlwzMlwxMjlcMzJcMzJcMTI5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDEzMVwxMzFcMTI5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyIiwiXDMyXDMyXDMyXDMyXDE0OVwzMlwxNTlcMTU0XDEzM1wxMzNcMTMzXDE0NFwxNTJcMTQxXDEzMlwxMzNcMTUxXDEyOVwxMzZcMTUzXDMyXDMyXDE1NFwzMlwxNTlcMTM0XDEyOVwxMzBcMTM3XDE0NFwxNTlcMzJcMTQ0XDMyXDE0OFwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNTFcMTI5IiwiXDMyXDMyXDMyXDMyXDEzM1wzMlwzMlwzMlwzMlwxNDVcMTQ1XDEzMlwxNDFcMTQwXDEzMlwxNTFcMTI5XDE0NFwxNTBcMTQ2XDEyOVwzMlwzMlwzMlwxMzhcMTQ0XDMyXDMyXDE1OVwxMzNcMTM2XDEzMVwxMzJcMTMxXDE1MVwxMjlcMzJcMTQ0XDMyXDEzMVwxMzFcMTI5XDMyXDE0NFwzMlwxNTFcMTI5XDMyIiwiXDMyXDMyXDMyXDMyXDEyOVwzMlwzMlwzMlwzMlwxMzBcMTMwXDMyXDMyXDEyOVwzMlwxMjlcMzJcMTI5XDEzMFwxMjlcMTI5XDMyXDMyXDMyXDMyXDEzMFwxMjlcMTMwXDEyOVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxMzNcMzJcMzJcMzJcMzJcMzJcMTI5XDMyXDEyOVwzMlwzMiIsIlwxNTBcMTU2XDE0OFwxMzZcMTQ5XDMyXDEzNFwxMzFcMTQ4XDEzNFwxMzFcMTQ4XDE1OVwxMzRcMTQ5XDEzNlwxNDBcMTI5XDE1MlwxMzFcMzJcMTM1XDEzMVwxNDlcMTUwXDEzMVwxNDhcMTUwXDEzMVwxNDhcMzJcMTQ4XDMyXDMyXDE0OFwzMlwzMlwxNTJcMTI5XDE0M1wxNDNcMTQ0XDEzMFwxNTVcMzJcMTM0XDEzMVwxNDgiLCJcMTU3XDEyOVwxNDlcMzJcMTQ5XDMyXDE1MlwxMzFcMTQ0XDE0NFwxMzFcMTQ4XDE0MVwxNDBcMTQ5XDE0NFwzMlwxNDlcMTUxXDEzMVwxNDhcMzJcMTUwXDMyXDE1MFwxMzFcMTQ4XDEzMFwxNTZcMTMzXDMyXDE0NFwzMlwzMlwxNDRcMzJcMTMwXDE1NVwzMlwxNDNcMTQzXDE0NFwzMlwxNTJcMTI5XDMyXDEzNFwzMiIsIlwxMzBcMTMxXDMyXDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMFwxMzFcMzJcMzJcMzJcMTI5XDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwzMlwxMjlcMzJcMTMwXDEzMVwzMlwxMzBcMTI5XDMyXDMyXDEyOVwzMlwzMlwxMzNcMzJcMzJcMzJcMTI5XDMyXDMyXDMyXDEzMFwzMlwzMlwzMlwxMjlcMzIiLCJcMTUwXDE0MFwxNTBcMTM3XDE0MFwxNDhcMTM2XDE0MFwxMzJcMTUwXDEzMVwxMzJcMTUxXDEzMVwxNDhcMTM2XDE0N1wxMjlcMTM2XDE0N1wxMjlcMTUwXDE1NlwxNDVcMTM4XDE0M1wxNDlcMTMwXDE1MVwzMlwzMlwzMlwxNDlcMTM4XDE1MlwxMjlcMTQ5XDMyXDMyXDE1N1wxNTJcMTQ5XDE1N1wxNDRcMTQ5XDE1MFwxMzFcMTQ4IiwiXDE0OVwxNDNcMTQyXDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ0XDE0OVwzMlwxNDlcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMzJcMTQ5XDMyXDE0NFwzMlwxNDlcMTQ5XDEzMFwxNDhcMTQ5XDMyXDMyXDE0OVwzMlwxNDlcMTQ5XDEzMFwxNDlcMTQ5XDMyXDE0OSIsIlwxMzBcMTMxXDEyOVwxMjlcMzJcMTI5XDEzMVwxMzFcMzJcMTMwXDEzMVwzMlwxMzFcMTMxXDMyXDEzMVwxMzFcMTI5XDEyOVwzMlwzMlwxMzBcMTMxXDMyXDEyOVwzMlwxMjlcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEyOVwzMlwxMjlcMTMxXDEzMVwxMjlcMTI5XDMyXDEyOVwxMjlcMzJcMTI5XDEzMFwxMzFcMzIiLCJcMTM2XDE0MFwxMzJcMTUwXDEzMVwxNDhcMTM2XDE0MFwxMzJcMTUzXDE0MFwxMjlcMTMxXDE1MVwxMjlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTM3XDE1MlwxMjlcMTM3XDE1MlwxMjlcMTMxXDE1NlwxMzNcMTQ5XDEzMVwzMlwxNTBcMzJcMzJcMTMwXDE0OFwzMlwxNTJcMTM3XDE0NFwzMlwzMlwzMiIsIlwxNDlcMzJcMzJcMTQ5XDE1OVwxMzNcMTQ5XDMyXDE0OVwxNDRcMzJcMTQ5XDMyXDE0OVwzMlwxNDlcMzJcMTQ5XDE1MFwxNTFcMTI5XDEzOFwxNTVcMTQ5XDE1MFwxMzBcMTQ4XDMyXDE0OVwzMlwxNTJcMTI5XDMyXDE0OVwzMlwzMlwzMlwxNTBcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDMyIiwiXDEyOVwzMlwzMlwxMzBcMTI5XDEyOVwxMjlcMzJcMTI5XDEzMFwxMzFcMzJcMzJcMTI5XDMyXDEzMFwxMzFcMzJcMzJcMTI5XDMyXDEyOVwzMlwxMjlcMTI5XDMyXDEyOVwzMlwxMjlcMzJcMTMxXDEzMVwxMjlcMTMwXDEzMVwzMlwzMlwzMlwxMjlcMTMwXDEzMVwzMlwzMlwzMlwzMlwxNDBcMTQwXDEzMiIsIlwzMlwxNTRcMzJcMTU5XDE0M1wzMlwxNDlcMTQzXDMyXDE1OVwxNDNcMzJcMTU5XDE0NFwxNDlcMTU5XDE0M1wzMlwxNTlcMTM3XDE0NVwxNTlcMTQzXDE0NFwxNDlcMTQzXDMyXDMyXDE0NVwzMlwzMlwzMlwxNDVcMTQ5XDMyXDE0NFwzMlwxNDlcMzJcMTQzXDE1OVwzMlwxNDNcMTQzXDMyXDE1OVwxNDNcMzIiLCJcMzJcMzJcMzJcMTUyXDE0MFwxNDlcMTUxXDMyXDE0OVwxNDlcMzJcMTQ1XDE0OVwxMzBcMTQ5XDE1N1wxNDBcMTMzXDMyXDE0OVwzMlwxNTRcMTQzXDE0OVwxNTFcMzJcMTQ5XDMyXDE0OVwzMlwxNDRcMzJcMTQ5XDE0OVwxNTNcMzJcMzJcMTQ5XDMyXDE0OVwxMzNcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OSIsIlwzMlwzMlwzMlwxMzBcMTMxXDEyOVwxMzFcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMzJcMTI5XDMyXDE0MFwxNDBcMTI5XDEyOVwzMlwxMjlcMzJcMTI5XDMyXDEzN1wxNDBcMTI5XDEzMFwzMlwxMjlcMzJcMTMwXDMyXDEyOVwzMlwxMjlcMTI5XDMyXDEyOVwxMzBcMTMxXDMyIiwiXDE0NFwxNDNcMzJcMTU5XDE0NFwxNDRcMTQ0XDE0M1wzMlwxNTlcMTQzXDE0NFwxNTlcMTM4XDMyXDE0NFwzMlwxNDRcMTQ0XDMyXDE0NFwxNDRcMzJcMTQ0XDE0NFwzMlwxNDRcMTQ0XDMyXDE0NFwxNDNcMTQzXDE0NFwzMlwxNTBcMTI5XDMyXDE0OVwzMlwxMzBcMTUwXDMyXDEzNFwxMzdcMTM0XDEzNFwxMzFcMTQ4IiwiXDEzNlwxNDNcMTMzXDE1NFwxNDFcMTQ5XDE1MVwzMlwxMjlcMTM3XDE0MFwxNDRcMzJcMTQ5XDMyXDE0OVwzMlwxNDlcMTU0XDE1OVwxMzNcMTQ5XDE0OFwxNDlcMTU3XDE1M1wzMlwxNTRcMTQzXDE0OVwxNTlcMTM0XDMyXDEzMFwxNDhcMzJcMzJcMTQ5XDMyXDMyXDE1MVwxMjlcMzJcMzJcMzJcMzJcMTM0XDMyIiwiXDEzM1wzMlwzMlwzMlwzMlwxMzNcMTI5XDMyXDMyXDEzMVwxMzFcMzJcMzJcMTMwXDMyXDEzMFwxMzFcMTI5XDMyXDEyOVwzMlwxMzBcMTMxXDEyOVwxMjlcMzJcMTI5XDE0MFwxNDBcMTI5XDEzMVwxMzFcMTI5XDMyXDEzMFwxMjlcMzJcMTI5XDMyXDEzMFwxMjlcMzJcMzJcMzJcMzJcMzJcMTI5XDMyIiwiXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzIiLCJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMiIsIlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMiIsIlwzMlwzMlwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyIiwiXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzIiLCJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyIiwiXDMyXDMyXDMyXDMyXDE0NVwzMlwxNTlcMTM5XDMyXDE1MVwxMzFcMTMyXDE1NVwxNDNcMTMyXDEzNFwxMzVcMTQ1XDMyXDE0OVwzMlwxNThcMTQwXDEyOVwxMzBcMTMwXDMyXDE1MlwxNDdcMTU1XDE1N1wxMzRcMzJcMzJcMTQ0XDE0NFwzMlwzMlwzMlwzMlwzMlwzMlwxNTJcMTMxXDE1NVwxMzFcMTMxXDEyOSIsIlwzMlwzMlwzMlwzMlwxNDlcMzJcMTQ5XDMyXDE0NVwxNDhcMTMxXDMyXDE0OVwzMlwxNDlcMTQwXDE1N1wxMzJcMzJcMTQ4XDMyXDEzN1wxNTVcMTQ5XDMyXDMyXDMyXDE0OVwxNTRcMTQ5XDEzN1wxNDJcMzJcMTUzXDE1M1wzMlwxMzFcMTMxXDE0OVwxMzFcMTMxXDEyOVwxNDlcMTM1XDE0NVwzMlwzMlwzMiIsIlwzMlwzMlwzMlwzMlwxMjlcMzJcMTMwXDEzNVwzMlwxMzFcMTMxXDEyOVwxMzRcMTMxXDEzMlwzMlwxMjlcMzJcMzJcMTI5XDMyXDEzMVwxMzFcMzJcMzJcMzJcMzJcMTMwXDEzMVwxMjlcMzJcMzJcMzJcMzJcMTI5XDEyOVwzMlwzMlwzMlwzMlwzMlwzMlwxMzBcMTMxXDEyOVwzMlwzMlwzMiIsIlwxNTBcMTUwXDMyXDMyXDE0OFwzMlwxMzRcMzJcMzJcMTMyXDMyXDMyXDEzNFwzMlwzMlwxNDRcMzJcMTQ0XDE1MFwxNTFcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDE0NVwzMlwzMlwxNTJcMTQwXDE0NFwxNDRcMTQ0XDMyXDEzM1wxNTFcMTI5XDEzM1wxNTFcMTI5XDEzMlwxNTFcMTI5XDMyXDE0NVwzMiIsIlwxMzBcMTI5XDMyXDEzMVwxNTFcMTI5XDE0MVwzMlwzMlwxNDJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDE0OVwxMzBcMTQ5XDE0OVwzMlwxNDNcMzJcMzJcMzJcMzJcMTQyXDEzMlwzMlwxNTRcMTQzXDEzM1wxNTdcMTUzXDEzMlwxNTFcMTUwXDE0OFwxNTFcMTU4XDEzMlwxNTFcMTUwXDE0OFwxNDRcMTMwXDE0OCIsIlwzMlwzMlwzMlwxNDBcMTQwXDEzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNTFcMTMxXDMyXDMyXDEyOVwxMjlcMzJcMzJcMzJcMzJcMTM0XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDEyOVwxMjlcMzJcMTI5XDMyXDEyOVwxMjlcMTMwXDEyOVwxMjlcMzJcMTI5XDEzMFwxMzFcMzIiLCJcMTU2XDE0M1wzMlwxNTlcMTQxXDEyOVwxNTNcMTQwXDEzMlwxNTNcMTM3XDMyXDE1N1wxNDFcMzJcMTU5XDE0MlwzMlwxNTBcMTUxXDEyOVwxNTBcMTMxXDEzMlwxNDBcMTQzXDE0NFwxNDNcMTQxXDE0NVwxMzdcMTQwXDE0OFwxNDFcMTQxXDE0NFwxNTdcMTQyXDMyXDE1OVwxNDBcMzJcMTUxXDEzNFwzMlwxNTdcMTQxXDMyIiwiXDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1MVwxNTFcMzJcMTU0XDE0M1wxMzJcMTU3XDE0MFwzMlwxNTdcMTQwXDMyXDE1N1wxNDBcMzJcMTU3XDE0MFwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzIiLCJcMTI5XDMyXDEyOVwxMjlcMzJcMTI5XDEyOVwzMlwxMjlcMTI5XDMyXDEyOVwxMjlcMzJcMTI5XDEyOVwzMlwxMjlcMTI5XDEzMVwxMjlcMzJcMTM0XDMyXDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzIiLCJcMTUxXDEzMVwxNDhcMTUyXDEzN1wxNDVcMTU1XDE0MFwxNDRcMTUyXDE0MlwxNDVcMTUzXDE0MFwxMzJcMTUzXDEzN1wzMlwxNTRcMTQyXDE0NFwxNTVcMTU5XDEzMlwxNTBcMTU2XDE0OFwxNDdcMzJcMTQ0XDE0NFwxMzBcMTQ1XDEzNlwxMzdcMzJcMTQ2XDEzMFwxNDRcMTQ0XDEzMFwxNDVcMTMwXDEzNlwzMlwxNTFcMTQwXDEzMiIsIlwxNTFcMzJcMTQ5XDE1MVwxNTVcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNTJcMTM3XDE0NFwxNTdcMTI5XDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDEzMFwxNTBcMzJcMzJcMTU3XDEyOVwxNDlcMzJcMTQ5IiwiXDEzMVwxMzFcMzJcMTI5XDMyXDEyOVwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMzJcMzJcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDMyXDEyOVwzMlwxMzBcMTMxXDMyXDEzM1wxMzFcMzIiLCJcMTU2XDE0M1wzMlwxNTlcMTQxXDEyOVwxNTNcMTQwXDEzMlwxNTNcMTM3XDMyXDE1N1wxNDFcMzJcMTU5XDE0MlwzMlwxNTlcMTU5XDE0NFwxNTJcMTQwXDE0NFwxNTZcMTQzXDMyXDE1OVwxNDFcMTI5XDE1M1wxNDBcMTMyXDE1N1wxNDFcMzJcMTMwXDE0NVwzMlwzMlwxNDdcMzJcMTM2XDE1M1wzMlwxMzBcMTQ2XDMyIiwiXDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE0OVwxNTdcMTM0XDE1NFwxNDNcMTMyXDE1N1wxNDBcMTMzXDE1N1wxNDBcMTMzXDE1N1wxNDBcMTMzXDE1N1wxNDBcMTMzXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMiIsIlwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMwXDEzMVwzMlwxMzRcMzJcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMzJcMTI5XDMyXDMyXDEyOVwzMlwzMlwxMjlcMzJcMzJcMTI5XDMyIiwiXDE1OVwxMzRcMTQ0XDEzN1wxMzdcMzJcMTU2XDE0M1wzMlwxNTlcMTQxXDEyOVwxNTNcMTQwXDEzMlwxNTNcMTM3XDMyXDE1N1wxNDFcMzJcMzJcMTMyXDMyXDE1OVwxNDNcMzJcMTQ3XDMyXDE0NFwxNDRcMTMwXDE0NVwxMzZcMTM3XDMyXDE0NlwxMzBcMTQ0XDE0NFwxMzBcMTQ1XDEzMFwxMzhcMzJcMTQ2XDEzMFwxNDQiLCJcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxMzFcMTQ3XDEyOVwxMzhcMTM0XDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE1NFwxNDNcMTQ5XDMyXDE1N1wxMjlcMTU0XDE0M1wxNDkiLCJcMTMwXDEzMVwzMlwxMjlcMzJcMTI5XDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwzMlwzMlwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMTI5XDEzMFwxMzFcMTI5XDEzMFwxMzFcMTI5XDEzMFwxMzFcMTI5XDE0MFwxNDBcMTI5XDEzMFwxMzFcMzJcMTQwXDE0MFwxMjkifSx7IjAwMDExMDAwMDExMDExMDAwMDExMDAxMDEwMTAwMDAwMDAxMDAwMDAwMDEwMDEwMSIsIjAwMDAwMDExMDExMDAwMDAwMDAwMDAxMDEwMTAwMDAwMDAxMDAwMDAwMDEwMDEwMSIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjEwMDAxMDExMDEwMDAwMDAxMDAwMDExMDExMDAwMDAxMDEwMDAwMDEwMDAwMDExMCIsIjAwMDAwMDExMDAwMDAwMDAxMDExMDExMDAwMDExMDAwMDAwMDAwMDAwMDExMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDExMDExMDAwMDAxMDAwMDAwMDEwMDAwMDEwMDAwMDAwMDAwMDAwMDAxMCIsIjAwMDAwMDAwMDExMDExMDEwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDAwMDAwMDAwMDEwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAxMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDExMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMTExMDExMDAwMDAwMDEwMDEwMDAxMDExMDAwMDAwMDEwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDAwMDExMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDEwMDEwMDAxMDAwMDAwMCIsIjAwMDAxMDAwMDAwMDAwMDAwMDExMDExMDAwMDAwMDAwMDEwMDAxMDAxMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDExMDAxMDExMDEwMDExMDExMDExMDAxMDAwMDAwMDEwMDAwMDExMDExMDExMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDEwMDAxMDExMDExMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAxMDAwMDAwMCIsIjExMDExMDAwMDAwMDAwMDAwMDExMDAwMDExMDExMDEwMDAwMDAwMDAxMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMSIsIjAwMDAwMDAwMDAwMDEwMDEwMDEwMDEwMDAxMTAxMTAxMTAxMTExMTExMTExMTExMSIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMSIsIjAwMDAwMDAwMDAwMDEwMDEwMDEwMDEwMDAxMTAxMTAxMTAxMTExMTExMTExMTExMSIsIjEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMCIsIjAwMDAwMDExMDEwMDExMDExMDAwMDAxMDAwMDAxMTExMDAwMDAwMDAwMDAxMTAwMCIsIjAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAwMDAxMTAwMDExMDAwMDAwMDAwMTAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDAwMDEwMDEwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAxMDAxMDExMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDExMDExMDExMDExMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDExMDExMDExMDExMDExMDAwMDAwMDExMDExMDExMDExMDExMDExMDExMDExMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDExMDExMDAwMDExMDAxMDAwMDAwMDAwMDAwMDAwMDAxMDAxMCIsIjAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDExMDExMDExMDExMDExMDExMDAwMDExMDExMDExMDExMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDExMDExMDExMDExMDExMDExMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAxMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDExMDAwMDExMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJ9fWxvY2FsIGNiPXt9bG9jYWwgZGI9e30KZG8gbG9jYWwgYmM9MDtsb2NhbCBjYz0jYmJbMV1sb2NhbCBkYz0jYmJbMV1bMV0KZm9yIGk9MSxjYywzIGRvCmZvciBqPTEsZGMsMyBkbwpsb2NhbCBfZD1zdHJpbmcuY2hhcihiYylsb2NhbCBhZD17fWFkWzFdPWJiWzFdW2ldOnN1YihqLGorMikKYWRbMl09YmJbMV1baSsxXTpzdWIoaixqKzIpYWRbM109YmJbMV1baSsyXTpzdWIoaixqKzIpbG9jYWwgYmQ9e31iZFsxXT1iYlsyXVtpXTpzdWIoaiwKaisyKWJkWzJdPWJiWzJdW2krMV06c3ViKGosaisyKWJkWzNdPWJiWzJdWwppKzJdOnN1YihqLGorMilkYltfZF09e2FkLGJkfWJjPWJjKzEgZW5kIGVuZDtjYlsxXT1kYiBlbmQKbG9jYWwgZnVuY3Rpb24gX2MoYmMsY2MpbG9jYWwgZGM9e1siMCJdPSIxIixbIjEiXT0iMCJ9aWYgYmM8PSNjYiB0aGVuIHJldHVybiB0cnVlIGVuZApmb3IgZj0jY2IrMSxiYyBkbyBsb2NhbCBfZD17fWxvY2FsIGFkPWNiWwpmLTFdCmZvciBjaGFyPTAsMjU1IGRvIGxvY2FsIGJkPXN0cmluZy5jaGFyKGNoYXIpbG9jYWwgY2Q9e31sb2NhbCBkZD17fQpsb2NhbCBfX2E9YWRbYmRdWzFdbG9jYWwgYV9hPWFkW2JkXVsyXQpmb3IgaT0xLCNfX2EgZG8gbG9jYWwgYl9hLGNfYSxkX2EsX2FhLGFhYSxiYWE9e30se30se30se30se30se30KZm9yIGo9MSwjX19hWzFdZG8KbG9jYWwgY2FhPWRiW19fYVtpXTpzdWIoaixqKV1bMV10YWJsZS5pbnNlcnQoYl9hLGNhYVsxXSkKdGFibGUuaW5zZXJ0KGNfYSxjYWFbMl0pdGFibGUuaW5zZXJ0KGRfYSxjYWFbM10pCmxvY2FsIGRhYT1kYltfX2FbaV06c3ViKGosaildWzJdCmlmIGFfYVtpXTpzdWIoaixqKT09IjEidGhlbgp0YWJsZS5pbnNlcnQoX2FhLChkYWFbMV06Z3N1YigiWzAxXSIsZGMpKSkKdGFibGUuaW5zZXJ0KGFhYSwoZGFhWzJdOmdzdWIoIlswMV0iLGRjKSkpCnRhYmxlLmluc2VydChiYWEsKGRhYVszXTpnc3ViKCJbMDFdIixkYykpKWVsc2UgdGFibGUuaW5zZXJ0KF9hYSxkYWFbMV0pCnRhYmxlLmluc2VydChhYWEsZGFhWzJdKXRhYmxlLmluc2VydChiYWEsZGFhWzNdKWVuZCBlbmQ7dGFibGUuaW5zZXJ0KGNkLHRhYmxlLmNvbmNhdChiX2EpKQp0YWJsZS5pbnNlcnQoY2QsdGFibGUuY29uY2F0KGNfYSkpdGFibGUuaW5zZXJ0KGNkLHRhYmxlLmNvbmNhdChkX2EpKQp0YWJsZS5pbnNlcnQoZGQsdGFibGUuY29uY2F0KF9hYSkpdGFibGUuaW5zZXJ0KGRkLHRhYmxlLmNvbmNhdChhYWEpKQp0YWJsZS5pbnNlcnQoZGQsdGFibGUuY29uY2F0KGJhYSkpZW5kO19kW2JkXT17Y2QsZGR9aWYgY2MgdGhlbiBjYz0iRm9udCIuLmYuLiJZZWxkIi4uY2hhcgpvcy5xdWV1ZUV2ZW50KGNjKW9zLnB1bGxFdmVudChjYyllbmQgZW5kO2NiW2ZdPV9kIGVuZDtyZXR1cm4gdHJ1ZSBlbmQKbG9jYWwgZnVuY3Rpb24gYWMoYmMsY2MsZGMsX2QsYWQpCmlmIG5vdCB0eXBlKGNjKT09InN0cmluZyJ0aGVuIGVycm9yKCJOb3QgYSBTdHJpbmciLDMpZW5kCmxvY2FsIGJkPXR5cGUoZGMpPT0ic3RyaW5nImFuZCBkYzpzdWIoMSwxKW9yIGFiW2RjXW9yCmVycm9yKCJXcm9uZyBGcm9udCBDb2xvciIsMykKbG9jYWwgY2Q9dHlwZShfZCk9PSJzdHJpbmciYW5kIF9kOnN1YigxLDEpb3IgYWJbX2Rdb3IKZXJyb3IoIldyb25nIEJhY2sgQ29sb3IiLDMpaWYoY2JbYmNdPT1uaWwpdGhlbiBfYygzLGZhbHNlKWVuZDtsb2NhbCBkZD1jYltiY11vcgplcnJvcigiV3JvbmcgZm9udCBzaXplIHNlbGVjdGVkIiwzKWlmIGNjPT0iInRoZW4KcmV0dXJue3siIn0seyIifSx7IiJ9fWVuZDtsb2NhbCBfX2E9e30KZm9yIGJhYSBpbiBjYzpnbWF0Y2goJy4nKWRvIHRhYmxlLmluc2VydChfX2EsYmFhKWVuZDtsb2NhbCBhX2E9e31sb2NhbCBiX2E9I2RkW19fYVsxXV1bMV0KZm9yIG5MaW5lPTEsYl9hIGRvIGxvY2FsIGJhYT17fQpmb3IgaT0xLCNfX2EgZG8gYmFhW2ldPWRkW19fYVtpXV1hbmQKZGRbX19hW2ldXVsxXVtuTGluZV1vciIiZW5kO2FfYVtuTGluZV09dGFibGUuY29uY2F0KGJhYSllbmQ7bG9jYWwgY19hPXt9bG9jYWwgZF9hPXt9bG9jYWwgX2FhPXtbIjAiXT1iZCxbIjEiXT1jZH1sb2NhbCBhYWE9e1siMCJdPWNkLFsiMSJdPWJkfQpmb3IgbkxpbmU9MSxiX2EgZG8KbG9jYWwgYmFhPXt9bG9jYWwgY2FhPXt9CmZvciBpPTEsI19fYSBkbwpsb2NhbCBkYWE9ZGRbX19hW2ldXWFuZCBkZFtfX2FbaV1dWzJdW25MaW5lXW9yIiIKYmFhW2ldPWRhYTpnc3ViKCJbMDFdIiwKYWQgYW5ke1siMCJdPWRjOnN1YihpLGkpLFsiMSJdPV9kOnN1YihpLGkpfW9yIF9hYSkKY2FhW2ldPWRhYTpnc3ViKCJbMDFdIiwKYWQgYW5ke1siMCJdPV9kOnN1YihpLGkpLFsiMSJdPWRjOnN1YihpLGkpfW9yIGFhYSllbmQ7Y19hW25MaW5lXT10YWJsZS5jb25jYXQoYmFhKQpkX2FbbkxpbmVdPXRhYmxlLmNvbmNhdChjYWEpZW5kO3JldHVybnthX2EsY19hLGRfYX1lbmQ7cmV0dXJuIGFjIGVuZAphYVsibGlicmFyaWVzIl1bImJhc2FsdE1vbiJdPWZ1bmN0aW9uKC4uLikKbG9jYWwgYWI9e1tjb2xvcnMud2hpdGVdPSIwIixbY29sb3JzLm9yYW5nZV09IjEiLFtjb2xvcnMubWFnZW50YV09IjIiLFtjb2xvcnMubGlnaHRCbHVlXT0iMyIsW2NvbG9ycy55ZWxsb3ddPSI0IixbY29sb3JzLmxpbWVdPSI1IixbY29sb3JzLnBpbmtdPSI2IixbY29sb3JzLmdyYXldPSI3IixbY29sb3JzLmxpZ2h0R3JheV09IjgiLFtjb2xvcnMuY3lhbl09IjkiLFtjb2xvcnMucHVycGxlXT0iYSIsW2NvbG9ycy5ibHVlXT0iYiIsW2NvbG9ycy5icm93bl09ImMiLFtjb2xvcnMuZ3JlZW5dPSJkIixbY29sb3JzLnJlZF09ImUiLFtjb2xvcnMuYmxhY2tdPSJmIn1sb2NhbCBiYixjYixkYixfYz10eXBlLHN0cmluZy5sZW4sc3RyaW5nLnJlcCxzdHJpbmcuc3ViCnJldHVybgpmdW5jdGlvbihhYylsb2NhbCBiYz17fQpmb3IgX2JhLGFiYSBpbiBwYWlycyhhYylkbwpiY1tfYmFdPXt9CmZvciBiYmEsY2JhIGluIHBhaXJzKGFiYSlkbyBsb2NhbCBkYmE9cGVyaXBoZXJhbC53cmFwKGNiYSlpZihkYmE9PW5pbCl0aGVuCmVycm9yKCJVbmFibGUgdG8gZmluZCBtb25pdG9yICIuLmNiYSllbmQ7YmNbX2JhXVtiYmFdPWRiYQpiY1tfYmFdW2JiYV0ubmFtZT1jYmEgZW5kIGVuZDtsb2NhbCBjYyxkYyxfZCxhZCxiZCxjZCxkZCxfX2E9MSwxLDEsMSwwLDAsMCwwO2xvY2FsIGFfYSxiX2E9ZmFsc2UsMQpsb2NhbCBjX2EsZF9hPWNvbG9ycy53aGl0ZSxjb2xvcnMuYmxhY2sKbG9jYWwgZnVuY3Rpb24gX2FhKClsb2NhbCBfYmEsYWJhPTAsMApmb3IgYmJhLGNiYSBpbiBwYWlycyhiYylkbyBsb2NhbCBkYmEsX2NhPTAsMApmb3IgYWNhLGJjYSBpbiBwYWlycyhjYmEpZG8gbG9jYWwgY2NhLGRjYT1iY2EuZ2V0U2l6ZSgpCmRiYT1kYmErY2NhO19jYT1kY2E+X2NhIGFuZCBkY2Egb3IgX2NhIGVuZDtfYmE9X2JhPmRiYSBhbmQgX2JhIG9yIGRiYTthYmE9YWJhK19jYSBlbmQ7ZGQsX19hPV9iYSxhYmEgZW5kO19hYSgpCmxvY2FsIGZ1bmN0aW9uIGFhYSgpbG9jYWwgX2JhPTA7bG9jYWwgYWJhLGJiYT0wLDAKZm9yIGNiYSxkYmEgaW4gcGFpcnMoYmMpZG8gbG9jYWwgX2NhPTA7bG9jYWwgYWNhPTAKZm9yIGJjYSxjY2EgaW4gcGFpcnMoZGJhKWRvCmxvY2FsIGRjYSxfZGE9Y2NhLmdldFNpemUoKWlmKGNjLV9jYT49MSlhbmQoY2MtX2NhPD1kY2EpdGhlbiBhYmE9YmNhIGVuZDtjY2Euc2V0Q3Vyc29yUG9zKApjYy1fY2EsZGMtX2JhKV9jYT1fY2ErZGNhCmlmKGFjYTxfZGEpdGhlbiBhY2E9X2RhIGVuZCBlbmQ7aWYoZGMtX2JhPj0xKWFuZChkYy1fYmE8PWFjYSl0aGVuIGJiYT1jYmEgZW5kCl9iYT1fYmErYWNhIGVuZDtfZCxhZD1hYmEsYmJhIGVuZDthYWEoKQpsb2NhbCBmdW5jdGlvbiBiYWEoX2JhLC4uLilsb2NhbCBhYmE9ey4uLn1yZXR1cm4KZnVuY3Rpb24oKWZvciBiYmEsY2JhIGluIHBhaXJzKGJjKWRvIGZvciBkYmEsX2NhIGluIHBhaXJzKGNiYSlkbwpfY2FbX2JhXSh0YWJsZS51bnBhY2soYWJhKSllbmQgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gY2FhKCliYWEoInNldEN1cnNvckJsaW5rIixmYWxzZSkoKQppZiBub3QoYV9hKXRoZW4gcmV0dXJuIGVuZDtpZihiY1thZF09PW5pbCl0aGVuIHJldHVybiBlbmQ7bG9jYWwgX2JhPWJjW2FkXVtfZF0KaWYoX2JhPT1uaWwpdGhlbiByZXR1cm4gZW5kO19iYS5zZXRDdXJzb3JCbGluayhhX2EpZW5kCmxvY2FsIGZ1bmN0aW9uIGRhYShfYmEsYWJhLGJiYSlpZihiY1thZF09PW5pbCl0aGVuIHJldHVybiBlbmQ7bG9jYWwgY2JhPWJjW2FkXVtfZF0KaWYoY2JhPT1uaWwpdGhlbiByZXR1cm4gZW5kO2NiYS5ibGl0KF9iYSxhYmEsYmJhKWxvY2FsIGRiYSxfY2E9Y2JhLmdldFNpemUoKQppZgooY2IoX2JhKStjYz5kYmEpdGhlbiBsb2NhbCBhY2E9YmNbYWRdW19kKzFdaWYoYWNhfj1uaWwpdGhlbiBhY2EuYmxpdChfYmEsYWJhLGJiYSlfZD1fZCsxO2NjPWNjKwpjYihfYmEpZW5kIGVuZDthYWEoKWVuZApyZXR1cm4Ke2NsZWFyPWJhYSgiY2xlYXIiKSxzZXRDdXJzb3JCbGluaz1mdW5jdGlvbihfYmEpYV9hPV9iYTtjYWEoKWVuZCxnZXRDdXJzb3JCbGluaz1mdW5jdGlvbigpcmV0dXJuIGFfYSBlbmQsZ2V0Q3Vyc29yUG9zPWZ1bmN0aW9uKClyZXR1cm4gY2MsZGMgZW5kLHNldEN1cnNvclBvcz1mdW5jdGlvbihfYmEsYWJhKQpjYyxkYz1fYmEsYWJhO2FhYSgpY2FhKCllbmQsc2V0VGV4dFNjYWxlPWZ1bmN0aW9uKF9iYSkKYmFhKCJzZXRUZXh0U2NhbGUiLF9iYSkoKV9hYSgpYWFhKCliX2E9X2JhIGVuZCxnZXRUZXh0U2NhbGU9ZnVuY3Rpb24oKXJldHVybiBiX2EgZW5kLGJsaXQ9ZnVuY3Rpb24oX2JhLGFiYSxiYmEpCmRhYShfYmEsYWJhLGJiYSllbmQsd3JpdGU9ZnVuY3Rpb24oX2JhKV9iYT10b3N0cmluZyhfYmEpbG9jYWwgYWJhPWNiKF9iYSkKZGFhKF9iYSxkYihhYltjX2FdLGFiYSksZGIoYWJbZF9hXSxhYmEpKWVuZCxnZXRTaXplPWZ1bmN0aW9uKClyZXR1cm4gZGQsX19hIGVuZCxzZXRCYWNrZ3JvdW5kQ29sb3I9ZnVuY3Rpb24oX2JhKQpiYWEoInNldEJhY2tncm91bmRDb2xvciIsX2JhKSgpZF9hPV9iYSBlbmQsc2V0VGV4dENvbG9yPWZ1bmN0aW9uKF9iYSkKYmFhKCJzZXRUZXh0Q29sb3IiLF9iYSkoKWNfYT1fYmEgZW5kLGNhbGN1bGF0ZUNsaWNrPWZ1bmN0aW9uKF9iYSxhYmEsYmJhKWxvY2FsIGNiYT0wCmZvciBkYmEsX2NhIGluIHBhaXJzKGJjKWRvIGxvY2FsIGFjYT0wO2xvY2FsIGJjYT0wCmZvciBjY2EsZGNhIGluIHBhaXJzKF9jYSlkbwpsb2NhbCBfZGEsYWRhPWRjYS5nZXRTaXplKClpZihkY2EubmFtZT09X2JhKXRoZW4gcmV0dXJuIGFiYSthY2EsYmJhK2NiYSBlbmQKYWNhPWFjYStfZGE7aWYoYWRhPmJjYSl0aGVuIGJjYT1hZGEgZW5kIGVuZDtjYmE9Y2JhK2JjYSBlbmQ7cmV0dXJuIGFiYSxiYmEgZW5kfWVuZCBlbmQKYWFbImxpYnJhcmllcyJdWyJwcm9jZXNzIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPXt9bG9jYWwgYmI9e31sb2NhbCBjYj0wCmxvY2FsIGRiPWRvZmlsZSgicm9tL21vZHVsZXMvbWFpbi9jYy9yZXF1aXJlLmx1YSIpLm1ha2UKZnVuY3Rpb24gYmI6bmV3KF9jLGFjLGJjLC4uLilsb2NhbCBjYz17Li4ufQpsb2NhbCBkYz1zZXRtZXRhdGFibGUoe3BhdGg9X2N9LHtfX2luZGV4PXNlbGZ9KWRjLndpbmRvdz1hYzthYy5jdXJyZW50PXRlcm0uY3VycmVudDthYy5yZWRpcmVjdD10ZXJtLnJlZGlyZWN0CmRjLnByb2Nlc3NJZD1jYgppZih0eXBlKF9jKT09InN0cmluZyIpdGhlbgpkYy5jb3JvdXRpbmU9Y29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbigpCmxvY2FsIF9kPXNoZWxsLnJlc29sdmVQcm9ncmFtKF9jKWxvY2FsIGFkPXNldG1ldGF0YWJsZShiYyx7X19pbmRleD1fRU5WfSlhZC5zaGVsbD1zaGVsbAphZC5iYXNhbHRQcm9ncmFtPXRydWU7YWQucmVxdWlyZSxhZC5wYWNrYWdlPWRiKGFkLGZzLmdldERpcihfZCkpCmlmKGZzLmV4aXN0cyhfZCkpdGhlbgpsb2NhbCBiZD1mcy5vcGVuKF9kLCJyIilsb2NhbCBjZD1iZC5yZWFkQWxsKCliZC5jbG9zZSgpbG9jYWwgZGQ9bG9hZChjZCxfYywiYnQiLGFkKWlmKGRkfj1uaWwpdGhlbiByZXR1cm4KZGQodGFibGUudW5wYWNrKGNjKSllbmQgZW5kIGVuZCllbHNlaWYodHlwZShfYyk9PSJmdW5jdGlvbiIpdGhlbgpkYy5jb3JvdXRpbmU9Y29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbigpCl9jKHRhYmxlLnVucGFjayhjYykpZW5kKWVsc2UgcmV0dXJuIGVuZDthYltjYl09ZGM7Y2I9Y2IrMTtyZXR1cm4gZGMgZW5kCmZ1bmN0aW9uIGJiOnJlc3VtZShfYywuLi4pbG9jYWwgYWM9dGVybS5jdXJyZW50KCl0ZXJtLnJlZGlyZWN0KHNlbGYud2luZG93KQppZigKc2VsZi5maWx0ZXJ+PW5pbCl0aGVuIGlmKF9jfj1zZWxmLmZpbHRlcil0aGVuIHJldHVybiBlbmQ7c2VsZi5maWx0ZXI9bmlsIGVuZDtsb2NhbCBiYyxjYz1jb3JvdXRpbmUucmVzdW1lKHNlbGYuY29yb3V0aW5lLF9jLC4uLilpZiBiYyB0aGVuCnNlbGYuZmlsdGVyPWNjIGVsc2UgcHJpbnRFcnJvcihjYyllbmQ7dGVybS5yZWRpcmVjdChhYykKcmV0dXJuIGJjLGNjIGVuZApmdW5jdGlvbiBiYjppc0RlYWQoKQppZihzZWxmLmNvcm91dGluZX49bmlsKXRoZW4KaWYKKGNvcm91dGluZS5zdGF0dXMoc2VsZi5jb3JvdXRpbmUpPT0iZGVhZCIpdGhlbiB0YWJsZS5yZW1vdmUoYWIsc2VsZi5wcm9jZXNzSWQpcmV0dXJuIHRydWUgZW5kIGVsc2UgcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQKZnVuY3Rpb24gYmI6Z2V0U3RhdHVzKClpZihzZWxmLmNvcm91dGluZX49bmlsKXRoZW4KcmV0dXJuIGNvcm91dGluZS5zdGF0dXMoc2VsZi5jb3JvdXRpbmUpZW5kO3JldHVybiBuaWwgZW5kCmZ1bmN0aW9uIGJiOnN0YXJ0KCljb3JvdXRpbmUucmVzdW1lKHNlbGYuY29yb3V0aW5lKWVuZDtyZXR1cm4gYmIgZW5kCmFhWyJsaWJyYXJpZXMiXVsiYmFzYWx0RXZlbnQiXT1mdW5jdGlvbiguLi4pCnJldHVybgpmdW5jdGlvbigpbG9jYWwgYWI9e31sb2NhbCBiYj17fQpsb2NhbCBjYj17cmVnaXN0ZXJFdmVudD1mdW5jdGlvbihkYixfYyxhYylpZihhYltfY109PW5pbCl0aGVuIGFiW19jXT17fQpiYltfY109MSBlbmQ7YWJbX2NdW2JiW19jXV09YWM7YmJbX2NdPWJiW19jXSsxO3JldHVybgpiYltfY10tMSBlbmQscmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZGIsX2MsYWMpYWJbX2NdW2FjW19jXV09Cm5pbCBlbmQsc2VuZEV2ZW50PWZ1bmN0aW9uKGRiLF9jLC4uLilsb2NhbCBhYwppZihhYltfY11+PW5pbCl0aGVuIGZvciBiYyxjYyBpbiBwYWlycyhhYltfY10pZG8KbG9jYWwgZGM9Y2MoLi4uKWlmKGRjPT1mYWxzZSl0aGVuIGFjPWRjIGVuZCBlbmQgZW5kO3JldHVybiBhYyBlbmR9Y2IuX19pbmRleD1jYjtyZXR1cm4gY2IgZW5kIGVuZAphYVsibGlicmFyaWVzIl1bImJpbWciXT1mdW5jdGlvbiguLi4pbG9jYWwgYWIsYmI9c3RyaW5nLnN1YixzdHJpbmcucmVwCmxvY2FsIGZ1bmN0aW9uIGNiKGRiLF9jKWxvY2FsIGFjLGJjPTAsMApsb2NhbCBjYyxkYyxfZD17fSx7fSx7fWxvY2FsIGFkLGJkPTEsMTtsb2NhbCBjZD17fQpsb2NhbCBmdW5jdGlvbiBkZCgpCmZvciB5PTEsYmMgZG8gaWYoY2NbeV09PW5pbCl0aGVuIGNjW3ldPWJiKCIgIixhYyllbHNlIGNjW3ldPWNjW3ldLi4KYmIoIiAiLGFjLSNjY1t5XSllbmQ7aWYKKGRjW3ldPT1uaWwpdGhlbiBkY1t5XT1iYigiMCIsYWMpZWxzZQpkY1t5XT1kY1t5XS4uYmIoIjAiLGFjLSNkY1t5XSllbmQKaWYoX2RbeV09PW5pbCl0aGVuIF9kW3ldPWJiKCJmIixhYyllbHNlIF9kW3ldPQpfZFt5XS4uYmIoImYiLGFjLSNfZFt5XSllbmQgZW5kIGVuZApsb2NhbCBfX2E9ZnVuY3Rpb24oZF9hLF9hYSxhYWEpYWQ9X2FhIG9yIGFkO2JkPWFhYSBvciBiZAppZihjY1tiZF09PW5pbCl0aGVuIGNjW2JkXT1iYigiICIsYWQtMSkuLmRfYS4uCmJiKCIgIixhYy0gKCNkX2ErYWQpKWVsc2UgY2NbYmRdPQphYihjY1tiZF0sMSxhZC0xKS4uCmJiKCIgIixhZC0jY2NbYmRdKS4uZF9hLi5hYihjY1tiZF0sYWQrI2RfYSxhYyllbmQ7aWYoI2NjW2JkXT5hYyl0aGVuIGFjPSNjY1tiZF1lbmQ7aWYoYmQ+YmMpdGhlbiBiYz1iZCBlbmQKX2MudXBkYXRlU2l6ZShhYyxiYyllbmQKbG9jYWwgYV9hPWZ1bmN0aW9uKGRfYSxfYWEsYWFhKWFkPV9hYSBvciBhZDtiZD1hYWEgb3IgYmQKaWYoX2RbYmRdPT1uaWwpdGhlbiBfZFtiZF09YmIoImYiLGFkLTEpLi5kX2EuLgpiYigiZiIsYWMtICgjZF9hK2FkKSllbHNlIF9kW2JkXT0KYWIoX2RbYmRdLDEsYWQtMSkuLgpiYigiZiIsYWQtI19kW2JkXSkuLmRfYS4uYWIoX2RbYmRdLGFkKyNkX2EsYWMpZW5kO2lmKCNfZFtiZF0+YWMpdGhlbiBhYz0jX2RbYmRdZW5kO2lmKGJkPmJjKXRoZW4gYmM9YmQgZW5kCl9jLnVwZGF0ZVNpemUoYWMsYmMpZW5kCmxvY2FsIGJfYT1mdW5jdGlvbihkX2EsX2FhLGFhYSlhZD1fYWEgb3IgYWQ7YmQ9YWFhIG9yIGJkCmlmKGRjW2JkXT09bmlsKXRoZW4gZGNbYmRdPWJiKCIwIixhZC0xKS4uZF9hLi4KYmIoIjAiLGFjLSAoI2RfYSthZCkpZWxzZSBkY1tiZF09CmFiKGRjW2JkXSwxLGFkLTEpLi4KYmIoIjAiLGFkLSNkY1tiZF0pLi5kX2EuLmFiKGRjW2JkXSxhZCsjZF9hLGFjKWVuZDtpZigjZGNbYmRdPmFjKXRoZW4gYWM9I2RjW2JkXWVuZDtpZihiZD5iYyl0aGVuIGJjPWJkIGVuZApfYy51cGRhdGVTaXplKGFjLGJjKWVuZApsb2NhbCBmdW5jdGlvbiBjX2EoZF9hKWNkPXt9Y2MsZGMsX2Q9e30se30se30KZm9yIF9hYSxhYWEgaW4gcGFpcnMoZGIpZG8gaWYodHlwZShfYWEpPT0ic3RyaW5nIil0aGVuIGNkW19hYV09YWFhIGVsc2UKY2NbX2FhXSxkY1tfYWFdLF9kW19hYV09YWFhWzFdLGFhYVsyXSxhYWFbM11lbmQgZW5kO19jLnVwZGF0ZVNpemUoYWMsYmMpZW5kO2lmKGRifj1uaWwpdGhlbiBhYz0jZGJbMV1bMV1iYz0jZGI7Y19hKGRiKWVuZApyZXR1cm4Ke3JlY2FsY3VsYXRlU2l6ZT1kZCxzZXRGcmFtZT1jX2EsZ2V0RnJhbWU9ZnVuY3Rpb24oKWxvY2FsIGRfYT17fQpmb3IgX2FhLGFhYSBpbgpwYWlycyhjYylkbyB0YWJsZS5pbnNlcnQoZF9hLHthYWEsZGNbX2FhXSxfZFtfYWFdfSllbmQ7Zm9yIF9hYSxhYWEgaW4gcGFpcnMoY2QpZG8gZF9hW19hYV09YWFhIGVuZDtyZXR1cm4gZF9hLGFjLGJjIGVuZCxnZXRJbWFnZT1mdW5jdGlvbigpCmxvY2FsIGRfYT17fWZvciBfYWEsYWFhIGluIHBhaXJzKGNjKWRvCnRhYmxlLmluc2VydChkX2Ese2FhYSxkY1tfYWFdLF9kW19hYV19KWVuZDtyZXR1cm4gZF9hIGVuZCxzZXRGcmFtZURhdGE9ZnVuY3Rpb24oZF9hLF9hYSkKaWYoCl9hYX49bmlsKXRoZW4gY2RbZF9hXT1fYWEgZWxzZSBpZih0eXBlKGRfYSk9PSJ0YWJsZSIpdGhlbiBjZD1kX2EgZW5kIGVuZCBlbmQsc2V0RnJhbWVJbWFnZT1mdW5jdGlvbihkX2EpCmZvciBfYWEsYWFhIGluIHBhaXJzKGRfYS50KWRvCmNjW19hYV09ZF9hLnRbX2FhXWRjW19hYV09ZF9hLmZnW19hYV1fZFtfYWFdPWRfYS5iZ1tfYWFdZW5kIGVuZCxnZXRGcmFtZUltYWdlPWZ1bmN0aW9uKCkKcmV0dXJue3Q9Y2MsZmc9ZGMsYmc9X2R9ZW5kLGdldEZyYW1lRGF0YT1mdW5jdGlvbihkX2EpcmV0dXJuKGRfYX49bmlsIGFuZCBjZFtkX2Fdb3IgY2QpZW5kLGJsaXQ9ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhLGNhYSkKX19hKGRfYSxiYWEsY2FhKWJfYShfYWEsYmFhLGNhYSlhX2EoYWFhLGJhYSxjYWEpZW5kLHRleHQ9X19hLGZnPWJfYSxiZz1hX2EsZ2V0U2l6ZT1mdW5jdGlvbigpcmV0dXJuCmFjLGJjIGVuZCxzZXRTaXplPWZ1bmN0aW9uKGRfYSxfYWEpbG9jYWwgYWFhLGJhYSxjYWE9e30se30se30KZm9yIF95PTEsX2FhIGRvCmlmKGNjW195XX49bmlsKXRoZW4gYWFhW195XT1hYihjY1tfeV0sMSxkX2EpLi5iYigiICIsCmRfYS1hYyllbHNlIGFhYVtfeV09YmIoIiAiLGRfYSllbmQ7aWYoZGNbX3ldfj1uaWwpdGhlbgpiYWFbX3ldPWFiKGRjW195XSwxLGRfYSkuLmJiKCIwIixkX2EtYWMpZWxzZSBiYWFbX3ldPWJiKCIwIixkX2EpZW5kO2lmCihfZFtfeV1+PW5pbCl0aGVuIGNhYVtfeV09YWIoX2RbX3ldLDEsZF9hKS4uYmIoImYiLGRfYS1hYyllbHNlCmNhYVtfeV09YmIoImYiLGRfYSllbmQgZW5kO2NjLGRjLF9kPWFhYSxiYWEsY2FhO2FjLGJjPWRfYSxfYWEgZW5kfWVuZApyZXR1cm4KZnVuY3Rpb24oZGIpbG9jYWwgX2M9e30KbG9jYWwgYWM9e2NyZWF0b3I9IkJpbWcgTGlicmFyeSBieSBOeW9yaUUiLGRhdGU9b3MuZGF0ZSgiISVZLSVtLSVkVCVUWiIpfWxvY2FsIGJjLGNjPTAsMDtsb2NhbCBkYz17fQpsb2NhbCBmdW5jdGlvbiBfZChjZCxkZCljZD1jZCBvciNfYysxCnRhYmxlLmluc2VydChfYyxjZCxjYihkZCxkYykpaWYoZGQ9PW5pbCl0aGVuIF9jW2NkXS5zZXRTaXplKGJjLGNjKWVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYWQoY2QpdGFibGUucmVtb3ZlKF9jLGNkIG9yI19jKWVuZApsb2NhbCBmdW5jdGlvbiBiZChjZCxkZCkKbG9jYWwgX19hPV9jW2NkXQppZihfX2F+PW5pbCl0aGVuIGxvY2FsIGFfYT1jZCtkZDtpZihhX2E+PTEpYW5kKGFfYTw9I19jKXRoZW4gdGFibGUucmVtb3ZlKF9jLGNkKQp0YWJsZS5pbnNlcnQoX2MsYV9hLF9fYSllbmQgZW5kIGVuZApkYz17dXBkYXRlU2l6ZT1mdW5jdGlvbihjZCxkZCxfX2EpbG9jYWwgYV9hPV9fYT09dHJ1ZSBhbmQgdHJ1ZSBvciBmYWxzZQppZihjZD5iYyl0aGVuIGFfYT10cnVlO2JjPWNkIGVuZDtpZihkZD5jYyl0aGVuIGFfYT10cnVlO2NjPWRkIGVuZAppZihhX2EpdGhlbiBmb3IgYl9hLGNfYSBpbiBwYWlycyhfYylkbyBjX2Euc2V0U2l6ZShiYyxjYykKY19hLnJlY2FsY3VsYXRlU2l6ZSgpZW5kIGVuZCBlbmQsdGV4dD1mdW5jdGlvbihjZCxkZCxfX2EsYV9hKQpsb2NhbCBiX2E9X2NbY2RdaWYoYl9hPT1uaWwpdGhlbiBiX2E9X2QoY2QpZW5kO2JfYS50ZXh0KGRkLF9fYSxhX2EpZW5kLGZnPWZ1bmN0aW9uKGNkLGRkLF9fYSxhX2EpCmxvY2FsIGJfYT1fY1tjZF1pZihiX2E9PW5pbCl0aGVuIGJfYT1fZChjZCllbmQ7Yl9hLmZnKGRkLF9fYSxhX2EpZW5kLGJnPWZ1bmN0aW9uKGNkLGRkLF9fYSxhX2EpCmxvY2FsIGJfYT1fY1tjZF1pZihiX2E9PW5pbCl0aGVuIGJfYT1fZChjZCllbmQ7Yl9hLmJnKGRkLF9fYSxhX2EpZW5kLGJsaXQ9ZnVuY3Rpb24oY2QsZGQsX19hLGFfYSxiX2EsY19hKQpsb2NhbCBkX2E9X2NbY2RdaWYoZF9hPT1uaWwpdGhlbiBkX2E9X2QoY2QpZW5kO2RfYS5ibGl0KGRkLF9fYSxhX2EsYl9hLGNfYSllbmQsc2V0U2l6ZT1mdW5jdGlvbihjZCxkZCkKYmM9Y2Q7Y2M9ZGQ7Zm9yIF9fYSxhX2EgaW4gcGFpcnMoX2MpZG8gYV9hLnNldFNpemUoY2QsZGQpZW5kIGVuZCxnZXRGcmFtZT1mdW5jdGlvbihjZClpZigKX2NbY2Rdfj1uaWwpdGhlbiByZXR1cm4gX2NbY2RdLmdldEZyYW1lKCllbmQgZW5kLGdldEZyYW1lT2JqZWN0cz1mdW5jdGlvbigpcmV0dXJuCl9jIGVuZCxnZXRGcmFtZXM9ZnVuY3Rpb24oKWxvY2FsIGNkPXt9Zm9yIGRkLF9fYSBpbiBwYWlycyhfYylkbyBsb2NhbCBhX2E9X19hLmdldEZyYW1lKCkKdGFibGUuaW5zZXJ0KGNkLGFfYSllbmQ7cmV0dXJuIGNkIGVuZCxnZXRGcmFtZU9iamVjdD1mdW5jdGlvbihjZClyZXR1cm4KX2NbY2RdZW5kLGFkZEZyYW1lPWZ1bmN0aW9uKGNkKWxvY2FsIGRkPWNiKClpZigjX2M8PTEpdGhlbgppZihhYy5hbmltYXRlZD09bmlsKXRoZW4gYWMuYW5pbWF0ZWQ9dHJ1ZSBlbmQKaWYoYWMuc2Vjb25kc1BlckZyYW1lPT1uaWwpdGhlbiBhYy5zZWNvbmRzUGVyRnJhbWU9MC4yIGVuZCBlbmQ7X2QoY2QpcmV0dXJuIGRkIGVuZCxyZW1vdmVGcmFtZT1mdW5jdGlvbihjZCkKYWQoY2QpCmlmKCNfYzw9MSl0aGVuIGlmKGFjLmFuaW1hdGVkPT1uaWwpdGhlbiBhYy5hbmltYXRlZD10cnVlIGVuZDtpZgooYWMuc2Vjb25kc1BlckZyYW1lPT1uaWwpdGhlbiBhYy5zZWNvbmRzUGVyRnJhbWU9MC4yIGVuZCBlbmQgZW5kLG1vdmVGcmFtZT1iZCxzZXRGcmFtZURhdGE9ZnVuY3Rpb24oY2QsZGQsX19hKQppZigKX2NbY2Rdfj1uaWwpdGhlbiBfY1tjZF0uc2V0RnJhbWVEYXRhKGRkLF9fYSllbmQgZW5kLGdldEZyYW1lRGF0YT1mdW5jdGlvbihjZCxkZClyZXR1cm4gX2NbY2Rdfj1uaWwgYW5kCl9jW2NkXS5nZXRGcmFtZURhdGEoZGQpZW5kLGdldFNpemU9ZnVuY3Rpb24oKXJldHVybgpiYyxjYyBlbmQsc2V0QW5pbWF0aW9uPWZ1bmN0aW9uKGNkKWFjLmFuaW1hdGlvbj1jZCBlbmQsc2V0TWV0YWRhdGE9ZnVuY3Rpb24oY2QsZGQpaWYoZGR+PW5pbCl0aGVuIGFjW2NkXT1kZCBlbHNlIGlmKAp0eXBlKGNkKT09InRhYmxlIil0aGVuIGFjPWNkIGVuZCBlbmQgZW5kLGdldE1ldGFkYXRhPWZ1bmN0aW9uKGNkKXJldHVybgpjZH49bmlsIGFuZCBhY1tjZF1vciBhYyBlbmQsY3JlYXRlQmltZz1mdW5jdGlvbigpCmxvY2FsIGNkPXt9CmZvciBkZCxfX2EgaW4gcGFpcnMoX2MpZG8gbG9jYWwgYV9hPV9fYS5nZXRGcmFtZSgpdGFibGUuaW5zZXJ0KGNkLGFfYSllbmQ7Zm9yIGRkLF9fYSBpbiBwYWlycyhhYylkbyBjZFtkZF09X19hIGVuZDtjZC53aWR0aD1iYztjZC5oZWlnaHQ9Y2M7cmV0dXJuIGNkIGVuZH0KaWYoZGJ+PW5pbCl0aGVuIGZvciBjZCxkZCBpbiBwYWlycyhkYilkbwppZih0eXBlKGNkKT09InN0cmluZyIpdGhlbiBhY1tjZF09ZGQgZWxzZSBfZChjZCxkZCllbmQgZW5kCmlmCihhYy53aWR0aD09bmlsKW9yKGFjLmhlaWdodD09bmlsKXRoZW4gZm9yIGNkLGRkIGluIHBhaXJzKF9jKWRvIGxvY2FsIF9fYSxhX2E9ZGQuZ2V0U2l6ZSgpaWYoX19hPmJjKXRoZW4gX19hPWJjIGVuZAppZihhX2E+Y2MpdGhlbiBhX2E9Y2MgZW5kIGVuZApkYy51cGRhdGVTaXplKGJjLGNjLHRydWUpZW5kIGVsc2UgX2QoMSllbmQ7cmV0dXJuIGRjIGVuZCBlbmQKYWFbImxpYnJhcmllcyJdWyJpbWFnZXMiXT1mdW5jdGlvbiguLi4pCmxvY2FsIGFiLGJiLGNiPXN0cmluZy5zdWIsbWF0aC5mbG9vcixzdHJpbmcucmVwCmxvY2FsIGZ1bmN0aW9uIGRiKGJkKWxvY2FsIGNkPXt7fX1sb2NhbCBkZD1mcy5vcGVuKGJkLCJyIikKaWYoZGR+PW5pbCl0aGVuIGZvciBfX2EgaW4gZGQucmVhZExpbmUgZG8KdGFibGUuaW5zZXJ0KGNkWzFdLHtjYigiICIsI19fYSksY2IoIiAiLAojX19hKSxfX2F9KWVuZDtkZC5jbG9zZSgpcmV0dXJuIGNkIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX2MoYmQpcmV0dXJuIHBhaW50dXRpbHMubG9hZEltYWdlKGJkKSwibmZwImVuZApsb2NhbCBmdW5jdGlvbiBhYyhiZClsb2NhbCBjZD1mcy5vcGVuKGJkLCJyYiIpCmxvY2FsIGRkPXRleHR1dGlscy51bnNlcmlhbGl6ZShjZC5yZWFkQWxsKCkpY2QuY2xvc2UoKWlmKGRkfj1uaWwpdGhlbiByZXR1cm4gZGQsImJpbWciZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBiYyhiZCllbmQ7bG9jYWwgZnVuY3Rpb24gY2MoYmQpZW5kO2xvY2FsIGZ1bmN0aW9uIGRjKGJkLGNkKQppZihjZD09bmlsKXRoZW4gaWYoYmQ6ZmluZCgiLmJpbWciKSl0aGVuIHJldHVybiBhYyhiZCllbHNlaWYKKGJkOmZpbmQoIi5iYmYiKSl0aGVuIHJldHVybiBiYyhiZCllbHNlIHJldHVybiBfYyhiZCllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfZChiZCxjZClpZigKY2Q9PW5pbCl0aGVuCmlmKGJkOmZpbmQoIi5iaW1nIikpdGhlbiByZXR1cm4gYWMoYmQpZWxzZWlmKGJkOmZpbmQoIi5iYmYiKSl0aGVuIHJldHVybiBjYyhiZCllbHNlIHJldHVybiBkYihiZCllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBhZChiZCxjZCxkZCkKbG9jYWwgX19hLGFfYT1iZC53aWR0aCBvciNiZFsxXVsxXVsxXSxiZC5oZWlnaHQgb3IjYmRbMV1sb2NhbCBiX2E9e30KZm9yIGNfYSxkX2EgaW4gcGFpcnMoYmQpZG8KaWYodHlwZShjX2EpPT0ibnVtYmVyIil0aGVuIGxvY2FsIF9hYT17fQpmb3IgeT0xLGRkIGRvIGxvY2FsIGFhYSxiYWEsY2FhPSIiLCIiLCIiCmxvY2FsIGRhYT1iYih5L2RkKmFfYSswLjUpCmlmKGRfYVtkYWFdfj1uaWwpdGhlbgpmb3IgeD0xLGNkIGRvIGxvY2FsIF9iYT1iYih4L2NkKl9fYSswLjUpYWFhPWFhYS4uCmFiKGRfYVtkYWFdWzFdLF9iYSxfYmEpCmJhYT1iYWEuLmFiKGRfYVtkYWFdWzJdLF9iYSxfYmEpY2FhPWNhYS4uYWIoZF9hW2RhYV1bM10sX2JhLF9iYSllbmQ7dGFibGUuaW5zZXJ0KF9hYSx7YWFhLGJhYSxjYWF9KWVuZCBlbmQ7dGFibGUuaW5zZXJ0KGJfYSxjX2EsX2FhKWVsc2UgYl9hW2NfYV09ZF9hIGVuZCBlbmQ7Yl9hLndpZHRoPWNkO2JfYS5oZWlnaHQ9ZGQ7cmV0dXJuIGJfYSBlbmQKcmV0dXJue2xvYWRORlA9X2MsbG9hZEJJTUc9YWMsbG9hZEltYWdlPWRjLHJlc2l6ZUJJTUc9YWQsbG9hZEltYWdlQXNCaW1nPV9kfWVuZAphYVsibGlicmFyaWVzIl1bIm1vZHVsZSJdPWZ1bmN0aW9uKC4uLilyZXR1cm4gZnVuY3Rpb24oYWIpbG9jYWwgYmIsY2I9cGNhbGwoZGEsYWIpCnJldHVybiBiYiBhbmQgY2Igb3IgbmlsIGVuZCBlbmQKYWFbImxpYnJhcmllcyJdWyJ0SGV4Il09ZnVuY3Rpb24oLi4uKQpyZXR1cm4Ke1tjb2xvcnMud2hpdGVdPSIwIixbY29sb3JzLm9yYW5nZV09IjEiLFtjb2xvcnMubWFnZW50YV09IjIiLFtjb2xvcnMubGlnaHRCbHVlXT0iMyIsW2NvbG9ycy55ZWxsb3ddPSI0IixbY29sb3JzLmxpbWVdPSI1IixbY29sb3JzLnBpbmtdPSI2IixbY29sb3JzLmdyYXldPSI3IixbY29sb3JzLmxpZ2h0R3JheV09IjgiLFtjb2xvcnMuY3lhbl09IjkiLFtjb2xvcnMucHVycGxlXT0iYSIsW2NvbG9ycy5ibHVlXT0iYiIsW2NvbG9ycy5icm93bl09ImMiLFtjb2xvcnMuZ3JlZW5dPSJkIixbY29sb3JzLnJlZF09ImUiLFtjb2xvcnMuYmxhY2tdPSJmIn1lbmQ7cmV0dXJuIGFhWyJtYWluIl0oKQ==";
  34.     ["psg.printer"] = base64.decode "bG9jYWwgcHJpbnRlciA9IHBlcmlwaGVyYWwuZmluZCAncHJpbnRlcicKCmxvY2FsIGxpYnJhcnkgPSB7fQoKZnVuY3Rpb24gbGlicmFyeS5leGlzdHMoKQoJcmV0dXJuIHByaW50ZXIgYW5kIHRydWUgb3IgZmFsc2UKZW5kCgpsb2NhbCBwcmludF9pbmRleCA9IHt9CgpmdW5jdGlvbiBwcmludF9pbmRleDp3cml0ZV9saW5lKGZyb20sIHRvKQoJbG9jYWwgeSA9IHNlbGYueQoJYXNzZXJ0KHkgPD0gc2VsZi5oZWlnaHQpCglwcmludGVyLnNldEN1cnNvclBvcygxLCB5KQoJbG9jYWwgdGV4dCA9IHNlbGYudGV4dAoJcHJpbnRlci53cml0ZSh0ZXh0OnN1Yihmcm9tLCB0bykpCglzZWxmLnkgPSB5ICsgMQoJbG9jYWwgcG9zID0gdG8gKyAxCglpZiBwb3MgPiAjdGV4dCB0aGVuCgkJc2VsZi5kb25lID0gdHJ1ZQoJZW5kCglzZWxmLnBvcyA9IHBvcwplbmQKCmZ1bmN0aW9uIHByaW50X2luZGV4OmNvbnRpbnVlKCkKCXdoaWxlIHRydWUgZG8KCQlsb2NhbCBzdGF0ZSA9IHNlbGYuc3RhdGUKCQlpZiBzdGF0ZSA9PSAnZW1wdHknIHRoZW4KCQkJaWYgc2VsZi5kb25lIHRoZW4KCQkJCXJldHVybiB0cnVlCgkJCWVuZAoJCQlpZiBub3QgcHJpbnRlci5uZXdQYWdlKCkgdGhlbgoJCQkJcmV0dXJuIGZhbHNlLCAnbm90IGVub3VnaCBpbmsgb3IgcGFwZXInCgkJCWVuZAoJCQlwcmludGVyLnNldFBhZ2VUaXRsZShzZWxmLnRpdGxlKQoJCQlzZWxmLnkgPSAxCgkJCXNlbGYuc3RhdGUgPSAncGFnZScKCQkJbG9jYWwgd2lkdGgsIGhlaWdodCA9IHByaW50ZXIuZ2V0UGFnZVNpemUoKQoJCQlzZWxmLndpZHRoID0gd2lkdGgKCQkJc2VsZi5oZWlnaHQgPSBoZWlnaHQKCQllbHNlaWYgc3RhdGUgPT0gJ3BhZ2UnIHRoZW4KCQkJbG9jYWwgeSA9IHNlbGYueQoJCQlsb2NhbCBoZWlnaHQgPSBzZWxmLmhlaWdodAoJCQlpZiB5ID4gaGVpZ2h0IG9yIHNlbGYuZG9uZSB0aGVuCgkJCQlpZiBub3QgcHJpbnRlci5lbmRQYWdlKCkgdGhlbgoJCQkJCXJldHVybiBmYWxzZSwgJ25vdCBlbm91Z2ggc3BhY2UgZm9yIHByaW50ZWQgcGFnZScKCQkJCWVuZAoJCQkJc2VsZi5zdGF0ZSA9ICdlbXB0eScKCQkJZWxzZQoJCQkJbG9jYWwgdGV4dCA9IHNlbGYudGV4dAoJCQkJbG9jYWwgcG9zID0gc2VsZi5wb3MKCQkJCWxvY2FsIHdpZHRoID0gc2VsZi53aWR0aAoJCQkJbG9jYWwgc2l6ZSA9ICN0ZXh0CgkJCQlsb2NhbCBzdWJ0ZXh0ID0gdGV4dDpzdWIoMSwgcG9zK3dpZHRoKQoJCQkJbG9jYWwgbmV3TGluZSA9IHN0cmluZy5maW5kKHN1YnRleHQsICdcbicsIHBvcywgdHJ1ZSkKCQkJCWlmIHNpemUgPCBwb3Mrd2lkdGggYW5kIG5vdCBuZXdMaW5lIHRoZW4KCQkJCQlzZWxmOndyaXRlX2xpbmUocG9zLCBzaXplKQoJCQkJZWxzZQoJCQkJCWlmIG5ld0xpbmUgdGhlbgoJCQkJCQlzZWxmOndyaXRlX2xpbmUocG9zLCBuZXdMaW5lKQoJCQkJCWVsc2UKCQkJCQkJbG9jYWwgXywgd2hpdGVzcGFjZSA9IHN0cmluZy5maW5kKHN1YnRleHQsICcuKiglcyknLCBwb3MpCgkJCQkJCWlmIHdoaXRlc3BhY2UgdGhlbgoJCQkJCQkJc2VsZjp3cml0ZV9saW5lKHBvcywgd2hpdGVzcGFjZSkKCQkJCQkJZWxzZQoJCQkJCQkJc2VsZjp3cml0ZV9saW5lKHBvcywgcG9zK3dpZHRoLTEpCgkJCQkJCWVuZAoJCQkJCWVuZAoJCQkJZW5kCgkJCWVuZAoJCWVsc2VpZiBzdGF0ZSA9PSAnY2FuY2VsJyB0aGVuCgkJCWVycm9yKCdPcGVyYXRpb24gY2FuY2VsbGVkJywgMikKCQllbmQKCWVuZAplbmQKCmZ1bmN0aW9uIHByaW50X2luZGV4OmNhbmNlbCgpCglpZiBzZWxmLnN0YXRlID09ICdwYWdlJyB0aGVuCgkJcHJpbnRlci5lbmRQYWdlKCkKCWVuZAoJc2VsZi5zdGF0ZSA9ICdjYW5jZWwnCmVuZAoKbG9jYWwgcHJpbnRfbWV0YSA9IHsKCV9faW5kZXggPSBwcmludF9pbmRleDsKfQoKZnVuY3Rpb24gbGlicmFyeS5wcmludCh0aXRsZSwgdGV4dCkKCWxvY2FsIHN0YXRlID0gewoJCXRpdGxlID0gdGl0bGU7CgkJc3RhdGUgPSAnZW1wdHknOwoJCXRleHQgPSB0ZXh0OwoJCXBvcyA9IDE7CgkJeSA9IDE7CgkJZG9uZSA9IGZhbHNlOwoJfQoJcmV0dXJuIHNldG1ldGF0YWJsZShzdGF0ZSwgcHJpbnRfbWV0YSkKZW5kCgpyZXR1cm4gbGlicmFyeQo=";
  35.     ["ktlo.rpc"] = base64.decode "bG9jYWwgam9iID0gcmVxdWlyZSAna3Rsby5qb2InCgpsb2NhbCBycGMgPSB7fQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCBmdW5jdGlvbiBwcmVwYXJlQW5zd2VyKHNlcnZlciwgaWQsIHJlc3VsdCkKCXJldHVybiB7CgkJbWFnaWMgPSAicnBjIjsKCQlzZXJ2ZXIgPSBzZXJ2ZXI7CgkJa2luZCA9ICdyZXNwb25zZSc7CgkJaWQgPSBpZDsKCQlyZXN1bHQgPSByZXN1bHQ7Cgl9CmVuZAoKbG9jYWwgZnVuY3Rpb24gcHJlcGFyZVN1Y2Nlc3Moc2VydmVyLCBpZCwgLi4uKQoJcmV0dXJuIHByZXBhcmVBbnN3ZXIoc2VydmVyLCBpZCwgeyBzdGF0dXMgPSAnc3VjY2VzcycsIHZhbHVlID0gdGFibGUucGFjayguLi4pIH0pCmVuZAoKbG9jYWwgZnVuY3Rpb24gcHJlcGFyZUVycm9yKHNlcnZlciwgaWQsIGVycm9yKQoJcmV0dXJuIHByZXBhcmVBbnN3ZXIoc2VydmVyLCBpZCwgeyBzdGF0dXMgPSAnZmFpbHVyZScsIGVycm9yID0gZXJyb3IgfSkKZW5kCgpsb2NhbCBmdW5jdGlvbiBwcm9jZXNzUmVxdWVzdChjb21tYW5kcywgbWVzc2FnZSwgaG9zdG5hbWUpCglpZiB0eXBlKG1lc3NhZ2UpID09ICd0YWJsZScgYW5kIG1lc3NhZ2UubWFnaWMgPT0gInJwYyIgYW5kIG1lc3NhZ2Uua2luZCA9PSAncmVxdWVzdCcgYW5kIG1lc3NhZ2Uuc2VydmVyID09IGhvc3RuYW1lIHRoZW4KCQlsb2NhbCBtdHlwZSA9IG1lc3NhZ2UudHlwZQoJCWlmIG10eXBlID09ICdoZWxwJyB0aGVuCgkJCWxvY2FsIGhlbHAgPSB7fQoJCQlmb3IgY29tbWFuZCBpbiBwYWlycyhjb21tYW5kcykgZG8KCQkJCWhlbHBbY29tbWFuZF0gPSB7CgkJCQkJaGVscCA9IGNvbW1hbmQuaGVscDsKCQkJCX0KCQkJZW5kCgkJCXJldHVybiBwcmVwYXJlU3VjY2Vzcyhob3N0bmFtZSwgbWVzc2FnZS5pZCwgaGVscCkKCQllbHNlaWYgbXR5cGUgPT0gJ2NhbGwnIHRoZW4KCQkJbG9jYWwgY29tbWFuZCA9IGNvbW1hbmRzW21lc3NhZ2UuY29tbWFuZF0KCQkJaWYgY29tbWFuZCA9PSBuaWwgdGhlbgoJCQkJcmV0dXJuIHByZXBhcmVFcnJvcihob3N0bmFtZSwgbWVzc2FnZS5pZCwgInVua25vd24gcmVtb3RlIHByb2NlZHVyZSAnIi4ubWVzc2FnZS5jb21tYW5kLi4iJyIpCgkJCWVuZAoJCQlsb2NhbCByZXN1bHQgPSB7IHBjYWxsKGNvbW1hbmQucHJvY2VkdXJlLCB0YWJsZS51bnBhY2sobWVzc2FnZS5hcmd1bWVudHMpKSB9CgkJCWlmIHJlc3VsdFsxXSB0aGVuCgkJCQlyZXR1cm4gcHJlcGFyZVN1Y2Nlc3MoaG9zdG5hbWUsIG1lc3NhZ2UuaWQsIHRhYmxlLnVucGFjayhyZXN1bHQsIDIpKQoJCQllbHNlCgkJCQlyZXR1cm4gcHJlcGFyZUVycm9yKGhvc3RuYW1lLCBtZXNzYWdlLmlkLCByZXN1bHRbMl0pCgkJCWVuZAoJCWVsc2UKCQkJcmV0dXJuIHByZXBhcmVFcnJvcihob3N0bmFtZSwgbWVzc2FnZS5pZCwgInVuc3VwcG9ydGVkIHJwYyByZXF1ZXN0IHR5cGUgJyIuLm10eXBlLi4iJyIpCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBycGMuc2VydmVyKGNvbW1hbmRzLCBoYW5kbGVyLCBob3N0bmFtZSkKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJaGFuZGxlcihmdW5jdGlvbihyZXF1ZXN0KQoJCQkJcmV0dXJuIHByb2Nlc3NSZXF1ZXN0KGNvbW1hbmRzLCByZXF1ZXN0LCBob3N0bmFtZSkKCQkJZW5kKQoJCWVuZAoJZW5kKQplbmQKCmxvY2FsIGRjYWxsID0gcGVyaXBoZXJhbC5jYWxsCgpsb2NhbCBmdW5jdGlvbiBtb2RlbVNlcnZlckhhbmRsZXJUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgZikKCWxvY2FsIHNpZGUsIHJjaGFubmVsLCByZXBseUNoYW5uZWwsIHJlcXVlc3QKCXJlcGVhdAoJCXNpZGUsIHJjaGFubmVsLCByZXBseUNoYW5uZWwsIHJlcXVlc3QgPSBzZWxlY3QoMiwgb3MucHVsbEV2ZW50KCJtb2RlbV9tZXNzYWdlIikpCgl1bnRpbCBzaWRlID09IG1vZGVtIGFuZCByY2hhbm5lbCA9PSBjaGFubmVsCglsb2NhbCByZXNwb25zZSA9IGYocmVxdWVzdCkKCWlmIHJlc3BvbnNlIHRoZW4KCQlkY2FsbChtb2RlbSwgJ3RyYW5zbWl0JywgcmVwbHlDaGFubmVsLCBjaGFubmVsLCByZXNwb25zZSkKCWVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIHdpdGhMaXN0ZW5pbmdDaGFubmVsKG1vZGVtLCBjaGFubmVsLCBhY3Rpb24pCgktLSBpZiBkY2FsbChtb2RlbSwgJ2lzT3BlbicsIGNoYW5uZWwpIHRoZW4KCS0tCSAgIGVycm9yKCJjaGFubmVsICMiLi5jaGFubmVsLi4iaXMgYWxyZWFkeSBvcGVuIiwgMikKCS0tIGVuZAoJZGNhbGwobW9kZW0sICdvcGVuJywgY2hhbm5lbCkKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCWpvYi5ydW5uaW5nKCk6ZmlubmFsaXplKGZ1bmN0aW9uKCkKCQkJZGNhbGwobW9kZW0sICdjbG9zZScsIGNoYW5uZWwpCgkJZW5kKQoJCXJldHVybiBhY3Rpb24oKQoJZW5kKQplbmQKCmZ1bmN0aW9uIHJwYy5zZXJ2ZXJfbmV0d29yayhjb21tYW5kcywgbW9kZW0sIGNoYW5uZWwsIGhvc3RuYW1lKQoJaWYgdHlwZShtb2RlbSkgPT0gJ3RhYmxlJyB0aGVuCgkJbW9kZW0gPSBwZXJpcGhlcmFsLmdldE5hbWUobW9kZW0pCgllbmQKCXJldHVybiB3aXRoTGlzdGVuaW5nQ2hhbm5lbChtb2RlbSwgY2hhbm5lbCwgZnVuY3Rpb24oKQoJCWxvY2FsIHByb2Nlc3MgPSBmdW5jdGlvbihmKSBtb2RlbVNlcnZlckhhbmRsZXJUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgZikgZW5kCgkJcnBjLnNlcnZlcihjb21tYW5kcywgcHJvY2VzcywgaG9zdG5hbWUpCgllbmQpCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBycGMuaXNfcmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpCglyZXR1cm4gdHlwZShyZXNwb25zZSkgPT0gJ3RhYmxlJyBhbmQgcmVzcG9uc2UubWFnaWMgPT0gInJwYyIgYW5kIHJlc3BvbnNlLmlkID09IHJlcXVlc3QuaWQgYW5kIHJlc3BvbnNlLmtpbmQgPT0gJ3Jlc3BvbnNlJyBhbmQgcmVzcG9uc2UucmVzdWx0IC0tIGFuZCByZXNwb25zZS5zZXJ2ZXIgPT0gcmVxdWVzdC5zZXJ2ZXIKZW5kCgpsb2NhbCBmdW5jdGlvbiBleGVjdXRlUmVtb3RlKGNsaWVudCwgbXR5cGUsIGZpbGwsIC4uLikKCWxvY2FsIGlkID0gbWF0aC5yYW5kb20oMTAwMDAwMDAwMDAwKQoJbG9jYWwgcmVxdWVzdCA9IHsKCQltYWdpYyA9ICJycGMiOwoJCXNlcnZlciA9IGNsaWVudC5zZXJ2ZXI7CgkJaWQgPSBpZDsKCQlraW5kID0gJ3JlcXVlc3QnOwoJCXR5cGUgPSBtdHlwZTsKCX0KCWZpbGwocmVxdWVzdCwgLi4uKQoJbG9jYWwgcmVzcG9uc2UgPSBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXJldHVybiBjbGllbnQuZXhjaGFuZ2UocmVxdWVzdCkucmVzdWx0CgllbmQpCglsb2NhbCBvaywgcmVzdWx0ID0gcmVzcG9uc2U6YXdhaXRfdGltZW91dChjbGllbnQudGltZW91dCkKCWlmIG5vdCBvayB0aGVuCgkJZXJyb3IoInRpbWVvdXQiLCAzKQoJZW5kCglpZiByZXN1bHQuc3RhdHVzID09ICdzdWNjZXNzJyB0aGVuCgkJcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQudmFsdWUpCgllbHNlCgkJZXJyb3IoInJwYzogIi4ucmVzdWx0LmVycm9yLCAzKQoJZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gZmlsbENhbGwocmVxdWVzdCwgcHJvY2VkdXJlLCAuLi4pCglyZXF1ZXN0LmNvbW1hbmQgPSBwcm9jZWR1cmUKCXJlcXVlc3QuYXJndW1lbnRzID0gdGFibGUucGFjayguLi4pCmVuZAoKbG9jYWwgZnVuY3Rpb24gZXhlY3V0ZVJlbW90ZVByb2NlZHVyZShjbGllbnQsIHByb2NlZHVyZSwgLi4uKQoJcmV0dXJuIGV4ZWN1dGVSZW1vdGUoY2xpZW50LCAnY2FsbCcsIGZpbGxDYWxsLCBwcm9jZWR1cmUsIC4uLikKZW5kCgpsb2NhbCBmdW5jdGlvbiBmaWxsSGVscCgpZW5kCgpsb2NhbCBmdW5jdGlvbiBleGVjdXRlUmVtb3RlSGVscChjbGllbnQpCglyZXR1cm4gZXhlY3V0ZVJlbW90ZShjbGllbnQsICdoZWxwJywgZmlsbEhlbHApCmVuZAoKbG9jYWwgY2xpZW50X21ldGEgPSB7fQoKZnVuY3Rpb24gY2xpZW50X21ldGE6X19pbmRleChrZXkpCglyZXR1cm4gZnVuY3Rpb24oLi4uKQoJCXJldHVybiBleGVjdXRlUmVtb3RlUHJvY2VkdXJlKHJhd2dldChzZWxmLCAnX3N0YXRlJyksIGtleSwgLi4uKQoJZW5kCmVuZAoKZnVuY3Rpb24gY2xpZW50X21ldGE6X19wYWlycygpCglyZXR1cm4gbmV4dCwgZXhlY3V0ZVJlbW90ZUhlbHAocmF3Z2V0KHNlbGYsICdfc3RhdGUnKSksIG5pbAplbmQKCmZ1bmN0aW9uIHJwYy5jbGllbnQoZXhjaGFuZ2UsIHRpbWVvdXQsIGhvc3RuYW1lKQoJbG9jYWwgY2xpZW50ID0gewoJCV9zdGF0ZSA9IHsKCQkJZXhjaGFuZ2UgPSBleGNoYW5nZTsKCQkJdGltZW91dCA9IHRpbWVvdXQ7CgkJCXNlcnZlciA9IGhvc3RuYW1lOwoJCX07Cgl9CglyZXR1cm4gc2V0bWV0YXRhYmxlKGNsaWVudCwgY2xpZW50X21ldGEpCmVuZAoKbG9jYWwgZnVuY3Rpb24gcmFuZG9tQ2hhbm5lbChtb2RlbSkKCXdoaWxlIHRydWUgZG8KCQlsb2NhbCBjaGFubmVsID0gbWF0aC5yYW5kb20oNjU1MzUpCgkJaWYgbm90IGRjYWxsKG1vZGVtLCAnaXNPcGVuJywgY2hhbm5lbCkgdGhlbgoJCQlyZXR1cm4gY2hhbm5lbAoJCWVuZAoJZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gZXhjaGFuZ2VOZXR3b3JrVGVtcGxhdGUobW9kZW0sIHNlcnZlckNoYW5uZWwsIHJlcXVlc3QpCglsb2NhbCByZXBseUNoYW5uZWwgPSByYW5kb21DaGFubmVsKG1vZGVtKQoJZGNhbGwobW9kZW0sICdvcGVuJywgcmVwbHlDaGFubmVsKQoJZGNhbGwobW9kZW0sICd0cmFuc21pdCcsIHNlcnZlckNoYW5uZWwsIHJlcGx5Q2hhbm5lbCwgcmVxdWVzdCkKCWpvYi5ydW5uaW5nKCk6ZmlubmFsaXplKGZ1bmN0aW9uKCkKCQlkY2FsbChtb2RlbSwgJ2Nsb3NlJywgcmVwbHlDaGFubmVsKQoJZW5kKQoJbG9jYWwgc2lkZSwgY2hhbm5lbCwgcmVzcG9uc2UKCXJlcGVhdAoJCV8sIHNpZGUsIGNoYW5uZWwsIF8sIHJlc3BvbnNlID0gb3MucHVsbEV2ZW50KCJtb2RlbV9tZXNzYWdlIikKCXVudGlsIHNpZGUgPT0gbW9kZW0gYW5kIGNoYW5uZWwgPT0gcmVwbHlDaGFubmVsIGFuZCBycGMuaXNfcmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpCglyZXR1cm4gcmVzcG9uc2UKZW5kCgpmdW5jdGlvbiBycGMuY2xpZW50X25ldHdvcmsobW9kZW0sIGNoYW5uZWwsIHRpbWVvdXQsIGhvc3RuYW1lKQoJaWYgdHlwZShtb2RlbSkgPT0gJ3RhYmxlJyB0aGVuCgkJbW9kZW0gPSBwZXJpcGhlcmFsLmdldE5hbWUobW9kZW0pCgllbmQKCXJldHVybiBycGMuY2xpZW50KGZ1bmN0aW9uIChyZXF1ZXN0KQoJCXJldHVybiBleGNoYW5nZU5ldHdvcmtUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgcmVxdWVzdCkKCWVuZCwgdGltZW91dCwgaG9zdG5hbWUpCmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBycGMuYnJvYWRjYXN0KHB1c2gsIGV2ZW50KQoJbG9jYWwgbWVzc2FnZSA9IHsKCQltYWdpYyA9ICJycGMiOwoJCWtpbmQgPSAnZXZlbnQnOwoJCWlkID0gbWF0aC5yYW5kb20oKTsKCQlkYXRhID0gZXZlbnQ7Cgl9CglwdXNoKG1lc3NhZ2UpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbmV0d29ya0Jyb2FkY2FzdFB1c2hUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCwgbWVzc2FnZSkKCWRjYWxsKG1vZGVtLCAndHJhbnNtaXQnLCBjaGFubmVsLCAwLCBtZXNzYWdlKQplbmQKCmZ1bmN0aW9uIHJwYy5icm9hZGNhc3RfbmV0d29yayhtb2RlbSwgY2hhbm5lbCwgZXZlbnQpCglpZiB0eXBlKG1vZGVtKSA9PSAndGFibGUnIHRoZW4KCQltb2RlbSA9IHBlcmlwaGVyYWwuZ2V0TmFtZShtb2RlbSkKCWVuZAoJcnBjLmJyb2FkY2FzdChmdW5jdGlvbihtZXNzYWdlKQoJCXJldHVybiBuZXR3b3JrQnJvYWRjYXN0UHVzaFRlbXBsYXRlKG1vZGVtLCBjaGFubmVsLCBtZXNzYWdlKQoJZW5kLCBldmVudCkKZW5kCgpmdW5jdGlvbiBycGMuc3Vic2NyaWJlKHB1bGwsIGFjdGlvbikKCXJldHVybiBqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJbG9jYWwgbWVzc2FnZSwgbWV0YSA9IHB1bGwoKQoJCQlpZiB0eXBlKG1lc3NhZ2UpID09ICd0YWJsZScgYW5kIG1lc3NhZ2UubWFnaWMgPT0gJ3JwYycgYW5kIG1lc3NhZ2Uua2luZCA9PSAnZXZlbnQnIHRoZW4KCQkJCWpvYi5hc3luYyhmdW5jdGlvbigpIGFjdGlvbihtZXNzYWdlLmRhdGEsIG1ldGEpIGVuZCkKCQkJZW5kCgkJZW5kCgllbmQpCmVuZAoKbG9jYWwgZnVuY3Rpb24gbmV0d29ya1N1YnNjcmliZVB1bGxUZW1wbGF0ZShtb2RlbSwgY2hhbm5lbCkKCWxvY2FsIHNpZGUsIHJjaGFubmVsLCBtZXNzYWdlLCBkaXN0YW5jZQoJcmVwZWF0CgkJXywgc2lkZSwgcmNoYW5uZWwsIF8sIG1lc3NhZ2UsIGRpc3RhbmNlID0gb3MucHVsbEV2ZW50KCJtb2RlbV9tZXNzYWdlIikKCXVudGlsIHNpZGUgPT0gbW9kZW0gYW5kIHJjaGFubmVsID09IGNoYW5uZWwKCXJldHVybiBtZXNzYWdlLCB7ZGlzdGFuY2U9ZGlzdGFuY2V9CmVuZAoKZnVuY3Rpb24gcnBjLnN1YnNjcmliZV9uZXR3b3JrKG1vZGVtLCBjaGFubmVsLCBhY3Rpb24pCglpZiB0eXBlKG1vZGVtKSA9PSAndGFibGUnIHRoZW4KCQltb2RlbSA9IHBlcmlwaGVyYWwuZ2V0TmFtZShtb2RlbSkKCWVuZAoJcmV0dXJuIHdpdGhMaXN0ZW5pbmdDaGFubmVsKG1vZGVtLCBjaGFubmVsLCBmdW5jdGlvbigpCgkJcnBjLnN1YnNjcmliZShmdW5jdGlvbigpCgkJCXJldHVybiBuZXR3b3JrU3Vic2NyaWJlUHVsbFRlbXBsYXRlKG1vZGVtLCBjaGFubmVsKQoJCWVuZCwgYWN0aW9uKQoJZW5kKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuY3Rpb24gcnBjLnNpbXBsZV9jb21tYW5kcyhjb21tYW5kcykKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgaywgdiBpbiBwYWlycyhjb21tYW5kcykgZG8KCQlyZXN1bHRba10gPSB7IHByb2NlZHVyZSA9IHYgfQoJZW5kCglyZXR1cm4gcmVzdWx0CmVuZAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpyZXR1cm4gcnBjCg==";
  36.     ["ktlo.concurrent"] = base64.decode "bG9jYWwgb3MsdGFibGUsbWF0aD1vcyx0YWJsZSxtYXRoO2xvY2FsIGEsYixjLGQ9b3MucHVsbEV2ZW50UmF3LG9zLnN0YXJ0VGltZXIsb3MuY2FuY2VsVGltZXIsb3MuZXBvY2g7bG9jYWwgZSxmLGcsaD10YWJsZS51bnBhY2ssdGFibGUucGFjayx0YWJsZS5yZW1vdmUsdGFibGUuaW5zZXJ0O2xvY2FsIGk9bWF0aC5mbG9vcjtsb2NhbCBzZXRtZXRhdGFibGUsc2VsZWN0LGVycm9yLHR5cGUscGFpcnM9c2V0bWV0YXRhYmxlLHNlbGVjdCxlcnJvcix0eXBlLHBhaXJzO2xvY2FsIGo9cmVxdWlyZSdrdGxvLmNoZWNrJ2xvY2FsIGs9ai5leHBlY3Q7bG9jYWwgZnVuY3Rpb24gbChtLG4pZm9yIG89MSwjbSBkbyBpZiBuPT1tW29ddGhlbiByZXR1cm4gbyBlbmQgZW5kO3JldHVybiBuaWwgZW5kO2xvY2FsIHA9e3dhaXRhYmxlPXRydWV9bG9jYWwgcT17fWxvY2FsIGZ1bmN0aW9uIHIocylrKDEscywnd2FpdGFibGUnKWxvY2FsIHQ9cy5zZWxlY3Rvcjtsb2NhbCB1PXt0LmltbWVkaWF0ZShzKX1pZiB1WzFddGhlbiByZXR1cm4gZSh1LDIpZW5kO2xvY2FsIHY9dC5lbnRlcihzKXJlcGVhdCBsb2NhbCB3PXthKCl9bG9jYWwgeD13WzFdaWYgeD09J3Rlcm1pbmF0ZSd0aGVuIHQubGVhdmUocyx2LGZhbHNlKWVycm9yKCJUZXJtaW5hdGVkIiwwKWVuZCB1bnRpbCB0LmNvbmRpdGlvbihzLHYsdylyZXR1cm4gdC5sZWF2ZShzLHYsdHJ1ZSllbmQ7cS53YWl0PXI7ZnVuY3Rpb24gcS5zZWxlY3QoLi4uKWZvciBvPTEsc2VsZWN0KCcjJywuLi4pZG8gayhvLHNlbGVjdChvLC4uLiksJ3dhaXRhYmxlJyllbmQ7bG9jYWwgeT17Li4ufWxvY2FsIHo9e31sb2NhbCBBPXt9bG9jYWwgQj0jeTtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdT17cy5zZWxlY3Rvci5pbW1lZGlhdGUocyl9aWYgdVsxXXRoZW4gcmV0dXJuIHMsZSh1LDIpZW5kIGVuZDtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdD1zLnNlbGVjdG9yO3pbb109dDtBW29dPXQuZW50ZXIocyllbmQ7bG9jYWwgQz1uaWw7cmVwZWF0IGxvY2FsIHc9ZihhKCkpbG9jYWwgeD13WzFdaWYgeD09J3Rlcm1pbmF0ZSd0aGVuIGZvciBvPTEsQiBkbyBsb2NhbCBzPXlbb11sb2NhbCB0PXpbb11sb2NhbCB2PUFbb110LmxlYXZlKHMsdixmYWxzZSllbmQ7ZXJyb3IoIlRlcm1pbmF0ZWQiLDApZW5kO2ZvciBvPTEsQiBkbyBsb2NhbCBzPXlbb11sb2NhbCB0PXpbb11sb2NhbCB2PUFbb11pZiB0LmNvbmRpdGlvbihzLHYsdyl0aGVuIEM9bzticmVhayBlbmQgZW5kIHVudGlsIEM7bG9jYWwgRDtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdD16W29dbG9jYWwgdj1BW29daWYgbz09QyB0aGVuIEQ9Zih0LmxlYXZlKHMsdix0cnVlKSllbHNlIHQubGVhdmUocyx2LGZhbHNlKWVuZCBlbmQ7cmV0dXJuIHlbQ10sZShEKWVuZDtsb2NhbCBmdW5jdGlvbiBFKClyZXR1cm4gZmFsc2UgZW5kO2xvY2FsIEY9e31sb2NhbCBHPTE7Ri5zZWxlY3Rvcj17aW1tZWRpYXRlPUUsZW50ZXI9ZnVuY3Rpb24oc2VsZilsb2NhbCBIPUc7Rz1HKzE7aChzZWxmLmNvbnN1bWVycyxIKXJldHVybiBIIGVuZCxjb25kaXRpb249ZnVuY3Rpb24oc2VsZixILHcpbG9jYWwgSSxKLEs9dGFibGUudW5wYWNrKHcpcmV0dXJuIEk9PSdub3RpZnlfd2FrZSdhbmQgSj09c2VsZi5pZCBhbmQoSz09SCBvciBub3QgSyllbmQsbGVhdmU9ZnVuY3Rpb24oc2VsZixILEMpaWYgbm90IEMgdGhlbiBsb2NhbCBMPXNlbGYuY29uc3VtZXJzO2xvY2FsIE09bChMLEgpaWYgTSB0aGVuIGcoTCxNKXJldHVybiBmYWxzZSBlbHNlIHJldHVybiB0cnVlIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZH1mdW5jdGlvbiBGOndhaXQoKWsoMSxzZWxmLCdub3RpZnknKXJldHVybiByKHNlbGYpZW5kO2Z1bmN0aW9uIEY6d2FrZSgpaygxLHNlbGYsJ25vdGlmeScpbG9jYWwgTD1zZWxmLmNvbnN1bWVycztsb2NhbCBOPWcoTCwxKWlmIE4gdGhlbiBvcy5xdWV1ZUV2ZW50KCJub3RpZnlfd2FrZSIsc2VsZi5pZCxOKXJldHVybiB0cnVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7ZnVuY3Rpb24gRjp3YWtlX2FsbCgpaygxLHNlbGYsJ25vdGlmeScpbG9jYWwgTz0jc2VsZi5jb25zdW1lcnM7aWYgTz4wIHRoZW4gc2VsZi5jb25zdW1lcnM9e31vcy5xdWV1ZUV2ZW50KCJub3RpZnlfd2FrZSIsc2VsZi5pZClyZXR1cm4gTyBlbHNlIHJldHVybiAwIGVuZCBlbmQ7bG9jYWwgUD17X19pbmRleD1GLF9fY2xhc3Nlcz1wLF9fbmFtZT0nbm90aWZ5J31sb2NhbCBRPTE7bG9jYWwgZnVuY3Rpb24gUigpbG9jYWwgSj1RO1E9USsxO2xvY2FsIFM9e2lkPUosY291bnQ9MCxjb25zdW1lcnM9e319cmV0dXJuIHNldG1ldGF0YWJsZShTLFApZW5kO3Eubm90aWZ5PVI7bG9jYWwgZnVuY3Rpb24gVChzZWxmKWxvY2FsIFM9c2VsZi5ub3RpZnk7cmV0dXJuIFMuc2VsZWN0b3IuZW50ZXIoUyllbmQ7bG9jYWwgZnVuY3Rpb24gVShzZWxmLFYsdylsb2NhbCBTPXNlbGYubm90aWZ5O3JldHVybiBTLnNlbGVjdG9yLmNvbmRpdGlvbihTLFYsdyllbmQ7bG9jYWwgZnVuY3Rpb24gVyhzZWxmLFYsQylsb2NhbCBTPXNlbGYubm90aWZ5O3JldHVybiBTLnNlbGVjdG9yLmxlYXZlKFMsVixDKWVuZDtsb2NhbCBmdW5jdGlvbiBYKHUsWSlyZXR1cm57aW1tZWRpYXRlPXUsZW50ZXI9VCxjb25kaXRpb249VSxsZWF2ZT1mdW5jdGlvbihzZWxmLHYsQylsb2NhbCBaPVcoc2VsZix2LEMpcmV0dXJuIFkoc2VsZixaLEMpZW5kfWVuZDtsb2NhbCBfPXt9ZnVuY3Rpb24gXzp0cnlfbG9jaygpaygxLHNlbGYsJ2xvY2thYmxlJylyZXR1cm4gc2VsZi5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZillbmQ7ZnVuY3Rpb24gXzpsb2NrKClrKDEsc2VsZiwnbG9ja2FibGUnKXIoc2VsZillbmQ7ZnVuY3Rpb24gXzp1bmxvY2soKWsoMSxzZWxmLCdsb2NrYWJsZScpZXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpZW5kO2Z1bmN0aW9uIF86d2l0aF9sb2NrKGEwLC4uLilrKDEsc2VsZiwnbG9ja2FibGUnKWsoMixhMCwnZnVuY3Rpb24nKXIoc2VsZilsb2NhbCBEPXtwY2FsbChhMCwuLi4pfXNlbGY6dW5sb2NrKClpZiBEWzFddGhlbiByZXR1cm4gZShELDIpZWxzZSBlcnJvcihEWzJdLDApZW5kIGVuZDtmdW5jdGlvbiBfOndpdGhfdHJ5X2xvY2soYTAsLi4uKWsoMSxzZWxmLCdsb2NrYWJsZScpaygyLGEwLCdmdW5jdGlvbicpbG9jYWwgYTE9c2VsZi5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZilpZiBhMSB0aGVuIGxvY2FsIEQ9e3BjYWxsKGEwLC4uLil9c2VsZjp1bmxvY2soKWlmIERbMV10aGVuIHJldHVybiB0cnVlLGUoRCwyKWVsc2UgZXJyb3IoRFsyXSwwKWVuZCBlbHNlIHJldHVybiBmYWxzZSBlbmQgZW5kO2Z1bmN0aW9uIF86d3JhcChhMClrKDEsc2VsZiwnbG9ja2FibGUnKWsoMixhMCwnZnVuY3Rpb24nKXJldHVybiBmdW5jdGlvbiguLi4pcmV0dXJuIHNlbGY6d2l0aF9sb2NrKGZ1bmN0aW9uKC4uLilyZXR1cm4gYTAoLi4uKWVuZCwuLi4pZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBhMihzZWxmLFosQylpZiBaIHRoZW4gc2VsZjp1bmxvY2soKWVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYTModSlyZXR1cm4gWCh1LGEyKWVuZDtsb2NhbCBhND17bG9ja2FibGU9dHJ1ZSx3YWl0YWJsZT10cnVlfWxvY2FsIGE1PXt9c2V0bWV0YXRhYmxlKGE1LHtfX2luZGV4PV99KWxvY2FsIGZ1bmN0aW9uIGE2KHNlbGYpaWYgc2VsZi5sb2NrZWQgdGhlbiByZXR1cm4gZmFsc2UgZWxzZSBzZWxmLmxvY2tlZD10cnVlO3JldHVybiB0cnVlIGVuZCBlbmQ7YTUuc2VsZWN0b3I9YTMoYTYpZnVuY3Rpb24gYTU6dW5sb2NrKClrKDEsc2VsZiwnbXV0ZXgnKWlmIG5vdCBzZWxmLmxvY2tlZCB0aGVuIGVycm9yKCJtdXRleCBub3QgbG9ja2VkIiwyKWVuZDtpZiBub3Qgc2VsZi5ub3RpZnk6d2FrZSgpdGhlbiBzZWxmLmxvY2tlZD1mYWxzZSBlbmQgZW5kO2xvY2FsIGE3PXtfX2luZGV4PWE1LF9fY2xhc3Nlcz1hNCxfX25hbWU9J211dGV4J31mdW5jdGlvbiBxLm11dGV4KClsb2NhbCBhOD17bG9ja2VkPWZhbHNlLG5vdGlmeT1SKCl9cmV0dXJuIHNldG1ldGF0YWJsZShhOCxhNyllbmQ7bG9jYWwgYTk9e31sb2NhbCBmdW5jdGlvbiBhYShzZWxmKWlmI3NlbGYucXVldWU+MCB0aGVuIHJldHVybiB0cnVlLGcoc2VsZi5xdWV1ZSwxKWVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYWIoc2VsZixaLEMpaWYgWiB0aGVuIHNlbGYubm90aWZ5Ondha2UoKWVuZDtpZiBDIHRoZW4gcmV0dXJuIGcoc2VsZi5xdWV1ZSwxKWVuZCBlbmQ7YTkuc2VsZWN0b3I9WChhYSxhYilmdW5jdGlvbiBhOTpzZW5kKG0paygxLHNlbGYsJ2NoYW5uZWwnKWgoc2VsZi5xdWV1ZSxtKXNlbGYubm90aWZ5Ondha2UoKWVuZDtmdW5jdGlvbiBhOTp0cnlfcmVjdigpaygxLHNlbGYsJ2NoYW5uZWwnKXJldHVybiBhYShzZWxmKWVuZDtmdW5jdGlvbiBhOTpyZWN2KClrKDEsc2VsZiwnY2hhbm5lbCcpcmV0dXJuIHIoc2VsZillbmQ7bG9jYWwgYWM9e19faW5kZXg9YTksX19jbGFzc2VzPXAsX19uYW1lPSdjaGFubmVsJ31mdW5jdGlvbiBxLmNoYW5uZWwoKWxvY2FsIGFkPXtxdWV1ZT17fSxub3RpZnk9UigpfXJldHVybiBzZXRtZXRhdGFibGUoYWQsYWMpZW5kO2xvY2FsIGFlPXt9bG9jYWwgZnVuY3Rpb24gYWYoc2VsZixaLEMpaWYgQyB0aGVuIHJldHVybiBzZWxmLnZhbHVlIGVuZCBlbmQ7YWUuc2VsZWN0b3I9WChFLGFmKWZ1bmN0aW9uIGFlOnNldChuKWsoMSxzZWxmLCdwcm9wZXJ0eScpaWYgc2VsZi52YWx1ZX49biB0aGVuIHNlbGYudmFsdWU9bjtzZWxmLm5vdGlmeTp3YWtlX2FsbCgpZW5kIGVuZDtmdW5jdGlvbiBhZTpjb2xsZWN0KGFnKWsoMSxzZWxmLCdwcm9wZXJ0eScpYWcoc2VsZi52YWx1ZSl3aGlsZSB0cnVlIGRvIGxvY2FsIG49cihzZWxmKWFnKG4pd2hpbGUgc2VsZi52YWx1ZX49biBkbyBuPXNlbGYudmFsdWU7YWcobillbmQgZW5kIGVuZDtmdW5jdGlvbiBhZTp3YWl0X3VudGlsKGFoKWsoMSxzZWxmLCdwcm9wZXJ0eScpbG9jYWwgbj1zZWxmLnZhbHVlO2lmIGFoKG4pdGhlbiByZXR1cm4gbiBlbmQ7d2hpbGUgdHJ1ZSBkbyBuPXIoc2VsZilpZiBhaChuKXRoZW4gcmV0dXJuIG4gZW5kIGVuZCBlbmQ7bG9jYWwgYWk9e19faW5kZXg9YWUsX19jbGFzc2VzPXAsX19uYW1lPSdwcm9wZXJ0eSd9ZnVuY3Rpb24gcS5wcm9wZXJ0eShhailsb2NhbCBhaz17dmFsdWU9YWosbm90aWZ5PVIoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFrLGFpKWVuZDtsb2NhbCBmdW5jdGlvbiBhbChzZWxmKWlmIHNlbGYubG9ja2VkIHRoZW4gcmV0dXJuIGZhbHNlIGVsc2UgbG9jYWwgTz1zZWxmLmNvdW50O2lmIE89PTAgdGhlbiBzZWxmLndyaXRlLmxvY2tlZD10cnVlIGVuZDtzZWxmLmNvdW50PU8rMTtyZXR1cm4gdHJ1ZSBlbmQgZW5kO2xvY2FsIGFtPXt9YW0uc2VsZWN0b3I9YTMoYWwpZnVuY3Rpb24gYW06dW5sb2NrKClrKDEsc2VsZiwncmVhZF9tdXRleCcpbG9jYWwgTz1zZWxmLmNvdW50O2lmIE89PTAgdGhlbiBlcnJvcigibXV0ZXggaXMgbm90IGxvY2tlZCIsMillbmQ7c2VsZi5jb3VudD1PLTE7aWYgTz09MSB0aGVuIGxvY2FsIGFuPXNlbGYud3JpdGU7aWYgYW4ubm90aWZ5Ondha2UoKXRoZW4gc2VsZi5sb2NrZWQ9dHJ1ZSBlbmQgZW5kIGVuZDtzZXRtZXRhdGFibGUoYW0se19faW5kZXg9X30pbG9jYWwgYW89e19faW5kZXg9YW0sX19jbGFzc2VzPWE0LF9fbmFtZT0ncmVhZF9tdXRleCd9bG9jYWwgZnVuY3Rpb24gYXAoc2VsZilpZiBzZWxmLmxvY2tlZCB0aGVuIHJldHVybiBmYWxzZSBlbHNlIGxvY2FsIGFxPXNlbGYucmVhZDthcS5sb2NrZWQ9dHJ1ZTtzZWxmLmxvY2tlZD10cnVlO3JldHVybiB0cnVlIGVuZCBlbmQ7bG9jYWwgYXI9e31hci5zZWxlY3Rvcj1hMyhhcClmdW5jdGlvbiBhcjp1bmxvY2soKWsoMSxzZWxmLCd3cml0ZV9tdXRleCcpbG9jYWwgYXE9c2VsZi5yZWFkO2xvY2FsIE89YXEuY291bnQ7aWYgbm90IHNlbGYubG9ja2VkIG9yIE8+MCB0aGVuIGVycm9yKCJtdXRleCBpcyBub3QgbG9ja2VkIiwyKWVuZDtpZiBzZWxmLm5vdGlmeTp3YWtlKCl0aGVuIHJldHVybiBlbmQ7YXEubG9ja2VkPWZhbHNlO2xvY2FsIGFzPWFxLm5vdGlmeTp3YWtlX2FsbCgpaWYgYXM+MCB0aGVuIGFxLmNvdW50PWFzO3JldHVybiBlbmQ7c2VsZi5sb2NrZWQ9ZmFsc2UgZW5kO2xvY2FsIGF0PXtfX2luZGV4PWFyLF9fY2xhc3Nlcz1hNCxfX25hbWU9J3dyaXRlX211dGV4J31mdW5jdGlvbiBxLnJ3X211dGV4KClsb2NhbCBhcT17Y291bnQ9MCxsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKSx3cml0ZT10cnVlfWxvY2FsIGFuPXtsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKSxyZWFkPXRydWV9YXEud3JpdGU9YW47YW4ucmVhZD1hcTtzZXRtZXRhdGFibGUoYXEsYW8pc2V0bWV0YXRhYmxlKGFuLGF0KXJldHVybiBhbixhcSBlbmQ7bG9jYWwgZnVuY3Rpb24gYXUoKXJldHVybiBkKCd1dGMnKS8xMDAwIGVuZDtsb2NhbCBhdj17fWF2LnNlbGVjdG9yPXt9ZnVuY3Rpb24gYXYuc2VsZWN0b3IuaW1tZWRpYXRlKHNlbGYpbG9jYWwgYXc9YXUoKWxvY2FsIGF4PXNlbGYubWlsZXN0b25lO2lmIGF3Pj1heCB0aGVuIHNlbGYubWlsZXN0b25lPWF4K3NlbGYucGVyaW9kO3JldHVybiB0cnVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7ZnVuY3Rpb24gYXYuc2VsZWN0b3IuZW50ZXIoc2VsZilsb2NhbCBheT1zZWxmLm1pbGVzdG9uZS1hdSgpaWYgYXk8MCB0aGVuIGF5PTAgZW5kO3JldHVybiBiKGF5KWVuZDtmdW5jdGlvbiBhdi5zZWxlY3Rvci5jb25kaXRpb24oc2VsZixheix3KXJldHVybiB3WzFdPT0ndGltZXInYW5kIHdbMl09PWF6IGVuZDtmdW5jdGlvbiBhdi5zZWxlY3Rvci5sZWF2ZShzZWxmLGF6LEMpaWYgbm90IEMgdGhlbiBjKGF6KWVsc2Ugc2VsZi5taWxlc3RvbmU9c2VsZi5taWxlc3RvbmUrc2VsZi5wZXJpb2QgZW5kIGVuZDtmdW5jdGlvbiBhdjpzbGVlcCgpaygxLHNlbGYsJ3RpbWVyJylyZXR1cm4gcihzZWxmKWVuZDtmdW5jdGlvbiBhdjpza2lwX21pc3NlZCgpaygxLHNlbGYsJ3RpbWVyJylsb2NhbCBhdz1hdSgpbG9jYWwgYXg9c2VsZi5taWxlc3RvbmU7aWYgYXc8YXggdGhlbiByZXR1cm4gMCBlbmQ7bG9jYWwgYUE9c2VsZi5wZXJpb2Q7bG9jYWwgYUI9aSgoYXctYXgpL2FBKSsxO3NlbGYubWlsZXN0b25lPWF4K2FCKmFBO3JldHVybiBhQiBlbmQ7bG9jYWwgYUM9e19faW5kZXg9YXYsX19jbGFzc2VzPXAsX19uYW1lPSd0aW1lcid9ZnVuY3Rpb24gcS50aW1lcihhQSxhRClrKDEsYUEsJ251bWJlcicpaygyLGFELCdudW1iZXInLCduaWwnKWlmIG5vdCBhRCB0aGVuIGFEPWF1KCkrYUEgZW5kO2xvY2FsIGF6PXttaWxlc3RvbmU9YUQscGVyaW9kPWFBfXJldHVybiBzZXRtZXRhdGFibGUoYXosYUMpZW5kO2xvY2FsIGFFPXt9YUUuc2VsZWN0b3I9e31hRS5zZWxlY3Rvci5pbW1lZGlhdGU9RTtmdW5jdGlvbiBhRS5zZWxlY3Rvci5lbnRlcihzZWxmKXJldHVybiBiKHNlbGYuZGVsYXkpZW5kO2Z1bmN0aW9uIGFFLnNlbGVjdG9yLmNvbmRpdGlvbihzZWxmLGF6LHcpcmV0dXJuIHdbMV09PSd0aW1lcidhbmQgd1syXT09YXogZW5kO2Z1bmN0aW9uIGFFLnNlbGVjdG9yLmxlYXZlKHNlbGYsYXosQylpZiBub3QgQyB0aGVuIGMoYXopZW5kIGVuZDtsb2NhbCBhRj17X19pbmRleD1hRSxfX2NsYXNzZXM9cCxfX25hbWU9J3RpbWVvdXQnfWZ1bmN0aW9uIHEudGltZW91dChhRylrKDEsYUcsJ251bWJlcicpbG9jYWwgYUg9e2RlbGF5PWFHfXJldHVybiBzZXRtZXRhdGFibGUoYUgsYUYpZW5kO2xvY2FsIGFJPXt9YUkuc2VsZWN0b3I9e31hSS5zZWxlY3Rvci5pbW1lZGlhdGU9RTtmdW5jdGlvbiBhSS5zZWxlY3Rvci5lbnRlcigpcmV0dXJue31lbmQ7ZnVuY3Rpb24gYUkuc2VsZWN0b3IuY29uZGl0aW9uKHNlbGYsdix3KWxvY2FsIGFKPXNlbGYuZmlsdGVyKHcpaWYgYUogdGhlbiBmb3Igbz0xLCN3IGRvIHZbb109d1tvXWVuZCBlbmQ7cmV0dXJuIGFKIGVuZDtmdW5jdGlvbiBhSS5zZWxlY3Rvci5sZWF2ZShzZWxmLHYsQylpZiBDIHRoZW4gcmV0dXJuIHYgZW5kIGVuZDtmdW5jdGlvbiBhSTpsaXN0ZW4oKWsoMSxzZWxmLCdldmVudCcpcmV0dXJuIGUocihzZWxmKSllbmQ7bG9jYWwgYUs9e19faW5kZXg9YUksX19jbGFzc2VzPXAsX19uYW1lPSdldmVudCd9ZnVuY3Rpb24gcS5ldmVudChhTClrKDEsYUwsJ2Z1bmN0aW9uJywnc3RyaW5nJywndGFibGUnKWlmIHR5cGUoYUw9PSdzdHJpbmcnKXRoZW4gbG9jYWwgYU09YUw7YUw9ZnVuY3Rpb24odylyZXR1cm4gd1sxXT09YU0gZW5kIGVsc2VpZiB0eXBlKGFMKT09J3RhYmxlJ3RoZW4gbG9jYWwgYU49YUw7YUw9ZnVuY3Rpb24odylmb3IgYU8sbiBpbiBwYWlycyhhTilkbyBpZiB3W2FPXX49biB0aGVuIHJldHVybiBmYWxzZSBlbmQgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQ7bG9jYWwgdz17ZmlsdGVyPWFMfXJldHVybiBzZXRtZXRhdGFibGUodyxhSyllbmQ7bG9jYWwgYVA9e31sb2NhbCBmdW5jdGlvbiBhUShzZWxmKWxvY2FsIGFSPXNlbGYuYXF1aXJlZDtsb2NhbCBPPXNlbGYuY291bnQ7aWYgYVI8TyB0aGVuIGFSPWFSKzE7c2VsZi5hcXVpcmVkPWFSO2lmIGFSPT1PIHRoZW4gc2VsZi5sb2NrZWQ9dHJ1ZSBlbmQ7cmV0dXJuIHRydWUgZWxzZSByZXR1cm4gZmFsc2UgZW5kIGVuZDthUC5zZWxlY3Rvcj1hMyhhUSlmdW5jdGlvbiBhUDp1bmxvY2soKWsoMSxzZWxmLCdzZW1hcGhvcmUnKWxvY2FsIGFSPXNlbGYuYXF1aXJlZDtpZiBhUj09MCB0aGVuIGVycm9yKCJzZW1hcGhvcmUgaXMgbm90IGxvY2tlZCIsMillbmQ7aWYgbm90IHNlbGYubm90aWZ5Ondha2UoKXRoZW4gc2VsZi5hcXVpcmVkPWFSLTE7c2VsZi5sb2NrZWQ9ZmFsc2UgZW5kIGVuZDtzZXRtZXRhdGFibGUoYVAse19faW5kZXg9X30pbG9jYWwgYVM9e19faW5kZXg9YVAsX19jbGFzc2VzPWE0LF9fbmFtZT0nc2VtYXBob3JlJ31mdW5jdGlvbiBxLnNlbWFwaG9yZShPKWsoMSxPLCdudW1iZXInKWxvY2FsIGFUPXtjb3VudD1pKE8pLGFxdWlyZWQ9MCxsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFULGFTKWVuZDtsb2NhbCBhVT17fWxvY2FsIGZ1bmN0aW9uIGFWKHNlbGYpaWYgc2VsZi5jb21wbGV0ZWQgdGhlbiByZXR1cm4gdHJ1ZSxzZWxmLnZhbHVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYVcoc2VsZixaLEMpaWYgQyB0aGVuIHJldHVybiBzZWxmLnZhbHVlIGVuZCBlbmQ7YVUuc2VsZWN0b3I9WChhVixhVylmdW5jdGlvbiBhVTpnZXQoKWsoMSxzZWxmLCdmdXR1cmUnKXJldHVybiByKHNlbGYpZW5kO2Z1bmN0aW9uIGFVOmNvbXBsZXRlKG4paygxLHNlbGYsJ2Z1dHVyZScpaWYgc2VsZi5jb21wbGV0ZWQgdGhlbiBlcnJvcigiZnV0dXJlIGlzIGFscmVhZHkgY29tcGxldGVkIiwyKWVuZDtzZWxmLmNvbXBsZXRlZD10cnVlO3NlbGYudmFsdWU9bjtzZWxmLm5vdGlmeTp3YWtlX2FsbCgpZW5kO2xvY2FsIGFYPXtfX2luZGV4PWFVLF9fY2xhc3Nlcz1wLF9fbmFtZT0nZnV0dXJlJ31mdW5jdGlvbiBxLmZ1dHVyZSgpbG9jYWwgYVk9e2NvbXBsZXRlZD1mYWxzZSx2YWx1ZT1mYWxzZSxub3RpZnk9cS5ub3RpZnkoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFZLGFYKWVuZDtyZXR1cm4gcQo=";
  37.     ["ktlo.job"] = base64.decode "bG9jYWwgY29uY3VycmVudCA9IHJlcXVpcmUgJ2t0bG8uY29uY3VycmVudCcKbG9jYWwgdGFzayA9IHJlcXVpcmUgJ2t0bG8udGFzaycKCmxvY2FsIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgZW5kaW5nKQoJcmV0dXJuIHN0cjpzdWIoLSNlbmRpbmcpID09IGVuZGluZwplbmQKCmxvY2FsIGZ1bmN0aW9uIGlzX3Rlcm1pbmF0ZWQoc3RyKQoJcmV0dXJuIGVuZHNXaXRoKHN0ciwgIlRlcm1pbmF0ZWQiKQplbmQKCmxvY2FsIGxpYnJhcnkgPSB7fQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbG9jYWwgam9iX21ldGhvZHMgPSB7fQoKam9iX21ldGhvZHMuc2VsZWN0b3IgPSB7fQoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IuaW1tZWRpYXRlKHNlbGYpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5pbW1lZGlhdGUoZnV0dXJlKQplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzLnNlbGVjdG9yLmVudGVyKHNlbGYpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5lbnRlcihmdXR1cmUpCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IuY29uZGl0aW9uKHNlbGYsIGNvbnRleHQsIGV2ZW50KQoJbG9jYWwgZnV0dXJlID0gc2VsZi5mdXR1cmUKCXJldHVybiBmdXR1cmUuc2VsZWN0b3IuY29uZGl0aW9uKGZ1dHVyZSwgY29udGV4dCwgZXZlbnQpCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IubGVhdmUoc2VsZiwgY29udGV4dCwgc2VsZWN0ZWQpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5sZWF2ZShmdXR1cmUsIGNvbnRleHQsIHNlbGVjdGVkKQplbmQKCmxvY2FsIGpvYl9tZXRhID0gewoJX19pbmRleCA9IGpvYl9tZXRob2RzOwoJX19jbGFzc2VzID0geyB3YWl0YWJsZSA9IHRydWUgfTsKCV9fbmFtZSA9ICd0YXNrJzsKfQoKbG9jYWwgZnVuY3Rpb24gam9iX3Jvb3Qoam9iKQoJbG9jYWwgcGFyZW50ID0gam9iLnBhcmVudAoJaWYgcGFyZW50IHRoZW4KCQlyZXR1cm4gam9iX3Jvb3QocGFyZW50KQoJZWxzZQoJCXJldHVybiBqb2IKCWVuZAplbmQKCmxvY2FsIGpvYl9jaGlsZF9kZWF0aAoKbG9jYWwgZnVuY3Rpb24gam9iX3Rlcm1pbmF0ZV9jb25kaXRpb24oam9iKQoJaWYgam9iLnRhc2suc3RhdHVzIH49ICdhbGl2ZScgYW5kIG5vdCBuZXh0KGpvYi5jaGlsZHJlbikgYW5kIG5vdCBqb2IuZnV0dXJlLmNvbXBsZXRlZCB0aGVuCgkJaWYgbm90IGpvYi5yZXN1bHQuY29tcGxldGVkIHRoZW4KCQkJam9iLnJlc3VsdDpjb21wbGV0ZShqb2IudGFzay5mdXR1cmU6Z2V0KCkpCgkJZW5kCgkJam9iLmZ1dHVyZTpjb21wbGV0ZShqb2IucmVzdWx0OmdldCgpKQoJCWxvY2FsIHN1Y2Nlc3MsIGVyciA9IGpvYi5mdXR1cmU6Z2V0KCk6dW5wYWNrKCkKCQlpZiBzdWNjZXNzIHRoZW4KCQkJam9iLnN0YXR1cyA9ICdkb25lJwoJCWVsc2UKCQkJaWYgaXNfdGVybWluYXRlZChlcnIpIHRoZW4KCQkJCWpvYi5zdGF0dXMgPSAnY2FuY2VsZWQnCgkJCWVsc2UKCQkJCWpvYi5zdGF0dXMgPSAnYmFkJwoJCQllbmQKCQllbmQKCQlpZiBqb2IucGFyZW50IHRoZW4KCQkJam9iX2NoaWxkX2RlYXRoKGpvYi5wYXJlbnQsIGpvYikKCQllbmQKCWVuZAplbmQKCmpvYl9jaGlsZF9kZWF0aCA9IGZ1bmN0aW9uKGpvYiwgY2hpbGQpCglpZiBjaGlsZC5zdGF0dXMgPT0gJ2JhZCcgdGhlbgoJCWlmIG5vdCBqb2IucmVzdWx0LmNvbXBsZXRlZCB0aGVuCgkJCWpvYi5yZXN1bHQ6Y29tcGxldGUoY2hpbGQuZnV0dXJlOmdldCgpKQoJCQktLSBpZ25vcmUgcGFyYWxsZWwgZXJyb3JzIGZvciBub3cKCQkJbG9jYWwgcm9vdCA9IGpvYl9yb290KGpvYikKCQkJbG9jYWwgdHJhY2VzID0gcm9vdC50cmFjZXMgb3Ige30KCQkJdGFibGUuaW5zZXJ0KHRyYWNlcywgY2hpbGQudGFzay50cmFjZWJhY2spCgkJCXJvb3QudHJhY2VzID0gdHJhY2VzCgkJZW5kCgkJam9iOmNhbmNlbCgpCgllbmQKCWpvYi5jaGlsZHJlbltjaGlsZF0gPSBuaWwKCWpvYl90ZXJtaW5hdGVfY29uZGl0aW9uKGpvYikKZW5kCgpsb2NhbCBmdW5jdGlvbiBqb2JfY3JlYXRlKHBvb2wsIGFjdGlvbikKCWFzc2VydChhY3Rpb24pCglsb2NhbCBqb2IKCWpvYiA9IHsKCQlzdGF0dXMgPSAnd29ya2luZyc7CgkJcmVzdWx0ID0gY29uY3VycmVudC5mdXR1cmUoKTsKCQlmdXR1cmUgPSBjb25jdXJyZW50LmZ1dHVyZSgpOwoJCWNoaWxkcmVuID0ge307CgkJdGFzayA9IHBvb2w6c3Bhd24oZnVuY3Rpb24oKQoJCQl0YXNrLmNvbnRleHQoKS5KT0IgPSBqb2IKCQkJcmV0dXJuIGFjdGlvbigpCgkJZW5kKTsKCX0KCXNldG1ldGF0YWJsZShqb2IsIGpvYl9tZXRhKQoJcG9vbDpzcGF3bl9pbW1vcnRhbChmdW5jdGlvbigpCgkJam9iLnRhc2s6d2FpdCgpCgkJaWYgam9iLnRhc2suc3RhdHVzID09ICdmYWlsZWQnIHRoZW4KCQkJam9iOmNhbmNlbCgpCgkJZW5kCgkJam9iX3Rlcm1pbmF0ZV9jb25kaXRpb24oam9iKQoJZW5kKTpzdGFydCgpCglyZXR1cm4gam9iCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHM6Zm9yayhhY3Rpb24pCglsb2NhbCBqb2IgPSBqb2JfY3JlYXRlKHNlbGYudGFzay5wb29sLCBhY3Rpb24pCglqb2IucGFyZW50ID0gc2VsZgoJc2VsZi5jaGlsZHJlbltqb2JdID0gdHJ1ZQoJcmV0dXJuIGpvYgplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzOmFzeW5jKGFjdGlvbikKCWxvY2FsIGpvYiA9IHNlbGY6Zm9yayhhY3Rpb24pCglqb2IudGFzazpzdGFydCgpCglyZXR1cm4gam9iCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHM6Y2FuY2VsX2NoaWxkcmVuKCkKCWZvciBjaGlsZCBpbiBwYWlycyhzZWxmLmNoaWxkcmVuKSBkbwoJCWNoaWxkOmNhbmNlbCgpCgllbmQKZW5kCgpmdW5jdGlvbiBqb2JfbWV0aG9kczpjYW5jZWwoKQoJc2VsZjpjYW5jZWxfY2hpbGRyZW4oKQoJc2VsZi50YXNrOnN0b3AoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gam9iX21ldGhvZHM6YXdhaXQoKQoJcmV0dXJuIHNlbGYuZnV0dXJlOmdldCgpOnVud3JhcCgpCmVuZAoKLS0tIEBhc3luYwpmdW5jdGlvbiBqb2JfbWV0aG9kczphd2FpdF90aW1lb3V0KHRpbWVvdXQpCglsb2NhbCByZXN1bHQgPSBjb25jdXJyZW50LnNlbGVjdChzZWxmLCBjb25jdXJyZW50LnRpbWVvdXQodGltZW91dCkpCglpZiByZXN1bHQgPT0gc2VsZiB0aGVuCgkJcmV0dXJuIHRydWUsIHNlbGY6YXdhaXQoKQoJZWxzZQoJCXNlbGY6Y2FuY2VsKCkKCQlyZXR1cm4gZmFsc2UKCWVuZAplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzOmZpbm5hbGl6ZShhY3Rpb24pCglsb2NhbCB0YXNrID0gc2VsZi50YXNrLnBvb2w6c3Bhd25faW1tb3J0YWwoZnVuY3Rpb24oKQoJCWNvbmN1cnJlbnQud2FpdChzZWxmKQoJCXJldHVybiBhY3Rpb24oKQoJZW5kKQoJdGFzazpzdGFydCgpCglyZXR1cm4gdGFzawplbmQKCmZ1bmN0aW9uIGxpYnJhcnkucnVuKGFjdGlvbikKCWxvY2FsIHBvb2wgPSB0YXNrLnBvb2woKQoJbG9jYWwgcm9vdCA9IGpvYl9jcmVhdGUocG9vbCwgYWN0aW9uKQoJcm9vdC50YXNrOnN0YXJ0KCkKCXBvb2w6cnVuKCkKCXJvb3QuZnV0dXJlOmdldCgpCglsb2NhbCB0cmFjZXMgPSByb290LnRyYWNlcyBvciB7fQoJbG9jYWwgdHJhY2ViYWNrID0gcm9vdC50YXNrLnRyYWNlYmFjawoJaWYgdHJhY2ViYWNrIHRoZW4KCQl0YWJsZS5pbnNlcnQodHJhY2VzLCB0cmFjZWJhY2spCgllbmQKCWlmIG5leHQodHJhY2VzKSB0aGVuCgkJbG9jYWwgZmlsZW5hbWUgPSBvcy5kYXRlKCJjcmFzaF8lWS0lbS0lZFQlSDolTTolU1oudHh0IikKCQlsb2NhbCBmaWxlID0gaW8ub3BlbihmaWxlbmFtZSwgJ3cnKQoJCWlmIGZpbGUgdGhlbgoJCQlmaWxlOndyaXRlKCJFUlJPUjogIikKCQkJZmlsZTp3cml0ZShzZWxlY3QoMiwgcm9vdC5mdXR1cmU6Z2V0KCk6dW5wYWNrKCkpKQoJCQlmaWxlOndyaXRlKCdcbicpCgkJCWZvciBpPSN0cmFjZXMsIDEsIC0xIGRvCgkJCQlsb2NhbCB0cmFjZSA9IHRyYWNlc1tpXQoJCQkJZmlsZTp3cml0ZSh0cmFjZSkKCQkJCWZpbGU6d3JpdGUoJ1xuJykKCQkJZW5kCgkJCWZpbGU6Y2xvc2UoKQoJCWVuZAoJZW5kCglyZXR1cm4gcm9vdDphd2FpdCgpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5ydW5uaW5nKCkKCXJldHVybiB0YXNrLmNvbnRleHQoKS5KT0IKZW5kCgpsb2NhbCBmdW5jdGlvbiBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKCXJldHVybiBsaWJyYXJ5LnJ1bm5pbmcoKSBvciBlcnJvcigibm8gam9iIGluIGN1cnJlbnQgY29udGV4dCIsIDMpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hc3luYyhhY3Rpb24pCglyZXR1cm4gam9iX3JlcXVpcmVfcnVubmluZygpOmFzeW5jKGFjdGlvbikKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LmNhbmNlbCgpCglyZXR1cm4gam9iX3JlcXVpcmVfcnVubmluZygpOmNhbmNlbCgpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hbnkoLi4uKQoJbG9jYWwgcmVzdWx0ID0geyBjb25jdXJyZW50LnNlbGVjdCguLi4pIH0KCWZvciBfLCBqb2IgaW4gaXBhaXJzIHsgLi4uIH0gZG8KCQlqb2I6Y2FuY2VsKCkKCWVuZAoJcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5jcml0aWNhbChhY3Rpb24pCglsb2NhbCBqb2IgPSBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKCWxvY2FsIHQgPSBqb2IudGFzay5wb29sOnNwYXduX2ltbW9ydGFsKGZ1bmN0aW9uKCkKCQl0YXNrLmNvbnRleHQoKS5KT0IgPSBqb2IKCQlyZXR1cm4gYWN0aW9uKCkKCWVuZCkKCXQ6c3RhcnQoKQoJcmV0dXJuIHQ6am9pbigpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5yZXRyeSh0aW1lcywgYWN0aW9uLCAuLi4pCglsb2NhbCBlcnIKCWZvciBfPTEsIHRpbWVzIGRvCgkJbG9jYWwgciA9IHRhYmxlLnBhY2socGNhbGwoYWN0aW9uLCAuLi4pKQoJCWlmIHJbMV0gdGhlbgoJCQlyZXR1cm4gdGFibGUudW5wYWNrKHIsIDIpCgkJZWxzZQoJCQllcnIgPSByWzJdCgkJCWlmIGlzX3Rlcm1pbmF0ZWQoZXJyKSB0aGVuCgkJCQlicmVhawoJCQllbmQKCQllbmQKCWVuZAoJZXJyb3IoZXJyLCAwKQplbmQKCmxpYnJhcnkubGl2ZWRhdGEgPSB7fQoKZnVuY3Rpb24gbGlicmFyeS5saXZlZGF0YS5zdWJzY3JpYmUocHJvcGVydHksIGFjdGlvbikKCXJldHVybiBsaWJyYXJ5LmFzeW5jKGZ1bmN0aW9uKCkKCQlwcm9wZXJ0eTpjb2xsZWN0KGZ1bmN0aW9uKHZhbHVlKQoJCQlsaWJyYXJ5LmFzeW5jKGZ1bmN0aW9uKCkKCQkJCWFjdGlvbih2YWx1ZSkKCQkJZW5kKQoJCWVuZCkKCWVuZCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBleHRyYWN0X3ZhbHVlcyhwcm9wZXJ0aWVzKQoJbG9jYWwgdmFsdWVzID0ge30KCWZvciBpLCBwcm9wZXJ0eSBpbiBpcGFpcnMocHJvcGVydGllcykgZG8KCQl2YWx1ZXNbaV0gPSBwcm9wZXJ0eS52YWx1ZQoJZW5kCglyZXR1cm4gdGFibGUudW5wYWNrKHZhbHVlcykKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LmxpdmVkYXRhLmNvbWJpbmUoYWN0aW9uLCAuLi4pCglsb2NhbCBqb2IgPSBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKCWxvY2FsIHByb3BlcnRpZXMgPSB0YWJsZS5wYWNrKC4uLikKCWxvY2FsIGluaXQgPSBhY3Rpb24oZXh0cmFjdF92YWx1ZXMocHJvcGVydGllcykpCglsb2NhbCByZXN1bHQgPSBjb25jdXJyZW50LnByb3BlcnR5KGluaXQpCglqb2I6YXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJY29uY3VycmVudC5zZWxlY3QodGFibGUudW5wYWNrKHByb3BlcnRpZXMpKQoJCQlyZXN1bHQ6c2V0KGFjdGlvbihleHRyYWN0X3ZhbHVlcyhwcm9wZXJ0aWVzKSkpCgkJZW5kCgllbmQpCglyZXR1cm4gcmVzdWx0CmVuZAoKZnVuY3Rpb24gbGlicmFyeS5saXZlZGF0YS5kZXRlcm1pbmVzKHByb3BlcnR5LCBhY3Rpb24pCglsb2NhbCBqb2IKCXJldHVybiBsaWJyYXJ5LmxpdmVkYXRhLnN1YnNjcmliZShwcm9wZXJ0eSwgZnVuY3Rpb24odmFsdWUpCgkJaWYgam9iIHRoZW4KCQkJam9iOmNhbmNlbCgpCgkJZW5kCgkJaWYgdmFsdWUgdGhlbgoJCQlqb2IgPSBsaWJyYXJ5LmFzeW5jKGFjdGlvbikKCQllbmQKCWVuZCkKZW5kCgpyZXR1cm4gbGlicmFyeQo=";
  38.     ["ktlo.resources"] = base64.decode "bG9jYWwgYT17fWZ1bmN0aW9uIGEubG9hZChiKWxvY2FsIGM9aW8ub3BlbihiLCdyJylpZiBjIHRoZW4gbG9jYWwgZD1jOnJlYWQoJ2EnKWM6Y2xvc2UoKXJldHVybiBkIGVuZDtyZXR1cm4gYXNzZXJ0KFJFU09VUkNFUyBhbmQgUkVTT1VSQ0VTW2JdLCJyZXNvdXJjZSBcIiIuLmIuLiJcIiBub3QgZm91bmQiKWVuZDtyZXR1cm4gYQo=";
  39.     ["psg.keys"] = base64.decode "bG9jYWwgYmFzZTY0ID0gcmVxdWlyZSAna3Rsby5iYXNlNjQnCgpsb2NhbCBsaWIgPSB7fQoKbG9jYWwgZnVuY3Rpb24gaGFsZmluZyh2YWx1ZSkKCWxvY2FsIHNpemUgPSAoI3ZhbHVlKS8yCglsb2NhbCBtb3N0ID0gdmFsdWU6c3ViKDEsIHNpemUpCglsb2NhbCBsZWFzdCA9IHZhbHVlOnN1YihzaXplICsgMSkKCWxvY2FsIHJlc3VsdCA9IHt9Cglmb3IgaT0xLCBzaXplIGRvCgkJcmVzdWx0W2ldID0gc3RyaW5nLmNoYXIoYml0LmJ4b3IobW9zdDpieXRlKGkpLCBsZWFzdDpieXRlKGkpKSkKCWVuZAoJcmV0dXJuIHRhYmxlLmNvbmNhdChyZXN1bHQsICcnKQplbmQKCmxvY2FsIHplcm8gPSAoJzAnKTpieXRlKDEpCmxvY2FsIGEgPSAoJ0EnKTpieXRlKDEpCgpsb2NhbCBmdW5jdGlvbiBlbmNvZGVIZXhDb2RlKGNvZGUpCglsb2NhbCBzeW1ib2wKCWlmIGNvZGUgPCAxMCB0aGVuCgkJc3ltYm9sID0gemVybyArIGNvZGUKCWVsc2UKCQlzeW1ib2wgPSBhICsgY29kZQoJZW5kCglyZXR1cm4gc3RyaW5nLmNoYXIoc3ltYm9sKQplbmQKCmxvY2FsIGZ1bmN0aW9uIGVuY29kZUNoYXIoY2hhcikKCXJldHVybiBlbmNvZGVIZXhDb2RlKGJpdC5icnNoaWZ0KGNoYXIsIDQpKS4uZW5jb2RlSGV4Q29kZShiaXQuYmFuZChjaGFyLCAxNSkpCmVuZAoKbG9jYWwgZnVuY3Rpb24gZW5jb2RlSGV4KHN0cikKCWxvY2FsIHIgPSB7fQoJZm9yIGk9MSwgI3N0ciBkbwoJCXRhYmxlLmluc2VydChyLCBlbmNvZGVDaGFyKHN0cjpieXRlKGkpKSkKCWVuZAoJcmV0dXJuIHRhYmxlLmNvbmNhdChyLCAnJykKZW5kCgpmdW5jdGlvbiBsaWIuZmluZ2VycHJpbnQoa2V5KQoJcmV0dXJuIGVuY29kZUhleChoYWxmaW5nKGhhbGZpbmcoYmFzZTY0LmRlY29kZShrZXkpKSkpCmVuZAoKcmV0dXJuIGxpYgo=";
  40.     ["ktlo.task"] = base64.decode "bG9jYWwgY29uY3VycmVudCA9IHJlcXVpcmUgJ2t0bG8uY29uY3VycmVudCcKbG9jYWwgY29udGFpbmVyID0gcmVxdWlyZSAna3Rsby5jb250YWluZXInCgpsb2NhbCBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIGVuZGluZykKCXJldHVybiBzdHI6c3ViKC0jZW5kaW5nKSA9PSBlbmRpbmcKZW5kCgpsb2NhbCBxdWV1ZUV2ZW50UmF3ID0gb3MucXVldWVFdmVudFJhdyBvciBvcy5xdWV1ZUV2ZW50Cm9zLnF1ZXVlRXZlbnRSYXcgPSBxdWV1ZUV2ZW50UmF3Cgpsb2NhbCBsaWJyYXJ5ID0ge30KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCB0YXNrX21ldGhvZHMgPSB7fQoKdGFza19tZXRob2RzLnNlbGVjdG9yID0ge30KCmZ1bmN0aW9uIHRhc2tfbWV0aG9kcy5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZikKCWxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCglyZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmltbWVkaWF0ZShmdXR1cmUpCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzLnNlbGVjdG9yLmVudGVyKHNlbGYpCglsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQoJcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5lbnRlcihmdXR1cmUpCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzLnNlbGVjdG9yLmNvbmRpdGlvbihzZWxmLCBjb250ZXh0LCBldmVudCkKCWxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCglyZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmNvbmRpdGlvbihmdXR1cmUsIGNvbnRleHQsIGV2ZW50KQplbmQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kcy5zZWxlY3Rvci5sZWF2ZShzZWxmLCBjb250ZXh0LCBzZWxlY3RlZCkKCWxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCglyZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmxlYXZlKGZ1dHVyZSwgY29udGV4dCwgc2VsZWN0ZWQpCmVuZAoKdGFza19tZXRob2RzLndhaXQgPSBjb25jdXJyZW50LndhaXQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kczpqb2luKCkKCXJldHVybiBzZWxmLmZ1dHVyZTpnZXQoKTp1bndyYXAoKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHRhc2tfY29udGludWUoc2VsZiwgZXZlbnQpCglpZiBzZWxmLnN0YXR1cyB+PSAnYWxpdmUnIHRoZW4KCQlyZXR1cm4KCWVuZAoJaWYgZXZlbnRbMV0gPT0gJ3Rlcm1pbmF0ZScgYW5kIHNlbGYuaW1tb3J0YWwgdGhlbgoJCXJldHVybgoJZW5kCglsb2NhbCB0aHJlYWQgPSBzZWxmLnRocmVhZAoJbG9jYWwgcHJldl90YXNrID0gX1RBU0sKCV9HLl9UQVNLID0gc2VsZgoJbG9jYWwgcmVzdWx0ID0gY29udGFpbmVyLnJlc3VsdC5yZXN1bWluZyh0aHJlYWQsIHRhYmxlLnVucGFjayhldmVudCkpCglfRy5fVEFTSyA9IHByZXZfdGFzawoJbG9jYWwgb2ssIGVyciA9IHJlc3VsdDp1bnBhY2soKQoJaWYgbm90IG9rIHRoZW4KCQlzZWxmLmZ1dHVyZTpjb21wbGV0ZShyZXN1bHQpCgkJaWYgZW5kc1dpdGgoZXJyLCAiVGVybWluYXRlZCIpIHRoZW4KCQkJc2VsZi5zdGF0dXMgPSAnc3RvcGVkJwoJCWVsc2UKCQkJc2VsZi5zdGF0dXMgPSAnZmFpbGVkJwoJCQlzZWxmLnRyYWNlYmFjayA9IGRlYnVnLnRyYWNlYmFjayh0aHJlYWQsIGVycikKCQllbmQKCWVsc2VpZiBjb3JvdXRpbmUuc3RhdHVzKHRocmVhZCkgPT0gJ2RlYWQnIHRoZW4KCQlzZWxmLmZ1dHVyZTpjb21wbGV0ZShyZXN1bHQpCgkJc2VsZi5zdGF0dXMgPSAnZGVhZCcKCWVsc2UKCQlsb2NhbCBuZXh0X2V2ZW50ID0gZXJyCgkJc2VsZi5ldmVudCA9IG5leHRfZXZlbnQKCQlpZiBuZXh0X2V2ZW50ID09ICd3YWtlJyB0aGVuCgkJCXRhYmxlLmluc2VydChzZWxmLnBvb2wub3JkZXJzLCB7dGFzaz1zZWxmLCBvcmRlcj0nd2FrZSd9KQoJCWVuZAoJZW5kCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzOnJlc3VtZShldmVudCkKCXNlbGY6c3RhcnQoKQoJbG9jYWwgZXZlbnROYW1lID0gZXZlbnRbMV0KCWlmIGV2ZW50TmFtZSA9PSAndGFza19zdG9wJyB0aGVuCgkJaWYgZXZlbnRbMl0gPT0gc2VsZi5pZCB0aGVuCgkJCXRhc2tfY29udGludWUoc2VsZiwgeyAndGVybWluYXRlJyB9KQoJCWVuZAoJCXJldHVybgoJZW5kCglpZiBldmVudE5hbWUgPT0gJ3Rlcm1pbmF0ZScgb3IgKG5vdCBzZWxmLmV2ZW50KSBvciBzZWxmLmV2ZW50ID09IGV2ZW50TmFtZSB0aGVuCgkJdGFza19jb250aW51ZShzZWxmLCBldmVudCkKCWVuZAplbmQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kczpzdG9wKCkKCWlmIHNlbGYuc3RhdHVzID09ICdhbGl2ZScgdGhlbgoJCXRhYmxlLmluc2VydChzZWxmLnBvb2wub3JkZXJzLCB7IHRhc2s9c2VsZiwgb3JkZXI9J3N0b3AnIH0pCgllbmQKZW5kCgpmdW5jdGlvbiB0YXNrX21ldGhvZHM6c3RhcnQoKQoJaWYgbm90IHNlbGYuc3RhcnRlZCB0aGVuCgkJc2VsZi5zdGFydGVkID0gdHJ1ZQoJCXRhc2tfY29udGludWUoc2VsZiwge30pCgllbmQKZW5kCgpsb2NhbCB0YXNrX21ldGEgPSB7CglfX2luZGV4ID0gdGFza19tZXRob2RzOwoJX19jbGFzc2VzID0geyB3YWl0YWJsZSA9IHRydWUgfTsKCV9fbmFtZSA9ICd0YXNrJzsKfQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvY2FsIHBvb2xfbWV0aG9kcyA9IHt9Cgpsb2NhbCB0YXNrSWRDb3VudGVyID0gMQoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnNwYXduKGFjdGlvbiwgaW1tb3J0YWwpCglsb2NhbCB0YXNrID0gewoJCWlkID0gdGFza0lkQ291bnRlcjsKCQlpbW1vcnRhbCA9IGltbW9ydGFsIG9yIGZhbHNlOwoJCXBvb2wgPSBzZWxmOwoJCWZ1dHVyZSA9IGNvbmN1cnJlbnQuZnV0dXJlKCk7CgkJdGhyZWFkID0gY29yb3V0aW5lLmNyZWF0ZShhY3Rpb24pOwoJCWV2ZW50ID0gbmlsOwoJCXN0YXR1cyA9ICdhbGl2ZSc7CgkJY29udGV4dCA9IHt9OwoJCXN0YXJ0ZWQgPSBmYWxzZTsKCX0KCXRhc2tJZENvdW50ZXIgPSB0YXNrSWRDb3VudGVyICsgMQoJc2V0bWV0YXRhYmxlKHRhc2ssIHRhc2tfbWV0YSkKCXRhYmxlLmluc2VydChzZWxmLnRhc2tzLCB0YXNrKQoJcmV0dXJuIHRhc2sKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6c3Bhd25faW1tb3J0YWwoYWN0aW9uKQoJcmV0dXJuIHNlbGY6c3Bhd24oYWN0aW9uLCB0cnVlKQplbmQKCmZ1bmN0aW9uIHBvb2xfbWV0aG9kczpyZXN1bWUoZXZlbnQpCglsb2NhbCBmaWx0ZXJlZCA9IHt9Cglsb2NhbCBwcm9jZXNzID0gc2VsZi50YXNrcwoJc2VsZi50YXNrcyA9IGZpbHRlcmVkCglmb3IgXywgdGFzayBpbiBpcGFpcnMocHJvY2VzcykgZG8KCQl0YXNrOnJlc3VtZShldmVudCkKCQlpZiB0YXNrLnN0YXR1cyA9PSAnYWxpdmUnIHRoZW4KCQkJdGFibGUuaW5zZXJ0KGZpbHRlcmVkLCB0YXNrKQoJCWVuZAoJZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnByb2Nlc3Nfb3JkZXJzX3F1ZXVlKCkKCXdoaWxlIG5leHQoc2VsZi5vcmRlcnMpIGRvCgkJbG9jYWwgcXVldWUgPSBzZWxmLm9yZGVycwoJCXNlbGYub3JkZXJzID0ge30KCQlmb3IgXywgcmVjb3JkIGluIGlwYWlycyhxdWV1ZSkgZG8KCQkJbG9jYWwgdGFzayA9IHJlY29yZC50YXNrCgkJCWxvY2FsIG9yZGVyID0gcmVjb3JkLm9yZGVyCgkJCWlmIG9yZGVyID09ICdzdG9wJyB0aGVuCgkJCQl0YXNrX2NvbnRpbnVlKHRhc2ssIHsgJ3Rlcm1pbmF0ZScgfSkKCQkJZWxzZWlmIG9yZGVyID09ICd3YWtlJyB0aGVuCgkJCQl0YXNrX2NvbnRpbnVlKHRhc2ssIHsgJ3dha2UnIH0pCgkJCWVuZAoJCWVuZAoJZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnByb2Nlc3NfaW50ZXJuYWxfZXZlbnRzKCkKCWxvY2FsIGV2ZW50cyA9IHNlbGYuZXZlbnRzCglpZiBuZXh0KGV2ZW50cykgdGhlbgoJCXNlbGYuZXZlbnRzID0ge30KCQlmb3IgXywgZXZlbnQgaW4gaXBhaXJzKGV2ZW50cykgZG8KCQkJc2VsZjpyZXN1bWUoZXZlbnQpCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6c3RlcCgpCglzZWxmOnByb2Nlc3Nfb3JkZXJzX3F1ZXVlKCkKCXNlbGY6cHJvY2Vzc19pbnRlcm5hbF9ldmVudHMoKQoJaWYgbmV4dChzZWxmLnRhc2tzKSB0aGVuCgkJaWYgbmV4dChzZWxmLmV2ZW50cykgdGhlbgoJCQlxdWV1ZUV2ZW50UmF3KCdldmVudF9iYXRjaCcpCgkJZW5kCgkJbG9jYWwgZXZlbnQgPSB7IG9zLnB1bGxFdmVudFJhdygpIH0KCQlpZiBldmVudFsxXSB+PSAnZXZlbnRfYmF0Y2gnIHRoZW4KCQkJc2VsZjpyZXN1bWUoZXZlbnQpCgkJZW5kCgllbmQKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6cnVuKCkKCXdoaWxlIG5leHQoc2VsZi50YXNrcykgZG8KCQlzZWxmOnN0ZXAoKQoJZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnF1ZXVlX2V2ZW50KGV2ZW50TmFtZSwgLi4uKQoJdGFibGUuaW5zZXJ0KHNlbGYuZXZlbnRzLCB7ZXZlbnROYW1lLCAuLi59KQplbmQKCmxvY2FsIHBvb2xfbWV0YSA9IHsKCV9faW5kZXggPSBwb29sX21ldGhvZHM7Cn0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBsaWJyYXJ5LnBvb2woKQoJbG9jYWwgcG9vbCA9IHsKCQl0YXNrcyA9IHt9OwoJCWV2ZW50cyA9IHt9OwoJCW9yZGVycyA9IHt9OwoJfQoJcmV0dXJuIHNldG1ldGF0YWJsZShwb29sLCBwb29sX21ldGEpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5ydW5uaW5nKCkKCXJldHVybiBfVEFTSwplbmQKCmZ1bmN0aW9uIGxpYnJhcnkuY29udGV4dCgpCglsb2NhbCB0YXNrID0gbGlicmFyeS5ydW5uaW5nKCkgb3IgZXJyb3IoImNvbnRleHQoKSBjYWxsZWQgb3V0c2lkZSBhbnkgdGFzayIsIDIpCglyZXR1cm4gdGFzay5jb250ZXh0CmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hbnkoLi4uKQoJbG9jYWwgcmVzdWx0ID0geyBjb25jdXJyZW50LnNlbGVjdCguLi4pIH0KCWZvciBfLCB0YXNrIGluIGlwYWlycyB7IC4uLiB9IGRvCgkJdGFzazpzdG9wKCkKCWVuZAoJcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS55aWVsZCgpCgljb3JvdXRpbmUueWllbGQoJ3dha2UnKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcy5xdWV1ZUV2ZW50ID0gZnVuY3Rpb24oLi4uKQoJbG9jYWwgdGFzayA9IGxpYnJhcnkucnVubmluZygpCglpZiB0YXNrIHRoZW4KCQl0YXNrLnBvb2w6cXVldWVfZXZlbnQoLi4uKQoJZWxzZQoJCXF1ZXVlRXZlbnRSYXcoLi4uKQoJZW5kCmVuZAoKcmV0dXJuIGxpYnJhcnkK";
  41.     ["ktlo.container"] = base64.decode "bG9jYWwgdGFibGUsbWF0aCxzdHJpbmcsYT10YWJsZSxtYXRoLHN0cmluZyxyZXF1aXJlJ2t0bG8uY2hlY2snbG9jYWwgYixjLGQ9dGFibGUudW5wYWNrLHRhYmxlLmluc2VydCx0YWJsZS5jb25jYXQ7bG9jYWwgZXJyb3Isc2V0bWV0YXRhYmxlLHRvc3RyaW5nLHR5cGU9ZXJyb3Isc2V0bWV0YXRhYmxlLHRvc3RyaW5nLHR5cGU7bG9jYWwgZSxmPW1hdGguaHVnZSxtYXRoLmZsb29yO2xvY2FsIGcsaCxpPXN0cmluZy5tYXRjaCxzdHJpbmcuZ3N1YixzdHJpbmcuZm9ybWF0O2xvY2FsIGo9YS5leHBlY3Q7bG9jYWwgaz1jb3JvdXRpbmUucmVzdW1lO2xvY2FsIGw9e31sb2NhbCBtPXt9ZnVuY3Rpb24gbTp1bndyYXAoKWooMSxzZWxmLCdyZXN1bHQnKWxvY2FsIG49c2VsZi52YWx1ZTtpZiBzZWxmLnN1Y2Nlc3MgdGhlbiByZXR1cm4gYihuKWVsc2UgZXJyb3IobiwyKWVuZCBlbmQ7ZnVuY3Rpb24gbTp1bnBhY2soKWooMSxzZWxmLCdyZXN1bHQnKWxvY2FsIG49c2VsZi52YWx1ZTtpZiBzZWxmLnN1Y2Nlc3MgdGhlbiByZXR1cm4gdHJ1ZSxiKG4pZWxzZSByZXR1cm4gZmFsc2UsbiBlbmQgZW5kO2xvY2FsIG89e19faW5kZXg9bSxfX25hbWU9J3Jlc3VsdCd9bG9jYWwgZnVuY3Rpb24gcChxLG4pbG9jYWwgcj17c3VjY2Vzcz1xLHZhbHVlPW59cmV0dXJuIHNldG1ldGF0YWJsZShyLG8pZW5kO2xvY2FsIGZ1bmN0aW9uIHMoLi4uKXJldHVybiBwKHRydWUsey4uLn0pZW5kO2xvY2FsIGZ1bmN0aW9uIHQodSlyZXR1cm4gcChmYWxzZSx1KWVuZDtsb2NhbCBmdW5jdGlvbiB2KHcsLi4uKWlmIHcgdGhlbiByZXR1cm4gcyguLi4pZWxzZSByZXR1cm4gdCguLi4pZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiB4KHksLi4uKWooMSx5LCdmdW5jdGlvbicpcmV0dXJuIHYocGNhbGwoeSwuLi4pKWVuZDtsb2NhbCBmdW5jdGlvbiB6KEEsLi4uKWooMSxBLCd0aHJlYWQnKXJldHVybiB2KGsoQSwuLi4pKWVuZDtsLnJlc3VsdD17c3VjY2Vzcz1zLGZhaWx1cmU9dCxjYXRjaGluZz14LHJlc3VtaW5nPXoscGFjaz12fWxvY2FsIGZ1bmN0aW9uIEIobilpZiB0eXBlKG4pfj0nbnVtYmVyJ3RoZW4gcmV0dXJuIG5pbCBlbmQ7aWYgbj09ZSBvciBuPT0tZSBvciBufj1mKG4pdGhlbiByZXR1cm4nZmxvYXQnZW5kO3JldHVybidpbnRlZ2VyJ2VuZDtsb2NhbCBmdW5jdGlvbiBDKEQsbilpZiB0eXBlKG4pPT0nc3RyaW5nJ3RoZW4gbG9jYWwgRT1oKGkoIiVxIixuKSwiXFxcbiIsIlxcbiIpYyhELEUpZWxzZWlmIEIobik9PSdmbG9hdCd0aGVuIGlmIG5+PW4gdGhlbiBjKEQsIjAvMCIpZWxzZWlmIG49PWUgdGhlbiBjKEQsIjEvMCIpZWxzZWlmIG49PS1lIHRoZW4gYyhELCItMS8wIillbHNlIGMoRCx0b3N0cmluZyhuKSllbmQgZWxzZSBjKEQsdG9zdHJpbmcobikpZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBGKHNlbGYpbG9jYWwgRD17InsifWxvY2FsIEc9I3NlbGY7Zm9yIEg9MSxHIGRvIEMoRCxzZWxmW0hdKWMoRCwiLCIpZW5kO2ZvciBJLG4gaW4gcGFpcnMoc2VsZilkbyBpZiBub3QoQihJKT09J2ludGVnZXInYW5kIEk+PTEgYW5kIEk8PUcpdGhlbiBpZiB0eXBlKEkpPT0nc3RyaW5nJ2FuZCBnKEksJ15bXyVhXVtfJXddKiQnKXRoZW4gYyhELEkpZWxzZSBjKEQsIlsiKUMoRCxJKWMoRCwiXSIpZW5kO2MoRCwiPSIpQyhELG4pYyhELCIsIillbmQgZW5kO2lmI0Q9PTEgdGhlbiByZXR1cm4ie30iZW5kO0RbI0RdPSd9J3JldHVybiBkKEQpZW5kO2xvY2FsIGZ1bmN0aW9uIEooSyxMKWxvY2FsIE09e31mb3IgTixPIGluIHBhaXJzKEspZG8gbG9jYWwgUD1MW05daWYgUD09bmlsIG9yIE9+PVAgdGhlbiByZXR1cm4gZmFsc2UgZW5kO01bTl09dHJ1ZSBlbmQ7Zm9yIFEsUiBpbiBwYWlycyhMKWRvIGlmIG5vdCBNW1FddGhlbiByZXR1cm4gZmFsc2UgZW5kIGVuZDtyZXR1cm4gdHJ1ZSBlbmQ7bG9jYWwgUz17X190b3N0cmluZz1GLF9fZXE9Sn1sb2NhbCBUO2Z1bmN0aW9uIFQobixVKWooMSxuLCd0YWJsZScpaigyLFUsJ2Jvb2xlYW4nLCduaWwnKWxvY2FsIHI9c2V0bWV0YXRhYmxlKG4sUylpZiBVIHRoZW4gZm9yIFIsViBpbiBwYWlycyhuKWRvIGlmIHR5cGUoVik9PSd0YWJsZSd0aGVuIFQoVix0cnVlKWVuZCBlbmQgZW5kO3JldHVybiByIGVuZDtsLmRhdHVtPVQ7cmV0dXJuIGwK";
  42.     ["psg.modal"] = base64.decode "bG9jYWwgYmFzYWx0ID0gcmVxdWlyZSAnYmFzYWx0Jwpsb2NhbCBjb25jdXJyZW50ID0gcmVxdWlyZSAna3Rsby5jb25jdXJyZW50Jwpsb2NhbCByZXNvdXJjZXMgPSByZXF1aXJlICdrdGxvLnJlc291cmNlcycKbG9jYWwgam9iID0gcmVxdWlyZSAna3Rsby5qb2InCgpsb2NhbCBsaWJyYXJ5ID0ge30KCmxvY2FsIGZyYW1lcyA9IG5pbAoKbG9jYWwgZnVuY3Rpb24gZ2V0X2ZyYW1lcygpCglpZiBub3QgZnJhbWVzIHRoZW4KCQlsb2NhbCByb290ID0gYmFzYWx0LmdldEFjdGl2ZUZyYW1lKCkKCQlsb2NhbCBtYWluRnJhbWUgPSByb290OmdldE9iamVjdCgicm9vdCIpIG9yIHJvb3Q6Z2V0T2JqZWN0KCJtYWluIikKCQlmcmFtZXMgPSB7CgkJCVttYWluRnJhbWVdID0ge30KCQl9CgllbmQKCXJldHVybiBmcmFtZXMKZW5kCgotLS0gQHBhcmFtIHNldHVwIGZ1bihmcmFtZSwgZnV0dXJlOiBmdXR1cmUpCi0tLSBAcmV0dXJuIGFueQpsb2NhbCBmdW5jdGlvbiBvcGVuX21vZGFsX3dpbmRvdyhzZXR1cCkKCWxvY2FsIHJvb3QgPSBiYXNhbHQuZ2V0QWN0aXZlRnJhbWUoKQoJbG9jYWwgd2luZG93cyA9IGdldF9mcmFtZXMoKQoJZm9yIGZyYW1lLCBzdGFjayBpbiBwYWlycyh3aW5kb3dzKSBkbwoJCXRhYmxlLmluc2VydChzdGFjaywgZnJhbWU6aXNFbmFibGVkKCkpCgkJZnJhbWU6ZGlzYWJsZSgpCgllbmQKCWxvY2FsIGZ1dHVyZSA9IGNvbmN1cnJlbnQuZnV0dXJlKCkKCWxvY2FsIGZyYW1lID0gcm9vdDphZGRGcmFtZSgpCgl3aW5kb3dzW2ZyYW1lXSA9IHt9CglmcmFtZTpzZXRNb3ZhYmxlKHRydWUpCglzZXR1cChmcmFtZSwgZnV0dXJlKQoJbG9jYWwgb2ssIHJlc3VsdCA9IHBjYWxsKGZ1dHVyZS5nZXQsIGZ1dHVyZSkKCWZyYW1lOnJlbW92ZSgpCgl3aW5kb3dzW2ZyYW1lXSA9IG5pbAoJZm9yIG90aGVyRnJhbWUsIHN0YWNrIGluIHBhaXJzKHdpbmRvd3MpIGRvCgkJbG9jYWwgZW5hYmxlZCA9IHRhYmxlLnJlbW92ZShzdGFjaywgLTEpCgkJLS1pZiBlbmFibGVkIHRoZW4KCQkJb3RoZXJGcmFtZTplbmFibGUoKQoJCS0tZW5kCgllbmQKCWlmIG9rIHRoZW4KCQlyZXR1cm4gcmVzdWx0CgllbHNlCgkJZXJyb3IocmVzdWx0LCAwKQoJZW5kCmVuZAoKbGlicmFyeS5vcGVuID0gb3Blbl9tb2RhbF93aW5kb3cKCmxvY2FsIGZ1bmN0aW9uIHNldHVwX2ZyYW1lX3dpZHRoKGZyYW1lLCB3aWR0aCwgaGVpZ2h0LCBsYXlvdXQpCglmcmFtZTpzZXRTaXplKHdpZHRoLCBoZWlnaHQpCglmcmFtZTpzZXRQb3NpdGlvbigiKHBhcmVudC53IC0gc2VsZi53KS8yICsgMSIsICIocGFyZW50LmggLSBzZWxmLmgpLzIiKQoJZnJhbWU6YWRkTGF5b3V0RnJvbVN0cmluZyhyZXNvdXJjZXMubG9hZChsYXlvdXQpKQoJcmV0dXJuIGZyYW1lOmdldE9iamVjdCgid2luZG93IikKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXR1cF9mcmFtZShmcmFtZSwgaGVpZ2h0LCBsYXlvdXQpCglsb2NhbCB3aWR0aCA9IG1hdGgubWluKDMwLCBmcmFtZTpnZXRQYXJlbnQoKTpnZXRTaXplKCkgLSAyKQoJcmV0dXJuIHNldHVwX2ZyYW1lX3dpZHRoKGZyYW1lLCB3aWR0aCwgaGVpZ2h0LCBsYXlvdXQpCmVuZAoKLS0tIEBhc3luYwpmdW5jdGlvbiBsaWJyYXJ5LmFsZXJ0KHRleHQsIGFjY2VwdCwgY2FuY2VsKQoJaWYgdHlwZSh0ZXh0KSA9PSAndGFibGUnIHRoZW4KCQl0ZXh0ID0gdGFibGUuY29uY2F0KHRleHQsICdcbicpCgllbmQKCXJldHVybiBvcGVuX21vZGFsX3dpbmRvdyhmdW5jdGlvbihmcmFtZSwgZnV0dXJlKQoJCWxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lKGZyYW1lLCAxMywgImFsZXJ0LnhtbCIpCgkJbG9jYWwgYWNjZXB0QnV0dG9uID0gd2luZG93OmdldE9iamVjdCgiYWNjZXB0IikKCQlhY2NlcHRCdXR0b246b25DbGljayhmdW5jdGlvbigpCgkJCWZ1dHVyZTpjb21wbGV0ZSh0cnVlKQoJCWVuZCkKCQlsb2NhbCBjYW5jZWxCdXR0b24gPSB3aW5kb3c6Z2V0T2JqZWN0KCJjYW5jZWwiKQoJCWNhbmNlbEJ1dHRvbjpvbkNsaWNrKGZ1bmN0aW9uKCkKCQkJZnV0dXJlOmNvbXBsZXRlKGZhbHNlKQoJCWVuZCkKCQlsb2NhbCBjb250ZW50ID0gd2luZG93OmdldE9iamVjdCgiY29udGVudCIpCgkJY29udGVudDpzZXRUZXh0KHRleHQpCgkJaWYgYWNjZXB0IHRoZW4KCQkJYWNjZXB0QnV0dG9uOnNob3coKQoJCQlhY2NlcHRCdXR0b246c2V0VGV4dChhY2NlcHQpCgkJZWxzZQoJCQlhY2NlcHRCdXR0b246aGlkZSgpCgkJZW5kCgkJY2FuY2VsQnV0dG9uOnNldFRleHQoY2FuY2VsKQoJZW5kKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5tZXNzYWdlKHRpdGxlLCBtZXNzYWdlKQoJb3Blbl9tb2RhbF93aW5kb3coZnVuY3Rpb24oZnJhbWUsIGZ1dHVyZSkKCQlsb2NhbCB3aW5kb3cgPSBzZXR1cF9mcmFtZShmcmFtZSwgMTEsICJtZXNzYWdlLnhtbCIpCgkJd2luZG93OmdldE9iamVjdCgidGl0bGUiKTpzZXRUZXh0KHRpdGxlKQoJCXdpbmRvdzpnZXRPYmplY3QoImNvbnRlbnQiKTpzZXRUZXh0KG1lc3NhZ2UpCgkJd2luZG93OmdldE9iamVjdCgiY2xvc2UiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQkJZnV0dXJlOmNvbXBsZXRlKG5pbCkKCQllbmQpCgllbmQpCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2V0dXBfcGFzc3dkKGZyYW1lLCBmdXR1cmUpCglsb2NhbCB3aW5kb3cgPSBzZXR1cF9mcmFtZShmcmFtZSwgOCwgInBhc3N3ZC54bWwiKQoJbG9jYWwgaW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJwYXNzd29yZCIpCglsb2NhbCBkb25lID0gd2luZG93OmdldE9iamVjdCgiZG9uZSIpCglsb2NhbCBjYW5jZWwgPSB3aW5kb3c6Z2V0T2JqZWN0KCJjYW5jZWwiKQoJZG9uZTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlmdXR1cmU6Y29tcGxldGUoaW5wdXQ6Z2V0VmFsdWUoKSkKCWVuZCkKCWNhbmNlbDpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlmdXR1cmU6Y29tcGxldGUobmlsKQoJZW5kKQoJaW5wdXQ6c2V0Rm9jdXMoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5wYXNzd2QoKQoJcmV0dXJuIG9wZW5fbW9kYWxfd2luZG93KHNldHVwX3Bhc3N3ZCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXR1cF9jaHBhc3MoZnJhbWUsIGZ1dHVyZSkKCWxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lKGZyYW1lLCAxMiwgImNocGFzcy54bWwiKQoJbG9jYWwgbWVzc2FnZSA9IHdpbmRvdzpnZXRPYmplY3QoIm1lc3NhZ2UiKQoJbG9jYWwgaW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJwYXNzd29yZCIpCglsb2NhbCBjb25maXJtRWxlbWVudCA9IHdpbmRvdzpnZXRPYmplY3QoImNvbmZpcm0iKQoJbG9jYWwgZG9uZSA9IHdpbmRvdzpnZXRPYmplY3QoImRvbmUiKQoJbG9jYWwgY2FuY2VsID0gd2luZG93OmdldE9iamVjdCgiY2FuY2VsIikKCWRvbmU6b25DbGljayhmdW5jdGlvbigpCgkJbG9jYWwgcGFzc3dvcmQgPSBpbnB1dDpnZXRWYWx1ZSgpCgkJbG9jYWwgY29uZmlybSA9IGNvbmZpcm1FbGVtZW50OmdldFZhbHVlKCkKCQlpZiBwYXNzd29yZCB+PSBjb25maXJtIHRoZW4KCQkJbWVzc2FnZTpzZXRUZXh0KCJQYXNzd29yZHMgbm90IGVxdWFsISIpCgkJCXJldHVybgoJCWVuZAoJCWZ1dHVyZTpjb21wbGV0ZShwYXNzd29yZCkKCWVuZCkKCWNhbmNlbDpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlmdXR1cmU6Y29tcGxldGUobmlsKQoJZW5kKQoJaW5wdXQ6b25DbGljayhmdW5jdGlvbigpCgkJbWVzc2FnZTpzZXRUZXh0KCIiKQoJZW5kKQoJY29uZmlybUVsZW1lbnQ6b25DbGljayhmdW5jdGlvbigpCgkJbWVzc2FnZTpzZXRUZXh0KCIiKQoJZW5kKQoJaW5wdXQ6c2V0Rm9jdXMoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5jaHBhc3MoKQoJcmV0dXJuIG9wZW5fbW9kYWxfd2luZG93KHNldHVwX2NocGFzcykKZW5kCgotLS0gQHBhcmFtIGluaXQgaW50ZWdlcgotLS0gQHJldHVybiBpbnRlZ2VyCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5udW1iZXIoaW5pdCkKCXJldHVybiBvcGVuX21vZGFsX3dpbmRvdyhmdW5jdGlvbihmcmFtZSwgZnV0dXJlKQoJCWxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lX3dpZHRoKGZyYW1lLCAyMywgMTYsICJudW1iZXIueG1sIikKCQlsb2NhbCBpbnB1dCA9IHdpbmRvdzpnZXRPYmplY3QoImlucHV0IikKCQlpbnB1dDpzZXRWYWx1ZSh0b3N0cmluZyhpbml0KSkKCQlsb2NhbCBkaWdpdHMgPSB3aW5kb3c6Z2V0T2JqZWN0KCJkaWdpdHMiKQoJCWZvciBpPTAsIDkgZG8KCQkJbG9jYWwgZGlnaXQgPSBkaWdpdHM6Z2V0T2JqZWN0KCJkIi4uaSkKCQkJZGlnaXQ6b25DbGljayhmdW5jdGlvbigpCgkJCQlpbnB1dDpzZXRWYWx1ZSh0b3N0cmluZyh0b251bWJlcihpbnB1dDpnZXRWYWx1ZSgpLi5pKSkpCgkJCQlpbnB1dDpzZXRGb2N1cygpCgkJCWVuZCkKCQllbmQKCQlsb2NhbCBjb250cm9sID0gd2luZG93OmdldE9iamVjdCgiY29udHJvbCIpCgkJY29udHJvbDpnZXRPYmplY3QoImVyYXNlIik6b25DbGljayhmdW5jdGlvbigpCgkJCWxvY2FsIHZhbHVlID0gdG9zdHJpbmcoaW5wdXQ6Z2V0VmFsdWUoKSkKCQkJaWYgI3ZhbHVlIH49IDAgdGhlbgoJCQkJaW5wdXQ6c2V0VmFsdWUodmFsdWU6c3ViKDEsIC0yKSkKCQkJZW5kCgkJCWlucHV0OnNldEZvY3VzKCkKCQllbmQpCgkJY29udHJvbDpnZXRPYmplY3QoImRvbmUiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQkJbG9jYWwgdmFsdWUgPSBpbnB1dDpnZXRWYWx1ZSgpCgkJCWZ1dHVyZTpjb21wbGV0ZSh0b251bWJlcih2YWx1ZSkgb3IgMCkKCQllbmQpCgkJY29udHJvbDpnZXRPYmplY3QoImJhY2siKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQkJZnV0dXJlOmNvbXBsZXRlKG5pbCkKCQllbmQpCgkJaW5wdXQ6c2V0Rm9jdXMoKQoJZW5kKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHNldHVwX2FkZHJlc3MoaW5pdEFkZHJlc3MsIGZyYW1lLCBmdXR1cmUpCglsb2NhbCB3aW5kb3cgPSBzZXR1cF9mcmFtZV93aWR0aChmcmFtZSwgMjcsIDIwLCAiYWRkcmVzcy54bWwiKQoJbG9jYWwgc3ltYm9scyA9IHdpbmRvdzpnZXRPYmplY3QoInN5bWJvbHMiKQoJbG9jYWwgaW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJpbnB1dCIpCglsb2NhbCBjb250cm9sID0gd2luZG93OmdldE9iamVjdCgiY29udHJvbCIpCglsb2NhbCBkb25lID0gY29udHJvbDpnZXRPYmplY3QoImRvbmUiKQoJZG9uZTpkaXNhYmxlKCkKCWxvY2FsIGFkZHJlc3MgPSB7fQoJbG9jYWwgZnVuY3Rpb24gdXBkYXRlX2FkZHJlc3MobmV3QWRkcmVzcykKCQlhZGRyZXNzID0gbmV3QWRkcmVzcwoJCWZvciBpPTEsIDggZG8KCQkJbG9jYWwgc3ltYm9sID0gYWRkcmVzc1tpXQoJCQlsb2NhbCBkaXNwbGF5ID0gc3ltYm9sczpnZXRPYmplY3QoInMiLi5pKQoJCQlpZiBzeW1ib2wgdGhlbgoJCQkJZGlzcGxheTpzZXRUZXh0KHN0cmluZy5mb3JtYXQoIiUwMmQiLCBzeW1ib2wpKQoJCQllbHNlCgkJCQlkaXNwbGF5OnNldFRleHQoIiIpCgkJCWVuZAoJCWVuZAoJCWlmICNhZGRyZXNzID49IDYgdGhlbgoJCQlkb25lOnNldEJhY2tncm91bmQoY29sb3JzLmdyZWVuKQoJCQlkb25lOmVuYWJsZSgpCgkJZWxzZQoJCQlkb25lOnNldEJhY2tncm91bmQoY29sb3JzLmdyYXkpCgkJCWRvbmU6ZGlzYWJsZSgpCgkJZW5kCgllbmQKCWxvY2FsIGZ1bmN0aW9uIGlucHV0X3N5bWJvbChidXR0b24pCgkJbG9jYWwgc3ltYm9sID0gdG9udW1iZXIoYnV0dG9uOmdldFZhbHVlKCkpCgkJbG9jYWwgbGVuZ3RoID0gI2FkZHJlc3MKCQlpZiBsZW5ndGggPCA4IHRoZW4KCQkJZm9yIGk9MSwgbGVuZ3RoIGRvCgkJCQlpZiBhZGRyZXNzW2ldID09IHN5bWJvbCB0aGVuCgkJCQkJcmV0dXJuCgkJCQllbmQKCQkJZW5kCgkJCWxvY2FsIG5ld0FkZHJlc3MgPSB7IHRhYmxlLnVucGFjayhhZGRyZXNzKSB9CgkJCW5ld0FkZHJlc3NbbGVuZ3RoICsgMV0gPSBzeW1ib2wKCQkJdXBkYXRlX2FkZHJlc3MobmV3QWRkcmVzcykKCQllbmQKCWVuZAoJZm9yIGk9MSwgNDcgZG8KCQlpbnB1dDpnZXRPYmplY3QoInYiLi5pKTpvbkNsaWNrKGlucHV0X3N5bWJvbCkKCWVuZAoJaW5wdXQ6Z2V0T2JqZWN0KCJlcmFzZSIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCWxvY2FsIGxlbmd0aCA9ICNhZGRyZXNzCgkJaWYgbGVuZ3RoID4gMCB0aGVuCgkJCWxvY2FsIG5ld0FkZHJlc3MgPSB7IHRhYmxlLnVucGFjayhhZGRyZXNzLCAxLCBsZW5ndGggLSAxKSB9CgkJCXVwZGF0ZV9hZGRyZXNzKG5ld0FkZHJlc3MpCgkJZW5kCgllbmQpCglkb25lOm9uQ2xpY2soZnVuY3Rpb24oKQoJCWZ1dHVyZTpjb21wbGV0ZShhZGRyZXNzKQoJZW5kKQoJY29udHJvbDpnZXRPYmplY3QoImJhY2siKTpvbkNsaWNrKGZ1bmN0aW9uKCkKCQlmdXR1cmU6Y29tcGxldGUobmlsKQoJZW5kKQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQlsb2NhbCBldmVudCA9IGNvbmN1cnJlbnQuZXZlbnQoJ3Bhc3RlJykKCQl3aGlsZSB0cnVlIGRvCgkJCWxvY2FsIHN1YmplY3QsIGRhdGEgPSBjb25jdXJyZW50LnNlbGVjdChmdXR1cmUsIGV2ZW50KQoJCQlpZiBzdWJqZWN0ID09IGZ1dHVyZSB0aGVuCgkJCQlicmVhawoJCQllbmQKCQkJbG9jYWwgbmV3QWRkcmVzcyA9IHsgdGFibGUudW5wYWNrKGFkZHJlc3MpIH0KCQkJbG9jYWwgc3ltYm9scyA9IHt9CgkJCWZvciBfLCBzeW1ib2wgaW4gaXBhaXJzKG5ld0FkZHJlc3MpIGRvCgkJCQlzeW1ib2xzW3N5bWJvbF0gPSB0cnVlCgkJCWVuZAoJCQlmb3IgdmFsdWUgaW4gZGF0YVsyXTpnbWF0Y2goIiVkKyIpIGRvCgkJCQlsb2NhbCBzeW1ib2wgPSBhc3NlcnQodG9udW1iZXIodmFsdWUpKQoJCQkJaWYgc3ltYm9sID4gMCBhbmQgc3ltYm9sIDwgNDggYW5kIG5vdCBzeW1ib2xzW3N5bWJvbF0gdGhlbgoJCQkJCXN5bWJvbHNbc3ltYm9sXSA9IHRydWUKCQkJCQl0YWJsZS5pbnNlcnQobmV3QWRkcmVzcywgc3ltYm9sKQoJCQkJCWlmICNuZXdBZGRyZXNzID49IDggdGhlbgoJCQkJCQlicmVhawoJCQkJCWVuZAoJCQkJZW5kCgkJCWVuZAoJCQl1cGRhdGVfYWRkcmVzcyhuZXdBZGRyZXNzKQoJCWVuZAoJZW5kKQoJdXBkYXRlX2FkZHJlc3MoaW5pdEFkZHJlc3Mgb3Ige30pCmVuZAoKLS0tIEByZXR1cm4gaW50ZWdlcltdCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5hZGRyZXNzKGluaXQpCglyZXR1cm4gb3Blbl9tb2RhbF93aW5kb3coZnVuY3Rpb24gKC4uLikgc2V0dXBfYWRkcmVzcyhpbml0LCAuLi4pIGVuZCkKZW5kCgotLS0gQHBhcmFtIGluaXQ/IHN0cmluZwotLS0gQHJldHVybiBzdHJpbmcKLS0tIEBhc3luYwpmdW5jdGlvbiBsaWJyYXJ5LnRleHQoaW5pdCkKCXJldHVybiBvcGVuX21vZGFsX3dpbmRvdyhmdW5jdGlvbihmcmFtZSwgZnV0dXJlKQoJCWxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lKGZyYW1lLCA4LCAidGV4dC54bWwiKQoJCWxvY2FsIGlucHV0ID0gd2luZG93OmdldE9iamVjdCgiaW5wdXQiKQoJCWlmIGluaXQgdGhlbgoJCQlpbnB1dDpzZXRWYWx1ZShpbml0KQoJCWVuZAoJCWxvY2FsIGNvbnRyb2wgPSB3aW5kb3c6Z2V0T2JqZWN0KCJjb250cm9sIikKCQljb250cm9sOmdldE9iamVjdCgiZG9uZSIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQlsb2NhbCB2YWx1ZSA9IGlucHV0OmdldFZhbHVlKCkKCQkJZnV0dXJlOmNvbXBsZXRlKHZhbHVlKQoJCWVuZCkKCQljb250cm9sOmdldE9iamVjdCgiYmFjayIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQlmdXR1cmU6Y29tcGxldGUobmlsKQoJCWVuZCkKCQlpbnB1dDpzZXRGb2N1cygpCgllbmQpCmVuZAoKcmV0dXJuIGxpYnJhcnkK";
  43.     ["ktlo.check"] = base64.decode "bG9jYWwgdHlwZSxzZWxlY3QscmF3Z2V0LHRvc3RyaW5nLGVycm9yLGRlYnVnLHRhYmxlPXR5cGUsc2VsZWN0LHJhd2dldCx0b3N0cmluZyxlcnJvcixkZWJ1Zyx0YWJsZTtsb2NhbCBhPWRlYnVnLmdldG1ldGF0YWJsZTtsb2NhbCBiLGM9dGFibGUuY29uY2F0LHRhYmxlLnJlbW92ZTtsb2NhbCBkPXt9bG9jYWwgZnVuY3Rpb24gZShmLGcpaWYgZ349InRhYmxlImFuZCBnfj0idXNlcmRhdGEidGhlbiByZXR1cm4gZyBlbmQ7bG9jYWwgaD1hKGYpaWYgbm90IGggdGhlbiByZXR1cm4gZyBlbmQ7bG9jYWwgaT1yYXdnZXQoaCwiX19uYW1lIilpZiB0eXBlKGkpPT0ic3RyaW5nInRoZW4gcmV0dXJuIGkgZWxzZSByZXR1cm4gZyBlbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIGooLi4uKWxvY2FsIGs9ey4uLn1mb3IgbD0jaywxLC0xIGRvIGlmIGtbbF09PSJuaWwidGhlbiBjKGssbCllbmQgZW5kO2lmI2s8PTEgdGhlbiByZXR1cm4gdG9zdHJpbmcoLi4uKWVsc2UgcmV0dXJuIGIoaywiLCAiLDEsI2stMSkuLiIgb3IgIi4ua1sja11lbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIG0oZixuLG8paWYgbj09byB0aGVuIHJldHVybiB0cnVlIGVuZDtpZiBufj0idGFibGUiYW5kIG5+PSJ1c2VyZGF0YSJ0aGVuIHJldHVybiBmYWxzZSBlbmQ7bG9jYWwgaD1hKGYpaWYgbm90IGggdGhlbiByZXR1cm4gZmFsc2UgZW5kO2xvY2FsIGk9cmF3Z2V0KGgsIl9fbmFtZSIpaWYgaT09byB0aGVuIHJldHVybiB0cnVlIGVuZDtsb2NhbCBwPWguX19jbGFzc2VzO2lmIG5vdCBwIHRoZW4gcmV0dXJuIGZhbHNlIGVuZDtpZiBwW29ddGhlbiByZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtmdW5jdGlvbiBkLmV4cGVjdChxLGYsLi4uKWxvY2FsIG49dHlwZShmKWZvciBsPTEsc2VsZWN0KCIjIiwuLi4pZG8gbG9jYWwgbz1zZWxlY3QobCwuLi4paWYgbShmLG4sbyl0aGVuIHJldHVybiBmIGVuZCBlbmQ7bG9jYWwgZz1lKGYsbilsb2NhbCBpO2xvY2FsIHIscz1wY2FsbChkZWJ1Zy5nZXRpbmZvLDMsIm5TIilpZiByIGFuZCBzLm5hbWUgYW5kIHMubmFtZX49IiJhbmQgcy53aGF0fj0iQyJ0aGVuIGk9cy5uYW1lIGVuZDtsb2NhbCB0PWooLi4uKWlmIGkgdGhlbiBlcnJvcigoImJhZCBhcmd1bWVudCAjJWQgdG8gJyVzJyAoJXMgZXhwZWN0ZWQsIGdvdCAlcykiKTpmb3JtYXQocSxpLHQsZyksMyllbHNlIGVycm9yKCgiYmFkIGFyZ3VtZW50ICMlZCAoJXMgZXhwZWN0ZWQsIGdvdCAlcykiKTpmb3JtYXQocSx0LGcpLDMpZW5kIGVuZDtyZXR1cm4gZAo=";
  44. }
  45. local function loader(module)
  46.     if module == 'ktlo.base64' then
  47.         return function() return base64 end
  48.     else
  49.         local text = modules[module]
  50.         if not text then
  51.             return nil, "not embedded in program"
  52.         end
  53.         modules[module] = nil
  54.         return load(text, "@[included]/"..module..".lua", 't', _ENV)
  55.     end
  56. end
  57. table.insert(package.loaders, loader)
  58. _G.RESOURCES = {
  59.     ["ssg.xml"] = base64.decode "PGZyYW1lIGlkPSJyb290Ij4KICAgIDxmcmFtZSBpZD0ibWFpbiIgdmlzaWJsZT0iZmFsc2UiPgogICAgICAgIDxtZW51YmFyIGlkPSJzZWxlY3RvciIgb25DaGFuZ2U9InNlbGVjdEZyYW1lIiB3aWR0aD0icGFyZW50LnciPgogICAgICAgICAgICA8aXRlbSB0ZXh0PSJLZXlzIi8+CiAgICAgICAgICAgIDxpdGVtIHRleHQ9IkF1ZGl0Ii8+CiAgICAgICAgICAgIDxpdGVtIHRleHQ9IlNldHMiLz4KICAgICAgICAgICAgPGl0ZW0gdGV4dD0iUHJvdG9zIi8+CiAgICAgICAgICAgIDxpdGVtIHRleHQ9IkZpbHRlciIvPgogICAgICAgIDwvbWVudWJhcj4KICAgICAgICA8ZnJhbWUgaWQ9ImtleXMiIHk9IjIiIGhlaWdodD0icGFyZW50LmggLSAxIj4KICAgICAgICAgICAgPGxhYmVsIGlkPSJob3N0S2V5TGFiZWwiIHg9IjIiIHk9IjIiIHRleHQ9Ikhvc3Qga2V5OiIvPgogICAgICAgICAgICA8bGFiZWwgaWQ9Imhvc3RLZXkiIHg9Imhvc3RLZXlMYWJlbC54ICsgaG9zdEtleUxhYmVsLncgKyAxIiB5PSIyIiB3aWR0aD0iMTYiIGJnPSJsaWdodEdyYXkiLz4KICAgICAgICAgICAgPGxpc3QgaWQ9Imxpc3QiIHg9IjIiIHk9Imhvc3RLZXlMYWJlbC55ICsgMiIgd2lkdGg9InBhcmVudC53IC0gMyIgaGVpZ2h0PSJwYXJlbnQuaCAtIDgiLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0idXAiIHg9Imxpc3QueCArIGxpc3QudyIgeT0ibGlzdC55IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB0ZXh0PSIeIiBvbkNsaWNrPSJzY3JvbGxVcCIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJkb3duIiB4PSJsaXN0LnggKyBsaXN0LnciIHk9Imxpc3QueSArIGxpc3QuaCAtIDEiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHRleHQ9Ih8iIG9uQ2xpY2s9InNjcm9sbERvd24iLz4KICAgICAgICAgICAgPHBhbmUgaWQ9InNjcm9sbGVyIiB4PSJ1cC54IiB5PSJ1cC55ICsgdXAuaCIgd2lkdGg9IjEiIGhlaWdodD0iZG93bi55IC0gdXAueSIgYmc9ImJsYWNrIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9ImFsbG93IiB4PSIyIiB5PSJsaXN0LnkgKyBsaXN0LmggKyAxIiB3aWR0aD0iNyIgdGV4dD0iQWxsb3ciIGJnPSJncmVlbiIgb25DbGljaz0iYWxsb3ciLz4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZGVueSIgeD0iYWxsb3cueCArIGFsbG93LncgKyAxIiB5PSJsaXN0LnkgKyBsaXN0LmggKyAxIiB3aWR0aD0iNyIgdGV4dD0iRGVueSIgYmc9InJlZCIgb25DbGljaz0iZGVueSIvPgogICAgICAgICAgICA8bGFiZWwgaWQ9InZlcnNpb24iIHg9IihwYXJlbnQudyAtIHNlbGYudykvMiIgeT0icGFyZW50LmgiIGZnPSJjeWFuIi8+CiAgICAgICAgPC9mcmFtZT4KICAgICAgICA8ZnJhbWUgaWQ9ImF1ZGl0IiB5PSIyIiBoZWlnaHQ9InBhcmVudC5oIC0gMSIgdmlzaWJsZT0iZmFsc2UiPgogICAgICAgICAgICA8bGFiZWwgeD0iMiIgeT0iMiIgdGV4dD0iUGFnZSIvPgogICAgICAgICAgICA8bGFiZWwgaWQ9InBhZ2UiIHg9IjciIHk9IjIiIHRleHQ9IjAiLz4KICAgICAgICAgICAgPGxhYmVsIHg9IjExIiB5PSIyIiB0ZXh0PSJOZXciLz4KICAgICAgICAgICAgPGxhYmVsIGlkPSJuZXciIHg9IjE1IiB5PSIyIiBmZz0ieWVsbG93IiB0ZXh0PSIwIi8+CiAgICAgICAgICAgIDxsaXN0IGlkPSJsaXN0IiB4PSIyIiB5PSI0IiB3aWR0aD0icGFyZW50LncgLSAyIiBoZWlnaHQ9InBhcmVudC5oIC0gMTIiLz4KICAgICAgICAgICAgPG1lbnViYXIgaWQ9ImRpcmVjdGlvbiIgeD0iMTkiIHk9IjIiIHdpZHRoPSIxMiIgb25DaGFuZ2U9InN3aXRjaEF1ZGl0RGlyZWN0aW9uIj4KICAgICAgICAgICAgICAgIDxpdGVtIHRleHQ9IlRhaWwiLz4KICAgICAgICAgICAgICAgIDxpdGVtIHRleHQ9IkhlYWQiLz4KICAgICAgICAgICAgPC9tZW51YmFyPgogICAgICAgICAgICA8ZnJhbWUgaWQ9ImNvbnRyb2wiIHg9IjIiIHk9Imxpc3QueSArIGxpc3QuaCArIDEiIHdpZHRoPSJwYXJlbnQudyAtIDIiIGhlaWdodD0iMyI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJwcmV2IiB4PSIxIiB3aWR0aD0iMTAiIHRleHQ9IlByZXZQYWdlIiBvbkNsaWNrPSJhdWRpdFByZXZQYWdlIi8+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHg9IjEyIiB3aWR0aD0iMTAiIHRleHQ9IlNob3ciIG9uQ2xpY2s9ImF1ZGl0U2hvd0V2ZW50Ii8+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHg9IjIzIiB3aWR0aD0iMTAiIHRleHQ9Ik5leHRQYWdlIiBvbkNsaWNrPSJhdWRpdE5leHRQYWdlIi8+CiAgICAgICAgICAgIDwvZnJhbWU+CiAgICAgICAgICAgIDxmcmFtZSBpZD0ib3AiIHg9IjIiIHk9ImNvbnRyb2wueSArIGNvbnRyb2wuaCArIDEiIHdpZHRoPSJwYXJlbnQudyAtIDIiIGhlaWdodD0iMyI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJwcmludCIgeD0iMSIgd2lkdGg9IjEwIiB0ZXh0PSJQcmludCIgb25DbGljaz0icHJpbnRBdWRpdFBhZ2UiIHZpc2libGU9ImZhbHNlIi8+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJkZWxldGUiIHg9IjEyIiB3aWR0aD0iMTAiIGJnPSJyZWQiIHRleHQ9IkRlbGV0ZSIgb25DbGljaz0iYXVkaXREZWxldGVQYWdlIi8+CiAgICAgICAgICAgIDwvZnJhbWU+CiAgICAgICAgPC9mcmFtZT4KICAgICAgICA8ZnJhbWUgaWQ9InNldHRpbmdzIiB5PSIyIiBoZWlnaHQ9InBhcmVudC5oIC0gMSIgdmlzaWJsZT0iZmFsc2UiPgogICAgICAgICAgICA8bGFiZWwgeD0iKHBhcmVudC53LXNlbGYudykvMiIgeT0iMiIgdGV4dD0iR2VuZXJhbCIgZmc9ImdyYXkiLz4KICAgICAgICAgICAgPGxhYmVsIHg9IjIiIHk9IjMiIHRleHQ9IkVuZXJneSBUYXJnZXQiLz4KICAgICAgICAgICAgPGJ1dHRvbiB4PSIyMSIgeT0iMyIgd2lkdGg9IjUiIGhlaWdodD0iMSIgdGV4dD0iU0VUIiBvbkNsaWNrPSJzZXRFbmVyZ3lUYXJnZXQiLz4KICAgICAgICAgICAgPGxhYmVsIGlkPSJlbmVyZ3lUYXJnZXQiIHg9IjIiIHk9IjQiIGZnPSJibHVlIi8+CiAgICAgICAgICAgIDxsYWJlbCB4PSIyIiB5PSI2IiB0ZXh0PSJBdWRpdCBFbmFibGVkIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9ImVuYWJsZUF1ZGl0IiB4PSIyMSIgeT0iNiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmc9ImJsYWNrIiBiZz0id2hpdGUiIHRleHQ9IiIgb25DbGljaz0ic2V0RW5hYmxlQXVkaXQiLz4KICAgICAgICAgICAgPGZyYW1lIGlkPSJpcmlzIiB5PSI4IiBoZWlnaHQ9IjciPgogICAgICAgICAgICAgICAgPGxhYmVsIHg9IihwYXJlbnQudy1zZWxmLncpLzIiIHk9IjEiIHRleHQ9IklyaXMiIGZnPSJncmF5Ii8+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9ImlyaXMiIHg9IjIiIHk9IjIiIGZnPSJibHVlIiB0ZXh0PSI/Ii8+CiAgICAgICAgICAgICAgICA8cHJvZ3Jlc3NiYXIgaWQ9ImlyaXNEdXJhYmlsaXR5QmFyIiB4PSIyIiB5PSIzIiB3aWR0aD0icGFyZW50LncgLSAyIiBiZz0icmVkIiBwcm9ncmVzc0NvbG9yPSJncmVlbiIvPgogICAgICAgICAgICAgICAgPGxhYmVsIGlkPSJpcmlzRHVyYWJpbGl0eSIgeD0iKHBhcmVudC53LXNlbGYudykvMiIgeT0iNCIgZmc9ImJsdWUiIHRleHQ9IjAvMCIvPgogICAgICAgICAgICAgICAgPGxhYmVsIHg9IjIiIHk9IjYiIHRleHQ9IklyaXMgc3RhdGUiLz4KICAgICAgICAgICAgICAgIDxidXR0b24geD0iMTQiIHk9IjYiIHdpZHRoPSI2IiBoZWlnaHQ9IjEiIGJnPSJncmVlbiIgdGV4dD0iT1BFTiIgb25DbGljaz0ib3BlbklyaXMiLz4KICAgICAgICAgICAgICAgIDxidXR0b24geD0iMjEiIHk9IjYiIHdpZHRoPSI2IiBoZWlnaHQ9IjEiIGJnPSJyZWQiIHRleHQ9IkNMT1NFIiBvbkNsaWNrPSJjbG9zZUlyaXMiLz4KICAgICAgICAgICAgPC9mcmFtZT4KICAgICAgICAgICAgPGZyYW1lIGlkPSJhZHZhbmNlZCIgeT0iMTYiPgogICAgICAgICAgICAgICAgPGxhYmVsIHg9IihwYXJlbnQudy1zZWxmLncpLzIiIHk9IjEiIHRleHQ9IkFkdmFuY2VkIiBmZz0iZ3JheSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIHg9IjIiIHk9IjIiIHRleHQ9Ik5ldHdvcmsgSUQiLz4KICAgICAgICAgICAgICAgIDxidXR0b24geD0iMjEiIHk9IjIiIHdpZHRoPSI1IiBoZWlnaHQ9IjEiIHRleHQ9IlNFVCIgb25DbGljaz0ic2V0TmV0d29ya0lkIi8+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9Im5ldHdvcmtJZCIgeD0iMiIgeT0iMyIgdGV4dD0iPyIgZmc9ImJsdWUiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCB4PSIyIiB5PSI1IiB0ZXh0PSJOZXR3b3JrIFJlc3RyaWN0ZWQiLz4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImlzTmV0UmVzdHJpY3RlZCIgeD0iMjEiIHk9IjUiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZnPSJibGFjayIgYmc9IndoaXRlIiB0ZXh0PSIiIG9uQ2xpY2s9InNldE5ldFJlc3RyaWN0ZWQiLz4KICAgICAgICAgICAgPC9mcmFtZT4KICAgICAgICA8L2ZyYW1lPgogICAgICAgIDxmcmFtZSBpZD0icHJvdG9jb2xzIiB5PSIyIiBoZWlnaHQ9InBhcmVudC5oIC0gMSIgdmlzaWJsZT0iZmFsc2UiPgogICAgICAgICAgICA8bGFiZWwgeD0iMiIgeT0iMiIgdGV4dD0iQXV0byBJcmlzIi8+CiAgICAgICAgICAgIDxidXR0b24geD0iMTkiIHk9IjIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHRleHQ9Ij8iIG9uQ2xpY2s9ImhlbHBBdXRvSXJpcyIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJhdXRvSXJpcyIgeD0iMjEiIHk9IjIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZnPSJibGFjayIgYmc9IndoaXRlIiB0ZXh0PSIiIG9uQ2xpY2s9InNldEF1dG9JcmlzIi8+CiAgICAgICAgICAgIDxmcmFtZSBpZD0idjEuMyIgeD0iMiIgeT0iNCIgaGVpZ2h0PSI3IiB2aXNpYmxlPSJmYWxzZSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgdGV4dD0iQXV0byBDbG9zZSIvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB4PSIxOCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdGV4dD0iPyIgb25DbGljaz0iaGVscEF1dG9DbG9zZSIvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB4PSIyMCIgd2lkdGg9IjUiIGhlaWdodD0iMSIgdGV4dD0iU0VUIiBvbkNsaWNrPSJzZXRBdXRvQ2xvc2UiLz4KICAgICAgICAgICAgICAgIDxsYWJlbCBpZD0iYXV0b0Nsb3NlIiB5PSIyIiBmZz0iYmx1ZSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIHk9IjQiIHRleHQ9IklyaXMgUHJvdGVjdCIvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB4PSIxOCIgeT0iNCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdGV4dD0iPyIgb25DbGljaz0iaGVscElyaXNQcm90ZWN0Ii8+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHg9IjIwIiB5PSI0IiB3aWR0aD0iNSIgaGVpZ2h0PSIxIiB0ZXh0PSJTRVQiIG9uQ2xpY2s9InNldElyaXNQcm90ZWN0Ii8+CiAgICAgICAgICAgICAgICA8bGFiZWwgaWQ9ImlyaXNQcm90ZWN0IiB5PSI1IiBmZz0iYmx1ZSIvPgogICAgICAgICAgICAgICAgPGxhYmVsIHk9IjciIHRleHQ9Ik5vIEthd29vc2giLz4KICAgICAgICAgICAgICAgIDxidXR0b24geD0iMTgiIHk9IjciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHRleHQ9Ij8iIG9uQ2xpY2s9ImhlbHBOb0thd29vc2giLz4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9Im5vS2F3b29zaCIgeD0iMjAiIHk9IjciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZnPSJibGFjayIgYmc9IndoaXRlIiB0ZXh0PSIiIG9uQ2xpY2s9InNldE5vS2F3b29zaCIvPgogICAgICAgICAgICA8L2ZyYW1lPgogICAgICAgICAgICA8ZnJhbWUgaWQ9InYxLjUiIHg9IjIiIHk9IjEyIj4KICAgICAgICAgICAgICAgIDxsYWJlbCB4PSIxIiB5PSIxIiB0ZXh0PSJNYW51YWwgRGlhbCIvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB4PSIxOCIgeT0iMSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdGV4dD0iPyIgb25DbGljaz0iaGVscFByZWZlck1hbnVhbCIvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0icHJlZmVyTWFudWFsIiB4PSIyMCIgeT0iMSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmc9ImJsYWNrIiBiZz0id2hpdGUiIHRleHQ9IiIgb25DbGljaz0ic2V0UHJlZmVyTWFudWFsIi8+CiAgICAgICAgICAgICAgICA8bGFiZWwgeD0iMSIgeT0iMyIgdGV4dD0iQWR2YW5jZWQgRGlhbCIvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB4PSIxOCIgeT0iMyIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdGV4dD0iPyIgb25DbGljaz0iaGVscEFkdmFuY2VkRGlhbCIvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYWR2YW5jZWREaWFsIiB4PSIyMCIgeT0iMyIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmc9ImJsYWNrIiBiZz0id2hpdGUiIHRleHQ9IiIgb25DbGljaz0ic2V0QWR2YW5jZWREaWFsIi8+CiAgICAgICAgICAgIDwvZnJhbWU+CiAgICAgICAgPC9mcmFtZT4KICAgICAgICA8ZnJhbWUgaWQ9ImZpbHRlciIgeT0iMiIgaGVpZ2h0PSJwYXJlbnQuaCAtIDEiIHZpc2libGU9ImZhbHNlIj4KICAgICAgICAgICAgPG1lbnViYXIgb25DaGFuZ2U9InNlbGVjdEZpbHRlckxpc3QiIHg9IjIiIHk9IjIiIHdpZHRoPSJwYXJlbnQudyAtIDIiPgogICAgICAgICAgICAgICAgPGl0ZW0gdGV4dD0iV2hpdGVsaXN0Ii8+CiAgICAgICAgICAgICAgICA8aXRlbSB0ZXh0PSJCbGFja2xpc3QiLz4KICAgICAgICAgICAgPC9tZW51YmFyPgogICAgICAgICAgICA8ZnJhbWUgaWQ9ImFsbG93bGlzdCIgeD0iMiIgeT0iMyIgaGVpZ2h0PSJwYXJlbnQuaCAtIDgiIHdpZHRoPSJwYXJlbnQudyAtIDIiPgogICAgICAgICAgICAgICAgPGxpc3QgaWQ9Imxpc3QiIHdpZHRoPSJwYXJlbnQudyAtIDEiIGhlaWdodD0icGFyZW50LmgiLz4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9InVwIiB4PSJsaXN0LnggKyBsaXN0LnciIHk9Imxpc3QueSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdGV4dD0iHiIgb25DbGljaz0ic2Nyb2xsVXAiLz4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRvd24iIHg9Imxpc3QueCArIGxpc3QudyIgeT0ibGlzdC55ICsgbGlzdC5oIC0gMSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdGV4dD0iHyIgb25DbGljaz0ic2Nyb2xsRG93biIvPgogICAgICAgICAgICAgICAgPHBhbmUgaWQ9InNjcm9sbGVyIiB4PSJ1cC54IiB5PSJ1cC55ICsgdXAuaCIgd2lkdGg9IjEiIGhlaWdodD0iZG93bi55IC0gdXAueSIgYmc9ImJsYWNrIi8+CiAgICAgICAgICAgIDwvZnJhbWU+CiAgICAgICAgICAgIDxmcmFtZSBpZD0iZGVueWxpc3QiIHg9IjIiIHk9IjMiIGhlaWdodD0icGFyZW50LmggLSA4IiB3aWR0aD0icGFyZW50LncgLSAyIiB2aXNpYmxlPSJmYWxzZSI+CiAgICAgICAgICAgICAgICA8bGlzdCBpZD0ibGlzdCIgd2lkdGg9InBhcmVudC53IC0gMSIgaGVpZ2h0PSJwYXJlbnQuaCIvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0idXAiIHg9Imxpc3QueCArIGxpc3QudyIgeT0ibGlzdC55IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB0ZXh0PSIeIiBvbkNsaWNrPSJzY3JvbGxVcCIvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZG93biIgeD0ibGlzdC54ICsgbGlzdC53IiB5PSJsaXN0LnkgKyBsaXN0LmggLSAxIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB0ZXh0PSIfIiBvbkNsaWNrPSJzY3JvbGxEb3duIi8+CiAgICAgICAgICAgICAgICA8cGFuZSBpZD0ic2Nyb2xsZXIiIHg9InVwLngiIHk9InVwLnkgKyB1cC5oIiB3aWR0aD0iMSIgaGVpZ2h0PSJkb3duLnkgLSB1cC55IiBiZz0iYmxhY2siLz4KICAgICAgICAgICAgPC9mcmFtZT4KICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYWRkIiB4PSIyIiB5PSJwYXJlbnQuaCAtIDQiIHdpZHRoPSI2IiB0ZXh0PSJBZGQiIG9uQ2xpY2s9ImFkZEFkZHJlc3NUb0ZpbHRlciIvPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJkZWwiIHg9ImFkZC54ICsgYWRkLncgKyAxIiB5PSJhZGQueSIgd2lkdGg9IjYiIHRleHQ9IkRlbCIgb25DbGljaz0iZGVsQWRkcmVzc0Zyb21GaWx0ZXIiLz4KICAgICAgICAgICAgPGJ1dHRvbiB4PSJkZWwueCArIGRlbC53ICsgMSIgeT0iZGVsLnkiIHdpZHRoPSI2IiB0ZXh0PSJTeW5jIiBvbkNsaWNrPSJzeW5jRmlsdGVyIi8+CiAgICAgICAgICAgIDxsYWJlbCBpZD0ibW9kZVR4dCIgeD0iMiIgeT0icGFyZW50LmgiIHRleHQ9Ik1vZGU6Ii8+CiAgICAgICAgICAgIDxmcmFtZSBpZD0ibW9kZSIgeD0ibW9kZVR4dC54ICsgbW9kZVR4dC53ICsgMSIgeT0ibW9kZVR4dC55IiB3aWR0aD0iMjEiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYWxsb3ciIHg9IjEiIHdpZHRoPSI3IiBoZWlnaHQ9IjEiIHRleHQ9IkFsbG93IiBiZz0iZ3JlZW4iIG9uQ2xpY2s9InNldEZpbHRlck1vZGUiLz4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9Im5vbmUiIHg9IjgiIHdpZHRoPSI3IiBoZWlnaHQ9IjEiIHRleHQ9Ik5vbmUiIGJnPSJ5ZWxsb3ciIG9uQ2xpY2s9InNldEZpbHRlck1vZGUiLz4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRlbnkiIHg9IjE1IiB3aWR0aD0iNyIgaGVpZ2h0PSIxIiB0ZXh0PSJEZW55IiBiZz0icmVkIiBvbkNsaWNrPSJzZXRGaWx0ZXJNb2RlIi8+CiAgICAgICAgICAgIDwvZnJhbWU+CiAgICAgICAgPC9mcmFtZT4KICAgIDwvZnJhbWU+CjwvZnJhbWU+Cg==";
  60.     ["alert.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJvcmFuZ2UiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBoZWlnaHQ9IjEiIGJnPSJyZWQiIC8+CiAgICA8bGFiZWwgeD0icGFyZW50LncvMi1zZWxmLncvMiIgZmc9IndoaXRlIiB0ZXh0PSJBdHRlbnRpb24hIiAvPgogICAgPGxhYmVsIGlkPSJjb250ZW50IiB4PSIyIiB5PSIzIiB3aWR0aD0icGFyZW50LncgLSAyIiBoZWlnaHQ9InBhcmVudC5oIC0gNyIgZmc9ImJsYWNrIiBiZz0icGluayIgLz4KICAgIDxidXR0b24gaWQ9ImFjY2VwdCIgeD0iMyIgeT0icGFyZW50LmgtMyIgd2lkdGg9IjkiIGJnPSJncmVlbiIgdGV4dD0iIiAvPgogICAgPGJ1dHRvbiBpZD0iY2FuY2VsIiB4PSJwYXJlbnQudyAtIHNlbGYudyAtIDEiIHk9InBhcmVudC5oLTMiIHdpZHRoPSI5IiBiZz0iYmx1ZSIgdGV4dD0iIiAvPgo8L2ZyYW1lPg==";
  61.     ["number.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJsaWdodEdyYXkiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBoZWlnaHQ9IjEiIGJnPSJncmF5IiAvPgogICAgPGxhYmVsIHg9InBhcmVudC53LzItc2VsZi53LzIiIHRleHQ9IklucHV0IE51bWJlciIgLz4KICAgIDxpbnB1dCBpZD0iaW5wdXQiIHg9IjIiIHk9IjMiIHdpZHRoPSJwYXJlbnQudyAtIDIiIGJnPSJ3aGl0ZSIgdHlwZT0ibnVtYmVyIiAvPgogICAgPGZyYW1lIGlkPSJkaWdpdHMiIHg9IjMiIHk9IjUiIHdpZHRoPSIxOSIgaGVpZ2h0PSI3IiBiZz0ibGlnaHRHcmF5Ij4KICAgICAgICA8YnV0dG9uIGlkPSJkMCIgeD0iMSIgeT0iMSIgd2lkdGg9IjMiIHRleHQ9IjAiIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0iZDEiIHg9IjUiIHk9IjEiIHdpZHRoPSIzIiB0ZXh0PSIxIiAvPgogICAgICAgIDxidXR0b24gaWQ9ImQyIiB4PSI5IiB5PSIxIiB3aWR0aD0iMyIgdGV4dD0iMiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJkMyIgeD0iMTMiIHk9IjEiIHdpZHRoPSIzIiB0ZXh0PSIzIiAvPgogICAgICAgIDxidXR0b24gaWQ9ImQ0IiB4PSIxNyIgeT0iMSIgd2lkdGg9IjMiIHRleHQ9IjQiIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0iZDUiIHg9IjEiIHk9IjUiIHdpZHRoPSIzIiB0ZXh0PSI1IiAvPgogICAgICAgIDxidXR0b24gaWQ9ImQ2IiB4PSI1IiB5PSI1IiB3aWR0aD0iMyIgdGV4dD0iNiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJkNyIgeD0iOSIgeT0iNSIgd2lkdGg9IjMiIHRleHQ9IjciIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0iZDgiIHg9IjEzIiB5PSI1IiB3aWR0aD0iMyIgdGV4dD0iOCIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJkOSIgeD0iMTciIHk9IjUiIHdpZHRoPSIzIiB0ZXh0PSI5IiAvPgogICAgPC9mcmFtZT4KICAgIDxmcmFtZSBpZD0iY29udHJvbCIgeD0iMyIgeT0iMTMiIHdpZHRoPSIxOSIgaGVpZ2h0PSIzIiBiZz0ibGlnaHRHcmF5Ij4KICAgICAgICA8YnV0dG9uIGlkPSJkb25lIiB4PSIxIiB3aWR0aD0iNyIgdGV4dD0iRG9uZSIgYmc9ImdyZWVuIiAvPgogICAgICAgIDxidXR0b24gaWQ9ImJhY2siIHg9IjkiIHdpZHRoPSI3IiB0ZXh0PSJCYWNrIiBiZz0icmVkIiAvPgogICAgICAgIDxidXR0b24gaWQ9ImVyYXNlIiB4PSIxNyIgd2lkdGg9IjMiIHRleHQ9IiZsdDsiIC8+CiAgICA8L2ZyYW1lPgo8L2ZyYW1lPg==";
  62.     ["address.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJsaWdodEdyYXkiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBoZWlnaHQ9IjEiIGJnPSJncmF5IiAvPgogICAgPGxhYmVsIHg9InBhcmVudC53LzItc2VsZi53LzIiIHRleHQ9IklucHV0IEFkZHJlc3MiIGZnPSJ3aGl0ZSIgLz4KICAgIDxmcmFtZSBpZD0ic3ltYm9scyIgeD0iMiIgeT0iMyIgaGVpZ2h0PSIxIiB3aWR0aD0iMjUiIGJnPSJsaWdodEdyYXkiPgogICAgICAgIDxsYWJlbCB4PSIxIiB3aWR0aD0iMSIgdGV4dD0iLSIgLz4KICAgICAgICA8bGFiZWwgaWQ9InMxIiB4PSIyIiB3aWR0aD0iMiIgZmc9ImJsYWNrIiBiZz0id2hpdGUiIHRleHQ9IiIgLz4KICAgICAgICA8bGFiZWwgeD0iNCIgd2lkdGg9IjEiIHRleHQ9Ii0iIC8+CiAgICAgICAgPGxhYmVsIGlkPSJzMiIgeD0iNSIgd2lkdGg9IjIiIGZnPSJibGFjayIgYmc9IndoaXRlIiB0ZXh0PSIiIC8+CiAgICAgICAgPGxhYmVsIHg9IjciIHdpZHRoPSIxIiB0ZXh0PSItIiAvPgogICAgICAgIDxsYWJlbCBpZD0iczMiIHg9IjgiIHdpZHRoPSIyIiBmZz0iYmxhY2siIGJnPSJ3aGl0ZSIgdGV4dD0iIiAvPgogICAgICAgIDxsYWJlbCB4PSIxMCIgd2lkdGg9IjEiIHRleHQ9Ii0iIC8+CiAgICAgICAgPGxhYmVsIGlkPSJzNCIgeD0iMTEiIHdpZHRoPSIyIiBmZz0iYmxhY2siIGJnPSJ3aGl0ZSIgdGV4dD0iIiAvPgogICAgICAgIDxsYWJlbCB4PSIxMyIgd2lkdGg9IjEiIHRleHQ9Ii0iIC8+CiAgICAgICAgPGxhYmVsIGlkPSJzNSIgeD0iMTQiIHdpZHRoPSIyIiBmZz0iYmxhY2siIGJnPSJ3aGl0ZSIgdGV4dD0iIiAvPgogICAgICAgIDxsYWJlbCB4PSIxNiIgd2lkdGg9IjEiIHRleHQ9Ii0iIC8+CiAgICAgICAgPGxhYmVsIGlkPSJzNiIgeD0iMTciIHdpZHRoPSIyIiBmZz0iYmxhY2siIGJnPSJ3aGl0ZSIgdGV4dD0iIiAvPgogICAgICAgIDxsYWJlbCB4PSIxOSIgd2lkdGg9IjEiIHRleHQ9Ii0iIC8+CiAgICAgICAgPGxhYmVsIGlkPSJzNyIgeD0iMjAiIHdpZHRoPSIyIiBmZz0iYmxhY2siIGJnPSJ3aGl0ZSIgdGV4dD0iIiAvPgogICAgICAgIDxsYWJlbCB4PSIyMiIgd2lkdGg9IjEiIHRleHQ9Ii0iIC8+CiAgICAgICAgPGxhYmVsIGlkPSJzOCIgeD0iMjMiIHdpZHRoPSIyIiBmZz0iYmxhY2siIGJnPSJ3aGl0ZSIgdGV4dD0iIiAvPgogICAgICAgIDxsYWJlbCB4PSIyNSIgd2lkdGg9IjEiIHRleHQ9Ii0iIC8+CiAgICA8L2ZyYW1lPgogICAgPGZyYW1lIGlkPSJpbnB1dCIgeD0iMyIgeT0iNSIgd2lkdGg9IjIzIiBoZWlnaHQ9IjExIiBiZz0ibGlnaHRHcmF5Ij4KICAgICAgICA8YnV0dG9uIGlkPSJ2MSIgeD0iMSIgeT0iMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MiIgeD0iNCIgeT0iMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MyIgeD0iNyIgeT0iMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMyIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2NCIgeD0iMTAiIHk9IjEiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjQiIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0idjUiIHg9IjEzIiB5PSIxIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSI1IiAvPgogICAgICAgIDxidXR0b24gaWQ9InY2IiB4PSIxNiIgeT0iMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iNiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2NyIgeD0iMTkiIHk9IjEiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjciIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0idjgiIHg9IjIyIiB5PSIxIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSI4IiAvPgogICAgICAgIDxidXR0b24gaWQ9InY5IiB4PSIxIiB5PSIzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSI5IiAvPgogICAgICAgIDxidXR0b24gaWQ9InYxMCIgeD0iNCIgeT0iMyIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMTAiIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0idjExIiB4PSI3IiB5PSIzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxMSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MTIiIHg9IjEwIiB5PSIzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxMiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MTMiIHg9IjEzIiB5PSIzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxMyIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MTQiIHg9IjE2IiB5PSIzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxNCIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MTUiIHg9IjE5IiB5PSIzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxNSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MTYiIHg9IjIyIiB5PSIzIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxNiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MTciIHg9IjEiIHk9IjUiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjE3IiAvPgogICAgICAgIDxidXR0b24gaWQ9InYxOCIgeD0iNCIgeT0iNSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMTgiIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0idjE5IiB4PSI3IiB5PSI1IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIxOSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MjAiIHg9IjEwIiB5PSI1IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyMCIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MjEiIHg9IjEzIiB5PSI1IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyMSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MjIiIHg9IjE2IiB5PSI1IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyMiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MjMiIHg9IjE5IiB5PSI1IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyMyIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MjQiIHg9IjIyIiB5PSI1IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyNCIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MjUiIHg9IjEiIHk9IjciIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjI1IiAvPgogICAgICAgIDxidXR0b24gaWQ9InYyNiIgeD0iNCIgeT0iNyIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMjYiIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0idjI3IiB4PSI3IiB5PSI3IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyNyIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MjgiIHg9IjEwIiB5PSI3IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyOCIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MjkiIHg9IjEzIiB5PSI3IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIyOSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MzAiIHg9IjE2IiB5PSI3IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzMCIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MzEiIHg9IjE5IiB5PSI3IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzMSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MzIiIHg9IjIyIiB5PSI3IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzMiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MzMiIHg9IjEiIHk9IjkiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjMzIiAvPgogICAgICAgIDxidXR0b24gaWQ9InYzNCIgeD0iNCIgeT0iOSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iMzQiIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0idjM1IiB4PSI3IiB5PSI5IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzNSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MzYiIHg9IjEwIiB5PSI5IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzNiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MzciIHg9IjEzIiB5PSI5IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzNyIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MzgiIHg9IjE2IiB5PSI5IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzOCIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2MzkiIHg9IjE5IiB5PSI5IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSIzOSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2NDAiIHg9IjIyIiB5PSI5IiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSI0MCIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2NDEiIHg9IjEiIHk9IjExIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSI0MSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2NDIiIHg9IjQiIHk9IjExIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSI0MiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2NDMiIHg9IjciIHk9IjExIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSI0MyIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2NDQiIHg9IjEwIiB5PSIxMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iNDQiIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0idjQ1IiB4PSIxMyIgeT0iMTEiIHdpZHRoPSIyIiBoZWlnaHQ9IjEiIHRleHQ9IjQ1IiAvPgogICAgICAgIDxidXR0b24gaWQ9InY0NiIgeD0iMTYiIHk9IjExIiB3aWR0aD0iMiIgaGVpZ2h0PSIxIiB0ZXh0PSI0NiIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJ2NDciIHg9IjE5IiB5PSIxMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iNDciIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0iZXJhc2UiIHg9IjIyIiB5PSIxMSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgdGV4dD0iJmx0Oy0iIC8+CiAgICA8L2ZyYW1lPgogICAgPGZyYW1lIGlkPSJjb250cm9sIiB4PSI1IiB5PSIxNyIgd2lkdGg9IjE5IiBoZWlnaHQ9IjMiIGJnPSJsaWdodEdyYXkiPgogICAgICAgIDxidXR0b24gaWQ9ImRvbmUiIHg9IjEiIHdpZHRoPSI4IiB0ZXh0PSJEb25lIiBiZz0iZ3JheSIgLz4KICAgICAgICA8YnV0dG9uIGlkPSJiYWNrIiB4PSIxMiIgd2lkdGg9IjgiIHRleHQ9IkJhY2siIGJnPSJyZWQiIC8+CiAgICA8L2ZyYW1lPgo8L2ZyYW1lPg==";
  63.     ["message.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJsaW1lIj4KICAgIDxwYW5lIHdpZHRoPSJwYXJlbnQudyIgaGVpZ2h0PSIxIiBiZz0iYmx1ZSIgLz4KICAgIDxsYWJlbCBpZD0idGl0bGUiIHg9IihwYXJlbnQudyAtIHNlbGYudykvMiIgZmc9IndoaXRlIiB0ZXh0PSIiIC8+CiAgICA8YnV0dG9uIGlkPSJjbG9zZSIgeD0icGFyZW50LnciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGJnPSJyZWQiIGZnPSJ3aGl0ZSIgdGV4dD0iWCIgLz4KICAgIDxsYWJlbCBpZD0iY29udGVudCIgeD0iMiIgeT0iMyIgd2lkdGg9InBhcmVudC53IC0gMiIgaGVpZ2h0PSJwYXJlbnQuaCAtIDQiIGJnPSJ3aGl0ZSIKICAgICAgICBmZz0iYmxhY2siIC8+CjwvZnJhbWU+";
  64.     ["event.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBoZWlnaHQ9IjEiIGJnPSJibHVlIi8+CiAgICA8bGFiZWwgeD0icGFyZW50LncvMi1zZWxmLncvMiIgZmc9IndoaXRlIiB0ZXh0PSJBdWRpdCBFdmVudCIvPgogICAgPHBhbmUgeD0iMiIgeT0iMyIgd2lkdGg9InBhcmVudC53IC0gMiIgaGVpZ2h0PSJwYXJlbnQuaCAtIDciIGJnPSJ3aGl0ZSIvPgogICAgPGxhYmVsIGlkPSJjb250ZW50IiB4PSIyIiB5PSIzIiB3aWR0aD0icGFyZW50LncgLSAyIiBoZWlnaHQ9InBhcmVudC5oIC0gNyIgdGV4dD0iIi8+CiAgICA8ZnJhbWUgaWQ9ImNvbnRyb2wiIHg9IjIiIHk9InBhcmVudC5oIC0gMyIgd2lkdGg9InBhcmVudC53IC0gMiIgaGVpZ2h0PSIzIj4KICAgICAgICA8YnV0dG9uIGlkPSJwcmludCIgeD0iMiIgdGV4dD0iUHJpbnQiIHZpc2libGU9ImZhbHNlIi8+CiAgICAgICAgPGJ1dHRvbiBpZD0iZXhpdCIgeD0icGFyZW50LncgLSBzZWxmLnciIHRleHQ9IkJhY2siLz4KICAgIDwvZnJhbWU+CjwvZnJhbWU+Cg==";
  65. }
  66. local entrypoint = "bG9jYWwgVElNRU9VVCA9IDIKbG9jYWwgU0VDVVJJVFlfQ09NTUFORCA9IDQ4CmxvY2FsIFNFQ1VSSVRZX0VWRU5UID0gNDkKCmxvY2FsIFRIRU1FID0gewoJRnJhbWVCRyA9IGNvbG9ycy5saWdodEJsdWU7CglGcmFtZUZHID0gY29sb3JzLmJsYWNrOwoJQnV0dG9uQkcgPSBjb2xvcnMuY3lhbjsKCU1lbnViYXJCRyA9IGNvbG9ycy5jeWFuOwoJU2VsZWN0aW9uQkcgPSBjb2xvcnMuYmx1ZTsKCVNlbGVjdGlvblRleHQgPSBjb2xvcnMud2hpdGU7CglMaXN0QkcgPSBjb2xvcnMuY3lhbjsKCUlucHV0QkcgPSBjb2xvcnMubGlnaHRCbHVlOwoJQ2hlY2tib3hCRyA9IGNvbG9ycy53aGl0ZTsKCUNoZWNrYm94VGV4dCA9IGNvbG9ycy5ibGFjazsKfQoKbG9jYWwgYmFzYWx0ID0gcmVxdWlyZSAnYmFzYWx0Jwpsb2NhbCBqb2IgPSByZXF1aXJlICdrdGxvLmpvYicKbG9jYWwgcnBjID0gcmVxdWlyZSAna3Rsby5ycGMnCmxvY2FsIGtleXMgPSByZXF1aXJlICdwc2cua2V5cycKbG9jYWwgY29uY3VycmVudCA9IHJlcXVpcmUgJ2t0bG8uY29uY3VycmVudCcKbG9jYWwgcHJpbnRlciA9IHJlcXVpcmUgJ3BzZy5wcmludGVyJwpsb2NhbCByZXNvdXJjZXMgPSByZXF1aXJlICdrdGxvLnJlc291cmNlcycKbG9jYWwgbW9kYWwgPSByZXF1aXJlICdwc2cubW9kYWwnCgpsb2NhbCBtb2RlbSA9IHBlcmlwaGVyYWwuZmluZCgibW9kZW0iLCBmdW5jdGlvbihfLCBtb2RlbSkgcmV0dXJuIG5vdCBtb2RlbS5pc1dpcmVsZXNzKCkgZW5kKQppZiBub3QgbW9kZW0gdGhlbgoJZXJyb3IgIk5vIG1vZGVtIGZvdW5kOyBleGl0aW5nLi4uIgplbmQKbW9kZW0gPSBwZXJpcGhlcmFsLmdldE5hbWUobW9kZW0pCgpsb2NhbCBjbGllbnQgPSBycGMuY2xpZW50X25ldHdvcmsobW9kZW0sIFNFQ1VSSVRZX0NPTU1BTkQsIFRJTUVPVVQpCgpsb2NhbCBpbml0aWFsaXplZFByb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eShmYWxzZSkKbG9jYWwgbW9kYWxNdXRleCA9IGNvbmN1cnJlbnQubXV0ZXgoKQpsb2NhbCBtb2RhbE11dGV4RXZlbnQgPSBjb25jdXJyZW50Lm11dGV4KCkKCmxvY2FsIGZ1bmN0aW9uIGRvbShwYXRoKQoJbG9jYWwgY3VycmVudCA9IGJhc2FsdC5nZXRBY3RpdmVGcmFtZSgpCglmb3IgXywgc2VnbWVudCBpbiBpcGFpcnMocGF0aCkgZG8KCQljdXJyZW50ID0gY3VycmVudDpnZXRPYmplY3Qoc2VnbWVudCkKCWVuZAoJcmV0dXJuIGN1cnJlbnQKZW5kCgpsb2NhbCBmdW5jdGlvbiBhdWRpdEV2ZW50RGlhbG9nKGV2ZW50KQoJbW9kYWxNdXRleDp3aXRoX2xvY2soZnVuY3Rpb24oKQoJCW1vZGFsLm9wZW4oZnVuY3Rpb24oZnJhbWUsIGZ1dHVyZSkKCQkJZnJhbWU6YWRkTGF5b3V0RnJvbVN0cmluZyhyZXNvdXJjZXMubG9hZCgiZXZlbnQueG1sIikpCgkJCWxvY2FsIHdpbmRvdyA9IGZyYW1lOmdldE9iamVjdCgid2luZG93IikKCQkJbG9jYWwgY29udHJvbCA9IHdpbmRvdzpnZXRPYmplY3QoImNvbnRyb2wiKQoJCQljb250cm9sOmdldE9iamVjdCgiZXhpdCIpOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQkJZnV0dXJlOmNvbXBsZXRlKG5pbCkKCQkJZW5kKQoJCQlsb2NhbCBldmVudFRleHQgPSB0ZXh0dXRpbHMuc2VyaWFsaXNlKGV2ZW50KQoJCQl3aW5kb3c6Z2V0T2JqZWN0KCdjb250ZW50Jyk6c2V0VGV4dChldmVudFRleHQpCgkJCWxvY2FsIHByaW50QnV0dG9uID0gY29udHJvbDpnZXRPYmplY3QoInByaW50IikKCQkJaWYgcHJpbnRlci5leGlzdHMoKSB0aGVuCgkJCQlwcmludEJ1dHRvbjpzaG93KCkKCQkJZW5kCgkJCXByaW50QnV0dG9uOm9uQ2xpY2soZnVuY3Rpb24oKQoJCQkJbG9jYWwgY29udGV4dCA9IHByaW50ZXIucHJpbnQoIkV2ZW50IiwgZXZlbnRUZXh0KQoJCQkJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQkJCQl3aGlsZSB0cnVlIGRvCgkJCQkJCWxvY2FsIG9rLCBlcnIgPSBjb250ZXh0OmNvbnRpbnVlKCkKCQkJCQkJaWYgb2sgdGhlbgoJCQkJCQkJYnJlYWsKCQkJCQkJZW5kCgkJCQkJCWxvY2FsIGNvbnRpbnVlID0gbW9kYWxNdXRleEV2ZW50OndpdGhfbG9jayhtb2RhbC5hbGVydCwgZXJyLCAiQ29udGludWUiLCAiQ2FuY2VsIikKCQkJCQkJaWYgbm90IGNvbnRpbnVlIHRoZW4KCQkJCQkJCWNvbnRleHQ6Y2FuY2VsKCkKCQkJCQkJCWJyZWFrCgkJCQkJCWVuZAoJCQkJCWVuZAoJCQkJZW5kKQoJCQllbmQpCgkJZW5kKQoJZW5kKQplbmQKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2VsZWN0RnJhbWUiLCBmdW5jdGlvbihzZWxmKQoJbG9jYWwgaW5kZXggPSBzZWxmOmdldEl0ZW1JbmRleCgpCglsb2NhbCB0YWJzID0gewoJCWRvbSB7ICdyb290JywgJ21haW4nLCAna2V5cycgfSwKCQlkb20geyAncm9vdCcsICdtYWluJywgJ2F1ZGl0JyB9LAoJCWRvbSB7ICdyb290JywgJ21haW4nLCAnc2V0dGluZ3MnIH0sCgkJZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdwcm90b2NvbHMnIH0sCgkJZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdmaWx0ZXInIH0sCgl9Cglmb3IgaSwgdGFiIGluIGlwYWlycyh0YWJzKSBkbwoJCWlmIGkgPT0gaW5kZXggdGhlbgoJCQl0YWI6c2hvdygpCgkJZWxzZQoJCQl0YWI6aGlkZSgpCgkJZW5kCgllbmQKZW5kKQoKbG9jYWwgc2VsZWN0ZWRGaWx0ZXJMaXN0UHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KDEpCgpiYXNhbHQuc2V0VmFyaWFibGUoInNlbGVjdEZpbHRlckxpc3QiLCBmdW5jdGlvbihzZWxmKQoJbG9jYWwgaW5kZXggPSBzZWxmOmdldEl0ZW1JbmRleCgpCglzZWxlY3RlZEZpbHRlckxpc3RQcm9wZXJ0eTpzZXQoaW5kZXgpCmVuZCkKCmxvY2FsIGtleXNMaXN0Cgpsb2NhbCBmdW5jdGlvbiBzY3JvbGwoYnV0dG9uLCBpbmNyZW1lbnQpCglsb2NhbCBsaXN0ID0gYnV0dG9uOmdldFBhcmVudCgpOmdldE9iamVjdCgibGlzdCIpCglsb2NhbCBvZmZzZXQgPSBsaXN0OmdldE9mZnNldCgpCglpZiBpbmNyZW1lbnQgPCAwIGFuZCBvZmZzZXQgPD0gMCB0aGVuCgkJcmV0dXJuCgllbmQKCWlmIGluY3JlbWVudCA+IDAgYW5kIG9mZnNldCA+ICMobGlzdDpnZXRBbGwoKSkgLSBsaXN0OmdldEhlaWdodCgpIHRoZW4KCQlyZXR1cm4KCWVuZAoJbGlzdDpzZXRPZmZzZXQob2Zmc2V0ICsgaW5jcmVtZW50KQplbmQKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2Nyb2xsVXAiLCBmdW5jdGlvbihidXR0b24pCglzY3JvbGwoYnV0dG9uLCAtMSkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJzY3JvbGxEb3duIiwgZnVuY3Rpb24oYnV0dG9uKQoJc2Nyb2xsKGJ1dHRvbiwgMSkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJhbGxvdyIsIGZ1bmN0aW9uKCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJbG9jYWwgaSA9IGtleXNMaXN0OmdldEl0ZW1JbmRleCgpCgkJaWYgaSB0aGVuCgkJCWxvY2FsIGtleUluZm8gPSBrZXlzTGlzdDpnZXRJdGVtKGkpLmFyZ3NbMV0KCQkJY2xpZW50LmFsbG93KGtleUluZm8ua2V5LCBrZXlJbmZvLm5hbWUpCgkJZW5kCgllbmQpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgiZGVueSIsIGZ1bmN0aW9uKCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJbG9jYWwgaSA9IGtleXNMaXN0OmdldEl0ZW1JbmRleCgpCgkJaWYgaSB0aGVuCgkJCWxvY2FsIGl0ZW0gPSBrZXlzTGlzdDpnZXRJdGVtKGkpCgkJCWxvY2FsIGtleSA9IGl0ZW0uYXJnc1sxXS5rZXkKCQkJY2xpZW50LmRlbnkoa2V5KQoJCWVuZAoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImFkZEFkZHJlc3NUb0ZpbHRlciIsIGZ1bmN0aW9uKCkKCWxvY2FsIGxpc3RUeXBlID0gc2VsZWN0ZWRGaWx0ZXJMaXN0UHJvcGVydHkudmFsdWUKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJbG9jYWwgbmV3QWRkcmVzcyA9IG1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLmFkZHJlc3MpCgkJaWYgbmV3QWRkcmVzcyB0aGVuCgkJCWlmIGxpc3RUeXBlID09IDEgdGhlbgoJCQkJY2xpZW50LmFsbG93bGlzdEFkZChuZXdBZGRyZXNzKQoJCQllbHNlCgkJCQljbGllbnQuZGVueWxpc3RBZGQobmV3QWRkcmVzcykKCQkJZW5kCgkJZW5kCgllbmQpCmVuZCkKCmxvY2FsIGFsbG93bGlzdEVsZW1lbnQsIGRlbnlsaXN0RWxlbWVudAoKYmFzYWx0LnNldFZhcmlhYmxlKCJkZWxBZGRyZXNzRnJvbUZpbHRlciIsIGZ1bmN0aW9uKCkKCWxvY2FsIGxpc3RUeXBlID0gc2VsZWN0ZWRGaWx0ZXJMaXN0UHJvcGVydHkudmFsdWUKCWxvY2FsIGxpc3QKCWlmIGxpc3RUeXBlID09IDEgdGhlbgoJCWxpc3QgPSBhbGxvd2xpc3RFbGVtZW50CgllbHNlCgkJbGlzdCA9IGRlbnlsaXN0RWxlbWVudAoJZW5kCglsb2NhbCBpbmRleCA9IGxpc3Q6Z2V0SXRlbUluZGV4KCkKCWlmIG5vdCBpbmRleCB0aGVuCgkJcmV0dXJuCgllbmQKCWxvY2FsIGl0ZW0gPSBsaXN0OmdldEl0ZW0oaW5kZXgpCglsb2NhbCBhZGRyZXNzID0gaXRlbS5hcmdzWzFdCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCWlmIGxpc3RUeXBlID09IDEgdGhlbgoJCQljbGllbnQuYWxsb3dsaXN0RGVsKGFkZHJlc3MpCgkJZWxzZQoJCQljbGllbnQuZGVueWxpc3REZWwoYWRkcmVzcykKCQllbmQKCWVuZCkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJzeW5jRmlsdGVyIiwgZnVuY3Rpb24oKQoJbG9jYWwgbGlzdFR5cGUgPSBzZWxlY3RlZEZpbHRlckxpc3RQcm9wZXJ0eS52YWx1ZQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQlpZiBsaXN0VHlwZSA9PSAxIHRoZW4KCQkJY2xpZW50LmFsbG93bGlzdFN5bmMoKQoJCWVsc2UKCQkJY2xpZW50LmRlbnlsaXN0U3luYygpCgkJZW5kCgllbmQpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2V0RmlsdGVyTW9kZSIsIGZ1bmN0aW9uKGVsZW1lbnQpCglsb2NhbCBuYW1lID0gZWxlbWVudDpnZXROYW1lKCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJY2xpZW50LnNldEZpbHRlck1vZGUobmFtZSkKCWVuZCkKZW5kKQoKbG9jYWwgZW5lcmd5VGFyZ2V0RWxlbWVudCwgbmV0d29ya0lkRWxlbWVudAoKbG9jYWwgYXV0b0Nsb3NlUHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KDApCmxvY2FsIGlyaXNQcm90ZWN0UHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KDApCgpsb2NhbCBmdW5jdGlvbiBzZXRFbmVyZ3lUYXJnZXRUZXh0KGVuZXJneVRhcmdldCkKCWVuZXJneVRhcmdldEVsZW1lbnQ6c2V0VGV4dCh0b3N0cmluZyhlbmVyZ3lUYXJnZXQpLi4iIEZFIikKZW5kCgpiYXNhbHQuc2V0VmFyaWFibGUoInNldEVuZXJneVRhcmdldCIsIGZ1bmN0aW9uKCkKCWxvY2FsIGluaXQgPSB0b251bWJlcihlbmVyZ3lUYXJnZXRFbGVtZW50OmdldFZhbHVlKCk6c3ViKDEsIC00KSkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJbG9jYWwgcmVzdWx0ID0gbW9kYWxNdXRleDp3aXRoX2xvY2sobW9kYWwubnVtYmVyLCBpbml0IG9yIDApCgkJaWYgcmVzdWx0IHRoZW4KCQkJY2xpZW50LnNldEVuZXJneVRhcmdldChyZXN1bHQpCgkJZW5kCgllbmQpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2V0TmV0d29ya0lkIiwgZnVuY3Rpb24oKQoJbG9jYWwgaW5pdCA9IHRvbnVtYmVyKG5ldHdvcmtJZEVsZW1lbnQ6Z2V0VmFsdWUoKSkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJbG9jYWwgcmVzdWx0ID0gbW9kYWxNdXRleDp3aXRoX2xvY2sobW9kYWwubnVtYmVyLCBpbml0IG9yIDApCgkJaWYgcmVzdWx0IHRoZW4KCQkJY2xpZW50LnNldE5ldHdvcmsocmVzdWx0KQoJCWVuZAoJZW5kKQplbmQpCgpsb2NhbCBmdW5jdGlvbiBjaGVja2JveEJ1dHRvblN0YXRlKGVsZW1lbnQpCglyZXR1cm4gZWxlbWVudDpnZXRWYWx1ZSgpID09ICIqIgplbmQKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2V0TmV0UmVzdHJpY3RlZCIsIGZ1bmN0aW9uKGVsZW1lbnQpCglsb2NhbCB2YWx1ZSA9IGNoZWNrYm94QnV0dG9uU3RhdGUoZWxlbWVudCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJY2xpZW50LnJlc3RyaWN0TmV0d29yayhub3QgdmFsdWUpCgllbmQpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2V0QXV0b0lyaXMiLCBmdW5jdGlvbihlbGVtZW50KQoJbG9jYWwgdmFsdWUgPSBjaGVja2JveEJ1dHRvblN0YXRlKGVsZW1lbnQpCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCWNsaWVudC5zZXRBdXRvSXJpcyhub3QgdmFsdWUpCgllbmQpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgiaGVscEF1dG9JcmlzIiwgZnVuY3Rpb24oKQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQltb2RhbE11dGV4OndpdGhfbG9jayhtb2RhbC5tZXNzYWdlLCAiQXV0byBJcmlzIiwKCQlbW0lmIGVuYWJsZWQsIGNsb3NlcyB0aGUgaXJpcyBvbiBpbmNvbWluZyB3b3JtaG9sZSBhbmQgd2FpdHMgYXV0aGVudGlmaWNhdGlvbiBmcm9tIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uXV0KCSkKCWVuZCkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJzZXRBdXRvQ2xvc2UiLCBmdW5jdGlvbihlbGVtZW50KQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQlsb2NhbCByZXN1bHQgPSBtb2RhbE11dGV4OndpdGhfbG9jayhtb2RhbC5udW1iZXIsIGF1dG9DbG9zZVByb3BlcnR5LnZhbHVlKQoJCWlmIHJlc3VsdCB0aGVuCgkJCWNsaWVudC5zZXRBdXRvQ2xvc2UocmVzdWx0KQoJCWVuZAoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImhlbHBBdXRvQ2xvc2UiLCBmdW5jdGlvbigpCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCW1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLm1lc3NhZ2UsICJBdXRvIENsb3NlIiwKCQlbW0lmIGVuYWJsZWQsIGNsb3NlcyB0aGUgb3V0Z29pbmcgY29ubmVjdGlvbiBhZnRlciBOIHNlY29uZHMgZnJvbSB0aGUgbGFzdCB0cmV2ZWxsZXIgcGFzc3Rocm91Z2guXV0KCSkKCWVuZCkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJzZXRJcmlzUHJvdGVjdCIsIGZ1bmN0aW9uKGVsZW1lbnQpCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCWxvY2FsIHJlc3VsdCA9IG1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLm51bWJlciwgaXJpc1Byb3RlY3RQcm9wZXJ0eS52YWx1ZSkKCQlpZiByZXN1bHQgdGhlbgoJCQljbGllbnQuc2V0SXJpc1Byb3RlY3QocmVzdWx0KQoJCWVuZAoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImhlbHBJcmlzUHJvdGVjdCIsIGZ1bmN0aW9uKCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJbW9kYWxNdXRleDp3aXRoX2xvY2sobW9kYWwubWVzc2FnZSwgIklyaXMgUHJvdGVjdCIsCgkJW1tJZiBlbmFibGVkLCB0cmllcyB0byBkaXNjb25uZWN0IHRoZSBzdGFyZ2F0ZSBhZnRlciBOIGlyaXMgaGl0cyBmcm9tIHRoZSBvdGhlciBzaWRlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJldmVudGluZyBpcmlzIGRlc3RydWN0aW9uIGJ5IHNub3diYWxsIHNwYW1taW5nLl1dCgkpCgllbmQpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2V0Tm9LYXdvb3NoIiwgZnVuY3Rpb24oZWxlbWVudCkKCWxvY2FsIHZhbHVlID0gY2hlY2tib3hCdXR0b25TdGF0ZShlbGVtZW50KQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQljbGllbnQuc2V0Tm9LYXdvb3NoKG5vdCB2YWx1ZSkKCWVuZCkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJoZWxwTm9LYXdvb3NoIiwgZnVuY3Rpb24oKQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQltb2RhbE11dGV4OndpdGhfbG9jayhtb2RhbC5tZXNzYWdlLCAiTm8gS2F3b29zaCIsCgkJW1tFbmFibGVzIGEgc2FmZXR5IHByZWNhdXRpb24gdGhhdCBrZWVwcyB0aGUgaXJpcyBjbG9zZWQgd2hpbGUgdGhlIHdvcm1ob2xlIGlzbid0IGVzdGFibGlzaGVkIHlldC4gKEZvciBwZW9wbGUgdGhhdCBydXNoIHRvIHRoZSBzdGFyZ2F0ZSBhcyBzb29uIGFzIHBvc3NpYmxlLildXQoJKQoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoInNldFByZWZlck1hbnVhbCIsIGZ1bmN0aW9uKGVsZW1lbnQpCglsb2NhbCB2YWx1ZSA9IGNoZWNrYm94QnV0dG9uU3RhdGUoZWxlbWVudCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJY2xpZW50LnNldFByZWZlck1hbnVhbChub3QgdmFsdWUpCgllbmQpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgiaGVscFByZWZlck1hbnVhbCIsIGZ1bmN0aW9uKCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJbW9kYWxNdXRleDp3aXRoX2xvY2sobW9kYWwubWVzc2FnZSwgIk1hbnVhbCBEaWFsIiwKCQlbW01ha2VzIHRoZSBzdGFyZ2F0ZSB1c2UgdGhlIG1hbnVhbCBkaWFsaW5nIG1vZGUgZXZlbiBpZiBpbnRlcmZhY2UgaXMgY2FwYWJsZSBlbm91Z2ggZm9yIERIRCBkaWFsaW5nIG1vZGUuIFRoaXMgc2V0dGluZyBpcyBpZ25vcmVkIGlmIGFkdmFuY2VkIGRpYWxpbmcgbW9kZSBpcyBvbi5dXQoJKQoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoInNldEFkdmFuY2VkRGlhbCIsIGZ1bmN0aW9uKGVsZW1lbnQpCglsb2NhbCB2YWx1ZSA9IGNoZWNrYm94QnV0dG9uU3RhdGUoZWxlbWVudCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJY2xpZW50LnNldEFkdmFuY2VkRGlhbChub3QgdmFsdWUpCgllbmQpCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgiaGVscEFkdmFuY2VkRGlhbCIsIGZ1bmN0aW9uKCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJbW9kYWxNdXRleDp3aXRoX2xvY2sobW9kYWwubWVzc2FnZSwgIkFkdmFuY2VkIERpYWwiLAoJCVtbTWFrZXMgdGhlIHN0YXJnYXRlIGFsd2F5cyB1c2UgdGhlIGRpcmVjdCBkaWFsaW5nIG1vZGUuIFRoaXMgZGlhbGluZyBtb2RlIHdvcmtzIG9ubHkgd2l0aCBhbiBhZHZhbmNlZCBjcnlzdGFsIGludGVyZmFjZS5dXQoJKQoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoInNldEVuYWJsZUF1ZGl0IiwgZnVuY3Rpb24oZWxlbWVudCkKCWxvY2FsIHZhbHVlID0gY2hlY2tib3hCdXR0b25TdGF0ZShlbGVtZW50KQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQljbGllbnQuc2V0RW5hYmxlQXVkaXQobm90IHZhbHVlKQoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoIm9wZW5JcmlzIiwgZnVuY3Rpb24oKQoJam9iLmFzeW5jKGZ1bmN0aW9uKCkKCQljbGllbnQub3BlbklyaXMoKQoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImNsb3NlSXJpcyIsIGZ1bmN0aW9uKCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJY2xpZW50LmNsb3NlSXJpcygpCgllbmQpCmVuZCkKCmxvY2FsIG5ld0F1ZGl0RXZlbnRzUHJvcGVydHkgPSBjb25jdXJyZW50LnByb3BlcnR5KDApCmxvY2FsIGF1ZGl0UGFnZU51bWJlclByb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eSgxKQpsb2NhbCBhdWRpdERpcmVjdGlvblByb3BlcnR5ID0gY29uY3VycmVudC5wcm9wZXJ0eSgndGFpbCcpCmxvY2FsIHNob3VsZEZldGNoQXVkaXRQcm9wZXJ0eSA9IGNvbmN1cnJlbnQucHJvcGVydHkoZmFsc2UpCmxvY2FsIGF1ZGl0TGlzdEVsZW1lbnQsIGF1ZGl0RGlyZWN0aW9uRWxlbWVudAoKbG9jYWwgZnVuY3Rpb24gZ2V0QXVkaXRMaXN0RWxlbWVudCgpCglpZiBhdWRpdExpc3RFbGVtZW50IHRoZW4KCQlyZXR1cm4gYXVkaXRMaXN0RWxlbWVudAoJZW5kCglhdWRpdExpc3RFbGVtZW50ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdhdWRpdCcsICdsaXN0JyB9CglyZXR1cm4gYXVkaXRMaXN0RWxlbWVudAplbmQKCmxvY2FsIGZ1bmN0aW9uIGdldEF1ZGl0RGlyZWN0aW9uRWxlbWVudCgpCglpZiBhdWRpdERpcmVjdGlvbkVsZW1lbnQgdGhlbgoJCXJldHVybiBhdWRpdERpcmVjdGlvbkVsZW1lbnQKCWVuZAoJYXVkaXREaXJlY3Rpb25FbGVtZW50ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdhdWRpdCcsICdkaXJlY3Rpb24nIH0KCXJldHVybiBhdWRpdERpcmVjdGlvbkVsZW1lbnQKZW5kCgpsb2NhbCBmdW5jdGlvbiBnZXRBdWRpdERpcmVjdGlvbigpCglyZXR1cm4gZ2V0QXVkaXREaXJlY3Rpb25FbGVtZW50KCk6Z2V0SXRlbUluZGV4KCkgPT0gMSBhbmQgJ3RhaWwnIG9yICdoZWFkJwplbmQKCmJhc2FsdC5zZXRWYXJpYWJsZSgic3dpdGNoQXVkaXREaXJlY3Rpb24iLCBmdW5jdGlvbigpCglsb2NhbCBkaXJlY3Rpb24gPSBnZXRBdWRpdERpcmVjdGlvbigpCglhdWRpdERpcmVjdGlvblByb3BlcnR5OnNldChkaXJlY3Rpb24pCmVuZCkKCmJhc2FsdC5zZXRWYXJpYWJsZSgiYXVkaXRTaG93RXZlbnQiLCBmdW5jdGlvbigpCglsb2NhbCBsaXN0ID0gZ2V0QXVkaXRMaXN0RWxlbWVudCgpCglsb2NhbCBpID0gbGlzdDpnZXRJdGVtSW5kZXgoKQoJaWYgaSB0aGVuCgkJbG9jYWwgaXRlbSA9IGxpc3Q6Z2V0SXRlbShpKQoJCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJCWF1ZGl0RXZlbnREaWFsb2coaXRlbS5hcmdzWzFdKQoJCWVuZCkKCWVuZAplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImF1ZGl0UHJldlBhZ2UiLCBmdW5jdGlvbigpCglhdWRpdFBhZ2VOdW1iZXJQcm9wZXJ0eTpzZXQoYXVkaXRQYWdlTnVtYmVyUHJvcGVydHkudmFsdWUgLSAxKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImF1ZGl0TmV4dFBhZ2UiLCBmdW5jdGlvbigpCglhdWRpdFBhZ2VOdW1iZXJQcm9wZXJ0eTpzZXQoYXVkaXRQYWdlTnVtYmVyUHJvcGVydHkudmFsdWUgKyAxKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImF1ZGl0RGVsZXRlUGFnZSIsIGZ1bmN0aW9uKCkKCWxvY2FsIHNpemUgPSBnZXRBdWRpdExpc3RFbGVtZW50KCk6Z2V0SGVpZ2h0KCkKCWpvYi5hc3luYyhmdW5jdGlvbigpCgkJY2xpZW50LmVyYXNlKHNpemUpCgkJc2hvdWxkRmV0Y2hBdWRpdFByb3BlcnR5OnNldCh0cnVlKQoJZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoInByaW50QXVkaXRQYWdlIiwgZnVuY3Rpb24oKQoJbG9jYWwgaXRlbXMgPSBnZXRBdWRpdExpc3RFbGVtZW50KCk6Z2V0QWxsKCkKCWxvY2FsIGV2ZW50cyA9IHt9Cglmb3IgXywgaXRlbSBpbiBpcGFpcnMoaXRlbXMpIGRvCgkJdGFibGUuaW5zZXJ0KGV2ZW50cywgaXRlbS5hcmdzWzFdKQoJZW5kCglsb2NhbCBjb250ZXh0ID0gcHJpbnRlci5wcmludCgiQXVkaXQiLCB0ZXh0dXRpbHMuc2VyaWFsaXNlKGV2ZW50cykpCglqb2IuYXN5bmMoZnVuY3Rpb24oKQoJCXdoaWxlIHRydWUgZG8KCQkJbG9jYWwgb2ssIGVyciA9IGNvbnRleHQ6Y29udGludWUoKQoJCQlpZiBvayB0aGVuCgkJCQlicmVhawoJCQllbmQKCQkJbG9jYWwgY29udGludWUgPSBtb2RhbE11dGV4OndpdGhfbG9jayhtb2RhbC5hbGVydCwgZXJyLCAiQ29udGludWUiLCAiQ2FuY2VsIikKCQkJaWYgbm90IGNvbnRpbnVlIHRoZW4KCQkJCWNvbnRleHQ6Y2FuY2VsKCkKCQkJCWJyZWFrCgkJCWVuZAoJCWVuZAoJZW5kKQplbmQpCgpqb2IucnVuKGZ1bmN0aW9uKCkKCmJhc2FsdC5jcmVhdGVGcmFtZSgpCgk6c2V0VGhlbWUoVEhFTUUpCgk6YWRkTGF5b3V0RnJvbVN0cmluZyhyZXNvdXJjZXMubG9hZCgic3NnLnhtbCIpKQoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShzZWxlY3RlZEZpbHRlckxpc3RQcm9wZXJ0eSwgZnVuY3Rpb24oaW5kZXgpCglsb2NhbCBhbGxvd2xpc3QgPSBkb20geyAncm9vdCcsICdtYWluJywgJ2ZpbHRlcicsICdhbGxvd2xpc3QnIH0KCWxvY2FsIGRlbnlsaXN0ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdmaWx0ZXInLCAnZGVueWxpc3QnIH0KCWlmIGluZGV4ID09IDEgdGhlbgoJCWFsbG93bGlzdDpzaG93KCkKCQlkZW55bGlzdDpoaWRlKCkKCWVsc2UKCQlhbGxvd2xpc3Q6aGlkZSgpCgkJZGVueWxpc3Q6c2hvdygpCgllbmQKZW5kKQoKaWYgcHJpbnRlci5leGlzdHMoKSB0aGVuCglkb20geyAncm9vdCcsICdtYWluJywgJ2F1ZGl0JywgJ29wJywgJ3ByaW50JyB9OnNob3coKQplbmQKCmtleXNMaXN0ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdrZXlzJywgJ2xpc3QnIH0KCmVuZXJneVRhcmdldEVsZW1lbnQgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3NldHRpbmdzJywgJ2VuZXJneVRhcmdldCcgfQpuZXR3b3JrSWRFbGVtZW50ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzZXR0aW5ncycsICdhZHZhbmNlZCcsICduZXR3b3JrSWQnIH0KbG9jYWwgaXNOZXRSZXN0cmljdGVkRWxlbWVudCA9IGRvbSB7ICdyb290JywgJ21haW4nLCAnc2V0dGluZ3MnLCAnYWR2YW5jZWQnLCAnaXNOZXRSZXN0cmljdGVkJyB9CmxvY2FsIGlyaXNFbGVtZW50ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzZXR0aW5ncycsICdpcmlzJywgJ2lyaXMnIH0KbG9jYWwgaXJpc0R1cmFiaWxpdHlCYXJFbGVtZW50ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzZXR0aW5ncycsICdpcmlzJywgJ2lyaXNEdXJhYmlsaXR5QmFyJyB9CmxvY2FsIGlyaXNEdXJhYmlsaXR5RWxlbWVudCA9IGRvbSB7ICdyb290JywgJ21haW4nLCAnc2V0dGluZ3MnLCAnaXJpcycsICdpcmlzRHVyYWJpbGl0eScgfQpsb2NhbCBlbmFibGVBdWRpdEVsZW1lbnQgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3NldHRpbmdzJywgJ2VuYWJsZUF1ZGl0JyB9CmxvY2FsIGF1dG9JcmlzRWxlbWVudCA9IGRvbSB7ICdyb290JywgJ21haW4nLCAncHJvdG9jb2xzJywgJ2F1dG9JcmlzJyB9CmxvY2FsIGF1dG9DbG9zZUVsZW1lbnQgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3Byb3RvY29scycsICd2MS4zJywgJ2F1dG9DbG9zZScgfQpsb2NhbCBpcmlzUHJvdGVjdEVsZW1lbnQgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3Byb3RvY29scycsICd2MS4zJywgJ2lyaXNQcm90ZWN0JyB9CmxvY2FsIG5vS2F3b29zaEVsZW1lbnQgPSBkb20geyAncm9vdCcsICdtYWluJywgJ3Byb3RvY29scycsICd2MS4zJywgJ25vS2F3b29zaCcgfQpsb2NhbCBwcmVmZXJNYW51YWxFbGVtZW50ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdwcm90b2NvbHMnLCAndjEuNScsICdwcmVmZXJNYW51YWwnIH0KbG9jYWwgYWR2YW5jZWREaWFsRWxlbWVudCA9IGRvbSB7ICdyb290JywgJ21haW4nLCAncHJvdG9jb2xzJywgJ3YxLjUnLCAnYWR2YW5jZWREaWFsJyB9CmFsbG93bGlzdEVsZW1lbnQgPSBkb20geyAncm9vdCcsICdtYWluJywgJ2ZpbHRlcicsICdhbGxvd2xpc3QnLCAnbGlzdCcgfQpkZW55bGlzdEVsZW1lbnQgPSBkb20geyAncm9vdCcsICdtYWluJywgJ2ZpbHRlcicsICdkZW55bGlzdCcsICdsaXN0JyB9CmxvY2FsIGZpbHRlck1vZGVFbGVtZW50ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdmaWx0ZXInLCAnbW9kZScgfQpsb2NhbCBhbGxvd01vZGVFbGVtZW50ID0gZmlsdGVyTW9kZUVsZW1lbnQ6Z2V0T2JqZWN0KCdhbGxvdycpCmxvY2FsIG5vbmVNb2RlRWxlbWVudCA9IGZpbHRlck1vZGVFbGVtZW50OmdldE9iamVjdCgnbm9uZScpCmxvY2FsIGRlbnlNb2RlRWxlbWVudCA9IGZpbHRlck1vZGVFbGVtZW50OmdldE9iamVjdCgnZGVueScpCgpsb2NhbCBmdW5jdGlvbiBhZGRGaWx0ZXJJdGVtKGxpc3QsIGFkZHJlc3MpCglsaXN0OmFkZEl0ZW0oIi0iLi50YWJsZS5jb25jYXQoYWRkcmVzcywgIi0iKS4uIi0iLCBuaWwsIG5pbCwgYWRkcmVzcykKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXRTZWxlY3RlZChidXR0b24pCglidXR0b246c2V0Rm9yZWdyb3VuZChjb2xvcnMud2hpdGUpCglidXR0b246c2V0QmFja2dyb3VuZChjb2xvcnMuYmx1ZSkKCWJ1dHRvbjpkaXNhYmxlKCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXREZXNlbGVjdGVkKGJ1dHRvbiwgYmdDb2xvcikKCWJ1dHRvbjpzZXRGb3JlZ3JvdW5kKGNvbG9ycy5ibGFjaykKCWJ1dHRvbjpzZXRCYWNrZ3JvdW5kKGJnQ29sb3IpCglidXR0b246ZW5hYmxlKCkKZW5kCgpsb2NhbCBmdW5jdGlvbiB1cGRhdGVGaWx0ZXJNb2RlRWxlbWVudChtb2RlKQoJaWYgbW9kZSA9PSAnYWxsb3cnIHRoZW4KCQlzZXRTZWxlY3RlZChhbGxvd01vZGVFbGVtZW50KQoJCXNldERlc2VsZWN0ZWQobm9uZU1vZGVFbGVtZW50LCBjb2xvcnMueWVsbG93KQoJCXNldERlc2VsZWN0ZWQoZGVueU1vZGVFbGVtZW50LCBjb2xvcnMucmVkKQoJZWxzZWlmIG1vZGUgPT0gJ2RlbnknIHRoZW4KCQlzZXREZXNlbGVjdGVkKGFsbG93TW9kZUVsZW1lbnQsIGNvbG9ycy5ncmVlbikKCQlzZXREZXNlbGVjdGVkKG5vbmVNb2RlRWxlbWVudCwgY29sb3JzLnllbGxvdykKCQlzZXRTZWxlY3RlZChkZW55TW9kZUVsZW1lbnQpCgllbHNlCgkJc2V0RGVzZWxlY3RlZChhbGxvd01vZGVFbGVtZW50LCBjb2xvcnMuZ3JlZW4pCgkJc2V0U2VsZWN0ZWQobm9uZU1vZGVFbGVtZW50KQoJCXNldERlc2VsZWN0ZWQoZGVueU1vZGVFbGVtZW50LCBjb2xvcnMucmVkKQoJZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2V0QnV0dG9uQ2hlY2tib3goZWxlbWVudCwgdmFsdWUpCglpZiB2YWx1ZSB0aGVuCgkJZWxlbWVudDpzZXRUZXh0KCIqIikKCWVsc2UKCQllbGVtZW50OnNldFRleHQoIiIpCgllbmQKZW5kCgpsb2NhbCBhdWRpdFBhZ2VMYWJlbCA9IGRvbSB7ICdyb290JywgJ21haW4nLCAnYXVkaXQnLCAncGFnZScgfQpsb2NhbCBhdWRpdE5ld0xhYmVsID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdhdWRpdCcsICduZXcnIH0KbG9jYWwgYXVkaXREZWxldGVCdXR0b24gPSBkb20geyAncm9vdCcsICdtYWluJywgJ2F1ZGl0JywgJ29wJywgJ2RlbGV0ZScgfQpsb2NhbCBhdWRpdFByZXZCdXR0b24gPSBkb20geyAncm9vdCcsICdtYWluJywgJ2F1ZGl0JywgJ2NvbnRyb2wnLCAncHJldicgfQoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShhdWRpdFBhZ2VOdW1iZXJQcm9wZXJ0eSwgZnVuY3Rpb24ocGFnZU51bWJlcikKCWF1ZGl0UGFnZUxhYmVsOnNldFRleHQodG9zdHJpbmcocGFnZU51bWJlcikpCglpZiBwYWdlTnVtYmVyID09IDEgdGhlbgoJCWF1ZGl0UHJldkJ1dHRvbjpzZXRCYWNrZ3JvdW5kKGNvbG9ycy5ncmF5KQoJCWF1ZGl0UHJldkJ1dHRvbjpkaXNhYmxlKCkKCWVsc2UKCQlhdWRpdFByZXZCdXR0b246c2V0QmFja2dyb3VuZChjb2xvcnMuY3lhbikKCQlhdWRpdFByZXZCdXR0b246ZW5hYmxlKCkKCWVuZAplbmQpCgpsb2NhbCBzaG93QXVkaXREZWxldGVCdXR0b25Qcm9wZXJ0eSA9IGpvYi5saXZlZGF0YS5jb21iaW5lKGZ1bmN0aW9uKHBhZ2VOdW1iZXIsIGRpcmVjdGlvbikKCXJldHVybiBwYWdlTnVtYmVyID09IDEgYW5kIGRpcmVjdGlvbiA9PSAnaGVhZCcKZW5kLCBhdWRpdFBhZ2VOdW1iZXJQcm9wZXJ0eSwgYXVkaXREaXJlY3Rpb25Qcm9wZXJ0eSkKCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUoc2hvd0F1ZGl0RGVsZXRlQnV0dG9uUHJvcGVydHksIGZ1bmN0aW9uKHNob3cpCglpZiBzaG93IHRoZW4KCQlhdWRpdERlbGV0ZUJ1dHRvbjpzaG93KCkKCWVsc2UKCQlhdWRpdERlbGV0ZUJ1dHRvbjpoaWRlKCkKCWVuZAplbmQpCgpqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKG5ld0F1ZGl0RXZlbnRzUHJvcGVydHksIGZ1bmN0aW9uKHZhbHVlKQoJYXVkaXROZXdMYWJlbDpzZXRUZXh0KHZhbHVlKQplbmQpCgpsb2NhbCBmdW5jdGlvbiBtaW5pbWl6ZURpcmVjdGlvbihkaXJlY3Rpb24pCglpZiBkaXJlY3Rpb24gPT0gJ2luY29taW5nJyB0aGVuCgkJcmV0dXJuICdpbicKCWVsc2UKCQlyZXR1cm4gJ291dCcKCWVuZAplbmQKCmxvY2FsIGZ1bmN0aW9uIHBvcHVsYXRlRXZlbnQoZXZlbnQpCglsb2NhbCB0eXBlID0gZXZlbnQuZXZlbnQKCWxvY2FsIGRlc2NyaXB0aW9uID0gZXZlbnQudGltZXN0YW1wOnN1YigxMiwgLTIpLi4iLCIuLnR5cGUKCWlmIHR5cGUgPT0gJ2F1dGgnIHRoZW4KCQlsb2NhbCBmaW5nZXJwcmludCA9IGtleXMuZmluZ2VycHJpbnQoZXZlbnQua2V5KQoJCWV2ZW50LmZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQKCQlmb3IgXywgaXRlbSBpbiBpcGFpcnMoa2V5c0xpc3Q6Z2V0QWxsKCkpIGRvCgkJCWxvY2FsIGtleUluZm8gPSBpdGVtLmFyZ3NbMV0KCQkJaWYga2V5SW5mby5rZXkgPT0gZXZlbnQua2V5IHRoZW4KCQkJCWxvY2FsIG5hbWUgPSBrZXlJbmZvLm5hbWUKCQkJCWlmIG5hbWUgdGhlbgoJCQkJCWV2ZW50Lm5hbWUgPSBuYW1lCgkJCQkJZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi4uIiwiLi5uYW1lCgkJCQllbmQKCQkJCWJyZWFrCgkJCWVuZAoJCWVuZAoJCWRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uLiIsIi4uZmluZ2VycHJpbnQKCWVsc2VpZiB0eXBlID09ICd3b3JtaG9sZScgdGhlbgoJCWxvY2FsIGRpcmVjdGlvbiA9IG1pbmltaXplRGlyZWN0aW9uKGV2ZW50LmRpcmVjdGlvbikKCQlkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLi4iLCIuLmRpcmVjdGlvbi4uIiwiLi5ldmVudC5hZGRyZXNzCgllbHNlaWYgdHlwZSA9PSAndHJhdmVsJyB0aGVuCgkJbG9jYWwgZGlyZWN0aW9uID0gbWluaW1pemVEaXJlY3Rpb24oZXZlbnQuZGlyZWN0aW9uKQoJCWRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uLiIsIi4uZGlyZWN0aW9uLi4iLCIuLmV2ZW50Lm5hbWUKCWVuZAoJcmV0dXJuIHsgZXZlbnQ9ZXZlbnQsIGRlc2NyaXB0aW9uPWRlc2NyaXB0aW9uIH0KZW5kCgpsb2NhbCBmdW5jdGlvbiBwb3B1bGF0ZUV2ZW50cyhldmVudHMpCglsb2NhbCByZXN1bHQgPSB7fQoJZm9yIF8sIGV2ZW50IGluIGlwYWlycyhldmVudHMpIGRvCgkJbG9jYWwgcmVjb3JkID0gcG9wdWxhdGVFdmVudChldmVudCkKCQl0YWJsZS5pbnNlcnQocmVzdWx0LCByZWNvcmQpCgllbmQKCXJldHVybiByZXN1bHQKZW5kCgpsb2NhbCBmdW5jdGlvbiBmZXRjaEF1ZGl0RXZlbnRzKGRpcmVjdGlvbiwgbmV3LCBwYWdlTnVtYmVyKQoJaWYgcGFnZU51bWJlciA9PSAxIGFuZCBuZXcgPiAwIHRoZW4KCQluZXcgPSAwCgkJbmV3QXVkaXRFdmVudHNQcm9wZXJ0eTpzZXQoMCkKCWVuZAoJbG9jYWwgbGlzdCA9IGdldEF1ZGl0TGlzdEVsZW1lbnQoKQoJbG9jYWwgcGFnZVNpemUgPSBsaXN0OmdldEhlaWdodCgpCglsb2NhbCBza2lwID0gbmV3ICsgKHBhZ2VOdW1iZXIgLSAxKSAqIHBhZ2VTaXplCglsb2NhbCByZWNvcmRzID0gcG9wdWxhdGVFdmVudHMoY2xpZW50W2RpcmVjdGlvbl0oc2tpcCwgcGFnZVNpemUpKQoJbGlzdDpjbGVhcigpCglmb3IgXywgcmVjb3JkIGluIGlwYWlycyhyZWNvcmRzKSBkbwoJCWxpc3Q6YWRkSXRlbShyZWNvcmQuZGVzY3JpcHRpb24sIG5pbCwgbmlsLCByZWNvcmQuZXZlbnQpCgllbmQKZW5kCgpqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKHNob3VsZEZldGNoQXVkaXRQcm9wZXJ0eSwgZnVuY3Rpb24odmFsdWUpCglpZiB2YWx1ZSB0aGVuCgkJaW5pdGlhbGl6ZWRQcm9wZXJ0eTp3YWl0X3VudGlsKGZ1bmN0aW9uKHZhbHVlKQoJCQlyZXR1cm4gdmFsdWUKCQllbmQpCgkJZmV0Y2hBdWRpdEV2ZW50cyhhdWRpdERpcmVjdGlvblByb3BlcnR5LnZhbHVlLCBuZXdBdWRpdEV2ZW50c1Byb3BlcnR5LnZhbHVlLCBhdWRpdFBhZ2VOdW1iZXJQcm9wZXJ0eS52YWx1ZSkKCQlzaG91bGRGZXRjaEF1ZGl0UHJvcGVydHk6c2V0KGZhbHNlKQoJZW5kCmVuZCkKCmpvYi5saXZlZGF0YS5zdWJzY3JpYmUoYXVkaXREaXJlY3Rpb25Qcm9wZXJ0eSwgZnVuY3Rpb24oKQoJbmV3QXVkaXRFdmVudHNQcm9wZXJ0eTpzZXQoMCkKCWF1ZGl0UGFnZU51bWJlclByb3BlcnR5OnNldCgxKQoJc2hvdWxkRmV0Y2hBdWRpdFByb3BlcnR5OnNldCh0cnVlKQplbmQpCgpqb2IubGl2ZWRhdGEuc3Vic2NyaWJlKGF1ZGl0UGFnZU51bWJlclByb3BlcnR5LCBmdW5jdGlvbihwYWdlTnVtYmVyKQoJc2hvdWxkRmV0Y2hBdWRpdFByb3BlcnR5OnNldCh0cnVlKQplbmQpCgpsb2NhbCBmdW5jdGlvbiB1cGRhdGVJcmlzKGlyaXMpCglpZiBpcmlzIHRoZW4KCQlpcmlzRWxlbWVudDpzZXRUZXh0KGlyaXMpCgllbHNlCgkJaXJpc0VsZW1lbnQ6c2V0VGV4dCgibm9uZSIpCgllbmQKZW5kCgpsb2NhbCBmdW5jdGlvbiB1cGRhdGVJcmlzRHVyYWJpbGl0eShjdXJyZW50LCBtYXgpCglpcmlzRHVyYWJpbGl0eUJhckVsZW1lbnQ6c2V0UHJvZ3Jlc3MobWF4ID09IDAgYW5kIDAgb3IgY3VycmVudC9tYXggKiAxMDApCglpcmlzRHVyYWJpbGl0eUVsZW1lbnQ6c2V0VGV4dChzdHJpbmcuZm9ybWF0KCIlZC8lZCIsIGN1cnJlbnQsIG1heCkpCmVuZAoKbG9jYWwgZnVuY3Rpb24gYWRkS2V5VG9LZXlsaXN0KGV2ZW50LCBjb2xvcikKCWxvY2FsIGtleSA9IGV2ZW50LmtleQoJbG9jYWwgZmluZ2VycHJpbnQgPSBrZXlzLmZpbmdlcnByaW50KGtleSkKCWxvY2FsIG5hbWUgPSBldmVudC5uYW1lCglsb2NhbCB0ZXh0CglpZiBuYW1lIHRoZW4KCQl0ZXh0ID0gbmFtZS4uIiAiLi5maW5nZXJwcmludAoJZWxzZQoJCXRleHQgPSBmaW5nZXJwcmludAoJZW5kCglpZiBjb2xvciB0aGVuCgkJdGV4dCA9ICIqIi4udGV4dAoJZW5kCglrZXlzTGlzdDphZGRJdGVtKHRleHQsIG5pbCwgY29sb3IsIHsga2V5PWtleSwgbmFtZT1uYW1lLCBmaW5nZXJwcmludD1maW5nZXJwcmludCB9KQplbmQKCmxvY2FsIGZ1bmN0aW9uIHNldFplcm9lZFRleHQob2JqZWN0LCB2YWx1ZSwgdW5pdHMpCglpZiB2YWx1ZSA9PSAwIHRoZW4KCQlvYmplY3Q6c2V0VGV4dCgiRElTQUJMRUQiKQoJZWxzZQoJCW9iamVjdDpzZXRUZXh0KHZhbHVlLi4iICIuLnVuaXRzKQoJZW5kCmVuZAoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShhdXRvQ2xvc2VQcm9wZXJ0eSwgZnVuY3Rpb24oYXV0b0Nsb3NlKQoJc2V0WmVyb2VkVGV4dChhdXRvQ2xvc2VFbGVtZW50LCBhdXRvQ2xvc2UsICJzZWNvbmRzIikKZW5kKQoKam9iLmxpdmVkYXRhLnN1YnNjcmliZShpcmlzUHJvdGVjdFByb3BlcnR5LCBmdW5jdGlvbihpcmlzUHJvdGVjdCkKCXNldFplcm9lZFRleHQoaXJpc1Byb3RlY3RFbGVtZW50LCBpcmlzUHJvdGVjdCwgImhpdHMiKQplbmQpCgpqb2IuYXN5bmMoZnVuY3Rpb24oKQoJbG9jYWwgc3RhdGUgPSBqb2IucmV0cnkoNSwgY2xpZW50LmdldFN0YXRlKQoJbG9jYWwgdmVyc2lvbkxhYmVsID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdrZXlzJywgJ3ZlcnNpb24nIH0KCXZlcnNpb25MYWJlbDpzZXRUZXh0KCJTU0cgIi4uKFZFUlNJT04gb3IgImRldiIpLi4iOyBTR1MgIi4uKHN0YXRlLnZlcnNpb24gb3IgIj8iKSkKCWxvY2FsIGhvc3RLZXkgPSBkb20geyAncm9vdCcsICdtYWluJywgJ2tleXMnLCAnaG9zdEtleScgfQoJaG9zdEtleTpzZXRUZXh0KGtleXMuZmluZ2VycHJpbnQoc3RhdGUuc2V0dGluZ3Mua2V5KSkKCWZvciBfLCBrZXlpbmZvIGluIGlwYWlycyhzdGF0ZS5rZXlyaW5nKSBkbwoJCWFkZEtleVRvS2V5bGlzdChrZXlpbmZvKQoJZW5kCglzZXRFbmVyZ3lUYXJnZXRUZXh0KHN0YXRlLnNldHRpbmdzLmVuZXJneVRhcmdldCkKCXNldEJ1dHRvbkNoZWNrYm94KGF1dG9JcmlzRWxlbWVudCwgc3RhdGUuc2V0dGluZ3MuYXV0b0lyaXMpCglzZXRCdXR0b25DaGVja2JveChlbmFibGVBdWRpdEVsZW1lbnQsIHN0YXRlLnNldHRpbmdzLmVuYWJsZUF1ZGl0KQoJdXBkYXRlSXJpcyhzdGF0ZS5zZXR0aW5ncy5pcmlzKQoJdXBkYXRlSXJpc0R1cmFiaWxpdHkoc3RhdGUuc2V0dGluZ3MuaXJpc0R1cmFiaWxpdHksIHN0YXRlLnNldHRpbmdzLmlyaXNNYXhEdXJhYmlsaXR5KQoJbG9jYWwgYWR2YW5jZWQgPSBzdGF0ZS5hZHZhbmNlZAoJaWYgYWR2YW5jZWQgdGhlbgoJCW5ldHdvcmtJZEVsZW1lbnQ6c2V0VGV4dCh0b3N0cmluZyhhZHZhbmNlZC5uZXR3b3JrLmlkKSkKCQlzZXRCdXR0b25DaGVja2JveChpc05ldFJlc3RyaWN0ZWRFbGVtZW50LCBhZHZhbmNlZC5uZXR3b3JrLmlzUmVzdHJpY3RlZCkKCQlsb2NhbCBmaWx0ZXIgPSBhZHZhbmNlZC5maWx0ZXIKCQlmb3IgXywgYWRkcmVzcyBpbiBpcGFpcnMoZmlsdGVyLmFsbG93bGlzdCkgZG8KCQkJYWRkRmlsdGVySXRlbShhbGxvd2xpc3RFbGVtZW50LCBhZGRyZXNzKQoJCWVuZAoJCWZvciBfLCBhZGRyZXNzIGluIGlwYWlycyhmaWx0ZXIuZGVueWxpc3QpIGRvCgkJCWFkZEZpbHRlckl0ZW0oZGVueWxpc3RFbGVtZW50LCBhZGRyZXNzKQoJCWVuZAoJCXVwZGF0ZUZpbHRlck1vZGVFbGVtZW50KGZpbHRlci5tb2RlKQoJZWxzZQoJCWRvbSB7ICdyb290JywgJ21haW4nLCAnc2V0dGluZ3MnLCAnYWR2YW5jZWQnIH06aGlkZSgpCgkJZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdzZWxlY3RvcicgfTpyZW1vdmVJdGVtKDUpCgllbmQKCWxvY2FsIHByb3RvY29scyA9IHN0YXRlLnByb3RvY29scwoJaWYgcHJvdG9jb2xzIHRoZW4KCQlhdXRvQ2xvc2VQcm9wZXJ0eTpzZXQocHJvdG9jb2xzLmF1dG9DbG9zZSkKCQlpcmlzUHJvdGVjdFByb3BlcnR5OnNldChwcm90b2NvbHMuaXJpc1Byb3RlY3QpCgkJc2V0QnV0dG9uQ2hlY2tib3gobm9LYXdvb3NoRWxlbWVudCwgcHJvdG9jb2xzLm5vS2F3b29zaCkKCQlkb20geyAncm9vdCcsICdtYWluJywgJ3Byb3RvY29scycsICd2MS4zJyB9OnNob3coKQoJCWxvY2FsIGRpYWwgPSBwcm90b2NvbHMuZGlhbAoJCWlmIGRpYWwgdGhlbgoJCQlzZXRCdXR0b25DaGVja2JveChwcmVmZXJNYW51YWxFbGVtZW50LCBkaWFsLnByZWZlck1hbnVhbCkKCQkJc2V0QnV0dG9uQ2hlY2tib3goYWR2YW5jZWREaWFsRWxlbWVudCwgZGlhbC5hZHZhbmNlZERpYWwpCgkJCWRvbSB7ICdyb290JywgJ21haW4nLCAncHJvdG9jb2xzJywgJ3YxLjUnIH06c2hvdygpCgkJZW5kCgllbmQKCWRvbSB7ICdyb290JywgJ21haW4nIH06c2hvdygpCglpbml0aWFsaXplZFByb3BlcnR5OnNldCh0cnVlKQplbmQpCgpsb2NhbCBmdW5jdGlvbiBmaW5kS2V5KGtleSkKCWZvciBpLCBpdGVtIGluIGlwYWlycyhrZXlzTGlzdDpnZXRBbGwoKSkgZG8KCQlpZiBpdGVtLmFyZ3NbMV0ua2V5ID09IGtleSB0aGVuCgkJCXJldHVybiBpLCBpdGVtCgkJZW5kCgllbmQKCXJldHVybiBuaWwKZW5kCgpsb2NhbCBmdW5jdGlvbiBhZGRyZXNzRXF1YWxzKGEsIGIpCglpZiAjYSB+PSAjYiB0aGVuCgkJcmV0dXJuIGZhbHNlCgllbmQKCWZvciBpPTEsICNhIGRvCgkJaWYgYVtpXSB+PSBiW2ldIHRoZW4KCQkJcmV0dXJuIGZhbHNlCgkJZW5kCgllbmQKCXJldHVybiB0cnVlCmVuZAoKcnBjLnN1YnNjcmliZV9uZXR3b3JrKG1vZGVtLCBTRUNVUklUWV9FVkVOVCwgZnVuY3Rpb24oZXZlbnQpCglsb2NhbCB0ID0gZXZlbnQudHlwZQoJaWYgdCA9PSAncmVnaXN0ZXInIHRoZW4KCQlsb2NhbCBrZXkgPSBldmVudC5rZXkKCQlsb2NhbCBpID0gZmluZEtleShrZXkpCgkJaWYgbm90IGkgdGhlbgoJCQlhZGRLZXlUb0tleWxpc3QoZXZlbnQsIGNvbG9ycy55ZWxsb3cpCgkJZW5kCgllbHNlaWYgdCA9PSAnYWxsb3cnIHRoZW4KCQlsb2NhbCBrZXkgPSBldmVudC5rZXkKCQlsb2NhbCBpID0gZmluZEtleShrZXkpCgkJaWYgaSB0aGVuCgkJCWtleXNMaXN0OnJlbW92ZUl0ZW0oaSkKCQllbmQKCQlhZGRLZXlUb0tleWxpc3QoZXZlbnQpCgllbHNlaWYgdCA9PSAnZGVueScgdGhlbgoJCWxvY2FsIGtleSA9IGV2ZW50LmtleQoJCWxvY2FsIGkgPSBmaW5kS2V5KGtleSkKCQlpZiBpIHRoZW4KCQkJa2V5c0xpc3Q6cmVtb3ZlSXRlbShpKQoJCWVuZAoJZWxzZWlmIHQgPT0gJ2ZpbHRlcicgdGhlbgoJCWxvY2FsIGFjdGlvbiA9IGV2ZW50LmFjdGlvbgoJCWxvY2FsIGxpc3RUeXBlID0gZXZlbnQubGlzdAoJCWxvY2FsIGxpc3QKCQlpZiBsaXN0VHlwZSA9PSAnYWxsb3cnIHRoZW4KCQkJbGlzdCA9IGFsbG93bGlzdEVsZW1lbnQKCQllbHNlaWYgbGlzdFR5cGUgPT0gJ2RlbnknIHRoZW4KCQkJbGlzdCA9IGRlbnlsaXN0RWxlbWVudAoJCWVsc2UKCQkJcmV0dXJuCgkJZW5kCgkJaWYgYWN0aW9uID09ICdhZGQnIHRoZW4KCQkJYWRkRmlsdGVySXRlbShsaXN0LCBldmVudC5hZGRyZXNzKQoJCWVsc2VpZiBhY3Rpb24gPT0gJ2RlbCcgdGhlbgoJCQlsb2NhbCBhZGRyZXNzID0gZXZlbnQuYWRkcmVzcwoJCQlmb3IgaSwgaXRlbSBpbiBpcGFpcnMobGlzdC5nZXRBbGwoKSkgZG8KCQkJCWlmIGFkZHJlc3NFcXVhbHMoaXRlbS5hcmdzWzFdLCBhZGRyZXNzKSB0aGVuCgkJCQkJbGlzdDpyZW1vdmVJdGVtKGkpCgkJCQkJYnJlYWsKCQkJCWVuZAoJCQllbmQKCQllbmQKCWVsc2VpZiB0ID09ICdzZXR0aW5nJyB0aGVuCgkJbG9jYWwgc2V0dGluZyA9IGV2ZW50LnNldHRpbmcKCQlsb2NhbCB2YWx1ZSA9IGV2ZW50LnZhbHVlCgkJaWYgc2V0dGluZyA9PSAnZmlsdGVyX21vZGUnIHRoZW4KCQkJdXBkYXRlRmlsdGVyTW9kZUVsZW1lbnQodmFsdWUpCgkJZWxzZWlmIHNldHRpbmcgPT0gJ2VuZXJneV90YXJnZXQnIHRoZW4KCQkJc2V0RW5lcmd5VGFyZ2V0VGV4dCh2YWx1ZSkKCQllbHNlaWYgc2V0dGluZyA9PSAnbmV0d29yaycgdGhlbgoJCQluZXR3b3JrSWRFbGVtZW50OnNldFRleHQodG9zdHJpbmcodmFsdWUpKQoJCWVsc2VpZiBzZXR0aW5nID09ICdpc19uZXR3b3JrX3Jlc3RyaWN0ZWQnIHRoZW4KCQkJc2V0QnV0dG9uQ2hlY2tib3goaXNOZXRSZXN0cmljdGVkRWxlbWVudCwgdmFsdWUpCgkJZWxzZWlmIHNldHRpbmcgPT0gJ2F1dG9faXJpcycgdGhlbgoJCQlzZXRCdXR0b25DaGVja2JveChhdXRvSXJpc0VsZW1lbnQsIHZhbHVlKQoJCWVsc2VpZiBzZXR0aW5nID09ICdhdXRvX2Nsb3NlJyB0aGVuCgkJCWF1dG9DbG9zZVByb3BlcnR5OnNldCh2YWx1ZSkKCQllbHNlaWYgc2V0dGluZyA9PSAnaXJpc19wcm90ZWN0JyB0aGVuCgkJCWlyaXNQcm90ZWN0UHJvcGVydHk6c2V0KHZhbHVlKQoJCWVsc2VpZiBzZXR0aW5nID09ICdub19rYXdvb3NoJyB0aGVuCgkJCXNldEJ1dHRvbkNoZWNrYm94KG5vS2F3b29zaEVsZW1lbnQsIHZhbHVlKQoJCWVsc2VpZiBzZXR0aW5nID09ICdwcmVmZXJfbWFudWFsJyB0aGVuCgkJCXNldEJ1dHRvbkNoZWNrYm94KHByZWZlck1hbnVhbEVsZW1lbnQsIHZhbHVlKQoJCWVsc2VpZiBzZXR0aW5nID09ICdhZHZhbmNlZF9kaWFsJyB0aGVuCgkJCXNldEJ1dHRvbkNoZWNrYm94KGFkdmFuY2VkRGlhbEVsZW1lbnQsIHZhbHVlKQoJCWVsc2VpZiBzZXR0aW5nID09ICdlbmFibGVfYXVkaXQnIHRoZW4KCQkJc2V0QnV0dG9uQ2hlY2tib3goZW5hYmxlQXVkaXRFbGVtZW50LCB2YWx1ZSkKCQllbHNlaWYgc2V0dGluZyA9PSAnaXJpcycgdGhlbgoJCQl1cGRhdGVJcmlzKHZhbHVlLmlyaXMpCgkJCXVwZGF0ZUlyaXNEdXJhYmlsaXR5KHZhbHVlLmR1cmFiaWxpdHkgb3IgMCwgdmFsdWUubWF4RHVyYWJpbGl0eSBvciAwKQoJCWVuZAoJZWxzZWlmIHQgPT0gJ2F1ZGl0JyB0aGVuCgkJaWYgYXVkaXRQYWdlTnVtYmVyUHJvcGVydHkudmFsdWUgPT0gMSB0aGVuCgkJCWxvY2FsIHJlY29yZCA9IHBvcHVsYXRlRXZlbnQoZXZlbnQucmVjb3JkKQoJCQlsb2NhbCBsaXN0ID0gZ2V0QXVkaXRMaXN0RWxlbWVudCgpCgkJCWxvY2FsIGl0ZW1zID0gbGlzdDpnZXRBbGwoKQoJCQlpdGVtc1sjaXRlbXNdID0gbmlsCgkJCWxpc3Q6Y2xlYXIoKQoJCQlsaXN0OmFkZEl0ZW0ocmVjb3JkLmRlc2NyaXB0aW9uLCBuaWwsIG5pbCwgcmVjb3JkLmV2ZW50KQoJCQlmb3IgXywgaXRlbSBpbiBpcGFpcnMoaXRlbXMpIGRvCgkJCQlsaXN0OmFkZEl0ZW0oaXRlbS50ZXh0LCBuaWwsIG5pbCwgaXRlbS5hcmdzWzFdKQoJCQllbmQKCQllbHNlCgkJCW5ld0F1ZGl0RXZlbnRzUHJvcGVydHk6c2V0KG5ld0F1ZGl0RXZlbnRzUHJvcGVydHkudmFsdWUgKyAxKQoJCWVuZAoJZW5kCmVuZCkKCmJhc2FsdC5hdXRvVXBkYXRlKCkKCmVuZCkK"
  67. return load(base64.decode(entrypoint), "@/"..shell.getRunningProgram(), 't', _ENV)(...)
  68. ]]):gsub("<$<", "[["):gsub(">$>", "]]")
  69. local entrypoint = base64.decode "cHJpbnQoIkluc3RhbGxpbmcgU1NHLi4uIikKCnByaW50KCJDaGVja2luZyBwZXJpcGhlcmFscy4uLiIpCmlmIG5vdCBwZXJpcGhlcmFsLmZpbmQoIm1vZGVtIiwgZnVuY3Rpb24oXywgbW9kZW0pIHJldHVybiBub3QgbW9kZW0uaXNXaXJlbGVzcygpIGVuZCkgdGhlbgoJcHJpbnQoIldpcmVkIG1vZGVtIG5vdCBmb3VuZCEiKQoJdHlwZVkoKQplbmQKcHJpbnQoIlBlcmlwaGVyYWxzIE9LIikKCnByaW50KCJVbnBhY2tpbmcgZmlsZXMuLi4iKQpzYXZlUHJvZ3JhbSgpCnByaW50KCJGaWxlcyB1bnBhY2tlZCEiKQoKcHJpbnQoIllvdXIgY29weSBvZiBTdGFyZ2F0ZSBTZWN1cml0eSBUZXJtaW5hbCBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkISIpCnByaW50KCJFeGVjdXRlIFwic3NnXCIgY29tbWFuZCBpbiBvcmRlciB0byBydW4gU3RhcmdhdGUgU2VjdXJpdHkgVGVybWluYWwuIikK"
  70. return load(entrypoint, "@[included]/installer.lua", 't', _ENV)(...)
  71.  
Comments
  • Ktlo
    1 year
    # text 0.08 KB | 0 0
    1. Latest Release of Stargate Security Terminal: https://github.com/Ktlo/pocket-stargate
Add Comment
Please, Sign In to add comment