/*===========================================================================*/
/* This supportpac is maintained by Jeff Lowrey */
/* Wayne M. Schutz is maintainer emeritus */
/* */
/* Chris Petty is the original author. */
/* */
/*(C)Copyright IBM Corporation 1995, 1997, 1998, 1999, 2000, */
/*(C)Copyright IBM Corporation 2002, 2003, 2004, 2005, 2006 */
/*(C)Copyright IBM Corporation 2007, 2008, 2009 */
/* */
/*===========================================================================*/
/* */
/* See the read.me file for change history */
/* */
/*===========================================================================*/
/* Module Name: CHANNEL.C */
/* DESCRIPTIVE NAME WebSphere MQ Save Queue Manager Object */
/* Definitions using PCFs (ms03 supportpac) */
/* */
/*===========================================================================*/
/* Include standard libraries */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Include MQSeries headers */
#include <cmqc.h>
#include <cmqcfc.h>
#include <cmqxc.h>
/* Include Application headers */
#include "saveqmgr.h"
#include "mqutils.h"
/* ------------------------------------------------------------------------ */
/* ProcessChannelStringParm() */
/* ProcessChannelIntegerParm() */
/* ProcessChannelIntegerListParm() */
/* ProcessChannelStringListParm() */
/* */
/* */
/* The ChlDefn structure contains entries for each of the attributes, */
/* only the attributes relevant for this channel type will be meaningful. */
/* When we later write the file we will ensure that, based on channel type, */
/* only the relevant fields are used. */
/* ------------------------------------------------------------------------ */
extern int noisy;
extern int chlReset;
extern int header;
extern int oneLine; /* v601 -- whether to write the entire DEFINE on oneline */
extern char lineTerm[3]; /* v601 -- line terminator */
extern int platform; /* v602 -- platform to generate MQSC for */
void ProcessChannelStringParm(MQCFST *pPCFString, ChlParms *ChlDefn,
MQLONG *iCC) {
/* Initialise return codes */
*iCC = MQCC_OK;
switch (pPCFString->Parameter) {
case MQCACH_CHANNEL_NAME:
memset(ChlDefn
->ChannelName
, ' ', MQ_CHANNEL_NAME_LENGTH
); memcpy(ChlDefn
->ChannelName
, pPCFString
->String
, pPCFString -> StringLength);
break;
case MQCACH_MODE_NAME:
memset(ChlDefn
->ModeName
, ' ', MQ_MODE_NAME_LENGTH
); memcpy(ChlDefn
->ModeName
, pPCFString
->String
, pPCFString
-> StringLength
); break;
case MQCACH_TP_NAME:
memset(ChlDefn
->TpName
, ' ', MQ_TP_NAME_LENGTH
); memcpy(ChlDefn
->TpName
, pPCFString
->String
, pPCFString
-> StringLength
); break;
case MQCA_Q_MGR_NAME:
memset(ChlDefn
->QMgrName
, ' ', MQ_Q_MGR_NAME_LENGTH
); memcpy(ChlDefn
->QMgrName
, pPCFString
->String
, pPCFString
-> StringLength
); break;
case MQCACH_XMIT_Q_NAME:
memset(ChlDefn
->XmitQName
, ' ', MQ_Q_NAME_LENGTH
); memcpy(ChlDefn
->XmitQName
, pPCFString
->String
, pPCFString -> StringLength);
break;
case MQCACH_CONNECTION_NAME:
memset(ChlDefn
->ConnectionName
, ' ', MQ_CONN_NAME_LENGTH
); memcpy(ChlDefn
->ConnectionName
, pPCFString
->String
, pPCFString -> StringLength);
break;
/* note that although we capture this attribute, it currently can only */
/* have a value of blanks, so we never bother to generate a keyword */
case MQCACH_MCA_NAME:
memset(ChlDefn
->MCAName
, ' ', MQ_MCA_NAME_LENGTH
); memcpy(ChlDefn
->MCAName
, pPCFString
->String
, pPCFString
-> StringLength
); break;
case MQCACH_DESC:
memset(ChlDefn
->ChannelDesc
, ' ', MQ_CHANNEL_DESC_LENGTH
); memcpy(ChlDefn
->ChannelDesc
, pPCFString
->String
, pPCFString -> StringLength);
break;
case MQCACH_SEC_EXIT_NAME:
memset(ChlDefn
->SecurityExit
, ' ', MQ_EXIT_NAME_LENGTH
); memcpy(ChlDefn
->SecurityExit
, pPCFString
->String
, pPCFString -> StringLength);
break;
case MQCACH_MSG_EXIT_NAME:
memset(ChlDefn
->MsgExit
, ' ', MQ_TOTAL_EXIT_NAME_LENGTH
); memcpy(ChlDefn
->MsgExit
, pPCFString
->String
, pPCFString
-> StringLength
); ChlDefn->MsgExitListFlag = 0;
break;
case MQCACH_SEND_EXIT_NAME:
memset(ChlDefn
->SendExit
, ' ', MQ_TOTAL_EXIT_NAME_LENGTH
); memcpy(ChlDefn
->SendExit
, pPCFString
->String
, pPCFString
-> StringLength
); ChlDefn->SendExitListFlag = 0;
break;
case MQCACH_RCV_EXIT_NAME:
memset(ChlDefn
->ReceiveExit
, ' ', MQ_TOTAL_EXIT_NAME_LENGTH
); memcpy(ChlDefn
->ReceiveExit
, pPCFString
->String
, pPCFString -> StringLength);
ChlDefn->ReceiveExitListFlag = 0;
break;
case MQCACH_SEC_EXIT_USER_DATA:
memset(ChlDefn
->SecurityUserData
, ' ', MQ_EXIT_DATA_LENGTH
); memcpy(ChlDefn
->SecurityUserData
, pPCFString
->String
, pPCFString -> StringLength);
break;
case MQCACH_MSG_EXIT_USER_DATA:
memset(ChlDefn
->MsgUserData
, ' ', MQ_TOTAL_EXIT_DATA_LENGTH
); memcpy(ChlDefn
->MsgUserData
, pPCFString
->String
, pPCFString -> StringLength);
ChlDefn->MsgUserDataListFlag = 0;
break;
case MQCACH_SEND_EXIT_USER_DATA:
memset(ChlDefn
->SendUserData
, ' ', MQ_TOTAL_EXIT_DATA_LENGTH
); memcpy(ChlDefn
->SendUserData
, pPCFString
->String
, pPCFString -> StringLength);
ChlDefn->SendUserDataListFlag = 0;
break;
case MQCACH_RCV_EXIT_USER_DATA:
memset(ChlDefn
->ReceiveUserData
, ' ', MQ_TOTAL_EXIT_DATA_LENGTH
); memcpy(ChlDefn
->ReceiveUserData
, pPCFString
->String
, pPCFString -> StringLength);
ChlDefn->ReceiveUserDataListFlag = 0;
break;
case MQCACH_MCA_USER_ID:
memset(ChlDefn
->MCAUserIdentifier
, ' ', XZMCAUSERLEN
); memcpy(ChlDefn
->MCAUserIdentifier
, pPCFString
->String
, pPCFString -> StringLength);
break;
case MQCACH_USER_ID:
memset(ChlDefn
->UserIdentifier
, ' ', MQ_USER_ID_LENGTH
); memcpy(ChlDefn
->UserIdentifier
, pPCFString
->String
, pPCFString -> StringLength);
break;
case MQCACH_PASSWORD:
memset(ChlDefn
->Password
, ' ', MQ_PASSWORD_LENGTH
); memcpy(ChlDefn
->Password
, pPCFString
->String
, pPCFString
-> StringLength
); break;
case MQCACH_MR_EXIT_NAME:
memset(ChlDefn
->MsgRetryExit
, ' ', MQ_EXIT_NAME_LENGTH
); memcpy(ChlDefn
->MsgRetryExit
, pPCFString
->String
, pPCFString -> StringLength);
ChlDefn->MsgRetryExitListFlag = 0;
break;
case MQCACH_MR_EXIT_USER_DATA:
memset(ChlDefn
->MsgRetryUserData
, ' ', MQ_EXIT_DATA_LENGTH
); memcpy(ChlDefn
->MsgRetryUserData
, pPCFString
->String
, pPCFString -> StringLength);
ChlDefn->MsgRetryUserDataListFlag = 0;
break;
#if defined (MQCA_CLUSTER_NAME)
case MQCA_CLUSTER_NAME:
memset(ChlDefn
->ClusterName
, ' ', MQ_CLUSTER_NAME_LENGTH
); memcpy(ChlDefn
->ClusterName
, pPCFString
->String
, pPCFString->StringLength);
break;
#endif
#if defined (MQCA_CLUSTER_NAMELIST)
case MQCA_CLUSTER_NAMELIST:
memset(ChlDefn
->ClusterNameList
, ' ', MQ_OBJECT_NAME_LENGTH
); memcpy(ChlDefn
->ClusterNameList
, pPCFString
->String
, pPCFString->StringLength);
break;
#endif
#if defined (MQCA_ALTERATION_DATE)
case MQCA_ALTERATION_DATE:
memset(ChlDefn
->AlterationDate
, ' ', MQ_CREATION_DATE_LENGTH
); memcpy(ChlDefn
->AlterationDate
, pPCFString
->String
, pPCFString->StringLength);
break;
case MQCA_ALTERATION_TIME:
memset(ChlDefn
->AlterationTime
, ' ', MQ_CREATION_TIME_LENGTH
); memcpy(ChlDefn
->AlterationTime
, pPCFString
->String
, pPCFString->StringLength);
break;
#endif
#if defined (MQ_LOCAL_ADDRESS_LENGTH)
case MQCACH_LOCAL_ADDRESS:
memset(ChlDefn
->LocalAddr
, ' ', MQ_LOCAL_ADDRESS_LENGTH
); memcpy(ChlDefn
->LocalAddr
, pPCFString
->String
, pPCFString
->StringLength
); break;
case MQCACH_SSL_CIPHER_SPEC:
memset(ChlDefn
->SslCipher
, ' ', MQ_SSL_CIPHER_SPEC_LENGTH
); memcpy(ChlDefn
->SslCipher
, pPCFString
->String
, pPCFString
->StringLength
); break;
case MQCACH_SSL_PEER_NAME:
memset(ChlDefn
->SslPeer
, ' ', MQ_SSL_PEER_NAME_LENGTH
); memcpy(ChlDefn
->SslPeer
, pPCFString
->String
, pPCFString
->StringLength
); break;
#endif
#if defined(zzzOS)
/* v602 zOS attributes */
case MQBACF_RESPONSE_ID: /* zOS things to ignore */
break;
case MQCACF_RESPONSE_Q_MGR_NAME: /* zOS things to ignore */
break;
#endif
default:
if (noisy)
fprintf(stderr
, "(channel.c) Unknown PCF String Parameter: %ld\n", pPCFString->Parameter);
*iCC = WARNING;
break;
} /* endswitch */
return;
}
/********************* [v512] process lists of exits and exit data ***************/
void ProcessChannelStringListParm(MQCFSL *pPCFString, ChlParms *ChlDefn,
MQLONG *iCC) {
/* Initialise return codes */
*iCC = MQCC_OK;
switch (pPCFString->Parameter) {
case MQCACH_MSG_EXIT_NAME:
makeStringFromList(ChlDefn->MsgExit, pPCFString->Strings,
pPCFString->StringLength, pPCFString->Count);
ChlDefn->MsgExitListFlag = 1;
break;
case MQCACH_SEND_EXIT_NAME:
makeStringFromList(ChlDefn->SendExit, pPCFString->Strings,
pPCFString -> StringLength, pPCFString->Count);
ChlDefn->SendExitListFlag = 1;
break;
case MQCACH_RCV_EXIT_NAME:
makeStringFromList(ChlDefn->ReceiveExit, pPCFString->Strings,
pPCFString -> StringLength, pPCFString->Count);
ChlDefn->ReceiveExitListFlag = 1;
break;
case MQCACH_MSG_EXIT_USER_DATA:
makeStringFromList(ChlDefn->MsgUserData, pPCFString->Strings,
pPCFString -> StringLength, pPCFString->Count);
ChlDefn->MsgUserDataListFlag = 1;
break;
case MQCACH_SEND_EXIT_USER_DATA:
makeStringFromList(ChlDefn->SendUserData, pPCFString->Strings,
pPCFString -> StringLength, pPCFString->Count);
ChlDefn->SendUserDataListFlag = 1;
break;
case MQCACH_RCV_EXIT_USER_DATA:
makeStringFromList(ChlDefn->ReceiveUserData, pPCFString->Strings,
pPCFString -> StringLength, pPCFString->Count);
ChlDefn->ReceiveUserDataListFlag = 1;
break;
case MQCACH_MR_EXIT_NAME:
makeStringFromList(ChlDefn->MsgRetryExit, pPCFString->Strings,
pPCFString -> StringLength, pPCFString->Count);
ChlDefn->MsgRetryExitListFlag = 1;
break;
case MQCACH_MR_EXIT_USER_DATA:
makeStringFromList(ChlDefn->MsgRetryUserData, pPCFString->Strings,
pPCFString -> StringLength, pPCFString->Count);
ChlDefn->MsgRetryUserDataListFlag = 1;
break;
default:
if (noisy)
"(channel.c) Unknown PCF String List Parameter: %ld\n",
pPCFString->Parameter);
*iCC = WARNING;
break;
} /* endswitch */
return;
}
void ProcessChannelIntegerParm(MQCFIN *pPCFInteger, ChlParms *ChlDefn,
MQLONG *iCC) {
/* Initialise return codes */
*iCC = MQCC_OK;
switch (pPCFInteger->Parameter) {
case MQIACH_CHANNEL_TYPE:
ChlDefn->ChannelType = pPCFInteger->Value;
break;
case MQIACH_XMIT_PROTOCOL_TYPE:
ChlDefn->TransportType = pPCFInteger->Value;
break;
case MQIACH_BATCH_SIZE:
ChlDefn->BatchSize = pPCFInteger->Value;
break;
case MQIACH_DISC_INTERVAL:
ChlDefn->DiscInterval = pPCFInteger->Value;
break;
case MQIACH_SHORT_RETRY:
ChlDefn->ShortRetryCount = pPCFInteger->Value;
break;
case MQIACH_SHORT_TIMER:
ChlDefn->ShortRetryInterval = pPCFInteger->Value;
break;
case MQIACH_LONG_RETRY:
ChlDefn->LongRetryCount = pPCFInteger->Value;
break;
case MQIACH_LONG_TIMER:
ChlDefn->LongRetryInterval = pPCFInteger->Value;
break;
case MQIACH_DATA_CONVERSION:
ChlDefn->DataConversion = pPCFInteger->Value;
break;
case MQIACH_PUT_AUTHORITY:
ChlDefn->PutAuthority = pPCFInteger->Value;
break;
case MQIACH_SEQUENCE_NUMBER_WRAP:
ChlDefn->SeqNumberWrap = pPCFInteger->Value;
break;
case MQIACH_MAX_MSG_LENGTH:
ChlDefn->MaxMsgLength = pPCFInteger->Value;
break;
case MQIACH_MCA_TYPE:
ChlDefn->MCAType = pPCFInteger->Value;
break;
case MQIACH_MR_COUNT:
ChlDefn->MsgRetryCount = pPCFInteger->Value;
break;
case MQIACH_MR_INTERVAL:
ChlDefn->MsgRetryInterval = pPCFInteger->Value;
break;
#if defined (MQIACH_BATCH_INTERVAL)
case MQIACH_BATCH_INTERVAL:
ChlDefn->BatchInterval = pPCFInteger->Value;
break;
#endif
#if defined (MQIACH_HB_INTERVAL)
case MQIACH_HB_INTERVAL:
ChlDefn->HeartbeatInterval = pPCFInteger->Value;
break;
#endif
#if defined (MQIACH_NPM_SPEED)
case MQIACH_NPM_SPEED:
ChlDefn->NonPersistentMsgSpeed = pPCFInteger->Value;
break;
#endif
#if defined (MQIACH_NETWORK_PRIORITY)
case MQIACH_NETWORK_PRIORITY:
ChlDefn->NetworkPriority = pPCFInteger->Value;
break;
#endif
#ifdef MQIACH_INHIBIT_AUTOSTART
case MQIACH_INHIBIT_AUTOSTART:
ChlDefn->InhibitAutostart = pPCFInteger->Value;
break;
#endif
#if defined (MQ_LOCAL_ADDRESS_LENGTH)
case MQIACH_BATCH_HB:
ChlDefn->BatchHB = pPCFInteger->Value;
break;
case MQIACH_SSL_CLIENT_AUTH:
ChlDefn->SslCAuth = pPCFInteger->Value;
break;
#if defined (MQIACH_KEEP_ALIVE_INTERVAL)
case MQIACH_KEEP_ALIVE_INTERVAL:
ChlDefn->KAInt = pPCFInteger->Value;
break;
#endif
#endif
#ifdef zzMQV60
case MQIA_MONITORING_CHANNEL:
ChlDefn->MonChl = pPCFInteger->Value;
break;
case MQIA_STATISTICS_CHANNEL:
ChlDefn->StatsChl = pPCFInteger->Value;
break;
case MQIACH_CLWL_CHANNEL_RANK:
ChlDefn->Rank = pPCFInteger->Value;
break;
case MQIACH_CLWL_CHANNEL_PRIORITY:
ChlDefn->Priority = pPCFInteger->Value;
break;
case MQIACH_CLWL_CHANNEL_WEIGHT:
ChlDefn->Weight = pPCFInteger->Value;
break;
#endif
#ifdef zzMQV70
case MQIA_PROPERTY_CONTROL:
ChlDefn->PropCntl = pPCFInteger->Value;
break;
case MQIACH_SHARING_CONVERSATIONS:
ChlDefn->ShareCnv = pPCFInteger->Value;
break;
case MQIACH_MAX_INSTANCES:
ChlDefn->MaxInsts = pPCFInteger->Value;
break;
case MQIACH_MAX_INSTS_PER_CLIENT:
ChlDefn->MaxInstsC = pPCFInteger->Value;
break;
case MQIACH_CONNECTION_AFFINITY:
ChlDefn->Affinity = pPCFInteger->Value;
break;
case MQIACH_DEF_CHANNEL_DISP:
ChlDefn->DefCDsp = pPCFInteger->Value;
break;
case MQIACH_CLIENT_CHANNEL_WEIGHT:
ChlDefn->ClntChlWght = pPCFInteger->Value;
break;
#endif
#if defined(zzzOS)
/* v602 zOS attributes */
case MQIA_QSG_DISP: /* zOS */
ChlDefn->qsgDisp = pPCFInteger->Value;
break;
#endif
default:
if (noisy)
fprintf(stderr
, "(channel.c) Unknown PCF Integer Parameter: %ld\n", pPCFInteger->Parameter);
*iCC = WARNING;
break;
} /* endswitch */
return;
}
void ProcessChannelIntegerListParm(MQCFIL *pPCFIntegerList, ChlParms *ChlDefn,
MQLONG *iCC) {
int i;
*iCC = MQCC_OK;
i=0;
switch (pPCFIntegerList->Parameter) {
#if defined (MQIACH_HDR_COMPRESSION)
case MQIACH_HDR_COMPRESSION:
for (i=0; i<COMP_ARRAY_SIZE; i++) {
ChlDefn->HdrComp[i] = MQCOMPRESS_NOT_AVAILABLE;
}
for (i=0; i<pPCFIntegerList->Count && i<COMP_ARRAY_SIZE; i++) {
ChlDefn->HdrComp[i] = pPCFIntegerList->Values[i];
}
break;
case MQIACH_MSG_COMPRESSION:
for (i=0; i<COMP_ARRAY_SIZE; i++) {
ChlDefn->MsgComp[i] = MQCOMPRESS_NOT_AVAILABLE;
}
for (i=0; i<pPCFIntegerList->Count && i<COMP_ARRAY_SIZE; i++) {
ChlDefn->MsgComp[i] = pPCFIntegerList->Values[i];
}
break;
#endif
default:
if (noisy)
"(channel.c) Unknown PCF Integer List Parameter: %ld\n",
pPCFIntegerList->Parameter);
*iCC = WARNING;
break;
} /* endswitch */
return;
}
/* ------------------------------------------------------------------------ */
/* */
/* This process takes the attributes of a single channel and adds */
/* them to the end of a file, SAVEQMGR.TST, which can be found in the */
/* current directory. */
/* */
/* The file is of a format suitable for subsequent input to RUNMQSC. */
/* */
/* ------------------------------------------------------------------------ */
void AddToFileCHANNEL(ChlParms *pChlDefn, int UserVersion, char * fileName, /* v32 Name of the output file */
FILE *fp, /* v51 file handle */
int twolines, /* v601 */
MQLONG *iCC) {
char * ParmBuffer; /* Temporary buffer to hold for output to file */
int options_exit; /* Option flag for MQsprintf_X (for chained exits) */
int options; /* Option flag for MQsprintf_X */
char work[256];
work[0]='\0';
/* Initialise return codes */
*iCC = MQCC_OK;
if ( !(ParmBuffer
= (char *) malloc(PBSIZE
) )) { fprintf(stderr
, "(channel.c) Failed to allocate %d bytes \n", PBSIZE
); }
/* Consul stuff */
char *con_pretext = NULL;//[]="<<consul_kv>>";
int mlen = PBSIZE;
if (!(con_pretext
= (char *)malloc(mlen
))) { fprintf(stderr
, "(mqutils.c) Error allocating %d bytes in MQsprintf\n", mlen);
}
memset(con_pretext
, '\0', mlen
); strcpy(con_pretext
,"<<consul_pretext>>/"); //MQsprintf_X(ParmBuffer, "CHANNEL/%s/", pAuthInfoDefn->AuthInfoName, MQ_AUTH_INFO_NAME_LENGTH, options);
//strcat(con_pretext, ParmBuffer);
//printf("\n##CONSULCHANNEL %sv",con_pretext);
/* end consul stuff */
/* v510 removes open from here ... fp = fopen( fileName, OPENMODE ); */
/* v601 setup options for oneLine operation */
options = MQSPRINTF_X_DOUBLE_QUOTES + MQSPRINTF_X_NO_TRAILING_BLANKS;
if (!oneLine)
options += MQSPRINTF_X_LINE_BREAKS;
/* ----------------------------------------------------------------- */
/* Add ChannelName and Type to file */
/* If unrecognised type then ignore this defintition, return warning */
/* ----------------------------------------------------------------- */
if (twolines)
switch (pChlDefn->ChannelType) {
case MQCHT_SENDER:
MQsprintf_X(ParmBuffer, "CHANNEL/SDR/%s/",
pChlDefn->ChannelName, MQ_CHANNEL_NAME_LENGTH, options);
break;
case MQCHT_SERVER:
MQsprintf_X(ParmBuffer, "DCHANNEL/SVR/%s/",
pChlDefn->ChannelName, MQ_CHANNEL_NAME_LENGTH, options);
break;
case MQCHT_RECEIVER:
MQsprintf_X(ParmBuffer, "CHANNEL/RCVR/%s/",
pChlDefn->ChannelName, MQ_CHANNEL_NAME_LENGTH, options);
break;
case MQCHT_REQUESTER:
MQsprintf_X(ParmBuffer, "CHANNEL/RQSTR/%s/",
pChlDefn->ChannelName, MQ_CHANNEL_NAME_LENGTH, options);
break;
case MQCHT_SVRCONN:
MQsprintf_X(ParmBuffer, "CHANNEL/SVRCONN/%s/",
pChlDefn->ChannelName, MQ_CHANNEL_NAME_LENGTH, options);
break;
case MQCHT_CLNTCONN:
MQsprintf_X(ParmBuffer, "CHANNEL/CLNTCONN/%s/",
pChlDefn->ChannelName, MQ_CHANNEL_NAME_LENGTH, options);
break;
/* [v51] start v51 attributes */
#if defined(MQCHT_CLUSRCVR)
case MQCHT_CLUSRCVR:
if (UserVersion>=MQCMDL_LEVEL_510) {
MQsprintf_X(ParmBuffer, "CHANNEL/CLUSRCVR/%s/",
pChlDefn->ChannelName, MQ_CHANNEL_NAME_LENGTH, options);
} else {
return; /* user doesn't want V51 stuff */
}/* End if*/
break;
#endif
#if defined(MQCHT_CLUSSDR)
case MQCHT_CLUSSDR:
if (UserVersion>=MQCMDL_LEVEL_510) {
MQsprintf_X(ParmBuffer, "CHANNEL/CLUSSDR/%s/",
pChlDefn->ChannelName, MQ_CHANNEL_NAME_LENGTH, options);
} else {
return; /* user doesn't want V51 stuff */
}/* End if*/
break;
#endif
/* [v51] end of V51 channel types */
default:
*iCC = WARNING;
if (noisy)
fprintf(stderr
, "(channel.c) Unknown channel type = %ld \n", pChlDefn->ChannelType);
} /* endswitch */
strcat(con_pretext
, ParmBuffer
); //fputs(ParmBuffer, fp);
#if defined (MQCA_ALTERATION_DATE)
if (header && (!oneLine || twolines)) {
MQsprintf_X(ParmBuffer, "* ALTDATE (%s) ", pChlDefn->AlterationDate,
MQ_CREATION_DATE_LENGTH, options);
//fputs(ParmBuffer, fp);
MQsprintf_X(ParmBuffer, "* ALTTIME (%s) ", pChlDefn->AlterationTime,
MQ_CREATION_TIME_LENGTH, options);
//fputs(ParmBuffer, fp);
}
#endif
switch (pChlDefn->TransportType) {
case MQXPT_LU62:
sprintf(ParmBuffer
, "TRPTYPE LU62"); if (pChlDefn->ChannelType != MQCHT_RECEIVER && pChlDefn->ChannelType
!= MQCHT_SVRCONN) {
MQsprintf_X(ParmBuffer, "MODENAME '%s'",
pChlDefn->ModeName, MQ_MODE_NAME_LENGTH, options);
MQsprintf_X(ParmBuffer, "TPNAME '%s'", pChlDefn->TpName,
MQ_TP_NAME_LENGTH, options);
}
break;
case MQXPT_TCP:
sprintf(ParmBuffer
, "TRPTYPE TCP"); break;
case MQXPT_NETBIOS:
sprintf(ParmBuffer
, "TRPTYPE NETBIOS"); break;
#if defined (MQXPT_SPX)
case MQXPT_SPX: /* [WMS] added for unix & dec */
sprintf(ParmBuffer
, "TRPTYPE SPX"); break;
#endif
#if defined (MQXPT_DECNET)
case MQXPT_DECNET:
sprintf(ParmBuffer
, "TRPTYPE DECNET"); break;
#endif
#if defined (MQXPT_UDP)
case MQXPT_UDP:
sprintf(ParmBuffer
, "TRPTYPE UPD"); break;
#endif
} /* endswitch */
/* ------------------------------------------------------------- */
/* [v51] Write out options in logical groups, based on cmd level */
/* requested by user and channel types. */
/* ------------------------------------------------------------- */
if (UserVersion>=MQCMDL_LEVEL_500 && (pChlDefn->ChannelType == MQCHT_SERVER
|| pChlDefn->ChannelType == MQCHT_SENDER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR
#endif
)) {
sprintf(ParmBuffer
, "BATCHINT %ld", pChlDefn
->BatchInterval
); if ( strcmp(ParmBuffer
,"BATCHINT 0") != 0){ }
/* [v530] Batchb for SDR, SVR, CLUSSDR and CLUSSVR */
#if defined (MQIACH_BATCH_HB)
if (UserVersion>=MQCMDL_LEVEL_530) {
sprintf(ParmBuffer
, "BATCHHB %ld", pChlDefn
->BatchHB
); if ( strcmp(ParmBuffer
,"BATCHHB 0") != 0){ }
}
#endif
}
if (pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_SERVER || pChlDefn->ChannelType == MQCHT_RECEIVER
|| pChlDefn->ChannelType == MQCHT_REQUESTER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR
#endif
) {
sprintf(ParmBuffer
, "BATCHSZ %ld", pChlDefn
->BatchSize
); if ( strcmp(ParmBuffer
,"BATCHSZ 50") != 0){ }
}
#if defined (MQCHT_CLUSSDR)
if (UserVersion>=MQCMDL_LEVEL_510 && (pChlDefn->ChannelType
== MQCHT_CLUSSDR || pChlDefn->ChannelType == MQCHT_CLUSRCVR
)) {
MQsprintf_X(ParmBuffer, "CLUSTER('%s')", pChlDefn->ClusterName,
MQ_CLUSTER_NAME_LENGTH, options);
MQsprintf_X(ParmBuffer, "CLUSNL('%s')",
pChlDefn->ClusterNameList, MQ_CLUSTER_NAME_LENGTH, options);
if ( strcmp(ParmBuffer
,"CLUSNL ' '") != 0){ }
}
#endif
if (pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_REQUESTER || pChlDefn->ChannelType == MQCHT_CLNTCONN
|| pChlDefn->ChannelType == MQCHT_SERVER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR
#endif
) {
MQsprintf_X(ParmBuffer, "CONNAME '%s'",
pChlDefn->ConnectionName, MQ_CONN_NAME_LENGTH, options);
/* [v530] Locladdr for SDR, SVR, RQSTR, CLNTCONN, CLUSSDR, CLUSRCVR */
#if defined (MQCACH_LOCAL_ADDRESS)
if (UserVersion>=MQCMDL_LEVEL_530) {
MQsprintf_X(ParmBuffer, "LOCLADDR '%s'",
pChlDefn->LocalAddr, MQ_LOCAL_ADDRESS_LENGTH, options);
if ( strcmp(ParmBuffer
,"LOCLADDR ' '") != 0){ }
}
#endif
}
if (pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_SERVER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR
#endif
) {
if (pChlDefn->DataConversion == MQCDC_NO_SENDER_CONVERSION)
else
sprintf(ParmBuffer
, "CONVERT YES");
}
MQsprintf_X(ParmBuffer, "DESCR '%s'", pChlDefn->ChannelDesc,
MQ_CHANNEL_DESC_LENGTH, options);
if ( strcmp(ParmBuffer
,"DESCR ' '") == 0){ fputs("DESCR 'generated from mq2consul utility'", fp
); }
else {
}
if (pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_SERVER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR
#endif
|| (pChlDefn->ChannelType == MQCHT_SVRCONN && platform == MQPL_MVS )) {
sprintf(ParmBuffer
, "DISCINT %ld", pChlDefn
->DiscInterval
); }
if (UserVersion>=MQCMDL_LEVEL_500) {
sprintf(ParmBuffer
, "HBINT %ld",pChlDefn
->HeartbeatInterval
); if ( strcmp(ParmBuffer
,"HBINT 300") == 0){ }
}
if (pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_SERVER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR
#endif
) {
sprintf(ParmBuffer
, "LONGRTY %ld", pChlDefn
->LongRetryCount
); if ( strcmp(ParmBuffer
,"LONGRTY 999999999") == 0){ }
sprintf(ParmBuffer
, "LONGTMR %ld",pChlDefn
->LongRetryInterval
); if ( strcmp(ParmBuffer
,"LONGTMR 1200") == 0){ }
sprintf(ParmBuffer
, "SHORTRTY %ld", pChlDefn
->ShortRetryCount
); if ( strcmp(ParmBuffer
,"SHORTRTY 10") == 0){ }
sprintf(ParmBuffer
, "SHORTTMR %ld",pChlDefn
->ShortRetryInterval
); if ( strcmp(ParmBuffer
,"SHORTTMR 60") == 0){ }
}
sprintf(ParmBuffer
, "MAXMSGL %ld", pChlDefn
->MaxMsgLength
); if ( strcmp(ParmBuffer
,"MAXMSGL 4194304") == 0){ }
/* Note: MCANAME can only be set to blanks, so we don't bother to */
/* write it to the output file . */
if (platform != MQPL_OS400 && platform != MQPL_MVS && ( /* not the 400 platform */
pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_SERVER || pChlDefn->ChannelType == MQCHT_REQUESTER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR
#endif
)) {
if (pChlDefn->MCAType == MQMCAT_PROCESS)
sprintf(ParmBuffer
, "MCATYPE PROCESS"); else
sprintf(ParmBuffer
, "MCATYPE THREAD");
}
if (pChlDefn->ChannelType != MQCHT_CLNTCONN) {
MQsprintf_X(ParmBuffer, "MCAUSER '%s'",
pChlDefn->MCAUserIdentifier, XZMCAUSERLEN, options);
if ( strcmp(ParmBuffer
,"MCAUSER ' '") == 0){ }
}
if (pChlDefn->ChannelType == MQCHT_RECEIVER || pChlDefn->ChannelType
== MQCHT_REQUESTER
#if defined (MQCHT_CLUSRCVR)
|| pChlDefn->ChannelType == MQCHT_CLUSRCVR
#endif
) {
/* [v530] Depending on whether we're dealing with a string */
/* or chained exits, pass the correct flags to MQsprintf_X */
options_exit = MQSPRINTF_X_NO_TRAILING_BLANKS;
if (!oneLine)
options_exit += MQSPRINTF_X_LINE_BREAKS;
if (!pChlDefn->MsgRetryUserDataListFlag) {
options_exit += MQSPRINTF_X_DOUBLE_QUOTES;
MQsprintf_X(ParmBuffer, "MRDATA '%s'",
pChlDefn->MsgRetryUserData, MQ_EXIT_DATA_LENGTH,
options_exit);
} else {
MQsprintf_X(ParmBuffer, "MRDATA %s",
pChlDefn->MsgRetryUserData, MQ_TOTAL_EXIT_DATA_LENGTH,
options_exit);
}
if ( strcmp(ParmBuffer
,"MRDATA ' '") == 0){ }
/* [v530] Depending on whether we're dealing with a string */
/* or chained exits, pass the correct flags to MQsprintf_X */
options_exit = MQSPRINTF_X_NO_TRAILING_BLANKS;
if (!oneLine)
options_exit += MQSPRINTF_X_LINE_BREAKS;
if (!pChlDefn->MsgRetryExitListFlag) {
options_exit += MQSPRINTF_X_DOUBLE_QUOTES;
MQsprintf_X(ParmBuffer, "MREXIT '%s'",
pChlDefn->MsgRetryExit, MQ_EXIT_NAME_LENGTH, options_exit);
} else {
MQsprintf_X(ParmBuffer, "MREXIT %s",
pChlDefn->MsgRetryExit, MQ_TOTAL_EXIT_NAME_LENGTH,
options_exit);
}
if ( strcmp(ParmBuffer
,"MREXIT ' '") == 0){ }
sprintf(ParmBuffer
, "MRRTY %ld", pChlDefn
->MsgRetryCount
); if ( strcmp(ParmBuffer
,"MREXIT ' '") == 0){ }
sprintf(ParmBuffer
, "MRTMR %ld", pChlDefn
->MsgRetryInterval
); if ( strcmp(ParmBuffer
,"MRTMR 1000") == 0){ }
}
if (pChlDefn->ChannelType != MQCHT_CLNTCONN && pChlDefn->ChannelType
!= MQCHT_SVRCONN) {
/* [v530] Depending on whether we're dealing with a string */
/* or chained exits, pass the correct flags to MQsprintf_X */
options_exit = MQSPRINTF_X_NO_TRAILING_BLANKS;
if (!oneLine)
options_exit += MQSPRINTF_X_LINE_BREAKS;
if (!pChlDefn->MsgUserDataListFlag) {
options_exit += MQSPRINTF_X_DOUBLE_QUOTES;
MQsprintf_X(ParmBuffer, "MSGDATA '%s'",
pChlDefn->MsgUserData, MQ_EXIT_DATA_LENGTH, options_exit);
} else {
MQsprintf_X(ParmBuffer, "MSGDATA %s",
pChlDefn->MsgUserData, MQ_TOTAL_EXIT_DATA_LENGTH,
options_exit);
}
if ( strcmp(ParmBuffer
,"MSGDATA ' '") == 0){ }
/* [v530] Depending on whether we're dealing with a /400 */
/* or chained exits, pass the correct flags to MQsprintf_X */
options_exit = 0;
if (!oneLine)
options_exit = MQSPRINTF_X_LINE_BREAKS;
/* if (MQAT_DEFAULT != MQAT_OS400) */
if (platform != MQPL_OS400)
options_exit += MQSPRINTF_X_NO_TRAILING_BLANKS;
if (!pChlDefn->MsgExitListFlag) {
options_exit += MQSPRINTF_X_DOUBLE_QUOTES;
MQsprintf_X(ParmBuffer, "MSGEXIT '%s'", pChlDefn->MsgExit,
MQ_EXIT_NAME_LENGTH, options_exit);
} else {
MQsprintf_X(ParmBuffer, "MSGEXIT %s", pChlDefn->MsgExit,
MQ_TOTAL_EXIT_NAME_LENGTH, options_exit);
}
if ( strcmp(ParmBuffer
,"MSGEXIT ' '") == 0){ }
}
#if defined (MQCHT_CLUSRCVR)
if (UserVersion>=MQCMDL_LEVEL_510 && (pChlDefn->ChannelType
== MQCHT_CLUSRCVR )) {
sprintf(ParmBuffer
, "NETPRTY %ld", pChlDefn
->NetworkPriority
); if ( strcmp(ParmBuffer
,"NETPRTY 0") == 0){ }
} /* end of channel = cluster */
#endif
if (UserVersion>=MQCMDL_LEVEL_500 && (pChlDefn->ChannelType == MQCHT_SENDER
|| pChlDefn->ChannelType == MQCHT_SERVER || pChlDefn->ChannelType
== MQCHT_RECEIVER || pChlDefn->ChannelType == MQCHT_REQUESTER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR
#endif
)) {
#if defined (MQNPMS_NORMAL)
if (pChlDefn->NonPersistentMsgSpeed == MQNPMS_NORMAL)
{
sprintf(ParmBuffer
, "NPMSPEED NORMAL"); }
else
sprintf(ParmBuffer
, "NPMSPEED FAST");
}
#endif
}
if (pChlDefn->ChannelType == MQCHT_RECEIVER || pChlDefn->ChannelType
== MQCHT_REQUESTER
/* doc says svrconn are okay for putaut ... doesn't make sense to me */
/* and also doesn't work !! */
/* || pChlDefn->ChannelType == MQCHT_SVRCONN */
#if defined (MQCHT_CLUSRCVR)
|| pChlDefn->ChannelType == MQCHT_CLUSRCVR
#endif
) {
switch (pChlDefn->PutAuthority) {
case MQPA_DEFAULT:
break;
case MQPA_CONTEXT:
break;
#if defined (MQPA_ONLY_MCA)
case MQPA_ONLY_MCA:
sprintf(ParmBuffer
, "PUTAUT ONLYMCA"); break;
#endif
#if defined (MQPA_ALTERNATE_OR_MCA)
case MQPA_ALTERNATE_OR_MCA:
sprintf(ParmBuffer
, "PUTAUT ALTMCA"); break;
#endif
default:
pChlDefn->PutAuthority);
break;
}/* End switch*/
if ( strcmp(ParmBuffer
,"PUTAUT DEF") == 0){ }
}
if (pChlDefn->ChannelType == MQCHT_CLNTCONN) {
MQsprintf_X(ParmBuffer, "QMNAME('%s')", pChlDefn->QMgrName,
MQ_Q_MGR_NAME_LENGTH, options);
if ( strcmp(ParmBuffer
,"QMNAME ' '") == 0){ }
}
/* [v530] Depending on whether we're dealing with a string */
/* or chained exits, pass the correct flags to MQsprintf_X */
options_exit = MQSPRINTF_X_NO_TRAILING_BLANKS;
if (!oneLine)
options_exit += MQSPRINTF_X_LINE_BREAKS;
if (!pChlDefn->ReceiveUserDataListFlag) {
options_exit += MQSPRINTF_X_DOUBLE_QUOTES;
MQsprintf_X(ParmBuffer, "RCVDATA '%s'",
pChlDefn->ReceiveUserData, MQ_EXIT_DATA_LENGTH, options_exit);
} else {
MQsprintf_X(ParmBuffer, "RCVDATA %s",
pChlDefn->ReceiveUserData, MQ_TOTAL_EXIT_DATA_LENGTH,
options_exit);
}
if ( strcmp(ParmBuffer
,"RCVDATA ' '") == 0){ }
/* [v530] Depending on whether we're dealing with a /400 */
/* or chained exits, pass the correct flags to MQsprintf_X */
options_exit = 0;
if (!oneLine)
options_exit = MQSPRINTF_X_LINE_BREAKS;
/* if (MQAT_DEFAULT != MQAT_OS400) */
if (platform != MQPL_OS400)
options_exit += MQSPRINTF_X_NO_TRAILING_BLANKS;
if (!pChlDefn->ReceiveExitListFlag) {
options_exit += MQSPRINTF_X_DOUBLE_QUOTES;
MQsprintf_X(ParmBuffer, "RCVEXIT '%s'", pChlDefn->ReceiveExit,
MQ_EXIT_NAME_LENGTH, options_exit);
} else {
MQsprintf_X(ParmBuffer, "RCVEXIT %s", pChlDefn->ReceiveExit,
MQ_TOTAL_EXIT_NAME_LENGTH, options_exit);
}
if ( strcmp(ParmBuffer
,"RCVEXIT ' '") == 0){ }
MQsprintf_X(ParmBuffer, "SCYDATA '%s'",
pChlDefn->SecurityUserData, MQ_EXIT_DATA_LENGTH, options);
if ( strcmp(ParmBuffer
,"SCYDATA ' '") == 0){ }
/* [v530] Depending on whether we're dealing with a /400 */
/* or chained exits, pass the correct flags to MQsprintf_X */
options_exit = MQSPRINTF_X_DOUBLE_QUOTES;
if (!oneLine)
options_exit += MQSPRINTF_X_LINE_BREAKS;
/* if (MQAT_DEFAULT != MQAT_OS400) */
if (platform != MQPL_OS400)
options_exit += MQSPRINTF_X_NO_TRAILING_BLANKS;
MQsprintf_X(ParmBuffer, "SCYEXIT '%s'", pChlDefn->SecurityExit,
MQ_EXIT_NAME_LENGTH, options_exit);
if ( strcmp(ParmBuffer
,"SCYEXIT ' '") == 0){ }
/* [v530] Depending on whether we're dealing with a string */
/* or chained exits, pass the correct flags to MQsprintf_X */
options_exit = MQSPRINTF_X_NO_TRAILING_BLANKS;
if (!oneLine)
options_exit += MQSPRINTF_X_LINE_BREAKS;
if (!pChlDefn->SendUserDataListFlag) {
options_exit += MQSPRINTF_X_DOUBLE_QUOTES;
MQsprintf_X(ParmBuffer, "SENDDATA '%s'",
pChlDefn->SendUserData, MQ_EXIT_DATA_LENGTH, options_exit);
} else {
MQsprintf_X(ParmBuffer, "SENDDATA %s", pChlDefn->SendUserData,
MQ_TOTAL_EXIT_DATA_LENGTH, options_exit);
}
if ( strcmp(ParmBuffer
,"SENDDATA ' '") == 0){ }
/* [v530] Depending on whether we're dealing with a /400 */
/* or chained exits, pass the correct flags to MQsprintf_X */
options_exit = 0;
if (!oneLine)
options_exit = MQSPRINTF_X_LINE_BREAKS;
/* if (MQAT_DEFAULT != MQAT_OS400) */
if (platform != MQPL_OS400)
options_exit += MQSPRINTF_X_NO_TRAILING_BLANKS;
if (!pChlDefn->SendExitListFlag) {
options_exit += MQSPRINTF_X_DOUBLE_QUOTES;
MQsprintf_X(ParmBuffer, "SENDEXIT '%s'", pChlDefn->SendExit,
MQ_EXIT_NAME_LENGTH, options_exit);
} else {
MQsprintf_X(ParmBuffer, "SENDEXIT %s", pChlDefn->SendExit,
MQ_TOTAL_EXIT_NAME_LENGTH, options_exit);
}
if ( strcmp(ParmBuffer
,"SENDEXIT ' '") == 0){ }
if (pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_SERVER || pChlDefn->ChannelType == MQCHT_RECEIVER
|| pChlDefn->ChannelType == MQCHT_REQUESTER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR
#endif
) {
sprintf(ParmBuffer
, "SEQWRAP %ld", pChlDefn
->SeqNumberWrap
); if ( strcmp(ParmBuffer
,"SEQWRAP 999999999") == 0){ }
}
/* if (MQAT_DEFAULT != MQAT_OS400 && ( */
if (platform != MQPL_OS400 && platform != MQPL_MVS
&& (pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_REQUESTER || pChlDefn->ChannelType
== MQCHT_CLNTCONN || pChlDefn->ChannelType == MQCHT_SERVER
#if defined (MQCHT_CLUSSDR)
|| pChlDefn->ChannelType == MQCHT_CLUSSDR
#endif
)) {
MQsprintf_X(ParmBuffer, "USERID '%s'",
pChlDefn->UserIdentifier, MQ_USER_ID_LENGTH, options);
if ( strcmp(ParmBuffer
,"USERID ' '") == 0){ }
}
if (pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_SERVER) {
MQsprintf_X(ParmBuffer, "XMITQ '%s'", pChlDefn->XmitQName,
MQ_Q_NAME_LENGTH, options);
}
/* [V520] Include Tandem NSK channel sttribute */
#ifdef MQIACH_INHIBIT_AUTOSTART
if ( pChlDefn->ChannelType == MQCHT_SERVER
|| pChlDefn->ChannelType == MQCHT_REQUESTER
|| pChlDefn->ChannelType == MQCHT_SVRCONN
|| pChlDefn->ChannelType == MQCHT_RECEIVER
) {
if ( pChlDefn->InhibitAutostart == MQCFC_AUTOSTART_ALLOWED) {
sprintf( ParmBuffer
, " AUTOSTART(ENABLED) %s" , lineTerm
); //fputs( ParmBuffer, fp );
} else {
sprintf( ParmBuffer
, " AUTOSTART(DISABLED) %s" , lineTerm
); //fputs( ParmBuffer, fp );
} /* endif */
}
#endif
/* [V530] Include SSL Client Auth Attribute for receiving type chls */
#ifdef MQIACH_SSL_CLIENT_AUTH
if (pChlDefn->ChannelType == MQCHT_SERVER || pChlDefn->ChannelType
== MQCHT_REQUESTER || pChlDefn->ChannelType == MQCHT_SVRCONN
|| pChlDefn->ChannelType == MQCHT_CLUSRCVR || pChlDefn->ChannelType
== MQCHT_RECEIVER) {
if (UserVersion >= MQCMDL_LEVEL_530) {
if (pChlDefn->SslCAuth) {
sprintf(ParmBuffer
, "SSLCAUTH OPTIONAL"); } else {
sprintf(ParmBuffer
, "SSLCAUTH REQUIRED"); } /* endif */
if ( strcmp(ParmBuffer
,"SSLCAUTH REQUIRED") == 0){ }
}
}
#endif
/* [v530] all channel types get SSLCIPH and SSLPEER */
#if defined (MQCACH_SSL_PEER_NAME)
if (UserVersion>=MQCMDL_LEVEL_530) {
MQsprintf_X(ParmBuffer, "SSLCIPH '%s'", pChlDefn->SslCipher,
MQ_SSL_CIPHER_SPEC_LENGTH, options);
if ( strcmp(ParmBuffer
,"SSLCIPH ' '") == 0){ }
MQsprintf_X(ParmBuffer, "SSLPEER '%s'", pChlDefn->SslPeer,
MQ_SSL_PEER_NAME_LENGTH, options);
if ( strcmp(ParmBuffer
,"SSLPEER ' '") == 0){ }
}
#endif
/* [v531b] csd01 on v5.3 adds KAINT to mqsc */
#if defined (MQIACH_KEEP_ALIVE_INTERVAL)
if (UserVersion>=MQCMDL_LEVEL_530) {
if (pChlDefn->KAInt != -999) { /* -999 means we never got it from mqsc */
if (pChlDefn->KAInt == -1) {
} else {
sprintf(ParmBuffer
, "KAINT %ld", pChlDefn
->KAInt
); }
if ( strcmp(ParmBuffer
,"KAINT AUTO") == 0){ }
pChlDefn -> KAInt = -999; /* special value to indicate not to set KAINT */
}
}
#endif
#ifdef zzMQV60
if (UserVersion >= MQCMDL_LEVEL_600 && (pChlDefn->ChannelType
== MQCHT_SENDER || pChlDefn->ChannelType == MQCHT_SERVER
|| pChlDefn->ChannelType == MQCHT_RECEIVER || pChlDefn->ChannelType
== MQCHT_REQUESTER || pChlDefn->ChannelType == MQCHT_SVRCONN
|| pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR )) {
toStrMQMON((char*)&work, pChlDefn->MonChl);
sprintf(ParmBuffer
, "MONCHL %s", work
); if ( strcmp(ParmBuffer
,"MONCHL QMGR") == 0){ }
}
if (UserVersion >= MQCMDL_LEVEL_600 && platform != MQPL_MVS
&& (pChlDefn->ChannelType == MQCHT_SENDER || pChlDefn->ChannelType
== MQCHT_SERVER || pChlDefn->ChannelType == MQCHT_RECEIVER
|| pChlDefn->ChannelType == MQCHT_REQUESTER
|| pChlDefn->ChannelType == MQCHT_CLUSSDR
|| pChlDefn->ChannelType == MQCHT_CLUSRCVR )) {
toStrMQMON((char*)&work, pChlDefn->StatsChl);
sprintf(ParmBuffer
, "STATCHL %s", work
); if ( strcmp(ParmBuffer
,"STATCHL QMGR") == 0){ }
}
if (UserVersion >= MQCMDL_LEVEL_600 && (pChlDefn->ChannelType
== MQCHT_CLUSSDR || pChlDefn->ChannelType == MQCHT_CLUSRCVR )) {
sprintf(ParmBuffer
, "CLWLPRTY %ld", pChlDefn
->Priority
); if ( strcmp(ParmBuffer
,"CLWLPRTY 0") == 0){ }
sprintf(ParmBuffer
, "CLWLRANK %ld", pChlDefn
->Rank
); if ( strcmp(ParmBuffer
,"CLWLRANK 0") == 0){ }
sprintf(ParmBuffer
, "CLWLWGHT %ld", pChlDefn
->Weight
); if ( strcmp(ParmBuffer
,"CLWLWGHT 50") == 0){ }
}
if (UserVersion >= MQCMDL_LEVEL_600) {
toStrMQComp((char*)work, pChlDefn->MsgComp);
sprintf(ParmBuffer
, "COMPMSG %s", work
); if ( strcmp(ParmBuffer
,"COMPMSG NONE") == 0){ }
toStrMQComp((char*)work, pChlDefn->HdrComp);
sprintf(ParmBuffer
, "COMPHDR %s", work
); if ( strcmp(ParmBuffer
,"COMPHDR NONE") == 0){ }
}
#endif
#ifdef zzMQV70
if ( UserVersion >= MQCMDL_LEVEL_700) {
if (pChlDefn->ChannelType == MQCHT_CLUSSDR || pChlDefn->ChannelType
== MQCHT_CLUSRCVR || pChlDefn->ChannelType == MQCHT_SENDER
|| pChlDefn->ChannelType == MQCHT_SERVER) {
switch (pChlDefn->PropCntl) {
case MQPROP_COMPATIBILITY:
sprintf(ParmBuffer
, "PROPCTL COMPAT"); //fputs(ParmBuffer, fp);
break;
case MQPROP_NONE:
sprintf(ParmBuffer
, "PROPCTL NONE"); break;
case MQPROP_ALL:
sprintf(ParmBuffer
, "PROPCTL ALL"); break;
}
}
if (pChlDefn->ChannelType == MQCHT_CLNTCONN || pChlDefn->ChannelType
== MQCHT_SVRCONN) {
sprintf(ParmBuffer
, "SHARECNV %ld", pChlDefn
->ShareCnv
); if ( strcmp(ParmBuffer
,"SHARECNV 10") == 0){ }
}
if (pChlDefn->ChannelType == MQCHT_SVRCONN) {
sprintf(ParmBuffer
, "MAXINST %ld", pChlDefn
->MaxInsts
); if ( strcmp(ParmBuffer
,"MAXINST 999999999") == 0){ }
sprintf(ParmBuffer
, "MAXINSTC %ld", pChlDefn
->MaxInstsC
); if ( strcmp(ParmBuffer
,"MAXINSTC 999999999") == 0){ }
}
if (pChlDefn->ChannelType == MQCHT_CLNTCONN) {
switch (pChlDefn->Affinity) {
case MQCAFTY_PREFERRED:
sprintf(ParmBuffer
, "AFFINITY PREFERRED"); //fputs(ParmBuffer, fp);
break;
case MQCAFTY_NONE:
sprintf(ParmBuffer
, "AFFINITY NONE"); break;
}
}
if (pChlDefn->ChannelType != MQCHT_CLNTCONN &&
pChlDefn->ChannelType != MQCHT_CLUSRCVR &&
pChlDefn->ChannelType != MQCHT_CLUSSDR ) {
switch (pChlDefn->DefCDsp) {
case MQCHLD_PRIVATE:
sprintf(ParmBuffer
, "DEFCDISP(PRIVATE"); //fputs(ParmBuffer, fp);
break;
case MQCHLD_FIXSHARED:
sprintf(ParmBuffer
, "DEFCDISP(FIXSHARED"); //fputs(ParmBuffer, fp);
break;
case MQCHLD_SHARED:
sprintf(ParmBuffer
, "DEFCDISP(SHARED"); //fputs(ParmBuffer, fp);
break;
}
}
if (pChlDefn->ChannelType == MQCHT_CLNTCONN) {
sprintf(ParmBuffer
, "CLNTWGHT %ld", pChlDefn
->ClntChlWght
); if ( strcmp(ParmBuffer
,"CLNTWGHT 0") == 0){ }
}
}
#endif
#if defined(zzzOS)
if (platform == MQPL_MVS) {
toStrQSG((char*)&work, pChlDefn->qsgDisp);
sprintf(ParmBuffer
, "QSGDISP(%s", work
); //fputs(ParmBuffer, fp);
}
#endif
//fputs(ParmBuffer, fp);
/* v512 -- if -R specified, then create "reset" commands */
/* v603 -- control different channel types via command line switch */
if ( ( (pChlDefn->ChannelType == MQCHT_SENDER) && (chlReset & CHLR_SENDER) )
|| ( (pChlDefn->ChannelType == MQCHT_SERVER) && (chlReset
& CHLR_SERVER ) ) || ( (pChlDefn->ChannelType
== MQCHT_RECEIVER) && (chlReset & CHLR_RECEIVER ) )
|| ( (pChlDefn->ChannelType == MQCHT_REQUESTER) && (chlReset
& CHLR_REQUESTER ) )
#if defined (MQCHT_CLUSSDR)
|| ( (pChlDefn->ChannelType == MQCHT_CLUSSDR) && (chlReset
& CHLR_CLUSSDR ) ) || ( (pChlDefn->ChannelType
== MQCHT_CLUSRCVR) && (chlReset & CHLR_CLUSRCVR ) )
#endif
) {
MQsprintf_X(ParmBuffer, "RESET CHANNEL ('%s') SEQNUM(1)\n",
pChlDefn->ChannelName, MQ_CHANNEL_NAME_LENGTH,
MQSPRINTF_X_NO_TRAILING_BLANKS);
//fputs(ParmBuffer, fp);
if (!oneLine)
}
return;
}
Lyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiAgICAgICAgICAgICAgVGhpcyBzdXBwb3J0cGFjIGlzIG1haW50YWluZWQgYnkgSmVmZiBMb3dyZXkJICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICBXYXluZSBNLiBTY2h1dHogaXMgbWFpbnRhaW5lciBlbWVyaXR1cwkJCSAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICBDaHJpcyBQZXR0eSBpcyB0aGUgb3JpZ2luYWwgYXV0aG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKihDKUNvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMTk5NSwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgICAgICAgICAgICAgICAgICovCi8qKEMpQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICAgICAgICAgICAgICAgICAgKi8KLyooQylDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDcsIDIwMDgsIDIwMDkgCQkJCQkJCSAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgU2VlIHRoZSByZWFkLm1lIGZpbGUgZm9yIGNoYW5nZSBoaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBNb2R1bGUgTmFtZTogQ0hBTk5FTC5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBERVNDUklQVElWRSBOQU1FIFdlYlNwaGVyZSBNUSBTYXZlIFF1ZXVlIE1hbmFnZXIgT2JqZWN0ICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICBEZWZpbml0aW9ucyB1c2luZyBQQ0ZzIChtczAzIHN1cHBvcnRwYWMpICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qIEluY2x1ZGUgc3RhbmRhcmQgbGlicmFyaWVzICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCi8qIEluY2x1ZGUgTVFTZXJpZXMgaGVhZGVycyAqLwojaW5jbHVkZSA8Y21xYy5oPgojaW5jbHVkZSA8Y21xY2ZjLmg+CiNpbmNsdWRlIDxjbXF4Yy5oPgoKLyogSW5jbHVkZSBBcHBsaWNhdGlvbiBoZWFkZXJzICovCiNpbmNsdWRlICJzYXZlcW1nci5oIgojaW5jbHVkZSAibXF1dGlscy5oIgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBQcm9jZXNzQ2hhbm5lbFN0cmluZ1Bhcm0oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogUHJvY2Vzc0NoYW5uZWxJbnRlZ2VyUGFybSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIFByb2Nlc3NDaGFubmVsSW50ZWdlckxpc3RQYXJtKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBQcm9jZXNzQ2hhbm5lbFN0cmluZ0xpc3RQYXJtKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBUaGUgQ2hsRGVmbiBzdHJ1Y3R1cmUgY29udGFpbnMgZW50cmllcyBmb3IgZWFjaCBvZiB0aGUgYXR0cmlidXRlcywgICAgICAgKi8KLyogb25seSB0aGUgYXR0cmlidXRlcyByZWxldmFudCBmb3IgdGhpcyBjaGFubmVsIHR5cGUgd2lsbCBiZSBtZWFuaW5nZnVsLiAgICovCi8qIFdoZW4gd2UgbGF0ZXIgd3JpdGUgdGhlIGZpbGUgd2Ugd2lsbCBlbnN1cmUgdGhhdCwgYmFzZWQgb24gY2hhbm5lbCB0eXBlLCAqLwovKiBvbmx5IHRoZSByZWxldmFudCBmaWVsZHMgYXJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmV4dGVybiBpbnQgbm9pc3k7CmV4dGVybiBpbnQgY2hsUmVzZXQ7CmV4dGVybiBpbnQgaGVhZGVyOwpleHRlcm4gaW50IG9uZUxpbmU7IC8qIHY2MDEgLS0gd2hldGhlciB0byB3cml0ZSB0aGUgZW50aXJlIERFRklORSBvbiBvbmVsaW5lICovCmV4dGVybiBjaGFyIGxpbmVUZXJtWzNdOyAvKiB2NjAxIC0tIGxpbmUgdGVybWluYXRvciAqLwpleHRlcm4gaW50IHBsYXRmb3JtOyAvKiB2NjAyIC0tIHBsYXRmb3JtIHRvIGdlbmVyYXRlIE1RU0MgZm9yICovCgp2b2lkIFByb2Nlc3NDaGFubmVsU3RyaW5nUGFybShNUUNGU1QgKnBQQ0ZTdHJpbmcsIENobFBhcm1zICpDaGxEZWZuLAoJCU1RTE9ORyAqaUNDKSB7CgkvKiBJbml0aWFsaXNlIHJldHVybiBjb2RlcyAqLwoJKmlDQyA9IE1RQ0NfT0s7CgoJc3dpdGNoIChwUENGU3RyaW5nLT5QYXJhbWV0ZXIpIHsKCWNhc2UgTVFDQUNIX0NIQU5ORUxfTkFNRToKCQltZW1zZXQoQ2hsRGVmbi0+Q2hhbm5lbE5hbWUsICcgJywgTVFfQ0hBTk5FTF9OQU1FX0xFTkdUSCk7CgkJbWVtY3B5KENobERlZm4tPkNoYW5uZWxOYW1lLCBwUENGU3RyaW5nLT5TdHJpbmcsCgkJCQlwUENGU3RyaW5nIC0+IFN0cmluZ0xlbmd0aCk7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9NT0RFX05BTUU6CgkJbWVtc2V0KENobERlZm4tPk1vZGVOYW1lLCAnICcsIE1RX01PREVfTkFNRV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5Nb2RlTmFtZSwgcFBDRlN0cmluZy0+U3RyaW5nLCBwUENGU3RyaW5nIC0+IFN0cmluZ0xlbmd0aCk7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9UUF9OQU1FOgoJCW1lbXNldChDaGxEZWZuLT5UcE5hbWUsICcgJywgTVFfVFBfTkFNRV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5UcE5hbWUsIHBQQ0ZTdHJpbmctPlN0cmluZywgcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgpOwoJCWJyZWFrOwoJY2FzZSBNUUNBX1FfTUdSX05BTUU6CgkJbWVtc2V0KENobERlZm4tPlFNZ3JOYW1lLCAnICcsIE1RX1FfTUdSX05BTUVfTEVOR1RIKTsKCQltZW1jcHkoQ2hsRGVmbi0+UU1nck5hbWUsIHBQQ0ZTdHJpbmctPlN0cmluZywgcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgpOwoJCWJyZWFrOwoJY2FzZSBNUUNBQ0hfWE1JVF9RX05BTUU6CgkJbWVtc2V0KENobERlZm4tPlhtaXRRTmFtZSwgJyAnLCBNUV9RX05BTUVfTEVOR1RIKTsKCQltZW1jcHkoQ2hsRGVmbi0+WG1pdFFOYW1lLCBwUENGU3RyaW5nLT5TdHJpbmcsCgkJCQlwUENGU3RyaW5nIC0+IFN0cmluZ0xlbmd0aCk7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9DT05ORUNUSU9OX05BTUU6CgkJbWVtc2V0KENobERlZm4tPkNvbm5lY3Rpb25OYW1lLCAnICcsIE1RX0NPTk5fTkFNRV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5Db25uZWN0aW9uTmFtZSwgcFBDRlN0cmluZy0+U3RyaW5nLAoJCQkJcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgpOwoJCWJyZWFrOwoJCS8qIG5vdGUgdGhhdCBhbHRob3VnaCB3ZSBjYXB0dXJlIHRoaXMgYXR0cmlidXRlLCBpdCBjdXJyZW50bHkgY2FuIG9ubHkgKi8KCQkvKiBoYXZlIGEgdmFsdWUgb2YgYmxhbmtzLCBzbyB3ZSBuZXZlciBib3RoZXIgdG8gZ2VuZXJhdGUgYSBrZXl3b3JkICovCgljYXNlIE1RQ0FDSF9NQ0FfTkFNRToKCQltZW1zZXQoQ2hsRGVmbi0+TUNBTmFtZSwgJyAnLCBNUV9NQ0FfTkFNRV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5NQ0FOYW1lLCBwUENGU3RyaW5nLT5TdHJpbmcsIHBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoKTsKCQlicmVhazsKCWNhc2UgTVFDQUNIX0RFU0M6CgkJbWVtc2V0KENobERlZm4tPkNoYW5uZWxEZXNjLCAnICcsIE1RX0NIQU5ORUxfREVTQ19MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5DaGFubmVsRGVzYywgcFBDRlN0cmluZy0+U3RyaW5nLAoJCQkJcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgpOwoJCWJyZWFrOwoJY2FzZSBNUUNBQ0hfU0VDX0VYSVRfTkFNRToKCQltZW1zZXQoQ2hsRGVmbi0+U2VjdXJpdHlFeGl0LCAnICcsIE1RX0VYSVRfTkFNRV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5TZWN1cml0eUV4aXQsIHBQQ0ZTdHJpbmctPlN0cmluZywKCQkJCXBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoKTsKCQlicmVhazsKCWNhc2UgTVFDQUNIX01TR19FWElUX05BTUU6CgkJbWVtc2V0KENobERlZm4tPk1zZ0V4aXQsICcgJywgTVFfVE9UQUxfRVhJVF9OQU1FX0xFTkdUSCk7CgkJbWVtY3B5KENobERlZm4tPk1zZ0V4aXQsIHBQQ0ZTdHJpbmctPlN0cmluZywgcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgpOwoJCUNobERlZm4tPk1zZ0V4aXRMaXN0RmxhZyA9IDA7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9TRU5EX0VYSVRfTkFNRToKCQltZW1zZXQoQ2hsRGVmbi0+U2VuZEV4aXQsICcgJywgTVFfVE9UQUxfRVhJVF9OQU1FX0xFTkdUSCk7CgkJbWVtY3B5KENobERlZm4tPlNlbmRFeGl0LCBwUENGU3RyaW5nLT5TdHJpbmcsIHBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoKTsKCQlDaGxEZWZuLT5TZW5kRXhpdExpc3RGbGFnID0gMDsKCQlicmVhazsKCWNhc2UgTVFDQUNIX1JDVl9FWElUX05BTUU6CgkJbWVtc2V0KENobERlZm4tPlJlY2VpdmVFeGl0LCAnICcsIE1RX1RPVEFMX0VYSVRfTkFNRV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5SZWNlaXZlRXhpdCwgcFBDRlN0cmluZy0+U3RyaW5nLAoJCQkJcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgpOwoJCUNobERlZm4tPlJlY2VpdmVFeGl0TGlzdEZsYWcgPSAwOwoJCWJyZWFrOwoJY2FzZSBNUUNBQ0hfU0VDX0VYSVRfVVNFUl9EQVRBOgoJCW1lbXNldChDaGxEZWZuLT5TZWN1cml0eVVzZXJEYXRhLCAnICcsIE1RX0VYSVRfREFUQV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5TZWN1cml0eVVzZXJEYXRhLCBwUENGU3RyaW5nLT5TdHJpbmcsCgkJCQlwUENGU3RyaW5nIC0+IFN0cmluZ0xlbmd0aCk7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9NU0dfRVhJVF9VU0VSX0RBVEE6CgkJbWVtc2V0KENobERlZm4tPk1zZ1VzZXJEYXRhLCAnICcsIE1RX1RPVEFMX0VYSVRfREFUQV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5Nc2dVc2VyRGF0YSwgcFBDRlN0cmluZy0+U3RyaW5nLAoJCQkJcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgpOwoJCUNobERlZm4tPk1zZ1VzZXJEYXRhTGlzdEZsYWcgPSAwOwoJCWJyZWFrOwoJY2FzZSBNUUNBQ0hfU0VORF9FWElUX1VTRVJfREFUQToKCQltZW1zZXQoQ2hsRGVmbi0+U2VuZFVzZXJEYXRhLCAnICcsIE1RX1RPVEFMX0VYSVRfREFUQV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5TZW5kVXNlckRhdGEsIHBQQ0ZTdHJpbmctPlN0cmluZywKCQkJCXBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoKTsKCQlDaGxEZWZuLT5TZW5kVXNlckRhdGFMaXN0RmxhZyA9IDA7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9SQ1ZfRVhJVF9VU0VSX0RBVEE6CgkJbWVtc2V0KENobERlZm4tPlJlY2VpdmVVc2VyRGF0YSwgJyAnLCBNUV9UT1RBTF9FWElUX0RBVEFfTEVOR1RIKTsKCQltZW1jcHkoQ2hsRGVmbi0+UmVjZWl2ZVVzZXJEYXRhLCBwUENGU3RyaW5nLT5TdHJpbmcsCgkJCQlwUENGU3RyaW5nIC0+IFN0cmluZ0xlbmd0aCk7CgkJQ2hsRGVmbi0+UmVjZWl2ZVVzZXJEYXRhTGlzdEZsYWcgPSAwOwoJCWJyZWFrOwoJY2FzZSBNUUNBQ0hfTUNBX1VTRVJfSUQ6CgkJbWVtc2V0KENobERlZm4tPk1DQVVzZXJJZGVudGlmaWVyLCAnICcsIFhaTUNBVVNFUkxFTik7CgkJbWVtY3B5KENobERlZm4tPk1DQVVzZXJJZGVudGlmaWVyLCBwUENGU3RyaW5nLT5TdHJpbmcsCgkJCQlwUENGU3RyaW5nIC0+IFN0cmluZ0xlbmd0aCk7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9VU0VSX0lEOgoJCW1lbXNldChDaGxEZWZuLT5Vc2VySWRlbnRpZmllciwgJyAnLCBNUV9VU0VSX0lEX0xFTkdUSCk7CgkJbWVtY3B5KENobERlZm4tPlVzZXJJZGVudGlmaWVyLCBwUENGU3RyaW5nLT5TdHJpbmcsCgkJCQlwUENGU3RyaW5nIC0+IFN0cmluZ0xlbmd0aCk7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9QQVNTV09SRDoKCQltZW1zZXQoQ2hsRGVmbi0+UGFzc3dvcmQsICcgJywgTVFfUEFTU1dPUkRfTEVOR1RIKTsKCQltZW1jcHkoQ2hsRGVmbi0+UGFzc3dvcmQsIHBQQ0ZTdHJpbmctPlN0cmluZywgcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgpOwoJCWJyZWFrOwoJY2FzZSBNUUNBQ0hfTVJfRVhJVF9OQU1FOgoKCQltZW1zZXQoQ2hsRGVmbi0+TXNnUmV0cnlFeGl0LCAnICcsIE1RX0VYSVRfTkFNRV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5Nc2dSZXRyeUV4aXQsIHBQQ0ZTdHJpbmctPlN0cmluZywKCQkJCXBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoKTsKCQlDaGxEZWZuLT5Nc2dSZXRyeUV4aXRMaXN0RmxhZyA9IDA7CgoJCWJyZWFrOwoJY2FzZSBNUUNBQ0hfTVJfRVhJVF9VU0VSX0RBVEE6CgkJbWVtc2V0KENobERlZm4tPk1zZ1JldHJ5VXNlckRhdGEsICcgJywgTVFfRVhJVF9EQVRBX0xFTkdUSCk7CgkJbWVtY3B5KENobERlZm4tPk1zZ1JldHJ5VXNlckRhdGEsIHBQQ0ZTdHJpbmctPlN0cmluZywKCQkJCXBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoKTsKCQlDaGxEZWZuLT5Nc2dSZXRyeVVzZXJEYXRhTGlzdEZsYWcgPSAwOwoJCWJyZWFrOwojaWYgZGVmaW5lZCAoTVFDQV9DTFVTVEVSX05BTUUpCgljYXNlIE1RQ0FfQ0xVU1RFUl9OQU1FOgoJCW1lbXNldChDaGxEZWZuLT5DbHVzdGVyTmFtZSwgJyAnLCBNUV9DTFVTVEVSX05BTUVfTEVOR1RIKTsKCQltZW1jcHkoQ2hsRGVmbi0+Q2x1c3Rlck5hbWUsIHBQQ0ZTdHJpbmctPlN0cmluZywKCQkJCXBQQ0ZTdHJpbmctPlN0cmluZ0xlbmd0aCk7CgkJYnJlYWs7CiNlbmRpZgojaWYgZGVmaW5lZCAoTVFDQV9DTFVTVEVSX05BTUVMSVNUKQoJY2FzZSBNUUNBX0NMVVNURVJfTkFNRUxJU1Q6CgkJbWVtc2V0KENobERlZm4tPkNsdXN0ZXJOYW1lTGlzdCwgJyAnLCBNUV9PQkpFQ1RfTkFNRV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5DbHVzdGVyTmFtZUxpc3QsIHBQQ0ZTdHJpbmctPlN0cmluZywKCQkJCXBQQ0ZTdHJpbmctPlN0cmluZ0xlbmd0aCk7CgkJYnJlYWs7CiNlbmRpZgojaWYgZGVmaW5lZCAoTVFDQV9BTFRFUkFUSU9OX0RBVEUpCgljYXNlIE1RQ0FfQUxURVJBVElPTl9EQVRFOgoJCW1lbXNldChDaGxEZWZuLT5BbHRlcmF0aW9uRGF0ZSwgJyAnLCBNUV9DUkVBVElPTl9EQVRFX0xFTkdUSCk7CgkJbWVtY3B5KENobERlZm4tPkFsdGVyYXRpb25EYXRlLCBwUENGU3RyaW5nLT5TdHJpbmcsCgkJCQlwUENGU3RyaW5nLT5TdHJpbmdMZW5ndGgpOwoJCWJyZWFrOwoJY2FzZSBNUUNBX0FMVEVSQVRJT05fVElNRToKCQltZW1zZXQoQ2hsRGVmbi0+QWx0ZXJhdGlvblRpbWUsICcgJywgTVFfQ1JFQVRJT05fVElNRV9MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5BbHRlcmF0aW9uVGltZSwgcFBDRlN0cmluZy0+U3RyaW5nLAoJCQkJcFBDRlN0cmluZy0+U3RyaW5nTGVuZ3RoKTsKCQlicmVhazsKI2VuZGlmCiNpZiBkZWZpbmVkIChNUV9MT0NBTF9BRERSRVNTX0xFTkdUSCkKCgljYXNlIE1RQ0FDSF9MT0NBTF9BRERSRVNTOgoJCW1lbXNldChDaGxEZWZuLT5Mb2NhbEFkZHIsICcgJywgTVFfTE9DQUxfQUREUkVTU19MRU5HVEgpOwoJCW1lbWNweShDaGxEZWZuLT5Mb2NhbEFkZHIsIHBQQ0ZTdHJpbmctPlN0cmluZywgcFBDRlN0cmluZy0+U3RyaW5nTGVuZ3RoKTsKCQlicmVhazsKCgljYXNlIE1RQ0FDSF9TU0xfQ0lQSEVSX1NQRUM6CgkJbWVtc2V0KENobERlZm4tPlNzbENpcGhlciwgJyAnLCBNUV9TU0xfQ0lQSEVSX1NQRUNfTEVOR1RIKTsKCQltZW1jcHkoQ2hsRGVmbi0+U3NsQ2lwaGVyLCBwUENGU3RyaW5nLT5TdHJpbmcsIHBQQ0ZTdHJpbmctPlN0cmluZ0xlbmd0aCk7CgkJYnJlYWs7CgoJY2FzZSBNUUNBQ0hfU1NMX1BFRVJfTkFNRToKCQltZW1zZXQoQ2hsRGVmbi0+U3NsUGVlciwgJyAnLCBNUV9TU0xfUEVFUl9OQU1FX0xFTkdUSCk7CgkJbWVtY3B5KENobERlZm4tPlNzbFBlZXIsIHBQQ0ZTdHJpbmctPlN0cmluZywgcFBDRlN0cmluZy0+U3RyaW5nTGVuZ3RoKTsKCQlicmVhazsKCiNlbmRpZgoKI2lmIGRlZmluZWQoenp6T1MpCgkJLyogdjYwMiB6T1MgYXR0cmlidXRlcyAqLwoJY2FzZSBNUUJBQ0ZfUkVTUE9OU0VfSUQ6IC8qIHpPUyB0aGluZ3MgdG8gaWdub3JlICovCgkJYnJlYWs7CgljYXNlIE1RQ0FDRl9SRVNQT05TRV9RX01HUl9OQU1FOiAvKiB6T1MgdGhpbmdzIHRvIGlnbm9yZSAqLwoJCWJyZWFrOwojZW5kaWYKCglkZWZhdWx0OgoJCWlmIChub2lzeSkKCQkJZnByaW50ZihzdGRlcnIsICIoY2hhbm5lbC5jKSBVbmtub3duIFBDRiBTdHJpbmcgUGFyYW1ldGVyOiAlbGRcbiIsCgkJCQkJcFBDRlN0cmluZy0+UGFyYW1ldGVyKTsKCQkqaUNDID0gV0FSTklORzsKCQlicmVhazsKCX0gLyogZW5kc3dpdGNoICovCgoJcmV0dXJuOwp9CgovKioqKioqKioqKioqKioqKioqKioqIFt2NTEyXSBwcm9jZXNzIGxpc3RzIG9mIGV4aXRzIGFuZCBleGl0IGRhdGEgKioqKioqKioqKioqKioqLwp2b2lkIFByb2Nlc3NDaGFubmVsU3RyaW5nTGlzdFBhcm0oTVFDRlNMICpwUENGU3RyaW5nLCBDaGxQYXJtcyAqQ2hsRGVmbiwKCQlNUUxPTkcgKmlDQykgewoJLyogSW5pdGlhbGlzZSByZXR1cm4gY29kZXMgKi8KCSppQ0MgPSBNUUNDX09LOwoKCXN3aXRjaCAocFBDRlN0cmluZy0+UGFyYW1ldGVyKSB7CgljYXNlIE1RQ0FDSF9NU0dfRVhJVF9OQU1FOgoJCW1ha2VTdHJpbmdGcm9tTGlzdChDaGxEZWZuLT5Nc2dFeGl0LCBwUENGU3RyaW5nLT5TdHJpbmdzLAoJCQkJcFBDRlN0cmluZy0+U3RyaW5nTGVuZ3RoLCBwUENGU3RyaW5nLT5Db3VudCk7CgkJQ2hsRGVmbi0+TXNnRXhpdExpc3RGbGFnID0gMTsKCQlicmVhazsKCWNhc2UgTVFDQUNIX1NFTkRfRVhJVF9OQU1FOgoJCW1ha2VTdHJpbmdGcm9tTGlzdChDaGxEZWZuLT5TZW5kRXhpdCwgcFBDRlN0cmluZy0+U3RyaW5ncywKCQkJCXBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoLCBwUENGU3RyaW5nLT5Db3VudCk7CgkJQ2hsRGVmbi0+U2VuZEV4aXRMaXN0RmxhZyA9IDE7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9SQ1ZfRVhJVF9OQU1FOgoJCW1ha2VTdHJpbmdGcm9tTGlzdChDaGxEZWZuLT5SZWNlaXZlRXhpdCwgcFBDRlN0cmluZy0+U3RyaW5ncywKCQkJCXBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoLCBwUENGU3RyaW5nLT5Db3VudCk7CgkJQ2hsRGVmbi0+UmVjZWl2ZUV4aXRMaXN0RmxhZyA9IDE7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9NU0dfRVhJVF9VU0VSX0RBVEE6CgkJbWFrZVN0cmluZ0Zyb21MaXN0KENobERlZm4tPk1zZ1VzZXJEYXRhLCBwUENGU3RyaW5nLT5TdHJpbmdzLAoJCQkJcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgsIHBQQ0ZTdHJpbmctPkNvdW50KTsKCQlDaGxEZWZuLT5Nc2dVc2VyRGF0YUxpc3RGbGFnID0gMTsKCQlicmVhazsKCWNhc2UgTVFDQUNIX1NFTkRfRVhJVF9VU0VSX0RBVEE6CgkJbWFrZVN0cmluZ0Zyb21MaXN0KENobERlZm4tPlNlbmRVc2VyRGF0YSwgcFBDRlN0cmluZy0+U3RyaW5ncywKCQkJCXBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoLCBwUENGU3RyaW5nLT5Db3VudCk7CgkJQ2hsRGVmbi0+U2VuZFVzZXJEYXRhTGlzdEZsYWcgPSAxOwoJCWJyZWFrOwoJY2FzZSBNUUNBQ0hfUkNWX0VYSVRfVVNFUl9EQVRBOgoJCW1ha2VTdHJpbmdGcm9tTGlzdChDaGxEZWZuLT5SZWNlaXZlVXNlckRhdGEsIHBQQ0ZTdHJpbmctPlN0cmluZ3MsCgkJCQlwUENGU3RyaW5nIC0+IFN0cmluZ0xlbmd0aCwgcFBDRlN0cmluZy0+Q291bnQpOwoJCUNobERlZm4tPlJlY2VpdmVVc2VyRGF0YUxpc3RGbGFnID0gMTsKCQlicmVhazsKCWNhc2UgTVFDQUNIX01SX0VYSVRfTkFNRToKCQltYWtlU3RyaW5nRnJvbUxpc3QoQ2hsRGVmbi0+TXNnUmV0cnlFeGl0LCBwUENGU3RyaW5nLT5TdHJpbmdzLAoJCQkJcFBDRlN0cmluZyAtPiBTdHJpbmdMZW5ndGgsIHBQQ0ZTdHJpbmctPkNvdW50KTsKCQlDaGxEZWZuLT5Nc2dSZXRyeUV4aXRMaXN0RmxhZyA9IDE7CgkJYnJlYWs7CgljYXNlIE1RQ0FDSF9NUl9FWElUX1VTRVJfREFUQToKCQltYWtlU3RyaW5nRnJvbUxpc3QoQ2hsRGVmbi0+TXNnUmV0cnlVc2VyRGF0YSwgcFBDRlN0cmluZy0+U3RyaW5ncywKCQkJCXBQQ0ZTdHJpbmcgLT4gU3RyaW5nTGVuZ3RoLCBwUENGU3RyaW5nLT5Db3VudCk7CgkJQ2hsRGVmbi0+TXNnUmV0cnlVc2VyRGF0YUxpc3RGbGFnID0gMTsKCQlicmVhazsKCglkZWZhdWx0OgoKCQlpZiAobm9pc3kpCgkJCWZwcmludGYoc3RkZXJyLAoJCQkJCSIoY2hhbm5lbC5jKSBVbmtub3duIFBDRiBTdHJpbmcgTGlzdCBQYXJhbWV0ZXI6ICVsZFxuIiwKCQkJCQlwUENGU3RyaW5nLT5QYXJhbWV0ZXIpOwoJCSppQ0MgPSBXQVJOSU5HOwoJCWJyZWFrOwoKCX0gLyogZW5kc3dpdGNoICovCgoJcmV0dXJuOwp9Cgp2b2lkIFByb2Nlc3NDaGFubmVsSW50ZWdlclBhcm0oTVFDRklOICpwUENGSW50ZWdlciwgQ2hsUGFybXMgKkNobERlZm4sCgkJTVFMT05HICppQ0MpIHsKCS8qIEluaXRpYWxpc2UgIHJldHVybiBjb2RlcyAqLwoJKmlDQyA9IE1RQ0NfT0s7CgoJc3dpdGNoIChwUENGSW50ZWdlci0+UGFyYW1ldGVyKSB7CgljYXNlIE1RSUFDSF9DSEFOTkVMX1RZUEU6CgkJQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgljYXNlIE1RSUFDSF9YTUlUX1BST1RPQ09MX1RZUEU6CgkJQ2hsRGVmbi0+VHJhbnNwb3J0VHlwZSA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKCWNhc2UgTVFJQUNIX0JBVENIX1NJWkU6CgkJQ2hsRGVmbi0+QmF0Y2hTaXplID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwoJY2FzZSBNUUlBQ0hfRElTQ19JTlRFUlZBTDoKCQlDaGxEZWZuLT5EaXNjSW50ZXJ2YWwgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgljYXNlIE1RSUFDSF9TSE9SVF9SRVRSWToKCQlDaGxEZWZuLT5TaG9ydFJldHJ5Q291bnQgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgljYXNlIE1RSUFDSF9TSE9SVF9USU1FUjoKCQlDaGxEZWZuLT5TaG9ydFJldHJ5SW50ZXJ2YWwgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgljYXNlIE1RSUFDSF9MT05HX1JFVFJZOgoJCUNobERlZm4tPkxvbmdSZXRyeUNvdW50ID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwoJY2FzZSBNUUlBQ0hfTE9OR19USU1FUjoKCQlDaGxEZWZuLT5Mb25nUmV0cnlJbnRlcnZhbCA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKCWNhc2UgTVFJQUNIX0RBVEFfQ09OVkVSU0lPTjoKCQlDaGxEZWZuLT5EYXRhQ29udmVyc2lvbiA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKCWNhc2UgTVFJQUNIX1BVVF9BVVRIT1JJVFk6CgkJQ2hsRGVmbi0+UHV0QXV0aG9yaXR5ID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwoJY2FzZSBNUUlBQ0hfU0VRVUVOQ0VfTlVNQkVSX1dSQVA6CgkJQ2hsRGVmbi0+U2VxTnVtYmVyV3JhcCA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKCWNhc2UgTVFJQUNIX01BWF9NU0dfTEVOR1RIOgoJCUNobERlZm4tPk1heE1zZ0xlbmd0aCA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKCWNhc2UgTVFJQUNIX01DQV9UWVBFOgoJCUNobERlZm4tPk1DQVR5cGUgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgljYXNlIE1RSUFDSF9NUl9DT1VOVDoKCQlDaGxEZWZuLT5Nc2dSZXRyeUNvdW50ID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwoJY2FzZSBNUUlBQ0hfTVJfSU5URVJWQUw6CgkJQ2hsRGVmbi0+TXNnUmV0cnlJbnRlcnZhbCA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKI2lmIGRlZmluZWQgKE1RSUFDSF9CQVRDSF9JTlRFUlZBTCkKCWNhc2UgTVFJQUNIX0JBVENIX0lOVEVSVkFMOgoJCUNobERlZm4tPkJhdGNoSW50ZXJ2YWwgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CiNlbmRpZgojaWYgZGVmaW5lZCAoTVFJQUNIX0hCX0lOVEVSVkFMKQoJY2FzZSBNUUlBQ0hfSEJfSU5URVJWQUw6CgkJQ2hsRGVmbi0+SGVhcnRiZWF0SW50ZXJ2YWwgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CiNlbmRpZgojaWYgZGVmaW5lZCAoTVFJQUNIX05QTV9TUEVFRCkKCWNhc2UgTVFJQUNIX05QTV9TUEVFRDoKCQlDaGxEZWZuLT5Ob25QZXJzaXN0ZW50TXNnU3BlZWQgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CiNlbmRpZgojaWYgZGVmaW5lZCAoTVFJQUNIX05FVFdPUktfUFJJT1JJVFkpCgljYXNlIE1RSUFDSF9ORVRXT1JLX1BSSU9SSVRZOgoJCUNobERlZm4tPk5ldHdvcmtQcmlvcml0eSA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKI2VuZGlmCiNpZmRlZiBNUUlBQ0hfSU5ISUJJVF9BVVRPU1RBUlQKCQljYXNlIE1RSUFDSF9JTkhJQklUX0FVVE9TVEFSVDoKCQlDaGxEZWZuLT5JbmhpYml0QXV0b3N0YXJ0ID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwojZW5kaWYKI2lmIGRlZmluZWQgKE1RX0xPQ0FMX0FERFJFU1NfTEVOR1RIKQoKCWNhc2UgTVFJQUNIX0JBVENIX0hCOgoJCUNobERlZm4tPkJhdGNoSEIgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgljYXNlIE1RSUFDSF9TU0xfQ0xJRU5UX0FVVEg6CgkJQ2hsRGVmbi0+U3NsQ0F1dGggPSBwUENGSW50ZWdlci0+VmFsdWU7CgoJCWJyZWFrOwoKI2lmIGRlZmluZWQgKE1RSUFDSF9LRUVQX0FMSVZFX0lOVEVSVkFMKQoJY2FzZSBNUUlBQ0hfS0VFUF9BTElWRV9JTlRFUlZBTDoKCQlDaGxEZWZuLT5LQUludCA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKI2VuZGlmCgojZW5kaWYKCiNpZmRlZiB6ek1RVjYwCgljYXNlIE1RSUFfTU9OSVRPUklOR19DSEFOTkVMOgoJCUNobERlZm4tPk1vbkNobCA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKCWNhc2UgTVFJQV9TVEFUSVNUSUNTX0NIQU5ORUw6CgkJQ2hsRGVmbi0+U3RhdHNDaGwgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgljYXNlIE1RSUFDSF9DTFdMX0NIQU5ORUxfUkFOSzoKCQlDaGxEZWZuLT5SYW5rID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwoJY2FzZSBNUUlBQ0hfQ0xXTF9DSEFOTkVMX1BSSU9SSVRZOgoJCUNobERlZm4tPlByaW9yaXR5ID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwoJY2FzZSBNUUlBQ0hfQ0xXTF9DSEFOTkVMX1dFSUdIVDoKCQlDaGxEZWZuLT5XZWlnaHQgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgojZW5kaWYKCiNpZmRlZiB6ek1RVjcwCgljYXNlIE1RSUFfUFJPUEVSVFlfQ09OVFJPTDoKCQlDaGxEZWZuLT5Qcm9wQ250bCA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKCWNhc2UgTVFJQUNIX1NIQVJJTkdfQ09OVkVSU0FUSU9OUzoKCQlDaGxEZWZuLT5TaGFyZUNudiA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKCWNhc2UgTVFJQUNIX01BWF9JTlNUQU5DRVM6CgkJQ2hsRGVmbi0+TWF4SW5zdHMgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgljYXNlIE1RSUFDSF9NQVhfSU5TVFNfUEVSX0NMSUVOVDoKCQlDaGxEZWZuLT5NYXhJbnN0c0MgPSBwUENGSW50ZWdlci0+VmFsdWU7CgkJYnJlYWs7CgljYXNlIE1RSUFDSF9DT05ORUNUSU9OX0FGRklOSVRZOgoJCUNobERlZm4tPkFmZmluaXR5ID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwoJY2FzZSBNUUlBQ0hfREVGX0NIQU5ORUxfRElTUDoKCQlDaGxEZWZuLT5EZWZDRHNwID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwoJY2FzZSBNUUlBQ0hfQ0xJRU5UX0NIQU5ORUxfV0VJR0hUOgoJCUNobERlZm4tPkNsbnRDaGxXZ2h0ID0gcFBDRkludGVnZXItPlZhbHVlOwoJCWJyZWFrOwoKI2VuZGlmCiNpZiBkZWZpbmVkKHp6ek9TKQoJCS8qIHY2MDIgek9TIGF0dHJpYnV0ZXMgKi8KCWNhc2UgTVFJQV9RU0dfRElTUDogLyogek9TICovCgkJQ2hsRGVmbi0+cXNnRGlzcCA9IHBQQ0ZJbnRlZ2VyLT5WYWx1ZTsKCQlicmVhazsKI2VuZGlmCgoJZGVmYXVsdDoKCQlpZiAobm9pc3kpCgkJCWZwcmludGYoc3RkZXJyLCAiKGNoYW5uZWwuYykgVW5rbm93biBQQ0YgSW50ZWdlciBQYXJhbWV0ZXI6ICVsZFxuIiwKCQkJCQlwUENGSW50ZWdlci0+UGFyYW1ldGVyKTsKCQkqaUNDID0gV0FSTklORzsKCQlicmVhazsKCX0gLyogZW5kc3dpdGNoICovCgoJcmV0dXJuOwp9Cgp2b2lkIFByb2Nlc3NDaGFubmVsSW50ZWdlckxpc3RQYXJtKE1RQ0ZJTCAqcFBDRkludGVnZXJMaXN0LCBDaGxQYXJtcyAqQ2hsRGVmbiwKCQlNUUxPTkcgKmlDQykgewoJaW50IGk7CgkqaUNDID0gTVFDQ19PSzsKCWk9MDsKCglzd2l0Y2ggKHBQQ0ZJbnRlZ2VyTGlzdC0+UGFyYW1ldGVyKSB7CgojaWYgZGVmaW5lZCAoTVFJQUNIX0hEUl9DT01QUkVTU0lPTikKCWNhc2UgTVFJQUNIX0hEUl9DT01QUkVTU0lPTjoKCQlmb3IgKGk9MDsgaTxDT01QX0FSUkFZX1NJWkU7IGkrKykgewoJCQlDaGxEZWZuLT5IZHJDb21wW2ldID0gTVFDT01QUkVTU19OT1RfQVZBSUxBQkxFOwoJCX0KCgkJZm9yIChpPTA7IGk8cFBDRkludGVnZXJMaXN0LT5Db3VudCAmJiBpPENPTVBfQVJSQVlfU0laRTsgaSsrKSB7CgkJCUNobERlZm4tPkhkckNvbXBbaV0gPSBwUENGSW50ZWdlckxpc3QtPlZhbHVlc1tpXTsKCQl9CgkJYnJlYWs7CgoJY2FzZSBNUUlBQ0hfTVNHX0NPTVBSRVNTSU9OOgoJCWZvciAoaT0wOyBpPENPTVBfQVJSQVlfU0laRTsgaSsrKSB7CgkJCUNobERlZm4tPk1zZ0NvbXBbaV0gPSBNUUNPTVBSRVNTX05PVF9BVkFJTEFCTEU7CgkJfQoJCWZvciAoaT0wOyBpPHBQQ0ZJbnRlZ2VyTGlzdC0+Q291bnQgJiYgaTxDT01QX0FSUkFZX1NJWkU7IGkrKykgewoJCQlDaGxEZWZuLT5Nc2dDb21wW2ldID0gcFBDRkludGVnZXJMaXN0LT5WYWx1ZXNbaV07CgkJfQoJCWJyZWFrOwojZW5kaWYKCglkZWZhdWx0OgoJCWlmIChub2lzeSkKCQkJZnByaW50ZihzdGRlcnIsCgkJCQkJIihjaGFubmVsLmMpIFVua25vd24gUENGIEludGVnZXIgTGlzdCBQYXJhbWV0ZXI6ICVsZFxuIiwKCQkJCQlwUENGSW50ZWdlckxpc3QtPlBhcmFtZXRlcik7CgkJKmlDQyA9IFdBUk5JTkc7CgkJYnJlYWs7Cgl9IC8qIGVuZHN3aXRjaCAqLwoKCXJldHVybjsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBUaGlzIHByb2Nlc3MgdGFrZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSBzaW5nbGUgY2hhbm5lbCBhbmQgYWRkcyAgICAgICAgICAgKi8KLyogdGhlbSB0byB0aGUgZW5kIG9mIGEgZmlsZSwgU0FWRVFNR1IuVFNULCB3aGljaCBjYW4gYmUgZm91bmQgaW4gdGhlICAgICAgICovCi8qIGN1cnJlbnQgZGlyZWN0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogVGhlIGZpbGUgaXMgb2YgYSBmb3JtYXQgc3VpdGFibGUgZm9yIHN1YnNlcXVlbnQgaW5wdXQgdG8gUlVOTVFTQy4gICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnZvaWQgQWRkVG9GaWxlQ0hBTk5FTChDaGxQYXJtcyAqcENobERlZm4sIGludCBVc2VyVmVyc2lvbiwgY2hhciAqIGZpbGVOYW1lLCAvKiB2MzIgTmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgICovCkZJTEUgKmZwLCAvKiB2NTEgZmlsZSBoYW5kbGUgKi8KaW50IHR3b2xpbmVzLCAvKiB2NjAxICovCk1RTE9ORyAqaUNDKSB7CgljaGFyICogUGFybUJ1ZmZlcjsgLyogVGVtcG9yYXJ5IGJ1ZmZlciB0byBob2xkIGZvciBvdXRwdXQgdG8gZmlsZSAqLwoJaW50IG9wdGlvbnNfZXhpdDsgLyogT3B0aW9uIGZsYWcgZm9yIE1Rc3ByaW50Zl9YIChmb3IgY2hhaW5lZCBleGl0cykgKi8KCWludCBvcHRpb25zOyAvKiBPcHRpb24gZmxhZyBmb3IgTVFzcHJpbnRmX1ggKi8KCWNoYXIgd29ya1syNTZdOwoJd29ya1swXT0nXDAnOwoKCS8qIEluaXRpYWxpc2UgcmV0dXJuIGNvZGVzICovCgkqaUNDID0gTVFDQ19PSzsKCglpZiAoICEoUGFybUJ1ZmZlciA9IChjaGFyICopIG1hbGxvYyhQQlNJWkUpICkpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIihjaGFubmVsLmMpIEZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBcbiIsIFBCU0laRSk7CgkJZXhpdCgyKTsKCX0KCS8qIENvbnN1bCBzdHVmZiAqLwoJY2hhciAqY29uX3ByZXRleHQgPSBOVUxMOy8vW109Ijw8Y29uc3VsX2t2Pj4iOwoJaW50IG1sZW4gPSBQQlNJWkU7CglpZiAoIShjb25fcHJldGV4dCA9IChjaGFyICopbWFsbG9jKG1sZW4pKSkgewoJCWZwcmludGYoc3RkZXJyLCAiKG1xdXRpbHMuYykgRXJyb3IgYWxsb2NhdGluZyAlZCBieXRlcyBpbiBNUXNwcmludGZcbiIsCgkJCQltbGVuKTsKCQlleGl0KDIpOwoJfQoJbWVtc2V0KGNvbl9wcmV0ZXh0LCAnXDAnLCBtbGVuKTsKCXN0cmNweShjb25fcHJldGV4dCwiPDxjb25zdWxfcHJldGV4dD4+LyIpOwoJLy9NUXNwcmludGZfWChQYXJtQnVmZmVyLCAiQ0hBTk5FTC8lcy8iLCBwQXV0aEluZm9EZWZuLT5BdXRoSW5mb05hbWUsIE1RX0FVVEhfSU5GT19OQU1FX0xFTkdUSCwgb3B0aW9ucyk7CgkvL3N0cmNhdChjb25fcHJldGV4dCwgUGFybUJ1ZmZlcik7CgkvL3ByaW50ZigiXG4jI0NPTlNVTENIQU5ORUwgJXN2Iixjb25fcHJldGV4dCk7CgoJLyogZW5kIGNvbnN1bCBzdHVmZiAqLwoJLyogdjUxMCByZW1vdmVzIG9wZW4gZnJvbSBoZXJlIC4uLiBmcCA9IGZvcGVuKCBmaWxlTmFtZSwgT1BFTk1PREUgKTsgKi8KCgkvKiB2NjAxIHNldHVwIG9wdGlvbnMgZm9yIG9uZUxpbmUgb3BlcmF0aW9uICovCglvcHRpb25zID0gTVFTUFJJTlRGX1hfRE9VQkxFX1FVT1RFUyArIE1RU1BSSU5URl9YX05PX1RSQUlMSU5HX0JMQU5LUzsKCWlmICghb25lTGluZSkKCQlvcHRpb25zICs9IE1RU1BSSU5URl9YX0xJTkVfQlJFQUtTOwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBBZGQgQ2hhbm5lbE5hbWUgYW5kIFR5cGUgdG8gZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogSWYgdW5yZWNvZ25pc2VkIHR5cGUgdGhlbiBpZ25vcmUgdGhpcyBkZWZpbnRpdGlvbiwgcmV0dXJuIHdhcm5pbmcgKi8KCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJaWYgKHR3b2xpbmVzKQoJCWZwdXRzKCIqICIsIGZwKTsKCglzd2l0Y2ggKHBDaGxEZWZuLT5DaGFubmVsVHlwZSkgewoJY2FzZSBNUUNIVF9TRU5ERVI6CgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIkNIQU5ORUwvU0RSLyVzLyIsCgkJCQlwQ2hsRGVmbi0+Q2hhbm5lbE5hbWUsIE1RX0NIQU5ORUxfTkFNRV9MRU5HVEgsIG9wdGlvbnMpOwoJCWJyZWFrOwoJY2FzZSBNUUNIVF9TRVJWRVI6CgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIkRDSEFOTkVML1NWUi8lcy8iLAoJCQkJcENobERlZm4tPkNoYW5uZWxOYW1lLCBNUV9DSEFOTkVMX05BTUVfTEVOR1RILCBvcHRpb25zKTsKCQlicmVhazsKCWNhc2UgTVFDSFRfUkVDRUlWRVI6CgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIkNIQU5ORUwvUkNWUi8lcy8iLAoJCQkJcENobERlZm4tPkNoYW5uZWxOYW1lLCBNUV9DSEFOTkVMX05BTUVfTEVOR1RILCBvcHRpb25zKTsKCQlicmVhazsKCWNhc2UgTVFDSFRfUkVRVUVTVEVSOgoJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJDSEFOTkVML1JRU1RSLyVzLyIsCgkJCQlwQ2hsRGVmbi0+Q2hhbm5lbE5hbWUsIE1RX0NIQU5ORUxfTkFNRV9MRU5HVEgsIG9wdGlvbnMpOwoJCWJyZWFrOwoJY2FzZSBNUUNIVF9TVlJDT05OOgoJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJDSEFOTkVML1NWUkNPTk4vJXMvIiwKCQkJCXBDaGxEZWZuLT5DaGFubmVsTmFtZSwgTVFfQ0hBTk5FTF9OQU1FX0xFTkdUSCwgb3B0aW9ucyk7CgkJYnJlYWs7CgljYXNlIE1RQ0hUX0NMTlRDT05OOgoJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJDSEFOTkVML0NMTlRDT05OLyVzLyIsCgkJCQlwQ2hsRGVmbi0+Q2hhbm5lbE5hbWUsIE1RX0NIQU5ORUxfTkFNRV9MRU5HVEgsIG9wdGlvbnMpOwoJCWJyZWFrOwoJCS8qIFt2NTFdIHN0YXJ0IHY1MSBhdHRyaWJ1dGVzICovCiNpZiBkZWZpbmVkKE1RQ0hUX0NMVVNSQ1ZSKQoJY2FzZSBNUUNIVF9DTFVTUkNWUjoKCQlpZiAoVXNlclZlcnNpb24+PU1RQ01ETF9MRVZFTF81MTApIHsKCQkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIkNIQU5ORUwvQ0xVU1JDVlIvJXMvIiwKCQkJCQlwQ2hsRGVmbi0+Q2hhbm5lbE5hbWUsIE1RX0NIQU5ORUxfTkFNRV9MRU5HVEgsIG9wdGlvbnMpOwoJCX0gZWxzZSB7CgkJCXJldHVybjsgLyogdXNlciBkb2Vzbid0IHdhbnQgVjUxIHN0dWZmICovCgkJfS8qIEVuZCBpZiovCgkJYnJlYWs7CiNlbmRpZgoKI2lmIGRlZmluZWQoTVFDSFRfQ0xVU1NEUikKCWNhc2UgTVFDSFRfQ0xVU1NEUjoKCQlpZiAoVXNlclZlcnNpb24+PU1RQ01ETF9MRVZFTF81MTApIHsKCQkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIkNIQU5ORUwvQ0xVU1NEUi8lcy8iLAoJCQkJCXBDaGxEZWZuLT5DaGFubmVsTmFtZSwgTVFfQ0hBTk5FTF9OQU1FX0xFTkdUSCwgb3B0aW9ucyk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuOyAvKiB1c2VyIGRvZXNuJ3Qgd2FudCBWNTEgc3R1ZmYgKi8KCQl9LyogRW5kIGlmKi8KCQlicmVhazsKI2VuZGlmCgkJLyogW3Y1MV0gZW5kIG9mIFY1MSBjaGFubmVsIHR5cGVzICovCgoJZGVmYXVsdDoKCQkqaUNDID0gV0FSTklORzsKCQlpZiAobm9pc3kpCgkJCWZwcmludGYoc3RkZXJyLCAiKGNoYW5uZWwuYykgVW5rbm93biBjaGFubmVsIHR5cGUgPSAlbGQgXG4iLAoJCQkJCXBDaGxEZWZuLT5DaGFubmVsVHlwZSk7Cgl9IC8qIGVuZHN3aXRjaCAqLwoJc3RyY2F0KGNvbl9wcmV0ZXh0LCBQYXJtQnVmZmVyKTsKCS8vZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoKI2lmIGRlZmluZWQgKE1RQ0FfQUxURVJBVElPTl9EQVRFKQoJaWYgKGhlYWRlciAmJiAoIW9uZUxpbmUgfHwgdHdvbGluZXMpKSB7CgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIiogQUxUREFURSAoJXMpICIsIHBDaGxEZWZuLT5BbHRlcmF0aW9uRGF0ZSwKCQlNUV9DUkVBVElPTl9EQVRFX0xFTkdUSCwgb3B0aW9ucyk7CgkJLy9mcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIiogQUxUVElNRSAoJXMpICIsIHBDaGxEZWZuLT5BbHRlcmF0aW9uVGltZSwKCQlNUV9DUkVBVElPTl9USU1FX0xFTkdUSCwgb3B0aW9ucyk7CgkJLy9mcHV0cyhQYXJtQnVmZmVyLCBmcCk7Cgl9CiNlbmRpZgoKCXN3aXRjaCAocENobERlZm4tPlRyYW5zcG9ydFR5cGUpIHsKCWNhc2UgTVFYUFRfTFU2MjoKCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJUUlBUWVBFIExVNjIiKTsKCQlmcHV0cygiXG4iLGZwKTsKCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQlpZiAocENobERlZm4tPkNoYW5uZWxUeXBlICE9IE1RQ0hUX1JFQ0VJVkVSICYmIHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQkJIT0gTVFDSFRfU1ZSQ09OTikgewoJCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiTU9ERU5BTUUgJyVzJyIsCgkJCQkJcENobERlZm4tPk1vZGVOYW1lLCBNUV9NT0RFX05BTUVfTEVOR1RILCBvcHRpb25zKTsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIlRQTkFNRSAnJXMnIiwgcENobERlZm4tPlRwTmFtZSwKCQkJTVFfVFBfTkFNRV9MRU5HVEgsIG9wdGlvbnMpOwoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCQlicmVhazsKCWNhc2UgTVFYUFRfVENQOgoJCXNwcmludGYoUGFybUJ1ZmZlciwgIlRSUFRZUEUgVENQIik7CgkJZnB1dHMoIlxuIixmcCk7CgkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJYnJlYWs7CgljYXNlIE1RWFBUX05FVEJJT1M6CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiVFJQVFlQRSBORVRCSU9TIik7CgkJZnB1dHMoIlxuIixmcCk7CgkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJYnJlYWs7CiNpZiBkZWZpbmVkIChNUVhQVF9TUFgpCgljYXNlIE1RWFBUX1NQWDogLyogW1dNU10gYWRkZWQgZm9yIHVuaXggJiBkZWMgKi8KCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJUUlBUWVBFIFNQWCIpOwoJCWZwdXRzKCJcbiIsZnApOwoJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCWJyZWFrOwojZW5kaWYKI2lmIGRlZmluZWQgKE1RWFBUX0RFQ05FVCkKCWNhc2UgTVFYUFRfREVDTkVUOgoJCXNwcmludGYoUGFybUJ1ZmZlciwgIlRSUFRZUEUgREVDTkVUIik7CgkJZnB1dHMoIlxuIixmcCk7CgkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJYnJlYWs7CiNlbmRpZgojaWYgZGVmaW5lZCAoTVFYUFRfVURQKQoJY2FzZSBNUVhQVF9VRFA6CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiVFJQVFlQRSBVUEQiKTsKCQlmcHV0cygiXG4iLGZwKTsKCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQlicmVhazsKI2VuZGlmCgl9IC8qIGVuZHN3aXRjaCAqLwoKCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIFt2NTFdIFdyaXRlIG91dCBvcHRpb25zIGluIGxvZ2ljYWwgZ3JvdXBzLCBiYXNlZCBvbiBjbWQgbGV2ZWwgICovCgkvKiByZXF1ZXN0ZWQgYnkgdXNlciBhbmQgY2hhbm5lbCB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCgkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJaWYgKFVzZXJWZXJzaW9uPj1NUUNNRExfTEVWRUxfNTAwICYmIChwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfU0VSVkVSCgkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TRU5ERVIKI2lmIGRlZmluZWQgKE1RQ0hUX0NMVVNTRFIpCgkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9DTFVTU0RSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQk9PSBNUUNIVF9DTFVTUkNWUgojZW5kaWYKCQkJKSkgewoJCXNwcmludGYoUGFybUJ1ZmZlciwgIkJBVENISU5UICVsZCIsIHBDaGxEZWZuLT5CYXRjaEludGVydmFsKTsKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJCQVRDSElOVCAwIikgIT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCQkvKiBbdjUzMF0gQmF0Y2hiIGZvciBTRFIsIFNWUiwgQ0xVU1NEUiBhbmQgQ0xVU1NWUiAqLwojaWYgZGVmaW5lZCAoTVFJQUNIX0JBVENIX0hCKQoJCWlmIChVc2VyVmVyc2lvbj49TVFDTURMX0xFVkVMXzUzMCkgewoJCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJCQVRDSEhCICVsZCIsIHBDaGxEZWZuLT5CYXRjaEhCKTsKCQkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiQkFUQ0hIQiAwIikgIT0gMCl7CgkJCQlmcHV0cygiXG4iLGZwKTsKCQkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJCX0KCQl9CiNlbmRpZgoJfQoKCWlmIChwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfU0VOREVSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQk9PSBNUUNIVF9TRVJWRVIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1JFQ0VJVkVSCgkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9SRVFVRVNURVIKI2lmIGRlZmluZWQgKE1RQ0hUX0NMVVNTRFIpCgkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9DTFVTU0RSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQk9PSBNUUNIVF9DTFVTUkNWUgojZW5kaWYKCSkgewoKCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJCQVRDSFNaICVsZCIsIHBDaGxEZWZuLT5CYXRjaFNpemUpOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIkJBVENIU1ogNTAiKSAhPSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9Cgl9CgojaWYgZGVmaW5lZCAoTVFDSFRfQ0xVU1NEUikKCWlmIChVc2VyVmVyc2lvbj49TVFDTURMX0xFVkVMXzUxMCAmJiAocENobERlZm4tPkNoYW5uZWxUeXBlCgkJCT09IE1RQ0hUX0NMVVNTRFIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX0NMVVNSQ1ZSCgoJKSkgewoKCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiQ0xVU1RFUignJXMnKSIsIHBDaGxEZWZuLT5DbHVzdGVyTmFtZSwKCQlNUV9DTFVTVEVSX05BTUVfTEVOR1RILCBvcHRpb25zKTsKCQlmcHV0cygiXG4iLGZwKTsKICAJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCSAgZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoKCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiQ0xVU05MKCclcycpIiwKCQkJCXBDaGxEZWZuLT5DbHVzdGVyTmFtZUxpc3QsIE1RX0NMVVNURVJfTkFNRV9MRU5HVEgsIG9wdGlvbnMpOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIkNMVVNOTCAnICciKSAhPSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9CgoJfQojZW5kaWYKCglpZiAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFTkRFUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfUkVRVUVTVEVSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9DTE5UQ09OTgoJCQl8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfU0VSVkVSCiNpZiBkZWZpbmVkIChNUUNIVF9DTFVTU0RSKQoJCQl8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfQ0xVU1NEUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfQ0xVU1JDVlIKI2VuZGlmCgkpIHsKCgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIkNPTk5BTUUgJyVzJyIsCgkJCQlwQ2hsRGVmbi0+Q29ubmVjdGlvbk5hbWUsIE1RX0NPTk5fTkFNRV9MRU5HVEgsIG9wdGlvbnMpOwoJCWZwdXRzKCJcbiIsZnApOwoJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoKCQkvKiBbdjUzMF0gTG9jbGFkZHIgZm9yIFNEUiwgU1ZSLCBSUVNUUiwgQ0xOVENPTk4sIENMVVNTRFIsIENMVVNSQ1ZSICovCiNpZiBkZWZpbmVkIChNUUNBQ0hfTE9DQUxfQUREUkVTUykKCQlpZiAoVXNlclZlcnNpb24+PU1RQ01ETF9MRVZFTF81MzApIHsKCQkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIkxPQ0xBRERSICclcyciLAoJCQkJCXBDaGxEZWZuLT5Mb2NhbEFkZHIsIE1RX0xPQ0FMX0FERFJFU1NfTEVOR1RILCBvcHRpb25zKTsKCQkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiTE9DTEFERFIgJyAnIikgIT0gMCl7CgkJCQlmcHV0cygiXG4iLGZwKTsKCQkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJCX0KCQl9CiNlbmRpZgoKCX0KCglpZiAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFTkRFUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfU0VSVkVSCiNpZiBkZWZpbmVkIChNUUNIVF9DTFVTU0RSKQoJCQl8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfQ0xVU1NEUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfQ0xVU1JDVlIKI2VuZGlmCgkpIHsKCgkJaWYgKHBDaGxEZWZuLT5EYXRhQ29udmVyc2lvbiA9PSBNUUNEQ19OT19TRU5ERVJfQ09OVkVSU0lPTikKCQkJc3ByaW50ZihQYXJtQnVmZmVyLCAiQ09OVkVSVCBOTyIpOwoJCWVsc2UKCQkJc3ByaW50ZihQYXJtQnVmZmVyLCAiQ09OVkVSVCBZRVMiKTsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCgl9CgoJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIkRFU0NSICclcyciLCBwQ2hsRGVmbi0+Q2hhbm5lbERlc2MsCglNUV9DSEFOTkVMX0RFU0NfTEVOR1RILCBvcHRpb25zKTsKCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIkRFU0NSICcgJyIpID09IDApewoJZnB1dHMoIlxuIixmcCk7CglmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJZnB1dHMoIkRFU0NSICdnZW5lcmF0ZWQgZnJvbSBtcTJjb25zdWwgdXRpbGl0eSciLCBmcCk7Cgl9CgllbHNlIHsKCQlmcHV0cygiXG4iLGZwKTsKCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCX0KCglpZiAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFTkRFUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfU0VSVkVSCiNpZiBkZWZpbmVkIChNUUNIVF9DTFVTU0RSKQoJCQl8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfQ0xVU1NEUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfQ0xVU1JDVlIKI2VuZGlmCgkJCXx8IChwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfU1ZSQ09OTiAmJiBwbGF0Zm9ybSA9PSBNUVBMX01WUyApKSB7CgoJCXNwcmludGYoUGFybUJ1ZmZlciwgIkRJU0NJTlQgJWxkIiwgcENobERlZm4tPkRpc2NJbnRlcnZhbCk7CgkJZnB1dHMoIlxuIixmcCk7CgkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7Cgl9CgoJaWYgKFVzZXJWZXJzaW9uPj1NUUNNRExfTEVWRUxfNTAwKSB7CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiSEJJTlQgJWxkIixwQ2hsRGVmbi0+SGVhcnRiZWF0SW50ZXJ2YWwpOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIkhCSU5UIDMwMCIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCX0KCglpZiAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFTkRFUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfU0VSVkVSCiNpZiBkZWZpbmVkIChNUUNIVF9DTFVTU0RSKQoJCQl8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfQ0xVU1NEUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfQ0xVU1JDVlIKI2VuZGlmCgkpIHsKCgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiTE9OR1JUWSAlbGQiLCBwQ2hsRGVmbi0+TG9uZ1JldHJ5Q291bnQpOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIkxPTkdSVFkgOTk5OTk5OTk5IikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJMT05HVE1SICVsZCIscENobERlZm4tPkxvbmdSZXRyeUludGVydmFsKTsKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJMT05HVE1SIDEyMDAiKSA9PSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9CgoJCXNwcmludGYoUGFybUJ1ZmZlciwgIlNIT1JUUlRZICVsZCIsIHBDaGxEZWZuLT5TaG9ydFJldHJ5Q291bnQpOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIlNIT1JUUlRZIDEwIikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJTSE9SVFRNUiAlbGQiLHBDaGxEZWZuLT5TaG9ydFJldHJ5SW50ZXJ2YWwpOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIlNIT1JUVE1SIDYwIikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCX0KCglzcHJpbnRmKFBhcm1CdWZmZXIsICJNQVhNU0dMICVsZCIsIHBDaGxEZWZuLT5NYXhNc2dMZW5ndGgpOwoJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiTUFYTVNHTCA0MTk0MzA0IikgPT0gMCl7CgkJZnB1dHMoIlxuIixmcCk7CgkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7Cgl9CgoJLyogTm90ZTogTUNBTkFNRSBjYW4gb25seSBiZSBzZXQgdG8gYmxhbmtzLCBzbyB3ZSBkb24ndCBib3RoZXIgdG8gKi8KCS8qIHdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgZmlsZSAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgoJaWYgKHBsYXRmb3JtICE9IE1RUExfT1M0MDAgJiYgcGxhdGZvcm0gIT0gTVFQTF9NVlMgJiYgKCAvKiBub3QgdGhlIDQwMCBwbGF0Zm9ybSAqLwoJcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFTkRFUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfU0VSVkVSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9SRVFVRVNURVIKI2lmIGRlZmluZWQgKE1RQ0hUX0NMVVNTRFIpCgkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9DTFVTU0RSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQk9PSBNUUNIVF9DTFVTUkNWUgojZW5kaWYKCQkJKSkgewoKCQlpZiAocENobERlZm4tPk1DQVR5cGUgPT0gTVFNQ0FUX1BST0NFU1MpCgkJCXNwcmludGYoUGFybUJ1ZmZlciwgIk1DQVRZUEUgUFJPQ0VTUyIpOwoJCWVsc2UKCQkJc3ByaW50ZihQYXJtQnVmZmVyLCAiTUNBVFlQRSBUSFJFQUQiKTsKCQlmcHV0cygiXG4iLGZwKTsKCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCgl9CgoJaWYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZSAhPSBNUUNIVF9DTE5UQ09OTikgewoKCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiTUNBVVNFUiAnJXMnIiwKCQkJCXBDaGxEZWZuLT5NQ0FVc2VySWRlbnRpZmllciwgWFpNQ0FVU0VSTEVOLCBvcHRpb25zKTsKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJNQ0FVU0VSICcgJyIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCgl9CgoJaWYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9SRUNFSVZFUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfUkVRVUVTVEVSCiNpZiBkZWZpbmVkIChNUUNIVF9DTFVTUkNWUikKCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX0NMVVNSQ1ZSCiNlbmRpZgoJKSB7CgoJCS8qIFt2NTMwXSBEZXBlbmRpbmcgb24gd2hldGhlciB3ZSdyZSBkZWFsaW5nIHdpdGggYSBzdHJpbmcgKi8KCQkvKiBvciBjaGFpbmVkIGV4aXRzLCBwYXNzIHRoZSBjb3JyZWN0IGZsYWdzIHRvIE1Rc3ByaW50Zl9YICovCgkJb3B0aW9uc19leGl0ID0gTVFTUFJJTlRGX1hfTk9fVFJBSUxJTkdfQkxBTktTOwoJCWlmICghb25lTGluZSkKCQkJb3B0aW9uc19leGl0ICs9IE1RU1BSSU5URl9YX0xJTkVfQlJFQUtTOwoKCQlpZiAoIXBDaGxEZWZuLT5Nc2dSZXRyeVVzZXJEYXRhTGlzdEZsYWcpIHsKCQkJb3B0aW9uc19leGl0ICs9IE1RU1BSSU5URl9YX0RPVUJMRV9RVU9URVM7CgkJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJNUkRBVEEgJyVzJyIsCgkJCQkJcENobERlZm4tPk1zZ1JldHJ5VXNlckRhdGEsIE1RX0VYSVRfREFUQV9MRU5HVEgsCgkJCQkJb3B0aW9uc19leGl0KTsKCQl9IGVsc2UgewoJCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiTVJEQVRBICVzIiwKCQkJCQlwQ2hsRGVmbi0+TXNnUmV0cnlVc2VyRGF0YSwgTVFfVE9UQUxfRVhJVF9EQVRBX0xFTkdUSCwKCQkJCQlvcHRpb25zX2V4aXQpOwoJCX0KCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJNUkRBVEEgJyAnIikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCQkvKiBbdjUzMF0gRGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UncmUgZGVhbGluZyB3aXRoIGEgc3RyaW5nICovCgkJLyogb3IgY2hhaW5lZCBleGl0cywgcGFzcyB0aGUgY29ycmVjdCBmbGFncyB0byBNUXNwcmludGZfWCAqLwoKCQlvcHRpb25zX2V4aXQgPSBNUVNQUklOVEZfWF9OT19UUkFJTElOR19CTEFOS1M7CgkJaWYgKCFvbmVMaW5lKQoJCQlvcHRpb25zX2V4aXQgKz0gTVFTUFJJTlRGX1hfTElORV9CUkVBS1M7CgoJCWlmICghcENobERlZm4tPk1zZ1JldHJ5RXhpdExpc3RGbGFnKSB7CgkJCW9wdGlvbnNfZXhpdCArPSBNUVNQUklOVEZfWF9ET1VCTEVfUVVPVEVTOwoJCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiTVJFWElUICclcyciLAoJCQkJCXBDaGxEZWZuLT5Nc2dSZXRyeUV4aXQsIE1RX0VYSVRfTkFNRV9MRU5HVEgsIG9wdGlvbnNfZXhpdCk7CgkJfSBlbHNlIHsKCQkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIk1SRVhJVCAlcyIsCgkJCQkJcENobERlZm4tPk1zZ1JldHJ5RXhpdCwgTVFfVE9UQUxfRVhJVF9OQU1FX0xFTkdUSCwKCQkJCQlvcHRpb25zX2V4aXQpOwoJCX0KCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJNUkVYSVQgJyAnIikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiTVJSVFkgJWxkIiwgcENobERlZm4tPk1zZ1JldHJ5Q291bnQpOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIk1SRVhJVCAnICciKSA9PSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiTVJUTVIgJWxkIiwgcENobERlZm4tPk1zZ1JldHJ5SW50ZXJ2YWwpOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIk1SVE1SIDEwMDAiKSA9PSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9Cgl9CgoJaWYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZSAhPSBNUUNIVF9DTE5UQ09OTiAmJiBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJIT0gTVFDSFRfU1ZSQ09OTikgewoKCQkvKiBbdjUzMF0gRGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UncmUgZGVhbGluZyB3aXRoIGEgc3RyaW5nICovCgkJLyogb3IgY2hhaW5lZCBleGl0cywgcGFzcyB0aGUgY29ycmVjdCBmbGFncyB0byBNUXNwcmludGZfWCAqLwoKCQlvcHRpb25zX2V4aXQgPSBNUVNQUklOVEZfWF9OT19UUkFJTElOR19CTEFOS1M7CgkJaWYgKCFvbmVMaW5lKQoJCQlvcHRpb25zX2V4aXQgKz0gTVFTUFJJTlRGX1hfTElORV9CUkVBS1M7CgoJCWlmICghcENobERlZm4tPk1zZ1VzZXJEYXRhTGlzdEZsYWcpIHsKCQkJb3B0aW9uc19leGl0ICs9IE1RU1BSSU5URl9YX0RPVUJMRV9RVU9URVM7CgkJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJNU0dEQVRBICclcyciLAoJCQkJCXBDaGxEZWZuLT5Nc2dVc2VyRGF0YSwgTVFfRVhJVF9EQVRBX0xFTkdUSCwgb3B0aW9uc19leGl0KTsKCQl9IGVsc2UgewoJCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiTVNHREFUQSAlcyIsCgkJCQkJcENobERlZm4tPk1zZ1VzZXJEYXRhLCBNUV9UT1RBTF9FWElUX0RBVEFfTEVOR1RILAoJCQkJCW9wdGlvbnNfZXhpdCk7CgkJfQoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIk1TR0RBVEEgJyAnIikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCgkJLyogW3Y1MzBdIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIC80MDAgICAqLwoJCS8qIG9yIGNoYWluZWQgZXhpdHMsIHBhc3MgdGhlIGNvcnJlY3QgZmxhZ3MgdG8gTVFzcHJpbnRmX1ggKi8KCQlvcHRpb25zX2V4aXQgPSAwOwoJCWlmICghb25lTGluZSkKCQkJb3B0aW9uc19leGl0ID0gTVFTUFJJTlRGX1hfTElORV9CUkVBS1M7CgkJLyogaWYgKE1RQVRfREVGQVVMVCAhPSBNUUFUX09TNDAwKSAqLwoJCWlmIChwbGF0Zm9ybSAhPSBNUVBMX09TNDAwKQoJCQlvcHRpb25zX2V4aXQgKz0gTVFTUFJJTlRGX1hfTk9fVFJBSUxJTkdfQkxBTktTOwoKCQlpZiAoIXBDaGxEZWZuLT5Nc2dFeGl0TGlzdEZsYWcpIHsKCQkJb3B0aW9uc19leGl0ICs9IE1RU1BSSU5URl9YX0RPVUJMRV9RVU9URVM7CgkJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJNU0dFWElUICclcyciLCBwQ2hsRGVmbi0+TXNnRXhpdCwKCQkJTVFfRVhJVF9OQU1FX0xFTkdUSCwgb3B0aW9uc19leGl0KTsKCQl9IGVsc2UgewoJCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiTVNHRVhJVCAlcyIsIHBDaGxEZWZuLT5Nc2dFeGl0LAoJCQlNUV9UT1RBTF9FWElUX05BTUVfTEVOR1RILCBvcHRpb25zX2V4aXQpOwoJCX0KCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJNU0dFWElUICcgJyIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCgl9CgojaWYgZGVmaW5lZCAoTVFDSFRfQ0xVU1JDVlIpCglpZiAoVXNlclZlcnNpb24+PU1RQ01ETF9MRVZFTF81MTAgJiYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQk9PSBNUUNIVF9DTFVTUkNWUiApKSB7CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiTkVUUFJUWSAlbGQiLCBwQ2hsRGVmbi0+TmV0d29ya1ByaW9yaXR5KTsKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJORVRQUlRZIDAiKSA9PSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9Cgl9IC8qIGVuZCBvZiBjaGFubmVsID0gY2x1c3RlciAqLwojZW5kaWYKCglpZiAoVXNlclZlcnNpb24+PU1RQ01ETF9MRVZFTF81MDAgJiYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TRU5ERVIKCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFUlZFUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfUkVDRUlWRVIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1JFUVVFU1RFUgojaWYgZGVmaW5lZCAoTVFDSFRfQ0xVU1NEUikKCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX0NMVVNTRFIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlCgkJCT09IE1RQ0hUX0NMVVNSQ1ZSCiNlbmRpZgoJCQkpKSB7CiNpZiBkZWZpbmVkIChNUU5QTVNfTk9STUFMKQoJCWlmIChwQ2hsRGVmbi0+Tm9uUGVyc2lzdGVudE1zZ1NwZWVkID09IE1RTlBNU19OT1JNQUwpCgkJewoJCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJOUE1TUEVFRCBOT1JNQUwiKTsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9CgkJZWxzZQoJCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJOUE1TUEVFRCBGQVNUIik7CgoJCX0KI2VuZGlmCgl9CgoKCglpZiAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1JFQ0VJVkVSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQk9PSBNUUNIVF9SRVFVRVNURVIKCS8qIGRvYyBzYXlzIHN2cmNvbm4gYXJlIG9rYXkgZm9yIHB1dGF1dCAuLi4gZG9lc24ndCBtYWtlIHNlbnNlIHRvIG1lICovCgkvKiBhbmQgYWxzbyBkb2Vzbid0IHdvcmsgISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJLyogICAgICAgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NWUkNPTk4gICAgICAgICAgICAgICAgICAgICAqLwojaWYgZGVmaW5lZCAoTVFDSFRfQ0xVU1JDVlIpCgkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9DTFVTUkNWUgojZW5kaWYKCSkgewoKCQlzd2l0Y2ggKHBDaGxEZWZuLT5QdXRBdXRob3JpdHkpIHsKCQljYXNlIE1RUEFfREVGQVVMVDoKCQkJc3ByaW50ZihQYXJtQnVmZmVyLCAiUFVUQVVUIERFRiIpOwoJCQlicmVhazsKCQljYXNlIE1RUEFfQ09OVEVYVDoKCQkJc3ByaW50ZihQYXJtQnVmZmVyLCAiUFVUQVVUIENUWCIpOwoJCQlicmVhazsKI2lmIGRlZmluZWQgKE1RUEFfT05MWV9NQ0EpCgkJY2FzZSBNUVBBX09OTFlfTUNBOgoJCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJQVVRBVVQgT05MWU1DQSIpOwoJCQlicmVhazsKI2VuZGlmCiNpZiBkZWZpbmVkIChNUVBBX0FMVEVSTkFURV9PUl9NQ0EpCgkJY2FzZSBNUVBBX0FMVEVSTkFURV9PUl9NQ0E6CgkJCXNwcmludGYoUGFybUJ1ZmZlciwgIlBVVEFVVCBBTFRNQ0EiKTsKCQkJYnJlYWs7CiNlbmRpZgoJCWRlZmF1bHQ6CgkJCXNwcmludGYoUGFybUJ1ZmZlciwgIlBVVEFVVCAlbGQ/IiwKCQkJCQlwQ2hsRGVmbi0+UHV0QXV0aG9yaXR5KTsKCQkJYnJlYWs7CgkJfS8qIEVuZCBzd2l0Y2gqLwoKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJQVVRBVVQgREVGIikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoJfQoKCWlmIChwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfQ0xOVENPTk4pIHsKCgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIlFNTkFNRSgnJXMnKSIsIHBDaGxEZWZuLT5RTWdyTmFtZSwKCQlNUV9RX01HUl9OQU1FX0xFTkdUSCwgb3B0aW9ucyk7CgkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiUU1OQU1FICcgJyIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCgl9CgoJLyogW3Y1MzBdIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHN0cmluZyAqLwoJLyogb3IgY2hhaW5lZCBleGl0cywgcGFzcyB0aGUgY29ycmVjdCBmbGFncyB0byBNUXNwcmludGZfWCAqLwoKCW9wdGlvbnNfZXhpdCA9IE1RU1BSSU5URl9YX05PX1RSQUlMSU5HX0JMQU5LUzsKCWlmICghb25lTGluZSkKCQlvcHRpb25zX2V4aXQgKz0gTVFTUFJJTlRGX1hfTElORV9CUkVBS1M7CgoJaWYgKCFwQ2hsRGVmbi0+UmVjZWl2ZVVzZXJEYXRhTGlzdEZsYWcpIHsKCQlvcHRpb25zX2V4aXQgKz0gTVFTUFJJTlRGX1hfRE9VQkxFX1FVT1RFUzsKCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiUkNWREFUQSAnJXMnIiwKCQkJCXBDaGxEZWZuLT5SZWNlaXZlVXNlckRhdGEsIE1RX0VYSVRfREFUQV9MRU5HVEgsIG9wdGlvbnNfZXhpdCk7Cgl9IGVsc2UgewoJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJSQ1ZEQVRBICVzIiwKCQkJCXBDaGxEZWZuLT5SZWNlaXZlVXNlckRhdGEsIE1RX1RPVEFMX0VYSVRfREFUQV9MRU5HVEgsCgkJCQlvcHRpb25zX2V4aXQpOwoJfQoJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiUkNWREFUQSAnICciKSA9PSAwKXsKCQlmcHV0cygiXG4iLGZwKTsKCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCX0KCS8qIFt2NTMwXSBEZXBlbmRpbmcgb24gd2hldGhlciB3ZSdyZSBkZWFsaW5nIHdpdGggYSAvNDAwICAgKi8KCS8qIG9yIGNoYWluZWQgZXhpdHMsIHBhc3MgdGhlIGNvcnJlY3QgZmxhZ3MgdG8gTVFzcHJpbnRmX1ggKi8KCW9wdGlvbnNfZXhpdCA9IDA7CglpZiAoIW9uZUxpbmUpCgkJb3B0aW9uc19leGl0ID0gTVFTUFJJTlRGX1hfTElORV9CUkVBS1M7CgkvKiBpZiAoTVFBVF9ERUZBVUxUICE9IE1RQVRfT1M0MDApICovCglpZiAocGxhdGZvcm0gIT0gTVFQTF9PUzQwMCkKCQlvcHRpb25zX2V4aXQgKz0gTVFTUFJJTlRGX1hfTk9fVFJBSUxJTkdfQkxBTktTOwoKCWlmICghcENobERlZm4tPlJlY2VpdmVFeGl0TGlzdEZsYWcpIHsKCQlvcHRpb25zX2V4aXQgKz0gTVFTUFJJTlRGX1hfRE9VQkxFX1FVT1RFUzsKCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiUkNWRVhJVCAnJXMnIiwgcENobERlZm4tPlJlY2VpdmVFeGl0LAoJCU1RX0VYSVRfTkFNRV9MRU5HVEgsIG9wdGlvbnNfZXhpdCk7Cgl9IGVsc2UgewoJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJSQ1ZFWElUICVzIiwgcENobERlZm4tPlJlY2VpdmVFeGl0LAoJCU1RX1RPVEFMX0VYSVRfTkFNRV9MRU5HVEgsIG9wdGlvbnNfZXhpdCk7Cgl9CglpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJSQ1ZFWElUICcgJyIpID09IDApewoJCWZwdXRzKCJcbiIsZnApOwoJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJfQoKCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJTQ1lEQVRBICclcyciLAoJCQlwQ2hsRGVmbi0+U2VjdXJpdHlVc2VyRGF0YSwgTVFfRVhJVF9EQVRBX0xFTkdUSCwgb3B0aW9ucyk7CglpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJTQ1lEQVRBICcgJyIpID09IDApewoJCWZwdXRzKCJcbiIsZnApOwoJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJfQoKCS8qIFt2NTMwXSBEZXBlbmRpbmcgb24gd2hldGhlciB3ZSdyZSBkZWFsaW5nIHdpdGggYSAvNDAwICAgKi8KCS8qIG9yIGNoYWluZWQgZXhpdHMsIHBhc3MgdGhlIGNvcnJlY3QgZmxhZ3MgdG8gTVFzcHJpbnRmX1ggKi8KCW9wdGlvbnNfZXhpdCA9IE1RU1BSSU5URl9YX0RPVUJMRV9RVU9URVM7CglpZiAoIW9uZUxpbmUpCgkJb3B0aW9uc19leGl0ICs9IE1RU1BSSU5URl9YX0xJTkVfQlJFQUtTOwoJLyogaWYgKE1RQVRfREVGQVVMVCAhPSBNUUFUX09TNDAwKSAqLwoJaWYgKHBsYXRmb3JtICE9IE1RUExfT1M0MDApCgkJb3B0aW9uc19leGl0ICs9IE1RU1BSSU5URl9YX05PX1RSQUlMSU5HX0JMQU5LUzsKCglNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiU0NZRVhJVCAnJXMnIiwgcENobERlZm4tPlNlY3VyaXR5RXhpdCwKCU1RX0VYSVRfTkFNRV9MRU5HVEgsIG9wdGlvbnNfZXhpdCk7CglpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJTQ1lFWElUICcgJyIpID09IDApewoJCWZwdXRzKCJcbiIsZnApOwoJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJfQoKCS8qIFt2NTMwXSBEZXBlbmRpbmcgb24gd2hldGhlciB3ZSdyZSBkZWFsaW5nIHdpdGggYSBzdHJpbmcgKi8KCS8qIG9yIGNoYWluZWQgZXhpdHMsIHBhc3MgdGhlIGNvcnJlY3QgZmxhZ3MgdG8gTVFzcHJpbnRmX1ggKi8KCglvcHRpb25zX2V4aXQgPSBNUVNQUklOVEZfWF9OT19UUkFJTElOR19CTEFOS1M7CglpZiAoIW9uZUxpbmUpCgkJb3B0aW9uc19leGl0ICs9IE1RU1BSSU5URl9YX0xJTkVfQlJFQUtTOwoKCWlmICghcENobERlZm4tPlNlbmRVc2VyRGF0YUxpc3RGbGFnKSB7CgkJb3B0aW9uc19leGl0ICs9IE1RU1BSSU5URl9YX0RPVUJMRV9RVU9URVM7CgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIlNFTkREQVRBICclcyciLAoJCQkJcENobERlZm4tPlNlbmRVc2VyRGF0YSwgTVFfRVhJVF9EQVRBX0xFTkdUSCwgb3B0aW9uc19leGl0KTsKCX0gZWxzZSB7CgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIlNFTkREQVRBICVzIiwgcENobERlZm4tPlNlbmRVc2VyRGF0YSwKCQlNUV9UT1RBTF9FWElUX0RBVEFfTEVOR1RILCBvcHRpb25zX2V4aXQpOwoJfQoJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiU0VORERBVEEgJyAnIikgPT0gMCl7CgkJZnB1dHMoIlxuIixmcCk7CgkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7Cgl9CgoJLyogW3Y1MzBdIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIC80MDAgICAqLwoJLyogb3IgY2hhaW5lZCBleGl0cywgcGFzcyB0aGUgY29ycmVjdCBmbGFncyB0byBNUXNwcmludGZfWCAqLwoJb3B0aW9uc19leGl0ID0gMDsKCWlmICghb25lTGluZSkKCQlvcHRpb25zX2V4aXQgPSBNUVNQUklOVEZfWF9MSU5FX0JSRUFLUzsKCS8qIGlmIChNUUFUX0RFRkFVTFQgIT0gTVFBVF9PUzQwMCkgKi8KCWlmIChwbGF0Zm9ybSAhPSBNUVBMX09TNDAwKQoJCW9wdGlvbnNfZXhpdCArPSBNUVNQUklOVEZfWF9OT19UUkFJTElOR19CTEFOS1M7CgoJaWYgKCFwQ2hsRGVmbi0+U2VuZEV4aXRMaXN0RmxhZykgewoJCW9wdGlvbnNfZXhpdCArPSBNUVNQUklOVEZfWF9ET1VCTEVfUVVPVEVTOwoJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJTRU5ERVhJVCAnJXMnIiwgcENobERlZm4tPlNlbmRFeGl0LAoJCU1RX0VYSVRfTkFNRV9MRU5HVEgsIG9wdGlvbnNfZXhpdCk7Cgl9IGVsc2UgewoJCU1Rc3ByaW50Zl9YKFBhcm1CdWZmZXIsICJTRU5ERVhJVCAlcyIsIHBDaGxEZWZuLT5TZW5kRXhpdCwKCQlNUV9UT1RBTF9FWElUX05BTUVfTEVOR1RILCBvcHRpb25zX2V4aXQpOwoJfQoJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiU0VOREVYSVQgJyAnIikgPT0gMCl7CgkJZnB1dHMoIlxuIixmcCk7CgkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7Cgl9CgoJaWYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TRU5ERVIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlCgkJCT09IE1RQ0hUX1NFUlZFUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfUkVDRUlWRVIKCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1JFUVVFU1RFUgojaWYgZGVmaW5lZCAoTVFDSFRfQ0xVU1NEUikKCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX0NMVVNTRFIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlCgkJCT09IE1RQ0hUX0NMVVNSQ1ZSCiNlbmRpZgoJKSB7CgoJCXNwcmludGYoUGFybUJ1ZmZlciwgIlNFUVdSQVAgJWxkIiwgcENobERlZm4tPlNlcU51bWJlcldyYXApOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIlNFUVdSQVAgOTk5OTk5OTk5IikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCX0KCgkvKiBpZiAoTVFBVF9ERUZBVUxUICE9IE1RQVRfT1M0MDAgJiYgKCAqLwoJaWYgKHBsYXRmb3JtICE9IE1RUExfT1M0MDAgJiYgcGxhdGZvcm0gIT0gTVFQTF9NVlMKCQkJJiYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TRU5ERVIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlCgkJCQkJPT0gTVFDSFRfUkVRVUVTVEVSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQkJCT09IE1RQ0hUX0NMTlRDT05OIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TRVJWRVIKI2lmIGRlZmluZWQgKE1RQ0hUX0NMVVNTRFIpCgkJCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX0NMVVNTRFIKI2VuZGlmCgkJCSkpIHsKCgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIlVTRVJJRCAnJXMnIiwKCQkJCXBDaGxEZWZuLT5Vc2VySWRlbnRpZmllciwgTVFfVVNFUl9JRF9MRU5HVEgsIG9wdGlvbnMpOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIlVTRVJJRCAnICciKSA9PSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9Cgl9CgoJaWYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TRU5ERVIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlCgkJCT09IE1RQ0hUX1NFUlZFUikgewoKCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiWE1JVFEgJyVzJyIsIHBDaGxEZWZuLT5YbWl0UU5hbWUsCgkJTVFfUV9OQU1FX0xFTkdUSCwgb3B0aW9ucyk7CgkJZnB1dHMoIlxuIixmcCk7CgkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgoJfQoKCS8qIFtWNTIwXSBJbmNsdWRlIFRhbmRlbSBOU0sgY2hhbm5lbCBzdHRyaWJ1dGUgKi8KI2lmZGVmIE1RSUFDSF9JTkhJQklUX0FVVE9TVEFSVAoJaWYgKCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfU0VSVkVSCgkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9SRVFVRVNURVIKCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NWUkNPTk4KCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1JFQ0VJVkVSCgkpIHsKCQlpZiAoIHBDaGxEZWZuLT5JbmhpYml0QXV0b3N0YXJ0ID09IE1RQ0ZDX0FVVE9TVEFSVF9BTExPV0VEKSB7CgkJCXNwcmludGYoIFBhcm1CdWZmZXIsICIgICAgICAgQVVUT1NUQVJUKEVOQUJMRUQpICVzIiAsIGxpbmVUZXJtICk7CgkJCS8vZnB1dHMoIFBhcm1CdWZmZXIsIGZwICk7CgkJfSBlbHNlIHsKCQkJc3ByaW50ZiggUGFybUJ1ZmZlciwgIiAgICAgICBBVVRPU1RBUlQoRElTQUJMRUQpICVzIiAsIGxpbmVUZXJtICk7CgkJCS8vZnB1dHMoIFBhcm1CdWZmZXIsIGZwICk7CgkJfSAvKiBlbmRpZiAqLwoJfQojZW5kaWYKCgkvKiBbVjUzMF0gSW5jbHVkZSBTU0wgQ2xpZW50IEF1dGggQXR0cmlidXRlIGZvciByZWNlaXZpbmcgdHlwZSBjaGxzICovCiNpZmRlZiBNUUlBQ0hfU1NMX0NMSUVOVF9BVVRICglpZiAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFUlZFUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfUkVRVUVTVEVSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TVlJDT05OCgkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9DTFVTUkNWUiB8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfUkVDRUlWRVIpIHsKCQlpZiAoVXNlclZlcnNpb24gPj0gTVFDTURMX0xFVkVMXzUzMCkgewoJCQlpZiAocENobERlZm4tPlNzbENBdXRoKSB7CgkJCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJTU0xDQVVUSCBPUFRJT05BTCIpOwoJCQl9IGVsc2UgewoJCQkJc3ByaW50ZihQYXJtQnVmZmVyLCAiU1NMQ0FVVEggUkVRVUlSRUQiKTsKCQkJfSAvKiBlbmRpZiAqLwoJCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJTU0xDQVVUSCBSRVFVSVJFRCIpID09IDApewoJCQkJZnB1dHMoIlxuIixmcCk7CgkJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCQl9CgkJfQoJfQojZW5kaWYKCgkvKiBbdjUzMF0gYWxsIGNoYW5uZWwgdHlwZXMgZ2V0IFNTTENJUEggYW5kIFNTTFBFRVIgKi8KI2lmIGRlZmluZWQgKE1RQ0FDSF9TU0xfUEVFUl9OQU1FKQoKCWlmIChVc2VyVmVyc2lvbj49TVFDTURMX0xFVkVMXzUzMCkgewoKCQlNUXNwcmludGZfWChQYXJtQnVmZmVyLCAiU1NMQ0lQSCAnJXMnIiwgcENobERlZm4tPlNzbENpcGhlciwKCQlNUV9TU0xfQ0lQSEVSX1NQRUNfTEVOR1RILCBvcHRpb25zKTsKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJTU0xDSVBIICcgJyIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIlNTTFBFRVIgJyVzJyIsIHBDaGxEZWZuLT5Tc2xQZWVyLAoJCU1RX1NTTF9QRUVSX05BTUVfTEVOR1RILCBvcHRpb25zKTsKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJTU0xQRUVSICcgJyIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCgl9CiNlbmRpZgoKCS8qIFt2NTMxYl0gY3NkMDEgb24gdjUuMyBhZGRzIEtBSU5UIHRvIG1xc2MgKi8KI2lmIGRlZmluZWQgKE1RSUFDSF9LRUVQX0FMSVZFX0lOVEVSVkFMKQoJaWYgKFVzZXJWZXJzaW9uPj1NUUNNRExfTEVWRUxfNTMwKSB7CgkJaWYgKHBDaGxEZWZuLT5LQUludCAhPSAtOTk5KSB7IC8qIC05OTkgbWVhbnMgd2UgbmV2ZXIgZ290IGl0IGZyb20gbXFzYyAqLwoJCQlpZiAocENobERlZm4tPktBSW50ID09IC0xKSB7CgkJCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJLQUlOVCBBVVRPIik7CgkJCX0gZWxzZSB7CgkJCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJLQUlOVCAlbGQiLCBwQ2hsRGVmbi0+S0FJbnQpOwoJCQl9CgkJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIktBSU5UIEFVVE8iKSA9PSAwKXsKCQkJCWZwdXRzKCJcbiIsZnApOwoJCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQkJfQoJCQlwQ2hsRGVmbiAtPiBLQUludCA9IC05OTk7IC8qIHNwZWNpYWwgdmFsdWUgdG8gaW5kaWNhdGUgbm90IHRvIHNldCBLQUlOVCAqLwoJCX0KCX0KI2VuZGlmCgojaWZkZWYgenpNUVY2MAoKCWlmIChVc2VyVmVyc2lvbiA+PSBNUUNNRExfTEVWRUxfNjAwICYmIChwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfU0VOREVSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TRVJWRVIKCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1JFQ0VJVkVSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQk9PSBNUUNIVF9SRVFVRVNURVIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NWUkNPTk4KCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX0NMVVNTRFIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlCgkJCT09IE1RQ0hUX0NMVVNSQ1ZSICkpIHsKCQl0b1N0ck1RTU9OKChjaGFyKikmd29yaywgcENobERlZm4tPk1vbkNobCk7CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiTU9OQ0hMICVzIiwgd29yayk7CgkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiTU9OQ0hMIFFNR1IiKSA9PSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9CgoJfQoJaWYgKFVzZXJWZXJzaW9uID49IE1RQ01ETF9MRVZFTF82MDAgJiYgcGxhdGZvcm0gIT0gTVFQTF9NVlMKCQkJJiYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TRU5ERVIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlCgkJCQkJPT0gTVFDSFRfU0VSVkVSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9SRUNFSVZFUgoJCQkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9SRVFVRVNURVIKCQkJCQl8fCBwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfQ0xVU1NEUgoJCQkJCXx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9DTFVTUkNWUiApKSB7CgkJdG9TdHJNUU1PTigoY2hhciopJndvcmssIHBDaGxEZWZuLT5TdGF0c0NobCk7CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiU1RBVENITCAlcyIsIHdvcmspOwoJCWlmICggc3RyY21wKFBhcm1CdWZmZXIsIlNUQVRDSEwgUU1HUiIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCgl9CgoJaWYgKFVzZXJWZXJzaW9uID49IE1RQ01ETF9MRVZFTF82MDAgJiYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQk9PSBNUUNIVF9DTFVTU0RSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9DTFVTUkNWUiApKSB7CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiQ0xXTFBSVFkgJWxkIiwgcENobERlZm4tPlByaW9yaXR5KTsKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJDTFdMUFJUWSAwIikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJDTFdMUkFOSyAlbGQiLCBwQ2hsRGVmbi0+UmFuayk7CgkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiQ0xXTFJBTksgMCIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiQ0xXTFdHSFQgJWxkIiwgcENobERlZm4tPldlaWdodCk7CgkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiQ0xXTFdHSFQgNTAiKSA9PSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9CgoJfQoKCWlmIChVc2VyVmVyc2lvbiA+PSBNUUNNRExfTEVWRUxfNjAwKSB7CgkJdG9TdHJNUUNvbXAoKGNoYXIqKXdvcmssIHBDaGxEZWZuLT5Nc2dDb21wKTsKCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJDT01QTVNHICVzIiwgd29yayk7CgkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiQ09NUE1TRyBOT05FIikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoKCQl0b1N0ck1RQ29tcCgoY2hhciopd29yaywgcENobERlZm4tPkhkckNvbXApOwoJCXNwcmludGYoUGFybUJ1ZmZlciwgIkNPTVBIRFIgJXMiLCB3b3JrKTsKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJDT01QSERSIE5PTkUiKSA9PSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9Cgl9CgojZW5kaWYKI2lmZGVmIHp6TVFWNzAKaWYgKCBVc2VyVmVyc2lvbiA+PSBNUUNNRExfTEVWRUxfNzAwKSB7CglpZiAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX0NMVVNTRFIgfHwgcENobERlZm4tPkNoYW5uZWxUeXBlCgkJCT09IE1RQ0hUX0NMVVNSQ1ZSIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9TRU5ERVIKCQkJfHwgcENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFUlZFUikgewoJCXN3aXRjaCAocENobERlZm4tPlByb3BDbnRsKSB7CgkJY2FzZSBNUVBST1BfQ09NUEFUSUJJTElUWToKCQkJc3ByaW50ZihQYXJtQnVmZmVyLCAiUFJPUENUTCBDT01QQVQiKTsKCQkJLy9mcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJCWJyZWFrOwoJCWNhc2UgTVFQUk9QX05PTkU6CgkJCXNwcmludGYoUGFybUJ1ZmZlciwgIlBST1BDVEwgTk9ORSIpOwoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCQlicmVhazsKCQljYXNlIE1RUFJPUF9BTEw6CgkJCXNwcmludGYoUGFybUJ1ZmZlciwgIlBST1BDVEwgQUxMIik7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJCWJyZWFrOwoJCX0KCX0KCglpZiAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX0NMTlRDT05OIHx8IHBDaGxEZWZuLT5DaGFubmVsVHlwZQoJCQk9PSBNUUNIVF9TVlJDT05OKSB7CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiU0hBUkVDTlYgJWxkIiwgcENobERlZm4tPlNoYXJlQ252KTsKCQlpZiAoIHN0cmNtcChQYXJtQnVmZmVyLCJTSEFSRUNOViAxMCIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCX0KCglpZiAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NWUkNPTk4pIHsKCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJNQVhJTlNUICVsZCIsIHBDaGxEZWZuLT5NYXhJbnN0cyk7CgkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiTUFYSU5TVCA5OTk5OTk5OTkiKSA9PSAwKXsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQl9CgkJc3ByaW50ZihQYXJtQnVmZmVyLCAiTUFYSU5TVEMgJWxkIiwgcENobERlZm4tPk1heEluc3RzQyk7CgkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiTUFYSU5TVEMgOTk5OTk5OTk5IikgPT0gMCl7CgkJCWZwdXRzKCJcbiIsZnApOwoJCQlmcHV0cyhjb25fcHJldGV4dCwgZnApOwoJCQlmcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJfQoJfQoKCWlmIChwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfQ0xOVENPTk4pIHsKCQlzd2l0Y2ggKHBDaGxEZWZuLT5BZmZpbml0eSkgewoJCWNhc2UgTVFDQUZUWV9QUkVGRVJSRUQ6CgkJCXNwcmludGYoUGFybUJ1ZmZlciwgIkFGRklOSVRZIFBSRUZFUlJFRCIpOwoJCQkvL2ZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQkJYnJlYWs7CgkJY2FzZSBNUUNBRlRZX05PTkU6CgkJCXNwcmludGYoUGFybUJ1ZmZlciwgIkFGRklOSVRZIE5PTkUiKTsKCQkJZnB1dHMoIlxuIixmcCk7CgkJCWZwdXRzKGNvbl9wcmV0ZXh0LCBmcCk7CgkJCWZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQkJYnJlYWs7CgkJfQoJfQoKCWlmIChwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgIT0gTVFDSFRfQ0xOVENPTk4gJiYKCQlwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgIT0gTVFDSFRfQ0xVU1JDVlIgJiYKCQlwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgIT0gTVFDSFRfQ0xVU1NEUiApIHsKCQlzd2l0Y2ggKHBDaGxEZWZuLT5EZWZDRHNwKSB7CgkJY2FzZSBNUUNITERfUFJJVkFURToKCQkJc3ByaW50ZihQYXJtQnVmZmVyLCAiREVGQ0RJU1AoUFJJVkFURSIpOwoJCQkvL2ZwdXRzKFBhcm1CdWZmZXIsIGZwKTsKCQkJYnJlYWs7CgkJY2FzZSBNUUNITERfRklYU0hBUkVEOgoJCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJERUZDRElTUChGSVhTSEFSRUQiKTsKCQkJLy9mcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgkJCWJyZWFrOwoJCWNhc2UgTVFDSExEX1NIQVJFRDoKCQkJc3ByaW50ZihQYXJtQnVmZmVyLCAiREVGQ0RJU1AoU0hBUkVEIik7CgkJCS8vZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCQlicmVhazsKCQl9Cgl9CgoJaWYgKHBDaGxEZWZuLT5DaGFubmVsVHlwZSA9PSBNUUNIVF9DTE5UQ09OTikgewoJCXNwcmludGYoUGFybUJ1ZmZlciwgIkNMTlRXR0hUICVsZCIsIHBDaGxEZWZuLT5DbG50Q2hsV2dodCk7CgkJaWYgKCBzdHJjbXAoUGFybUJ1ZmZlciwiQ0xOVFdHSFQgMCIpID09IDApewoJCQlmcHV0cygiXG4iLGZwKTsKCQkJZnB1dHMoY29uX3ByZXRleHQsIGZwKTsKCQkJZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoJCX0KCX0KfQojZW5kaWYKI2lmIGRlZmluZWQoenp6T1MpCglpZiAocGxhdGZvcm0gPT0gTVFQTF9NVlMpIHsKCQl0b1N0clFTRygoY2hhciopJndvcmssIHBDaGxEZWZuLT5xc2dEaXNwKTsKCQlzcHJpbnRmKFBhcm1CdWZmZXIsICJRU0dESVNQKCVzIiwgd29yayk7CgkJLy9mcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgoJfQojZW5kaWYKCglzcHJpbnRmKFBhcm1CdWZmZXIsICJSRVBMQUNFXG4iKTsKCS8vZnB1dHMoUGFybUJ1ZmZlciwgZnApOwoKCS8qIHY1MTIgLS0gaWYgLVIgc3BlY2lmaWVkLCB0aGVuIGNyZWF0ZSAicmVzZXQiIGNvbW1hbmRzICovCgkvKiB2NjAzIC0tIGNvbnRyb2wgZGlmZmVyZW50IGNoYW5uZWwgdHlwZXMgdmlhIGNvbW1hbmQgbGluZSBzd2l0Y2ggKi8KCWlmICggKCAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFTkRFUikgJiYgKGNobFJlc2V0ICYgQ0hMUl9TRU5ERVIpICkKCQkJfHwgKCAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX1NFUlZFUikgJiYgKGNobFJlc2V0CgkJCQkJJiBDSExSX1NFUlZFUiApICkgfHwgKCAocENobERlZm4tPkNoYW5uZWxUeXBlCgkJCT09IE1RQ0hUX1JFQ0VJVkVSKSAmJiAoY2hsUmVzZXQgJiBDSExSX1JFQ0VJVkVSICkgKQoJCQl8fCAoIChwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUgPT0gTVFDSFRfUkVRVUVTVEVSKSAmJiAoY2hsUmVzZXQKCQkJCQkmIENITFJfUkVRVUVTVEVSICkgKQojaWYgZGVmaW5lZCAoTVFDSFRfQ0xVU1NEUikKCQkJfHwgKCAocENobERlZm4tPkNoYW5uZWxUeXBlID09IE1RQ0hUX0NMVVNTRFIpICYmIChjaGxSZXNldAoJCQkJCSYgQ0hMUl9DTFVTU0RSICkgKSB8fCAoIChwQ2hsRGVmbi0+Q2hhbm5lbFR5cGUKCQkJPT0gTVFDSFRfQ0xVU1JDVlIpICYmIChjaGxSZXNldCAmIENITFJfQ0xVU1JDVlIgKSApCiNlbmRpZgoJKSB7CgkJTVFzcHJpbnRmX1goUGFybUJ1ZmZlciwgIlJFU0VUIENIQU5ORUwgKCclcycpIFNFUU5VTSgxKVxuIiwKCQkJCXBDaGxEZWZuLT5DaGFubmVsTmFtZSwgTVFfQ0hBTk5FTF9OQU1FX0xFTkdUSCwKCQkJCU1RU1BSSU5URl9YX05PX1RSQUlMSU5HX0JMQU5LUyk7CgkJLy9mcHV0cyhQYXJtQnVmZmVyLCBmcCk7CgoJCWlmICghb25lTGluZSkKCQkJZnB1dHMoIlxuIiwgZnApOwoKCX0KCWZyZWUoY29uX3ByZXRleHQpOwoJZnJlZShQYXJtQnVmZmVyKTsKCXJldHVybjsKfQo=