FCH (検索/変更)
- 目的
- FCH 関数では、次のことができます。
- PDS、VSAM データ・セット、順次データ・セット、 MQ キュー、または CICS® リソース中のストリングを検索し、オプションで変更します。
- HFS ファイル内のストリングを検索します。
- 使用上の注意
- 次のものを使用して、処理するレコードを選択できます。
- メンバー名の選択基準
- 作成日の選択基準
- 最終変更日の選択基準
- ユーザー ID の選択基準
REXX プロシージャーに proc パラメーターを使用して指定するか、コマンド行で FIND または CHANGE コマンドを入力することができます。基本コマンドについては、複数の PDS メンバーでのデータの検索と変更を参照してください。LOCATE 基本コマンドは、バッチ・ジョブでは無視されます。圧縮非 VSAM 拡張形式データ・セット (圧縮 PSE データ・セット) を処理する場合、任意の CHANGE コマンドが MEMORY=YES が指定されているかのように実行されます。
複数コマンド処理
ファイルの 1 回のパスで処理できる FIND または CHANGE コマンドの数に制限はありませんが、それぞれの FIND または CHANGE コマンドを新しい行で開始する必要があります。
C cat dog
およびC catapult crossbow
などの重複変更コマンドを使用する場合には、注意してください。ストリングが一致するのは、一致する検索引数を持つ最初のコマンドに対してだけです。したがって、より長い変更を最初に置く必要があります。例えば、以下の変更コマンドを指定した場合には:C Cat Dog C Catapult Crossbow
2 番目のコマンドが処理されることはありません。コマンドの順序を逆にすると、「Catapult」のどのオカレンスも 確実に変更されます。
変更が行われた後、FCH の処理は、同じデータ・レコードに対して続行されます。処理が再開されるのは、最近変更されたストリングの直後の位置からになります。その結果、変更は再帰的ではなく、別個に実行しない限り、「
C cat cow
」および「C cow dog
」によって「cat」が「dog」に変更されることはありません。さらに、検索引数が検索されても、変更が失敗した場合には、そのストリングに一致する後続の FIND または CHANGE コマンドは実行されません。可変長レコードを含むデータ・セット
CHANGE コマンドによって可変長レコードの長さが増加する場合、MEMORY=YES が指定されていない限り変更は処理されず、変更はデータ・セットの最大可変長レコード長を超えません。
- パフォーマンス上のヒント
- FCH を使用して PDS(E) のメンバーを更新する場合、次の点を検討してください。
1 つの FCH のデフォルトは STATS=ON です。これにより、変更される各メンバーの ISPF 統計が更新されます。この処理により、I/O (EXCP) および CPU の使用率は著しく増えます。パフォーマンスを向上させるには、STATS=OFF の使用を検討してください。
- JCL 処理 (JCL=YES) の使用は、JCL=NO より CPU 集中型です。JCL=YES は、必要な場合にのみ使用してください。
- ユーザー PROC がある場合、PROC が更新を実行していないときに NOUPDATE=YES オプションを使用することによって、他のユーザーまたはジョブによるターゲット・データ・セットへの並行読み取りアクセスを改善できます。
- FCH を使用して PDS(E) のメンバーを更新する場合、次の点を検討してください。
- オプション
- PROC オプションを指定するときに、REXX プロシージャーを設定することになります。詳しくは、下記の proc パラメーターを参照してください。
- 戻りコード
- FCH 機能からのデフォルトの戻りコードには、変更された以下の意味があります。
- 1
- 1 つ以上の FIND または CHANGE コマンドが正常に実行されましたが、1 つ以上の FIND または CHANGE コマンドが、ストリングが見つからなかったために正常には実行されませんでした。
- 2
- 1 つ以上のストリングが見つかりましたが、1 つ以上の CHANGE コマンドを実行できませんでした (使用可能なスペースがなかったか、またはキー変更が無効でした)。
- 4
- ストリングが見つからなかったため (一致がなかったため)、FIND または CHANGE コマンドは正常に実行されませんでした。
- 4
- 処理するメンバーが存在しなかったため、FIND または CHANGE コマンドは正常に実行されませんでした。
- 4
- 入力が空であったため、FIND または CHANGE コマンドは正常に実行されませんでした。
- 8
- 不正な FIND/CHANGE コマンドが指定されました。
- 8
- 指定された FIND/CHANGE コマンドが多すぎます。
- 8
- REXX エラーが発生しました。
- 8
- ジョブ・ステップの中断/取り消しが行われました。
- 16
- プログラム・オブジェクトが (指定されましたが) サポートされていません。
- 16
- データ・セットが使用中です。
- 16
- メンバーが使用中です。
- 16
- データ・セット/メンバーのオープン・エラー。
- 16
- データ・セットが見つかりません/割り振りエラー。
- 16
- ストレージ不足です。
- 16
- 入力データは ISPF パック形式のように見えますが、無効です。
- 16
- FCH が異常終了しました。
- 16
- 処理を停止するその他の重大なエラー (入出力エラーなど) が発生しました。
注: インストール時に、戻りコードをカスタマイズすることができます。上に示したもの以外の戻りコードを受け取った場合には、ご使用のサイトでこの機能用に戻りコードをカスタマイズしている可能性があります。バッチの戻りコードが ABENDCC 値以上であると、File Manager が 999 異常終了を発行する場合もあります。詳しくは、File Manager システム管理者にお問い合わせください。 - 関連機能
- DSEB
- データ・セットをバッチ・ジョブ処理で編集します。
- TRS
- テープ・ファイル内のデータを見つけます。
- INPUT=ddname
- 入力データ・セットまたは HFS ファイルの DD または TSO ALLOC ステートメントに対する参照を定義します。デフォルトは
DDIN
です。 - DSNIN=dsname
- 入力データ・セットの名前または HFS ファイル (ディレクトリー) への絶対パスを定義します。DD ステートメントが指定されている場合は、使用されません。名前に、小括弧で囲んだメンバー名を含めることができます。ここでメンバーを指定する場合は、関連する Member パラメーターを空にする必要があります。このデータ・セットは、以下のようにさらに詳細に記述できます。
- VOLSERIN=volser
- 非カタログ・データ・セットのボリューム通し番号。
HFS ファイル (ディレクトリー) の絶対パスは、アポストロフィで囲む必要があります。1 行に収まらない場合は、複数行に分割できます。
- rt:applid:rname
- データ・セット名の代わりに CICS® リソースを指定できます。パラメーターの意味は、以下のとおりです。
- rt
- リソース・タイプ。有効な値は、以下のとおりです。
- FI
- CICS® ファイル。
- TD
- 一時データ・キュー用。
- TS
- 一時ストレージ・キュー用。
- applid
- VTAM® システムの CICS® applid。
- rname
- リソースの名前。
- MEMBER=member1
- PDS の中の単一メンバーの名前、または PDS の中の 1 つ以上のメンバーを表すメンバー名のパターン。入力データ・セットが PDS(E) の場合、このパラメーターを指定するか、ddname の DD ステートメントにメンバー名を指定するか、MEMSTART キーワードおよび MEMEND キーワードを使用してメンバー名の範囲を指定する必要があります。
メンバー名パターンは、メンバー名に有効な任意の文字と 2 つの特殊パターン文字 (アスタリスク (*) およびパーセント記号 (%)) から構成することができます。
- *
- 任意の数の文字を表します。必要な数のアスタリスクを、メンバー名パターンの任意の場所に使用することができます。例えば、
*d*
というメンバー名パターンを入力すると、PDS の中で、名前に「d」が含まれているすべてのメンバーが処理されます。 - %
- 単一文字を表すプレースホルダー文字。パーセント記号は、メンバー名パターンの任意の場所に必要な数だけ指定できます。例えば、メンバー名パターンとして
%%%%
を入力すれば、名前の長さが 4 文字である、PDS 内のすべてのメンバーが処理されます。
データ・セットが PDS でない場合、member1 は無視されます。
- MEMSTART=startstring
- コピーに含めるメンバー名の範囲の始まりを指定するのに使用されます。MEMSTART が指定されたが MEMEND は省略された場合、PDS(E) 内の startstring 値以降の全メンバーが組み込まれます。startstring では、MEMBER キーワードの member1 パラメーターに関して、ワイルドカードを含め、同じ値を持つことができます。
- MEMEND=endstring
- コピーに含めるメンバー名の範囲の終わりを指定するのに使用されます。MEMEND が指定されたが MEMSTART は省略された場合、PDS(E) 内の endstring 値までの全メンバーが組み込まれます。endstring では、MEMBER キーワードの member1 パラメーターに関して、ワイルドカードを含め、同じ値を持つことができます。
- MEMLIST
- メンバー名のリストを指定できます。
- member_n
- 処理されるメンバーの名前を形式 (member1,member2,...member_n) で指定します。総称名マスクは使用できます。例えば、メンバー名は次のように指定できます。
(MEMLIST=ABC,DEF,HIJ*)
。
- XMEMBERS
- MEMSTART、MEMEND、MEMBER、および MEMLIST オプションを使用して、処理するライブラリー・メンバーから除外し、それ以外が選択される方法を提供します。
- xmem_filter
- 処理から除外する 1 つ以上のメンバーを識別するメンバー名フィルター。フィルターには、複数のメンバーを表すメンバー名パターンを指定できます。
小文字を含むメンバー名フィルターを指定するには、
c'string'
形式で文字ストリングを使用します。フィルター値は、x'hex-digits'
形式で 16 進ストリングとして指定することもできます。
- CREATED=created
- メンバーが作成された日付 (YYYY/MM/DD 形式)。
入力データ・セットが PDS(E) の場合、このパラメーターを指定するか、CRESTART キーワードおよび CREEND キーワードを使用して作成日の範囲を指定する必要があります。
日付の範囲を示すために最終文字としてアスタリスク (*) を指定したり、日付の選択を示すために単一文字の代わりに % 記号を指定することができます。
データ・セットが PDS でない場合、created は無視されます。
- CRESTART=crestart
- コピーに含める作成日の範囲の始まり (YYYY/MM/DD 形式)。
CRESTART は指定されているが CREEND が省略されている場合、crestart 値から先の PDS(E) のすべてのメンバーが含まれます。
省略するか、完全な日付を入力しないか、最後の文字としてアスタリスク (*) を指定すると、crestart の指定されていない部分はデフォルトで右側に寄せられて次のようになります。- DD
- = 01
- MM
- = 01
- YYYY
- = 0000
- CREEND=creend
- コピーに含める作成日の範囲の終わり (YYYY/MM/DD 形式)。省略するか、完全な日付を入力しないか、最後の文字としてアスタリスク (*) を指定すると、creend の指定されていない部分はデフォルトで右側に寄せられて次のようになります。
- DD
- = 31
- MM
- = 12
- YYYY
- = 9999
- CHANGED=changed
- メンバーが最後に変更された日付 (YYYY/MM/DD 形式)。
入力データ・セットが PDS(E) の場合、このパラメーターを指定するか、CHGSTART キーワードおよび CHGEND キーワードを使用して変更日の範囲を指定できます。
日付の範囲を示すために最終文字としてアスタリスク (*) を指定したり、日付の選択を示すために単一文字の代わりに % 記号を指定することができます。
データ・セットが PDS でない場合、changed は無視されます。
- CHGSTART=chgstart
- コピーに含める変更日の範囲の始まり (YYYY/MM/DD 形式)。
CHGSTART は指定されているが CHGEND が省略 されている場合、chgstart 値から先の PDS(E) のすべてのメンバーが含まれます。
省略するか、完全な日付を入力しないか、最後の文字としてアスタリスク (*) を指定すると、chgstart の指定されていない部分はデフォルトで右側に寄せられて次のようになります。- DD
- = 01
- MM
- = 01
- YYYY
- = 0000
- CHGEND=chgend
- コピーに含める変更日の範囲の終わり (YYYY/MM/DD 形式)。省略するか、完全な日付を入力しないか、最後の文字としてアスタリスク (*) を指定すると、chgend の指定されていない部分はデフォルトで右側に寄せられて次のようになります。
- DD
- = 31
- MM
- = 12
- YYYY
- = 9999
- USERID=userid
- メンバーを最後に更新した TSO ユーザー ID。
入力データ・セットが PDS(E) の場合、このパラメーターを指定するか、UIDSTART キーワードおよび UIDEND キーワードを使用してユーザー ID の範囲を指定する必要があります。
アスタリスクおよび % 記号を使用して総称ユーザー ID を入力できます。
データ・セットが PDS でない場合、userid は無視されます。
- UIDSTART=uidstart
- コピーに含めるユーザー ID の範囲の始まり。
UIDSTART は指定されているが UIDEND が省略されている場合、uidstart 値から先の PDS(E) のすべてのメンバーが含まれます。
省略するか、完全な 7 文字のユーザー ID を入力しないか、最後の文字としてアスタリスク (*) を指定すると、File Manager はアスタリスクを置き換えて、uidstart の指定されていない部分を右側に寄せて低い値 (X'00') を埋め込みます。
- UIDEND=uidend
- コピーに含めるユーザー ID の範囲の終わり。
このフィールドを省略すると、デフォルトで高い値 (X'FF') になります。
7 文字未満を指定すると (最後の文字としてアスタリスクを指定せずに)、File Manager は uidstart を右側に寄せて低い値 (X'00') を埋め込みます。最後の文字としてアスタリスク (*) を指定すると、File Manager はアスタリスクを置き換えて、uidend の指定されていない部分に高い値 (X'FF') を埋め込みます。
- NLRECS=num
- 各データ・セットまたはメンバー内で、処理されるレコードの数を指定します。
- BINRECIN=record-length
- HFS ファイルの処理に使用されるレコード長を指定します。有効範囲: 1 から 32760。ファイルはバイナリー・モードで処理されます (ファイルから導出された固定長レコードで、区切り文字は区別されません)。このパラメーターを指定しないと、ファイルはテキスト・モードで処理されます (可変長レコードで、境界は区切り文字により判別されます)。
- USEIOXIN
- 入力データ・セットを処理するために、ユーザー I/O 出口を呼び出すかどうかを指定します。
- NO
- デフォルトです。ユーザー I/O 出口を呼び出しません。
- YES
- 入力データ・セットを処理するために、ユーザー I/O 出口を呼び出します。このオプションは、File Manager 用にサイトのカスタマイズを行ったユーザーが、そのサイト・ベースでユーザー I/O 出口を許可した場合にのみ使用できます。
- IOXIN
- 入力データ・セットに使用するユーザー I/O 出口の名前を指定します。出口を記述するために使用できるプログラミング言語に制限はありません。STEPLIB/ISPLLIB 連結またはその拡張機能 (LINKLIST、LPA など) で、File Manager に出口を指定する必要があります。
- sysexit
- デフォルトです。USEIOXIN=YES を指定し、ユーザー I/O 出口名を指定しない場合、File Manager はインストール時のカスタマイズ・オプションで提供される出口の名前を使用します。USEIOXIN が YES に設定され、インストール・デフォルトが指定されていない場合は、IOXIN=ioxname を指定する必要があります。注: オンライン・パネルでバッチ処理を選択した場合、生成される JCL ステートメントは「Set System Processing Options (システム処理オプションの設定)」パネルで提供されているデフォルト名を使用します。
- ioxname
- STEPLIB 連結で File Manager に提供されたデータ・セットの PDS(E) メンバーの名前。
- JCL=NO
- データ・セットを非 JCL データ・セットとして処理します。
- JCL=YES
- データ・セットには JCL が含まれ、JCL 構文は保存されます。
検索される桁数は 3 から 71 に設定されます (ステートメントが JCL ステートメントでない場合を除く)。ステートメントは、先頭に「/*」または「//」ストリングが示されている場合は JCL ステートメントとみなされます。ステートメントの先頭にどちらのストリングも示されていない場合は JCL ステートメントとみなされず、その場合は FIND (または CHANGE) コマンドで指定された、あるいは BOUNDS コマンドを使用して事前設定された任意の桁範囲が使用できます。桁範囲が指定されていない場合は、全レコードが検索されます。
レコードの数とサイズの保守が正常に行われていない場合、File Manager はファイルの再書き込みを試行します。- この場合、他のエラーも考えられます。例えば、PDS(E) が容量を使い尽くした可能性があります。
- 論理行が変更され、より多くの物理レコードを要する場合、ファイルは再書き込みされます。新規物理レコードのデータ (桁 73 からレコード長まで) は、関連した直前のオリジナル物理レコードからコピーされます。72 桁を超える部分のデータは、変更できないシーケンス番号またはコメントとして扱われます。
- PROC=proc
- 各レコードを処理するために使用したい REXX プロシージャーのメンバー名、またはプロシージャーがインラインであることを示すアスタリスク (*)。メンバー名を指定する場合は、そのメンバーを含んでいる PDS を識別する FMNEXEC DD 名を定義する必要があります。* を指定した場合は、プロシージャーは、現行機能の制御ステートメントの直後に続く SYSIN から読み取られます。インライン・プロシージャーは、1 から 2 桁目にスラッシュと正符号 (/+) が入っているレコードによって終了されます。
レコードが FCH 報告書に表示されるかどうかは、そのレコードに対する REXX プロシージャーからの戻りコードによって決まります。(PROC ステートメントが指定されていない場合は、$$FILEM 制御ステートメントの終わりで想定されます。)REXX プロシージャーが RETURN DROP ステートメントによって終了する場合、 現行レコードは「選択されていない」(検索したかったレコードではない) と見なされ、FCH 報告書には表示されません。REXX プロシージャーが正常に終了する場合、 または明示的な RETURN (DROP キーワードなし) によって終了する場合、現行レコードは、「選択されている」と見なされ、FCH 報告書に含められます。REXX プロシージャーによって変更されることなく選択されたレコードは、FCH 報告書の中で、レコード番号に接尾部「s」を付けてマークされます。一方、変更されて選択されたレコードは、「c」を付けてマークされます。
FCH のための REXX プロシージャーで、選択したいレコードを識別するときには、RETURN ステートメントを明示的にコーディングしてください。他のレコードが選択されないことを確実にするために、REXX プロシージャーの最後の行に、RETURN DROP ステートメントをコーディングします。
REXX プロシージャーを使用したレコード処理について詳しくは、File Manager 処理の拡張を参照してください。
- NOUPDATE
- ユーティリティーの実行時に FCH データ・セットの更新を行わないように指定できます。このオプションは、REXX プロシージャーを指定したときにのみ有効で、それ以外の場合は無視されます。
- NO
- データの更新が行われます。
- YES
- データ・セットを入力専用として強制的に割り振ります。データの更新はすべて無視されます。
- LIST=LONG
- デフォルトです。これは、ストリングが検出された各レコードだけでなく、要約報告書も印刷します。
- LIST=SUMMARY
- これは要約報告書のみを印刷します。
- DBCS=YES
- (LANGUAGE=JAPANESE の場合のデフォルト)。これは、データ・レコード内の DBCS シフトインおよびシフトアウト文字を処理して、保存します。
- DBCS=NO
- (LANGUAGE=ENGLISH の場合のデフォルト)。これは、データ・レコード内の DBCS シフトインおよびシフトアウト文字を無視します。
- STATS=ON
- デフォルトです。これは、PDS または PDSE メンバーを変更した場合、ISPF 統計 (既に存在している場合) を更新します。
- STATS=OFF
- PDS または PDSE メンバーを変更した場合、ISPF 統計は更新されません。
- STATS=FORCE
- 処理中のメンバーについての既存の ISPF 統計は常に更新され、これまで統計がなかったメンバーの統計は作成されます。
- EXCLUSIVE=NO
- 注: このオプションは、後方互換性のみを目的としてサポートされています。デフォルトです。DISP=SHR の指定でデータ・セットが割り振られるため、他のユーザーは、FCH の実行時に PDS または PDSE に並行してアクセスできます。
新しい DIRINTEGR オプションを使用してください。
- EXCLUSIVE=YES
- PDS(E) メンバー処理方式の指定変更を強制して、その他のユーザーが安全に並行更新を実行できるようにします。このオプションは、パフォーマンスに大きな影響を与えます。YES に設定される場合、メンバー処理の実行は高速になりますが、PDS(E) ディレクトリー更新の影響を受け、データ・セットが並行して更新されると入出力エラーの原因となる可能性があります。このオプションは、データ・セットが複数ユーザーに割り振られている場合は常に安全な並行処理を想定する、File Manager により選択される処理方式 (EXCLUSIVE=NO、ユーザーによって入力データ・セットが「OLD」に割り振られている場合を除いてデフォルト) を指定変更します。
- DIRINTEGR
- 入力データ・セットを処理するために、ユーザー I/O 出口を呼び出すかどうかを指定します。
- NO
- デフォルトです。File Manager は、より高速な PDS(E) ディレクトリー処理方式を使用します。これは、複数のユーザーが並行して処理中のデータ・セットのディレクトリーを更新する場合に、入出力エラーの原因となる可能性があります。
- YES
- File Manager は、より安全だが低速の PDS(E) ディレクトリー処理方式を使用します。この方法では、複数ユーザーによる PDS(E) ディレクトリーの安全な並行更新が可能になります。
- PACK
- 入力データが ISPF パック形式であるかどうかを File Manager が検出するかどうかを決定し、出力データを ISPF パック形式で書き込むかどうかを指定します。このキーワードは VSAM データ・セットの処理では無視されます。入力データ・セットまたは出力データ・セット (あるいは、その両方) に対して I/O 出口が指定 されている場合、PACK=NONE オプションだけが有効となります。
- ASIS
- 入力が ISPF パック形式である場合に限り、出力を ISPF パック形式で書き込むよう File Manager に指示します。
- PACK
- 入力の形式に関係なく、出力を ISPF パック形式で書き込むよう File Manager に指示します。
- UNPACK
- 入力の形式に関係なく、出力を ISPF パックなしで書き込むよう File Manager に指示します。
- NONE
- 入力データ・セットが ISPF パック形式であるかどうか判別しないよう File Manager に指示し、出力レコードが入力データ・セットから読み取られたときに (拡張処理後に)、この出力レコードを書き込みます。
- SKIP
- 入力データ・セットが ISPF パック形式であるかどうか判別し、この形式である場合には検索/変更処理をスキップするよう File Manager に指示します。
- MEMORY
- メモリー内で変更を実行するかどうかを指定します。
- NO
- デフォルトです。
- YES
- メモリー内の変更を実行します。選択すると、次のようになります。
- 入力用にデータ・セットまたはメンバーを開き、すべてのレコードをメモリーに読み取ります。
- 検索および置換ストリングが異なる長さであり、結果の長さが可変長データ・セットの最大論理レコード長以下である場合に、レコード長の変更をサポートします。
- 出力用に開き、変更が行われると、ロードされたすべてのレコードをデータ・セットに書き込みます。
注:- VSAM ファイルの場合、このオプションは無視されます。
- このオプションは、UPDATE モードでのデータ・セットのオープンに関連する制限を回避するために使用できます。
- メンバーまたはデータ・セット全体をメモリーにロードするのに十分なメモリーがない場合、関数は終了します。より大きな領域サイズが必要な場合があります。
- 圧縮データ・セットの場合、変更は常にメモリー内で実行されます。
- メモリー処理は、インプレース更新よりも実行速度が遅くなります。
- CHGISPF=NO|YES
- デフォルトは、NO です。ISPF エディターの CHANGE コマンド動作を模倣するには、CHGISPF=YES を指定します。これにより、「置き換え」ストリングと「検索」ストリングの長さが異なる場合に、必要に応じて空白文字を吸収または挿入することで位置関係を保持します。例えば、長いストリングが短いストリングに変更された場合、短いストリングには空白が埋め込まれ、変更の右側にあるデータの列位置が維持されます。
FCH コマンドについて詳しくは、複数の PDS メンバーでのデータの検索と変更を参照してください。
//FMUSRFCH JOB (@TS2,MVS6),'FMNUSER',NOTIFY=FMNUSER,
// CLASS=A,MSGLEVEL=(1,1),MSGCLASS=H
//FMNBAT EXEC PGM=FILEMGR
//STEPLIB DD DSN=FMNUSER.FMN110.TSTLOAD,DISP=SHR
// DD DSN=hlq.TSTLOAD,DISP=SHR
// DD DSN=hlq.SFMNMOD1,DISP=SHR
// DD DSN=FMN.IGYV1R20.SIGYCOMP,DISP=SHR
//SYSPRINT DD SYSOUT=*
//FMNEXEC DD DSN=FMN.EXEC,DISP=SHR
//FMNTSPRT DD SYSOUT=*
//DDIN DD DSN=FMNUSER.JCL.TESTING,DISP=SHR
//SYSTERM DD SYSOUT=*
//SYSIN DD *
$$FILEM FCH ,
$$FILEM INPUT=DDIN,MEMBER=J*
F 'rights reserved'
C 'Copyright 2001-2002' ,
'Copyright 2001-2003' 1 71
C 'Alpha Company Ltd' ,
'Alpha Beta Company Ltd' 1 71
C 'Beta Company Ltd' ,
'Alpha Beta Company Ltd' 1 71
/+
/*