Support Role-Based Access Control II (#18528)

Signed-off-by: SimFG <bang.fu@zilliz.com>
pull/18562/head
SimFG 2022-08-05 16:28:35 +08:00 committed by GitHub
parent b427450593
commit c267ad612d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 1111 additions and 851 deletions

View File

@ -308,6 +308,7 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_common_2eproto::offsets[] PROT
PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_type_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_privilege_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_name_index_),
PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_name_indexs_),
};
static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
{ 0, -1, sizeof(::milvus::proto::common::Status)},
@ -356,107 +357,118 @@ const char descriptor_table_protodef_common_2eproto[] PROTOBUF_SECTION_VARIABLE(
"*\n\004base\030\001 \001(\0132\034.milvus.proto.common.MsgB"
"ase\"M\n\014DMLMsgHeader\022*\n\004base\030\001 \001(\0132\034.milv"
"us.proto.common.MsgBase\022\021\n\tshardName\030\002 \001"
"(\t\"\237\001\n\014PrivilegeExt\0224\n\013object_type\030\001 \001(\016"
"(\t\"\273\001\n\014PrivilegeExt\0224\n\013object_type\030\001 \001(\016"
"2\037.milvus.proto.common.ObjectType\022>\n\020obj"
"ect_privilege\030\002 \001(\0162$.milvus.proto.commo"
"n.ObjectPrivilege\022\031\n\021object_name_index\030\003"
" \001(\005*\323\010\n\tErrorCode\022\013\n\007Success\020\000\022\023\n\017Unexp"
"ectedError\020\001\022\021\n\rConnectFailed\020\002\022\024\n\020Permi"
"ssionDenied\020\003\022\027\n\023CollectionNotExists\020\004\022\023"
"\n\017IllegalArgument\020\005\022\024\n\020IllegalDimension\020"
"\007\022\024\n\020IllegalIndexType\020\010\022\031\n\025IllegalCollec"
"tionName\020\t\022\017\n\013IllegalTOPK\020\n\022\024\n\020IllegalRo"
"wRecord\020\013\022\023\n\017IllegalVectorID\020\014\022\027\n\023Illega"
"lSearchResult\020\r\022\020\n\014FileNotFound\020\016\022\016\n\nMet"
"aFailed\020\017\022\017\n\013CacheFailed\020\020\022\026\n\022CannotCrea"
"teFolder\020\021\022\024\n\020CannotCreateFile\020\022\022\026\n\022Cann"
"otDeleteFolder\020\023\022\024\n\020CannotDeleteFile\020\024\022\023"
"\n\017BuildIndexError\020\025\022\020\n\014IllegalNLIST\020\026\022\025\n"
"\021IllegalMetricType\020\027\022\017\n\013OutOfMemory\020\030\022\021\n"
"\rIndexNotExist\020\031\022\023\n\017EmptyCollection\020\032\022\033\n"
"\027UpdateImportTaskFailure\020\033\022\032\n\026Collection"
"NameNotFound\020\034\022\033\n\027CreateCredentialFailur"
"e\020\035\022\033\n\027UpdateCredentialFailure\020\036\022\033\n\027Dele"
"teCredentialFailure\020\037\022\030\n\024GetCredentialFa"
"ilure\020 \022\030\n\024ListCredUsersFailure\020!\022\022\n\016Get"
"UserFailure\020\"\022\025\n\021CreateRoleFailure\020#\022\023\n\017"
"DropRoleFailure\020$\022\032\n\026OperateUserRoleFail"
"ure\020%\022\025\n\021SelectRoleFailure\020&\022\025\n\021SelectUs"
"erFailure\020\'\022\031\n\025SelectResourceFailure\020(\022\033"
"\n\027OperatePrivilegeFailure\020)\022\026\n\022SelectGra"
"ntFailure\020*\022!\n\035RefreshPolicyInfoCacheFai"
"lure\020+\022\025\n\021ListPolicyFailure\020,\022\022\n\016NotShar"
"dLeader\020-\022\026\n\022NoReplicaAvailable\020.\022\023\n\017Seg"
"mentNotFound\020/\022\022\n\rDDRequestRace\020\350\007*X\n\nIn"
"dexState\022\022\n\016IndexStateNone\020\000\022\014\n\010Unissued"
"\020\001\022\016\n\nInProgress\020\002\022\014\n\010Finished\020\003\022\n\n\006Fail"
"ed\020\004*\202\001\n\014SegmentState\022\024\n\020SegmentStateNon"
"e\020\000\022\014\n\010NotExist\020\001\022\013\n\007Growing\020\002\022\n\n\006Sealed"
"\020\003\022\013\n\007Flushed\020\004\022\014\n\010Flushing\020\005\022\013\n\007Dropped"
"\020\006\022\r\n\tImporting\020\007*>\n\017PlaceholderType\022\010\n\004"
"None\020\000\022\020\n\014BinaryVector\020d\022\017\n\013FloatVector\020"
"e*\266\014\n\007MsgType\022\r\n\tUndefined\020\000\022\024\n\020CreateCo"
"llection\020d\022\022\n\016DropCollection\020e\022\021\n\rHasCol"
"lection\020f\022\026\n\022DescribeCollection\020g\022\023\n\017Sho"
"wCollections\020h\022\024\n\020GetSystemConfigs\020i\022\022\n\016"
"LoadCollection\020j\022\025\n\021ReleaseCollection\020k\022"
"\017\n\013CreateAlias\020l\022\r\n\tDropAlias\020m\022\016\n\nAlter"
"Alias\020n\022\024\n\017CreatePartition\020\310\001\022\022\n\rDropPar"
"tition\020\311\001\022\021\n\014HasPartition\020\312\001\022\026\n\021Describe"
"Partition\020\313\001\022\023\n\016ShowPartitions\020\314\001\022\023\n\016Loa"
"dPartitions\020\315\001\022\026\n\021ReleasePartitions\020\316\001\022\021"
"\n\014ShowSegments\020\372\001\022\024\n\017DescribeSegment\020\373\001\022"
"\021\n\014LoadSegments\020\374\001\022\024\n\017ReleaseSegments\020\375\001"
"\022\024\n\017HandoffSegments\020\376\001\022\030\n\023LoadBalanceSeg"
"ments\020\377\001\022\025\n\020DescribeSegments\020\200\002\022\020\n\013Creat"
"eIndex\020\254\002\022\022\n\rDescribeIndex\020\255\002\022\016\n\tDropInd"
"ex\020\256\002\022\013\n\006Insert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n\005Flush"
"\020\222\003\022\027\n\022ResendSegmentStats\020\223\003\022\013\n\006Search\020\364"
"\003\022\021\n\014SearchResult\020\365\003\022\022\n\rGetIndexState\020\366\003"
"\022\032\n\025GetIndexBuildProgress\020\367\003\022\034\n\027GetColle"
"ctionStatistics\020\370\003\022\033\n\026GetPartitionStatis"
"tics\020\371\003\022\r\n\010Retrieve\020\372\003\022\023\n\016RetrieveResult"
"\020\373\003\022\024\n\017WatchDmChannels\020\374\003\022\025\n\020RemoveDmCha"
"nnels\020\375\003\022\027\n\022WatchQueryChannels\020\376\003\022\030\n\023Rem"
"oveQueryChannels\020\377\003\022\035\n\030SealedSegmentsCha"
"ngeInfo\020\200\004\022\027\n\022WatchDeltaChannels\020\201\004\022\024\n\017G"
"etShardLeaders\020\202\004\022\020\n\013GetReplicas\020\203\004\022\020\n\013S"
"egmentInfo\020\330\004\022\017\n\nSystemInfo\020\331\004\022\024\n\017GetRec"
"overyInfo\020\332\004\022\024\n\017GetSegmentState\020\333\004\022\r\n\010Ti"
"meTick\020\260\t\022\023\n\016QueryNodeStats\020\261\t\022\016\n\tLoadIn"
"dex\020\262\t\022\016\n\tRequestID\020\263\t\022\017\n\nRequestTSO\020\264\t\022"
"\024\n\017AllocateSegment\020\265\t\022\026\n\021SegmentStatisti"
"cs\020\266\t\022\025\n\020SegmentFlushDone\020\267\t\022\017\n\nDataNode"
"Tt\020\270\t\022\025\n\020CreateCredential\020\334\013\022\022\n\rGetCrede"
"ntial\020\335\013\022\025\n\020DeleteCredential\020\336\013\022\025\n\020Updat"
"eCredential\020\337\013\022\026\n\021ListCredUsernames\020\340\013\022\017"
"\n\nCreateRole\020\300\014\022\r\n\010DropRole\020\301\014\022\024\n\017Operat"
"eUserRole\020\302\014\022\017\n\nSelectRole\020\303\014\022\017\n\nSelectU"
"ser\020\304\014\022\023\n\016SelectResource\020\305\014\022\025\n\020OperatePr"
"ivilege\020\306\014\022\020\n\013SelectGrant\020\307\014\022\033\n\026RefreshP"
"olicyInfoCache\020\310\014\022\017\n\nListPolicy\020\311\014*\"\n\007Ds"
"lType\022\007\n\003Dsl\020\000\022\016\n\nBoolExprV1\020\001*B\n\017Compac"
"tionState\022\021\n\rUndefiedState\020\000\022\r\n\tExecutin"
"g\020\001\022\r\n\tCompleted\020\002*X\n\020ConsistencyLevel\022\n"
"\n\006Strong\020\000\022\013\n\007Session\020\001\022\013\n\007Bounded\020\002\022\016\n\n"
"Eventually\020\003\022\016\n\nCustomized\020\004*\257\001\n\013ImportS"
"tate\022\021\n\rImportPending\020\000\022\020\n\014ImportFailed\020"
"\001\022\021\n\rImportStarted\020\002\022\024\n\020ImportDownloaded"
"\020\003\022\020\n\014ImportParsed\020\004\022\023\n\017ImportPersisted\020"
"\005\022\023\n\017ImportCompleted\020\006\022\026\n\022ImportAllocSeg"
"ment\020\n*(\n\nObjectType\022\016\n\nCollection\020\000\022\n\n\006"
"Global\020\001*\212\002\n\017ObjectPrivilege\022\020\n\014Privileg"
"eAll\020\000\022\035\n\031PrivilegeCreateCollection\020\001\022\033\n"
"\027PrivilegeDropCollection\020\002\022\037\n\033PrivilegeD"
"escribeCollection\020\003\022\034\n\030PrivilegeShowColl"
"ections\020\004\022\021\n\rPrivilegeLoad\020\005\022\024\n\020Privileg"
"eRelease\020\006\022\027\n\023PrivilegeCompaction\020\007\022\023\n\017P"
"rivilegeInsert\020\010\022\023\n\017PrivilegeDelete\020\t:^\n"
"\021privilege_ext_obj\022\037.google.protobuf.Mes"
"sageOptions\030\351\007 \001(\0132!.milvus.proto.common"
".PrivilegeExtBW\n\016io.milvus.grpcB\013CommonP"
"rotoP\001Z3github.com/milvus-io/milvus/inte"
"rnal/proto/commonpb\240\001\001b\006proto3"
" \001(\005\022\032\n\022object_name_indexs\030\004 \001(\005*\323\010\n\tErr"
"orCode\022\013\n\007Success\020\000\022\023\n\017UnexpectedError\020\001"
"\022\021\n\rConnectFailed\020\002\022\024\n\020PermissionDenied\020"
"\003\022\027\n\023CollectionNotExists\020\004\022\023\n\017IllegalArg"
"ument\020\005\022\024\n\020IllegalDimension\020\007\022\024\n\020Illegal"
"IndexType\020\010\022\031\n\025IllegalCollectionName\020\t\022\017"
"\n\013IllegalTOPK\020\n\022\024\n\020IllegalRowRecord\020\013\022\023\n"
"\017IllegalVectorID\020\014\022\027\n\023IllegalSearchResul"
"t\020\r\022\020\n\014FileNotFound\020\016\022\016\n\nMetaFailed\020\017\022\017\n"
"\013CacheFailed\020\020\022\026\n\022CannotCreateFolder\020\021\022\024"
"\n\020CannotCreateFile\020\022\022\026\n\022CannotDeleteFold"
"er\020\023\022\024\n\020CannotDeleteFile\020\024\022\023\n\017BuildIndex"
"Error\020\025\022\020\n\014IllegalNLIST\020\026\022\025\n\021IllegalMetr"
"icType\020\027\022\017\n\013OutOfMemory\020\030\022\021\n\rIndexNotExi"
"st\020\031\022\023\n\017EmptyCollection\020\032\022\033\n\027UpdateImpor"
"tTaskFailure\020\033\022\032\n\026CollectionNameNotFound"
"\020\034\022\033\n\027CreateCredentialFailure\020\035\022\033\n\027Updat"
"eCredentialFailure\020\036\022\033\n\027DeleteCredential"
"Failure\020\037\022\030\n\024GetCredentialFailure\020 \022\030\n\024L"
"istCredUsersFailure\020!\022\022\n\016GetUserFailure\020"
"\"\022\025\n\021CreateRoleFailure\020#\022\023\n\017DropRoleFail"
"ure\020$\022\032\n\026OperateUserRoleFailure\020%\022\025\n\021Sel"
"ectRoleFailure\020&\022\025\n\021SelectUserFailure\020\'\022"
"\031\n\025SelectResourceFailure\020(\022\033\n\027OperatePri"
"vilegeFailure\020)\022\026\n\022SelectGrantFailure\020*\022"
"!\n\035RefreshPolicyInfoCacheFailure\020+\022\025\n\021Li"
"stPolicyFailure\020,\022\022\n\016NotShardLeader\020-\022\026\n"
"\022NoReplicaAvailable\020.\022\023\n\017SegmentNotFound"
"\020/\022\022\n\rDDRequestRace\020\350\007*X\n\nIndexState\022\022\n\016"
"IndexStateNone\020\000\022\014\n\010Unissued\020\001\022\016\n\nInProg"
"ress\020\002\022\014\n\010Finished\020\003\022\n\n\006Failed\020\004*\202\001\n\014Seg"
"mentState\022\024\n\020SegmentStateNone\020\000\022\014\n\010NotEx"
"ist\020\001\022\013\n\007Growing\020\002\022\n\n\006Sealed\020\003\022\013\n\007Flushe"
"d\020\004\022\014\n\010Flushing\020\005\022\013\n\007Dropped\020\006\022\r\n\tImport"
"ing\020\007*>\n\017PlaceholderType\022\010\n\004None\020\000\022\020\n\014Bi"
"naryVector\020d\022\017\n\013FloatVector\020e*\266\014\n\007MsgTyp"
"e\022\r\n\tUndefined\020\000\022\024\n\020CreateCollection\020d\022\022"
"\n\016DropCollection\020e\022\021\n\rHasCollection\020f\022\026\n"
"\022DescribeCollection\020g\022\023\n\017ShowCollections"
"\020h\022\024\n\020GetSystemConfigs\020i\022\022\n\016LoadCollecti"
"on\020j\022\025\n\021ReleaseCollection\020k\022\017\n\013CreateAli"
"as\020l\022\r\n\tDropAlias\020m\022\016\n\nAlterAlias\020n\022\024\n\017C"
"reatePartition\020\310\001\022\022\n\rDropPartition\020\311\001\022\021\n"
"\014HasPartition\020\312\001\022\026\n\021DescribePartition\020\313\001"
"\022\023\n\016ShowPartitions\020\314\001\022\023\n\016LoadPartitions\020"
"\315\001\022\026\n\021ReleasePartitions\020\316\001\022\021\n\014ShowSegmen"
"ts\020\372\001\022\024\n\017DescribeSegment\020\373\001\022\021\n\014LoadSegme"
"nts\020\374\001\022\024\n\017ReleaseSegments\020\375\001\022\024\n\017HandoffS"
"egments\020\376\001\022\030\n\023LoadBalanceSegments\020\377\001\022\025\n\020"
"DescribeSegments\020\200\002\022\020\n\013CreateIndex\020\254\002\022\022\n"
"\rDescribeIndex\020\255\002\022\016\n\tDropIndex\020\256\002\022\013\n\006Ins"
"ert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n\005Flush\020\222\003\022\027\n\022Resen"
"dSegmentStats\020\223\003\022\013\n\006Search\020\364\003\022\021\n\014SearchR"
"esult\020\365\003\022\022\n\rGetIndexState\020\366\003\022\032\n\025GetIndex"
"BuildProgress\020\367\003\022\034\n\027GetCollectionStatist"
"ics\020\370\003\022\033\n\026GetPartitionStatistics\020\371\003\022\r\n\010R"
"etrieve\020\372\003\022\023\n\016RetrieveResult\020\373\003\022\024\n\017Watch"
"DmChannels\020\374\003\022\025\n\020RemoveDmChannels\020\375\003\022\027\n\022"
"WatchQueryChannels\020\376\003\022\030\n\023RemoveQueryChan"
"nels\020\377\003\022\035\n\030SealedSegmentsChangeInfo\020\200\004\022\027"
"\n\022WatchDeltaChannels\020\201\004\022\024\n\017GetShardLeade"
"rs\020\202\004\022\020\n\013GetReplicas\020\203\004\022\020\n\013SegmentInfo\020\330"
"\004\022\017\n\nSystemInfo\020\331\004\022\024\n\017GetRecoveryInfo\020\332\004"
"\022\024\n\017GetSegmentState\020\333\004\022\r\n\010TimeTick\020\260\t\022\023\n"
"\016QueryNodeStats\020\261\t\022\016\n\tLoadIndex\020\262\t\022\016\n\tRe"
"questID\020\263\t\022\017\n\nRequestTSO\020\264\t\022\024\n\017AllocateS"
"egment\020\265\t\022\026\n\021SegmentStatistics\020\266\t\022\025\n\020Seg"
"mentFlushDone\020\267\t\022\017\n\nDataNodeTt\020\270\t\022\025\n\020Cre"
"ateCredential\020\334\013\022\022\n\rGetCredential\020\335\013\022\025\n\020"
"DeleteCredential\020\336\013\022\025\n\020UpdateCredential\020"
"\337\013\022\026\n\021ListCredUsernames\020\340\013\022\017\n\nCreateRole"
"\020\300\014\022\r\n\010DropRole\020\301\014\022\024\n\017OperateUserRole\020\302\014"
"\022\017\n\nSelectRole\020\303\014\022\017\n\nSelectUser\020\304\014\022\023\n\016Se"
"lectResource\020\305\014\022\025\n\020OperatePrivilege\020\306\014\022\020"
"\n\013SelectGrant\020\307\014\022\033\n\026RefreshPolicyInfoCac"
"he\020\310\014\022\017\n\nListPolicy\020\311\014*\"\n\007DslType\022\007\n\003Dsl"
"\020\000\022\016\n\nBoolExprV1\020\001*B\n\017CompactionState\022\021\n"
"\rUndefiedState\020\000\022\r\n\tExecuting\020\001\022\r\n\tCompl"
"eted\020\002*X\n\020ConsistencyLevel\022\n\n\006Strong\020\000\022\013"
"\n\007Session\020\001\022\013\n\007Bounded\020\002\022\016\n\nEventually\020\003"
"\022\016\n\nCustomized\020\004*\257\001\n\013ImportState\022\021\n\rImpo"
"rtPending\020\000\022\020\n\014ImportFailed\020\001\022\021\n\rImportS"
"tarted\020\002\022\024\n\020ImportDownloaded\020\003\022\020\n\014Import"
"Parsed\020\004\022\023\n\017ImportPersisted\020\005\022\023\n\017ImportC"
"ompleted\020\006\022\026\n\022ImportAllocSegment\020\n*2\n\nOb"
"jectType\022\016\n\nCollection\020\000\022\n\n\006Global\020\001\022\010\n\004"
"User\020\002*\206\005\n\017ObjectPrivilege\022\020\n\014PrivilegeA"
"ll\020\000\022\035\n\031PrivilegeCreateCollection\020\001\022\033\n\027P"
"rivilegeDropCollection\020\002\022\037\n\033PrivilegeDes"
"cribeCollection\020\003\022\034\n\030PrivilegeShowCollec"
"tions\020\004\022\021\n\rPrivilegeLoad\020\005\022\024\n\020PrivilegeR"
"elease\020\006\022\027\n\023PrivilegeCompaction\020\007\022\023\n\017Pri"
"vilegeInsert\020\010\022\023\n\017PrivilegeDelete\020\t\022\032\n\026P"
"rivilegeGetStatistics\020\n\022\030\n\024PrivilegeCrea"
"teIndex\020\013\022\030\n\024PrivilegeIndexDetail\020\014\022\026\n\022P"
"rivilegeDropIndex\020\r\022\023\n\017PrivilegeSearch\020\016"
"\022\022\n\016PrivilegeFlush\020\017\022\022\n\016PrivilegeQuery\020\020"
"\022\030\n\024PrivilegeLoadBalance\020\021\022\023\n\017PrivilegeI"
"mport\020\022\022\034\n\030PrivilegeCreateOwnership\020\023\022\027\n"
"\023PrivilegeUpdateUser\020\024\022\032\n\026PrivilegeDropO"
"wnership\020\025\022\034\n\030PrivilegeSelectOwnership\020\026"
"\022\034\n\030PrivilegeManageOwnership\020\027\022\027\n\023Privil"
"egeSelectUser\020\030:^\n\021privilege_ext_obj\022\037.g"
"oogle.protobuf.MessageOptions\030\351\007 \001(\0132!.m"
"ilvus.proto.common.PrivilegeExtBW\n\016io.mi"
"lvus.grpcB\013CommonProtoP\001Z3github.com/mil"
"vus-io/milvus/internal/proto/commonpb\240\001\001"
"b\006proto3"
;
static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_common_2eproto_deps[1] = {
&::descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
@ -477,7 +489,7 @@ static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_com
static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_common_2eproto_once;
static bool descriptor_table_common_2eproto_initialized = false;
const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_common_2eproto = {
&descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 4750,
&descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 5168,
&descriptor_table_common_2eproto_once, descriptor_table_common_2eproto_sccs, descriptor_table_common_2eproto_deps, 11, 1,
schemas, file_default_instances, TableStruct_common_2eproto::offsets,
file_level_metadata_common_2eproto, 11, file_level_enum_descriptors_common_2eproto, file_level_service_descriptors_common_2eproto,
@ -763,6 +775,7 @@ bool ObjectType_IsValid(int value) {
switch (value) {
case 0:
case 1:
case 2:
return true;
default:
return false;
@ -785,6 +798,21 @@ bool ObjectPrivilege_IsValid(int value) {
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
return true;
default:
return false;
@ -3948,15 +3976,15 @@ PrivilegeExt::PrivilegeExt(const PrivilegeExt& from)
_internal_metadata_(nullptr) {
_internal_metadata_.MergeFrom(from._internal_metadata_);
::memcpy(&object_type_, &from.object_type_,
static_cast<size_t>(reinterpret_cast<char*>(&object_name_index_) -
reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_index_));
static_cast<size_t>(reinterpret_cast<char*>(&object_name_indexs_) -
reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_indexs_));
// @@protoc_insertion_point(copy_constructor:milvus.proto.common.PrivilegeExt)
}
void PrivilegeExt::SharedCtor() {
::memset(&object_type_, 0, static_cast<size_t>(
reinterpret_cast<char*>(&object_name_index_) -
reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_index_));
reinterpret_cast<char*>(&object_name_indexs_) -
reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_indexs_));
}
PrivilegeExt::~PrivilegeExt() {
@ -3983,8 +4011,8 @@ void PrivilegeExt::Clear() {
(void) cached_has_bits;
::memset(&object_type_, 0, static_cast<size_t>(
reinterpret_cast<char*>(&object_name_index_) -
reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_index_));
reinterpret_cast<char*>(&object_name_indexs_) -
reinterpret_cast<char*>(&object_type_)) + sizeof(object_name_indexs_));
_internal_metadata_.Clear();
}
@ -4019,6 +4047,13 @@ const char* PrivilegeExt::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_I
CHK_(ptr);
} else goto handle_unusual;
continue;
// int32 object_name_indexs = 4;
case 4:
if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 32)) {
object_name_indexs_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
CHK_(ptr);
} else goto handle_unusual;
continue;
default: {
handle_unusual:
if ((tag & 7) == 4 || tag == 0) {
@ -4090,6 +4125,19 @@ bool PrivilegeExt::MergePartialFromCodedStream(
break;
}
// int32 object_name_indexs = 4;
case 4: {
if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (32 & 0xFF)) {
DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
input, &object_name_indexs_)));
} else {
goto handle_unusual;
}
break;
}
default: {
handle_unusual:
if (tag == 0) {
@ -4134,6 +4182,11 @@ void PrivilegeExt::SerializeWithCachedSizes(
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32(3, this->object_name_index(), output);
}
// int32 object_name_indexs = 4;
if (this->object_name_indexs() != 0) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32(4, this->object_name_indexs(), output);
}
if (_internal_metadata_.have_unknown_fields()) {
::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields(
_internal_metadata_.unknown_fields(), output);
@ -4164,6 +4217,11 @@ void PrivilegeExt::SerializeWithCachedSizes(
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(3, this->object_name_index(), target);
}
// int32 object_name_indexs = 4;
if (this->object_name_indexs() != 0) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(4, this->object_name_indexs(), target);
}
if (_internal_metadata_.have_unknown_fields()) {
target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray(
_internal_metadata_.unknown_fields(), target);
@ -4204,6 +4262,13 @@ size_t PrivilegeExt::ByteSizeLong() const {
this->object_name_index());
}
// int32 object_name_indexs = 4;
if (this->object_name_indexs() != 0) {
total_size += 1 +
::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size(
this->object_name_indexs());
}
int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size);
SetCachedSize(cached_size);
return total_size;
@ -4240,6 +4305,9 @@ void PrivilegeExt::MergeFrom(const PrivilegeExt& from) {
if (from.object_name_index() != 0) {
set_object_name_index(from.object_name_index());
}
if (from.object_name_indexs() != 0) {
set_object_name_indexs(from.object_name_indexs());
}
}
void PrivilegeExt::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
@ -4266,6 +4334,7 @@ void PrivilegeExt::InternalSwap(PrivilegeExt* other) {
swap(object_type_, other->object_type_);
swap(object_privilege_, other->object_privilege_);
swap(object_name_index_, other->object_name_index_);
swap(object_name_indexs_, other->object_name_indexs_);
}
::PROTOBUF_NAMESPACE_ID::Metadata PrivilegeExt::GetMetadata() const {

View File

@ -481,12 +481,13 @@ inline bool ImportState_Parse(
enum ObjectType : int {
Collection = 0,
Global = 1,
User = 2,
ObjectType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(),
ObjectType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max()
};
bool ObjectType_IsValid(int value);
constexpr ObjectType ObjectType_MIN = Collection;
constexpr ObjectType ObjectType_MAX = Global;
constexpr ObjectType ObjectType_MAX = User;
constexpr int ObjectType_ARRAYSIZE = ObjectType_MAX + 1;
const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ObjectType_descriptor();
@ -514,12 +515,27 @@ enum ObjectPrivilege : int {
PrivilegeCompaction = 7,
PrivilegeInsert = 8,
PrivilegeDelete = 9,
PrivilegeGetStatistics = 10,
PrivilegeCreateIndex = 11,
PrivilegeIndexDetail = 12,
PrivilegeDropIndex = 13,
PrivilegeSearch = 14,
PrivilegeFlush = 15,
PrivilegeQuery = 16,
PrivilegeLoadBalance = 17,
PrivilegeImport = 18,
PrivilegeCreateOwnership = 19,
PrivilegeUpdateUser = 20,
PrivilegeDropOwnership = 21,
PrivilegeSelectOwnership = 22,
PrivilegeManageOwnership = 23,
PrivilegeSelectUser = 24,
ObjectPrivilege_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(),
ObjectPrivilege_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max()
};
bool ObjectPrivilege_IsValid(int value);
constexpr ObjectPrivilege ObjectPrivilege_MIN = PrivilegeAll;
constexpr ObjectPrivilege ObjectPrivilege_MAX = PrivilegeDelete;
constexpr ObjectPrivilege ObjectPrivilege_MAX = PrivilegeSelectUser;
constexpr int ObjectPrivilege_ARRAYSIZE = ObjectPrivilege_MAX + 1;
const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ObjectPrivilege_descriptor();
@ -2112,6 +2128,7 @@ class PrivilegeExt :
kObjectTypeFieldNumber = 1,
kObjectPrivilegeFieldNumber = 2,
kObjectNameIndexFieldNumber = 3,
kObjectNameIndexsFieldNumber = 4,
};
// .milvus.proto.common.ObjectType object_type = 1;
void clear_object_type();
@ -2128,6 +2145,11 @@ class PrivilegeExt :
::PROTOBUF_NAMESPACE_ID::int32 object_name_index() const;
void set_object_name_index(::PROTOBUF_NAMESPACE_ID::int32 value);
// int32 object_name_indexs = 4;
void clear_object_name_indexs();
::PROTOBUF_NAMESPACE_ID::int32 object_name_indexs() const;
void set_object_name_indexs(::PROTOBUF_NAMESPACE_ID::int32 value);
// @@protoc_insertion_point(class_scope:milvus.proto.common.PrivilegeExt)
private:
class _Internal;
@ -2136,6 +2158,7 @@ class PrivilegeExt :
int object_type_;
int object_privilege_;
::PROTOBUF_NAMESPACE_ID::int32 object_name_index_;
::PROTOBUF_NAMESPACE_ID::int32 object_name_indexs_;
mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
friend struct ::TableStruct_common_2eproto;
};
@ -2990,6 +3013,20 @@ inline void PrivilegeExt::set_object_name_index(::PROTOBUF_NAMESPACE_ID::int32 v
// @@protoc_insertion_point(field_set:milvus.proto.common.PrivilegeExt.object_name_index)
}
// int32 object_name_indexs = 4;
inline void PrivilegeExt::clear_object_name_indexs() {
object_name_indexs_ = 0;
}
inline ::PROTOBUF_NAMESPACE_ID::int32 PrivilegeExt::object_name_indexs() const {
// @@protoc_insertion_point(field_get:milvus.proto.common.PrivilegeExt.object_name_indexs)
return object_name_indexs_;
}
inline void PrivilegeExt::set_object_name_indexs(::PROTOBUF_NAMESPACE_ID::int32 value) {
object_name_indexs_ = value;
// @@protoc_insertion_point(field_set:milvus.proto.common.PrivilegeExt.object_name_indexs)
}
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif // __GNUC__

View File

