hzr
2018-08-09 3346f8aae7f8abbd4b27c4564cbb802e7e717cc9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
h[c@sûdZddlZddlZddlZddlZddlZddlZddlZddlZddl    Z    ddl
Z
ddl Z ddl Z ddl Z ddlZddlZe
jdƒZiaiadZdZd„Zd„Zd„Zd    „Zd
„Zd „Zd „Zd „Zd„Zd„Zd„Z d„Z!d„Z"d„Z#d„Z$d„Z%d„Z&d„Z'd„Z(d„Z)d„Z*d„Z+d„Z,d„Z-d„Z.d„Z/d e0fd!„ƒYZ1d"e0fd#„ƒYZ2dS($sVersion = 2014-10-20 18:00iÿÿÿÿNtBourseUpdataCDiicCs"tjdƒ}tjtj|ƒS(NtBourseDefState(t IpyGameDataPYt
GetFuncCfgtPlayerDBGSEventtGetDBGSTrig_ByKeytDef_BourseState(R((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt GetOpenState/scCstjtj|dkƒdS(Ni(RtSetDBGSTrig_ByKeyR(tvalue((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt SetOpenState3scCs~tjdƒ}|r)||kr)||S|s8i}ntjd|ƒ}|sTiS|jƒ}|||<tjd|ƒ|S(NtBourseQueryTypeDictt MarketQuery(Rt GetConfigExtGetIpyGameDatat GetLimitInfot SetConfigEx(t    queryTypeR tipyDatat    LimitInfo((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytGetBourseQueryTypeDefineDict;s     
cCs'tƒs dStjtƒ||ƒdS(N(Rt    GameWorldt GetPsycoFunct__Func_QueryPlayerBourseItem(tindexttick((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnQueryPlayerBourseItemPs    cCsCtjdƒtjƒ}|j|ƒ}t|ƒtjdƒdS(Ns"Bourse### QueryPlayerBourseItem ins#Bourse### QueryPlayerBourseItem out(RtDebugLogtGetPlayerManagertGetPlayerByIndextSyncPlayerBourseItem(RRt playerManagert    curPlayer((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRZs
 
cCstƒs dS|jƒdS(N(RtSync_PlayerBourseItem(R ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRds    
cCsß|jƒ}tjƒ}|j|ƒ}g}xt|ƒD]}|j||ƒ}|s^q:n|jƒr:|jƒdkr:|jƒ|jƒkr:t    |ƒr¹|j
|j ƒƒq¹q:q:Wx|D]}|j |ƒqÄWdS(Ni( tGetIDRtGetBourseManagertGetPlayerBourseItemCounttxrangetGetPlayerBourseItemByIndext GetIsSoldOuttGetCustomerPlayerIDt GetPlayerIDt__GivePlayerBourseGainstappendt GetItemGUIDt DeleteByGUID(R t curPlayerIDt bourseManagertcurPlayerItemCountt DelItemListtitcurBourseItemDatatitemGUID((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytCheckPlayerEarningsls    cCs.tjƒj|tƒt|ƒt|ƒdS(N(t PyDataManagertGetBourseRecordManagertSyncBourseRecordtTrueR5R(R ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt OnPlayerLogin€s
 
cCs'tƒs dStjtƒ||ƒdS(N(RRRt__Func_QueryBourseItemOnSale(RR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnQueryBourseItemOnSaleŒs    cCsdS(N((RR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR;–scCsétjƒj|ƒ}|j}|j}|j}|s<|r^tjƒ}|jƒ}g}    x•t|dddƒD]}}
|j    |
ƒ} t
| ƒr˜qqn|rÃ|| j ƒkrÃ|    j | ƒqqn|rq|| j ƒkrq|    j | ƒqqqqqqWt|    ƒ} |j|d| | ƒx|    D]} |j| ƒqW|jƒ|rØtjƒj||ƒqØnzt||ƒ}t|ƒ}tjd||fƒ|j|d||ƒx%t|ƒD]}
|j||
ƒq³W|jƒtjdƒdS(Niiÿÿÿÿis?Bourse### QueryBourseItemOnSale queryTypeCount=%s, queryType=%ss#Bourse### QueryBourseItemOnSale out(RRRt    QueryTypetItemNametItemIDR#tCountR%tAttCheckBourseItemDataSaleStatet GetItemNameR+t GetItemTypeIDtlentBegin_AddBourseItemOnSaletAdd_BourseItemOnSaletSync_BourseItemOnSaleR6tGetBourseItemLastPriceManagertSyncBourseItemPricet GetTypeListR(Rt
clientDataRR RtitemNametitemIDR/tbourseItemCounttbourseItemDataListR2R3t
queryCounttbourseItemDatat queryTypeListtqueryTypeCount((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnPYQueryBourseItemOnSale¢sD                  
 
 
 cCsmtj|dƒ}tj|dƒ}|dks@||tkr]t|ƒ|}|t|<ntj|gƒS(Ni(tg_lastSortTimeForQueryTypeDicttgettg_dict_Of_QueryTypeIndexListtNonetDef_Sort_IndexList_Intervalt SortIndexList(RRt lastSortTickRS((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRKÓs
 cCsg}tjƒ}|jƒ}x^t|dddƒD]F}|j|ƒ}t|ƒr\q5nt||ƒr5|j|ƒq5q5W|t|<dS(Niiÿÿÿÿ(    RR#R@R%RARBtCheckQueryTypeItemR+RX(RtcurQueryTypeListR/RORR3((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR[äs   
c
CsPt|ƒ}|ikrtS|jdgƒ}|rM|jƒ|krMtSn|jdgƒ}|r~|jƒ|kr~tSn|jdgƒ}|r¯|jƒ|kr¯tSn|jdgƒ}|rê|jƒd}||krêtSn|jdgƒ}|r|jƒ|krtSn|jdgƒ}    |    rL|jƒ|    krLtSnt    S(Nt SpecialItemIDtItemTypet
EquipPlacetJobidt
LimitUseLVt ItemQuality(
RtFalseRWRDtGetTypet GetEquipPlacet GetJobLimittGetUseLVtGetItemQualityR9(
R3Rt curDefineDicttSpecialItemIDListt ItemTypeListtEquipPlaceListtJobListtJobLimitRcRd((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR]ùs:   cCs|jƒrtStS(N(R'R9Re(R3((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRB+s cCs^tjjƒ}tj|ƒ}|dks6|dkr:dS||}|jdd|jdS(Niii<(tdatetimettodayRtGetDateTimeByStrRYtdaystseconds(tcompareTimeStrt curDataTimetcompareDataTimet pastTimeDelta((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt GetPastMinute6s 
c    Cstjd|jƒtƒs!dStjd|j|j|j|j|jfƒ|j}tjƒ}|j    |ƒ}tjd|ƒt
j dƒ}t j ƒ}||_|j|_|j|_|j|_|j|_|j|_||k|_tj|||ƒtjd|jƒdS(Ns3Bourse### MGCheckAddPlayerBourseItem in,PlayerID %ssaBourse### MGCheckAddPlayerBourseItem PlayerID=%s ItemIndex=%s Count=%s PriceType=%s PriceCount=%ss1Bourse### MGCheckAddPlayerBourseItem now count %stBourseSaleLimits2Bourse### MGCheckAddPlayerBourseItem out Result %s(RRtPlayerIDRt    ItemIndexR@t    PriceTypet
PriceCountR#R$RRtChGameToMapPyPackt#tagGMCheckAddPlayerBourseItemResulttPwdtResultt NetPackCommontSendPyPackToMapServer(    t
routeIndextmapIDt curPackDataRR.R/tcounttBourseCountLimittsendPack((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGCheckAddPlayerBourseItemLs*                    c    CsÓtjdƒtƒsdStjd|jƒ|j}tjƒ}tjƒ}|j|_|j|_    |j
|_
|j ||j |ƒ}|j |jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j|jƒ|j |j!j"ƒƒ|j#|j$j"ƒƒ|j%|j&ƒ|j'|j(ƒ|j)tj*ƒƒtj+ƒj,|ƒ}|r²t-|ƒnt.j/||ƒtjdƒdS(Ns&Bourse### MGAddPlayerSellBourseItem ins/Bourse### MGAddPlayerSellBourseItem PlayerID %ss'Bourse### MGAddPlayerSellBourseItem out(0RRRR|R#tIPY_GameServertIpyBourseRoleItemR@t
ItemTypeIDR?tUserDatatAddItemt
PlayerNamet SetPriceTypeR~t SetPriceCountRtSetTypetTypet SetEquipPlaceRatSetLVtLVtSetUseLVtUseLVt SetJobLimitRptSetItemQualityRdt SetItemColort    ItemColort SetItemTypeIDt SetItemNameR>tstriptSetPwdR‚t
SetEquipGStEquipGStSetOperateInfot OperateInfot SetOnSaleTimetGetCurrentDataTimeStrRtFindPlayerByIDRtDataRecordPacktDR_BourseAddItem(    R†R‡RˆRR.R/tcurBourseRoleItemt curBourseItemR ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGAddPlayerSellBourseItemhs@                cCstjd|jƒtƒs!dStjƒ}|j|jƒ}|sŽtjƒj|jƒ}|rvt    j
|dƒntjd|jƒdS|j ƒ|jkr»tjd|jƒdS|j ƒrtjƒj|jƒ}|røt    j
|dƒntjd|jƒdS|j ƒjƒ|jjƒkrŒtjƒj|jƒ}|rbt    j
|dƒntjd|j|j ƒ|jfƒdStjƒ}|j|_|j|_|jƒ|_|jƒ|_|jƒ|_tj|||ƒtjdƒdS(    Ns.Bourse### MGCheckBuyBourseItem in, PlayerID %stGeRen_liubo_403656s3Bourse### MGCheckBuyBourseItem ItemGUID %s No Founds6Bourse### MGCheckBuyBourseItem ItemGUID %s is SelfItems5Bourse### MGCheckBuyBourseItem ItemGUID %s is SoldOuttBoursePasswordErrorsBBourse### MGCheckBuyBourseItem ItemGUID %s  pwd is error! %s != %ss"Bourse### MGCheckBuyBourseItem out(RRR|RR#t
FindByGUIDtItemGUIDRRªt PlayerControlt
NotifyCodeR)R'tGetPwdR¢R‚R€ttagGMCheckBuyBourseItemResultt GetPriceTypeR~t GetPriceCountRRCR>R„R…(R†R‡RˆRR/R®R R‹((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGCheckBuyBourseItem—sF      !&    cCs•tjd|jƒtƒs!dS|j}tjƒ}|j|jƒ}|sitjd|j|ƒdSt|ƒrtjd|j|ƒdSt    ||ƒ}t
j |||ƒ|j t ƒ|j|ƒ|j|jƒttjƒƒ}|jt|ƒƒtjƒj|ƒ}    |    rL|    jddddƒ|    j|ƒ|    jƒn|jƒd|jƒj}
|
dkr{dn    t|
ƒ}
tjƒj|j ƒ|
ƒtj!ƒ} |jƒ} i| j"d    6| j#d
6|j$ƒd 6| jd 6} | j%|t&|| d|jƒƒ|j'ƒ}t(j)||j'ƒ|ƒt*|ƒrU|j+|j,ƒƒntjƒj|ƒ}|r}t-|ƒntjd |jƒdS(Ns-Bourse### MGBuyBourseItemSure in, PlayerID %ssSÍæ¼ÒÈ·ÈϹºÂò½»Ò×ËùÎïÆ· ÒѸ¶Ç®£¡£¬Bourse### MGBuyBourseItemSure ItemGUID %s No FoundsHÍæ¼ÒÈ·ÈϹºÂò½»Ò×ËùÎïÆ· Bourse### MGBuyBourseItemSure ItemGUID %s SoldOutiÿiigð?iÂë RNtuserDatatequipGSR‰s-Bourse### MGBuyBourseItemSure out ItemGUID %s(.RRR|RR#R²R³tLogRBtGetGMGiveBourseItemPackR„R…t SetIsSoldOutR9tSetCustomerPlayerIDtSetCustomerPlayerNameR’tintttimetSetSoldOutTimetstrRRªRFRGRHR¹tGetBourseRoleItemR@R6RItUpdateBourseItemPriceRDR7R?Rt
GetEquipGStAddBourseRecordtDef_Bourse_BuyR)R«tDR_BourseBuyItemR*R-R,R(R†R‡RˆRR.R/R®R‹t soldOutTimeR t    unitPricetbourseRecordMgrtcurRoleItemDatatitemInfot sellPlayerIDt curSellPlayer((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGBuyBourseItemSureÈsP                1"   c
Csâ|jƒ}tjƒj|ƒ}|s+dS|jƒ}i|jd6|jd6|jƒd6|jd6}|j    ƒ}|j
ƒ}|j ƒ}tj |j ƒdƒ}t|||||gƒ}    |jddd|    t|    ƒƒtS(NRNR»R¼R‰itGivePlayerBourseGains(R)RRRªRÆR?RRÈR@R¹R¸RCtToIntDeftGetSoldOutTimeRÅtMapServer_QueryPlayerResultRER9(
R®R.RÒRÏRÐt
priceCountt    priceTypeRMRÌtresult((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR*s  1   cCs`|\}}}}tjƒ}|j|jƒt||||ƒtj|jƒ|||ƒdS(N(R6R7RÉR"tDef_Bourse_SellR«tDR_BourseGiveGains(R t
resultInfoRÌttaxMoneyt    giveMoneyRÐRÎ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnGivePlayerBourseGainsResults
 "c    CsŸtjd|j|jfƒtƒs*dS|j}tjƒ}|j|jƒ}|sotjd|jƒdS|jƒ|krŸtjd|j|fƒdS|jƒrì|j    ƒdkrì|j    ƒ|jƒkrìtjd|jƒnj|j
dkrtjd|ƒdSt ||ƒ}t j |||ƒtj||ƒtjd|jƒ|j|jƒtjƒj|ƒ}|rŽt|ƒntjdƒdS(    Ns@Bourse### MGPlayerRecaptureBourseItem in PlayerID %s ItemGUID %ss:Bourse### MGPlayerRecaptureBourseItem ItemGUID %s No FoundsIBourse### MGPlayerRecaptureBourseItem ItemGUID %s not belong to Player %sisGBourse### MGPlayerRecaptureBourseItem ItemGUID %s GivePlayerBourseGainss>Bourse### MGPlayerRecaptureBourseItem PlayerID %s noSpaceCounts@Bourse### MGPlayerRecaptureBourseItem ItemGUID %s GiveBourseItems)Bourse### MGPlayerRecaptureBourseItem out(RRR|R³RR#R²R)R'R(tPackSpaceCountR¾R„R…R«tDR_BourseCancelItemR-RRªR(    R†R‡RˆRR.R/R®R‹R ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOnMGPlayerRecaptureBourseItem!s8         
  cCs¾tjƒ}||_|jƒ|_|jƒ|_|jƒ|_||j    ƒkrid|_d|_n|j
ƒ}|j |_ |j |_ |j |_ t|j ƒ|_|jƒ|_|S(Ni(R€ttagGMGiveBourseItemR|R,R³R¸R~R¹RR)RÆR?R@RREt UserDataLenRÈR¥(R.R®R‹RÏ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR¾Ws              cCs´tjddƒ}i}tjƒ}|jƒ}xt|dddƒD]}|j|ƒ}t|ƒrnqGnt|j    ƒƒ}||kr’qGn|j
ƒ}|j ƒ}g}    i}
|j ƒ|
d<|j|
d<|j |
d<|    j|
ƒ|jƒ} ||kr||j| ƒn | g||<tj|| |ƒt|| |    ƒqGWx`|jƒD]R\}} x| D]} |j| ƒqmWtjƒj|ƒ}|rZt|ƒqZqZWdS(NR{iiiÿÿÿÿR?R@R(RRRR#R@R%RARBRzt GetOnSaleTimeR)RÆRDRR+R,R«tDR_BourseDeleteOverTimeLongItemtSendOverTimeItemMailtitemsR-RRªR(tBourseSaleTimeMinutet DelItemDictR/RORR3t
pastMinuteRÑtbourseRoleItemt addItemListt curItemDicttGUIDt itemGUIDListR4RÒ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytOverTimeItemsDealms@             cCs)ddl}|jd|g|gƒdS(Niÿÿÿÿt BourseTimeOut(tPlayerCompensationt SendMailByKey(RÑRðRîRô((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRè¤s tBourseRecordManagercBsGeZejdƒZd„Zd„Zed„Zd„Z    d„Z
RS(tBourseMaxRecordcCs i|_dS(N(t BourseRecord(tself((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt__init__±s    c Cs|js dS|jj|gƒ}t|ƒ|jkrA|d=ntj|dtƒ}tjƒ}    |    j    ƒ||    _
||    _ ||    _ ||    _ ||    _||    _t|    jƒ|    _|j|    ƒ||j|<tjd|||f|ƒtjƒj|ƒ}
|
r|j|
ƒntS(Nit ensure_asciis4AddBourseRecord playerID=%s,tradeType=%s,userData=%s(t    maxRecordRøRWREtjsontdumpsRetPyGameDataStructttagDBPyBourseRecordtclearR|R–t    TimestamptTradeTaxt
TradeMoneyRRåR+RRRRªR8R9( RùtplayerIDt    tradeTypeRÌRÐRÞRßt
recordListR»trecordR ((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRɵs.    
 
                              c    Cs|jƒ}|jj|gƒ}|r-|n
|dg}|sDdStjƒ}|jƒg|_x‚|D]z}tjƒ}|jƒ|j|_|j    |_    |j
|_
|j |_ |j |_ t|j ƒ|_|jj|ƒqjWt|jƒ|_tj||ƒdS(s(
        @param isAll: ÊÇ·ñÈ«²¿
        iÿÿÿÿN(R)RøRWtChPyNetSendPackttagGCBourseRecordInfotCleart
RecordListttagGCBourseRecordR–RRRRtItemDataREt ItemDataLenR+R@R„t SendFakePack(    RùR tisAllRRtsyncListt
recordInfot
syncRecordR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR8Ös*  
      
     cCs|d}d}d}xB|jjƒD]1}x(|D] }|d7}||jƒ7}q/Wq"Wtjd|ƒtj||ƒ|S(NtiisSaveBourseRecord cnt :%s(Røtvaluest    getBufferRR½tCommFunct
WriteDWORD(RùtsavaDatatcntDatatcntRR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt GetSaveDataòs 
c    Cs´tj||ƒ\}}tjd|ƒi|_x{t|ƒD]m}tjƒ}|jƒ||j    |||ƒ7}|j
}|jj |gƒ}|j |ƒ||j|<q?W|S(NsLoadBourseRecord cnt :%s( Rt    ReadDWORDRR½RøR%RÿRRtreadDataR|RWR+(    RùtdatastpostdataslenRt_RRR((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pytLoadPyGameDataÿs     
     ( t__name__t
__module__RRRüRúRÉReR8RR$(((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRö­s         !      tBourseItemLastPriceManagercBs5eZd„Zd„Zd„Zd„Zd„ZRS(cCs i|_dS(N(tItemLastPriceDict(Rù((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRús    cCsPtjƒ}|jƒ||_||_||j|<tjd||fƒdS(Ns-¸üн»Ò×ËùÎïÆ·×îгɽ»µ¥¼Û itemid=%s,price=%s(RÿttagDBPyBourseItemLastPriceRR?t    LastPriceR(RR(Rùtitemidtpricet itemLastPrice((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRÇs 
         cCsa|jj|dƒ}|sdStjƒ}|jƒ|j|_|j|_t    j
||ƒdS(N( R(RWRYR    ttagGCBourseItemPriceR R?R*tPriceR„R(RùR RNt    priceDatat    priceInfo((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyRJ#s 
  cCskd}d}d}x1|jjƒD] }|d7}||jƒ7}q"Wtjd|ƒtj||ƒ|S(NRiisSaveBourseItemLastPrice cnt :%s(R(RRRR½RR(RùRRRR-((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR0s
cCs’tj||ƒ\}}tjd|ƒi|_xYt|ƒD]K}tjƒ}|jƒ||j    |||ƒ7}|j
}||j|<q?W|S(NsLoadBourseItemLastPrice cnt :%s( RRRR½R(R%RÿR)RRR?(RùR R!R"RR#tdataR+((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR$<s     
    (R%R&RúRÇRJRR$(((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyR's
                   (3t__doc__RRR€R„RqRRR´R«RRÿR6R    RÃRýRRZRVRXRÊRÛRR
RRRRR5R:R<R;RURKR[R]RBRzRŒR¯RºRÓR*RàRãR¾RòRètobjectRöR'(((sG.\ServerPython\CoreServerGroup\GameServer\Script\Player\PlayerBourse.pyt<module>s`                               
    
                 
         1            2                 /    1    8             6        7        e