mod= 10 **9 +7
#import resource
#resource.setrlimit(resource.RLIMIT_STACK, [0x100000000, resource.RLIM_INFINITY])
import threading
threading .stack_size ( 2 **28 )
import sys
sys .setrecursionlimit ( 10 **7 )
#fact=[1]
#for i in range(1,1000001):
# fact.append((fact[-1]*i)%mod)
#ifact=[0]*1000001
#ifact[1000000]=pow(fact[1000000],mod-2,mod)
#for i in range(1000000,0,-1):
# ifact[i-1]=(i*ifact[i])%mod
from sys import stdin, stdout
import bisect
from bisect import bisect_left as bl #c++ lowerbound bl(array,element)
from bisect import bisect_right as br #c++ upperbound
import itertools
import collections
import math
import heapq
from random import randint as rn
#from Queue import Queue as Q
def modinv( n, p) :
return pow ( n, p-2 , p)
def ncr( n, r, p) : #for using this uncomment the lines calculating fact and ifact
t= ( ( fact[ n] ) *( ( ifact[ r] *ifact[ n-r] ) %p) ) %p
return t
def ain( ) : #takes array as input
return list ( map ( int , sin( ) .split ( ) ) )
def sin( ) :
return input ( ) .strip ( )
def GCD( x, y) :
while ( y) :
x, y = y, x % y
return x
class node:
def __init__ ( self , s, l, p) :
self .child = { }
self .se = s
self .le = l
self .parent = p
self .val = 0
"""*******************************************************"""
def main( ) :
def sufarr( s) :
n= len ( s)
o= [ 0 ] *n
o[ 0 ] = n-1
f= [ 0 ] *26
f[ 0 ] = 1
for i in range ( n-1 ) :
f[ ord ( s[ i] ) -65 ] += 1
for i in range ( 1 , 26 ) :
f[ i] += f[ i-1 ]
for i in range ( n-2 , -1 , -1 ) :
f[ ord ( s[ i] ) -65 ] -= 1
o[ f[ ord ( s[ i] ) -65 ] ] = i
c= [ 0 ] *n
for i in range ( 1 , n) :
if ( s[ o[ i] ] == s[ o[ i-1 ] ] ) :
c[ o[ i] ] = c[ o[ i-1 ] ]
else :
c[ o[ i] ] = c[ o[ i-1 ] ] +1
l= 1
while ( l< n) :
f= [ 0 ] *n
for i in range ( n) :
f[ c[ i] ] += 1
for i in range ( 1 , n) :
f[ i] += f[ i-1 ]
od= [ 0 ] *n
for i in range ( n-1 , -1 , -1 ) :
pt= ( o[ i] -l) %n
f[ c[ pt] ] -= 1
od[ f[ c[ pt] ] ] = pt
cd = [ 0 ] *n
for i in range ( 1 , n) :
x1= c[ od[ i] ]
y1= c[ ( od[ i] +l) %n]
x2= c[ od[ i-1 ] ]
y2= c[ ( od[ i-1 ] +l) %n]
if ( x1== x2 and y1== y2) :
cd [ od[ i] ] = cd [ od[ i-1 ] ]
else :
cd [ od[ i] ] = cd [ od[ i-1 ] ] +1
o= od[ ::]
c= cd [ ::]
l*= 2
return o
def LCP( o) :
n= len ( o)
poso= [ 0 ] *n
for i in range ( n) :
poso[ o[ i] ] = i
lc= 0
lcp= [ 0 ] *( n-1 )
s= o[ 0 ]
for i in range ( n) :
oi= poso[ s]
if ( oi == n-1 ) :
lc= 0
s= ( s+1 ) %n
continue
ns= o[ oi+1 ]
lc= lcpcal( s, ns, lc-1 )
lcp[ oi] = lc
s= ( s+1 ) %n
return lcp
def lcpcal( i, j, k) :
l= max ( 0 , k)
while ( i+l < len ( st) ) and ( j+l < len ( st) ) :
if ( st[ i+l] == st[ j+l] ) :
l+= 1
else :
break
return l
def suftree( ) :
a= node( -1 , 0 , -1 )
b= node( o[ 0 ] , 1 , a)
a.child [ st[ o[ 0 ] ] ] = b
t= a
a= b
r= 1
for i in range ( 1 , n) :
x= lcp[ i-1 ]
y= o[ i]
while ( r> x) :
r-= a.le
a= a.parent
if ( r== x) :
b= node( y+x, n-( y+x) , a)
a.child [ st[ y+x] ] = b
a= b
else :
q= x-r
k= a.child [ st[ y+r] ]
w1= node( k.se , q, a)
w2= node( y+x, n-( x+y) , w1)
k.se = w1.se +q
k.le -= q
k.parent = w1
w1.child [ st[ k.se ] ] = k
w1.child [ st[ w2.se ] ] = w2
del a.child [ st[ y+r] ]
a.child [ st[ w1.se ] ] = w1
a= w2
r= n-y
return t
def dfs( x) :
if ( len ( x.child ) == 0 ) :
x.val = x.le -1
else :
x.val = x.le
for i in x.child :
x.val += dfs( x.child [ i] )
return x.val
st= list ( sin( ) )
st.append ( "$" )
x= int ( sin( ) )
q1= list ( map ( str , sin( ) .split ( ) ) )
q2= list ( map ( int , sin( ) .split ( ) ) )
n= len ( st)
o= sufarr( st)
lcp= LCP( o)
t= suftree( )
dfs( t)
f= [ ]
for i in range ( x) :
b= t
k= q2[ i]
s= q1[ i]
j= 0
t2= 0
while ( b.val > k and j< len ( s) ) :
if ( ( b.val -b.le +1 ) <= k) :
j+= b.val -k+1
break
else :
j+= b.le
if ( j>= len ( s) ) :
t2= 1
break
b= b.child [ s[ j] ]
if ( b.val <= k) :
j+= 1
break
if ( j<= len ( s) and t2== 0 ) :
print j,
else :
print "-1" ,
######## Python 2 and 3 footer by Pajenegod and c1729
py2 = round ( 0.5 )
if py2:
from future_builtins import ascii, filter , hex , map , oct , zip
range = xrange
import os , sys
from io import IOBase, BytesIO
BUFSIZE = 8192
class FastIO( BytesIO) :
newlines = 0
def __init__ ( self , file ) :
self ._file = file
self ._fd = file .fileno ( )
self .writable = "x" in file .mode or "w" in file .mode
self .write = super ( FastIO, self ) .write if self .writable else None
def _fill( self ) :
s = os .read ( self ._fd, max ( os .fstat ( self ._fd) .st_size , BUFSIZE) )
self .seek ( ( self .tell ( ) , self .seek ( 0 , 2 ) , super ( FastIO, self ) .write ( s) ) [ 0 ] )
return s
def read( self ) :
while self ._fill( ) : pass
return super ( FastIO, self ) .read ( )
def readline ( self ) :
while self .newlines == 0 :
s = self ._fill( ) ; self .newlines = s.count ( b"\n " ) + ( not s)
self .newlines -= 1
return super ( FastIO, self ) .readline ( )
def flush( self ) :
if self .writable :
os .write ( self ._fd, self .getvalue ( ) )
self .truncate ( 0 ) , self .seek ( 0 )
class IOWrapper( IOBase) :
def __init__ ( self , file ) :
self .buffer = FastIO( file )
self .flush = self .buffer .flush
self .writable = self .buffer .writable
if py2:
self .write = self .buffer .write
self .read = self .buffer .read
self .readline = self .buffer .readline
else :
self .write = lambda s:self .buffer .write ( s.encode ( 'ascii' ) )
self .read = lambda :self .buffer .read ( ) .decode ( 'ascii' )
self .readline = lambda :self .buffer .readline ( ) .decode ( 'ascii' )
sys .stdin , sys .stdout = IOWrapper( sys .stdin ) , IOWrapper( sys .stdout )
input = lambda : sys .stdin .readline ( ) .rstrip ( '\r \n ' )
#if __name__ == '__main__':
# main()
threading .Thread ( target= main) .start ( )
bW9kPTEwKio5KzcKI2ltcG9ydCByZXNvdXJjZQojcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSywgWzB4MTAwMDAwMDAwLCByZXNvdXJjZS5STElNX0lORklOSVRZXSkKaW1wb3J0IHRocmVhZGluZwp0aHJlYWRpbmcuc3RhY2tfc2l6ZSgyKioyOCkKaW1wb3J0IHN5cwpzeXMuc2V0cmVjdXJzaW9ubGltaXQoMTAqKjcpCiNmYWN0PVsxXQojZm9yIGkgaW4gcmFuZ2UoMSwxMDAwMDAxKToKIyAgICBmYWN0LmFwcGVuZCgoZmFjdFstMV0qaSklbW9kKQojaWZhY3Q9WzBdKjEwMDAwMDEKI2lmYWN0WzEwMDAwMDBdPXBvdyhmYWN0WzEwMDAwMDBdLG1vZC0yLG1vZCkKI2ZvciBpIGluIHJhbmdlKDEwMDAwMDAsMCwtMSk6CiMgICAgaWZhY3RbaS0xXT0oaSppZmFjdFtpXSklbW9kCmZyb20gc3lzIGltcG9ydCBzdGRpbiwgc3Rkb3V0CmltcG9ydCBiaXNlY3QKZnJvbSBiaXNlY3QgaW1wb3J0IGJpc2VjdF9sZWZ0IGFzIGJsICAgICAgICAgICAgICAjYysrIGxvd2VyYm91bmQgYmwoYXJyYXksZWxlbWVudCkKZnJvbSBiaXNlY3QgaW1wb3J0IGJpc2VjdF9yaWdodCBhcyBiciAgICAgICAgICAgICAjYysrIHVwcGVyYm91bmQKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IG1hdGgKaW1wb3J0IGhlYXBxCmZyb20gcmFuZG9tIGltcG9ydCByYW5kaW50IGFzIHJuCiNmcm9tIFF1ZXVlIGltcG9ydCBRdWV1ZSBhcyBRCmRlZiBtb2RpbnYobixwKToKICAgIHJldHVybiBwb3cobixwLTIscCkKZGVmIG5jcihuLHIscCk6ICAgICAgICAgICAgICAgICAgICAgICAgI2ZvciB1c2luZyB0aGlzIHVuY29tbWVudCB0aGUgbGluZXMgY2FsY3VsYXRpbmcgZmFjdCBhbmQgaWZhY3QKICAgIHQ9KChmYWN0W25dKSooKGlmYWN0W3JdKmlmYWN0W24tcl0pJXApKSVwCiAgICByZXR1cm4gdApkZWYgYWluKCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Rha2VzIGFycmF5IGFzIGlucHV0CiAgICByZXR1cm4gbGlzdChtYXAoaW50LHNpbigpLnNwbGl0KCkpKQpkZWYgc2luKCk6CiAgICByZXR1cm4gaW5wdXQoKS5zdHJpcCgpCmRlZiBHQ0QoeCx5KToKICAgIHdoaWxlKHkpOgogICAgICAgIHgsIHkgPSB5LCB4ICUgeQogICAgcmV0dXJuIHgKY2xhc3Mgbm9kZToKICAgIGRlZiBfX2luaXRfXyhzZWxmLHMsbCxwKToKICAgICAgICBzZWxmLmNoaWxkPXt9CiAgICAgICAgc2VsZi5zZT1zCiAgICAgICAgc2VsZi5sZT1sCiAgICAgICAgc2VsZi5wYXJlbnQ9cAogICAgICAgIHNlbGYudmFsPTAKIiIiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIiIgpkZWYgbWFpbigpOgogICAgZGVmIHN1ZmFycihzKToKICAgICAgICBuPWxlbihzKQogICAgICAgIG89WzBdKm4KICAgICAgICBvWzBdPW4tMQogICAgICAgIGY9WzBdKjI2CiAgICAgICAgZlswXT0xCiAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobi0xKToKICAgICAgICAgICAgZltvcmQoc1tpXSktNjVdKz0xCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwyNik6CiAgICAgICAgICAgIGZbaV0rPWZbaS0xXQogICAgICAgIGZvciBpIGluIHJhbmdlKG4tMiwtMSwtMSk6CiAgICAgICAgICAgIGZbb3JkKHNbaV0pLTY1XS09MQogICAgICAgICAgICBvW2Zbb3JkKHNbaV0pLTY1XV09aQogICAgICAgIGM9WzBdKm4KICAgICAgICBmb3IgaSBpbiByYW5nZSgxLG4pOgogICAgICAgICAgICBpZihzW29baV1dPT1zW29baS0xXV0pOgogICAgICAgICAgICAgICAgY1tvW2ldXT1jW29baS0xXV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNbb1tpXV09Y1tvW2ktMV1dKzEKICAgICAgICBsPTEKICAgICAgICB3aGlsZShsPG4pOgogICAgICAgICAgICBmPVswXSpuCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICAgICAgICAgZltjW2ldXSs9MQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLG4pOgogICAgICAgICAgICAgICAgZltpXSs9ZltpLTFdCiAgICAgICAgICAgIG9kPVswXSpuCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG4tMSwtMSwtMSk6CiAgICAgICAgICAgICAgICBwdD0ob1tpXS1sKSVuCiAgICAgICAgICAgICAgICBmW2NbcHRdXS09MQogICAgICAgICAgICAgICAgb2RbZltjW3B0XV1dPXB0CiAgICAgICAgICAgIGNkPVswXSpuCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsbik6CiAgICAgICAgICAgICAgICB4MT1jW29kW2ldXQogICAgICAgICAgICAgICAgeTE9Y1sob2RbaV0rbCklbl0KICAgICAgICAgICAgICAgIHgyPWNbb2RbaS0xXV0KICAgICAgICAgICAgICAgIHkyPWNbKG9kW2ktMV0rbCklbl0KICAgICAgICAgICAgICAgIGlmKHgxPT14MiBhbmQgeTE9PXkyKToKICAgICAgICAgICAgICAgICAgICBjZFtvZFtpXV09Y2Rbb2RbaS0xXV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY2Rbb2RbaV1dPWNkW29kW2ktMV1dKzEKICAgICAgICAgICAgbz1vZFs6Ol0KICAgICAgICAgICAgYz1jZFs6Ol0KICAgICAgICAgICAgbCo9MgogICAgICAgIHJldHVybiBvCiAgICBkZWYgTENQKG8pOgogICAgICAgIG49bGVuKG8pCiAgICAgICAgcG9zbz1bMF0qbgogICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICAgICBwb3NvW29baV1dPWkKICAgICAgICBsYz0wCiAgICAgICAgbGNwPVswXSoobi0xKQogICAgICAgIHM9b1swXQogICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICAgICBvaT1wb3NvW3NdCiAgICAgICAgICAgIGlmKG9pID09IG4tMSk6CiAgICAgICAgICAgICAgICBsYz0wCiAgICAgICAgICAgICAgICBzPShzKzEpJW4KICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIG5zPW9bb2krMV0KICAgICAgICAgICAgbGM9bGNwY2FsKHMsbnMsbGMtMSkKICAgICAgICAgICAgbGNwW29pXT1sYwogICAgICAgICAgICBzPShzKzEpJW4KICAgICAgICByZXR1cm4gbGNwCiAgICBkZWYgbGNwY2FsKGksaixrKToKICAgICAgICBsPW1heCgwLGspCiAgICAgICAgd2hpbGUgKGkrbCA8IGxlbihzdCkpIGFuZCAoaitsIDwgbGVuKHN0KSkgOgogICAgICAgICAgICBpZihzdFtpK2xdPT1zdFtqK2xdKToKICAgICAgICAgICAgICAgIGwrPTEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIGwKICAgIGRlZiBzdWZ0cmVlKCk6CiAgICAgICAgYT1ub2RlKC0xLDAsLTEpCiAgICAgICAgYj1ub2RlKG9bMF0sMSxhKQogICAgICAgIGEuY2hpbGRbc3Rbb1swXV1dPWIKICAgICAgICB0PWEKICAgICAgICBhPWIKICAgICAgICByPTEKICAgICAgICBmb3IgaSBpbiByYW5nZSgxLG4pOgogICAgICAgICAgICB4PWxjcFtpLTFdCiAgICAgICAgICAgIHk9b1tpXQogICAgICAgICAgICB3aGlsZShyPngpOgogICAgICAgICAgICAgICAgci09YS5sZQogICAgICAgICAgICAgICAgYT1hLnBhcmVudAogICAgICAgICAgICBpZihyPT14KToKICAgICAgICAgICAgICAgIGI9bm9kZSh5K3gsbi0oeSt4KSxhKQogICAgICAgICAgICAgICAgYS5jaGlsZFtzdFt5K3hdXT1iCiAgICAgICAgICAgICAgICBhPWIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHE9eC1yCiAgICAgICAgICAgICAgICBrPWEuY2hpbGRbc3RbeStyXV0KICAgICAgICAgICAgICAgIHcxPW5vZGUoay5zZSxxLGEpCiAgICAgICAgICAgICAgICB3Mj1ub2RlKHkreCxuLSh4K3kpLHcxKQogICAgICAgICAgICAgICAgay5zZT13MS5zZStxCiAgICAgICAgICAgICAgICBrLmxlLT1xCiAgICAgICAgICAgICAgICBrLnBhcmVudD13MQogICAgICAgICAgICAgICAgdzEuY2hpbGRbc3Rbay5zZV1dPWsKICAgICAgICAgICAgICAgIHcxLmNoaWxkW3N0W3cyLnNlXV09dzIKICAgICAgICAgICAgICAgIGRlbCBhLmNoaWxkW3N0W3krcl1dCiAgICAgICAgICAgICAgICBhLmNoaWxkW3N0W3cxLnNlXV09dzEKICAgICAgICAgICAgICAgIGE9dzIKICAgICAgICAgICAgcj1uLXkKICAgICAgICByZXR1cm4gdAogICAgZGVmIGRmcyh4KToKICAgICAgICBpZihsZW4oeC5jaGlsZCk9PTApOgogICAgICAgICAgICB4LnZhbD14LmxlLTEKICAgICAgICBlbHNlOgogICAgICAgICAgICB4LnZhbD14LmxlCiAgICAgICAgZm9yIGkgaW4geC5jaGlsZDoKICAgICAgICAgICAgeC52YWwrPWRmcyh4LmNoaWxkW2ldKQogICAgICAgIHJldHVybiB4LnZhbAogICAgc3Q9bGlzdChzaW4oKSkKICAgIHN0LmFwcGVuZCgiJCIpCiAgICB4PWludChzaW4oKSkKICAgIHExPWxpc3QobWFwKHN0cixzaW4oKS5zcGxpdCgpKSkKICAgIHEyPWxpc3QobWFwKGludCxzaW4oKS5zcGxpdCgpKSkKICAgIG49bGVuKHN0KQogICAgbz1zdWZhcnIoc3QpCiAgICBsY3A9TENQKG8pCiAgICB0PXN1ZnRyZWUoKQogICAgZGZzKHQpCiAgICBmPVtdCiAgICBmb3IgaSBpbiByYW5nZSh4KToKICAgICAgICBiPXQKICAgICAgICBrPXEyW2ldCiAgICAgICAgcz1xMVtpXQogICAgICAgIGo9MAogICAgICAgIHQyPTAKICAgICAgICB3aGlsZShiLnZhbD5rIGFuZCBqPGxlbihzKSk6CiAgICAgICAgICAgIGlmKChiLnZhbC1iLmxlKzEpPD1rKToKICAgICAgICAgICAgICAgIGorPWIudmFsLWsrMQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGorPWIubGUKICAgICAgICAgICAgaWYoaj49bGVuKHMpKToKICAgICAgICAgICAgICAgIHQyPTEKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGI9Yi5jaGlsZFtzW2pdXQogICAgICAgICAgICBpZihiLnZhbDw9ayk6CiAgICAgICAgICAgICAgICBqKz0xCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmKGo8PWxlbihzKSBhbmQgdDI9PTApOgogICAgICAgICAgICBwcmludCBqLAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50ICItMSIsCiMjIyMjIyMjIFB5dGhvbiAyIGFuZCAzIGZvb3RlciBieSBQYWplbmVnb2QgYW5kIGMxNzI5CnB5MiA9IHJvdW5kKDAuNSkKaWYgcHkyOgogICAgZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IGFzY2lpLCBmaWx0ZXIsIGhleCwgbWFwLCBvY3QsIHppcAogICAgcmFuZ2UgPSB4cmFuZ2UKCmltcG9ydCBvcywgc3lzCmZyb20gaW8gaW1wb3J0IElPQmFzZSwgQnl0ZXNJTwoKQlVGU0laRSA9IDgxOTIKY2xhc3MgRmFzdElPKEJ5dGVzSU8pOgogICAgbmV3bGluZXMgPSAwCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6CiAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKICAgICAgICBzZWxmLl9mZCA9IGZpbGUuZmlsZW5vKCkKICAgICAgICBzZWxmLndyaXRhYmxlID0gIngiIGluIGZpbGUubW9kZSBvciAidyIgaW4gZmlsZS5tb2RlCiAgICAgICAgc2VsZi53cml0ZSA9IHN1cGVyKEZhc3RJTywgc2VsZikud3JpdGUgaWYgc2VsZi53cml0YWJsZSBlbHNlIE5vbmUKCiAgICBkZWYgX2ZpbGwoc2VsZik6CiAgICAgICAgcyA9IG9zLnJlYWQoc2VsZi5fZmQsIG1heChvcy5mc3RhdChzZWxmLl9mZCkuc3Rfc2l6ZSwgQlVGU0laRSkpCiAgICAgICAgc2VsZi5zZWVrKChzZWxmLnRlbGwoKSwgc2VsZi5zZWVrKDAsMiksIHN1cGVyKEZhc3RJTywgc2VsZikud3JpdGUocykpWzBdKQogICAgICAgIHJldHVybiBzCiAgICBkZWYgcmVhZChzZWxmKToKICAgICAgICB3aGlsZSBzZWxmLl9maWxsKCk6IHBhc3MKICAgICAgICByZXR1cm4gc3VwZXIoRmFzdElPLHNlbGYpLnJlYWQoKQoKICAgIGRlZiByZWFkbGluZShzZWxmKToKICAgICAgICB3aGlsZSBzZWxmLm5ld2xpbmVzID09IDA6CiAgICAgICAgICAgIHMgPSBzZWxmLl9maWxsKCk7IHNlbGYubmV3bGluZXMgPSBzLmNvdW50KGIiXG4iKSArIChub3QgcykKICAgICAgICBzZWxmLm5ld2xpbmVzIC09IDEKICAgICAgICByZXR1cm4gc3VwZXIoRmFzdElPLCBzZWxmKS5yZWFkbGluZSgpCgogICAgZGVmIGZsdXNoKHNlbGYpOgogICAgICAgIGlmIHNlbGYud3JpdGFibGU6CiAgICAgICAgICAgIG9zLndyaXRlKHNlbGYuX2ZkLCBzZWxmLmdldHZhbHVlKCkpCiAgICAgICAgICAgIHNlbGYudHJ1bmNhdGUoMCksIHNlbGYuc2VlaygwKQoKY2xhc3MgSU9XcmFwcGVyKElPQmFzZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6CiAgICAgICAgc2VsZi5idWZmZXIgPSBGYXN0SU8oZmlsZSkKICAgICAgICBzZWxmLmZsdXNoID0gc2VsZi5idWZmZXIuZmx1c2gKICAgICAgICBzZWxmLndyaXRhYmxlID0gc2VsZi5idWZmZXIud3JpdGFibGUKICAgICAgICBpZiBweTI6CiAgICAgICAgICAgIHNlbGYud3JpdGUgPSBzZWxmLmJ1ZmZlci53cml0ZQogICAgICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLmJ1ZmZlci5yZWFkCiAgICAgICAgICAgIHNlbGYucmVhZGxpbmUgPSBzZWxmLmJ1ZmZlci5yZWFkbGluZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYud3JpdGUgPSBsYW1iZGEgczpzZWxmLmJ1ZmZlci53cml0ZShzLmVuY29kZSgnYXNjaWknKSkKICAgICAgICAgICAgc2VsZi5yZWFkID0gbGFtYmRhOnNlbGYuYnVmZmVyLnJlYWQoKS5kZWNvZGUoJ2FzY2lpJykKICAgICAgICAgICAgc2VsZi5yZWFkbGluZSA9IGxhbWJkYTpzZWxmLmJ1ZmZlci5yZWFkbGluZSgpLmRlY29kZSgnYXNjaWknKQoKc3lzLnN0ZGluLCBzeXMuc3Rkb3V0ID0gSU9XcmFwcGVyKHN5cy5zdGRpbiksIElPV3JhcHBlcihzeXMuc3Rkb3V0KQppbnB1dCA9IGxhbWJkYTogc3lzLnN0ZGluLnJlYWRsaW5lKCkucnN0cmlwKCdcclxuJykKCiNpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgojICAgbWFpbigpCnRocmVhZGluZy5UaHJlYWQodGFyZ2V0PW1haW4pLnN0YXJ0KCkK