@ -276,6 +276,7 @@ enum ImportState {
enum ObjectType {
Collection = 0;
Global = 1;
User = 2;
}
enum ObjectPrivilege {
@ -289,12 +290,29 @@ enum ObjectPrivilege {
PrivilegeCompaction = 7;
PrivilegeInsert = 8;
PrivilegeDelete = 9;
PrivilegeGetStatistics = 10;
PrivilegeCreateIndex = 11;
PrivilegeIndexDetail = 12;
PrivilegeDropIndex = 13;
PrivilegeSearch = 14;
PrivilegeFlush = 15;
PrivilegeQuery = 16;
PrivilegeLoadBalance = 17;
PrivilegeImport = 18;
PrivilegeCreateOwnership = 19;
PrivilegeUpdateUser = 20;
PrivilegeDropOwnership = 21;
PrivilegeSelectOwnership = 22;
PrivilegeManageOwnership = 23;
PrivilegeSelectUser = 24;
}
message PrivilegeExt {
ObjectType object_type = 1;
ObjectPrivilege object_privilege = 2;
int32 object_name_index = 3;
int32 object_name_indexs = 4;
}
extend google.protobuf.MessageOptions {

View File

@ -685,16 +685,19 @@ type ObjectType int32
const (
ObjectType_Collection ObjectType = 0
ObjectType_Global ObjectType = 1
ObjectType_User ObjectType = 2
)
var ObjectType_name = map[int32]string{
0: "Collection",
1: "Global",
2: "User",
}
var ObjectType_value = map[string]int32{
"Collection": 0,
"Global": 1,
"User": 2,
}
func (x ObjectType) String() string {
@ -718,19 +721,49 @@ const (
ObjectPrivilege_PrivilegeCompaction ObjectPrivilege = 7
ObjectPrivilege_PrivilegeInsert ObjectPrivilege = 8
ObjectPrivilege_PrivilegeDelete ObjectPrivilege = 9
ObjectPrivilege_PrivilegeGetStatistics ObjectPrivilege = 10
ObjectPrivilege_PrivilegeCreateIndex ObjectPrivilege = 11
ObjectPrivilege_PrivilegeIndexDetail ObjectPrivilege = 12
ObjectPrivilege_PrivilegeDropIndex ObjectPrivilege = 13
ObjectPrivilege_PrivilegeSearch ObjectPrivilege = 14
ObjectPrivilege_PrivilegeFlush ObjectPrivilege = 15
ObjectPrivilege_PrivilegeQuery ObjectPrivilege = 16
ObjectPrivilege_PrivilegeLoadBalance ObjectPrivilege = 17
ObjectPrivilege_PrivilegeImport ObjectPrivilege = 18
ObjectPrivilege_PrivilegeCreateOwnership ObjectPrivilege = 19
ObjectPrivilege_PrivilegeUpdateUser ObjectPrivilege = 20
ObjectPrivilege_PrivilegeDropOwnership ObjectPrivilege = 21
ObjectPrivilege_PrivilegeSelectOwnership ObjectPrivilege = 22
ObjectPrivilege_PrivilegeManageOwnership ObjectPrivilege = 23
ObjectPrivilege_PrivilegeSelectUser ObjectPrivilege = 24
)
var ObjectPrivilege_name = map[int32]string{
0: "PrivilegeAll",
1: "PrivilegeCreateCollection",
2: "PrivilegeDropCollection",
3: "PrivilegeDescribeCollection",
4: "PrivilegeShowCollections",
5: "PrivilegeLoad",
6: "PrivilegeRelease",
7: "PrivilegeCompaction",
8: "PrivilegeInsert",
9: "PrivilegeDelete",
0: "PrivilegeAll",
1: "PrivilegeCreateCollection",
2: "PrivilegeDropCollection",
3: "PrivilegeDescribeCollection",
4: "PrivilegeShowCollections",
5: "PrivilegeLoad",
6: "PrivilegeRelease",
7: "PrivilegeCompaction",
8: "PrivilegeInsert",
9: "PrivilegeDelete",
10: "PrivilegeGetStatistics",
11: "PrivilegeCreateIndex",
12: "PrivilegeIndexDetail",
13: "PrivilegeDropIndex",
14: "PrivilegeSearch",
15: "PrivilegeFlush",
16: "PrivilegeQuery",
17: "PrivilegeLoadBalance",
18: "PrivilegeImport",
19: "PrivilegeCreateOwnership",
20: "PrivilegeUpdateUser",
21: "PrivilegeDropOwnership",
22: "PrivilegeSelectOwnership",
23: "PrivilegeManageOwnership",
24: "PrivilegeSelectUser",
}
var ObjectPrivilege_value = map[string]int32{
@ -744,6 +777,21 @@ var ObjectPrivilege_value = map[string]int32{
"PrivilegeCompaction": 7,
"PrivilegeInsert": 8,
"PrivilegeDelete": 9,
"PrivilegeGetStatistics": 10,
"PrivilegeCreateIndex": 11,
"PrivilegeIndexDetail": 12,
"PrivilegeDropIndex": 13,
"PrivilegeSearch": 14,
"PrivilegeFlush": 15,
"PrivilegeQuery": 16,
"PrivilegeLoadBalance": 17,
"PrivilegeImport": 18,
"PrivilegeCreateOwnership": 19,
"PrivilegeUpdateUser": 20,
"PrivilegeDropOwnership": 21,
"PrivilegeSelectOwnership": 22,
"PrivilegeManageOwnership": 23,
"PrivilegeSelectUser": 24,
}
func (x ObjectPrivilege) String() string {
@ -1231,6 +1279,7 @@ type PrivilegeExt struct {
ObjectType ObjectType `protobuf:"varint,1,opt,name=object_type,json=objectType,proto3,enum=milvus.proto.common.ObjectType" json:"object_type,omitempty"`
ObjectPrivilege ObjectPrivilege `protobuf:"varint,2,opt,name=object_privilege,json=objectPrivilege,proto3,enum=milvus.proto.common.ObjectPrivilege" json:"object_privilege,omitempty"`
ObjectNameIndex int32 `protobuf:"varint,3,opt,name=object_name_index,json=objectNameIndex,proto3" json:"object_name_index,omitempty"`
ObjectNameIndexs int32 `protobuf:"varint,4,opt,name=object_name_indexs,json=objectNameIndexs,proto3" json:"object_name_indexs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1282,6 +1331,13 @@ func (m *PrivilegeExt) GetObjectNameIndex() int32 {
return 0
}
func (m *PrivilegeExt) GetObjectNameIndexs() int32 {
if m != nil {
return m.ObjectNameIndexs
}
return 0
}
var E_PrivilegeExtObj = &proto.ExtensionDesc{
ExtendedType: (*descriptor.MessageOptions)(nil),
ExtensionType: (*PrivilegeExt)(nil),
@ -1320,152 +1376,160 @@ func init() {
func init() { proto.RegisterFile("common.proto", fileDescriptor_555bd8c177793206) }
var fileDescriptor_555bd8c177793206 = []byte{
// 2342 bytes of a gzipped FileDescriptorProto
// 2473 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x49, 0x73, 0x24, 0x47,
0xf5, 0x57, 0x75, 0xf7, 0xa8, 0xd5, 0xd9, 0x2d, 0x29, 0x95, 0xd2, 0x68, 0xda, 0xb3, 0x78, 0xe4,
0xfe, 0xdb, 0x7f, 0x44, 0x83, 0x25, 0xb0, 0x23, 0x80, 0x20, 0xc2, 0x04, 0x52, 0xb7, 0xa4, 0xe9,
0xb0, 0x96, 0xa6, 0xa4, 0x19, 0x3b, 0x88, 0x00, 0x45, 0x76, 0xd5, 0x53, 0xab, 0x66, 0xaa, 0x2a,
0x8b, 0xca, 0x6c, 0x8d, 0x9a, 0x93, 0x31, 0x37, 0x4e, 0x60, 0xbe, 0x00, 0x1f, 0x80, 0x7d, 0x31,
0x1c, 0xd9, 0xb1, 0x01, 0x73, 0xe1, 0xc2, 0x0e, 0x47, 0xb8, 0xb3, 0x7a, 0x25, 0x5e, 0x66, 0x6d,
0xd2, 0xc8, 0x70, 0xe0, 0x56, 0xf9, 0x7b, 0x2f, 0xdf, 0x96, 0x6f, 0xc9, 0x2c, 0xd2, 0x70, 0x44,
0x10, 0x88, 0x70, 0x25, 0x8a, 0x85, 0x12, 0x6c, 0x3e, 0xf0, 0xfc, 0x93, 0x91, 0x34, 0xab, 0x15,
0x43, 0xba, 0xba, 0x34, 0x14, 0x62, 0xe8, 0xc3, 0xaa, 0x06, 0x07, 0xa3, 0xa3, 0x55, 0x17, 0xa4,
0x13, 0x7b, 0x91, 0x12, 0xb1, 0x61, 0x6c, 0x1d, 0x92, 0xc9, 0x7d, 0xc5, 0xd5, 0x48, 0xb2, 0xa7,
0x08, 0x81, 0x38, 0x16, 0xf1, 0xa1, 0x23, 0x5c, 0x68, 0x5a, 0x4b, 0xd6, 0xf2, 0xcc, 0x13, 0x0f,
0xaf, 0x5c, 0x20, 0x75, 0x65, 0x03, 0xd9, 0x3a, 0xc2, 0x05, 0xbb, 0x06, 0xe9, 0x27, 0x5b, 0x24,
0x93, 0x31, 0x70, 0x29, 0xc2, 0x66, 0x69, 0xc9, 0x5a, 0xae, 0xd9, 0xc9, 0xaa, 0xf5, 0x3e, 0xd2,
0x78, 0x1a, 0xc6, 0x77, 0xb8, 0x3f, 0x82, 0x3e, 0xf7, 0x62, 0x46, 0x49, 0xf9, 0x1e, 0x8c, 0xb5,
0xfc, 0x9a, 0x8d, 0x9f, 0x6c, 0x81, 0x5c, 0x3a, 0x41, 0x72, 0xb2, 0xd1, 0x2c, 0x5a, 0x4f, 0x92,
0xfa, 0xd3, 0x30, 0xee, 0x72, 0xc5, 0xdf, 0x66, 0x1b, 0x23, 0x15, 0x97, 0x2b, 0xae, 0x77, 0x35,
0x6c, 0xfd, 0xdd, 0xba, 0x4e, 0x2a, 0xeb, 0xbe, 0x18, 0xe4, 0x22, 0x2d, 0x4d, 0x4c, 0x44, 0x9e,
0x10, 0xda, 0xf7, 0xb9, 0x03, 0xc7, 0xc2, 0x77, 0x21, 0xd6, 0x26, 0xa1, 0x5c, 0xc5, 0x87, 0xa9,
0x5c, 0xc5, 0x87, 0xec, 0x03, 0xa4, 0xa2, 0xc6, 0x91, 0xb1, 0x66, 0xe6, 0x89, 0x47, 0x2f, 0x8c,
0x40, 0x41, 0xcc, 0xc1, 0x38, 0x02, 0x5b, 0xef, 0xc0, 0x10, 0x68, 0x45, 0xb2, 0x59, 0x5e, 0x2a,
0x2f, 0x37, 0xec, 0x64, 0xd5, 0xfa, 0xd8, 0x19, 0xbd, 0x5b, 0xb1, 0x18, 0x45, 0xac, 0x47, 0x1a,
0x51, 0x8e, 0xc9, 0xa6, 0xb5, 0x54, 0x5e, 0xae, 0x3f, 0xf1, 0xd8, 0x7f, 0xd3, 0xa6, 0x8d, 0xb6,
0xcf, 0x6c, 0x6d, 0x3d, 0x4e, 0xaa, 0x6b, 0xae, 0x1b, 0x83, 0x94, 0x6c, 0x86, 0x94, 0xbc, 0x28,
0x71, 0xa6, 0xe4, 0x45, 0x18, 0xa3, 0x48, 0xc4, 0x4a, 0xfb, 0x52, 0xb6, 0xf5, 0x77, 0xeb, 0x05,
0x8b, 0x54, 0x77, 0xe4, 0x70, 0x9d, 0x4b, 0x60, 0xef, 0x27, 0x53, 0x81, 0x1c, 0x1e, 0x6a, 0x7f,
0xcd, 0x89, 0x5f, 0xbf, 0xd0, 0x82, 0x1d, 0x39, 0xd4, 0x7e, 0x56, 0x03, 0xf3, 0x81, 0x01, 0x0e,
0xe4, 0xb0, 0xd7, 0x4d, 0x24, 0x9b, 0x05, 0xbb, 0x4e, 0x6a, 0xca, 0x0b, 0x40, 0x2a, 0x1e, 0x44,
0xcd, 0xf2, 0x92, 0xb5, 0x5c, 0xb1, 0x73, 0x80, 0x5d, 0x25, 0x53, 0x52, 0x8c, 0x62, 0x07, 0x7a,
0xdd, 0x66, 0x45, 0x6f, 0xcb, 0xd6, 0xad, 0xa7, 0x48, 0x6d, 0x47, 0x0e, 0x6f, 0x01, 0x77, 0x21,
0x66, 0xef, 0x21, 0x95, 0x01, 0x97, 0xc6, 0xa2, 0xfa, 0xdb, 0x5b, 0x84, 0x1e, 0xd8, 0x9a, 0xb3,
0xf5, 0x71, 0xd2, 0xe8, 0xee, 0x6c, 0xff, 0x0f, 0x12, 0xd0, 0x74, 0x79, 0xcc, 0x63, 0x77, 0x97,
0x07, 0x69, 0x22, 0xe6, 0x40, 0xeb, 0x15, 0x8b, 0x34, 0xfa, 0xb1, 0x77, 0xe2, 0xf9, 0x30, 0x84,
0x8d, 0x53, 0xc5, 0x3e, 0x4c, 0xea, 0x62, 0x70, 0x17, 0x1c, 0x55, 0x8c, 0xdd, 0xcd, 0x0b, 0xf5,
0xec, 0x69, 0x3e, 0x1d, 0x3e, 0x22, 0xb2, 0x6f, 0xb6, 0x47, 0x68, 0x22, 0x21, 0x4a, 0x05, 0xff,
0xc7, 0x94, 0x33, 0x62, 0x32, 0x23, 0xec, 0x59, 0x71, 0x16, 0x60, 0x6d, 0x32, 0x97, 0x08, 0x0c,
0x79, 0x00, 0x87, 0x5e, 0xe8, 0xc2, 0xa9, 0x3e, 0x84, 0x4b, 0x29, 0x2f, 0xba, 0xd2, 0x43, 0xb8,
0xfd, 0xcb, 0x29, 0x52, 0xcb, 0xaa, 0x98, 0xd5, 0x49, 0x75, 0x7f, 0xe4, 0x38, 0x20, 0x25, 0x9d,
0x60, 0xf3, 0x64, 0xf6, 0x76, 0x08, 0xa7, 0x11, 0x38, 0x0a, 0x5c, 0xcd, 0x43, 0x2d, 0x36, 0x47,
0xa6, 0x3b, 0x22, 0x0c, 0xc1, 0x51, 0x9b, 0xdc, 0xf3, 0xc1, 0xa5, 0x25, 0xb6, 0x40, 0x68, 0x1f,
0xe2, 0xc0, 0x93, 0xd2, 0x13, 0x61, 0x17, 0x42, 0x0f, 0x5c, 0x5a, 0x66, 0x57, 0xc8, 0x7c, 0x47,
0xf8, 0x3e, 0x38, 0xca, 0x13, 0xe1, 0xae, 0x50, 0x1b, 0xa7, 0x9e, 0x54, 0x92, 0x56, 0x50, 0x6c,
0xcf, 0xf7, 0x61, 0xc8, 0xfd, 0xb5, 0x78, 0x38, 0x0a, 0x20, 0x54, 0xf4, 0x12, 0xca, 0x48, 0xc0,
0xae, 0x17, 0x40, 0x88, 0x92, 0x68, 0xb5, 0x80, 0x6a, 0x63, 0x31, 0x5a, 0x74, 0x8a, 0x3d, 0x44,
0x2e, 0x27, 0x68, 0x41, 0x01, 0x0f, 0x80, 0xd6, 0xd8, 0x2c, 0xa9, 0x27, 0xa4, 0x83, 0xbd, 0xfe,
0xd3, 0x94, 0x14, 0x24, 0xd8, 0xe2, 0xbe, 0x0d, 0x8e, 0x88, 0x5d, 0x5a, 0x2f, 0x98, 0x70, 0x07,
0x1c, 0x25, 0xe2, 0x5e, 0x97, 0x36, 0xd0, 0xe0, 0x04, 0xdc, 0x07, 0x1e, 0x3b, 0xc7, 0x36, 0xc8,
0x91, 0xaf, 0xe8, 0x34, 0xa3, 0xa4, 0xb1, 0xe9, 0xf9, 0xb0, 0x2b, 0xd4, 0xa6, 0x18, 0x85, 0x2e,
0x9d, 0x61, 0x33, 0x84, 0xec, 0x80, 0xe2, 0x49, 0x04, 0x66, 0x51, 0x6d, 0x87, 0x3b, 0xc7, 0x90,
0x00, 0x94, 0x2d, 0x12, 0xd6, 0xe1, 0x61, 0x28, 0x54, 0x27, 0x06, 0xae, 0x60, 0x53, 0xd7, 0x27,
0x9d, 0x43, 0x73, 0xce, 0xe0, 0x9e, 0x0f, 0x94, 0xe5, 0xdc, 0x5d, 0xf0, 0x21, 0xe3, 0x9e, 0xcf,
0xb9, 0x13, 0x1c, 0xb9, 0x17, 0xd0, 0xf8, 0xf5, 0x91, 0xe7, 0xbb, 0x3a, 0x24, 0xe6, 0x58, 0x2e,
0xa3, 0x8d, 0x89, 0xf1, 0xbb, 0xdb, 0xbd, 0xfd, 0x03, 0xba, 0xc8, 0x2e, 0x93, 0xb9, 0x04, 0xd9,
0x01, 0x15, 0x7b, 0x8e, 0x0e, 0xde, 0x15, 0x34, 0x75, 0x6f, 0xa4, 0xf6, 0x8e, 0x76, 0x20, 0x10,
0xf1, 0x98, 0x36, 0xf1, 0x40, 0xb5, 0xa4, 0xf4, 0x88, 0xe8, 0x43, 0xa8, 0x61, 0x23, 0x88, 0xd4,
0x38, 0x0f, 0x2f, 0xbd, 0xca, 0xae, 0x91, 0x2b, 0xb7, 0x23, 0x97, 0x2b, 0xe8, 0x05, 0xd8, 0x3c,
0x0e, 0xb8, 0xbc, 0x87, 0xee, 0x8e, 0x62, 0xa0, 0xd7, 0xd8, 0x55, 0xb2, 0x78, 0xf6, 0x2c, 0xb2,
0x60, 0x5d, 0xc7, 0x8d, 0xc6, 0xdb, 0x4e, 0x0c, 0x2e, 0x84, 0xca, 0xe3, 0x7e, 0xba, 0xf1, 0x46,
0x2e, 0xf5, 0x41, 0xe2, 0xc3, 0x48, 0x34, 0x9e, 0x3f, 0x48, 0xbc, 0xc9, 0x9a, 0x64, 0x61, 0x0b,
0xd4, 0x83, 0x94, 0x25, 0xa4, 0x6c, 0x7b, 0x52, 0x93, 0x6e, 0x4b, 0x88, 0x65, 0x4a, 0x79, 0x84,
0x31, 0x32, 0xb3, 0x05, 0x0a, 0xc1, 0x14, 0x6b, 0x61, 0x9c, 0x8c, 0x79, 0xb6, 0xf0, 0x21, 0x85,
0xff, 0x0f, 0x63, 0xd0, 0x8d, 0x45, 0x54, 0x04, 0x1f, 0x45, 0x37, 0xf7, 0x22, 0x88, 0xb9, 0x02,
0x94, 0x51, 0xa4, 0x3d, 0x86, 0x72, 0xf6, 0x01, 0x23, 0x50, 0x84, 0xff, 0x3f, 0x87, 0x8b, 0x5a,
0xdf, 0x81, 0x39, 0x9c, 0x70, 0x83, 0xe9, 0x7c, 0x29, 0x69, 0x19, 0xbd, 0x4e, 0x94, 0x64, 0x15,
0x9d, 0x12, 0xdf, 0x89, 0xa9, 0x62, 0xf6, 0x6d, 0xc5, 0x3c, 0x54, 0x29, 0xde, 0x66, 0x8f, 0x90,
0x1b, 0x36, 0x1c, 0xc5, 0x20, 0x8f, 0xfb, 0xc2, 0xf7, 0x9c, 0x71, 0x2f, 0x3c, 0x12, 0x59, 0x4a,
0x22, 0xcb, 0xbb, 0xd0, 0x12, 0x0c, 0x8b, 0xa1, 0xa7, 0xf0, 0xbb, 0x31, 0x26, 0xbb, 0x42, 0xed,
0x63, 0x83, 0xdb, 0xd6, 0x2d, 0x93, 0x3e, 0x8e, 0x5a, 0x76, 0x85, 0x0d, 0x91, 0xef, 0x39, 0x7c,
0xed, 0x84, 0x7b, 0x3e, 0x1f, 0xf8, 0x40, 0x57, 0x30, 0x28, 0xfb, 0x30, 0xc4, 0x92, 0xcd, 0xce,
0x77, 0x95, 0x31, 0x32, 0xdd, 0xed, 0xda, 0xf0, 0x89, 0x11, 0x48, 0x65, 0x73, 0x07, 0xe8, 0x9f,
0xab, 0xed, 0x67, 0x09, 0xd1, 0x49, 0x85, 0x17, 0x0a, 0x40, 0x15, 0xf9, 0x6a, 0x57, 0x84, 0x40,
0x27, 0x58, 0x83, 0x4c, 0xdd, 0x0e, 0x3d, 0x29, 0x47, 0xe0, 0x52, 0x0b, 0x0b, 0xaa, 0x17, 0xf6,
0x63, 0x31, 0xc4, 0xd9, 0x45, 0x4b, 0x48, 0xdd, 0xf4, 0x42, 0x4f, 0x1e, 0xeb, 0x56, 0x42, 0xc8,
0x64, 0x52, 0x59, 0x95, 0xf6, 0xf3, 0x16, 0x69, 0x24, 0x36, 0x18, 0xe1, 0x0b, 0x84, 0x16, 0xd7,
0xb9, 0xf8, 0x2c, 0xa1, 0x2d, 0x6c, 0x6b, 0x5b, 0xb1, 0xb8, 0xef, 0x85, 0x43, 0x5a, 0x42, 0x69,
0xfb, 0xc0, 0x7d, 0x2d, 0xb9, 0x4e, 0xaa, 0x9b, 0xfe, 0x48, 0xab, 0xa9, 0x68, 0xa5, 0xb8, 0x40,
0xb6, 0x4b, 0x48, 0xc2, 0x04, 0x88, 0xc0, 0xa5, 0x93, 0x6c, 0x9a, 0xd4, 0x4c, 0xda, 0x23, 0xad,
0xda, 0xfe, 0x10, 0x99, 0x3d, 0x37, 0xf7, 0xd9, 0x14, 0xa9, 0x24, 0xaa, 0x29, 0x69, 0xac, 0x7b,
0x21, 0x8f, 0xc7, 0xa6, 0xb7, 0x50, 0x17, 0x6b, 0x6e, 0xd3, 0x17, 0x5c, 0x25, 0x00, 0xb4, 0x5f,
0x6c, 0xe8, 0xc1, 0xab, 0x37, 0x4e, 0x93, 0xda, 0xed, 0xd0, 0x85, 0x23, 0x2f, 0x04, 0x97, 0x4e,
0xe8, 0x9a, 0x37, 0xd5, 0x92, 0x17, 0x9f, 0x8b, 0x11, 0x44, 0x63, 0x0a, 0x18, 0x60, 0xe1, 0xde,
0xe2, 0xb2, 0x00, 0x1d, 0xe1, 0xb9, 0x75, 0xf5, 0xb5, 0x6e, 0x50, 0xdc, 0x3e, 0xd4, 0xe7, 0x76,
0x2c, 0xee, 0xe7, 0x98, 0xa4, 0xc7, 0xa8, 0x69, 0x0b, 0xd4, 0xfe, 0x58, 0x2a, 0x08, 0x3a, 0x22,
0x3c, 0xf2, 0x86, 0x92, 0x7a, 0xa8, 0x69, 0x5b, 0x70, 0xb7, 0xb0, 0xfd, 0x2e, 0x66, 0x8e, 0x0d,
0x3e, 0x70, 0x59, 0x94, 0x7a, 0x4f, 0x77, 0x3d, 0x6d, 0xea, 0x9a, 0xef, 0x71, 0x49, 0x7d, 0x74,
0x05, 0xad, 0x34, 0xcb, 0x00, 0x0f, 0x75, 0xcd, 0x57, 0x10, 0x9b, 0x75, 0xc8, 0x16, 0xc8, 0xac,
0xe1, 0xef, 0xf3, 0x58, 0x79, 0x5a, 0xc8, 0x4b, 0x96, 0x4e, 0x9f, 0x58, 0x44, 0x39, 0xf6, 0x32,
0x0e, 0x99, 0xc6, 0x2d, 0x2e, 0x73, 0xe8, 0xa7, 0x16, 0x5b, 0x24, 0x73, 0xa9, 0x6b, 0x39, 0xfe,
0x33, 0x8b, 0xcd, 0x93, 0x19, 0x74, 0x2d, 0xc3, 0x24, 0xfd, 0xb9, 0x06, 0xd1, 0x89, 0x02, 0xf8,
0x8a, 0x96, 0x90, 0x78, 0x51, 0xc0, 0x7f, 0xa1, 0x95, 0xa1, 0x84, 0x24, 0x89, 0x24, 0x7d, 0xd5,
0x42, 0x4b, 0x53, 0x65, 0x09, 0x4c, 0x5f, 0xd3, 0x8c, 0x28, 0x35, 0x63, 0x7c, 0x5d, 0x33, 0x26,
0x32, 0x33, 0xf4, 0x0d, 0x8d, 0xde, 0xe2, 0xa1, 0x2b, 0x8e, 0x8e, 0x32, 0xf4, 0x4d, 0x8b, 0x35,
0xc9, 0x3c, 0x6e, 0x5f, 0xe7, 0x3e, 0x0f, 0x9d, 0x9c, 0xff, 0x2d, 0x8b, 0x5d, 0x26, 0xf4, 0x9c,
0x3a, 0x49, 0x9f, 0x2b, 0x31, 0x9a, 0xc6, 0x57, 0x17, 0x0f, 0xfd, 0x62, 0x49, 0xc7, 0x2a, 0x61,
0x34, 0xd8, 0x97, 0x4a, 0x6c, 0xc6, 0x04, 0xdd, 0xac, 0xbf, 0x5c, 0x62, 0x75, 0x32, 0xd9, 0x0b,
0x25, 0xc4, 0x8a, 0x7e, 0x16, 0xf3, 0x7b, 0xd2, 0x74, 0x50, 0xfa, 0x39, 0x2c, 0xa3, 0x4b, 0x3a,
0xbf, 0xe9, 0x0b, 0x38, 0x9d, 0x99, 0x0d, 0x12, 0x42, 0xb7, 0x50, 0x3b, 0x92, 0x7e, 0x5e, 0xef,
0x30, 0xe3, 0x8f, 0xfe, 0xb5, 0xac, 0x43, 0x53, 0x9c, 0x85, 0x7f, 0x2b, 0xa3, 0x09, 0x5b, 0xa0,
0xf2, 0x72, 0xa6, 0x7f, 0x2f, 0xb3, 0xab, 0xe4, 0x72, 0x8a, 0xe9, 0xc9, 0x94, 0x15, 0xf2, 0x3f,
0xca, 0xec, 0x3a, 0xb9, 0x82, 0x6d, 0x3a, 0xcb, 0x1b, 0xdc, 0xe4, 0x49, 0xe5, 0x39, 0x92, 0xfe,
0xb3, 0xcc, 0xae, 0x91, 0xc5, 0x2d, 0x50, 0xd9, 0x79, 0x14, 0x88, 0xff, 0x2a, 0xb3, 0x69, 0x32,
0x65, 0xe3, 0xe8, 0x82, 0x13, 0xa0, 0xaf, 0x96, 0xf1, 0x50, 0xd3, 0x65, 0x62, 0xce, 0x6b, 0x65,
0x0c, 0xf5, 0x33, 0x5c, 0x39, 0xc7, 0xdd, 0xa0, 0x73, 0xcc, 0xc3, 0x10, 0x7c, 0x49, 0x5f, 0x2f,
0x63, 0x40, 0x6d, 0x08, 0xc4, 0x09, 0x14, 0xe0, 0x37, 0xb4, 0xd3, 0x9a, 0xf9, 0x23, 0x23, 0x88,
0xc7, 0x19, 0xe1, 0xcd, 0x32, 0x1e, 0x8d, 0xe1, 0x3f, 0x4b, 0x79, 0xab, 0xcc, 0x6e, 0x90, 0xa6,
0x69, 0x16, 0xe9, 0xc1, 0x20, 0x71, 0x08, 0xd8, 0x5e, 0xe9, 0x73, 0x95, 0x4c, 0x62, 0x17, 0x7c,
0xc5, 0xb3, 0x7d, 0x9f, 0xaa, 0xa0, 0x5d, 0x58, 0x5c, 0x79, 0x57, 0x95, 0xf4, 0xf9, 0x0a, 0x9e,
0xe8, 0x16, 0xa8, 0xa4, 0xb1, 0x4a, 0xfa, 0x69, 0x8d, 0x24, 0x92, 0xb5, 0xc8, 0x5f, 0x55, 0xd8,
0x2c, 0x21, 0xa6, 0x26, 0x35, 0xf0, 0xeb, 0x54, 0x14, 0xde, 0x5d, 0x4e, 0x20, 0xd6, 0x8d, 0x9d,
0xfe, 0x26, 0x53, 0x50, 0xe8, 0x7c, 0xf4, 0xb7, 0x15, 0x0c, 0xd9, 0x81, 0x17, 0xc0, 0x81, 0xe7,
0xdc, 0xa3, 0x5f, 0xad, 0x61, 0xc8, 0xb4, 0x47, 0xbb, 0xc2, 0x05, 0x73, 0xc2, 0x5f, 0xab, 0x61,
0xc2, 0x60, 0x1e, 0x9a, 0x84, 0xf9, 0xba, 0x5e, 0x27, 0xdd, 0xbb, 0xd7, 0xa5, 0xdf, 0xc0, 0x3b,
0x14, 0x49, 0xd6, 0x07, 0xfb, 0x7b, 0xf4, 0x9b, 0x35, 0x54, 0xb5, 0xe6, 0xfb, 0xc2, 0xe1, 0x2a,
0xab, 0x86, 0x6f, 0xd5, 0xb0, 0x9c, 0x0a, 0xda, 0x93, 0x53, 0x7b, 0xb1, 0x86, 0xb1, 0x4f, 0x70,
0x9d, 0x6c, 0x5d, 0x6c, 0x8a, 0xdf, 0xd6, 0x52, 0xf1, 0x05, 0x87, 0x96, 0x1c, 0x28, 0xfa, 0x1d,
0xcd, 0x77, 0xfe, 0x5a, 0x40, 0x7f, 0x57, 0x4f, 0xf2, 0xab, 0x80, 0xfd, 0xbe, 0x6e, 0xea, 0xe3,
0xec, 0x3d, 0x80, 0xfe, 0x41, 0xc3, 0xe7, 0xef, 0x0e, 0xf4, 0x8f, 0x75, 0x34, 0xac, 0x38, 0xfe,
0xf1, 0x0a, 0x2c, 0xe9, 0x9f, 0xea, 0x68, 0x41, 0x3e, 0xe8, 0xe9, 0x77, 0x1b, 0x18, 0xac, 0x74,
0xc4, 0xd3, 0xef, 0x35, 0xd0, 0xcd, 0x73, 0xc3, 0x9d, 0x7e, 0xbf, 0xa1, 0x8f, 0x23, 0x1b, 0xeb,
0xf4, 0x07, 0x05, 0x00, 0xb9, 0xe8, 0x0f, 0x1b, 0xba, 0x03, 0x9d, 0x19, 0xe5, 0xf4, 0x47, 0x0d,
0xb4, 0xed, 0xfc, 0x10, 0xa7, 0x3f, 0x6e, 0x98, 0xe3, 0xce, 0xc6, 0x37, 0xfd, 0x49, 0x03, 0x2b,
0xe0, 0xe2, 0xc1, 0x4d, 0x5f, 0xd2, 0xba, 0xf2, 0x91, 0x4d, 0x5f, 0x6e, 0xb4, 0x5b, 0xa4, 0xda,
0x95, 0xbe, 0x9e, 0x1b, 0x55, 0x52, 0xee, 0x4a, 0x9f, 0x4e, 0x60, 0x9b, 0x5d, 0x17, 0xc2, 0xdf,
0x38, 0x8d, 0xe2, 0x3b, 0xef, 0xa5, 0x56, 0x7b, 0x9d, 0xcc, 0x76, 0x44, 0x10, 0xf1, 0xac, 0xdc,
0xf4, 0xa8, 0x30, 0x33, 0x06, 0x5c, 0x93, 0x2a, 0x13, 0xd8, 0xab, 0x37, 0x4e, 0xc1, 0x19, 0xe9,
0x89, 0x66, 0xe1, 0x12, 0x37, 0x61, 0x90, 0x5d, 0x5a, 0x6a, 0x3f, 0x4b, 0x68, 0x47, 0x84, 0xd2,
0x93, 0x0a, 0x42, 0x67, 0xbc, 0x0d, 0x27, 0xe0, 0xeb, 0xb9, 0xa9, 0x62, 0x11, 0x0e, 0xe9, 0x84,
0x7e, 0x27, 0x80, 0xbe, 0xef, 0x9b, 0xe9, 0xba, 0x8e, 0x77, 0x01, 0xfd, 0x18, 0x98, 0x21, 0x64,
0xe3, 0x04, 0x42, 0x35, 0xe2, 0xbe, 0x3f, 0xa6, 0x65, 0x5c, 0x77, 0x46, 0x52, 0x89, 0xc0, 0xfb,
0xa4, 0x9e, 0xdf, 0x5f, 0xb1, 0x48, 0xdd, 0x8c, 0xd2, 0xcc, 0x34, 0xb3, 0xec, 0x43, 0xe8, 0x7a,
0x5a, 0x38, 0xde, 0x65, 0x35, 0x94, 0x0c, 0x7d, 0x2b, 0x67, 0xda, 0x57, 0x3c, 0x56, 0xe9, 0xa3,
0xc3, 0x40, 0x5d, 0x71, 0x3f, 0xf4, 0x05, 0x77, 0xf5, 0x3c, 0xcf, 0xb6, 0xf6, 0x79, 0x2c, 0xf5,
0x50, 0xc7, 0xab, 0x7e, 0x22, 0x3f, 0xd6, 0xfe, 0xb8, 0xf4, 0x52, 0x0e, 0xe6, 0x3e, 0x4f, 0xe2,
0xf0, 0x34, 0xa0, 0x4e, 0xf6, 0x34, 0xd3, 0x49, 0x7b, 0x99, 0x90, 0xfc, 0xe1, 0xa6, 0xfd, 0xc9,
0x87, 0xe0, 0x04, 0x46, 0x65, 0xcb, 0x17, 0x03, 0xee, 0x53, 0xab, 0xfd, 0x99, 0x12, 0x99, 0x3d,
0xf7, 0x38, 0x43, 0x8b, 0xb2, 0xc5, 0x9a, 0x8f, 0xe7, 0x75, 0x83, 0x3c, 0x94, 0x21, 0x0f, 0x8c,
0x7a, 0x0b, 0xaf, 0x7f, 0x19, 0xf9, 0xdc, 0xcc, 0x2f, 0xb1, 0x9b, 0xe4, 0x5a, 0x4e, 0x7c, 0x70,
0xd2, 0x63, 0xbb, 0x6d, 0x66, 0x0c, 0xe7, 0x47, 0x7e, 0x05, 0xe3, 0x98, 0x51, 0xb1, 0x07, 0x98,
0x87, 0x57, 0xfe, 0x92, 0x34, 0xa3, 0x8c, 0x4e, 0xe2, 0x5b, 0x28, 0xb7, 0x31, 0x4b, 0x26, 0x5a,
0xc5, 0xc8, 0x65, 0x84, 0x64, 0xcc, 0x4c, 0x9d, 0x01, 0x93, 0x71, 0x53, 0xfb, 0xa0, 0x20, 0x73,
0xd9, 0x73, 0xf6, 0x10, 0x4e, 0xd5, 0xa1, 0x18, 0xdc, 0x65, 0x37, 0x57, 0xcc, 0x6f, 0xa8, 0x95,
0xf4, 0x37, 0xd4, 0xca, 0x0e, 0x48, 0xc9, 0x87, 0xb0, 0x17, 0x69, 0x1b, 0x9b, 0x7f, 0xa9, 0xea,
0x77, 0xfa, 0x23, 0x17, 0xff, 0xfd, 0x28, 0xbc, 0xbb, 0xed, 0xd9, 0xa8, 0xb0, 0xda, 0x1b, 0xdc,
0x5d, 0x7f, 0x86, 0xcc, 0x78, 0x22, 0xdd, 0x37, 0x8c, 0x23, 0x67, 0xbd, 0xde, 0xd1, 0xfb, 0xfa,
0x28, 0xa3, 0x6f, 0x7d, 0xf4, 0xc9, 0xa1, 0xa7, 0x8e, 0x47, 0x03, 0x94, 0xb6, 0x6a, 0xd8, 0x1e,
0xf7, 0x44, 0xf2, 0xb5, 0xea, 0x85, 0x0a, 0x7b, 0x85, 0x6f, 0x7e, 0x90, 0xad, 0x1a, 0x8d, 0xd1,
0xe0, 0x0b, 0x96, 0x35, 0x98, 0xd4, 0xd0, 0x93, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x59,
0x0b, 0xcb, 0x66, 0x13, 0x00, 0x00,
0xf5, 0x57, 0x75, 0xb7, 0x96, 0xce, 0x6e, 0x49, 0x4f, 0x29, 0x8d, 0xa6, 0x3d, 0x8b, 0x47, 0xd6,
0xdf, 0xfe, 0x33, 0x08, 0x5b, 0x03, 0xe3, 0x08, 0x20, 0x88, 0x30, 0x81, 0xd4, 0x2d, 0x69, 0x14,
0x1e, 0x2d, 0x94, 0x34, 0xb6, 0x83, 0x08, 0x98, 0x48, 0x55, 0x3d, 0x75, 0xd7, 0x4c, 0x75, 0x65,
0x51, 0x99, 0xad, 0x51, 0x73, 0x32, 0x26, 0x82, 0x33, 0x98, 0x2f, 0xc0, 0x07, 0x60, 0x5f, 0x0c,
0x47, 0x76, 0x6c, 0xb6, 0x0b, 0x17, 0x76, 0x38, 0xc2, 0x9d, 0xd5, 0x2b, 0xf1, 0x32, 0x6b, 0x6b,
0xcd, 0x18, 0x0e, 0xdc, 0x3a, 0x7f, 0xef, 0xe5, 0xdb, 0x97, 0xac, 0x66, 0x4d, 0x4f, 0xf6, 0xfb,
0x32, 0x5a, 0x8d, 0x13, 0xa9, 0x25, 0x9f, 0xef, 0x07, 0xe1, 0xc9, 0x40, 0xd9, 0xd3, 0xaa, 0x25,
0x5d, 0x58, 0xea, 0x4a, 0xd9, 0x0d, 0xf1, 0x9a, 0x01, 0x8f, 0x06, 0xc7, 0xd7, 0x7c, 0x54, 0x5e,
0x12, 0xc4, 0x5a, 0x26, 0x96, 0x71, 0xf9, 0x36, 0x9b, 0x38, 0xd0, 0x42, 0x0f, 0x14, 0x7f, 0x8a,
0x31, 0x4c, 0x12, 0x99, 0xdc, 0xf6, 0xa4, 0x8f, 0x2d, 0x67, 0xc9, 0xb9, 0x3a, 0x73, 0xfd, 0xe1,
0xd5, 0x07, 0x48, 0x5d, 0xdd, 0x20, 0xb6, 0xb6, 0xf4, 0xd1, 0xad, 0x63, 0xf6, 0x93, 0x2f, 0xb2,
0x89, 0x04, 0x85, 0x92, 0x51, 0xab, 0xb2, 0xe4, 0x5c, 0xad, 0xbb, 0xe9, 0x69, 0xf9, 0xbd, 0xac,
0xf9, 0x34, 0x0e, 0x9f, 0x11, 0xe1, 0x00, 0xf7, 0x45, 0x90, 0x70, 0x60, 0xd5, 0xbb, 0x38, 0x34,
0xf2, 0xeb, 0x2e, 0xfd, 0xe4, 0x0b, 0x6c, 0xfc, 0x84, 0xc8, 0xe9, 0x45, 0x7b, 0x58, 0x7e, 0x92,
0x35, 0x9e, 0xc6, 0x61, 0x47, 0x68, 0xf1, 0x36, 0xd7, 0x38, 0xab, 0xf9, 0x42, 0x0b, 0x73, 0xab,
0xe9, 0x9a, 0xdf, 0xcb, 0x97, 0x58, 0x6d, 0x3d, 0x94, 0x47, 0x85, 0x48, 0xc7, 0x10, 0x53, 0x91,
0x27, 0x0c, 0xf6, 0x43, 0xe1, 0x61, 0x4f, 0x86, 0x3e, 0x26, 0xc6, 0x24, 0x92, 0xab, 0x45, 0x37,
0x93, 0xab, 0x45, 0x97, 0xbf, 0x9f, 0xd5, 0xf4, 0x30, 0xb6, 0xd6, 0xcc, 0x5c, 0x7f, 0xf4, 0x81,
0x11, 0x28, 0x89, 0x39, 0x1c, 0xc6, 0xe8, 0x9a, 0x1b, 0x14, 0x02, 0xa3, 0x48, 0xb5, 0xaa, 0x4b,
0xd5, 0xab, 0x4d, 0x37, 0x3d, 0x2d, 0x7f, 0x74, 0x44, 0xef, 0x56, 0x22, 0x07, 0x31, 0xdf, 0x66,
0xcd, 0xb8, 0xc0, 0x54, 0xcb, 0x59, 0xaa, 0x5e, 0x6d, 0x5c, 0x7f, 0xec, 0xbf, 0x69, 0x33, 0x46,
0xbb, 0x23, 0x57, 0x97, 0x9f, 0x60, 0x93, 0x6b, 0xbe, 0x9f, 0xa0, 0x52, 0x7c, 0x86, 0x55, 0x82,
0x38, 0x75, 0xa6, 0x12, 0xc4, 0x14, 0xa3, 0x58, 0x26, 0xda, 0xf8, 0x52, 0x75, 0xcd, 0xef, 0xe5,
0x17, 0x1d, 0x36, 0xb9, 0xa3, 0xba, 0xeb, 0x42, 0x21, 0x7f, 0x1f, 0x9b, 0xea, 0xab, 0xee, 0x6d,
0xe3, 0xaf, 0xcd, 0xf8, 0xa5, 0x07, 0x5a, 0xb0, 0xa3, 0xba, 0xc6, 0xcf, 0xc9, 0xbe, 0xfd, 0x41,
0x01, 0xee, 0xab, 0xee, 0x76, 0x27, 0x95, 0x6c, 0x0f, 0xfc, 0x12, 0xab, 0xeb, 0xa0, 0x8f, 0x4a,
0x8b, 0x7e, 0xdc, 0xaa, 0x2e, 0x39, 0x57, 0x6b, 0x6e, 0x01, 0xf0, 0x0b, 0x6c, 0x4a, 0xc9, 0x41,
0xe2, 0xe1, 0x76, 0xa7, 0x55, 0x33, 0xd7, 0xf2, 0xf3, 0xf2, 0x53, 0xac, 0xbe, 0xa3, 0xba, 0x37,
0x50, 0xf8, 0x98, 0xf0, 0x77, 0xb3, 0xda, 0x91, 0x50, 0xd6, 0xa2, 0xc6, 0xdb, 0x5b, 0x44, 0x1e,
0xb8, 0x86, 0x73, 0xf9, 0x63, 0xac, 0xd9, 0xd9, 0xb9, 0xf9, 0x3f, 0x48, 0x20, 0xd3, 0x55, 0x4f,
0x24, 0xfe, 0xae, 0xe8, 0x67, 0x85, 0x58, 0x00, 0xcb, 0xaf, 0x39, 0xac, 0xb9, 0x9f, 0x04, 0x27,
0x41, 0x88, 0x5d, 0xdc, 0x38, 0xd5, 0xfc, 0x43, 0xac, 0x21, 0x8f, 0xee, 0xa0, 0xa7, 0xcb, 0xb1,
0xbb, 0xf2, 0x40, 0x3d, 0x7b, 0x86, 0xcf, 0x84, 0x8f, 0xc9, 0xfc, 0x37, 0xdf, 0x63, 0x90, 0x4a,
0x88, 0x33, 0xc1, 0xff, 0xb1, 0xe4, 0xac, 0x98, 0xdc, 0x08, 0x77, 0x56, 0x8e, 0x02, 0x7c, 0x85,
0xcd, 0xa5, 0x02, 0x23, 0xd1, 0xc7, 0xdb, 0x41, 0xe4, 0xe3, 0xa9, 0x49, 0xc2, 0x78, 0xc6, 0x4b,
0xae, 0x6c, 0x13, 0xcc, 0x1f, 0x67, 0xfc, 0x3e, 0x5e, 0x65, 0x92, 0x32, 0xee, 0xc2, 0x19, 0x66,
0xb5, 0xf2, 0xcb, 0x29, 0x56, 0xcf, 0x7b, 0x9e, 0x37, 0xd8, 0xe4, 0xc1, 0xc0, 0xf3, 0x50, 0x29,
0x18, 0xe3, 0xf3, 0x6c, 0xf6, 0x56, 0x84, 0xa7, 0x31, 0x7a, 0x1a, 0x7d, 0xc3, 0x03, 0x0e, 0x9f,
0x63, 0xd3, 0x6d, 0x19, 0x45, 0xe8, 0xe9, 0x4d, 0x11, 0x84, 0xe8, 0x43, 0x85, 0x2f, 0x30, 0xd8,
0xc7, 0xa4, 0x1f, 0x28, 0x15, 0xc8, 0xa8, 0x83, 0x51, 0x80, 0x3e, 0x54, 0xf9, 0x79, 0x36, 0xdf,
0x96, 0x61, 0x88, 0x9e, 0x0e, 0x64, 0xb4, 0x2b, 0xf5, 0xc6, 0x69, 0xa0, 0xb4, 0x82, 0x1a, 0x89,
0xdd, 0x0e, 0x43, 0xec, 0x8a, 0x70, 0x2d, 0xe9, 0x0e, 0xfa, 0x18, 0x69, 0x18, 0x27, 0x19, 0x29,
0xd8, 0x09, 0xfa, 0x18, 0x91, 0x24, 0x98, 0x2c, 0xa1, 0xc6, 0x5a, 0x8a, 0x2d, 0x4c, 0xf1, 0x87,
0xd8, 0xb9, 0x14, 0x2d, 0x29, 0x10, 0x7d, 0x84, 0x3a, 0x9f, 0x65, 0x8d, 0x94, 0x74, 0xb8, 0xb7,
0xff, 0x34, 0xb0, 0x92, 0x04, 0x57, 0xde, 0x73, 0xd1, 0x93, 0x89, 0x0f, 0x8d, 0x92, 0x09, 0xcf,
0xa0, 0xa7, 0x65, 0xb2, 0xdd, 0x81, 0x26, 0x19, 0x9c, 0x82, 0x07, 0x28, 0x12, 0xaf, 0xe7, 0xa2,
0x1a, 0x84, 0x1a, 0xa6, 0x39, 0xb0, 0xe6, 0x66, 0x10, 0xe2, 0xae, 0xd4, 0x9b, 0x72, 0x10, 0xf9,
0x30, 0xc3, 0x67, 0x18, 0xdb, 0x41, 0x2d, 0xd2, 0x08, 0xcc, 0x92, 0xda, 0xb6, 0xf0, 0x7a, 0x98,
0x02, 0xc0, 0x17, 0x19, 0x6f, 0x8b, 0x28, 0x92, 0xba, 0x9d, 0xa0, 0xd0, 0xb8, 0x69, 0xba, 0x19,
0xe6, 0xc8, 0x9c, 0x11, 0x3c, 0x08, 0x11, 0x78, 0xc1, 0xdd, 0xc1, 0x10, 0x73, 0xee, 0xf9, 0x82,
0x3b, 0xc5, 0x89, 0x7b, 0x81, 0x8c, 0x5f, 0x1f, 0x04, 0xa1, 0x6f, 0x42, 0x62, 0xd3, 0x72, 0x8e,
0x6c, 0x4c, 0x8d, 0xdf, 0xbd, 0xb9, 0x7d, 0x70, 0x08, 0x8b, 0xfc, 0x1c, 0x9b, 0x4b, 0x91, 0x1d,
0xd4, 0x49, 0xe0, 0x99, 0xe0, 0x9d, 0x27, 0x53, 0xf7, 0x06, 0x7a, 0xef, 0x78, 0x07, 0xfb, 0x32,
0x19, 0x42, 0x8b, 0x12, 0x6a, 0x24, 0x65, 0x29, 0x82, 0x87, 0x48, 0xc3, 0x46, 0x3f, 0xd6, 0xc3,
0x22, 0xbc, 0x70, 0x81, 0x5f, 0x64, 0xe7, 0x6f, 0xc5, 0xbe, 0xd0, 0xb8, 0xdd, 0xa7, 0x51, 0x73,
0x28, 0xd4, 0x5d, 0x72, 0x77, 0x90, 0x20, 0x5c, 0xe4, 0x17, 0xd8, 0xe2, 0x68, 0x2e, 0xf2, 0x60,
0x5d, 0xa2, 0x8b, 0xd6, 0xdb, 0x76, 0x82, 0x3e, 0x46, 0x3a, 0x10, 0x61, 0x76, 0xf1, 0x72, 0x21,
0xf5, 0x7e, 0xe2, 0xc3, 0x44, 0xb4, 0x9e, 0xdf, 0x4f, 0xbc, 0xc2, 0x5b, 0x6c, 0x61, 0x0b, 0xf5,
0xfd, 0x94, 0x25, 0xa2, 0xdc, 0x0c, 0x94, 0x21, 0xdd, 0x52, 0x98, 0xa8, 0x8c, 0xf2, 0x08, 0xe7,
0x6c, 0x66, 0x0b, 0x35, 0x81, 0x19, 0xb6, 0x4c, 0x71, 0xb2, 0xe6, 0xb9, 0x32, 0xc4, 0x0c, 0xfe,
0x3f, 0x8a, 0x41, 0x27, 0x91, 0x71, 0x19, 0x7c, 0x94, 0xdc, 0xdc, 0x8b, 0x31, 0x11, 0x1a, 0x49,
0x46, 0x99, 0xf6, 0x18, 0xc9, 0x39, 0x40, 0x8a, 0x40, 0x19, 0xfe, 0xff, 0x02, 0x2e, 0x6b, 0x7d,
0x07, 0xd5, 0x70, 0xca, 0x8d, 0x76, 0x4e, 0x66, 0xa4, 0xab, 0xe4, 0x75, 0xaa, 0x24, 0xef, 0xff,
0x8c, 0xf8, 0x4e, 0x2a, 0x15, 0x7b, 0x6f, 0x2b, 0x11, 0x91, 0xce, 0xf0, 0x15, 0xfe, 0x08, 0xbb,
0xec, 0xe2, 0x71, 0x82, 0xaa, 0xb7, 0x2f, 0xc3, 0xc0, 0x1b, 0x6e, 0x47, 0xc7, 0x32, 0x2f, 0x49,
0x62, 0x79, 0x17, 0x59, 0x42, 0x61, 0xb1, 0xf4, 0x0c, 0x7e, 0x9c, 0x62, 0xb2, 0x2b, 0xf5, 0x01,
0x8d, 0xc3, 0x9b, 0x66, 0xc0, 0xc2, 0x13, 0xa4, 0x65, 0x57, 0xba, 0x18, 0x87, 0x81, 0x27, 0xd6,
0x4e, 0x44, 0x10, 0x8a, 0xa3, 0x10, 0x61, 0x95, 0x82, 0x72, 0x80, 0x5d, 0x6a, 0xd9, 0x3c, 0xbf,
0xd7, 0x38, 0x67, 0xd3, 0x9d, 0x8e, 0x8b, 0x1f, 0x1f, 0xa0, 0xd2, 0xae, 0xf0, 0x10, 0xfe, 0x3c,
0xb9, 0xf2, 0x1c, 0x63, 0xa6, 0xa8, 0xe8, 0xf9, 0x81, 0xa4, 0xa2, 0x38, 0xed, 0xca, 0x08, 0x61,
0x8c, 0x37, 0xd9, 0xd4, 0xad, 0x28, 0x50, 0x6a, 0x80, 0x3e, 0x38, 0xd4, 0x50, 0xdb, 0xd1, 0x7e,
0x22, 0xbb, 0xb4, 0xe9, 0xa0, 0x42, 0xd4, 0xcd, 0x20, 0x0a, 0x54, 0xcf, 0x8c, 0x12, 0xc6, 0x26,
0xd2, 0xce, 0xaa, 0xad, 0xbc, 0xe0, 0xb0, 0x66, 0x6a, 0x83, 0x15, 0xbe, 0xc0, 0xa0, 0x7c, 0x2e,
0xc4, 0xe7, 0x05, 0xed, 0xd0, 0x58, 0xdb, 0x4a, 0xe4, 0xbd, 0x20, 0xea, 0x42, 0x85, 0xa4, 0x1d,
0xa0, 0x08, 0x8d, 0xe4, 0x06, 0x9b, 0xdc, 0x0c, 0x07, 0x46, 0x4d, 0xcd, 0x28, 0xa5, 0x03, 0xb1,
0x8d, 0x13, 0x89, 0x0a, 0x20, 0x46, 0x1f, 0x26, 0xf8, 0x34, 0xab, 0xdb, 0xb2, 0x27, 0xda, 0xe4,
0xca, 0x07, 0xd9, 0xec, 0x99, 0x57, 0x02, 0x9f, 0x62, 0xb5, 0x54, 0x35, 0xb0, 0xe6, 0x7a, 0x10,
0x89, 0x64, 0x68, 0x67, 0x0b, 0xf8, 0xd4, 0x73, 0x9b, 0xa1, 0x14, 0x3a, 0x05, 0x70, 0xe5, 0xa5,
0xa6, 0x59, 0xd3, 0xe6, 0xe2, 0x34, 0xab, 0xdf, 0x8a, 0x7c, 0x3c, 0x0e, 0x22, 0xf4, 0x61, 0xcc,
0xf4, 0xbc, 0xed, 0x96, 0xa2, 0xf9, 0x7c, 0x8a, 0x20, 0x19, 0x53, 0xc2, 0x90, 0x1a, 0xf7, 0x86,
0x50, 0x25, 0xe8, 0x98, 0xf2, 0xd6, 0x31, 0x8f, 0xc0, 0xa3, 0xf2, 0xf5, 0xae, 0xc9, 0x5b, 0x4f,
0xde, 0x2b, 0x30, 0x05, 0x3d, 0xd2, 0xb4, 0x85, 0xfa, 0x60, 0xa8, 0x34, 0xf6, 0xdb, 0x32, 0x3a,
0x0e, 0xba, 0x0a, 0x02, 0xd2, 0x74, 0x53, 0x0a, 0xbf, 0x74, 0xfd, 0x0e, 0x55, 0x8e, 0x8b, 0x21,
0x0a, 0x55, 0x96, 0x7a, 0xd7, 0x4c, 0x3d, 0x63, 0xea, 0x5a, 0x18, 0x08, 0x05, 0x21, 0xb9, 0x42,
0x56, 0xda, 0x63, 0x9f, 0x92, 0xba, 0x16, 0x6a, 0x4c, 0xec, 0x39, 0xe2, 0x0b, 0x6c, 0xd6, 0xf2,
0xef, 0x8b, 0x44, 0x07, 0x46, 0xc8, 0xcb, 0x8e, 0x29, 0x9f, 0x44, 0xc6, 0x05, 0xf6, 0x0a, 0x2d,
0x99, 0xe6, 0x0d, 0xa1, 0x0a, 0xe8, 0x27, 0x0e, 0x5f, 0x64, 0x73, 0x99, 0x6b, 0x05, 0xfe, 0x53,
0x87, 0xcf, 0xb3, 0x19, 0x72, 0x2d, 0xc7, 0x14, 0xfc, 0xcc, 0x80, 0xe4, 0x44, 0x09, 0xfc, 0xb9,
0x91, 0x90, 0x7a, 0x51, 0xc2, 0x7f, 0x61, 0x94, 0x91, 0x84, 0xb4, 0x88, 0x14, 0xbc, 0xea, 0x90,
0xa5, 0x99, 0xb2, 0x14, 0x86, 0xd7, 0x0c, 0x23, 0x49, 0xcd, 0x19, 0x5f, 0x37, 0x8c, 0xa9, 0xcc,
0x1c, 0x7d, 0xc3, 0xa0, 0x37, 0x44, 0xe4, 0xcb, 0xe3, 0xe3, 0x1c, 0x7d, 0xd3, 0xe1, 0x2d, 0x36,
0x4f, 0xd7, 0xd7, 0x45, 0x28, 0x22, 0xaf, 0xe0, 0x7f, 0xcb, 0xe1, 0xe7, 0x18, 0x9c, 0x51, 0xa7,
0xe0, 0xf9, 0x0a, 0x87, 0x2c, 0xbe, 0xa6, 0x79, 0xe0, 0x0b, 0x15, 0x13, 0xab, 0x94, 0xd1, 0x62,
0x5f, 0xac, 0xf0, 0x19, 0x1b, 0x74, 0x7b, 0xfe, 0x52, 0x85, 0x37, 0xd8, 0xc4, 0x76, 0xa4, 0x30,
0xd1, 0xf0, 0x19, 0xaa, 0xef, 0x09, 0x3b, 0x41, 0xe1, 0xb3, 0xd4, 0x46, 0xe3, 0xa6, 0xbe, 0xe1,
0x45, 0xda, 0xce, 0xdc, 0x45, 0x85, 0x91, 0x5f, 0xea, 0x1d, 0x05, 0x9f, 0x33, 0x37, 0xec, 0xfa,
0x83, 0xbf, 0x56, 0x4d, 0x68, 0xca, 0xbb, 0xf0, 0x6f, 0x55, 0x32, 0x61, 0x0b, 0x75, 0xd1, 0xce,
0xf0, 0xf7, 0x2a, 0xbf, 0xc0, 0xce, 0x65, 0x98, 0xd9, 0x4c, 0x79, 0x23, 0xff, 0xa3, 0xca, 0x2f,
0xb1, 0xf3, 0x34, 0xa6, 0xf3, 0xba, 0xa1, 0x4b, 0x81, 0xd2, 0x81, 0xa7, 0xe0, 0x9f, 0x55, 0x7e,
0x91, 0x2d, 0x6e, 0xa1, 0xce, 0xf3, 0x51, 0x22, 0xfe, 0xab, 0xca, 0xa7, 0xd9, 0x94, 0x4b, 0xab,
0x0b, 0x4f, 0x10, 0x5e, 0xad, 0x52, 0x52, 0xb3, 0x63, 0x6a, 0xce, 0x6b, 0x55, 0x0a, 0xf5, 0xb3,
0x42, 0x7b, 0xbd, 0x4e, 0xbf, 0xdd, 0x13, 0x51, 0x84, 0xa1, 0x82, 0xd7, 0xab, 0x14, 0x50, 0x17,
0xfb, 0xf2, 0x04, 0x4b, 0xf0, 0x1b, 0xc6, 0x69, 0xc3, 0xfc, 0xe1, 0x01, 0x26, 0xc3, 0x9c, 0xf0,
0x66, 0x95, 0x52, 0x63, 0xf9, 0x47, 0x29, 0x6f, 0x55, 0xf9, 0x65, 0xd6, 0xb2, 0xc3, 0x22, 0x4b,
0x0c, 0x11, 0xbb, 0x48, 0xe3, 0x15, 0x9e, 0xaf, 0xe5, 0x12, 0x3b, 0x18, 0x6a, 0x91, 0xdf, 0xfb,
0x64, 0x8d, 0xec, 0xa2, 0xe6, 0x2a, 0xa6, 0xaa, 0x82, 0x17, 0x6a, 0x94, 0xd1, 0x2d, 0xd4, 0xe9,
0x60, 0x55, 0xf0, 0x29, 0x83, 0xa4, 0x92, 0x8d, 0xc8, 0x5f, 0xd5, 0xf8, 0x2c, 0x63, 0xb6, 0x27,
0x0d, 0xf0, 0xeb, 0x4c, 0x14, 0xbd, 0x5d, 0x4e, 0x30, 0x31, 0x83, 0x1d, 0x7e, 0x93, 0x2b, 0x28,
0x4d, 0x3e, 0xf8, 0x6d, 0x8d, 0x42, 0x76, 0x18, 0xf4, 0xf1, 0x30, 0xf0, 0xee, 0xc2, 0x57, 0xea,
0x14, 0x32, 0xe3, 0xd1, 0xae, 0xf4, 0xd1, 0x66, 0xf8, 0xab, 0x75, 0x2a, 0x18, 0xaa, 0x43, 0x5b,
0x30, 0x5f, 0x33, 0xe7, 0x74, 0x7a, 0x6f, 0x77, 0xe0, 0xeb, 0xf4, 0x86, 0x62, 0xe9, 0xf9, 0xf0,
0x60, 0x0f, 0xbe, 0x51, 0x27, 0x55, 0x6b, 0x61, 0x28, 0x3d, 0xa1, 0xf3, 0x6e, 0xf8, 0x66, 0x9d,
0xda, 0xa9, 0xa4, 0x3d, 0xcd, 0xda, 0x4b, 0x75, 0x8a, 0x7d, 0x8a, 0x9b, 0x62, 0xeb, 0xd0, 0x50,
0xfc, 0x96, 0x91, 0x4a, 0xdf, 0x7b, 0x64, 0xc9, 0xa1, 0x86, 0x6f, 0x1b, 0xbe, 0xb3, 0xcf, 0x02,
0xf8, 0x5d, 0x23, 0xad, 0xaf, 0x12, 0xf6, 0xfb, 0x86, 0xed, 0x8f, 0xd1, 0x77, 0x00, 0xfc, 0xc1,
0xc0, 0x67, 0xdf, 0x0e, 0xf0, 0xc7, 0x06, 0x19, 0x56, 0x5e, 0xff, 0xf4, 0x08, 0x56, 0xf0, 0xa7,
0x06, 0x59, 0x50, 0x2c, 0x7a, 0xf8, 0x4e, 0x93, 0x82, 0x95, 0xad, 0x78, 0xf8, 0x6e, 0x93, 0xdc,
0x3c, 0xb3, 0xdc, 0xe1, 0x7b, 0x4d, 0x93, 0x8e, 0x7c, 0xad, 0xc3, 0xf7, 0x4b, 0x00, 0x71, 0xc1,
0x0f, 0x9a, 0x66, 0x02, 0x8d, 0xac, 0x72, 0xf8, 0x61, 0x93, 0x6c, 0x3b, 0xbb, 0xc4, 0xe1, 0x47,
0x4d, 0x9b, 0xee, 0x7c, 0x7d, 0xc3, 0x8f, 0x9b, 0xd4, 0x01, 0x0f, 0x5e, 0xdc, 0xf0, 0xb2, 0xd1,
0x55, 0xac, 0x6c, 0x78, 0xa5, 0xb9, 0xb2, 0xcc, 0x26, 0x3b, 0x2a, 0x34, 0x7b, 0x63, 0x92, 0x55,
0x3b, 0x2a, 0x84, 0x31, 0x1a, 0xb3, 0xeb, 0x52, 0x86, 0x1b, 0xa7, 0x71, 0xf2, 0xcc, 0x7b, 0xc0,
0x59, 0x59, 0x67, 0xb3, 0x6d, 0xd9, 0x8f, 0x45, 0xde, 0x6e, 0x66, 0x55, 0xd8, 0x1d, 0x83, 0xbe,
0x2d, 0x95, 0x31, 0x9a, 0xd5, 0x1b, 0xa7, 0xe8, 0x0d, 0xcc, 0x46, 0x73, 0xe8, 0x48, 0x97, 0x28,
0xc8, 0x3e, 0x54, 0x56, 0x9e, 0x63, 0xd0, 0x96, 0x91, 0x0a, 0x94, 0xc6, 0xc8, 0x1b, 0xde, 0xc4,
0x13, 0x0c, 0xcd, 0xde, 0xd4, 0x89, 0x8c, 0xba, 0x30, 0x66, 0xbe, 0x13, 0xd0, 0xbc, 0xf7, 0xed,
0x76, 0x5d, 0xa7, 0xb7, 0x80, 0xf9, 0x18, 0x98, 0x61, 0x6c, 0xe3, 0x04, 0x23, 0x3d, 0x10, 0x61,
0x38, 0x84, 0x2a, 0x9d, 0xdb, 0x03, 0xa5, 0x65, 0x3f, 0xf8, 0x84, 0xd9, 0xdf, 0x5f, 0x76, 0x58,
0xc3, 0xae, 0xd2, 0xdc, 0x34, 0x7b, 0xdc, 0xc7, 0xc8, 0x0f, 0x8c, 0x70, 0x7a, 0xcb, 0x1a, 0x28,
0x5d, 0xfa, 0x4e, 0xc1, 0x74, 0xa0, 0x45, 0xa2, 0xb3, 0x8f, 0x0e, 0x0b, 0x75, 0xe4, 0xbd, 0x28,
0x94, 0xc2, 0x37, 0xfb, 0x3c, 0xbf, 0xba, 0x2f, 0x12, 0x65, 0x96, 0x3a, 0x3d, 0xf5, 0x53, 0xf9,
0x89, 0xf1, 0xc7, 0x87, 0xf1, 0x02, 0x2c, 0x7c, 0x9e, 0xa0, 0xe5, 0x69, 0x41, 0x53, 0xec, 0x59,
0xa5, 0xb3, 0x95, 0xeb, 0x8c, 0x15, 0x9f, 0x79, 0xc6, 0x9f, 0x62, 0x09, 0x8e, 0x51, 0x54, 0xb6,
0x42, 0x79, 0x24, 0x42, 0x70, 0xe8, 0x0d, 0x60, 0x8a, 0xa2, 0xb2, 0xf2, 0xe9, 0x71, 0x36, 0x7b,
0xe6, 0xa3, 0x8e, 0x6c, 0xcb, 0x0f, 0x6b, 0x21, 0x65, 0xee, 0x32, 0x7b, 0x28, 0x47, 0xee, 0x5b,
0xfa, 0x0e, 0x3d, 0x04, 0x73, 0xf2, 0x99, 0xed, 0x5f, 0xe1, 0x57, 0xd8, 0xc5, 0x82, 0x78, 0xff,
0xce, 0xa7, 0xc1, 0xdb, 0xca, 0x19, 0xce, 0x2e, 0xff, 0x1a, 0x45, 0x34, 0xa7, 0xd2, 0x34, 0xb0,
0x9f, 0x60, 0xc5, 0x17, 0xa8, 0x5d, 0x6a, 0x30, 0x41, 0x5f, 0x45, 0x85, 0x8d, 0x79, 0x59, 0xc1,
0x24, 0xc5, 0x30, 0x27, 0xa4, 0x0b, 0x67, 0x6a, 0x04, 0x4c, 0x17, 0x4f, 0x9d, 0x5e, 0xcd, 0x39,
0x48, 0x33, 0xab, 0x18, 0x17, 0x8c, 0xde, 0xea, 0x67, 0x42, 0x60, 0xe7, 0x52, 0x63, 0x84, 0x62,
0xb0, 0x0e, 0x6a, 0x11, 0x84, 0xd0, 0xa4, 0x44, 0x8d, 0xc4, 0xc5, 0xde, 0x98, 0x1e, 0x51, 0x9e,
0xee, 0xb0, 0x19, 0x7a, 0xcf, 0x14, 0xcf, 0x68, 0xb3, 0xfd, 0x66, 0x47, 0x30, 0x33, 0x1f, 0x01,
0x46, 0xd4, 0x95, 0xd6, 0x34, 0xcc, 0x8d, 0x3a, 0x6a, 0x0a, 0x04, 0xf8, 0x48, 0x74, 0xad, 0xdd,
0x7b, 0xf7, 0x22, 0x4c, 0x54, 0x2f, 0x88, 0x61, 0x7e, 0x24, 0x68, 0x76, 0x44, 0x99, 0xba, 0x58,
0x18, 0x09, 0x05, 0x99, 0x5e, 0x5c, 0x3a, 0x37, 0x9a, 0x30, 0x33, 0x24, 0x0a, 0xea, 0xe2, 0x08,
0x75, 0x47, 0x44, 0xa2, 0x5b, 0x52, 0x78, 0x7e, 0x44, 0x61, 0x69, 0x3a, 0xb5, 0x3e, 0x20, 0xd9,
0x5c, 0xfe, 0x17, 0xc4, 0x6d, 0x3c, 0xd5, 0xb7, 0xe5, 0xd1, 0x1d, 0x7e, 0x65, 0xd5, 0xfe, 0x75,
0xb8, 0x9a, 0xfd, 0x75, 0xb8, 0xba, 0x83, 0x4a, 0x91, 0xc8, 0xd8, 0xd4, 0x47, 0xeb, 0x2f, 0x93,
0xe6, 0xbf, 0x95, 0x47, 0x1e, 0xfc, 0x8f, 0x55, 0xe9, 0xbf, 0x12, 0x77, 0x36, 0x2e, 0x9d, 0xf6,
0x8e, 0xee, 0xac, 0x3f, 0xcb, 0x66, 0x02, 0x99, 0xdd, 0xeb, 0x26, 0xb1, 0xb7, 0xde, 0x68, 0x9b,
0x7b, 0xfb, 0x24, 0x63, 0xdf, 0xf9, 0xc8, 0x93, 0xdd, 0x40, 0xf7, 0x06, 0x47, 0x24, 0xed, 0x9a,
0x65, 0x7b, 0x22, 0x90, 0xe9, 0xaf, 0x6b, 0x41, 0xa4, 0x69, 0x62, 0x87, 0xf6, 0x4f, 0xcd, 0x6b,
0x56, 0x63, 0x7c, 0xf4, 0x79, 0xc7, 0x39, 0x9a, 0x30, 0xd0, 0x93, 0xff, 0x0e, 0x00, 0x00, 0xff,
0xff, 0xa4, 0x96, 0x88, 0xfc, 0x1a, 0x15, 0x00, 0x00,
}

View File

@ -263,6 +263,11 @@ message ReleaseCollectionRequest {
* WARNING: This API is experimental and not useful for now.
*/
message GetStatisticsRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeGetStatistics
object_name_index: 3
};
// Not useful for now
common.MsgBase base = 1;
// Not useful for now
@ -290,6 +295,11 @@ message GetStatisticsResponse {
* Get collection statistics like row_count.
*/
message GetCollectionStatisticsRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeGetStatistics
object_name_index: 3
};
// Not useful for now
common.MsgBase base = 1;
// Not useful for now
@ -518,6 +528,11 @@ message ShowSegmentsResponse {
* Create index for vector datas
*/
message CreateIndexRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeCreateIndex
object_name_index: 3
};
// Not useful for now
common.MsgBase base = 1;
// Not useful for now
@ -537,6 +552,11 @@ message CreateIndexRequest {
* Current release of Milvus only supports showing latest built index.
*/
message DescribeIndexRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeIndexDetail
object_name_index: 3
};
// Not useful for now
common.MsgBase base = 1;
// Not useful for now
@ -577,6 +597,11 @@ message DescribeIndexResponse {
* Get index building progress
*/
message GetIndexBuildProgressRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeIndexDetail
object_name_index: 3
};
// Not useful for now
common.MsgBase base = 1;
// Not useful for now
@ -596,6 +621,11 @@ message GetIndexBuildProgressResponse {
}
message GetIndexStateRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeIndexDetail
object_name_index: 3
};
common.MsgBase base = 1; // must
string db_name = 2 ;
string collection_name = 3; // must
@ -610,6 +640,11 @@ message GetIndexStateResponse {
}
message DropIndexRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeDropIndex
object_name_index: 3
};
common.MsgBase base = 1; // must
string db_name = 2;
string collection_name = 3; // must
@ -660,6 +695,11 @@ message DeleteRequest {
message SearchRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeSearch
object_name_index: 3
};
common.MsgBase base = 1; // must
string db_name = 2;
string collection_name = 3; // must
@ -688,6 +728,11 @@ message SearchResults {
}
message FlushRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeFlush
object_name_indexs: 3
};
common.MsgBase base = 1;
string db_name = 2;
repeated string collection_names = 3;
@ -700,6 +745,11 @@ message FlushResponse{
}
message QueryRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeQuery
object_name_index: 3
};
common.MsgBase base = 1;
string db_name = 2;
string collection_name = 3;
@ -821,6 +871,11 @@ message GetMetricsResponse {
* Do load balancing operation from src_nodeID to dst_nodeID.
*/
message LoadBalanceRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeLoadBalance
object_name_index: 5
};
common.MsgBase base = 1;
int64 src_nodeID = 2;
repeated int64 dst_nodeIDs = 3;
@ -880,6 +935,11 @@ message GetFlushStateResponse {
}
message ImportRequest {
option (common.privilege_ext_obj) = {
object_type: Collection
object_privilege: PrivilegeImport
object_name_index: 1
};
string collection_name = 1; // target collection
string partition_name = 2; // target partition
repeated string channel_names = 3; // channel names for the collection
@ -951,6 +1011,11 @@ service ProxyService {
// https://wiki.lfaidata.foundation/display/MIL/MEP+27+--+Support+Basic+Authentication
message CreateCredentialRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeCreateOwnership
object_name_index: -1
};
// Not useful for now
common.MsgBase base = 1;
// username
@ -964,6 +1029,11 @@ message CreateCredentialRequest {
}
message UpdateCredentialRequest {
option (common.privilege_ext_obj) = {
object_type: User
object_privilege: PrivilegeUpdateUser
object_name_index: 2
};
// Not useful for now
common.MsgBase base = 1;
// username
@ -979,6 +1049,11 @@ message UpdateCredentialRequest {
}
message DeleteCredentialRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeDropOwnership
object_name_index: -1
};
// Not useful for now
common.MsgBase base = 1;
// Not useful for now
@ -993,6 +1068,11 @@ message ListCredUsersResponse {
}
message ListCredUsersRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeSelectOwnership
object_name_index: -1
};
// Not useful for now
common.MsgBase base = 1;
}
@ -1007,6 +1087,11 @@ message UserEntity {
}
message CreateRoleRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeCreateOwnership
object_name_index: -1
};
// Not useful for now
common.MsgBase base = 1;
// role
@ -1014,6 +1099,11 @@ message CreateRoleRequest {
}
message DropRoleRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeDropOwnership
object_name_index: -1
};
// Not useful for now
common.MsgBase base = 1;
// role name
@ -1026,6 +1116,11 @@ enum OperateUserRoleType {
}
message OperateUserRoleRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeManageOwnership
object_name_index: -1
};
// Not useful for now
common.MsgBase base = 1;
// username
@ -1037,6 +1132,11 @@ message OperateUserRoleRequest {
}
message SelectRoleRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeSelectOwnership
object_name_index: -1
};
// Not useful for now
common.MsgBase base = 1;
// role
@ -1058,6 +1158,11 @@ message SelectRoleResponse {
}
message SelectUserRequest {
option (common.privilege_ext_obj) = {
object_type: User
object_privilege: PrivilegeSelectUser
object_name_index: 2
};
// Not useful for now
common.MsgBase base = 1;
// user
@ -1107,6 +1212,11 @@ message GrantEntity {
}
message SelectGrantRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeSelectOwnership
object_name_index: -1
};
// Not useful for now
common.MsgBase base = 1;
// grant
@ -1126,6 +1236,11 @@ enum OperatePrivilegeType {
}
message OperatePrivilegeRequest {
option (common.privilege_ext_obj) = {
object_type: Global
object_privilege: PrivilegeManageOwnership
object_name_index: -1
};
// Not useful for now
common.MsgBase base = 1;
// grant

View File

@ -7049,326 +7049,332 @@ func init() {
func init() { proto.RegisterFile("milvus.proto", fileDescriptor_02345ba45cc0e303) }
var fileDescriptor_02345ba45cc0e303 = []byte{
// 5101 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3d, 0x5b, 0x6c, 0x1c, 0x47,
0x72, 0x9c, 0x5d, 0xee, 0xab, 0xf6, 0xc1, 0x65, 0xf3, 0xb5, 0x5e, 0x49, 0x16, 0x35, 0xb6, 0xce,
0xb4, 0x74, 0xa2, 0x2c, 0xca, 0x96, 0xcf, 0xb2, 0xcf, 0xb6, 0x24, 0x5a, 0x12, 0x61, 0x3d, 0xe8,
0xa1, 0xec, 0xe0, 0x62, 0x18, 0x93, 0xe1, 0x4e, 0x73, 0x39, 0xd6, 0xec, 0xcc, 0x6a, 0x66, 0x96,
0x14, 0xfd, 0x11, 0x18, 0xb8, 0x4b, 0x72, 0x41, 0x9c, 0x3b, 0x1c, 0x72, 0xc8, 0xe1, 0x3e, 0xf2,
0x40, 0x90, 0x04, 0x08, 0x70, 0x09, 0x72, 0x49, 0x80, 0x00, 0xc9, 0x47, 0x12, 0xe0, 0x3e, 0x02,
0x23, 0x48, 0x2e, 0x5f, 0x41, 0x90, 0x7c, 0x1e, 0x02, 0xe4, 0x2f, 0x01, 0xee, 0x33, 0x41, 0x82,
0x7e, 0xcc, 0x6c, 0xcf, 0x6c, 0xcf, 0x72, 0xc9, 0x3d, 0x99, 0x14, 0xbf, 0xb6, 0xab, 0xab, 0xbb,
0xab, 0xab, 0xab, 0xab, 0xaa, 0xbb, 0xaa, 0x87, 0x50, 0xe9, 0x58, 0xf6, 0x4e, 0xcf, 0x5f, 0xee,
0x7a, 0x6e, 0xe0, 0xa2, 0x19, 0xb1, 0xb4, 0xcc, 0x0a, 0xcd, 0x4a, 0xcb, 0xed, 0x74, 0x5c, 0x87,
0x01, 0x9b, 0x15, 0xbf, 0xb5, 0x8d, 0x3b, 0x06, 0x2f, 0x2d, 0xb6, 0x5d, 0xb7, 0x6d, 0xe3, 0x8b,
0xb4, 0xb4, 0xd9, 0xdb, 0xba, 0x68, 0x62, 0xbf, 0xe5, 0x59, 0xdd, 0xc0, 0xf5, 0x18, 0x86, 0xfa,
0xdb, 0x0a, 0xa0, 0x1b, 0x1e, 0x36, 0x02, 0x7c, 0xcd, 0xb6, 0x0c, 0x5f, 0xc3, 0x8f, 0x7a, 0xd8,
0x0f, 0xd0, 0x4b, 0x30, 0xb9, 0x69, 0xf8, 0xb8, 0xa1, 0x2c, 0x2a, 0x4b, 0xe5, 0x95, 0x93, 0xcb,
0xb1, 0x81, 0xf9, 0x80, 0x77, 0xfd, 0xf6, 0x75, 0xc3, 0xc7, 0x1a, 0xc5, 0x44, 0x0b, 0x50, 0x30,
0x37, 0x75, 0xc7, 0xe8, 0xe0, 0x46, 0x66, 0x51, 0x59, 0x2a, 0x69, 0x79, 0x73, 0xf3, 0x9e, 0xd1,
0xc1, 0xe8, 0x05, 0x98, 0x6a, 0xb9, 0xb6, 0x8d, 0x5b, 0x81, 0xe5, 0x3a, 0x0c, 0x21, 0x4b, 0x11,
0x6a, 0x7d, 0x30, 0x45, 0x9c, 0x85, 0x9c, 0x41, 0x68, 0x68, 0x4c, 0xd2, 0x6a, 0x56, 0x50, 0x7d,
0xa8, 0xaf, 0x7a, 0x6e, 0xf7, 0x49, 0x51, 0x17, 0x0d, 0x9a, 0x15, 0x07, 0xfd, 0x2d, 0x05, 0xa6,
0xaf, 0xd9, 0x01, 0xf6, 0x8e, 0x29, 0x53, 0x7e, 0x90, 0x81, 0x05, 0xb6, 0x6a, 0x37, 0x22, 0xf4,
0xa3, 0xa4, 0x72, 0x1e, 0xf2, 0x4c, 0xee, 0x28, 0x99, 0x15, 0x8d, 0x97, 0xd0, 0x29, 0x00, 0x7f,
0xdb, 0xf0, 0x4c, 0x5f, 0x77, 0x7a, 0x9d, 0x46, 0x6e, 0x51, 0x59, 0xca, 0x69, 0x25, 0x06, 0xb9,
0xd7, 0xeb, 0x20, 0x0d, 0xa6, 0x5b, 0xae, 0xe3, 0x5b, 0x7e, 0x80, 0x9d, 0xd6, 0x9e, 0x6e, 0xe3,
0x1d, 0x6c, 0x37, 0xf2, 0x8b, 0xca, 0x52, 0x6d, 0xe5, 0xac, 0x94, 0xee, 0x1b, 0x7d, 0xec, 0x3b,
0x04, 0x59, 0xab, 0xb7, 0x12, 0x90, 0xab, 0xe8, 0xf3, 0x37, 0xa7, 0x8a, 0x4a, 0x5d, 0x69, 0xfc,
0x5f, 0xf8, 0xa7, 0xa8, 0xbf, 0xa3, 0xc0, 0x1c, 0x11, 0xa2, 0x63, 0xc1, 0xac, 0x90, 0xc2, 0x8c,
0x48, 0xe1, 0x1f, 0x29, 0x30, 0x7b, 0xdb, 0xf0, 0x8f, 0xc7, 0x6a, 0x9e, 0x02, 0x08, 0xac, 0x0e,
0xd6, 0xfd, 0xc0, 0xe8, 0x74, 0xe9, 0x8a, 0x4e, 0x6a, 0x25, 0x02, 0xd9, 0x20, 0x00, 0xf5, 0x6b,
0x50, 0xb9, 0xee, 0xba, 0xb6, 0x86, 0xfd, 0xae, 0xeb, 0xf8, 0x18, 0x5d, 0x86, 0xbc, 0x1f, 0x18,
0x41, 0xcf, 0xe7, 0x44, 0x9e, 0x90, 0x12, 0xb9, 0x41, 0x51, 0x34, 0x8e, 0x4a, 0xe4, 0x7a, 0xc7,
0xb0, 0x7b, 0x8c, 0xc6, 0xa2, 0xc6, 0x0a, 0xea, 0x87, 0x50, 0xdb, 0x08, 0x3c, 0xcb, 0x69, 0xff,
0x0c, 0x3b, 0x2f, 0x85, 0x9d, 0xff, 0x87, 0x02, 0xcf, 0xac, 0x52, 0xfd, 0xb7, 0x79, 0x4c, 0xb6,
0x8d, 0x0a, 0x95, 0x3e, 0x64, 0x6d, 0x95, 0xb2, 0x3a, 0xab, 0xc5, 0x60, 0x89, 0xc5, 0xc8, 0x25,
0x16, 0x23, 0x14, 0xa6, 0xac, 0x28, 0x4c, 0x9f, 0xe6, 0xa0, 0x29, 0x9b, 0xe8, 0x38, 0x2c, 0xfd,
0x6a, 0xb4, 0xc3, 0x33, 0xb4, 0x51, 0x62, 0x7f, 0x72, 0xab, 0xd3, 0x1f, 0x6d, 0x83, 0x02, 0x22,
0x45, 0x90, 0x9c, 0x69, 0x56, 0x32, 0xd3, 0x15, 0x98, 0xdb, 0xb1, 0xbc, 0xa0, 0x67, 0xd8, 0x7a,
0x6b, 0xdb, 0x70, 0x1c, 0x6c, 0x53, 0xde, 0x11, 0xd5, 0x97, 0x5d, 0x2a, 0x69, 0x33, 0xbc, 0xf2,
0x06, 0xab, 0x23, 0x0c, 0xf4, 0xd1, 0xcb, 0x30, 0xdf, 0xdd, 0xde, 0xf3, 0xad, 0xd6, 0x40, 0xa3,
0x1c, 0x6d, 0x34, 0x1b, 0xd6, 0xc6, 0x5a, 0x9d, 0x87, 0xe9, 0x16, 0xd5, 0x9e, 0xa6, 0x4e, 0x38,
0xc9, 0x58, 0x9b, 0xa7, 0xac, 0xad, 0xf3, 0x8a, 0x07, 0x21, 0x9c, 0x90, 0x15, 0x22, 0xf7, 0x82,
0x96, 0xd0, 0xa0, 0x40, 0x1b, 0xcc, 0xf0, 0xca, 0xf7, 0x83, 0x56, 0xbf, 0x4d, 0x5c, 0xef, 0x15,
0x93, 0x7a, 0xaf, 0x01, 0x05, 0xaa, 0xc7, 0xb1, 0xdf, 0x28, 0x51, 0x32, 0xc3, 0x22, 0x5a, 0x83,
0x29, 0x3f, 0x30, 0xbc, 0x40, 0xef, 0xba, 0xbe, 0x45, 0xf8, 0xe2, 0x37, 0x60, 0x31, 0xbb, 0x54,
0x5e, 0x59, 0x94, 0x2e, 0xd2, 0xbb, 0x78, 0x6f, 0xd5, 0x08, 0x8c, 0x75, 0xc3, 0xf2, 0xb4, 0x1a,
0x6d, 0xb8, 0x1e, 0xb6, 0x93, 0x2b, 0xd7, 0xf2, 0x58, 0xca, 0x55, 0x26, 0xd9, 0x15, 0x99, 0x64,
0xab, 0x7f, 0xad, 0xc0, 0xdc, 0x1d, 0xd7, 0x30, 0x8f, 0xc7, 0x3e, 0x3b, 0x0b, 0x35, 0x0f, 0x77,
0x6d, 0xab, 0x65, 0x90, 0xf5, 0xd8, 0xc4, 0x1e, 0xdd, 0x69, 0x39, 0xad, 0xca, 0xa1, 0xf7, 0x28,
0xf0, 0x6a, 0xe1, 0xf3, 0x37, 0x27, 0xeb, 0xb9, 0x46, 0x56, 0xfd, 0x9e, 0x02, 0x0d, 0x0d, 0xdb,
0xd8, 0xf0, 0x8f, 0x87, 0xa2, 0x60, 0x94, 0xe5, 0x1b, 0x59, 0xf5, 0x27, 0x0a, 0xcc, 0xde, 0xc2,
0x01, 0xd9, 0x9c, 0x96, 0x1f, 0x58, 0xad, 0x23, 0xf5, 0x4d, 0x5e, 0x80, 0xa9, 0xae, 0xe1, 0x05,
0x56, 0x84, 0x17, 0x6e, 0xd5, 0x5a, 0x04, 0x66, 0xfb, 0xed, 0x22, 0xcc, 0xb4, 0x7b, 0x86, 0x67,
0x38, 0x01, 0xc6, 0xc2, 0x06, 0x62, 0xca, 0x0c, 0x45, 0x55, 0xd1, 0xfe, 0x51, 0x7f, 0x49, 0x81,
0xb9, 0xc4, 0x34, 0xc7, 0x51, 0x5e, 0xaf, 0x42, 0x8e, 0xfc, 0xf2, 0x1b, 0x19, 0xba, 0x97, 0xce,
0xa4, 0xed, 0xa5, 0x0f, 0x88, 0x9d, 0xa0, 0x9b, 0x89, 0xe1, 0xab, 0xdf, 0x55, 0xe0, 0xd9, 0x5b,
0x38, 0x10, 0xd4, 0xda, 0x71, 0x60, 0xbc, 0xfa, 0x6d, 0x05, 0x4e, 0xa7, 0x92, 0x75, 0x24, 0x8c,
0xfa, 0xa9, 0x02, 0xf3, 0x1b, 0xdb, 0xee, 0x6e, 0x9f, 0xa4, 0x27, 0xc1, 0xa0, 0xb8, 0x2d, 0xcc,
0x26, 0x6c, 0x21, 0xba, 0x04, 0x93, 0xc1, 0x5e, 0x17, 0xd3, 0xcd, 0x5d, 0x5b, 0x39, 0xb5, 0x2c,
0x39, 0x2d, 0x2d, 0x13, 0x22, 0x1f, 0xec, 0x75, 0xb1, 0x46, 0x51, 0xd1, 0x8b, 0x50, 0x4f, 0xb0,
0x3c, 0xb4, 0x1c, 0x53, 0x71, 0x9e, 0xfb, 0xa1, 0xa5, 0x9d, 0x14, 0x2d, 0xed, 0x7f, 0x65, 0x60,
0x61, 0x60, 0xda, 0xe3, 0x2c, 0x80, 0x8c, 0x9e, 0x8c, 0x94, 0x1e, 0xa2, 0xd4, 0x04, 0x54, 0xcb,
0x24, 0x47, 0x98, 0xec, 0x52, 0x56, 0xab, 0x0a, 0x46, 0xd5, 0xf4, 0xd1, 0x05, 0x40, 0x03, 0xb6,
0x8e, 0xed, 0xd3, 0x49, 0x6d, 0x3a, 0x69, 0xec, 0xa8, 0x41, 0x95, 0x5a, 0x3b, 0xc6, 0x96, 0x49,
0x6d, 0x56, 0x62, 0xee, 0x7c, 0x74, 0x09, 0x66, 0x2d, 0xe7, 0x2e, 0xee, 0xb8, 0xde, 0x9e, 0xde,
0xc5, 0x5e, 0x0b, 0x3b, 0x81, 0xd1, 0xc6, 0x7e, 0x23, 0x4f, 0x29, 0x9a, 0x09, 0xeb, 0xd6, 0xfb,
0x55, 0xe8, 0x0a, 0x2c, 0x3c, 0xea, 0x61, 0x6f, 0x4f, 0xf7, 0xb1, 0xb7, 0x63, 0xb5, 0xb0, 0x6e,
0xec, 0x18, 0x96, 0x6d, 0x6c, 0xda, 0xb8, 0x51, 0x58, 0xcc, 0x2e, 0x15, 0xb5, 0x39, 0x5a, 0xbd,
0xc1, 0x6a, 0xaf, 0x85, 0x95, 0xea, 0x9f, 0x2b, 0x30, 0xcf, 0x8e, 0x3e, 0xeb, 0xa1, 0x92, 0x39,
0x62, 0xd3, 0x12, 0xd7, 0x81, 0xfc, 0xa0, 0x56, 0x8d, 0xa9, 0x40, 0xf5, 0x87, 0x0a, 0xcc, 0x92,
0x13, 0xc8, 0xd3, 0x44, 0xf3, 0x9f, 0x2a, 0x30, 0x73, 0xdb, 0xf0, 0x9f, 0x26, 0x92, 0xff, 0x8d,
0xbb, 0x1d, 0x11, 0xcd, 0x4f, 0x87, 0x7d, 0x1c, 0xf4, 0x4f, 0x72, 0x12, 0xff, 0x44, 0xfd, 0xcb,
0xbe, 0x5b, 0xf2, 0x74, 0x4d, 0x50, 0xfd, 0x2b, 0x05, 0x4e, 0xdd, 0xc2, 0x41, 0x44, 0xf5, 0xf1,
0xf0, 0x5f, 0x46, 0x14, 0xaa, 0x6f, 0x31, 0x27, 0x40, 0x4a, 0xfc, 0x91, 0x18, 0xdb, 0x5f, 0xcb,
0xc0, 0x1c, 0xb1, 0x3a, 0xc7, 0x43, 0x08, 0x46, 0x39, 0xc4, 0x4a, 0x04, 0x25, 0x27, 0xdd, 0x09,
0xa1, 0x09, 0xcf, 0x8f, 0x6c, 0xc2, 0xd5, 0x3f, 0xcb, 0x30, 0xd7, 0x43, 0xe4, 0xc6, 0x38, 0xcb,
0x22, 0xa1, 0x35, 0x23, 0xa5, 0x55, 0x85, 0x4a, 0x04, 0x59, 0x5b, 0x0d, 0xcd, 0x6f, 0x0c, 0x76,
0x5c, 0xad, 0xaf, 0xfa, 0x99, 0x02, 0xf3, 0xe1, 0x15, 0xc1, 0x06, 0x6e, 0x77, 0xb0, 0x13, 0x1c,
0x5e, 0x86, 0x92, 0x12, 0x90, 0x91, 0x48, 0xc0, 0x49, 0x28, 0xf9, 0x6c, 0x9c, 0xe8, 0xf4, 0xdf,
0x07, 0xa8, 0x7f, 0xa3, 0xc0, 0xc2, 0x00, 0x39, 0xe3, 0x2c, 0x62, 0x03, 0x0a, 0x96, 0x63, 0xe2,
0xc7, 0x11, 0x35, 0x61, 0x91, 0xd4, 0x6c, 0xf6, 0x2c, 0xdb, 0x8c, 0xc8, 0x08, 0x8b, 0xe8, 0x0c,
0x54, 0xb0, 0x43, 0x7c, 0x0c, 0x9d, 0xe2, 0x52, 0x41, 0x2e, 0x6a, 0x65, 0x06, 0x5b, 0x23, 0x20,
0xd2, 0x78, 0xcb, 0xc2, 0xb4, 0x71, 0x8e, 0x35, 0xe6, 0x45, 0xf5, 0xd7, 0x15, 0x98, 0x21, 0x52,
0xc8, 0xa9, 0xf7, 0x9f, 0x2c, 0x37, 0x17, 0xa1, 0x2c, 0x88, 0x19, 0x9f, 0x88, 0x08, 0x52, 0x1f,
0xc2, 0x6c, 0x9c, 0x9c, 0x71, 0xb8, 0xf9, 0x2c, 0x40, 0xb4, 0x56, 0x6c, 0x37, 0x64, 0x35, 0x01,
0xa2, 0x7e, 0x96, 0x09, 0x83, 0x08, 0x94, 0x4d, 0x47, 0x7c, 0x77, 0x49, 0x97, 0x44, 0xd4, 0xe7,
0x25, 0x0a, 0xa1, 0xd5, 0xab, 0x50, 0xc1, 0x8f, 0x03, 0xcf, 0xd0, 0xbb, 0x86, 0x67, 0x74, 0xd8,
0xb6, 0x1a, 0x49, 0xf5, 0x96, 0x69, 0xb3, 0x75, 0xda, 0x8a, 0x0c, 0x42, 0x45, 0x84, 0x0d, 0x92,
0x67, 0x83, 0x50, 0x08, 0x35, 0x18, 0x7f, 0x4f, 0x9c, 0x3d, 0x2e, 0xcd, 0xc7, 0x9d, 0x21, 0xf1,
0xa9, 0xe4, 0x92, 0x53, 0xf9, 0x03, 0x05, 0xea, 0x74, 0x0a, 0xab, 0x3c, 0x70, 0x64, 0xb9, 0x4e,
0xa2, 0x8d, 0x92, 0x68, 0x33, 0x64, 0xef, 0xbd, 0x06, 0x79, 0xce, 0xf7, 0xec, 0xa8, 0x7c, 0xe7,
0x0d, 0xf6, 0x99, 0x86, 0xfa, 0x7b, 0x0a, 0xcc, 0x25, 0x58, 0x3e, 0x8e, 0xc0, 0x3f, 0x00, 0xc4,
0x66, 0x68, 0xf6, 0xa7, 0x1d, 0xda, 0xe9, 0xb3, 0x52, 0xa3, 0x94, 0x64, 0x92, 0x36, 0x6d, 0x25,
0x20, 0xbe, 0xfa, 0x63, 0x05, 0x4e, 0xde, 0xc2, 0x01, 0x45, 0xbd, 0x4e, 0x94, 0xce, 0xba, 0xe7,
0xb6, 0x3d, 0xec, 0xfb, 0x4f, 0xaf, 0x7c, 0xfc, 0x26, 0x73, 0xec, 0x64, 0x53, 0x1a, 0x87, 0xff,
0x67, 0xa0, 0x42, 0xc7, 0xc0, 0xa6, 0xee, 0xb9, 0xbb, 0x3e, 0x97, 0xa3, 0x32, 0x87, 0x69, 0xee,
0x2e, 0x15, 0x88, 0xc0, 0x0d, 0x0c, 0x9b, 0x21, 0x70, 0x8b, 0x42, 0x21, 0xa4, 0x9a, 0xee, 0xc1,
0x90, 0x30, 0xd2, 0x39, 0x7e, 0x7a, 0x79, 0xfc, 0xfb, 0xec, 0x32, 0x4c, 0x9c, 0xca, 0x38, 0xbc,
0x7d, 0x85, 0xb9, 0x9d, 0x6c, 0x32, 0xb5, 0x95, 0xd3, 0xd2, 0x36, 0xc2, 0x60, 0x0c, 0x1b, 0x9d,
0x86, 0xf2, 0x96, 0x61, 0xd9, 0xba, 0x87, 0x0d, 0xdf, 0x75, 0xf8, 0x44, 0x81, 0x80, 0x34, 0x0a,
0x51, 0x7f, 0xa4, 0xb0, 0x48, 0xed, 0x53, 0xae, 0xf1, 0x7e, 0x90, 0x81, 0xea, 0x9a, 0xe3, 0x63,
0x2f, 0x38, 0xfe, 0x47, 0x13, 0xf4, 0x16, 0x94, 0xe9, 0xc4, 0x7c, 0xdd, 0x34, 0x02, 0x83, 0x5b,
0xb3, 0x67, 0xa5, 0xa1, 0x99, 0x9b, 0x04, 0x6f, 0xd5, 0x08, 0x0c, 0x8d, 0x71, 0xc7, 0x27, 0xbf,
0xd1, 0x09, 0x28, 0x6d, 0x1b, 0xfe, 0xb6, 0xfe, 0x10, 0xef, 0x31, 0x7f, 0xb1, 0xaa, 0x15, 0x09,
0xe0, 0x5d, 0xbc, 0xe7, 0xa3, 0x67, 0xa0, 0xe8, 0xf4, 0x3a, 0x6c, 0x83, 0x15, 0x16, 0x95, 0xa5,
0xaa, 0x56, 0x70, 0x7a, 0x1d, 0xb2, 0xbd, 0xd8, 0x85, 0x74, 0xb1, 0x91, 0x55, 0xff, 0x21, 0x03,
0xb5, 0xbb, 0x3d, 0x72, 0x22, 0xa2, 0x11, 0xa6, 0x9e, 0x1d, 0x1c, 0x4e, 0x2a, 0xcf, 0x41, 0x96,
0xf9, 0x16, 0xa4, 0x45, 0x43, 0x3a, 0x83, 0xb5, 0x55, 0x5f, 0x23, 0x48, 0x34, 0xba, 0xd2, 0x6b,
0xb5, 0xb8, 0x9b, 0x96, 0xa5, 0x54, 0x97, 0x08, 0x84, 0x39, 0x69, 0x27, 0xa0, 0x84, 0x3d, 0x2f,
0x72, 0xe2, 0xe8, 0x9c, 0xb0, 0xe7, 0xb1, 0x4a, 0x15, 0x2a, 0x46, 0xeb, 0xa1, 0xe3, 0xee, 0xda,
0xd8, 0x6c, 0x63, 0x93, 0xae, 0x7f, 0x51, 0x8b, 0xc1, 0x98, 0x84, 0x10, 0x09, 0xd0, 0x5b, 0x4e,
0x40, 0xcd, 0x7b, 0x96, 0x48, 0x08, 0x81, 0xdc, 0x70, 0x02, 0x52, 0x6d, 0x62, 0x1b, 0x07, 0x98,
0x56, 0x17, 0x58, 0x35, 0x83, 0xf0, 0xea, 0x5e, 0x37, 0x6a, 0x5d, 0x64, 0xd5, 0x0c, 0x42, 0xaa,
0x4f, 0x42, 0xa9, 0x7f, 0x03, 0x5e, 0xea, 0x5f, 0x61, 0xb2, 0x8b, 0xef, 0x9f, 0x28, 0x50, 0x5d,
0xa5, 0x5d, 0x3d, 0x05, 0xd2, 0x87, 0x60, 0x12, 0x3f, 0xee, 0x7a, 0x7c, 0x0f, 0xd1, 0xdf, 0x43,
0x05, 0x8a, 0x49, 0x4d, 0xa9, 0x91, 0x55, 0xff, 0x37, 0x0b, 0xd5, 0x0d, 0x6c, 0x78, 0xad, 0xed,
0xa7, 0xe2, 0x7e, 0xa6, 0x0e, 0x59, 0xd3, 0xb7, 0xf9, 0x3c, 0xc9, 0x4f, 0x74, 0x1e, 0xa6, 0xbb,
0xb6, 0xd1, 0xc2, 0xdb, 0xae, 0x6d, 0x62, 0x4f, 0x6f, 0x7b, 0x6e, 0x8f, 0x45, 0x10, 0x2b, 0x5a,
0x5d, 0xa8, 0xb8, 0x45, 0xe0, 0xe8, 0x55, 0x28, 0x9a, 0xbe, 0xad, 0xd3, 0x83, 0x6d, 0x81, 0x2a,
0x5d, 0xf9, 0xfc, 0x56, 0x7d, 0x9b, 0x9e, 0x6b, 0x0b, 0x26, 0xfb, 0x81, 0x9e, 0x83, 0xaa, 0xdb,
0x0b, 0xba, 0xbd, 0x40, 0x67, 0x5b, 0xb6, 0x51, 0xa4, 0xe4, 0x55, 0x18, 0x90, 0xee, 0x68, 0x1f,
0xdd, 0x84, 0xaa, 0x4f, 0x59, 0x19, 0xfa, 0xb4, 0xa5, 0x51, 0x7d, 0xab, 0x0a, 0x6b, 0xc7, 0x9d,
0xda, 0x17, 0xa1, 0x1e, 0x78, 0xc6, 0x0e, 0xb6, 0x85, 0x08, 0x0d, 0x50, 0xf9, 0x9c, 0x62, 0xf0,
0x7e, 0x78, 0x33, 0x25, 0x9e, 0x53, 0x4e, 0x8b, 0xe7, 0xa0, 0x1a, 0x64, 0x9c, 0x47, 0x34, 0x54,
0x98, 0xd5, 0x32, 0xce, 0x23, 0xf5, 0x5d, 0x98, 0xbc, 0x6d, 0x05, 0x94, 0xb1, 0x64, 0xd7, 0x2b,
0xf4, 0x44, 0x41, 0xf7, 0xf6, 0x33, 0x50, 0xf4, 0xdc, 0x5d, 0xa6, 0xce, 0x88, 0xbf, 0x55, 0xd1,
0x0a, 0x9e, 0xbb, 0x4b, 0x75, 0x15, 0x4d, 0x32, 0x71, 0x3d, 0xcc, 0xbc, 0xc7, 0x8c, 0xc6, 0x4b,
0xea, 0x9f, 0x28, 0x7d, 0x61, 0x22, 0x0a, 0xc8, 0x3f, 0x9c, 0x06, 0x7a, 0x0b, 0x0a, 0x1e, 0x6b,
0x3f, 0x34, 0xc4, 0x2d, 0x8e, 0x44, 0xd5, 0x69, 0xd8, 0x6a, 0xf4, 0xf0, 0xcd, 0x37, 0x14, 0xa8,
0xdc, 0xb4, 0x7b, 0xfe, 0x93, 0x10, 0x7e, 0x59, 0x00, 0x21, 0x2b, 0x0d, 0x20, 0xa8, 0xdf, 0xc9,
0x40, 0x95, 0x93, 0x31, 0x8e, 0x3f, 0x91, 0x4a, 0xca, 0x06, 0x94, 0xc9, 0x90, 0xba, 0x8f, 0xdb,
0xe1, 0xf5, 0x48, 0x79, 0x65, 0x45, 0xea, 0x3d, 0xc7, 0xc8, 0xa0, 0x59, 0x04, 0x1b, 0xb4, 0xd1,
0x3b, 0x4e, 0xe0, 0xed, 0x69, 0xd0, 0x8a, 0x00, 0xcd, 0x8f, 0x60, 0x2a, 0x51, 0x4d, 0x84, 0xe8,
0x21, 0xde, 0xe3, 0xe7, 0x10, 0xf2, 0x13, 0xbd, 0x2c, 0xe6, 0x7f, 0xa4, 0x19, 0xc4, 0x3b, 0xae,
0xd3, 0xbe, 0xe6, 0x79, 0xc6, 0x1e, 0xcf, 0x0f, 0xb9, 0x9a, 0xf9, 0x8a, 0xa2, 0xfe, 0x6d, 0x06,
0x2a, 0xef, 0xf5, 0xb0, 0xb7, 0x77, 0x94, 0x7a, 0x29, 0xd4, 0xab, 0x93, 0x82, 0x5e, 0x1d, 0x50,
0x05, 0x39, 0x89, 0x2a, 0x90, 0x28, 0xb4, 0xbc, 0x54, 0xa1, 0xc9, 0xf6, 0x7a, 0xe1, 0x40, 0x7b,
0xbd, 0x98, 0x1a, 0xbb, 0xfd, 0x63, 0x25, 0x62, 0xe1, 0x58, 0xbb, 0x31, 0xe6, 0xd9, 0x64, 0x0e,
0xec, 0xd9, 0x8c, 0xbc, 0x1b, 0x7f, 0xa8, 0x40, 0xe9, 0x03, 0xdc, 0x0a, 0x5c, 0x8f, 0xe8, 0x1f,
0x49, 0x33, 0x65, 0x04, 0x2f, 0x33, 0x93, 0xf4, 0x32, 0x2f, 0x43, 0xd1, 0x32, 0x75, 0x83, 0xc8,
0x17, 0x1d, 0x77, 0x98, 0x53, 0x53, 0xb0, 0x4c, 0x2a, 0x88, 0xa3, 0xdf, 0xa7, 0x7f, 0x4f, 0x81,
0x0a, 0xa3, 0xd9, 0x67, 0x2d, 0x5f, 0x17, 0x86, 0x53, 0x64, 0x42, 0xcf, 0x0b, 0xd1, 0x44, 0x6f,
0x4f, 0xf4, 0x87, 0xbd, 0x06, 0x40, 0x98, 0xcc, 0x9b, 0xb3, 0x3d, 0xb3, 0x28, 0xa5, 0x96, 0x35,
0xa7, 0x0c, 0xbf, 0x3d, 0xa1, 0x95, 0x48, 0x2b, 0xda, 0xc5, 0xf5, 0x02, 0xe4, 0x68, 0x6b, 0xf5,
0x7f, 0x14, 0x98, 0xb9, 0x61, 0xd8, 0xad, 0x55, 0xcb, 0x0f, 0x0c, 0xa7, 0x35, 0x86, 0x1b, 0x73,
0x15, 0x0a, 0x6e, 0x57, 0xb7, 0xf1, 0x56, 0xc0, 0x49, 0x3a, 0x33, 0x64, 0x46, 0x8c, 0x0d, 0x5a,
0xde, 0xed, 0xde, 0xc1, 0x5b, 0x01, 0x7a, 0x03, 0x8a, 0x6e, 0x57, 0xf7, 0xac, 0xf6, 0x76, 0xc0,
0xb9, 0x3f, 0x42, 0xe3, 0x82, 0xdb, 0xd5, 0x48, 0x0b, 0xe1, 0x9a, 0x62, 0xf2, 0x80, 0xd7, 0x14,
0xea, 0x3f, 0x0f, 0x4c, 0x7f, 0x8c, 0x3d, 0x70, 0x15, 0x8a, 0x96, 0x13, 0xe8, 0xa6, 0xe5, 0x87,
0x2c, 0x38, 0x25, 0x97, 0x21, 0x27, 0xa0, 0x33, 0xa0, 0x6b, 0xea, 0x04, 0x64, 0x6c, 0xf4, 0x36,
0xc0, 0x96, 0xed, 0x1a, 0xbc, 0x35, 0xe3, 0xc1, 0x69, 0xf9, 0xf6, 0x21, 0x68, 0x61, 0xfb, 0x12,
0x6d, 0x44, 0x7a, 0xe8, 0x2f, 0xe9, 0x3f, 0x29, 0x30, 0xb7, 0x8e, 0x3d, 0x96, 0x09, 0x14, 0xf0,
0x1b, 0xc5, 0x35, 0x67, 0xcb, 0x8d, 0x5f, 0xea, 0x2a, 0x89, 0x4b, 0xdd, 0x9f, 0xcd, 0x45, 0x66,
0xec, 0x10, 0xc2, 0x42, 0x0b, 0xe1, 0x21, 0x24, 0x0c, 0xa0, 0xb0, 0x43, 0x5c, 0x2d, 0x65, 0x99,
0x38, 0xbd, 0xe2, 0x59, 0x56, 0xfd, 0x0d, 0x96, 0x3f, 0x21, 0x9d, 0xd4, 0xe1, 0x05, 0x76, 0x1e,
0xb8, 0xa6, 0x4f, 0xe8, 0xfd, 0x2f, 0x41, 0x42, 0x77, 0xa4, 0x28, 0xa2, 0xef, 0x2b, 0xb0, 0x98,
0x4e, 0xd5, 0x38, 0x26, 0xfa, 0x6d, 0xc8, 0x59, 0xce, 0x96, 0x1b, 0xde, 0x60, 0x9d, 0x93, 0xee,
0x05, 0xf9, 0xb8, 0xac, 0xa1, 0xfa, 0xe3, 0x0c, 0xd4, 0xdf, 0x63, 0xf1, 0xf8, 0x2f, 0x7c, 0xf9,
0x3b, 0xb8, 0xa3, 0xfb, 0xd6, 0x27, 0x38, 0x5c, 0xfe, 0x0e, 0xee, 0x6c, 0x58, 0x9f, 0xe0, 0x98,
0x64, 0xe4, 0xe2, 0x92, 0x31, 0xfc, 0x82, 0x56, 0xbc, 0xa1, 0x2c, 0xc4, 0x6f, 0x28, 0xe7, 0x21,
0xef, 0xb8, 0x26, 0x5e, 0x5b, 0xe5, 0x07, 0x37, 0x5e, 0xea, 0x8b, 0x5a, 0xe9, 0x60, 0xa2, 0x46,
0x86, 0xa2, 0x5d, 0x98, 0x2c, 0x91, 0x8f, 0xd0, 0xc8, 0x8a, 0xea, 0xb7, 0x14, 0x68, 0xde, 0xc2,
0x41, 0x92, 0xab, 0x47, 0x27, 0x7f, 0xdf, 0x56, 0xe0, 0x84, 0x94, 0xa0, 0x71, 0x44, 0xef, 0xf5,
0xb8, 0xe8, 0xc9, 0x2f, 0x4f, 0x07, 0x86, 0xe4, 0x52, 0x77, 0x09, 0x2a, 0xab, 0xbd, 0x4e, 0x27,
0x72, 0xc6, 0xce, 0x40, 0xc5, 0x63, 0x3f, 0xd9, 0x61, 0x8a, 0x59, 0xe6, 0x32, 0x87, 0x91, 0x23,
0x93, 0x7a, 0x1e, 0xaa, 0xbc, 0x09, 0xa7, 0xba, 0x09, 0x45, 0x8f, 0xff, 0xe6, 0xf8, 0x51, 0x59,
0x9d, 0x83, 0x19, 0x0d, 0xb7, 0x89, 0xd0, 0x7b, 0x77, 0x2c, 0xe7, 0x21, 0x1f, 0x46, 0xfd, 0xba,
0x02, 0xb3, 0x71, 0x38, 0xef, 0xeb, 0x0a, 0x14, 0x0c, 0xd3, 0xf4, 0xb0, 0xef, 0x0f, 0x5d, 0x96,
0x6b, 0x0c, 0x47, 0x0b, 0x91, 0x05, 0xce, 0x65, 0x46, 0xe6, 0x9c, 0xaa, 0xc3, 0xf4, 0x2d, 0x1c,
0xdc, 0xc5, 0x81, 0x37, 0x56, 0x98, 0xbc, 0x41, 0x8e, 0x35, 0xb4, 0x31, 0x17, 0x8b, 0xb0, 0xa8,
0x7e, 0xa6, 0x00, 0x12, 0x47, 0x18, 0x67, 0x99, 0x45, 0x2e, 0x67, 0xe2, 0x5c, 0x66, 0x89, 0x4a,
0x9d, 0xae, 0xeb, 0x60, 0x27, 0x10, 0x1d, 0xb1, 0x6a, 0x04, 0x0d, 0x73, 0x37, 0xd0, 0x1d, 0xd7,
0x30, 0xaf, 0x1b, 0xf6, 0x78, 0x8e, 0xc3, 0x29, 0x00, 0xdf, 0x6b, 0xe9, 0x7c, 0x1f, 0x67, 0xb8,
0x5e, 0xf2, 0x5a, 0xf7, 0xd8, 0x56, 0x3e, 0x0d, 0x65, 0xd3, 0x0f, 0x78, 0x75, 0x18, 0xb5, 0x05,
0xd3, 0x0f, 0x58, 0x3d, 0xcd, 0x0e, 0xf6, 0xb1, 0x61, 0x63, 0x53, 0x17, 0x82, 0x5e, 0x93, 0x14,
0xad, 0xce, 0x2a, 0x36, 0x22, 0xb8, 0x64, 0x73, 0xe5, 0xa4, 0x9b, 0x6b, 0x0b, 0x16, 0xee, 0x1a,
0x4e, 0xcf, 0xb0, 0x6f, 0xb8, 0x9d, 0xae, 0x11, 0x4b, 0x28, 0x4d, 0x2a, 0x4a, 0x45, 0xa2, 0x28,
0x9f, 0x65, 0x99, 0x6f, 0xcc, 0x39, 0xa7, 0x73, 0x9a, 0xd4, 0x04, 0x08, 0xbb, 0x59, 0x29, 0x34,
0x14, 0xd5, 0x87, 0xc6, 0xe0, 0x38, 0xe3, 0xac, 0x2c, 0xa5, 0x2e, 0xec, 0x4a, 0x54, 0xe3, 0x7d,
0x98, 0xfa, 0x16, 0x3c, 0x43, 0xd3, 0x11, 0x43, 0x50, 0xec, 0xc2, 0x3d, 0xd9, 0x81, 0x22, 0xe9,
0xe0, 0x57, 0x32, 0x54, 0x17, 0x0e, 0xf4, 0x30, 0x0e, 0xe1, 0x57, 0xe3, 0xf7, 0xdc, 0xcf, 0xa7,
0xe4, 0x3c, 0xc7, 0x47, 0xe4, 0x5a, 0x7b, 0x09, 0xa6, 0xf0, 0x63, 0xdc, 0xea, 0x05, 0x96, 0xd3,
0x5e, 0xb7, 0x0d, 0xe7, 0x9e, 0xcb, 0x6d, 0x53, 0x12, 0x8c, 0x9e, 0x87, 0x2a, 0x59, 0x06, 0xb7,
0x17, 0x70, 0x3c, 0x66, 0xa4, 0xe2, 0x40, 0xd2, 0x1f, 0x99, 0xaf, 0x8d, 0x03, 0x6c, 0x72, 0x3c,
0x66, 0xb1, 0x92, 0xe0, 0x01, 0x56, 0x12, 0xb0, 0x7f, 0x10, 0x56, 0xfe, 0x8b, 0x92, 0x60, 0x25,
0xef, 0xe1, 0xa8, 0x58, 0x79, 0x1b, 0xa0, 0x83, 0xbd, 0x36, 0x5e, 0xa3, 0x56, 0x80, 0x5d, 0x02,
0x2c, 0x49, 0xad, 0x40, 0xbf, 0x83, 0xbb, 0x61, 0x03, 0x4d, 0x68, 0xab, 0xde, 0x82, 0x19, 0x09,
0x0a, 0x51, 0x70, 0xbe, 0xdb, 0xf3, 0x5a, 0x38, 0xbc, 0x47, 0x0a, 0x8b, 0xc4, 0x20, 0x06, 0x86,
0xd7, 0xc6, 0x01, 0x17, 0x5a, 0x5e, 0x52, 0xaf, 0xd0, 0xd0, 0x10, 0xbd, 0x73, 0x88, 0x49, 0x6a,
0x3c, 0xcc, 0xad, 0x0c, 0x84, 0xb9, 0xb7, 0x68, 0x1c, 0x46, 0x6c, 0x37, 0x66, 0x8a, 0xc2, 0x16,
0xe9, 0x0a, 0x9b, 0xfc, 0x0d, 0x4c, 0x58, 0x54, 0x7f, 0xaa, 0x40, 0x75, 0xad, 0xd3, 0x75, 0xfb,
0x21, 0x88, 0x91, 0x4f, 0xa5, 0x83, 0x37, 0xb7, 0x19, 0xd9, 0xcd, 0xed, 0x73, 0x50, 0x8d, 0xbf,
0x96, 0x60, 0x57, 0x44, 0x95, 0x96, 0xf8, 0x4a, 0xe2, 0x04, 0x94, 0x3c, 0x77, 0x57, 0x27, 0x3a,
0xd5, 0xe4, 0xc9, 0x10, 0x45, 0xcf, 0xdd, 0x25, 0x9a, 0xd6, 0x44, 0xb3, 0x90, 0xdb, 0xb2, 0xec,
0x28, 0x8f, 0x87, 0x15, 0xd0, 0xeb, 0xe4, 0xcc, 0xc6, 0x82, 0xa5, 0xf9, 0x51, 0x8f, 0x4e, 0x61,
0x0b, 0xf5, 0x43, 0xa8, 0x85, 0xb3, 0x1e, 0xf3, 0xf1, 0x4f, 0x60, 0xf8, 0x0f, 0xc3, 0x3c, 0x05,
0x56, 0x50, 0xcf, 0xb3, 0x18, 0x1a, 0xed, 0x3f, 0xb6, 0xe8, 0x08, 0x26, 0x09, 0x06, 0xdf, 0x4b,
0xf4, 0xb7, 0xfa, 0x8f, 0x19, 0x98, 0x4f, 0x62, 0x8f, 0x43, 0xd2, 0x95, 0xf8, 0xfe, 0x91, 0xbf,
0xe5, 0x10, 0x47, 0xe3, 0x7b, 0x87, 0xaf, 0x40, 0xcb, 0xed, 0x39, 0x01, 0x57, 0x40, 0x64, 0x05,
0x6e, 0x90, 0x32, 0x5a, 0x80, 0x82, 0x65, 0xea, 0x36, 0x39, 0xde, 0x31, 0xe3, 0x94, 0xb7, 0xcc,
0x3b, 0xe4, 0xe8, 0xf7, 0x6a, 0xe8, 0x72, 0x8d, 0x9c, 0xdc, 0xc0, 0xf0, 0x51, 0x0d, 0x32, 0x96,
0xc9, 0xe3, 0x1d, 0x19, 0xcb, 0x24, 0xc2, 0x44, 0xef, 0x05, 0x68, 0x22, 0x2e, 0xcf, 0xcc, 0x25,
0x52, 0x50, 0x25, 0xd0, 0xf7, 0x42, 0x20, 0xf1, 0xca, 0x28, 0x1a, 0x8f, 0xce, 0x52, 0xcf, 0xb9,
0xa8, 0x95, 0x09, 0x6c, 0x8d, 0x81, 0xd4, 0x06, 0xcc, 0x13, 0xd2, 0xd8, 0x14, 0x1f, 0x90, 0x05,
0x09, 0x7d, 0xad, 0xef, 0x28, 0xb0, 0x30, 0x50, 0x35, 0x0e, 0xaf, 0xaf, 0x89, 0xcb, 0x5f, 0x5e,
0x39, 0x2f, 0x55, 0x35, 0xf2, 0xc5, 0x0d, 0x65, 0xe5, 0xbb, 0xcc, 0x31, 0xd2, 0x58, 0xf2, 0xe5,
0x13, 0x4e, 0xe5, 0x59, 0x82, 0xfa, 0xae, 0x15, 0x6c, 0xeb, 0xf4, 0x75, 0x10, 0xf5, 0x4a, 0x58,
0x34, 0xbb, 0xa8, 0xd5, 0x08, 0x7c, 0x83, 0x80, 0x89, 0x67, 0xe2, 0xab, 0xdf, 0x54, 0x60, 0x26,
0x46, 0xd6, 0x38, 0x6c, 0x7a, 0x83, 0x38, 0x6c, 0xac, 0x23, 0xce, 0xa9, 0x45, 0x29, 0xa7, 0xf8,
0x68, 0x54, 0x19, 0x47, 0x2d, 0xd4, 0x7f, 0x55, 0xa0, 0x2c, 0xd4, 0x90, 0x93, 0x20, 0xaf, 0xeb,
0x9f, 0x04, 0x23, 0xc0, 0x48, 0x6c, 0x78, 0x0e, 0xfa, 0x2a, 0x4a, 0x48, 0x66, 0x17, 0xb2, 0xe9,
0x4c, 0x1f, 0xdd, 0x86, 0x1a, 0x63, 0x53, 0x44, 0xba, 0xf4, 0x82, 0x26, 0xca, 0x13, 0x34, 0x3c,
0x93, 0x53, 0xa9, 0x55, 0x7d, 0xa1, 0xc4, 0x42, 0x9b, 0xae, 0x89, 0xe9, 0x48, 0xb9, 0x81, 0x73,
0x59, 0x45, 0x6c, 0x4a, 0x7c, 0x5b, 0x1b, 0x1b, 0x26, 0xf6, 0xa2, 0xb9, 0x45, 0x65, 0xe2, 0x4c,
0xb2, 0xdf, 0x3a, 0xf1, 0xf5, 0xb9, 0xb2, 0x05, 0x06, 0x22, 0xc7, 0x00, 0xf4, 0x25, 0x98, 0x32,
0x3b, 0xb1, 0xa7, 0x69, 0xa1, 0xf7, 0x6b, 0x76, 0x84, 0x37, 0x69, 0x31, 0x82, 0x26, 0xe3, 0x04,
0xfd, 0xb7, 0x12, 0x3d, 0xf6, 0xf5, 0xb0, 0x89, 0x9d, 0xc0, 0x32, 0xec, 0xc3, 0xcb, 0x64, 0x13,
0x8a, 0x3d, 0x1f, 0x7b, 0x82, 0x6d, 0x88, 0xca, 0xa4, 0xae, 0x6b, 0xf8, 0xfe, 0xae, 0xeb, 0x99,
0x9c, 0xca, 0xa8, 0x3c, 0x24, 0x35, 0x91, 0x3d, 0x10, 0x95, 0xa7, 0x26, 0x5e, 0x81, 0x85, 0x8e,
0x6b, 0x5a, 0x5b, 0x96, 0x2c, 0xa3, 0x91, 0x34, 0x9b, 0x0b, 0xab, 0x63, 0xed, 0xd4, 0xef, 0x67,
0x60, 0xe1, 0xfd, 0xae, 0xf9, 0x05, 0xcc, 0x79, 0x11, 0xca, 0xae, 0x6d, 0xae, 0xc7, 0xa7, 0x2d,
0x82, 0x08, 0x86, 0x83, 0x77, 0x23, 0x0c, 0x76, 0x2b, 0x2f, 0x82, 0x86, 0xa6, 0x6d, 0x1e, 0x8a,
0x37, 0xf9, 0x61, 0xbc, 0x69, 0xc3, 0x02, 0x0b, 0x11, 0x3f, 0x61, 0xd6, 0xa8, 0x1f, 0xc3, 0x1c,
0x51, 0xcd, 0x64, 0x98, 0xf7, 0x7d, 0xec, 0x8d, 0xa9, 0x71, 0x4e, 0x42, 0x29, 0xec, 0x39, 0xcc,
0xa8, 0xed, 0x03, 0xd4, 0xdb, 0x30, 0x9b, 0x18, 0xeb, 0x90, 0x33, 0x52, 0x17, 0x01, 0x34, 0xd7,
0xc6, 0xef, 0x38, 0x81, 0x15, 0xec, 0x11, 0xf3, 0x2e, 0xb8, 0x4b, 0xf4, 0x37, 0xc1, 0x20, 0x63,
0x0c, 0xc1, 0xf8, 0x45, 0x98, 0x66, 0x3b, 0x8e, 0xf4, 0x74, 0x78, 0xe6, 0xbe, 0x0a, 0x79, 0x4c,
0x07, 0xe1, 0xe7, 0xfe, 0xd3, 0x72, 0x15, 0x1b, 0x51, 0xab, 0x71, 0x74, 0xf5, 0x17, 0x60, 0x6a,
0xd5, 0x73, 0xbb, 0xe3, 0x8d, 0x4e, 0xbd, 0x07, 0x1b, 0x8b, 0x6e, 0x60, 0x91, 0x00, 0xe8, 0x79,
0xf4, 0xef, 0x14, 0x98, 0xbf, 0xdf, 0xc5, 0x9e, 0x11, 0x60, 0xc2, 0x8b, 0xf1, 0x46, 0x1a, 0xb6,
0xbf, 0x62, 0x54, 0x64, 0xe3, 0x54, 0xa0, 0x37, 0x62, 0x2f, 0xb6, 0xe4, 0xc7, 0x82, 0x04, 0x95,
0x42, 0xe6, 0xf7, 0x1f, 0x2a, 0x30, 0xbd, 0x81, 0x89, 0x0d, 0x19, 0x8f, 0xfc, 0xcb, 0x30, 0x49,
0x28, 0x1a, 0x75, 0x91, 0x28, 0x32, 0x3a, 0x07, 0xd3, 0x96, 0xd3, 0xb2, 0x7b, 0x26, 0xd6, 0xc9,
0x5c, 0x75, 0xe2, 0x42, 0x71, 0xc3, 0x3d, 0xc5, 0x2b, 0x08, 0xc9, 0xc4, 0x3c, 0xaa, 0x8f, 0x99,
0x48, 0x46, 0xf9, 0x31, 0x6c, 0x38, 0xe5, 0x20, 0xc3, 0xbd, 0x02, 0x39, 0x32, 0x4c, 0x68, 0xac,
0xe5, 0xad, 0xfa, 0x52, 0xad, 0x31, 0x6c, 0xf5, 0x1b, 0x0a, 0x20, 0x91, 0x45, 0xe3, 0x6c, 0xe0,
0xd7, 0xc4, 0x00, 0x79, 0x76, 0x28, 0xe9, 0x6c, 0xa6, 0x51, 0x68, 0x5c, 0x58, 0x29, 0xba, 0x8c,
0xe3, 0xac, 0x14, 0x99, 0xd7, 0xd0, 0x95, 0x12, 0x98, 0x40, 0x91, 0xc5, 0x95, 0xa2, 0x92, 0x28,
0x59, 0x29, 0x42, 0x73, 0xb8, 0x52, 0x8c, 0xc2, 0x70, 0xa5, 0xe8, 0x70, 0xca, 0x41, 0x86, 0x7b,
0x05, 0x72, 0x64, 0x98, 0xfd, 0x99, 0x14, 0xae, 0x14, 0xc5, 0x16, 0x56, 0x8a, 0x13, 0xf0, 0xe4,
0x57, 0xaa, 0x3f, 0xd3, 0xfe, 0x4a, 0xa9, 0x50, 0xb9, 0xbf, 0xf9, 0x31, 0x6e, 0x05, 0x43, 0xb4,
0xe3, 0x59, 0x98, 0x5a, 0xf7, 0xac, 0x1d, 0xcb, 0xc6, 0xed, 0x61, 0x6a, 0xf6, 0x9b, 0x0a, 0x54,
0x6f, 0x79, 0x86, 0x13, 0xb8, 0xa1, 0xaa, 0x3d, 0x14, 0x3f, 0xaf, 0x43, 0xa9, 0x1b, 0x8e, 0xc6,
0x17, 0xfe, 0x79, 0x79, 0x00, 0x23, 0x4e, 0x93, 0xd6, 0x6f, 0xa6, 0x7e, 0x00, 0xb3, 0x94, 0x92,
0x24, 0xd9, 0x6f, 0x42, 0x91, 0x6a, 0x5c, 0x8b, 0x5f, 0x1e, 0x94, 0x57, 0x54, 0xf9, 0x79, 0x41,
0x9c, 0x86, 0x16, 0xb5, 0x51, 0xff, 0x5d, 0x81, 0x32, 0xad, 0xeb, 0x4f, 0xf0, 0xe0, 0x5b, 0xfb,
0x35, 0xc8, 0xbb, 0x94, 0xe5, 0x43, 0xe3, 0x9c, 0xe2, 0xaa, 0x68, 0xbc, 0x01, 0x71, 0x3f, 0xd9,
0x2f, 0x51, 0xbd, 0x02, 0x03, 0x71, 0x05, 0x5b, 0x68, 0x33, 0xda, 0xa9, 0x8e, 0x1d, 0x6d, 0x7e,
0x61, 0x13, 0xf5, 0xd3, 0x48, 0x26, 0x29, 0xc2, 0xe1, 0xf7, 0xed, 0x57, 0x12, 0x86, 0x70, 0x31,
0x9d, 0x8a, 0x84, 0x25, 0x24, 0x87, 0x9e, 0x18, 0x09, 0x63, 0x1e, 0x7a, 0xa2, 0xe5, 0x1e, 0x76,
0xe8, 0x11, 0x09, 0xe9, 0x2f, 0xf6, 0x8f, 0x14, 0x58, 0xe0, 0xc6, 0x28, 0x92, 0xa3, 0x23, 0x60,
0x09, 0xfa, 0x2a, 0x37, 0x9a, 0x59, 0x6a, 0x34, 0x5f, 0x1c, 0x66, 0x34, 0x23, 0x3a, 0x05, 0xab,
0x79, 0x16, 0x4a, 0x77, 0x29, 0xd2, 0x3b, 0x8f, 0x03, 0xd4, 0x80, 0xc2, 0x0e, 0xf6, 0x7c, 0xcb,
0x75, 0xf8, 0xd6, 0x0d, 0x8b, 0xe7, 0xce, 0x40, 0x31, 0x7c, 0x68, 0x85, 0x0a, 0x90, 0xbd, 0x66,
0xdb, 0xf5, 0x09, 0x54, 0x81, 0xe2, 0x1a, 0x7f, 0x4d, 0x54, 0x57, 0xce, 0xbd, 0x0d, 0x33, 0x12,
0xe3, 0x8c, 0xa6, 0xa1, 0x7a, 0xcd, 0xa4, 0x5e, 0xdc, 0x03, 0x97, 0x00, 0xeb, 0x13, 0x68, 0x1e,
0x90, 0x86, 0x3b, 0xee, 0x0e, 0x45, 0xbc, 0xe9, 0xb9, 0x1d, 0x0a, 0x57, 0xce, 0x5d, 0x80, 0x59,
0x19, 0xa5, 0xa8, 0x04, 0x39, 0x3a, 0xf3, 0xfa, 0x04, 0x02, 0xc8, 0x6b, 0x78, 0xc7, 0x7d, 0x88,
0xeb, 0xca, 0xca, 0x5f, 0x9c, 0x83, 0x2a, 0xa3, 0x9d, 0x3f, 0x0b, 0x46, 0x3a, 0xd4, 0x93, 0xdf,
0x41, 0x42, 0x5f, 0x96, 0xdf, 0x2e, 0xca, 0x3f, 0x97, 0xd4, 0x1c, 0x26, 0x38, 0xea, 0x04, 0xfa,
0x10, 0x6a, 0xf1, 0x2f, 0x07, 0x21, 0x79, 0xf4, 0x54, 0xfa, 0x79, 0xa1, 0xfd, 0x3a, 0xd7, 0xa1,
0x1a, 0xfb, 0xe8, 0x0f, 0x92, 0x2f, 0xa6, 0xec, 0xc3, 0x40, 0x4d, 0xb9, 0x96, 0x10, 0x3f, 0xcc,
0xc3, 0xa8, 0x8f, 0x7f, 0x85, 0x23, 0x85, 0x7a, 0xe9, 0xa7, 0x3a, 0xf6, 0xa3, 0xde, 0x80, 0xe9,
0x81, 0x8f, 0x64, 0xa0, 0x0b, 0x29, 0xb7, 0x08, 0xf2, 0x8f, 0x69, 0xec, 0x37, 0xc4, 0x2e, 0xa0,
0xc1, 0x0f, 0xd9, 0xa0, 0x65, 0xf9, 0x0a, 0xa4, 0x7d, 0xda, 0xa7, 0x79, 0x71, 0x64, 0xfc, 0x88,
0x71, 0xbf, 0xac, 0xc0, 0x42, 0xca, 0x17, 0x16, 0xd0, 0xe5, 0xb4, 0x2b, 0xa5, 0x21, 0x9f, 0x89,
0x68, 0xbe, 0x7c, 0xb0, 0x46, 0x11, 0x21, 0x0e, 0x4c, 0x25, 0x3e, 0x30, 0x80, 0xce, 0xa7, 0xbe,
0x8a, 0x1c, 0xfc, 0xfa, 0x42, 0xf3, 0xcb, 0xa3, 0x21, 0x47, 0xe3, 0x7d, 0x04, 0x53, 0x89, 0xd7,
0xf5, 0x29, 0xe3, 0xc9, 0xdf, 0xe0, 0xef, 0xb7, 0xa0, 0x5f, 0x83, 0x6a, 0xec, 0x19, 0x7c, 0x8a,
0xc4, 0xcb, 0x9e, 0xca, 0xef, 0xd7, 0xf5, 0x47, 0x50, 0x11, 0x5f, 0xab, 0xa3, 0xa5, 0xb4, 0xbd,
0x34, 0xd0, 0xf1, 0x41, 0xb6, 0x52, 0xff, 0x95, 0xe9, 0x90, 0xad, 0x34, 0xf0, 0x30, 0x77, 0xf4,
0xad, 0x24, 0xf4, 0x3f, 0x74, 0x2b, 0x1d, 0x78, 0x88, 0xaf, 0x2b, 0xf4, 0x4e, 0x5b, 0xf2, 0x8a,
0x19, 0xad, 0xa4, 0xc9, 0x66, 0xfa, 0x7b, 0xed, 0xe6, 0xe5, 0x03, 0xb5, 0x89, 0xb8, 0xf8, 0x10,
0x6a, 0xf1, 0xb7, 0xba, 0x29, 0x5c, 0x94, 0x3e, 0x6f, 0x6e, 0x9e, 0x1f, 0x09, 0x37, 0x1a, 0xec,
0x7d, 0x28, 0x0b, 0x9f, 0x36, 0x44, 0x2f, 0x0c, 0x91, 0x63, 0xf1, 0x3b, 0x7f, 0xfb, 0x71, 0xf2,
0x3d, 0x28, 0x45, 0x5f, 0x24, 0x44, 0x67, 0x53, 0xe5, 0xf7, 0x20, 0x5d, 0x6e, 0x00, 0xf4, 0x3f,
0x37, 0x88, 0xbe, 0x24, 0xed, 0x73, 0xe0, 0x7b, 0x84, 0xfb, 0x75, 0x1a, 0x4d, 0x9f, 0xbd, 0x7c,
0x18, 0x36, 0x7d, 0xf1, 0xcd, 0xce, 0x7e, 0xdd, 0x6e, 0x43, 0x35, 0xf6, 0xd2, 0x2e, 0x6d, 0x0b,
0x4b, 0x1e, 0x40, 0x36, 0xcf, 0x8d, 0x82, 0x1a, 0xad, 0xdf, 0x36, 0x54, 0x63, 0xef, 0x9e, 0x52,
0x46, 0x92, 0x3d, 0xf3, 0x4a, 0x19, 0x49, 0xfa, 0x8c, 0x4a, 0x9d, 0x40, 0x9f, 0x0a, 0x4f, 0xac,
0x62, 0xcf, 0xd8, 0xd0, 0xa5, 0xa1, 0xfd, 0xc8, 0x5e, 0xf1, 0x35, 0x57, 0x0e, 0xd2, 0x24, 0x22,
0x81, 0x4b, 0x15, 0x63, 0x69, 0xba, 0x54, 0x1d, 0x64, 0xa5, 0x36, 0x20, 0xcf, 0x5e, 0x32, 0x21,
0x35, 0xe5, 0xcd, 0xa2, 0xf0, 0xcc, 0xa9, 0xf9, 0x9c, 0x14, 0x27, 0xfe, 0xb6, 0x87, 0x75, 0xca,
0x6e, 0x1f, 0x53, 0x3a, 0x8d, 0xbd, 0x5e, 0x19, 0xb5, 0x53, 0x0d, 0xf2, 0x2c, 0xaf, 0x3e, 0xa5,
0xd3, 0xd8, 0x5b, 0x91, 0xe6, 0x70, 0x1c, 0x76, 0x8e, 0x9d, 0x40, 0xeb, 0x90, 0xa3, 0xa1, 0x5a,
0x74, 0x66, 0x58, 0xca, 0xf9, 0xb0, 0x1e, 0x63, 0x59, 0xe9, 0xea, 0x04, 0xba, 0x0f, 0x39, 0x1a,
0xf5, 0x4a, 0xe9, 0x51, 0xcc, 0x1b, 0x6f, 0x0e, 0x45, 0x09, 0x49, 0x34, 0xa1, 0x22, 0x26, 0x8b,
0xa6, 0x98, 0x2c, 0x49, 0x3a, 0x6d, 0x73, 0x14, 0xcc, 0x70, 0x14, 0xb6, 0x8d, 0xfa, 0x61, 0xeb,
0xf4, 0x6d, 0x34, 0x10, 0x12, 0x4f, 0xdf, 0x46, 0x83, 0x51, 0x70, 0x75, 0x02, 0xfd, 0xaa, 0x02,
0x8d, 0xb4, 0x0c, 0x46, 0x94, 0xea, 0x01, 0x0d, 0x4b, 0xc3, 0x6c, 0xbe, 0x72, 0xc0, 0x56, 0x11,
0x2d, 0x9f, 0xd0, 0x60, 0xd9, 0x40, 0xce, 0xe2, 0xc5, 0xb4, 0xfe, 0x52, 0xf2, 0xf0, 0x9a, 0x2f,
0x8d, 0xde, 0x20, 0x1a, 0x7b, 0x13, 0xca, 0x42, 0xa0, 0x2e, 0x45, 0xf3, 0x0e, 0x46, 0x18, 0x53,
0x56, 0x55, 0x12, 0xf3, 0x63, 0xe2, 0x4d, 0x13, 0xdd, 0x52, 0x84, 0x51, 0xcc, 0x9b, 0x4b, 0x11,
0xef, 0x58, 0x9e, 0x9c, 0x3a, 0x81, 0x30, 0x54, 0xc4, 0xac, 0xb7, 0x14, 0x69, 0x94, 0x24, 0xcc,
0x35, 0x5f, 0x1c, 0x01, 0x33, 0x1a, 0x46, 0x07, 0xe8, 0x67, 0x9d, 0xa5, 0xd8, 0xba, 0x81, 0xc4,
0xb7, 0xe6, 0x0b, 0xfb, 0xe2, 0x89, 0x66, 0x5f, 0xc8, 0x23, 0x4b, 0xe1, 0xfe, 0x60, 0xa6, 0xd9,
0x08, 0x67, 0x91, 0xc1, 0x14, 0xa5, 0x94, 0xb3, 0x48, 0x6a, 0x36, 0x54, 0xf3, 0xe2, 0xc8, 0xf8,
0xd1, 0x7c, 0x1e, 0x41, 0x3d, 0x99, 0xd2, 0x95, 0x72, 0xc6, 0x4d, 0xc9, 0x30, 0x6b, 0x5e, 0x18,
0x11, 0x5b, 0xb4, 0x87, 0x27, 0x06, 0x69, 0xfa, 0x39, 0x2b, 0xd8, 0xa6, 0xd9, 0x44, 0xa3, 0xcc,
0x5a, 0x4c, 0x5c, 0x1a, 0x65, 0xd6, 0xb1, 0x34, 0x25, 0x6e, 0xbc, 0x68, 0x88, 0x3e, 0xcd, 0x78,
0x89, 0x09, 0x32, 0x29, 0x76, 0x26, 0x9e, 0x4e, 0xc2, 0xdc, 0xcf, 0x78, 0xe8, 0x1f, 0x9d, 0x1b,
0x29, 0x3f, 0x60, 0x98, 0xfb, 0x29, 0xcf, 0x25, 0x60, 0x47, 0xb7, 0x44, 0x66, 0x43, 0xca, 0x51,
0x4a, 0x9e, 0x1a, 0x91, 0x72, 0x74, 0x4b, 0x49, 0x96, 0xa0, 0x1b, 0xab, 0x9e, 0x0c, 0x13, 0x0f,
0xbf, 0x0b, 0x49, 0x86, 0x0f, 0xf7, 0xbf, 0xae, 0xa8, 0x27, 0x63, 0xb2, 0x29, 0x03, 0xa4, 0x84,
0x6e, 0x47, 0x18, 0x20, 0x19, 0xd9, 0x4c, 0x19, 0x20, 0x25, 0x00, 0x3a, 0x82, 0xef, 0x1a, 0x8b,
0x32, 0xa6, 0x98, 0x42, 0x59, 0x24, 0x32, 0xc5, 0x14, 0x4a, 0x03, 0xa4, 0xcc, 0xa3, 0xef, 0x47,
0x10, 0x53, 0xb4, 0xdc, 0x40, 0x88, 0x71, 0x3f, 0xf2, 0xef, 0x43, 0x31, 0x0c, 0x0b, 0xa2, 0xe7,
0x53, 0x5d, 0xc4, 0x03, 0x74, 0xf8, 0x11, 0x4c, 0x25, 0x6e, 0xf0, 0x52, 0x44, 0x54, 0x1e, 0x2a,
0xdc, 0x7f, 0x3d, 0xa1, 0x1f, 0x7c, 0x4a, 0x61, 0xc2, 0x40, 0x00, 0x2f, 0x45, 0xd5, 0x0f, 0x46,
0xb1, 0xc4, 0x01, 0x08, 0x61, 0x43, 0x07, 0x10, 0xe2, 0x4e, 0x43, 0x07, 0x10, 0x83, 0x2f, 0x4c,
0x22, 0x93, 0x17, 0x94, 0x29, 0x12, 0x99, 0x72, 0x33, 0xbc, 0x1f, 0x8b, 0x36, 0xa1, 0x2c, 0x5c,
0x6f, 0xa3, 0x61, 0xa4, 0x89, 0x77, 0xf0, 0x29, 0xae, 0x82, 0xe4, 0xa6, 0x5c, 0x9d, 0x58, 0xe9,
0x41, 0x65, 0xdd, 0x73, 0x1f, 0x87, 0xdf, 0x52, 0xfc, 0x82, 0x0c, 0xfd, 0xd5, 0x16, 0xd4, 0x18,
0x82, 0x8e, 0x1f, 0x07, 0xba, 0xbb, 0xf9, 0x31, 0x3a, 0xb9, 0xcc, 0xfe, 0x1f, 0xc1, 0x72, 0xf8,
0xff, 0x08, 0x96, 0x6f, 0x5a, 0x36, 0xbe, 0xcf, 0x33, 0x06, 0xff, 0xb3, 0x30, 0xe4, 0xe1, 0x5a,
0x74, 0x65, 0xad, 0xf1, 0x7f, 0x89, 0xf0, 0xce, 0xe3, 0xe0, 0xfe, 0xe6, 0xc7, 0xd7, 0x8d, 0xcf,
0xdf, 0x2c, 0x40, 0x6e, 0x65, 0xf9, 0xd2, 0xf2, 0x4b, 0x50, 0xb3, 0x22, 0xf4, 0xb6, 0xd7, 0x6d,
0x5d, 0x2f, 0xb3, 0x46, 0xeb, 0xa4, 0x9f, 0x75, 0xe5, 0xe7, 0x2f, 0xb7, 0xad, 0x60, 0xbb, 0xb7,
0x49, 0x96, 0xe0, 0x22, 0x43, 0xbb, 0x60, 0xb9, 0xfc, 0xd7, 0x45, 0xcb, 0x09, 0xb0, 0xe7, 0x18,
0x36, 0xfb, 0x57, 0x09, 0x1c, 0xda, 0xdd, 0xfc, 0x5d, 0x45, 0xd9, 0xcc, 0x53, 0xd0, 0xe5, 0xff,
0x0f, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xa2, 0xfe, 0xb7, 0x8c, 0x61, 0x00, 0x00,
// 5188 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3d, 0x4b, 0x6c, 0x1c, 0x47,
0x76, 0xec, 0x19, 0xce, 0xef, 0xcd, 0x87, 0xc3, 0xe2, 0x6f, 0x3c, 0x92, 0x2c, 0xaa, 0x6d, 0xd9,
0xb4, 0xb4, 0xa6, 0x6c, 0xca, 0x96, 0xd7, 0xb2, 0x57, 0xb6, 0x24, 0x5a, 0x12, 0x61, 0x7d, 0xe8,
0xa6, 0xec, 0x60, 0xe3, 0x18, 0x8d, 0xe6, 0x74, 0x71, 0xd8, 0x56, 0x4f, 0xf7, 0xa8, 0xbb, 0x87,
0x14, 0x9d, 0xcb, 0x02, 0x9b, 0xdd, 0x6c, 0x90, 0xcd, 0x2e, 0x36, 0xbf, 0x45, 0x0e, 0xf9, 0x20,
0xd8, 0x1c, 0x02, 0x6c, 0x82, 0x38, 0x09, 0x10, 0x60, 0x73, 0xc8, 0x39, 0x46, 0xbe, 0x87, 0x20,
0x59, 0x24, 0xc7, 0x45, 0x80, 0x1c, 0x02, 0xe4, 0x90, 0x63, 0x82, 0x04, 0xf5, 0xe9, 0x9e, 0xea,
0x9e, 0xea, 0xe1, 0x90, 0xb3, 0x32, 0x29, 0xf3, 0x34, 0xf5, 0xea, 0x55, 0xd5, 0xab, 0x57, 0xef,
0xbd, 0x7a, 0x55, 0xef, 0x55, 0x13, 0x2a, 0x1d, 0xcb, 0xde, 0xe9, 0xf9, 0xcb, 0x5d, 0xcf, 0x0d,
0x5c, 0x34, 0x23, 0x96, 0x96, 0x59, 0xa1, 0x59, 0x69, 0xb9, 0x9d, 0x8e, 0xeb, 0x30, 0x60, 0xb3,
0xe2, 0xb7, 0xb6, 0x71, 0xc7, 0xe0, 0xa5, 0xc5, 0xb6, 0xeb, 0xb6, 0x6d, 0x7c, 0x81, 0x96, 0x36,
0x7b, 0x5b, 0x17, 0x4c, 0xec, 0xb7, 0x3c, 0xab, 0x1b, 0xb8, 0x1e, 0xc3, 0x50, 0x7f, 0x47, 0x01,
0x74, 0xdd, 0xc3, 0x46, 0x80, 0xaf, 0xda, 0x96, 0xe1, 0x6b, 0xf8, 0x61, 0x0f, 0xfb, 0x01, 0x7a,
0x09, 0x26, 0x37, 0x0d, 0x1f, 0x37, 0x94, 0x45, 0x65, 0xa9, 0xbc, 0x72, 0x72, 0x39, 0x36, 0x30,
0x1f, 0xf0, 0x8e, 0xdf, 0xbe, 0x66, 0xf8, 0x58, 0xa3, 0x98, 0x68, 0x01, 0x0a, 0xe6, 0xa6, 0xee,
0x18, 0x1d, 0xdc, 0xc8, 0x2c, 0x2a, 0x4b, 0x25, 0x2d, 0x6f, 0x6e, 0xde, 0x35, 0x3a, 0x18, 0x3d,
0x0f, 0x53, 0x2d, 0xd7, 0xb6, 0x71, 0x2b, 0xb0, 0x5c, 0x87, 0x21, 0x64, 0x29, 0x42, 0xad, 0x0f,
0xa6, 0x88, 0xb3, 0x90, 0x33, 0x08, 0x0d, 0x8d, 0x49, 0x5a, 0xcd, 0x0a, 0xaa, 0x0f, 0xf5, 0x55,
0xcf, 0xed, 0x3e, 0x2e, 0xea, 0xa2, 0x41, 0xb3, 0xe2, 0xa0, 0xbf, 0xad, 0xc0, 0xf4, 0x55, 0x3b,
0xc0, 0xde, 0x31, 0x65, 0xca, 0x0f, 0x33, 0xb0, 0xc0, 0x56, 0xed, 0x7a, 0x84, 0x7e, 0x94, 0x54,
0xce, 0x43, 0x9e, 0xc9, 0x1d, 0x25, 0xb3, 0xa2, 0xf1, 0x12, 0x3a, 0x05, 0xe0, 0x6f, 0x1b, 0x9e,
0xe9, 0xeb, 0x4e, 0xaf, 0xd3, 0xc8, 0x2d, 0x2a, 0x4b, 0x39, 0xad, 0xc4, 0x20, 0x77, 0x7b, 0x1d,
0xa4, 0xc1, 0x74, 0xcb, 0x75, 0x7c, 0xcb, 0x0f, 0xb0, 0xd3, 0xda, 0xd3, 0x6d, 0xbc, 0x83, 0xed,
0x46, 0x7e, 0x51, 0x59, 0xaa, 0xad, 0x9c, 0x95, 0xd2, 0x7d, 0xbd, 0x8f, 0x7d, 0x9b, 0x20, 0x6b,
0xf5, 0x56, 0x02, 0x72, 0x19, 0x7d, 0x76, 0x65, 0xaa, 0xa8, 0xd4, 0x95, 0xc6, 0xff, 0x85, 0x7f,
0x8a, 0xfa, 0xbb, 0x0a, 0xcc, 0x11, 0x21, 0x3a, 0x16, 0xcc, 0x0a, 0x29, 0xcc, 0x88, 0x14, 0xfe,
0xa1, 0x02, 0xb3, 0xb7, 0x0c, 0xff, 0x78, 0xac, 0xe6, 0x29, 0x80, 0xc0, 0xea, 0x60, 0xdd, 0x0f,
0x8c, 0x4e, 0x97, 0xae, 0xe8, 0xa4, 0x56, 0x22, 0x90, 0x0d, 0x02, 0x50, 0xbf, 0x0a, 0x95, 0x6b,
0xae, 0x6b, 0x6b, 0xd8, 0xef, 0xba, 0x8e, 0x8f, 0xd1, 0x45, 0xc8, 0xfb, 0x81, 0x11, 0xf4, 0x7c,
0x4e, 0xe4, 0x09, 0x29, 0x91, 0x1b, 0x14, 0x45, 0xe3, 0xa8, 0x44, 0xae, 0x77, 0x0c, 0xbb, 0xc7,
0x68, 0x2c, 0x6a, 0xac, 0xa0, 0x7e, 0x08, 0xb5, 0x8d, 0xc0, 0xb3, 0x9c, 0xf6, 0x4f, 0xb1, 0xf3,
0x52, 0xd8, 0xf9, 0xbf, 0x2b, 0xf0, 0xd4, 0x2a, 0xb5, 0x7f, 0x9b, 0xc7, 0x44, 0x6d, 0x54, 0xa8,
0xf4, 0x21, 0x6b, 0xab, 0x94, 0xd5, 0x59, 0x2d, 0x06, 0x4b, 0x2c, 0x46, 0x2e, 0xb1, 0x18, 0xa1,
0x30, 0x65, 0x45, 0x61, 0xfa, 0x5a, 0x0e, 0x9a, 0xb2, 0x89, 0x8e, 0xc3, 0xd2, 0xaf, 0x44, 0x1a,
0x9e, 0xa1, 0x8d, 0x12, 0xfa, 0xc9, 0x77, 0x9d, 0xfe, 0x68, 0x1b, 0x14, 0x10, 0x19, 0x82, 0xe4,
0x4c, 0xb3, 0x92, 0x99, 0xae, 0xc0, 0xdc, 0x8e, 0xe5, 0x05, 0x3d, 0xc3, 0xd6, 0x5b, 0xdb, 0x86,
0xe3, 0x60, 0x9b, 0xf2, 0x8e, 0x98, 0xbe, 0xec, 0x52, 0x49, 0x9b, 0xe1, 0x95, 0xd7, 0x59, 0x1d,
0x61, 0xa0, 0x8f, 0x5e, 0x81, 0xf9, 0xee, 0xf6, 0x9e, 0x6f, 0xb5, 0x06, 0x1a, 0xe5, 0x68, 0xa3,
0xd9, 0xb0, 0x36, 0xd6, 0xea, 0x3c, 0x4c, 0xb7, 0xa8, 0xf5, 0x34, 0x75, 0xc2, 0x49, 0xc6, 0xda,
0x3c, 0x65, 0x6d, 0x9d, 0x57, 0xdc, 0x0f, 0xe1, 0x84, 0xac, 0x10, 0xb9, 0x17, 0xb4, 0x84, 0x06,
0x05, 0xda, 0x60, 0x86, 0x57, 0xbe, 0x1f, 0xb4, 0xfa, 0x6d, 0xe2, 0x76, 0xaf, 0x98, 0xb4, 0x7b,
0x0d, 0x28, 0x50, 0x3b, 0x8e, 0xfd, 0x46, 0x89, 0x92, 0x19, 0x16, 0xd1, 0x1a, 0x4c, 0xf9, 0x81,
0xe1, 0x05, 0x7a, 0xd7, 0xf5, 0x2d, 0xc2, 0x17, 0xbf, 0x01, 0x8b, 0xd9, 0xa5, 0xf2, 0xca, 0xa2,
0x74, 0x91, 0xde, 0xc5, 0x7b, 0xab, 0x46, 0x60, 0xac, 0x1b, 0x96, 0xa7, 0xd5, 0x68, 0xc3, 0xf5,
0xb0, 0x9d, 0xdc, 0xb8, 0x96, 0xc7, 0x32, 0xae, 0x32, 0xc9, 0xae, 0xc8, 0x24, 0x5b, 0xfd, 0x4b,
0x05, 0xe6, 0x6e, 0xbb, 0x86, 0x79, 0x3c, 0xf4, 0xec, 0x2c, 0xd4, 0x3c, 0xdc, 0xb5, 0xad, 0x96,
0x41, 0xd6, 0x63, 0x13, 0x7b, 0x54, 0xd3, 0x72, 0x5a, 0x95, 0x43, 0xef, 0x52, 0xe0, 0xe5, 0xc2,
0x67, 0x57, 0x26, 0xeb, 0xb9, 0x46, 0x56, 0xfd, 0xbe, 0x02, 0x0d, 0x0d, 0xdb, 0xd8, 0xf0, 0x8f,
0x87, 0xa1, 0x60, 0x94, 0xe5, 0x1b, 0x59, 0xf5, 0x3f, 0x15, 0x98, 0xbd, 0x89, 0x03, 0xa2, 0x9c,
0x96, 0x1f, 0x58, 0xad, 0x23, 0xf5, 0x4d, 0x9e, 0x87, 0xa9, 0xae, 0xe1, 0x05, 0x56, 0x84, 0x17,
0xaa, 0x6a, 0x2d, 0x02, 0x33, 0x7d, 0xbb, 0x00, 0x33, 0xed, 0x9e, 0xe1, 0x19, 0x4e, 0x80, 0xb1,
0xa0, 0x40, 0xcc, 0x98, 0xa1, 0xa8, 0x2a, 0xd2, 0x1f, 0x36, 0x5f, 0x68, 0x64, 0xd5, 0x6f, 0x28,
0x30, 0x97, 0x98, 0xef, 0x38, 0x56, 0xec, 0x35, 0xc8, 0x91, 0x5f, 0x7e, 0x23, 0x43, 0x95, 0xea,
0x4c, 0x9a, 0x52, 0x7d, 0x40, 0x36, 0x0c, 0xaa, 0x55, 0x0c, 0x9f, 0x38, 0x84, 0x4f, 0xdf, 0xc4,
0x81, 0x60, 0xdf, 0x8e, 0xc3, 0x0a, 0xf4, 0xf9, 0xf4, 0x5d, 0x05, 0x4e, 0xa7, 0xd2, 0x77, 0x24,
0x1c, 0xfb, 0x6f, 0x05, 0xe6, 0x37, 0xb6, 0xdd, 0xdd, 0x3e, 0x49, 0x8f, 0x83, 0x53, 0xf1, 0xdd,
0x31, 0x9b, 0xd8, 0x1d, 0xd1, 0xcb, 0x30, 0x19, 0xec, 0x75, 0x31, 0x55, 0xf7, 0xda, 0xca, 0xa9,
0x65, 0xc9, 0xf9, 0x69, 0x99, 0x10, 0x79, 0x7f, 0xaf, 0x8b, 0x35, 0x8a, 0x8a, 0x5e, 0x80, 0x7a,
0x82, 0xf7, 0xe1, 0x5e, 0x32, 0x15, 0x67, 0xbe, 0x1f, 0xee, 0xbd, 0x93, 0xe2, 0xde, 0xfb, 0x5f,
0x19, 0x58, 0x18, 0x98, 0xf6, 0x38, 0x0b, 0x20, 0xa3, 0x27, 0x23, 0xa5, 0x87, 0x98, 0x39, 0x01,
0xd5, 0x32, 0xc9, 0xa1, 0x26, 0xbb, 0x94, 0xd5, 0xaa, 0xc2, 0x36, 0x6b, 0xfa, 0xe8, 0x45, 0x40,
0x03, 0xbb, 0x1f, 0xd3, 0xdc, 0x49, 0x6d, 0x3a, 0xb9, 0xfd, 0xd1, 0x2d, 0x56, 0xba, 0xff, 0x31,
0xb6, 0x4c, 0x6a, 0xb3, 0x92, 0x0d, 0xd0, 0x47, 0x2f, 0xc3, 0xac, 0xe5, 0xdc, 0xc1, 0x1d, 0xd7,
0xdb, 0xd3, 0xbb, 0xd8, 0x6b, 0x61, 0x27, 0x30, 0xda, 0xd8, 0x6f, 0xe4, 0x29, 0x45, 0x33, 0x61,
0xdd, 0x7a, 0xbf, 0x0a, 0x5d, 0x82, 0x85, 0x87, 0x3d, 0xec, 0xed, 0xe9, 0x3e, 0xf6, 0x76, 0xac,
0x16, 0xd6, 0x8d, 0x1d, 0xc3, 0xb2, 0x8d, 0x4d, 0x1b, 0x37, 0x0a, 0x8b, 0xd9, 0xa5, 0xa2, 0x36,
0x47, 0xab, 0x37, 0x58, 0xed, 0xd5, 0xb0, 0x52, 0xfd, 0x33, 0x05, 0xe6, 0xd9, 0x61, 0x68, 0x3d,
0x34, 0x3b, 0x47, 0xbc, 0xd9, 0xc4, 0xad, 0x22, 0x3f, 0xba, 0x55, 0x63, 0x46, 0x51, 0xfd, 0x54,
0x81, 0x59, 0x72, 0x26, 0x79, 0x92, 0x68, 0xfe, 0x13, 0x05, 0x66, 0x6e, 0x19, 0xfe, 0x93, 0x44,
0xf2, 0xbf, 0x72, 0x47, 0x24, 0xa2, 0xf9, 0xc9, 0xd8, 0x31, 0x07, 0x3d, 0x96, 0x9c, 0xc4, 0x63,
0x51, 0xff, 0xa2, 0xef, 0xa8, 0x3c, 0x59, 0x13, 0x54, 0x7f, 0xa4, 0xc0, 0xa9, 0x9b, 0x38, 0x88,
0xa8, 0x3e, 0x1e, 0x1e, 0xcd, 0x88, 0x42, 0xf5, 0x1d, 0xe6, 0x0d, 0x48, 0x89, 0x3f, 0x92, 0xcd,
0xf6, 0x97, 0x33, 0x30, 0x47, 0x76, 0x9d, 0xe3, 0x21, 0x04, 0xa3, 0x1c, 0x6b, 0x25, 0x82, 0x92,
0x93, 0x6a, 0x42, 0xb8, 0x85, 0xe7, 0x47, 0xde, 0xc2, 0xd5, 0x3f, 0xcd, 0x30, 0xd7, 0x43, 0xe4,
0xc6, 0x38, 0xcb, 0x22, 0xa1, 0x35, 0x23, 0xa5, 0x55, 0x85, 0x4a, 0x04, 0x59, 0x5b, 0x0d, 0xb7,
0xdf, 0x18, 0xec, 0xb8, 0xee, 0xbe, 0xea, 0xb7, 0x15, 0x98, 0x0f, 0x2f, 0x0d, 0x36, 0x70, 0xbb,
0x83, 0x9d, 0xe0, 0xf0, 0x32, 0x94, 0x94, 0x80, 0x8c, 0x44, 0x02, 0x4e, 0x42, 0xc9, 0x67, 0xe3,
0x44, 0xf7, 0x01, 0x7d, 0x80, 0xfa, 0x57, 0x0a, 0x2c, 0x0c, 0x90, 0x33, 0xce, 0x22, 0x36, 0xa0,
0x60, 0x39, 0x26, 0x7e, 0x14, 0x51, 0x13, 0x16, 0x49, 0xcd, 0x66, 0xcf, 0xb2, 0xcd, 0x88, 0x8c,
0xb0, 0x88, 0xce, 0x40, 0x05, 0x3b, 0xc4, 0xc7, 0xd0, 0x29, 0x2e, 0x15, 0xe4, 0xa2, 0x56, 0x66,
0xb0, 0x35, 0x02, 0x22, 0x8d, 0xb7, 0x2c, 0x4c, 0x1b, 0xe7, 0x58, 0x63, 0x5e, 0x54, 0x7f, 0x45,
0x81, 0x19, 0x22, 0x85, 0x9c, 0x7a, 0xff, 0xf1, 0x72, 0x73, 0x11, 0xca, 0x82, 0x98, 0xf1, 0x89,
0x88, 0x20, 0xf5, 0x01, 0xcc, 0xc6, 0xc9, 0x19, 0x87, 0x9b, 0x4f, 0x03, 0x44, 0x6b, 0xc5, 0xb4,
0x21, 0xab, 0x09, 0x10, 0xf5, 0x37, 0x32, 0x61, 0x58, 0x81, 0xb2, 0xe9, 0x88, 0x6f, 0x33, 0xe9,
0x92, 0x88, 0xf6, 0xbc, 0x44, 0x21, 0xb4, 0x7a, 0x15, 0x2a, 0xf8, 0x51, 0xe0, 0x19, 0x7a, 0xd7,
0xf0, 0x8c, 0x0e, 0x53, 0xab, 0x91, 0x4c, 0x6f, 0x99, 0x36, 0x5b, 0xa7, 0xad, 0xc8, 0x20, 0x54,
0x44, 0xd8, 0x20, 0x79, 0x36, 0x08, 0x85, 0xf4, 0xcf, 0x69, 0xe5, 0x46, 0x56, 0xfd, 0x47, 0xe2,
0xf5, 0x71, 0xb1, 0x3e, 0xee, 0x9c, 0x89, 0xcf, 0x29, 0x27, 0x9d, 0x53, 0xa5, 0x91, 0x55, 0xff,
0x40, 0x81, 0x3a, 0x9d, 0xcb, 0x2a, 0x0f, 0x2e, 0x59, 0xae, 0x93, 0x68, 0xac, 0x24, 0x1a, 0x0f,
0xd1, 0xc6, 0xd7, 0x21, 0xcf, 0x57, 0x22, 0x3b, 0xea, 0x4a, 0xf0, 0x06, 0xfb, 0xcc, 0x47, 0xfd,
0x7d, 0x05, 0xe6, 0x12, 0xbc, 0x1f, 0x47, 0x05, 0xee, 0x03, 0x62, 0x33, 0x34, 0xfb, 0xd3, 0x0e,
0x77, 0xee, 0xb3, 0xd2, 0x6d, 0x2a, 0xc9, 0x24, 0x6d, 0xda, 0x4a, 0x40, 0x7c, 0xf5, 0xc7, 0x0a,
0x9c, 0xbc, 0x89, 0x03, 0x8a, 0x7a, 0x8d, 0x98, 0xa1, 0x75, 0xcf, 0x6d, 0x7b, 0xd8, 0xf7, 0xbf,
0x00, 0x82, 0xf2, 0x9b, 0xcc, 0xe7, 0x93, 0xcd, 0x6d, 0x9c, 0x85, 0x38, 0x03, 0x15, 0x3a, 0x18,
0x36, 0x75, 0xcf, 0xdd, 0xf5, 0xb9, 0x40, 0x95, 0x39, 0x4c, 0x73, 0x77, 0xa9, 0x64, 0x04, 0x6e,
0x60, 0xd8, 0x0c, 0x81, 0x6f, 0x36, 0x14, 0x42, 0xaa, 0xa9, 0x56, 0x86, 0x84, 0x91, 0xce, 0xf1,
0x17, 0x80, 0xd9, 0x3f, 0x60, 0x37, 0x67, 0xe2, 0x9c, 0xc6, 0x61, 0xf2, 0xab, 0xcc, 0x35, 0x65,
0xb3, 0xaa, 0xad, 0x9c, 0x96, 0xb6, 0x11, 0x06, 0x63, 0xd8, 0xe8, 0x34, 0x94, 0xb7, 0x0c, 0xcb,
0xd6, 0x3d, 0x6c, 0xf8, 0xae, 0xc3, 0x67, 0x0c, 0x04, 0xa4, 0x51, 0x88, 0xfa, 0xb7, 0x0a, 0x8b,
0xef, 0x7e, 0x11, 0x8c, 0x61, 0xb5, 0x91, 0x55, 0x7f, 0x98, 0x81, 0xea, 0x9a, 0xe3, 0x63, 0x2f,
0x38, 0xfe, 0xe7, 0x18, 0xf4, 0x16, 0x94, 0xe9, 0x0c, 0x7d, 0xdd, 0x34, 0x02, 0x83, 0x6f, 0x7d,
0x4f, 0x4b, 0x23, 0x3b, 0x37, 0x08, 0xde, 0xaa, 0x11, 0x18, 0x1a, 0x63, 0x93, 0x4f, 0x7e, 0xa3,
0x13, 0x50, 0xda, 0x36, 0xfc, 0x6d, 0xfd, 0x01, 0xde, 0x63, 0xce, 0x65, 0x55, 0x2b, 0x12, 0xc0,
0xbb, 0x78, 0xcf, 0x47, 0x4f, 0x41, 0xd1, 0xe9, 0x75, 0x98, 0xca, 0x15, 0x16, 0x95, 0xa5, 0xaa,
0x56, 0x70, 0x7a, 0x1d, 0xa2, 0x70, 0x8c, 0x5d, 0xc5, 0x46, 0x56, 0xfd, 0x9b, 0x0c, 0xd4, 0xee,
0xf4, 0xc8, 0xf1, 0x89, 0x06, 0xa8, 0x7a, 0x76, 0x70, 0x38, 0xf1, 0x3c, 0x07, 0x59, 0xe6, 0x88,
0x90, 0x16, 0x0d, 0xe9, 0x0c, 0xd6, 0x56, 0x7d, 0x8d, 0x20, 0xd1, 0xe0, 0x4c, 0xaf, 0xd5, 0xe2,
0x3e, 0x5d, 0x96, 0x52, 0x5d, 0x22, 0x10, 0xe6, 0xd1, 0x9d, 0x80, 0x12, 0xf6, 0xbc, 0xc8, 0xe3,
0xa3, 0x73, 0xc2, 0x9e, 0xc7, 0x2a, 0x55, 0xa8, 0x18, 0xad, 0x07, 0x8e, 0xbb, 0x6b, 0x63, 0xb3,
0x8d, 0x4d, 0x2a, 0x08, 0x45, 0x2d, 0x06, 0x63, 0xa2, 0x42, 0x24, 0x40, 0x6f, 0x39, 0x01, 0xf5,
0x05, 0xb2, 0x44, 0x54, 0x08, 0xe4, 0xba, 0x13, 0x90, 0x6a, 0x13, 0xdb, 0x38, 0xc0, 0xb4, 0xba,
0xc0, 0xaa, 0x19, 0x84, 0x57, 0xf7, 0xba, 0x51, 0xeb, 0x22, 0xab, 0x66, 0x10, 0x52, 0x7d, 0x12,
0x4a, 0xfd, 0x0b, 0xf4, 0x52, 0xff, 0xbe, 0x93, 0x02, 0xd4, 0x9f, 0x28, 0x50, 0x5d, 0xa5, 0x5d,
0x3d, 0x01, 0xd2, 0x87, 0x60, 0x12, 0x3f, 0xea, 0x7a, 0x5c, 0x99, 0xe8, 0xef, 0xa1, 0x02, 0xc5,
0xa4, 0xa6, 0xd4, 0xc8, 0xaa, 0xdf, 0x9c, 0x84, 0xea, 0x06, 0x36, 0xbc, 0xd6, 0xf6, 0x13, 0x71,
0x99, 0x53, 0x87, 0xac, 0xe9, 0xdb, 0x7c, 0x9e, 0xe4, 0x27, 0x3a, 0x0f, 0xd3, 0x5d, 0xdb, 0x68,
0xe1, 0x6d, 0xd7, 0x36, 0xb1, 0xa7, 0xb7, 0x3d, 0xb7, 0xc7, 0x02, 0x90, 0x15, 0xad, 0x2e, 0x54,
0xdc, 0x24, 0x70, 0xf4, 0x1a, 0x14, 0x4d, 0xdf, 0xd6, 0xe9, 0x29, 0xb8, 0x40, 0xad, 0xaf, 0x7c,
0x7e, 0xab, 0xbe, 0x4d, 0x0f, 0xc1, 0x05, 0x93, 0xfd, 0x40, 0xcf, 0x40, 0xd5, 0xed, 0x05, 0xdd,
0x5e, 0xa0, 0x33, 0x95, 0x6d, 0x14, 0x29, 0x79, 0x15, 0x06, 0xa4, 0x1a, 0xed, 0xa3, 0x1b, 0x50,
0xf5, 0x29, 0x2b, 0x43, 0x07, 0xb8, 0x34, 0xaa, 0xdb, 0x55, 0x61, 0xed, 0xb8, 0x07, 0xfc, 0x02,
0xd4, 0x03, 0xcf, 0xd8, 0xc1, 0xb6, 0x10, 0xe0, 0x01, 0x2a, 0x9f, 0x53, 0x0c, 0xde, 0x8f, 0x8e,
0xa6, 0x84, 0x83, 0xca, 0x69, 0xe1, 0x20, 0x54, 0x83, 0x8c, 0xf3, 0x90, 0x46, 0x1a, 0xb3, 0x5a,
0xc6, 0x79, 0xc8, 0x04, 0xa1, 0xd6, 0xc8, 0xaa, 0xef, 0xc2, 0xe4, 0x2d, 0x2b, 0xa0, 0x1c, 0x26,
0xea, 0xaf, 0xd0, 0x73, 0x08, 0x55, 0xf2, 0xa7, 0xa0, 0xe8, 0xb9, 0xbb, 0xcc, 0xae, 0x11, 0x9f,
0xac, 0xa2, 0x15, 0x3c, 0x77, 0x97, 0x1a, 0x2d, 0x9a, 0xac, 0xe2, 0x7a, 0x98, 0x79, 0x98, 0x19,
0x8d, 0x97, 0xd4, 0x3f, 0x56, 0xfa, 0x52, 0x45, 0x2c, 0x91, 0x7f, 0x38, 0x53, 0xf4, 0x16, 0x14,
0x3c, 0xd6, 0x7e, 0x68, 0xa8, 0x5c, 0x1c, 0x89, 0xda, 0xd5, 0xb0, 0xd5, 0xc8, 0x02, 0x48, 0x4e,
0x98, 0x95, 0x1b, 0x76, 0xcf, 0x7f, 0x1c, 0x5a, 0x20, 0x0b, 0x3b, 0x64, 0xe5, 0x61, 0x10, 0xba,
0x1a, 0x53, 0x8b, 0x59, 0xf5, 0x7b, 0x19, 0xa8, 0x72, 0x7a, 0xc6, 0x71, 0x35, 0x52, 0x69, 0xda,
0x80, 0x32, 0x19, 0x5b, 0xf7, 0x71, 0x3b, 0xbc, 0x5d, 0x29, 0xaf, 0xac, 0x48, 0x5d, 0xed, 0x18,
0x19, 0x34, 0x2d, 0x61, 0x83, 0x36, 0x7a, 0xc7, 0x09, 0xbc, 0x3d, 0x0d, 0x5a, 0x11, 0xa0, 0xf9,
0x11, 0x4c, 0x25, 0xaa, 0x89, 0x34, 0x3d, 0xc0, 0x7b, 0xfc, 0xd0, 0x42, 0x7e, 0xa2, 0x57, 0xc4,
0x84, 0x92, 0xb4, 0x2d, 0xf2, 0xb6, 0xeb, 0xb4, 0xaf, 0x7a, 0x9e, 0xb1, 0xc7, 0x13, 0x4e, 0x2e,
0x67, 0xbe, 0xac, 0xa8, 0x7f, 0x9d, 0x81, 0xca, 0x7b, 0x3d, 0xec, 0xed, 0x1d, 0xa5, 0xa5, 0x0a,
0x2d, 0xed, 0xa4, 0x60, 0x69, 0x07, 0x8c, 0x43, 0x4e, 0x62, 0x1c, 0x24, 0x26, 0x2e, 0x2f, 0x35,
0x71, 0x32, 0xed, 0x2f, 0x1c, 0x48, 0xfb, 0x8b, 0xc3, 0x83, 0xc1, 0xf5, 0x46, 0x56, 0xfd, 0x23,
0x25, 0xe2, 0xe5, 0x58, 0xfa, 0x19, 0x73, 0x7a, 0x32, 0x07, 0x76, 0x7a, 0x46, 0xd6, 0xcf, 0x4f,
0x15, 0x28, 0x7d, 0x80, 0x5b, 0x81, 0xeb, 0x11, 0x8b, 0x24, 0x69, 0xa6, 0x8c, 0xe0, 0x89, 0x66,
0x92, 0x9e, 0xe8, 0x45, 0x28, 0x5a, 0xa6, 0x6e, 0x10, 0x41, 0xa3, 0xe3, 0x0e, 0xf3, 0x77, 0x0a,
0x96, 0x49, 0x25, 0x72, 0xf4, 0x7b, 0xf9, 0xef, 0x2b, 0x50, 0x61, 0x34, 0xfb, 0xac, 0xe5, 0x1b,
0xc2, 0x70, 0x8a, 0x4c, 0xfa, 0x79, 0x21, 0x9a, 0xe8, 0xad, 0x89, 0xfe, 0xb0, 0x57, 0x01, 0x08,
0x93, 0x79, 0x73, 0xa6, 0x3c, 0x8b, 0x52, 0x6a, 0x59, 0x73, 0xca, 0xf0, 0x5b, 0x13, 0x5a, 0x89,
0xb4, 0xa2, 0x5d, 0x5c, 0x2b, 0x40, 0x8e, 0xb6, 0x56, 0xff, 0x47, 0x81, 0x99, 0xeb, 0x86, 0xdd,
0x5a, 0xb5, 0xfc, 0xc0, 0x70, 0x5a, 0x63, 0x78, 0x38, 0x97, 0xa1, 0xe0, 0x76, 0x75, 0x1b, 0x6f,
0x05, 0x9c, 0xa4, 0x33, 0x43, 0x66, 0xc4, 0xd8, 0xa0, 0xe5, 0xdd, 0xee, 0x6d, 0xbc, 0x15, 0xa0,
0x37, 0xa1, 0xe8, 0x76, 0x75, 0xcf, 0x6a, 0x6f, 0x07, 0x9c, 0xfb, 0x23, 0x34, 0x2e, 0xb8, 0x5d,
0x8d, 0xb4, 0x10, 0x2e, 0x37, 0x26, 0x0f, 0x78, 0xb9, 0x41, 0xce, 0xa8, 0x89, 0xe9, 0x8f, 0xa1,
0x03, 0x97, 0xa1, 0x68, 0x39, 0x81, 0x6e, 0x5a, 0x7e, 0xc8, 0x82, 0x53, 0x72, 0x19, 0x72, 0x02,
0x3a, 0x03, 0xba, 0xa6, 0x4e, 0x40, 0xc6, 0x46, 0x6f, 0x03, 0x6c, 0xd9, 0xae, 0xc1, 0x5b, 0x33,
0x1e, 0x9c, 0x96, 0xab, 0x0f, 0x41, 0x0b, 0xdb, 0x97, 0x68, 0x23, 0xd2, 0x43, 0x7f, 0x49, 0xff,
0x5e, 0x81, 0xb9, 0x75, 0xec, 0xb1, 0x1c, 0xa3, 0x80, 0xdf, 0x4c, 0xae, 0x39, 0x5b, 0x6e, 0xfc,
0x72, 0x58, 0x49, 0x5c, 0x0e, 0xff, 0x74, 0x2e, 0x44, 0x63, 0xe7, 0x13, 0x16, 0xa2, 0x08, 0xcf,
0x27, 0x61, 0x20, 0x86, 0x1d, 0xf4, 0x6a, 0x29, 0xcb, 0xc4, 0xe9, 0x15, 0xcf, 0xbb, 0xea, 0xaf,
0xb1, 0x3c, 0x0c, 0xe9, 0xa4, 0x0e, 0x2f, 0xb0, 0xf3, 0xc0, 0x4d, 0x7e, 0x62, 0x03, 0x78, 0x0e,
0x12, 0xb6, 0x23, 0xc5, 0x10, 0xfd, 0x96, 0x02, 0x8b, 0xe9, 0x54, 0x8d, 0xb3, 0x57, 0xbf, 0x0d,
0x39, 0xcb, 0xd9, 0x72, 0xc3, 0x7b, 0xaf, 0x73, 0x52, 0x5d, 0x90, 0x8f, 0xcb, 0x1a, 0xaa, 0xff,
0x90, 0x81, 0xfa, 0x7b, 0x2c, 0xae, 0xff, 0xb9, 0x2f, 0x7f, 0x07, 0x77, 0x74, 0xdf, 0xfa, 0x04,
0x87, 0xcb, 0xdf, 0xc1, 0x9d, 0x0d, 0xeb, 0x13, 0x1c, 0x93, 0x8c, 0x5c, 0x5c, 0x32, 0x86, 0x5f,
0xf4, 0x8a, 0xf7, 0x9a, 0x85, 0xf8, 0xbd, 0xe6, 0x3c, 0xe4, 0x1d, 0xd7, 0xc4, 0x6b, 0xab, 0xfc,
0x4c, 0xc7, 0x4b, 0x7d, 0x51, 0x2b, 0x1d, 0x4c, 0xd4, 0xc8, 0x50, 0xb4, 0x0b, 0x93, 0xa5, 0x08,
0x12, 0x1a, 0x59, 0x51, 0xfd, 0x8e, 0x02, 0xcd, 0x9b, 0x38, 0x48, 0x72, 0xf5, 0xe8, 0xe4, 0xef,
0xbb, 0x0a, 0x9c, 0x90, 0x12, 0x34, 0x8e, 0xe8, 0xbd, 0x11, 0x17, 0x3d, 0xf9, 0x95, 0xeb, 0xc0,
0x90, 0x5c, 0xea, 0x5e, 0x86, 0xca, 0x6a, 0xaf, 0xd3, 0x89, 0xbc, 0xb2, 0x33, 0x50, 0xf1, 0xd8,
0x4f, 0x76, 0xce, 0x62, 0x3b, 0x73, 0x99, 0xc3, 0xc8, 0x69, 0x4a, 0x3d, 0x0f, 0x55, 0xde, 0x84,
0x53, 0xdd, 0x84, 0xa2, 0xc7, 0x7f, 0x73, 0xfc, 0xa8, 0xac, 0xce, 0xc1, 0x8c, 0x86, 0xdb, 0x44,
0xe8, 0xbd, 0xdb, 0x96, 0xf3, 0x80, 0x0f, 0xa3, 0x7e, 0x5d, 0x81, 0xd9, 0x38, 0x9c, 0xf7, 0x75,
0x09, 0x0a, 0x86, 0x69, 0x7a, 0xd8, 0xf7, 0x87, 0x2e, 0xcb, 0x55, 0x86, 0xa3, 0x85, 0xc8, 0x02,
0xe7, 0x32, 0x23, 0x73, 0x4e, 0xd5, 0x61, 0xfa, 0x26, 0x0e, 0xee, 0xe0, 0xc0, 0x1b, 0x2b, 0xdc,
0xde, 0x20, 0x07, 0x1d, 0xda, 0x98, 0x8b, 0x45, 0x58, 0x54, 0xbf, 0xad, 0x00, 0x12, 0x47, 0x18,
0x67, 0x99, 0x45, 0x2e, 0x67, 0xe2, 0x5c, 0x66, 0x09, 0x4f, 0x9d, 0xae, 0xeb, 0x60, 0x27, 0x10,
0x1d, 0xb1, 0x6a, 0x04, 0xa5, 0xe2, 0xf7, 0x13, 0x05, 0xd0, 0x6d, 0xd7, 0x30, 0xaf, 0x19, 0xf6,
0x78, 0x8e, 0xc3, 0x29, 0x00, 0xdf, 0x6b, 0xe9, 0x5c, 0x8f, 0x33, 0xdc, 0x2e, 0x79, 0xad, 0xbb,
0x4c, 0x95, 0x4f, 0x43, 0xd9, 0xf4, 0x03, 0x5e, 0x1d, 0x46, 0x7f, 0xc1, 0xf4, 0x03, 0x56, 0x4f,
0xf3, 0x8e, 0x7d, 0x6c, 0xd8, 0xd8, 0xd4, 0x85, 0xe0, 0xd9, 0x24, 0x45, 0xab, 0xb3, 0x8a, 0x8d,
0x08, 0x2e, 0x51, 0xae, 0x5c, 0x7a, 0x0e, 0xe0, 0x74, 0x23, 0xa7, 0x6e, 0xc1, 0xc2, 0x1d, 0xc3,
0xe9, 0x19, 0xf6, 0x75, 0xb7, 0xd3, 0x35, 0x62, 0x39, 0xab, 0x49, 0x8b, 0xa9, 0x48, 0x2c, 0xe6,
0xd3, 0x2c, 0x95, 0x8e, 0xb9, 0xeb, 0x74, 0x72, 0x93, 0x9a, 0x00, 0x61, 0xe3, 0x14, 0x1a, 0x8a,
0xea, 0x43, 0x63, 0x70, 0x9c, 0x71, 0x96, 0x98, 0x52, 0x17, 0x76, 0x25, 0xda, 0xf3, 0x3e, 0x4c,
0x7d, 0x0b, 0x9e, 0xa2, 0xf9, 0x8d, 0x21, 0x28, 0x76, 0x4d, 0x9f, 0xec, 0x40, 0x91, 0x74, 0xf0,
0x8b, 0x19, 0x6a, 0x14, 0x07, 0x7a, 0x18, 0x87, 0xf0, 0xcb, 0xf1, 0x4b, 0xf1, 0x67, 0x53, 0xd2,
0xaa, 0xe3, 0x23, 0x72, 0xf3, 0xbd, 0x04, 0x53, 0xf8, 0x11, 0x6e, 0xf5, 0x02, 0xcb, 0x69, 0xaf,
0xdb, 0x86, 0x73, 0xd7, 0xe5, 0x9b, 0x54, 0x12, 0x8c, 0x9e, 0x85, 0x2a, 0x59, 0x06, 0xb7, 0x17,
0x70, 0x3c, 0xb6, 0x5b, 0xc5, 0x81, 0xa4, 0x3f, 0x32, 0x5f, 0x1b, 0x07, 0xd8, 0xe4, 0x78, 0x6c,
0xeb, 0x4a, 0x82, 0x07, 0x58, 0x49, 0xc0, 0xfe, 0x41, 0x58, 0xf9, 0xcf, 0x4a, 0x82, 0x95, 0xbc,
0x87, 0xa3, 0x62, 0xe5, 0x2d, 0x80, 0x0e, 0xf6, 0xda, 0x78, 0x8d, 0x6e, 0x07, 0xec, 0x5a, 0x60,
0x49, 0xba, 0x1d, 0xf4, 0x3b, 0xb8, 0x13, 0x36, 0xd0, 0x84, 0xb6, 0xea, 0x4d, 0x98, 0x91, 0xa0,
0x10, 0x4b, 0xe7, 0xbb, 0x3d, 0xaf, 0x85, 0xc3, 0x2b, 0xa6, 0xb0, 0x48, 0x76, 0xc6, 0xc0, 0xf0,
0xda, 0x38, 0xe0, 0x42, 0xcb, 0x4b, 0xea, 0x25, 0x1a, 0x50, 0xa2, 0xb7, 0x10, 0x31, 0x49, 0x8d,
0xc7, 0xcd, 0x95, 0x81, 0xb8, 0xf9, 0x16, 0x0d, 0xda, 0x88, 0xed, 0xc6, 0xcc, 0x79, 0xd8, 0x22,
0x5d, 0x61, 0x93, 0x3f, 0xb3, 0x09, 0x8b, 0xea, 0xff, 0x2a, 0x50, 0x5d, 0xeb, 0x74, 0xdd, 0x7e,
0x98, 0x62, 0xe4, 0xe3, 0xe9, 0xe0, 0xed, 0x6e, 0x46, 0x76, 0xbb, 0xfb, 0x0c, 0x54, 0xe3, 0x0f,
0x32, 0xd8, 0xed, 0x51, 0xa5, 0x25, 0x3e, 0xc4, 0x38, 0x01, 0x25, 0xcf, 0xdd, 0xd5, 0x89, 0x71,
0x35, 0x79, 0x76, 0x45, 0xd1, 0x73, 0x77, 0x89, 0xc9, 0x35, 0xd1, 0x2c, 0xe4, 0xb6, 0x2c, 0x3b,
0x4a, 0x0c, 0x62, 0x05, 0xf4, 0x06, 0x39, 0xbc, 0xb1, 0x58, 0x6b, 0x7e, 0xd4, 0x33, 0x54, 0xd8,
0x82, 0xd9, 0x30, 0xd4, 0x50, 0xd4, 0x0f, 0xa1, 0x16, 0x4e, 0x7f, 0xcc, 0x87, 0x46, 0x81, 0xe1,
0x3f, 0x08, 0x33, 0x20, 0x58, 0x41, 0x3d, 0xcf, 0x22, 0x6f, 0xb4, 0xff, 0xd8, 0xea, 0x23, 0x98,
0x24, 0x18, 0x5c, 0xa9, 0xe8, 0x6f, 0xf5, 0xef, 0x32, 0x30, 0x9f, 0xc4, 0x1e, 0x87, 0xa4, 0x4b,
0x71, 0x45, 0x92, 0xbf, 0x1b, 0x11, 0x47, 0xe3, 0x4a, 0xc4, 0x97, 0xa2, 0xe5, 0xf6, 0x9c, 0x80,
0x5b, 0x22, 0xb2, 0x14, 0xd7, 0x49, 0x19, 0x2d, 0x40, 0xc1, 0x32, 0x75, 0x9b, 0x1c, 0xf8, 0xd8,
0x76, 0x95, 0xb7, 0xcc, 0xdb, 0xe4, 0x30, 0xf8, 0x5a, 0xe8, 0x84, 0x8d, 0x9c, 0x36, 0xc1, 0xf0,
0x51, 0x0d, 0x32, 0x96, 0xc9, 0x83, 0x23, 0x19, 0xcb, 0x24, 0x52, 0x45, 0x6f, 0x0a, 0x68, 0x8a,
0x2f, 0xcf, 0xf9, 0x25, 0xe2, 0x50, 0x25, 0xd0, 0xf7, 0x42, 0x20, 0xf1, 0xd3, 0x28, 0x1a, 0x0f,
0xee, 0x52, 0x5f, 0xba, 0xa8, 0x95, 0x09, 0x6c, 0x8d, 0x81, 0xd4, 0x06, 0xcc, 0x13, 0xd2, 0xd8,
0x14, 0xef, 0x93, 0x05, 0x09, 0xbd, 0xaf, 0xef, 0x29, 0xb0, 0x30, 0x50, 0x35, 0x0e, 0xaf, 0xaf,
0x8a, 0xcb, 0x5f, 0x5e, 0x39, 0x2f, 0xb5, 0x39, 0xf2, 0xc5, 0x0d, 0x65, 0xe5, 0xd7, 0x99, 0xab,
0xa4, 0xb1, 0xb4, 0xce, 0xc7, 0x9c, 0x24, 0xb4, 0x04, 0xf5, 0x5d, 0x2b, 0xd8, 0xd6, 0xe9, 0x4b,
0x24, 0xea, 0xa7, 0xb0, 0x60, 0x78, 0x51, 0xab, 0x11, 0xf8, 0x06, 0x01, 0x13, 0x5f, 0xc5, 0x57,
0xbf, 0xa5, 0xc0, 0x4c, 0x8c, 0xac, 0x71, 0xd8, 0xf4, 0x26, 0x71, 0xe1, 0x58, 0x47, 0x9c, 0x53,
0x8b, 0x52, 0x4e, 0xf1, 0xd1, 0xa8, 0x55, 0x8e, 0x5a, 0xa8, 0x3f, 0x56, 0xa0, 0x2c, 0xd4, 0x90,
0xb3, 0x21, 0xaf, 0xeb, 0x9f, 0x0d, 0x23, 0xc0, 0x48, 0x6c, 0x78, 0x06, 0xfa, 0xb6, 0x4a, 0x48,
0x93, 0x17, 0xf2, 0xf4, 0x4c, 0x1f, 0xdd, 0x82, 0x1a, 0x63, 0x53, 0x44, 0xba, 0xf4, 0xca, 0x26,
0xca, 0x40, 0x34, 0x3c, 0x93, 0x53, 0xa9, 0x55, 0x7d, 0xa1, 0xc4, 0xe2, 0xa0, 0xae, 0x89, 0xe9,
0x48, 0xb9, 0x81, 0x93, 0x5a, 0x45, 0x6c, 0x4a, 0xbc, 0x5d, 0x1b, 0x1b, 0x26, 0xf6, 0xa2, 0xb9,
0x45, 0x65, 0xe2, 0x5e, 0xb2, 0xdf, 0x3a, 0xf1, 0xfe, 0xb9, 0xd5, 0x05, 0x06, 0x22, 0x07, 0x03,
0xf4, 0x1c, 0x4c, 0x99, 0x9d, 0xd8, 0x33, 0xb8, 0xd0, 0x1f, 0x36, 0x3b, 0xc2, 0xfb, 0xb7, 0x18,
0x41, 0x93, 0x71, 0x82, 0xbe, 0xd1, 0x7f, 0x58, 0xec, 0x61, 0x13, 0x3b, 0x81, 0x65, 0xd8, 0x87,
0x97, 0xc9, 0x26, 0x14, 0x7b, 0x3e, 0xf6, 0x84, 0x4d, 0x22, 0x2a, 0x93, 0xba, 0xae, 0xe1, 0xfb,
0xbb, 0xae, 0x67, 0x72, 0x2a, 0xa3, 0xf2, 0x90, 0xa4, 0x47, 0xf6, 0x18, 0x55, 0x9e, 0xf4, 0x78,
0x09, 0x16, 0x3a, 0xae, 0x69, 0x6d, 0x59, 0xb2, 0x5c, 0x49, 0xd2, 0x6c, 0x2e, 0xac, 0x8e, 0xb5,
0x0b, 0x9f, 0x71, 0xcc, 0x88, 0xcf, 0x38, 0x7e, 0x90, 0x81, 0x85, 0xf7, 0xbb, 0xe6, 0xe7, 0xc0,
0x87, 0x45, 0x28, 0xbb, 0xb6, 0xb9, 0x1e, 0x67, 0x85, 0x08, 0x22, 0x18, 0x0e, 0xde, 0x8d, 0x30,
0xd8, 0x25, 0xbe, 0x08, 0x1a, 0x9a, 0x24, 0x7a, 0x28, 0x7e, 0xe5, 0x87, 0xf1, 0xab, 0xf4, 0xd9,
0x95, 0x7c, 0x31, 0x53, 0x9f, 0x6d, 0x64, 0xd4, 0x9f, 0x87, 0x05, 0x16, 0x6e, 0x7e, 0xcc, 0x5c,
0x0a, 0xd7, 0x68, 0x4e, 0x5c, 0xa3, 0x8f, 0x61, 0x8e, 0x58, 0x73, 0x32, 0xf4, 0xfb, 0x3e, 0xf6,
0xc6, 0x34, 0x52, 0x27, 0xa1, 0x14, 0x8e, 0x16, 0xa6, 0xf7, 0xf6, 0x01, 0xea, 0xcf, 0xc1, 0x6c,
0x62, 0xac, 0x43, 0xce, 0x32, 0x9c, 0xc9, 0xbc, 0x38, 0x93, 0x45, 0x00, 0xcd, 0xb5, 0xf1, 0x3b,
0x4e, 0x60, 0x05, 0x7b, 0xc4, 0x4b, 0x10, 0xdc, 0x2f, 0xfa, 0x9b, 0x60, 0x90, 0x71, 0x87, 0x60,
0xfc, 0xaa, 0x02, 0xd3, 0x4c, 0x73, 0x49, 0x57, 0x87, 0x5f, 0x85, 0xd7, 0x20, 0x8f, 0xe9, 0x28,
0xfc, 0x46, 0xe1, 0xb4, 0xdc, 0x54, 0x47, 0xe4, 0x6a, 0x1c, 0x5d, 0xaa, 0x46, 0x01, 0x4c, 0xad,
0x7a, 0x6e, 0x77, 0x3c, 0x8a, 0xa8, 0x67, 0x62, 0x63, 0xd1, 0xd7, 0x2c, 0x12, 0xc0, 0xdd, 0x34,
0xc1, 0xf8, 0x27, 0x05, 0xe6, 0xef, 0x75, 0xb1, 0x67, 0x04, 0x98, 0x30, 0x6d, 0xbc, 0xd1, 0x87,
0xe9, 0x6e, 0x8c, 0xb2, 0x6c, 0x9c, 0x32, 0xf4, 0x66, 0xec, 0xed, 0x99, 0xfc, 0x3c, 0x92, 0xa0,
0xb2, 0x9f, 0xc3, 0x1e, 0xce, 0x6b, 0x41, 0x9c, 0xd7, 0x8f, 0x14, 0x98, 0xde, 0xc0, 0x64, 0x1f,
0x1b, 0x6f, 0x4a, 0x17, 0x61, 0x92, 0x50, 0x39, 0xea, 0x02, 0x53, 0x64, 0x74, 0x0e, 0xa6, 0x2d,
0xa7, 0x65, 0xf7, 0x4c, 0xac, 0x93, 0xf9, 0xeb, 0xc4, 0x8d, 0xe3, 0xce, 0xc3, 0x14, 0xaf, 0x20,
0xd3, 0x20, 0x5b, 0xb4, 0x54, 0xc6, 0x1f, 0x31, 0x19, 0x8f, 0x92, 0x7c, 0x18, 0x09, 0xca, 0x41,
0x48, 0x78, 0x15, 0x72, 0x64, 0xe8, 0xd0, 0x89, 0x90, 0xb7, 0xea, 0xab, 0x89, 0xc6, 0xb0, 0xd5,
0x5f, 0x50, 0x00, 0x89, 0x6c, 0x1b, 0xc7, 0x4a, 0xbc, 0x2e, 0x06, 0xf7, 0xb3, 0x43, 0x49, 0x67,
0x33, 0x8d, 0xc2, 0xfa, 0xea, 0xa7, 0xd1, 0xea, 0xd1, 0xe5, 0x1e, 0x67, 0xf5, 0xc8, 0xbc, 0x86,
0xae, 0x9e, 0xc0, 0x04, 0x8a, 0x2c, 0xae, 0x1e, 0x95, 0x58, 0xc9, 0xea, 0x11, 0x9a, 0xe9, 0xea,
0x71, 0xfb, 0xde, 0x68, 0x64, 0xc8, 0xa2, 0x31, 0x62, 0xc3, 0x45, 0xa3, 0x23, 0x2b, 0x07, 0x19,
0xf9, 0x55, 0xc8, 0x91, 0x11, 0xf7, 0xe7, 0x57, 0xb8, 0x68, 0x14, 0x5b, 0x58, 0x34, 0x4e, 0xc0,
0xe3, 0x5f, 0xb4, 0xfe, 0x4c, 0xfb, 0x8b, 0xa6, 0x42, 0xe5, 0xde, 0xe6, 0xc7, 0xb8, 0x15, 0x0c,
0xb1, 0xbc, 0x67, 0x61, 0x6a, 0xdd, 0xb3, 0x76, 0x2c, 0x1b, 0xb7, 0x87, 0x99, 0xf0, 0x6f, 0x29,
0x50, 0xbd, 0xe9, 0x19, 0x4e, 0xe0, 0x86, 0x66, 0xfc, 0x50, 0xfc, 0xbc, 0x06, 0xa5, 0x6e, 0x38,
0x1a, 0x97, 0x81, 0x67, 0xe5, 0x51, 0x97, 0x38, 0x4d, 0x5a, 0xbf, 0x99, 0xfa, 0x01, 0xcc, 0x52,
0x4a, 0x92, 0x64, 0x5f, 0x81, 0x22, 0x35, 0xe6, 0x16, 0xbf, 0xe8, 0x28, 0xaf, 0xa8, 0xf2, 0x23,
0x8d, 0x38, 0x0d, 0x2d, 0x6a, 0xa3, 0xfe, 0x9b, 0x02, 0x65, 0x5a, 0xd7, 0x9f, 0xe0, 0xc1, 0xb5,
0xfc, 0x75, 0xc8, 0xbb, 0x94, 0xe5, 0x43, 0x83, 0xb3, 0xe2, 0xaa, 0x68, 0xbc, 0x01, 0xf1, 0x90,
0xd9, 0x2f, 0xd1, 0x22, 0x03, 0x03, 0x71, 0x9b, 0x5c, 0x68, 0x33, 0xda, 0xa9, 0x59, 0x1e, 0x6d,
0x7e, 0x61, 0x13, 0x7a, 0x56, 0x63, 0x32, 0x49, 0x11, 0x0e, 0xaf, 0xc2, 0x5f, 0x4e, 0xec, 0xb1,
0x8b, 0xe9, 0x54, 0xc8, 0x37, 0xd9, 0x98, 0x65, 0x25, 0x67, 0xb5, 0x18, 0x59, 0x63, 0x9e, 0xd5,
0x22, 0x11, 0x18, 0x76, 0x56, 0x13, 0x89, 0xeb, 0x0b, 0xc0, 0xbf, 0x28, 0xb0, 0xc0, 0xf7, 0xb4,
0x48, 0xb6, 0x8e, 0x80, 0x4d, 0xe8, 0x2b, 0x7c, 0xef, 0xcd, 0xd2, 0xbd, 0xf7, 0x85, 0x61, 0x7b,
0x6f, 0x44, 0xe7, 0x3e, 0x9b, 0xef, 0x59, 0x28, 0xdd, 0xa1, 0x0d, 0xdf, 0x79, 0x14, 0xa0, 0x06,
0x14, 0x76, 0xb0, 0xe7, 0x5b, 0xae, 0xc3, 0x55, 0x3c, 0x2c, 0x9e, 0x3b, 0x03, 0xc5, 0xf0, 0x35,
0x1a, 0x2a, 0x40, 0xf6, 0xaa, 0x6d, 0xd7, 0x27, 0x50, 0x05, 0x8a, 0x6b, 0xfc, 0xc9, 0x55, 0x5d,
0x39, 0xf7, 0x36, 0xcc, 0x48, 0xf6, 0x7d, 0x34, 0x0d, 0xd5, 0xab, 0x26, 0xf5, 0x2e, 0xef, 0xbb,
0x04, 0x58, 0x9f, 0x40, 0xf3, 0x80, 0x34, 0xdc, 0x71, 0x77, 0x28, 0xe2, 0x0d, 0xcf, 0xed, 0x50,
0xb8, 0x72, 0xee, 0x45, 0x98, 0x95, 0x51, 0x8f, 0x4a, 0x90, 0xa3, 0xdc, 0xa8, 0x4f, 0x20, 0x80,
0xbc, 0x86, 0x77, 0xdc, 0x07, 0xb8, 0xae, 0xac, 0xfc, 0xf9, 0x39, 0xa8, 0x32, 0xda, 0xf9, 0xdb,
0x69, 0xa4, 0x43, 0x3d, 0xf9, 0xf9, 0x28, 0xf4, 0x25, 0xf9, 0x8d, 0xa9, 0xfc, 0x2b, 0x53, 0xcd,
0x61, 0xc2, 0xa4, 0x4e, 0xa0, 0x0f, 0xa1, 0x16, 0xff, 0xe0, 0x12, 0x92, 0x87, 0x86, 0xa5, 0x5f,
0x65, 0xda, 0xaf, 0x73, 0x1d, 0xaa, 0xb1, 0x6f, 0x25, 0x21, 0xf9, 0x02, 0xcb, 0xbe, 0xa7, 0xd4,
0x94, 0x5b, 0x13, 0xf1, 0x7b, 0x46, 0x8c, 0xfa, 0xf8, 0xc7, 0x4b, 0x52, 0xa8, 0x97, 0x7e, 0xe1,
0x64, 0x3f, 0xea, 0x0d, 0x98, 0x1e, 0xf8, 0xb6, 0x08, 0x7a, 0x31, 0xe5, 0x42, 0x44, 0xfe, 0x0d,
0x92, 0xfd, 0x86, 0xd8, 0x05, 0x34, 0xf8, 0xfd, 0x1f, 0xb4, 0x2c, 0x5f, 0x81, 0xb4, 0x2f, 0x22,
0x35, 0x2f, 0x8c, 0x8c, 0x1f, 0x31, 0xee, 0x9b, 0x0a, 0x2c, 0xa4, 0x7c, 0x86, 0x02, 0x5d, 0x4c,
0xbb, 0x1d, 0x1b, 0xf2, 0x51, 0x8d, 0xe6, 0x2b, 0x07, 0x6b, 0x14, 0x11, 0xe2, 0xc0, 0x54, 0xe2,
0x2b, 0x0c, 0xe8, 0x7c, 0xea, 0xd3, 0xd1, 0xc1, 0x4f, 0x54, 0x34, 0xbf, 0x34, 0x1a, 0x72, 0x34,
0xde, 0x47, 0x30, 0x95, 0xf8, 0x04, 0x41, 0xca, 0x78, 0xf2, 0x0f, 0x15, 0xec, 0xb7, 0xa0, 0x5f,
0x85, 0x6a, 0xec, 0x5b, 0x01, 0x29, 0x12, 0x2f, 0xfb, 0x9e, 0xc0, 0x7e, 0x5d, 0x7f, 0x04, 0x15,
0xf1, 0x49, 0x3f, 0x5a, 0x4a, 0xd3, 0xa5, 0x81, 0x8e, 0x0f, 0xa2, 0x4a, 0xfd, 0xa7, 0xb8, 0x43,
0x54, 0x69, 0xe0, 0xf5, 0xf2, 0xe8, 0xaa, 0x24, 0xf4, 0x3f, 0x54, 0x95, 0x0e, 0x3c, 0xc4, 0xd7,
0x15, 0x7a, 0x3d, 0x2f, 0x79, 0xea, 0x8d, 0x56, 0xd2, 0x64, 0x33, 0xfd, 0x51, 0x7b, 0xf3, 0xe2,
0x81, 0xda, 0x44, 0x5c, 0x7c, 0x00, 0xb5, 0xf8, 0x83, 0xe6, 0x14, 0x2e, 0x4a, 0xdf, 0x80, 0x37,
0xcf, 0x8f, 0x84, 0x1b, 0x0d, 0xf6, 0x3e, 0x94, 0x85, 0x2f, 0x42, 0xa2, 0xe7, 0x87, 0xc8, 0xb1,
0xf8, 0x79, 0xc4, 0xfd, 0x38, 0xf9, 0x1e, 0x94, 0xa2, 0x0f, 0x39, 0xa2, 0xb3, 0xa9, 0xf2, 0x7b,
0x90, 0x2e, 0x37, 0x00, 0xfa, 0x5f, 0x69, 0x44, 0xcf, 0x49, 0xfb, 0x1c, 0xf8, 0x8c, 0xe3, 0x7e,
0x9d, 0x46, 0xd3, 0x67, 0x2f, 0x3e, 0x86, 0x4d, 0x5f, 0x7c, 0xb4, 0xb4, 0x5f, 0xb7, 0xdb, 0x50,
0x8d, 0x3d, 0x3e, 0x4c, 0x53, 0x61, 0xc9, 0xe3, 0xd0, 0xe6, 0xb9, 0x51, 0x50, 0xa3, 0xf5, 0xdb,
0x86, 0x6a, 0xec, 0xe1, 0x57, 0xca, 0x48, 0xb2, 0x07, 0x6f, 0x29, 0x23, 0x49, 0xdf, 0x91, 0xa9,
0x13, 0xe8, 0x6b, 0xc2, 0x1b, 0xb3, 0xd8, 0x83, 0x3e, 0xf4, 0xf2, 0xd0, 0x7e, 0x64, 0x0f, 0x1b,
0x9b, 0x2b, 0x07, 0x69, 0x12, 0x91, 0xc0, 0xa5, 0x8a, 0xb1, 0x34, 0x5d, 0xaa, 0x0e, 0xb2, 0x52,
0x1b, 0x90, 0x67, 0x2f, 0xb8, 0x90, 0x9a, 0xf2, 0x8c, 0x53, 0x78, 0xde, 0xd5, 0x7c, 0x46, 0x8a,
0x13, 0x7f, 0xd3, 0xc4, 0x3a, 0x65, 0x37, 0xa5, 0x29, 0x9d, 0xc6, 0x5e, 0xed, 0x8c, 0xda, 0xa9,
0x06, 0x79, 0xf6, 0x8c, 0x20, 0xa5, 0xd3, 0xd8, 0x1b, 0x99, 0xe6, 0x70, 0x1c, 0x76, 0xde, 0x9d,
0x40, 0xeb, 0x90, 0xa3, 0xe1, 0x67, 0x74, 0x66, 0x58, 0x62, 0xfd, 0xb0, 0x1e, 0x63, 0xb9, 0xf7,
0xea, 0x04, 0xba, 0x07, 0x39, 0x1a, 0xc0, 0x4b, 0xe9, 0x51, 0xcc, 0x8e, 0x6f, 0x0e, 0x45, 0x09,
0x49, 0x34, 0xa1, 0x22, 0x66, 0xc2, 0xa6, 0x6c, 0x59, 0x92, 0x5c, 0xe1, 0xe6, 0x28, 0x98, 0xe1,
0x28, 0x4c, 0x8d, 0xfa, 0xa1, 0xf8, 0x74, 0x35, 0x1a, 0x08, 0xf3, 0xa7, 0xab, 0xd1, 0x60, 0x64,
0x5f, 0x9d, 0x40, 0xbf, 0xa4, 0x40, 0x23, 0x2d, 0x3d, 0x13, 0xa5, 0x7a, 0x40, 0xc3, 0x72, 0x4c,
0x9b, 0xaf, 0x1e, 0xb0, 0x55, 0x44, 0xcb, 0x27, 0x34, 0xee, 0x37, 0x90, 0x90, 0x79, 0x21, 0xad,
0xbf, 0x94, 0x24, 0xc3, 0xe6, 0x4b, 0xa3, 0x37, 0x88, 0xc6, 0xde, 0x84, 0xb2, 0x10, 0x73, 0x4c,
0xb1, 0xbc, 0x83, 0xc1, 0xd2, 0x94, 0x55, 0x95, 0x84, 0x2f, 0x99, 0x78, 0xd3, 0x2c, 0xbe, 0x14,
0x61, 0x14, 0x93, 0x02, 0x53, 0xc4, 0x3b, 0x96, 0x04, 0xa8, 0x4e, 0x20, 0x0c, 0x15, 0x31, 0xa5,
0x2f, 0x45, 0x1a, 0x25, 0xd9, 0x80, 0xcd, 0x17, 0x46, 0xc0, 0x8c, 0x86, 0xd1, 0x01, 0xfa, 0x29,
0x75, 0x29, 0x7b, 0xdd, 0x40, 0x56, 0x5f, 0xf3, 0xf9, 0x7d, 0xf1, 0xc4, 0x6d, 0x5f, 0x48, 0x92,
0x4b, 0xe1, 0xfe, 0x60, 0x1a, 0xdd, 0x08, 0x67, 0x91, 0xc1, 0xb4, 0xab, 0x94, 0xb3, 0x48, 0x6a,
0x86, 0x57, 0xf3, 0xc2, 0xc8, 0xf8, 0xd1, 0x7c, 0x1e, 0x42, 0x3d, 0x99, 0xa6, 0x96, 0x72, 0xc6,
0x4d, 0xc9, 0x9a, 0x6b, 0xbe, 0x38, 0x22, 0xb6, 0xb8, 0x1f, 0x9e, 0x18, 0xa4, 0xe9, 0x67, 0xac,
0x60, 0x9b, 0x66, 0x48, 0x8d, 0x32, 0x6b, 0x31, 0x19, 0x6b, 0x94, 0x59, 0xc7, 0x52, 0xaf, 0xf8,
0xe6, 0x45, 0xb3, 0x0d, 0xd2, 0x36, 0x2f, 0x31, 0xe9, 0x27, 0x65, 0x9f, 0x89, 0x67, 0xc6, 0x30,
0xf7, 0x33, 0x9e, 0xc5, 0x80, 0xce, 0x8d, 0x94, 0xea, 0x30, 0xcc, 0xfd, 0x94, 0xa7, 0x45, 0xb0,
0xa3, 0x5b, 0x22, 0x49, 0x23, 0xe5, 0x28, 0x25, 0xcf, 0xf2, 0x48, 0x39, 0xba, 0xa5, 0xe4, 0x7d,
0x50, 0xc5, 0xaa, 0x27, 0x23, 0xde, 0xc3, 0xef, 0x42, 0x92, 0xa1, 0xce, 0xfd, 0xaf, 0x2b, 0xea,
0xc9, 0x50, 0x72, 0xca, 0x00, 0x29, 0x11, 0xe7, 0x11, 0x06, 0x48, 0x46, 0x61, 0x53, 0x06, 0x48,
0x09, 0xd6, 0x8e, 0xe0, 0xbb, 0xc6, 0xa2, 0x9f, 0x29, 0x5b, 0xa1, 0x2c, 0x42, 0x9a, 0xb2, 0x15,
0x4a, 0x03, 0xb7, 0xcc, 0xa3, 0xef, 0x07, 0x31, 0x53, 0xac, 0xdc, 0x40, 0x94, 0x73, 0x3f, 0xf2,
0xef, 0x41, 0x31, 0x8c, 0x42, 0xa2, 0x67, 0x53, 0x5d, 0xc4, 0x03, 0x74, 0xf8, 0x11, 0x4c, 0x25,
0x6e, 0xf0, 0x52, 0x44, 0x54, 0x1e, 0x85, 0xdc, 0x7f, 0x3d, 0xa1, 0x1f, 0xaf, 0x4a, 0x61, 0xc2,
0x40, 0x1c, 0x30, 0xc5, 0xd4, 0x0f, 0x06, 0xbe, 0xc4, 0x01, 0x08, 0x61, 0x43, 0x07, 0x10, 0x42,
0x55, 0x43, 0x07, 0x10, 0x83, 0x34, 0x4c, 0x22, 0x93, 0x17, 0x94, 0x29, 0x12, 0x99, 0x72, 0x5b,
0xbc, 0x1f, 0x8b, 0x36, 0xa1, 0x2c, 0x5c, 0x79, 0xa3, 0x61, 0xa4, 0x89, 0x77, 0xf5, 0x29, 0xae,
0x82, 0xe4, 0xf6, 0x5c, 0x9d, 0x58, 0xe9, 0x41, 0x65, 0xdd, 0x73, 0x1f, 0x85, 0x1f, 0x9c, 0xfc,
0x9c, 0x36, 0xfa, 0xcb, 0x2d, 0xa8, 0x31, 0x04, 0x1d, 0x3f, 0x0a, 0x74, 0x77, 0xf3, 0x63, 0x74,
0x72, 0x99, 0xfd, 0x1b, 0x87, 0xe5, 0xf0, 0xdf, 0x38, 0x2c, 0xdf, 0xb0, 0x6c, 0x7c, 0x8f, 0x67,
0x41, 0xfe, 0x47, 0x61, 0xc8, 0xab, 0xbc, 0xe8, 0xca, 0x5a, 0xe3, 0xff, 0x49, 0xe2, 0x9d, 0x47,
0xc1, 0xbd, 0xcd, 0x8f, 0xaf, 0x19, 0x9f, 0x5d, 0x29, 0x40, 0x6e, 0x65, 0xf9, 0xe5, 0xe5, 0x97,
0xa0, 0x66, 0x45, 0xe8, 0x6d, 0xaf, 0xdb, 0xba, 0x56, 0x66, 0x8d, 0xd6, 0x49, 0x3f, 0xeb, 0xca,
0xcf, 0x5e, 0x6c, 0x5b, 0xc1, 0x76, 0x6f, 0x93, 0x2c, 0xc1, 0x05, 0x86, 0xf6, 0xa2, 0xe5, 0xf2,
0x5f, 0x17, 0x2c, 0x27, 0xc0, 0x9e, 0x63, 0xd8, 0xec, 0x3f, 0x4c, 0x70, 0x68, 0x77, 0xf3, 0xf7,
0x14, 0x65, 0x33, 0x4f, 0x41, 0x17, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xb6, 0x47, 0x70,
0xc3, 0x62, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -3873,10 +3873,6 @@ func (node *Proxy) CreateCredential(ctx context.Context, req *milvuspb.CreateCre
if !node.checkHealthy() {
return unhealthyStatus(), errorutil.UnhealthyError()
}
// validate root permission
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
// validate params
username := req.Username
if err := ValidateUsername(username); err != nil {
@ -3999,10 +3995,6 @@ func (node *Proxy) DeleteCredential(ctx context.Context, req *milvuspb.DeleteCre
if !node.checkHealthy() {
return unhealthyStatus(), errorutil.UnhealthyError()
}
// validate root permission
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
if req.Username == util.UserRoot {
return &commonpb.Status{
@ -4064,18 +4056,6 @@ func (node *Proxy) SendRetrieveResult(ctx context.Context, req *internalpb.Retri
}, nil
}
func (node *Proxy) validateAdminPermission(ctx context.Context) (bool, *commonpb.Status) {
err := ValidateAdminPermission(ctx)
if err != nil {
logger.Error("fail to validate admin permission", zap.Error(err))
return false, &commonpb.Status{
ErrorCode: commonpb.ErrorCode_PermissionDenied,
Reason: err.Error(),
}
}
return true, nil
}
func (node *Proxy) CreateRole(ctx context.Context, req *milvuspb.CreateRoleRequest) (*commonpb.Status, error) {
logger.Debug("CreateRole", zap.Any("req", req))
if code, ok := node.checkHealthyAndReturnCode(); !ok {
@ -4093,10 +4073,6 @@ func (node *Proxy) CreateRole(ctx context.Context, req *milvuspb.CreateRoleReque
}, err
}
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.CreateRole(ctx, req)
if err != nil {
logger.Error("fail to create role", zap.Error(err))
@ -4119,9 +4095,6 @@ func (node *Proxy) DropRole(ctx context.Context, req *milvuspb.DropRoleRequest)
Reason: err.Error(),
}, err
}
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.DropRole(ctx, req)
if err != nil {
logger.Error("fail to drop role", zap.String("role_name", req.RoleName), zap.Error(err))
@ -4150,9 +4123,6 @@ func (node *Proxy) OperateUserRole(ctx context.Context, req *milvuspb.OperateUse
Reason: err.Error(),
}, err
}
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.OperateUserRole(ctx, req)
if err != nil {
@ -4181,11 +4151,6 @@ func (node *Proxy) SelectRole(ctx context.Context, req *milvuspb.SelectRoleReque
}, err
}
}
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return &milvuspb.SelectRoleResponse{
Status: status,
}, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.SelectRole(ctx, req)
if err != nil {
@ -4216,21 +4181,6 @@ func (node *Proxy) SelectUser(ctx context.Context, req *milvuspb.SelectUserReque
}, err
}
}
curUser, err := GetCurUserFromContext(ctx)
if err != nil {
return &milvuspb.SelectUserResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
},
}, err
}
isSelf := req.User != nil && req.User.Name == curUser
if isValid, status := node.validateAdminPermission(ctx); !isValid && !isSelf {
return &milvuspb.SelectUserResponse{
Status: status,
}, errorutil.PermissionDenyError()
}
result, err := node.rootCoord.SelectUser(ctx, req)
if err != nil {
@ -4282,9 +4232,6 @@ func (node *Proxy) OperatePrivilege(ctx context.Context, req *milvuspb.OperatePr
if code, ok := node.checkHealthyAndReturnCode(); !ok {
return errorutil.UnhealthyStatus(code), errorutil.UnhealthyError()
}
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return status, errorutil.PermissionDenyError()
}
if err := node.validPrivilegeParams(req); err != nil {
return &commonpb.Status{
ErrorCode: commonpb.ErrorCode_IllegalArgument,
@ -4342,12 +4289,6 @@ func (node *Proxy) SelectGrant(ctx context.Context, req *milvuspb.SelectGrantReq
return &milvuspb.SelectGrantResponse{Status: errorutil.UnhealthyStatus(code)}, errorutil.UnhealthyError()
}
if isValid, status := node.validateAdminPermission(ctx); !isValid {
return &milvuspb.SelectGrantResponse{
Status: status,
}, errorutil.PermissionDenyError()
}
if err := node.validGrantParams(req); err != nil {
return &milvuspb.SelectGrantResponse{
Status: &commonpb.Status{

View File

@ -670,7 +670,11 @@ func (m *MetaCache) InitPolicyInfo(info []string, userRoles []string) {
m.privilegeInfos = util.StringSet(info)
for _, userRole := range userRoles {
user, role := funcutil.DecodeUserRoleCache(userRole)
user, role, err := funcutil.DecodeUserRoleCache(userRole)
if err != nil {
log.Warn("invalid user-role key", zap.String("user-role", userRole), zap.Error(err))
continue
}
if m.userToRoles[user] == nil {
m.userToRoles[user] = make(map[string]struct{})
}
@ -705,13 +709,19 @@ func (m *MetaCache) RefreshPolicyInfo(op typeutil.CacheOp) error {
case typeutil.CacheRevokePrivilege:
delete(m.privilegeInfos, op.OpKey)
case typeutil.CacheAddUserToRole:
user, role := funcutil.DecodeUserRoleCache(op.OpKey)
user, role, err := funcutil.DecodeUserRoleCache(op.OpKey)
if err != nil {
return fmt.Errorf("invalid opKey, fail to decode, op_type: %d, op_key: %s", int(op.OpType), op.OpKey)
}
if m.userToRoles[user] == nil {
m.userToRoles[user] = make(map[string]struct{})
}
m.userToRoles[user][role] = struct{}{}
case typeutil.CacheRemoveUserFromRole:
user, role := funcutil.DecodeUserRoleCache(op.OpKey)
user, role, err := funcutil.DecodeUserRoleCache(op.OpKey)
if err != nil {
return fmt.Errorf("invalid opKey, fail to decode, op_type: %d, op_key: %s", int(op.OpType), op.OpKey)
}
if m.userToRoles[user] != nil {
delete(m.userToRoles[user], role)
}

View File

@ -6,6 +6,8 @@ import (
"reflect"
"strings"
"github.com/milvus-io/milvus/internal/proto/commonpb"
"github.com/milvus-io/milvus/internal/util"
"github.com/casbin/casbin/v2"
@ -87,17 +89,24 @@ func PrivilegeInterceptor(ctx context.Context, req interface{}) (context.Context
return ctx, err
}
roleNames = append(roleNames, util.RolePublic)
resourceType := privilegeExt.ObjectType.String()
resourceNameIndex := privilegeExt.ObjectNameIndex
resourceName := funcutil.GetResourceName(req, privilegeExt.ObjectNameIndex)
resourcePrivilege := privilegeExt.ObjectPrivilege.String()
objectType := privilegeExt.ObjectType.String()
objectNameIndex := privilegeExt.ObjectNameIndex
objectName := funcutil.GetObjectName(req, objectNameIndex)
if isCurUserObject(objectType, username, objectName) {
return ctx, nil
}
objectNameIndexs := privilegeExt.ObjectNameIndexs
objectNames := funcutil.GetObjectNames(req, objectNameIndexs)
objectPrivilege := privilegeExt.ObjectPrivilege.String()
policyInfo := strings.Join(globalMetaCache.GetPrivilegeInfo(ctx), ",")
log.Debug("current request info", zap.String("username", username), zap.Strings("role_names", roleNames),
zap.String("resource_type", resourceType), zap.String("resource_privilege", resourcePrivilege), zap.Int32("resource_index", resourceNameIndex), zap.String("resource_name", resourceName),
zap.String("object_type", objectType), zap.String("object_privilege", objectPrivilege),
zap.Int32("object_index", objectNameIndex), zap.String("object_name", objectName),
zap.Strings("object_names", objectNames),
zap.String("policy_info", policyInfo))
policy := fmt.Sprintf("[%s]", strings.Join(globalMetaCache.GetPrivilegeInfo(ctx), ","))
policy := fmt.Sprintf("[%s]", policyInfo)
b := []byte(policy)
a := jsonadapter.NewAdapter(&b)
policyModel, err := initPolicyModel()
@ -112,12 +121,38 @@ func PrivilegeInterceptor(ctx context.Context, req interface{}) (context.Context
return ctx, err
}
for _, roleName := range roleNames {
isPermit, err := e.Enforce(roleName, funcutil.PolicyForResource(resourceType, resourceName), privilegeExt.ObjectPrivilege.String())
permitFunc := func(resName string) (bool, error) {
object := funcutil.PolicyForResource(objectType, objectName)
isPermit, err := e.Enforce(roleName, object, objectPrivilege)
if err != nil {
log.Error("Enforce fail", zap.String("role", roleName), zap.String("object", object), zap.String("privilege", objectPrivilege), zap.Error(err))
return false, err
}
return isPermit, nil
}
// handle the api which refers one resource
permitObject, err := permitFunc(objectName)
if err != nil {
log.Error("Enforce fail", zap.String("policy", policy), zap.String("role", roleName), zap.Error(err))
return ctx, err
}
if isPermit {
if permitObject {
return ctx, nil
}
// handle the api which refers many resources
permitObjects := true
for _, name := range objectNames {
p, err := permitFunc(name)
if err != nil {
return ctx, err
}
if !p {
permitObjects = false
break
}
}
if permitObjects && len(objectNames) != 0 {
return ctx, nil
}
}
@ -128,6 +163,16 @@ func PrivilegeInterceptor(ctx context.Context, req interface{}) (context.Context
type ErrPermissionDenied struct{}
func (e ErrPermissionDenied) Error() string {
func (e *ErrPermissionDenied) Error() string {
return "permission deny"
}
// isCurUserObject Determine whether it is an Object of type User that operates on its own user information,
// like updating password or viewing your own role information.
// make users operate their own user information when the related privileges are not granted.
func isCurUserObject(objectType string, curUser string, object string) bool {
if objectType != commonpb.ObjectType_User.String() {
return false
}
return curUser == object
}

View File

@ -2169,10 +2169,6 @@ func TestProxy(t *testing.T) {
}
}
createCredentialReq := constructCreateCredentialRequest()
// permission deny
invalidCtx := GetContext(context.Background(), "foo:12345")
_, err := proxy.CreateCredential(invalidCtx, createCredentialReq)
assert.Error(t, err)
// success
resp, err := proxy.CreateCredential(ctx, createCredentialReq)
assert.NoError(t, err)
@ -2311,10 +2307,6 @@ func TestProxy(t *testing.T) {
}
}
delCredReq := constructDelCredRequest()
// permission deny
invalidCtx := GetContext(context.Background(), "foo:12345")
_, err := proxy.DeleteCredential(invalidCtx, delCredReq)
assert.Error(t, err)
deleteResp, err := proxy.DeleteCredential(ctx, delCredReq)
assert.NoError(t, err)
@ -3177,10 +3169,6 @@ func TestProxy(t *testing.T) {
cancel()
}
func getNotRootCtx() context.Context {
return GetContext(context.Background(), "foo:12345")
}
func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
var wg sync.WaitGroup
wg.Add(1)
@ -3192,9 +3180,6 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
entity.Name = "unit_test"
_, err := proxy.CreateRole(getNotRootCtx(), &milvuspb.CreateRoleRequest{Entity: entity})
assert.Error(t, err)
resp, _ = proxy.CreateRole(ctx, &milvuspb.CreateRoleRequest{Entity: entity})
assert.Equal(t, commonpb.ErrorCode_Success, resp.ErrorCode)
@ -3225,28 +3210,16 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
ObjectName: "col1",
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
Role: &milvuspb.RoleEntity{Name: roleName},
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.Load.String()}},
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoad.String())}},
},
}
privilegeResp, _ := proxy.OperatePrivilege(ctx, privilegeRequest)
assert.Equal(t, commonpb.ErrorCode_Success, privilegeResp.ErrorCode)
_, err := proxy.SelectUser(context.Background(), &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true})
assert.Error(t, err)
_, err = proxy.SelectUser(getNotRootCtx(), &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true})
assert.Error(t, err)
userResp, _ := proxy.SelectUser(ctx, &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true})
assert.Equal(t, commonpb.ErrorCode_Success, userResp.Status.ErrorCode)
roleNumOfUser := len(userResp.Results[0].Roles)
_, err = proxy.OperateUserRole(getNotRootCtx(), &milvuspb.OperateUserRoleRequest{
Username: username,
RoleName: roleName,
Type: milvuspb.OperateUserRoleType_AddUserToRole,
})
assert.Error(t, err)
roleResp, _ = proxy.OperateUserRole(ctx, &milvuspb.OperateUserRoleRequest{
Username: username,
RoleName: roleName,
@ -3261,9 +3234,6 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
privilegeResp, _ = proxy.OperatePrivilege(ctx, privilegeRequest)
assert.Equal(t, commonpb.ErrorCode_Success, privilegeResp.ErrorCode)
_, err = proxy.DropRole(getNotRootCtx(), &milvuspb.DropRoleRequest{RoleName: roleName})
assert.Error(t, err)
roleResp, _ = proxy.DropRole(ctx, &milvuspb.DropRoleRequest{RoleName: roleName})
assert.Equal(t, commonpb.ErrorCode_Success, roleResp.ErrorCode)
@ -3305,9 +3275,6 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) {
_, err := proxy.SelectRole(ctx, &milvuspb.SelectRoleRequest{Role: &milvuspb.RoleEntity{Name: " "}})
assert.Error(t, err)
_, err = proxy.SelectRole(getNotRootCtx(), &milvuspb.SelectRoleRequest{Role: &milvuspb.RoleEntity{Name: " "}})
assert.Error(t, err)
resp, _ := proxy.SelectRole(ctx, &milvuspb.SelectRoleRequest{})
assert.Equal(t, commonpb.ErrorCode_Success, resp.Status.ErrorCode)
roleNum := len(resp.Results)
@ -3428,7 +3395,8 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
resp, _ = proxy.OperatePrivilege(ctx, req)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
req.Entity.Grantor.Privilege.Name = util.All.String()
req.Entity.Grantor.Privilege.Name = util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String())
resp, _ = proxy.OperatePrivilege(ctx, req)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
@ -3449,9 +3417,7 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
req.Entity.Role = &milvuspb.RoleEntity{Name: "admin"}
_, err := proxy.OperatePrivilege(getNotRootCtx(), req)
assert.Error(t, err)
_, err = proxy.OperatePrivilege(context.Background(), req)
_, err := proxy.OperatePrivilege(context.Background(), req)
assert.Error(t, err)
resp, _ = proxy.OperatePrivilege(ctx, req)
@ -3460,8 +3426,7 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
req.Entity.Grantor.Privilege.Name = "not existed"
resp, _ = proxy.OperatePrivilege(ctx, req)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
req.Entity.Grantor.Privilege.Name = util.All.String()
req.Entity.Grantor.Privilege.Name = util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String())
req.Entity.Object.Name = "not existed"
resp, _ = proxy.OperatePrivilege(ctx, req)
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)
@ -3477,7 +3442,7 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
Role: &milvuspb.RoleEntity{Name: "public"},
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
ObjectName: "col1",
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.Load.String()}},
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoad.String())}},
},
Type: milvuspb.OperatePrivilegeType_Grant,
}
@ -3510,8 +3475,6 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) {
assert.NotEqual(t, commonpb.ErrorCode_Success, results.Status.ErrorCode)
selectReq.Entity.Role = &milvuspb.RoleEntity{Name: "public"}
_, err = proxy.SelectGrant(getNotRootCtx(), selectReq)
assert.Error(t, err)
results, _ = proxy.SelectGrant(ctx, selectReq)
assert.Equal(t, commonpb.ErrorCode_Success, results.Status.ErrorCode)
@ -3564,7 +3527,7 @@ func testProxyPrivilegeFail(ctx context.Context, t *testing.T, proxy *Proxy, rea
Role: &milvuspb.RoleEntity{Name: "admin"},
ObjectName: "col1",
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.All.String()}},
Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String())}},
},
})
assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode)

View File

@ -696,21 +696,3 @@ func GetRole(username string) ([]string, error) {
}
return globalMetaCache.GetUserRole(username), nil
}
func ValidateAdminPermission(ctx context.Context) error {
curUser, err := GetCurUserFromContext(ctx)
if err != nil {
return fmt.Errorf("fail to get current user info from the context, err: %w", err)
}
roles, err := GetRole(curUser)
if err != nil {
return fmt.Errorf("fail to get role for the current user info, currtent user:%s, err: %w", curUser, err)
}
for _, role := range roles {
if role == util.RoleAdmin {
return nil
}
}
return fmt.Errorf("the current user doesn't have privileges of the admin role, can't execute this api")
}

View File

@ -714,29 +714,3 @@ func TestGetRole(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, 1, len(roles))
}
func TestValidateAdminPermission(t *testing.T) {
root := "root"
password := "123456"
err := ValidateAdminPermission(context.Background())
assert.NotNil(t, err)
globalMetaCache = nil
err = ValidateAdminPermission(GetContext(context.Background(), fmt.Sprintf("%s%s%s", root, util.CredentialSeperator, password)))
assert.NotNil(t, err)
globalMetaCache = &mockCache{
getUserRoleFunc: func(username string) []string {
if username == "root" {
return []string{"role1", "admin", "role2"}
}
return []string{"role1"}
},
}
err = ValidateAdminPermission(GetContext(context.Background(), fmt.Sprintf("%s%s%s", root, util.CredentialSeperator, password)))
assert.Nil(t, err)
err = ValidateAdminPermission(GetContext(context.Background(), fmt.Sprintf("%s%s%s", "test", util.CredentialSeperator, password)))
assert.NotNil(t, err)
}

View File

@ -1294,12 +1294,15 @@ func (c *Core) initRbac() (initError error) {
commonpb.ObjectPrivilege_PrivilegeDescribeCollection.String(),
commonpb.ObjectPrivilege_PrivilegeShowCollections.String(),
}
collectionPrivileges := []string{
commonpb.ObjectPrivilege_PrivilegeIndexDetail.String(),
}
for _, globalPrivilege := range globalPrivileges {
if initError = c.MetaTable.OperatePrivilege(util.DefaultTenant, &milvuspb.GrantEntity{
Role: &milvuspb.RoleEntity{Name: util.RolePublic},
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Global.String()},
ObjectName: funcutil.GlobalResourceName,
ObjectName: funcutil.AnyObjectName,
Grantor: &milvuspb.GrantorEntity{
User: &milvuspb.UserEntity{Name: util.RoleAdmin},
Privilege: &milvuspb.PrivilegeEntity{Name: globalPrivilege},
@ -1308,6 +1311,19 @@ func (c *Core) initRbac() (initError error) {
return
}
}
for _, collectionPrivilege := range collectionPrivileges {
if initError = c.MetaTable.OperatePrivilege(util.DefaultTenant, &milvuspb.GrantEntity{
Role: &milvuspb.RoleEntity{Name: util.RolePublic},
Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()},
ObjectName: funcutil.AnyObjectName,
Grantor: &milvuspb.GrantorEntity{
User: &milvuspb.UserEntity{Name: util.RoleAdmin},
Privilege: &milvuspb.PrivilegeEntity{Name: collectionPrivilege},
},
}, milvuspb.OperatePrivilegeType_Grant); initError != nil {
return
}
}
return nil
}
@ -3328,7 +3344,7 @@ func (c *Core) isValidGrantor(entity *milvuspb.GrantorEntity, object string) err
if entity.Privilege == nil {
return fmt.Errorf("the privilege entity in the grantor entity is nil")
}
if privilegeName := util.PrivilegeNameForDb(entity.Privilege.Name); privilegeName == "" {
if privilegeName := util.PrivilegeNameForMetastore(entity.Privilege.Name); privilegeName == "" {
return fmt.Errorf("the privilege name in the privilege entity is invalid, current value: %s", entity.Privilege.Name)
}
privileges, ok := util.GetObjectPrivileges()[object]
@ -3377,11 +3393,11 @@ func (c *Core) OperatePrivilege(ctx context.Context, in *milvuspb.OperatePrivile
return failStatus(commonpb.ErrorCode_OperatePrivilegeFailure, err.Error()), err
}
logger.Debug("before PrivilegeNameForDb", zap.String("privilege", in.Entity.Grantor.Privilege.Name))
in.Entity.Grantor.Privilege.Name = util.PrivilegeNameForDb(in.Entity.Grantor.Privilege.Name)
logger.Debug("after PrivilegeNameForDb", zap.String("privilege", in.Entity.Grantor.Privilege.Name))
logger.Debug("before PrivilegeNameForMetastore", zap.String("privilege", in.Entity.Grantor.Privilege.Name))
in.Entity.Grantor.Privilege.Name = util.PrivilegeNameForMetastore(in.Entity.Grantor.Privilege.Name)
logger.Debug("after PrivilegeNameForMetastore", zap.String("privilege", in.Entity.Grantor.Privilege.Name))
if in.Entity.Object.Name == commonpb.ObjectType_Global.String() {
in.Entity.ObjectName = funcutil.GlobalResourceName
in.Entity.ObjectName = funcutil.AnyObjectName
}
if err := c.MetaTable.OperatePrivilege(util.DefaultTenant, in.Entity, in.Type); err != nil {
errMsg := "fail to operate the privilege"

View File

@ -16,7 +16,11 @@
package util
import "github.com/milvus-io/milvus/internal/proto/commonpb"
import (
"strings"
"github.com/milvus-io/milvus/internal/proto/commonpb"
)
// Meta Prefix consts
const (
@ -34,80 +38,10 @@ const (
DefaultTenant = ""
RoleAdmin = "admin"
RolePublic = "public"
PrivilegeWord = "Privilege"
)
// ObjectPrivilegeAPI privilege name for using api
type ObjectPrivilegeAPI int32
func (o ObjectPrivilegeAPI) String() string {
switch o {
case All:
return "All"
case CreateCollection:
return "CreateCollection"
case DropCollection:
return "DropCollection"
case DescribeCollection:
return "DescribeCollection"
case ShowCollections:
return "ShowCollections"
case Load:
return "Load"
case Release:
return "Release"
case Compact:
return "Compact"
case Insert:
return "Insert"
case Delete:
return "Delete"
default:
return ""
}
}
const (
All ObjectPrivilegeAPI = iota
CreateCollection
DropCollection
DescribeCollection
ShowCollections
Load
Release
Compact
Insert
Delete
None = 999
)
func GetObjectPrivilegeFromName(name string) ObjectPrivilegeAPI {
switch name {
case All.String():
return All
case CreateCollection.String():
return CreateCollection
case DropCollection.String():
return DropCollection
case DescribeCollection.String():
return DescribeCollection
case ShowCollections.String():
return ShowCollections
case Load.String():
return Load
case Release.String():
return Release
case Compact.String():
return Compact
case Insert.String():
return Insert
case Delete.String():
return Delete
default:
return None
}
}
// StringSet convert array to map for conveniently check if the array contains an element
func StringSet(strings []string) map[string]struct{} {
stringsMap := make(map[string]struct{})
@ -129,34 +63,60 @@ func StringList(stringMap map[string]struct{}) []string {
func GetObjectPrivileges() map[string][]string {
return map[string][]string{
commonpb.ObjectType_Collection.String(): {
Load.String(),
Release.String(),
Compact.String(),
Insert.String(),
Delete.String(),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoad.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeRelease.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCompaction.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeInsert.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDelete.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeGetStatistics.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCreateIndex.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeIndexDetail.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDropIndex.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeSearch.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeFlush.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeQuery.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoadBalance.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeImport.String()),
},
commonpb.ObjectType_Global.String(): {
All.String(),
CreateCollection.String(),
DropCollection.String(),
DescribeCollection.String(),
ShowCollections.String(),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCreateCollection.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDropCollection.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDescribeCollection.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeShowCollections.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCreateOwnership.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDropOwnership.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeSelectOwnership.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeManageOwnership.String()),
},
commonpb.ObjectType_User.String(): {
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeUpdateUser.String()),
MetaStore2API(commonpb.ObjectPrivilege_PrivilegeSelectUser.String()),
},
}
}
// MetaStore2API convert meta-store's privilege name to api's
// example: PrivilegeAll -> All
func MetaStore2API(name string) string {
return name[strings.Index(name, PrivilegeWord)+len(PrivilegeWord):]
}
func PrivilegeNameForAPI(name string) string {
index, ok := commonpb.ObjectPrivilege_value[name]
_, ok := commonpb.ObjectPrivilege_value[name]
if !ok {
return ""
}
return ObjectPrivilegeAPI(index).String()
return MetaStore2API(name)
}
func PrivilegeNameForDb(name string) string {
o := GetObjectPrivilegeFromName(name)
if o == None {
func PrivilegeNameForMetastore(name string) string {
dbPrivilege := PrivilegeWord + name
_, ok := commonpb.ObjectPrivilege_value[dbPrivilege]
if !ok {
return ""
}
return commonpb.ObjectPrivilege_name[int32(o)]
return dbPrivilege
}

View File

@ -394,9 +394,12 @@ func EncodeUserRoleCache(user string, role string) string {
return fmt.Sprintf("%s/%s", user, role)
}
func DecodeUserRoleCache(cache string) (string, string) {
func DecodeUserRoleCache(cache string) (string, string, error) {
index := strings.LastIndex(cache, "/")
if index == -1 {
return "", "", fmt.Errorf("invalid param, cache: [%s]", cache)
}
user := cache[:index]
role := cache[index+1:]
return user, role
return user, role, nil
}

View File

@ -539,7 +539,11 @@ func TestUserRoleCache(t *testing.T) {
user, role := "foo", "root"
cache := EncodeUserRoleCache(user, role)
assert.Equal(t, fmt.Sprintf("%s/%s", user, role), cache)
u, r := DecodeUserRoleCache(cache)
u, r, err := DecodeUserRoleCache(cache)
assert.Equal(t, user, u)
assert.Equal(t, role, r)
assert.NoError(t, err)
_, _, err = DecodeUserRoleCache("foo")
assert.Error(t, err)
}

View File

@ -13,7 +13,7 @@ import (
)
const (
GlobalResourceName = "*"
AnyObjectName = "*"
)
func GetVersion(m proto.GeneratedMessage) (string, error) {
@ -53,13 +53,42 @@ func GetPrivilegeExtObj(m proto.GeneratedMessage) (commonpb.PrivilegeExt, error)
}, nil
}
func GetResourceName(m proto.GeneratedMessage, index int32) string {
// GetObjectName get object name from the grpc message according to the filed index. The filed is a string.
func GetObjectName(m proto.GeneratedMessage, index int32) string {
if index <= 0 {
return GlobalResourceName
return AnyObjectName
}
msg := proto.MessageReflect(proto.MessageV1(m))
msgDesc := msg.Descriptor()
return msg.Get(msgDesc.Fields().ByNumber(protoreflect.FieldNumber(index))).String()
value := msg.Get(msgDesc.Fields().ByNumber(protoreflect.FieldNumber(index)))
user, ok := value.Interface().(protoreflect.Message)
if ok {
userDesc := user.Descriptor()
value = user.Get(userDesc.Fields().ByNumber(protoreflect.FieldNumber(1)))
if value.String() == "" {
return AnyObjectName
}
}
return value.String()
}
// GetObjectNames get object names from the grpc message according to the filed index. The filed is an array.
func GetObjectNames(m proto.GeneratedMessage, index int32) []string {
if index <= 0 {
return []string{}
}
msg := proto.MessageReflect(proto.MessageV1(m))
msgDesc := msg.Descriptor()
value := msg.Get(msgDesc.Fields().ByNumber(protoreflect.FieldNumber(index)))
names, ok := value.Interface().(protoreflect.List)
if !ok {
return []string{}
}
res := make([]string, names.Len())
for i := 0; i < names.Len(); i++ {
res[i] = names.Get(i).String()
}
return res
}
func PolicyForPrivilege(roleName string, objectType string, objectName string, privilege string) string {

View File

@ -44,12 +44,36 @@ func Test_GetPrivilegeExtObj(t *testing.T) {
}
func Test_GetResourceName(t *testing.T) {
request := &milvuspb.HasCollectionRequest{
DbName: "test",
CollectionName: "col1",
{
request := &milvuspb.HasCollectionRequest{
DbName: "test",
CollectionName: "col1",
}
assert.Equal(t, "*", GetObjectName(request, 0))
assert.Equal(t, "col1", GetObjectName(request, 3))
}
assert.Equal(t, "*", GetResourceName(request, 0))
assert.Equal(t, "col1", GetResourceName(request, 3))
{
request := &milvuspb.SelectUserRequest{
User: &milvuspb.UserEntity{Name: "test"},
}
assert.Equal(t, "test", GetObjectName(request, 2))
request = &milvuspb.SelectUserRequest{}
assert.Equal(t, "*", GetObjectName(request, 2))
}
}
func Test_GetResourceNames(t *testing.T) {
request := &milvuspb.FlushRequest{
DbName: "test",
CollectionNames: []string{"col1", "col2"},
}
assert.Equal(t, 0, len(GetObjectNames(request, 0)))
assert.Equal(t, 0, len(GetObjectNames(request, 2)))
names := GetObjectNames(request, 3)
assert.Equal(t, 2, len(names))
}
func Test_PolicyForPrivilege(t *testing.T) {